From d90ee3619bf3cfe56a8606f269f56a835675dc6a Mon Sep 17 00:00:00 2001 From: Tue Herlau <tuhe@dtu.dk> Date: Sat, 28 Aug 2021 18:29:39 +0200 Subject: [PATCH] Updates --- .../__pycache__/snip_dir.cpython-38.pyc | Bin 0 -> 1920 bytes .../__pycache__/snipper.cpython-38.pyc | Bin 0 -> 12439 bytes src/snipper/snip_dir.py | 79 ++++++++++++------ src/snipper/snipper.py | 31 +++---- 4 files changed, 69 insertions(+), 41 deletions(-) create mode 100644 src/snipper/__pycache__/snip_dir.cpython-38.pyc create mode 100644 src/snipper/__pycache__/snipper.cpython-38.pyc diff --git a/src/snipper/__pycache__/snip_dir.cpython-38.pyc b/src/snipper/__pycache__/snip_dir.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90c94e065160551d01fbfaf907b3f93611e62869 GIT binary patch literal 1920 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 literal 0 HcmV?d00001 diff --git a/src/snipper/__pycache__/snipper.cpython-38.pyc b/src/snipper/__pycache__/snipper.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76ee5eb7cb4c254035e4eadec59eb0389b6faf46 GIT binary patch literal 12439 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 literal 0 HcmV?d00001 diff --git a/src/snipper/snip_dir.py b/src/snipper/snip_dir.py index ce188b2..4d2ff27 100644 --- a/src/snipper/snip_dir.py +++ b/src/snipper/snip_dir.py @@ -1,7 +1,7 @@ import os, shutil # from thtools.coursebox.core.info_paths import get_paths # from thtools.coursebox.core.info import class_information -from thtools.coursebox.material.snipper import censor_file +from snipper.snipper import censor_file # from thtools.coursebox.material.homepage_lectures_exercises import fix_shared from pathlib import Path import time @@ -33,38 +33,65 @@ def snip_dir(source_dir, dest_dir, exclude=None, clean_destination_dir=True): shutil.copytree(base, out) time.sleep(0.2) - ls = Path(out).glob('**/*.py') + + ls = list(Path(out).glob('**/*.*')) + acceptable = [] + import fnmatch + for l in ls: + split = os.path.normpath(os.path.relpath(l, out)) + m = [fnmatch.fnmatch(split, ex) for ex in exclude] + acceptable.append( (l, not any(m) )) + + # print(acceptable) + # now we have acceptable files in list. run_out_dirs = ["./output"] n = 0 - edirs = [os.path.join(out, f_) for f_ in hw['exclusion']] # Exclude directories on exclude list (speed) - edirs = {os.path.normpath(os.path.dirname(f_) if not os.path.isdir(f_) else f_) for f_ in edirs} - edirs.remove(os.path.normpath(out)) - for f in ls: + # edirs = [os.path.join(out, f_) for f_ in hw['exclusion']] # Exclude directories on exclude list (speed) + # edirs = {os.path.normpath(os.path.dirname(f_) if not os.path.isdir(f_) else f_) for f_ in edirs} + # edirs.remove(os.path.normpath(out)) + for f, accept in acceptable: + if os.path.isdir(f) or not str(f).endswith(".py"): # We only touch .py files. + continue f_dir = os.path.normpath(f if os.path.isdir(f) else os.path.dirname(f)) - if not any([f_dir.startswith(f_) for f_ in edirs]): - slist = hw['solutions'] if not CE else [os.path.basename(f)[:-3]] - base = None - if students_irlc_tools is not None: - base = os.path.relpath(str(f), students_irlc_tools + "/..") - base = base.replace("\\", "/") + if accept: + # slist = hw['solutions'] if not CE else [os.path.basename(f)[:-3]] + # base = None + # if students_irlc_tools is not None: + # base = os.path.relpath(str(f), students_irlc_tools + "/..") + # base = base.replace("\\", "/") - if "assignments" in str(f) and "_grade.py" in str(f): - continue - nrem = censor_file(f, info, paths, run_files=run_files, run_out_dirs=run_out_dirs[:1], cut_files=cut_files, solution_list=slist, include_path_base=base, **kwargs) + # if "assignments" in str(f) and "_grade.py" in str(f): + # continue + info = {'new_references': [], 'code_copyright': 'Example student code. This file is automatically generated from the files in the instructor-directory'} + paths = {} + solution_list = [] + kwargs = {} + cut_files = True + run_files = True + nrem = censor_file(f, info, paths, run_files=run_files, run_out_dirs=run_out_dirs[:1], cut_files=cut_files, solution_list=solution_list, include_path_base=base, **kwargs) if nrem > 0: print(f"{nrem}> {f}") n += nrem - - for f in hw['exclusion']: - rm_file = os.path.join(out, f) - if any([df_ in rm_file for df_ in hw['inclusion']]): - continue - + for rm_file, accept in acceptable: + # rm_file = l rm_file = os.path.abspath(rm_file) - if os.path.isfile(rm_file): - os.remove(rm_file) - else: - if os.path.isdir(rm_file + "\\"): - shutil.rmtree(rm_file) + if not accept: + if os.path.isfile(rm_file): + os.remove(rm_file) + else: + if os.path.isdir(rm_file + "\\"): + shutil.rmtree(rm_file) + + # for f in hw['exclusion']: + # rm_file = os.path.join(out, f) + # if any([df_ in rm_file for df_ in hw['inclusion']]): + # continue + # + # rm_file = os.path.abspath(rm_file) + # if os.path.isfile(rm_file): + # os.remove(rm_file) + # else: + # if os.path.isdir(rm_file + "\\"): + # shutil.rmtree(rm_file) return n diff --git a/src/snipper/snipper.py b/src/snipper/snipper.py index 77f330f..1c0a3d3 100644 --- a/src/snipper/snipper.py +++ b/src/snipper/snipper.py @@ -411,8 +411,8 @@ def censor_file(file, info, paths, run_files=True, run_out_dirs=None, cut_files= if run_files or cut_files: ofiles = [] for rod in run_out_dirs: - if not os.path.isdir(rod): - os.mkdir(rod) + # if not os.path.isdir(rod): + # os.mkdir(rod) ofiles.append(os.path.join(rod, os.path.basename(file).split(".")[0]) ) ofiles[0] = ofiles[0].replace("\\", "/") @@ -435,21 +435,22 @@ def censor_file(file, info, paths, run_files=True, run_out_dirs=None, cut_files= fname = file.__str__() i = fname.find("irlc") wk = fname[i+5:fname.find("\\", i+6)] - sp = paths['02450students'] +"/solutions/" - if not os.path.exists(sp): - os.mkdir(sp) - sp = sp + wk - if not os.path.exists(sp): - os.mkdir(sp) - + # sp = paths['02450students'] +"/solutions/" + # if not os.path.exists(sp): + # os.mkdir(sp) + # sp = sp + wk + # if not os.path.exists(sp): + # os.mkdir(sp) + sols = [] stext = ["\n".join(lines) for lines in cut] for i,sol in enumerate(stext): - sout = sp + f"/{os.path.basename(fname)[:-3]}_TODO_{i+1}.py" - wsol = any([True for s in solution_list if os.path.basename(sout).startswith(s)]) - print(sout, "(published)" if wsol else "") - if wsol: - with open(sout, "w") as f: - f.write(sol) + sols.append( (sol,) ) + # sout = sp + f"/{os.path.basename(fname)[:-3]}_TODO_{i+1}.py" + # wsol = any([True for s in solution_list if os.path.basename(sout).startswith(s)]) + # print(sout, "(published)" if wsol else "") + # if wsol: + # with open(sout, "w") as f: + # f.write(sol) if len(lines[-1])>0: lines.append("") -- GitLab