From ae599247fcc57913a0ae64ff762df600db2a55e9 Mon Sep 17 00:00:00 2001 From: Tue Herlau <tuhe@dtu.dk> Date: Wed, 8 Sep 2021 21:33:08 +0200 Subject: [PATCH] Moss integration and Hinting --- .gitignore | 138 +++++++ README.md | 18 +- docs/README.jinja.md | 18 +- docs/build_docs.py | 2 +- docs/hints.png | Bin 0 -> 143700 bytes .../example_hints/instructor/cs106/deploy.py | 8 + .../instructor/cs106/homework1.py | 22 ++ .../instructor/cs106/report1hints.py | 19 + .../instructor/cs106/report1hints_grade.py | 339 ++++++++++++++++++ .../instructor/cs106/unitgrade/Week1.pkl | Bin 0 -> 604 bytes .../example_hints/students/cs106/homework1.py | 21 ++ .../students/cs106/report1hints.py | 19 + .../students/cs106/report1hints_grade.py | 338 +++++++++++++++++ .../students/cs106/unitgrade/Week1.pkl | Bin 0 -> 604 bytes 14 files changed, 939 insertions(+), 3 deletions(-) create mode 100644 .gitignore create mode 100644 docs/hints.png create mode 100644 examples/example_hints/instructor/cs106/deploy.py create mode 100644 examples/example_hints/instructor/cs106/homework1.py create mode 100644 examples/example_hints/instructor/cs106/report1hints.py create mode 100644 examples/example_hints/instructor/cs106/report1hints_grade.py create mode 100644 examples/example_hints/instructor/cs106/unitgrade/Week1.pkl create mode 100644 examples/example_hints/students/cs106/homework1.py create mode 100644 examples/example_hints/students/cs106/report1hints.py create mode 100644 examples/example_hints/students/cs106/report1hints_grade.py create mode 100644 examples/example_hints/students/cs106/unitgrade/Week1.pkl diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5391d87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,138 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ \ No newline at end of file diff --git a/README.md b/README.md index f4ea773..92eeffa 100644 --- a/README.md +++ b/README.md @@ -299,7 +299,18 @@ The last lines load the result and compare the score -- in this case both will r - Docker prevents students from doing mailicious things to your computer and allows the results to be reproducible by TAs. # Moss plagiarism detection -You can easily apply Moss to the students token files. +You can easily apply Moss to the students token files. First get moss from https://theory.stanford.edu/~aiken/moss/ and create two directories: +```terminal +whitelist/ # Whitelisted files. Code from these files are part of the handouts to students +submissions/ # Where you dump student submissions. +``` +The whitelist directory is optional, and the submissions directory contains student submissions (one folder per student): +```terminal +/submissions/<student-id-1>/.. +/submissions/<student-id-2>/.. +``` +The files in the whitelist/student directory can be either `.token` files (which are unpacked) or python files, and they may contain subdirectories: Everything will be unpacked and flattened. The simplest way to set it up is simply to download all files from DTU learn as a zip-file and unzip it somewhere. +When done just call moss as follows: ```python from unitgrade_private2.plagiarism.mossit import moss_it, get_id @@ -311,6 +322,11 @@ if __name__ == "__main__": moss_it(whitelist_dir="whitelist", submissions_dir="student_submissions", moss_id=id) ``` +This will generate a report. You can view the example including the report here: https://lab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/examples/example_moss + +# Smart hinting + + # Citing ```bibtex diff --git a/docs/README.jinja.md b/docs/README.jinja.md index cb8c86d..a146791 100644 --- a/docs/README.jinja.md +++ b/docs/README.jinja.md @@ -299,10 +299,26 @@ The last lines load the result and compare the score -- in this case both will r - Docker prevents students from doing mailicious things to your computer and allows the results to be reproducible by TAs. # Moss plagiarism detection -You can easily apply Moss to the students token files. +You can easily apply Moss to the students token files. First get moss from https://theory.stanford.edu/~aiken/moss/ and create two directories: +```terminal +whitelist/ # Whitelisted files. Code from these files are part of the handouts to students +submissions/ # Where you dump student submissions. +``` +The whitelist directory is optional, and the submissions directory contains student submissions (one folder per student): +```terminal +/submissions/<student-id-1>/.. +/submissions/<student-id-2>/.. +``` +The files in the whitelist/student directory can be either `.token` files (which are unpacked) or python files, and they may contain subdirectories: Everything will be unpacked and flattened. The simplest way to set it up is simply to download all files from DTU learn as a zip-file and unzip it somewhere. +When done just call moss as follows: ```python {{example_moss_moss_example_py}} ``` +This will generate a report. You can view the example including the report here: https://lab.compute.dtu.dk/tuhe/unitgrade_private/-/tree/master/examples/example_moss + +# Smart hinting + + # Citing ```bibtex diff --git a/docs/build_docs.py b/docs/build_docs.py index 7bc1c8c..3e95bce 100644 --- a/docs/build_docs.py +++ b/docs/build_docs.py @@ -14,7 +14,7 @@ if __name__ == "__main__": k = os.path.relpath(file, "../examples").replace(os.sep, "_").replace(".", "_") data[k] = f.read() - + data['resources'] = "https://gitlab.compute.dtu.dk/tuhe/slider/-/raw/main" with open("README.jinja.md", 'r') as f: s = jinja2.Environment(loader=jinja2.FileSystemLoader([".", "../example"])).from_string(f.read()).render(data) diff --git a/docs/hints.png b/docs/hints.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a95a99419acdf385b4bdc93d6c46245f5402fc GIT binary patch literal 143700 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 W^K%_ijq~F{6}YFXpUXO@geCx$3a>x_ literal 0 HcmV?d00001 diff --git a/examples/example_hints/instructor/cs106/deploy.py b/examples/example_hints/instructor/cs106/deploy.py new file mode 100644 index 0000000..39959eb --- /dev/null +++ b/examples/example_hints/instructor/cs106/deploy.py @@ -0,0 +1,8 @@ +from report1hints import Report1Hints +from unitgrade_private2.hidden_create_files import setup_grade_file_report +from snipper import snip_dir + +if __name__ == "__main__": + setup_grade_file_report(Report1Hints) + # Deploy the files using snipper: https://gitlab.compute.dtu.dk/tuhe/snipper + snip_dir.snip_dir("./", "../../students/cs106", clean_destination_dir=True, exclude=['__pycache__', '*.token', 'deploy.py']) diff --git a/examples/example_hints/instructor/cs106/homework1.py b/examples/example_hints/instructor/cs106/homework1.py new file mode 100644 index 0000000..4694f3c --- /dev/null +++ b/examples/example_hints/instructor/cs106/homework1.py @@ -0,0 +1,22 @@ +def find_primes(n): #!f + """ + Return a list of all primes up to (and including) n + Hints: + * Remember to return a *list* (and not a tuple or numpy ndarray) + * Remember to include n if n is a prime + * The first few primes are 2, 3, 5, ... + """ + primes = [p for p in range(2, n+1) if is_prime(n) ] + return primes + +def is_prime(n): #!f + """ + Return true iff n is a prime + Hints: + * A number if a prime if it has no divisors + * You can check if k divides n using the modulo-operator. I.e. n % k == True if k divides n. + """ + for k in range(2, n): + if k % n == 0: + return False + return True diff --git a/examples/example_hints/instructor/cs106/report1hints.py b/examples/example_hints/instructor/cs106/report1hints.py new file mode 100644 index 0000000..a10daf1 --- /dev/null +++ b/examples/example_hints/instructor/cs106/report1hints.py @@ -0,0 +1,19 @@ +from unitgrade2 import Report, UTestCase, evaluate_report_student +from homework1 import find_primes +import homework1 + +class Week1(UTestCase): + def test_find_all_primes(self): + """ + Hints: + * Insert a breakpoint and check what your function find_primes(4) actually outputs + """ + self.assertEqual(find_primes(4), [2,3]) + +class Report1Hints(Report): + title = "CS 106 Report 1" + questions = [(Week1, 10)] # Include a single question for 10 credits. + pack_imports = [homework1] # Unitgrade will recursively include all .py files from "cs101flat" + +if __name__ == "__main__": + evaluate_report_student(Report1Hints()) diff --git a/examples/example_hints/instructor/cs106/report1hints_grade.py b/examples/example_hints/instructor/cs106/report1hints_grade.py new file mode 100644 index 0000000..47e8e0c --- /dev/null +++ b/examples/example_hints/instructor/cs106/report1hints_grade.py @@ -0,0 +1,339 @@ + +import numpy as np +from tabulate import tabulate +from datetime import datetime +import pyfiglet +import unittest +import inspect +import os +import argparse +import time + +parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: +To run all tests in a report: + +> python assignment1_dp.py + +To run only question 2 or question 2.1 + +> python assignment1_dp.py -q 2 +> python assignment1_dp.py -q 2.1 + +Note this scripts does not grade your report. To grade your report, use: + +> python report1_grade.py + +Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful. +For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run: + +> python -m course_package.report1 + +see https://docs.python.org/3.9/using/cmdline.html +""", formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)') +parser.add_argument('--showexpected', action="store_true", help='Show the expected/desired result') +parser.add_argument('--showcomputed', action="store_true", help='Show the answer your code computes') +parser.add_argument('--unmute', action="store_true", help='Show result of print(...) commands in code') +parser.add_argument('--passall', action="store_true", help='Automatically pass all tests. Useful when debugging.') +parser.add_argument('--noprogress', action="store_true", help='Disable progress bars.') + +def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False): + args = parser.parse_args() + if question is None and args.q is not None: + question = args.q + if "." in question: + question, qitem = [int(v) for v in question.split(".")] + else: + question = int(question) + + if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file: + raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation") + + if unmute is None: + unmute = args.unmute + if passall is None: + passall = args.passall + + + results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute, + show_tol_err=show_tol_err) + + + if question is None: + print("Provisional evaluation") + tabulate(table_data) + table = table_data + print(tabulate(table)) + print(" ") + + fr = inspect.getouterframes(inspect.currentframe())[1].filename + gfile = os.path.basename(fr)[:-3] + "_grade.py" + if os.path.exists(gfile): + print("Note your results have not yet been registered. \nTo register your results, please run the file:") + print(">>>", gfile) + print("In the same manner as you ran this file.") + + + return results + + +def upack(q): + # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()]) + h =[(i['w'], i['possible'], i['obtained']) for i in q.values()] + h = np.asarray(h) + return h[:,0], h[:,1], h[:,2], + +class UnitgradeTextRunner(unittest.TextTestRunner): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + +class SequentialTestLoader(unittest.TestLoader): + def getTestCaseNames(self, testCaseClass): + test_names = super().getTestCaseNames(testCaseClass) + # testcase_methods = list(testCaseClass.__dict__.keys()) + ls = [] + for C in testCaseClass.mro(): + if issubclass(C, unittest.TestCase): + ls = list(C.__dict__.keys()) + ls + testcase_methods = ls + test_names.sort(key=testcase_methods.index) + return test_names + +def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False, show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False, + show_progress_bar=True, + show_tol_err=False, + big_header=True): + + from src.unitgrade2.version import __version__ + now = datetime.now() + if big_header: + ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom") + b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] ) + else: + b = "Unitgrade" + dt_string = now.strftime("%d/%m/%Y %H:%M:%S") + print(b + " v" + __version__ + ", started: " + dt_string+ "\n") + # print("Started: " + dt_string) + s = report.title + if hasattr(report, "version") and report.version is not None: + s += " version " + report.version + print(s, "(use --help for options)" if show_help_flag else "") + # print(f"Loaded answers from: ", report.computed_answers_file, "\n") + table_data = [] + t_start = time.time() + score = {} + loader = SequentialTestLoader() + + for n, (q, w) in enumerate(report.questions): + if question is not None and n+1 != question: + continue + suite = loader.loadTestsFromTestCase(q) + qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__ + q_title_print = "Question %i: %s"%(n+1, qtitle) + print(q_title_print, end="") + q.possible = 0 + q.obtained = 0 + q_ = {} # Gather score in this class. + from src.unitgrade2.unitgrade2 import UTextTestRunner + UTextResult.q_title_print = q_title_print # Hacky + UTextResult.show_progress_bar = show_progress_bar # Hacky. + UTextResult.number = n + UTextResult.nL = report.nL + + res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite) + + possible = res.testsRun + obtained = len(res.successes) + + assert len(res.successes) + len(res.errors) + len(res.failures) == res.testsRun + + obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0 + score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle} + q.obtained = obtained + q.possible = possible + + s1 = f" * q{n+1}) Total" + s2 = f" {q.obtained}/{w}" + print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 ) + print(" ") + table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"]) + + ws, possible, obtained = upack(score) + possible = int( msum(possible) ) + obtained = int( msum(obtained) ) # Cast to python int + report.possible = possible + report.obtained = obtained + now = datetime.now() + dt_string = now.strftime("%H:%M:%S") + + dt = int(time.time()-t_start) + minutes = dt//60 + seconds = dt - minutes*60 + plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "") + + from src.unitgrade2.unitgrade2 import dprint + dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")", + last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL) + + # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total") + + table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ]) + results = {'total': (obtained, possible), 'details': score} + return results, table_data + + +import bz2 +import pickle +import os + + +def bzwrite(json_str, token): # to get around obfuscation issues + with getattr(bz2, 'open')(token, "wt") as f: + f.write(json_str) + +def gather_imports(imp): + resources = {} + m = imp + # for m in pack_imports: + # print(f"*** {m.__name__}") + f = m.__file__ + # dn = os.path.dirname(f) + # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__) + # top_package = str(__import__(m.__name__.split('.')[0]).__path__) + + if hasattr(m, '__file__') and not hasattr(m, '__path__'): # Importing a simple file: m.__class__.__name__ == 'module' and False: + top_package = os.path.dirname(m.__file__) + module_import = True + else: + top_package = __import__(m.__name__.split('.')[0]).__path__._path[0] + module_import = False + + # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__) + # top_package = os.path.dirname(top_package) + import zipfile + # import strea + # zipfile.ZipFile + import io + # file_like_object = io.BytesIO(my_zip_data) + zip_buffer = io.BytesIO() + with zipfile.ZipFile(zip_buffer, 'w') as zip: + # zip.write() + for root, dirs, files in os.walk(top_package): + for file in files: + if file.endswith(".py"): + fpath = os.path.join(root, file) + v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package) + zip.write(fpath, v) + + resources['zipfile'] = zip_buffer.getvalue() + resources['top_package'] = top_package + resources['module_import'] = module_import + return resources, top_package + + if f.endswith("__init__.py"): + for root, dirs, files in os.walk(os.path.dirname(f)): + for file in files: + if file.endswith(".py"): + # print(file) + # print() + v = os.path.relpath(os.path.join(root, file), top_package) + with open(os.path.join(root, file), 'r') as ff: + resources[v] = ff.read() + else: + v = os.path.relpath(f, top_package) + with open(f, 'r') as ff: + resources[v] = ff.read() + return resources + +import argparse +parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example: + +> python report1_grade.py + +Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful. +For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run: + +> python -m course_package.report1 + +see https://docs.python.org/3.9/using/cmdline.html +""", formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('--noprogress', action="store_true", help='Disable progress bars') +parser.add_argument('--autolab', action="store_true", help='Show Autolab results') + +def gather_upload_to_campusnet(report, output_dir=None): + n = report.nL + args = parser.parse_args() + results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True, + show_progress_bar=not args.noprogress, + big_header=not args.autolab) + # print(" ") + # print("="*n) + # print("Final evaluation") + # print(tabulate(table_data)) + # also load the source code of missing files... + + sources = {} + print("") + if not args.autolab: + if len(report.individual_imports) > 0: + print("By uploading the .token file, you verify the files:") + for m in report.individual_imports: + print(">", m.__file__) + print("Are created/modified individually by you in agreement with DTUs exam rules") + report.pack_imports += report.individual_imports + + if len(report.pack_imports) > 0: + print("Including files in upload...") + for k, m in enumerate(report.pack_imports): + nimp, top_package = gather_imports(m) + _, report_relative_location, module_import = report._import_base_relative() + + # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package) + nimp['report_relative_location'] = report_relative_location + nimp['report_module_specification'] = module_import + nimp['name'] = m.__name__ + sources[k] = nimp + # if len([k for k in nimp if k not in sources]) > 0: + print(f" * {m.__name__}") + # sources = {**sources, **nimp} + results['sources'] = sources + + if output_dir is None: + output_dir = os.getcwd() + + payload_out_base = report.__class__.__name__ + "_handin" + + obtain, possible = results['total'] + vstring = "_v"+report.version if report.version is not None else "" + + token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring) + token = os.path.normpath(os.path.join(output_dir, token)) + + + with open(token, 'wb') as f: + pickle.dump(results, f) + + if not args.autolab: + print(" ") + print("To get credit for your results, please upload the single unmodified file: ") + print(">", token) + # print("To campusnet without any modifications.") + + # print("Now time for some autolab fun") + +def source_instantiate(name, report1_source, payload): + eval("exec")(report1_source, globals()) + pl = pickle.loads(bytes.fromhex(payload)) + report = eval(name)(payload=pl, strict=True) + # report.set_payload(pl) + return report + + + +report1_source = '\n# import os\n# import lzma\n# import pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n# # raise Exception("bad")\n# # import compress_pickle\n# dn = os.path.dirname(file_name)\n# if not os.path.exists(dn):\n# os.mkdir(dn)\n# if verbose: print("Writing cache...", file_name)\n# with lzma.open(file_name, \'wb\', ) as f:\n# pickle.dump(object, f)\n# if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n# # file_name = cn_(file_name) if cache_prefix else file_name\n# return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n# # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n# # file_name = cn_(file_name) if cache_prefix else file_name\n# if os.path.exists(file_name):\n# try:\n# with lzma.open(file_name, \'rb\') as f:\n# return pickle.load(f)\n# except Exception as e:\n# print("Tried to load a bad pickle file at", file_name)\n# print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n# print(e)\n# # return pickle.load(f)\n# else:\n# return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push && pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade.git --upgrade\n"""\nimport numpy as np\nimport sys\nimport re\nimport threading\nimport tqdm\nimport pickle\nimport os\nfrom io import StringIO\nimport io\nfrom unittest.runner import _WritelnDecorator\nfrom typing import Any\nimport inspect\nimport textwrap\nimport colorama\nfrom colorama import Fore\nfrom functools import _make_key, RLock\nfrom collections import namedtuple\nimport unittest\nimport time\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ncolorama.init(autoreset=True) # auto resets your settings after every output\n\ndef gprint(s):\n print(f"{Fore.GREEN}{s}")\n\nmyround = lambda x: np.round(x) # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n\ndef setup_dir_by_class(C, base_dir):\n name = C.__class__.__name__\n return base_dir, name\n\n\nclass Logger(object):\n def __init__(self, buffer):\n assert False\n self.terminal = sys.stdout\n self.log = buffer\n\n def write(self, message):\n self.terminal.write(message)\n self.log.write(message)\n\n def flush(self):\n # this flush method is needed for python 3 compatibility.\n pass\n\n\nclass Capturing(list):\n def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n self._stdout = stdout\n self.unmute = unmute\n super().__init__(*args, **kwargs)\n\n def __enter__(self, capture_errors=True): # don\'t put arguments here.\n self._stdout = sys.stdout if self._stdout == None else self._stdout\n self._stringio = StringIO()\n if self.unmute:\n sys.stdout = Logger(self._stringio)\n else:\n sys.stdout = self._stringio\n\n if capture_errors:\n self._sterr = sys.stderr\n sys.sterr = StringIO() # memory hole it\n self.capture_errors = capture_errors\n return self\n\n def __exit__(self, *args):\n self.extend(self._stringio.getvalue().splitlines())\n del self._stringio # free up some memory\n sys.stdout = self._stdout\n if self.capture_errors:\n sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n def __exit__(self, *args):\n lines = self._stringio.getvalue().splitlines()\n txt = "\\n".join(lines)\n numbers = extract_numbers(txt)\n self.extend(lines)\n del self._stringio # free up some memory\n sys.stdout = self._stdout\n if self.capture_errors:\n sys.sterr = self._sterr\n\n self.output = txt\n self.numbers = numbers\n\n\n# @classmethod\n# class OrderedClassMembers(type):\n# def __prepare__(self, name, bases):\n# assert False\n# return collections.OrderedDict()\n#\n# def __new__(self, name, bases, classdict):\n# ks = list(classdict.keys())\n# for b in bases:\n# ks += b.__ordered__\n# classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n# return type.__new__(self, name, bases, classdict)\n\n\nclass Report:\n title = "report title"\n version = None\n questions = []\n pack_imports = []\n individual_imports = []\n nL = 120 # Maximum line width\n\n @classmethod\n def reset(cls):\n for (q, _) in cls.questions:\n if hasattr(q, \'reset\'):\n q.reset()\n\n @classmethod\n def mfile(clc):\n return inspect.getfile(clc)\n\n def _file(self):\n return inspect.getfile(type(self))\n\n def _import_base_relative(self):\n if hasattr(self.pack_imports[0], \'__path__\'):\n root_dir = self.pack_imports[0].__path__._path[0]\n else:\n root_dir = self.pack_imports[0].__file__\n\n root_dir = os.path.dirname(root_dir)\n relative_path = os.path.relpath(self._file(), root_dir)\n modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n return root_dir, relative_path, modules\n\n def __init__(self, strict=False, payload=None):\n working_directory = os.path.abspath(os.path.dirname(self._file()))\n self.wdir, self.name = setup_dir_by_class(self, working_directory)\n # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n for (q, _) in self.questions:\n q.nL = self.nL # Set maximum line length.\n\n if payload is not None:\n self.set_payload(payload, strict=strict)\n\n def main(self, verbosity=1):\n # Run all tests using standard unittest (nothing fancy).\n loader = unittest.TestLoader()\n for q, _ in self.questions:\n start = time.time() # A good proxy for setup time is to\n suite = loader.loadTestsFromTestCase(q)\n unittest.TextTestRunner(verbosity=verbosity).run(suite)\n total = time.time() - start\n q.time = total\n\n def _setup_answers(self, with_coverage=False):\n if with_coverage:\n for q, _ in self.questions:\n q._with_coverage = True\n q._report = self\n\n self.main() # Run all tests in class just to get that out of the way...\n report_cache = {}\n for q, _ in self.questions:\n # print(self.questions)\n if hasattr(q, \'_save_cache\'):\n q()._save_cache()\n print("q is", q())\n q()._cache_put(\'time\', q.time) # = q.time\n report_cache[q.__qualname__] = q._cache2\n else:\n report_cache[q.__qualname__] = {\'no cache see _setup_answers in unitgrade2.py\': True}\n if with_coverage:\n for q, _ in self.questions:\n q._with_coverage = False\n return report_cache\n\n def set_payload(self, payloads, strict=False):\n for q, _ in self.questions:\n q._cache = payloads[q.__qualname__]\n\n\ndef rm_progress_bar(txt):\n # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n nlines = []\n for l in txt.splitlines():\n pct = l.find("%")\n ql = False\n if pct > 0:\n i = l.find("|", pct + 1)\n if i > 0 and l.find("|", i + 1) > 0:\n ql = True\n if not ql:\n nlines.append(l)\n return "\\n".join(nlines)\n\n\ndef extract_numbers(txt):\n # txt = rm_progress_bar(txt)\n numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n rx = re.compile(numeric_const_pattern, re.VERBOSE)\n all = rx.findall(txt)\n all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n if len(all) > 500:\n print(txt)\n raise Exception("unitgrade.unitgrade.py: Warning, too many numbers!", len(all))\n return all\n\n\nclass ActiveProgress():\n def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None):\n if file == None:\n file = sys.stdout\n self.file = file\n self.t = t\n self._running = False\n self.title = title\n self.dt = 0.01\n self.n = int(np.round(self.t / self.dt))\n self.show_progress_bar = show_progress_bar\n self.pbar = None\n\n if start:\n self.start()\n\n def start(self):\n self._running = True\n if self.show_progress_bar:\n self.thread = threading.Thread(target=self.run)\n self.thread.start()\n self.time_started = time.time()\n\n def terminate(self):\n if not self._running:\n raise Exception("Stopping a stopped progress bar. ")\n self._running = False\n if self.show_progress_bar:\n self.thread.join()\n if self.pbar is not None:\n self.pbar.update(1)\n self.pbar.close()\n self.pbar = None\n\n self.file.flush()\n return time.time() - self.time_started\n\n def run(self):\n self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n\n for _ in range(self.n - 1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n if not self._running:\n self.pbar.close()\n self.pbar = None\n break\n\n time.sleep(self.dt)\n self.pbar.update(1)\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n if file == None:\n file = sys.stdout\n\n # ss = self.item_title_print\n # state = "PASS" if success else "FAILED"\n dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n # if self.show_progress_bar or True:\n print(first + dot_parts, end="", file=file)\n # else:\n # print(dot_parts, end="", file=self.cc.file)\n last += extra\n # if tsecs >= 0.5:\n # state += " (" + str(tsecs) + " seconds)"\n print(last, file=file)\n\n\nclass UTextResult(unittest.TextTestResult):\n nL = 80\n number = -1 # HAcky way to set question number.\n show_progress_bar = True\n cc = None\n\n def __init__(self, stream, descriptions, verbosity):\n super().__init__(stream, descriptions, verbosity)\n self.successes = []\n\n def printErrors(self) -> None:\n self.printErrorList(\'ERROR\', self.errors)\n self.printErrorList(\'FAIL\', self.failures)\n\n def addError(self, test, err):\n super(unittest.TextTestResult, self).addFailure(test, err)\n self.cc_terminate(success=False)\n\n def addFailure(self, test, err):\n super(unittest.TextTestResult, self).addFailure(test, err)\n self.cc_terminate(success=False)\n\n def addSuccess(self, test: unittest.case.TestCase) -> None:\n self.successes.append(test)\n self.cc_terminate()\n\n def cc_terminate(self, success=True):\n if self.show_progress_bar or True:\n tsecs = np.round(self.cc.terminate(), 2)\n self.cc.file.flush()\n ss = self.item_title_print\n\n state = "PASS" if success else "FAILED"\n\n dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n if self.show_progress_bar or True:\n print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n else:\n print(dot_parts, end="", file=self.cc.file)\n\n if tsecs >= 0.5:\n state += " (" + str(tsecs) + " seconds)"\n print(state, file=self.cc.file)\n\n def startTest(self, test):\n # j =self.testsRun\n self.testsRun += 1\n # item_title = self.getDescription(test)\n item_title = test.shortDescription() # Better for printing (get from cache).\n if item_title == None:\n # For unittest framework where getDescription may return None.\n item_title = self.getDescription(test)\n self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n estimated_time = 10\n if self.show_progress_bar or True:\n self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar, file=sys.stdout)\n else:\n print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n\n self._test = test\n self._stdout = sys.stdout\n sys.stdout = io.StringIO()\n\n def stopTest(self, test):\n sys.stdout = self._stdout\n super().stopTest(test)\n\n def _setupStdout(self):\n if self._previousTestClass == None:\n total_estimated_time = 1\n if hasattr(self.__class__, \'q_title_print\'):\n q_title_print = self.__class__.q_title_print\n else:\n q_title_print = "<unnamed test. See unitgrade.py>"\n\n cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n self.cc = cc\n\n def _restoreStdout(self): # Used when setting up the test.\n if self._previousTestClass is None:\n q_time = self.cc.terminate()\n q_time = np.round(q_time, 2)\n sys.stdout.flush()\n if self.show_progress_bar:\n print(self.cc.title, end="")\n print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n def __init__(self, *args, **kwargs):\n stream = io.StringIO()\n super().__init__(*args, stream=stream, **kwargs)\n\n def _makeResult(self):\n # stream = self.stream # not you!\n stream = sys.stdout\n stream = _WritelnDecorator(stream)\n return self.resultclass(stream, self.descriptions, self.verbosity)\n\n\ndef cache(foo, typed=False):\n """ Magic cache wrapper\n https://github.com/python/cpython/blob/main/Lib/functools.py\n """\n maxsize = None\n def wrapper(self, *args, **kwargs):\n key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n if not self._cache_contains(key):\n value = foo(self, *args, **kwargs)\n self._cache_put(key, value)\n else:\n value = self._cache_get(key)\n return value\n\n return wrapper\n\n\ndef get_hints(ss):\n if ss == None:\n return None\n try:\n ss = textwrap.dedent(ss)\n ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n hints = ["hints:", ]\n j = np.argmax([ss.lower().find(h) for h in hints])\n h = hints[j]\n ss = ss[ss.find(h) + len(h) + 1:]\n ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n ss = textwrap.dedent(ss)\n ss = ss.strip()\n return ss\n except Exception as e:\n print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n _cache = None # Read-only cache. Ensures method always produce same result.\n _cache2 = None # User-written cache.\n _with_coverage = False\n _report = None # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n\n def capture(self):\n if hasattr(self, \'_stdout\') and self._stdout is not None:\n file = self._stdout\n else:\n # self._stdout = sys.stdout\n # sys._stdout = io.StringIO()\n file = sys.stdout\n return Capturing2(stdout=file)\n\n @classmethod\n def question_title(cls):\n """ Return the question title """\n return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ is not None else cls.__qualname__\n\n @classmethod\n def reset(cls):\n print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n cls._outcome = None\n cls._cache = None\n cls._cache2 = None\n\n def _callSetUp(self):\n if self._with_coverage:\n if not hasattr(self._report, \'covcache\'):\n self._report.covcache = {}\n import coverage\n self.cov = coverage.Coverage()\n self.cov.start()\n self.setUp()\n\n def _callTearDown(self):\n self.tearDown()\n if self._with_coverage:\n from pathlib import Path\n from snipper import snipper_main\n self.cov.stop()\n data = self.cov.get_data()\n base, _, _ = self._report._import_base_relative()\n for file in data.measured_files():\n file = os.path.normpath(file)\n root = Path(base)\n child = Path(file)\n if root in child.parents:\n with open(child, \'r\') as f:\n s = f.read()\n lines = s.splitlines()\n garb = \'GARBAGE\'\n\n lines2 = snipper_main.censor_code(lines, keep=True)\n assert len(lines) == len(lines2)\n\n for l in data.contexts_by_lineno(file):\n if lines2[l].strip() == garb:\n if self.cache_id() not in self._report.covcache:\n self._report.covcache[self.cache_id()] = {}\n\n rel = os.path.relpath(child, root)\n cc = self._report.covcache[self.cache_id()]\n j = 0\n for j in range(l, -1, -1):\n if "def" in lines2[j] or "class" in lines2[j]:\n break\n from snipper.legacy import gcoms\n fun = lines2[j]\n comments, _ = gcoms("\\n".join(lines2[j:l]))\n if rel not in cc:\n cc[rel] = {}\n cc[rel][fun] = (l, "\\n".join(comments))\n self._cache_put((self.cache_id(), \'coverage\'), self._report.covcache)\n\n def shortDescriptionStandard(self):\n sd = super().shortDescription()\n if sd is None:\n sd = self._testMethodName\n return sd\n\n def shortDescription(self):\n sd = self.shortDescriptionStandard()\n title = self._cache_get((self.cache_id(), \'title\'), sd)\n return title if title is not None else sd\n\n @property\n def title(self):\n return self.shortDescription()\n\n @title.setter\n def title(self, value):\n self._cache_put((self.cache_id(), \'title\'), value)\n\n def _get_outcome(self):\n if not (self.__class__, \'_outcome\') or self.__class__._outcome is None:\n self.__class__._outcome = {}\n return self.__class__._outcome\n\n def _callTestMethod(self, testMethod):\n t = time.time()\n self._ensure_cache_exists() # Make sure cache is there.\n if self._testMethodDoc is not None:\n self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n self._cache2[(self.cache_id(), \'assert\')] = {}\n res = testMethod()\n elapsed = time.time() - t\n self._get_outcome()[self.cache_id()] = res\n self._cache_put((self.cache_id(), "time"), elapsed)\n\n def cache_id(self):\n c = self.__class__.__qualname__\n m = self._testMethodName\n return c, m\n\n def __init__(self, *args, **kwargs):\n super().__init__(*args, **kwargs)\n self._load_cache()\n self._assert_cache_index = 0\n\n def _ensure_cache_exists(self):\n if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n self.__class__._cache = dict()\n if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n self.__class__._cache2 = dict()\n\n def _cache_get(self, key, default=None):\n self._ensure_cache_exists()\n return self.__class__._cache.get(key, default)\n\n def _cache_put(self, key, value):\n self._ensure_cache_exists()\n self.__class__._cache2[key] = value\n\n def _cache_contains(self, key):\n self._ensure_cache_exists()\n return key in self.__class__._cache\n\n def wrap_assert(self, assert_fun, first, *args, **kwargs):\n # sys.stdout = self._stdout\n key = (self.cache_id(), \'assert\')\n if not self._cache_contains(key):\n print("Warning, framework missing", key)\n self.__class__._cache[\n key] = {} # A new dict. We manually insert it because we have to use that the dict is mutable.\n cache = self._cache_get(key)\n id = self._assert_cache_index\n if not id in cache:\n print("Warning, framework missing cache index", key, "id =", id)\n _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n\n # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n cache[id] = first\n self._cache_put(key, cache)\n self._assert_cache_index += 1\n assert_fun(first, _expected, *args, **kwargs)\n\n def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n self.wrap_assert(self.assertEqual, first, msg)\n\n def _cache_file(self):\n # The filename-directory stuff is a bit tricky but this seems robust.\n return os.path.dirname(inspect.getabsfile(type(self))) + "/unitgrade/" + self.__class__.__name__ + ".pkl"\n\n def _save_cache(self):\n # get the class name (i.e. what to save to).\n cfile = self._cache_file()\n if not os.path.isdir(os.path.dirname(cfile)):\n os.makedirs(os.path.dirname(cfile))\n\n if hasattr(self.__class__, \'_cache2\'):\n with open(cfile, \'wb\') as f:\n pickle.dump(self.__class__._cache2, f)\n\n # But you can also set cache explicitly.\n def _load_cache(self):\n if self._cache is not None: # Cache already loaded. We will not load it twice.\n return\n # raise Exception("Loaded cache which was already set. What is going on?!")\n cfile = self._cache_file()\n if os.path.exists(cfile):\n try:\n # print("\\ncache file", cfile)\n with open(cfile, \'rb\') as f:\n data = pickle.load(f)\n self.__class__._cache = data\n except Exception as e:\n print("Bad cache", cfile)\n print(e)\n else:\n print("Warning! data file not found", cfile)\n\n def _feedErrorsToResult(self, result, errors):\n """ Use this to show hints on test failure. """\n if not isinstance(result, UTextResult):\n er = [e for e, v in errors if v != None]\n import textwrap\n if len(er) > 0:\n hints = []\n key = (self.cache_id(), \'coverage\')\n if self._cache_contains(key):\n CC = self._cache_get(key)\n for id in CC:\n if id == self.cache_id():\n cl, m = id\n gprint(f"> An error occured while solving: {cl}.{m}. The files/methods you need to edit are:") # For the test {id} in {file} you should edit:")\n for file in CC[id]:\n rec = CC[id][file]\n gprint(f"> * {file}")\n for l in rec:\n _, comments = CC[id][file][l]\n hint = get_hints(comments)\n\n if hint != None:\n # hint = textwrap.dedent(hint)\n hints.append(hint)\n gprint(f"> - {l}")\n\n er = er[0]\n doc = er._testMethodDoc\n if doc is not None:\n hint = get_hints(er._testMethodDoc)\n if hint is not None:\n hints = [hint] + hints\n if len(hints) > 0:\n gprint("> Hints:")\n gprint(textwrap.indent("\\n".join(hints), "> "))\n\n super()._feedErrorsToResult(result, errors)\n\n def startTestRun(self):\n # print("asdfsdaf 11", file=sys.stderr)\n super().startTestRun()\n # print("asdfsdaf")\n\n def _callTestMethod(self, method):\n # print("asdfsdaf")\n super()._callTestMethod(method)\n\n\ndef hide(func):\n return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n """\n Returns a copy of foreignDecorator, which is identical in every\n way(*), except also appends a .decorator property to the callable it\n spits out.\n """\n\n def newDecorator(func):\n # Call to newDecorator(method)\n # Exactly like old decorator, but output keeps track of what decorated it\n R = foreignDecorator(func) # apply foreignDecorator, like call to foreignDecorator(method) would have done\n R.decorator = newDecorator # keep track of decorator\n # R.original = func # might as well keep track of everything!\n return R\n\n newDecorator.__name__ = foreignDecorator.__name__\n newDecorator.__doc__ = foreignDecorator.__doc__\n return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n """\n Returns all methods in CLS with DECORATOR as the\n outermost decorator.\n\n DECORATOR must be a "registering decorator"; one\n can make any decorator "registering" via the\n makeRegisteringDecorator function.\n\n import inspect\n ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n for f in ls:\n print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n """\n for maybeDecorated in cls.__dict__.values():\n if hasattr(maybeDecorated, \'decorator\'):\n if maybeDecorated.decorator == decorator:\n print(maybeDecorated)\n yield maybeDecorated\n# 817\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\', action="store_true", help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\', action="store_true", help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\', action="store_true", help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\', action="store_true", help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\', action="store_true", help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n args = parser.parse_args()\n if question is None and args.q is not None:\n question = args.q\n if "." in question:\n question, qitem = [int(v) for v in question.split(".")]\n else:\n question = int(question)\n\n if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n if unmute is None:\n unmute = args.unmute\n if passall is None:\n passall = args.passall\n\n\n results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n show_tol_err=show_tol_err)\n\n\n if question is None:\n print("Provisional evaluation")\n tabulate(table_data)\n table = table_data\n print(tabulate(table))\n print(" ")\n\n fr = inspect.getouterframes(inspect.currentframe())[1].filename\n gfile = os.path.basename(fr)[:-3] + "_grade.py"\n if os.path.exists(gfile):\n print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n print(">>>", gfile)\n print("In the same manner as you ran this file.")\n\n\n return results\n\n\ndef upack(q):\n # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n h = np.asarray(h)\n return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n def __init__(self, *args, **kwargs):\n super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n def getTestCaseNames(self, testCaseClass):\n test_names = super().getTestCaseNames(testCaseClass)\n # testcase_methods = list(testCaseClass.__dict__.keys())\n ls = []\n for C in testCaseClass.mro():\n if issubclass(C, unittest.TestCase):\n ls = list(C.__dict__.keys()) + ls\n testcase_methods = ls\n test_names.sort(key=testcase_methods.index)\n return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False, show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n show_progress_bar=True,\n show_tol_err=False,\n big_header=True):\n\n from src.unitgrade2.version import __version__\n now = datetime.now()\n if big_header:\n ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n else:\n b = "Unitgrade"\n dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n # print("Started: " + dt_string)\n s = report.title\n if hasattr(report, "version") and report.version is not None:\n s += " version " + report.version\n print(s, "(use --help for options)" if show_help_flag else "")\n # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n table_data = []\n t_start = time.time()\n score = {}\n loader = SequentialTestLoader()\n\n for n, (q, w) in enumerate(report.questions):\n if question is not None and n+1 != question:\n continue\n suite = loader.loadTestsFromTestCase(q)\n qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n q_title_print = "Question %i: %s"%(n+1, qtitle)\n print(q_title_print, end="")\n q.possible = 0\n q.obtained = 0\n q_ = {} # Gather score in this class.\n from src.unitgrade2.unitgrade2 import UTextTestRunner\n UTextResult.q_title_print = q_title_print # Hacky\n UTextResult.show_progress_bar = show_progress_bar # Hacky.\n UTextResult.number = n\n UTextResult.nL = report.nL\n\n res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n possible = res.testsRun\n obtained = len(res.successes)\n\n assert len(res.successes) + len(res.errors) + len(res.failures) == res.testsRun\n\n obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n q.obtained = obtained\n q.possible = possible\n\n s1 = f" * q{n+1}) Total"\n s2 = f" {q.obtained}/{w}"\n print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n print(" ")\n table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n ws, possible, obtained = upack(score)\n possible = int( msum(possible) )\n obtained = int( msum(obtained) ) # Cast to python int\n report.possible = possible\n report.obtained = obtained\n now = datetime.now()\n dt_string = now.strftime("%H:%M:%S")\n\n dt = int(time.time()-t_start)\n minutes = dt//60\n seconds = dt - minutes*60\n plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n from src.unitgrade2.unitgrade2 import dprint\n dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n results = {\'total\': (obtained, possible), \'details\': score}\n return results, table_data\n\n\nimport bz2\nimport pickle\nimport os\n\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n with getattr(bz2, \'open\')(token, "wt") as f:\n f.write(json_str)\n\ndef gather_imports(imp):\n resources = {}\n m = imp\n # for m in pack_imports:\n # print(f"*** {m.__name__}")\n f = m.__file__\n # dn = os.path.dirname(f)\n # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'): # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n top_package = os.path.dirname(m.__file__)\n module_import = True\n else:\n top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n module_import = False\n\n # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n # top_package = os.path.dirname(top_package)\n import zipfile\n # import strea\n # zipfile.ZipFile\n import io\n # file_like_object = io.BytesIO(my_zip_data)\n zip_buffer = io.BytesIO()\n with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n # zip.write()\n for root, dirs, files in os.walk(top_package):\n for file in files:\n if file.endswith(".py"):\n fpath = os.path.join(root, file)\n v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n zip.write(fpath, v)\n\n resources[\'zipfile\'] = zip_buffer.getvalue()\n resources[\'top_package\'] = top_package\n resources[\'module_import\'] = module_import\n return resources, top_package\n\n if f.endswith("__init__.py"):\n for root, dirs, files in os.walk(os.path.dirname(f)):\n for file in files:\n if file.endswith(".py"):\n # print(file)\n # print()\n v = os.path.relpath(os.path.join(root, file), top_package)\n with open(os.path.join(root, file), \'r\') as ff:\n resources[v] = ff.read()\n else:\n v = os.path.relpath(f, top_package)\n with open(f, \'r\') as ff:\n resources[v] = ff.read()\n return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\', action="store_true", help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\', action="store_true", help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n n = report.nL\n args = parser.parse_args()\n results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n show_progress_bar=not args.noprogress,\n big_header=not args.autolab)\n # print(" ")\n # print("="*n)\n # print("Final evaluation")\n # print(tabulate(table_data))\n # also load the source code of missing files...\n\n sources = {}\n print("")\n if not args.autolab:\n if len(report.individual_imports) > 0:\n print("By uploading the .token file, you verify the files:")\n for m in report.individual_imports:\n print(">", m.__file__)\n print("Are created/modified individually by you in agreement with DTUs exam rules")\n report.pack_imports += report.individual_imports\n\n if len(report.pack_imports) > 0:\n print("Including files in upload...")\n for k, m in enumerate(report.pack_imports):\n nimp, top_package = gather_imports(m)\n _, report_relative_location, module_import = report._import_base_relative()\n\n # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n nimp[\'report_relative_location\'] = report_relative_location\n nimp[\'report_module_specification\'] = module_import\n nimp[\'name\'] = m.__name__\n sources[k] = nimp\n # if len([k for k in nimp if k not in sources]) > 0:\n print(f" * {m.__name__}")\n # sources = {**sources, **nimp}\n results[\'sources\'] = sources\n\n if output_dir is None:\n output_dir = os.getcwd()\n\n payload_out_base = report.__class__.__name__ + "_handin"\n\n obtain, possible = results[\'total\']\n vstring = "_v"+report.version if report.version is not None else ""\n\n token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n token = os.path.normpath(os.path.join(output_dir, token))\n\n\n with open(token, \'wb\') as f:\n pickle.dump(results, f)\n\n if not args.autolab:\n print(" ")\n print("To get credit for your results, please upload the single unmodified file: ")\n print(">", token)\n # print("To campusnet without any modifications.")\n\n # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n eval("exec")(report1_source, globals())\n pl = pickle.loads(bytes.fromhex(payload))\n report = eval(name)(payload=pl, strict=True)\n # report.set_payload(pl)\n return report\n\n\n__version__ = "0.0.3"\n\nfrom homework1 import find_primes\nimport homework1\n\nclass Week1(UTestCase):\n def test_find_all_primes(self):\n """\n Hints:\n * Insert a breakpoint and check what your function find_primes(4) actually outputs\n """\n self.assertEqual(find_primes(4), [2,3])\n\nclass Report1Hints(Report):\n title = "CS 106 Report 1"\n questions = [(Week1, 10)] # Include a single question for 10 credits.\n pack_imports = [homework1] # Unitgrade will recursively include all .py files from "cs101flat"' +report1_payload = '80049567020000000000007d948c055765656b31947d942868018c14746573745f66696e645f616c6c5f7072696d65739486948c08636f7665726167659486947d946801680386947d948c0c686f6d65776f726b312e7079947d94288c146465662066696e645f7072696d6573286e293a20944b098cf72222220a2020202052657475726e2061206c697374206f6620616c6c207072696d657320757020746f2028616e6420696e636c7564696e6729206e0a2020202048696e74733a0a20202020202020202a2052656d656d62657220746f2072657475726e2061202a6c6973742a2028616e64206e6f742061207475706c65206f72206e756d7079206e646172726179290a20202020202020202a2052656d656d62657220746f20696e636c756465206e206966206e2069732061207072696d650a20202020202020202a2054686520666972737420666577207072696d65732061726520322c20332c20352c202e2e2e0a202020202222229486948c116465662069735f7072696d65286e293a20944b148cd02222220a2020202052657475726e207472756520696666206e2069732061207072696d650a2020202048696e74733a0a20202020202020202a2041206e756d6265722069662061207072696d6520696620697420686173206e6f2064697669736f72730a20202020202020202a20596f752063616e20636865636b206966206b2064697669646573206e207573696e6720746865206d6f64756c6f2d6f70657261746f722e20492e652e206e2025206b203d3d2054727565206966206b2064697669646573206e2e0a202020202222229486947573738c0474696d6594473fe87a010000000075732e' +name="Report1Hints" + +report = source_instantiate(name, report1_source, report1_payload) +output_dir = os.path.dirname(__file__) +gather_upload_to_campusnet(report, output_dir) \ No newline at end of file diff --git a/examples/example_hints/instructor/cs106/unitgrade/Week1.pkl b/examples/example_hints/instructor/cs106/unitgrade/Week1.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d6664eb2af6a64e0cbc9a10323e29c1ddc673bae GIT binary patch literal 604 zcmZo*nHtE%00y;FdRW6#Q?m`H^oW$C7MH}QW#*;CC+6hD7ZhdYrWQ|Wo6^IPoL`n& zl$f46rEN;>lnllUCJ^1jlaZgBTAp8&ZKzjJIi+@rMvq8JYMKJr0ElLdJWVTwDc+nt z-<6b<xD*r=6oOJqN{jLo5*2bXi%S&p(-abOaugtn6-o;fO7ayn67y0NGV_viN>eiP z(lr(G!1_Eg^Gb@Xz)X-aS_(m_xv9BHsYM_yMKD9PK&EOzjL6F`QAkuMDJ{rJRmd+= z$Sch)s8q;HNh~T#tklF|5X9P4g*=7KG!Rj&kO*-clKPO0RE4z6qT&*TwA6BlY_URO zQL2KGj)Jj{f~k&zo}M09y^@j=DD(tDfs$Da2~TK<i1b`Q3z3qd(o}`aG%VI)c-;}? z8IadA(_rocxi_;!AtSL^AunGcC9^EEIKQYE><UP5Mdp_(Bq!!6Bxj^1XM<E{gH@%Z z7Axc_lon^^r7M(Vq$=d*r<CU8>*g1v7A2PC7wIW@>ZR%_<SD2sWGmR(Duh5Bseq&z L*{h|+#l?C6Diglv literal 0 HcmV?d00001 diff --git a/examples/example_hints/students/cs106/homework1.py b/examples/example_hints/students/cs106/homework1.py new file mode 100644 index 0000000..8e530ed --- /dev/null +++ b/examples/example_hints/students/cs106/homework1.py @@ -0,0 +1,21 @@ +def find_primes(n): + """ + Return a list of all primes up to (and including) n + Hints: + * Remember to return a *list* (and not a tuple or numpy ndarray) + * Remember to include n if n is a prime + * The first few primes are 2, 3, 5, ... + """ + # TODO: 2 lines missing. + raise NotImplementedError("Implement function body") + +def is_prime(n): + """ + Return true iff n is a prime + Hints: + * A number if a prime if it has no divisors + * You can check if k divides n using the modulo-operator. I.e. n % k == True if k divides n. + """ + # TODO: 3 lines missing. + raise NotImplementedError("Implement function body") + return True diff --git a/examples/example_hints/students/cs106/report1hints.py b/examples/example_hints/students/cs106/report1hints.py new file mode 100644 index 0000000..a10daf1 --- /dev/null +++ b/examples/example_hints/students/cs106/report1hints.py @@ -0,0 +1,19 @@ +from unitgrade2 import Report, UTestCase, evaluate_report_student +from homework1 import find_primes +import homework1 + +class Week1(UTestCase): + def test_find_all_primes(self): + """ + Hints: + * Insert a breakpoint and check what your function find_primes(4) actually outputs + """ + self.assertEqual(find_primes(4), [2,3]) + +class Report1Hints(Report): + title = "CS 106 Report 1" + questions = [(Week1, 10)] # Include a single question for 10 credits. + pack_imports = [homework1] # Unitgrade will recursively include all .py files from "cs101flat" + +if __name__ == "__main__": + evaluate_report_student(Report1Hints()) diff --git a/examples/example_hints/students/cs106/report1hints_grade.py b/examples/example_hints/students/cs106/report1hints_grade.py new file mode 100644 index 0000000..b08690b --- /dev/null +++ b/examples/example_hints/students/cs106/report1hints_grade.py @@ -0,0 +1,338 @@ +import numpy as np +from tabulate import tabulate +from datetime import datetime +import pyfiglet +import unittest +import inspect +import os +import argparse +import time + +parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Example: +To run all tests in a report: + +> python assignment1_dp.py + +To run only question 2 or question 2.1 + +> python assignment1_dp.py -q 2 +> python assignment1_dp.py -q 2.1 + +Note this scripts does not grade your report. To grade your report, use: + +> python report1_grade.py + +Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful. +For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run: + +> python -m course_package.report1 + +see https://docs.python.org/3.9/using/cmdline.html +""", formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('-q', nargs='?', type=str, default=None, help='Only evaluate this question (e.g.: -q 2)') +parser.add_argument('--showexpected', action="store_true", help='Show the expected/desired result') +parser.add_argument('--showcomputed', action="store_true", help='Show the answer your code computes') +parser.add_argument('--unmute', action="store_true", help='Show result of print(...) commands in code') +parser.add_argument('--passall', action="store_true", help='Automatically pass all tests. Useful when debugging.') +parser.add_argument('--noprogress', action="store_true", help='Disable progress bars.') + +def evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False): + args = parser.parse_args() + if question is None and args.q is not None: + question = args.q + if "." in question: + question, qitem = [int(v) for v in question.split(".")] + else: + question = int(question) + + if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file: + raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation") + + if unmute is None: + unmute = args.unmute + if passall is None: + passall = args.passall + + + results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute, + show_tol_err=show_tol_err) + + + if question is None: + print("Provisional evaluation") + tabulate(table_data) + table = table_data + print(tabulate(table)) + print(" ") + + fr = inspect.getouterframes(inspect.currentframe())[1].filename + gfile = os.path.basename(fr)[:-3] + "_grade.py" + if os.path.exists(gfile): + print("Note your results have not yet been registered. \nTo register your results, please run the file:") + print(">>>", gfile) + print("In the same manner as you ran this file.") + + + return results + + +def upack(q): + # h = zip([(i['w'], i['possible'], i['obtained']) for i in q.values()]) + h =[(i['w'], i['possible'], i['obtained']) for i in q.values()] + h = np.asarray(h) + return h[:,0], h[:,1], h[:,2], + +class UnitgradeTextRunner(unittest.TextTestRunner): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + +class SequentialTestLoader(unittest.TestLoader): + def getTestCaseNames(self, testCaseClass): + test_names = super().getTestCaseNames(testCaseClass) + # testcase_methods = list(testCaseClass.__dict__.keys()) + ls = [] + for C in testCaseClass.mro(): + if issubclass(C, unittest.TestCase): + ls = list(C.__dict__.keys()) + ls + testcase_methods = ls + test_names.sort(key=testcase_methods.index) + return test_names + +def evaluate_report(report, question=None, qitem=None, passall=False, verbose=False, show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False, + show_progress_bar=True, + show_tol_err=False, + big_header=True): + + from src.unitgrade2.version import __version__ + now = datetime.now() + if big_header: + ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom") + b = "\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] ) + else: + b = "Unitgrade" + dt_string = now.strftime("%d/%m/%Y %H:%M:%S") + print(b + " v" + __version__ + ", started: " + dt_string+ "\n") + # print("Started: " + dt_string) + s = report.title + if hasattr(report, "version") and report.version is not None: + s += " version " + report.version + print(s, "(use --help for options)" if show_help_flag else "") + # print(f"Loaded answers from: ", report.computed_answers_file, "\n") + table_data = [] + t_start = time.time() + score = {} + loader = SequentialTestLoader() + + for n, (q, w) in enumerate(report.questions): + if question is not None and n+1 != question: + continue + suite = loader.loadTestsFromTestCase(q) + qtitle = q.question_title() if hasattr(q, 'question_title') else q.__qualname__ + q_title_print = "Question %i: %s"%(n+1, qtitle) + print(q_title_print, end="") + q.possible = 0 + q.obtained = 0 + q_ = {} # Gather score in this class. + from src.unitgrade2.unitgrade2 import UTextTestRunner + UTextResult.q_title_print = q_title_print # Hacky + UTextResult.show_progress_bar = show_progress_bar # Hacky. + UTextResult.number = n + UTextResult.nL = report.nL + + res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite) + + possible = res.testsRun + obtained = len(res.successes) + + assert len(res.successes) + len(res.errors) + len(res.failures) == res.testsRun + + obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0 + score[n] = {'w': w, 'possible': w, 'obtained': obtained, 'items': q_, 'title': qtitle} + q.obtained = obtained + q.possible = possible + + s1 = f" * q{n+1}) Total" + s2 = f" {q.obtained}/{w}" + print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 ) + print(" ") + table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"]) + + ws, possible, obtained = upack(score) + possible = int( msum(possible) ) + obtained = int( msum(obtained) ) # Cast to python int + report.possible = possible + report.obtained = obtained + now = datetime.now() + dt_string = now.strftime("%H:%M:%S") + + dt = int(time.time()-t_start) + minutes = dt//60 + seconds = dt - minutes*60 + plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "") + + from src.unitgrade2.unitgrade2 import dprint + dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")", + last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL) + + # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total") + + table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ]) + results = {'total': (obtained, possible), 'details': score} + return results, table_data + + +import bz2 +import pickle +import os + + +def bzwrite(json_str, token): # to get around obfuscation issues + with getattr(bz2, 'open')(token, "wt") as f: + f.write(json_str) + +def gather_imports(imp): + resources = {} + m = imp + # for m in pack_imports: + # print(f"*** {m.__name__}") + f = m.__file__ + # dn = os.path.dirname(f) + # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__) + # top_package = str(__import__(m.__name__.split('.')[0]).__path__) + + if hasattr(m, '__file__') and not hasattr(m, '__path__'): # Importing a simple file: m.__class__.__name__ == 'module' and False: + top_package = os.path.dirname(m.__file__) + module_import = True + else: + top_package = __import__(m.__name__.split('.')[0]).__path__._path[0] + module_import = False + + # top_package = os.path.dirname(__import__(m.__name__.split('.')[0]).__file__) + # top_package = os.path.dirname(top_package) + import zipfile + # import strea + # zipfile.ZipFile + import io + # file_like_object = io.BytesIO(my_zip_data) + zip_buffer = io.BytesIO() + with zipfile.ZipFile(zip_buffer, 'w') as zip: + # zip.write() + for root, dirs, files in os.walk(top_package): + for file in files: + if file.endswith(".py"): + fpath = os.path.join(root, file) + v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package) + zip.write(fpath, v) + + resources['zipfile'] = zip_buffer.getvalue() + resources['top_package'] = top_package + resources['module_import'] = module_import + return resources, top_package + + if f.endswith("__init__.py"): + for root, dirs, files in os.walk(os.path.dirname(f)): + for file in files: + if file.endswith(".py"): + # print(file) + # print() + v = os.path.relpath(os.path.join(root, file), top_package) + with open(os.path.join(root, file), 'r') as ff: + resources[v] = ff.read() + else: + v = os.path.relpath(f, top_package) + with open(f, 'r') as ff: + resources[v] = ff.read() + return resources + +import argparse +parser = argparse.ArgumentParser(description='Evaluate your report.', epilog="""Use this script to get the score of your report. Example: + +> python report1_grade.py + +Finally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful. +For instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to 'Documents/` and run: + +> python -m course_package.report1 + +see https://docs.python.org/3.9/using/cmdline.html +""", formatter_class=argparse.RawTextHelpFormatter) +parser.add_argument('--noprogress', action="store_true", help='Disable progress bars') +parser.add_argument('--autolab', action="store_true", help='Show Autolab results') + +def gather_upload_to_campusnet(report, output_dir=None): + n = report.nL + args = parser.parse_args() + results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True, + show_progress_bar=not args.noprogress, + big_header=not args.autolab) + # print(" ") + # print("="*n) + # print("Final evaluation") + # print(tabulate(table_data)) + # also load the source code of missing files... + + sources = {} + print("") + if not args.autolab: + if len(report.individual_imports) > 0: + print("By uploading the .token file, you verify the files:") + for m in report.individual_imports: + print(">", m.__file__) + print("Are created/modified individually by you in agreement with DTUs exam rules") + report.pack_imports += report.individual_imports + + if len(report.pack_imports) > 0: + print("Including files in upload...") + for k, m in enumerate(report.pack_imports): + nimp, top_package = gather_imports(m) + _, report_relative_location, module_import = report._import_base_relative() + + # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package) + nimp['report_relative_location'] = report_relative_location + nimp['report_module_specification'] = module_import + nimp['name'] = m.__name__ + sources[k] = nimp + # if len([k for k in nimp if k not in sources]) > 0: + print(f" * {m.__name__}") + # sources = {**sources, **nimp} + results['sources'] = sources + + if output_dir is None: + output_dir = os.getcwd() + + payload_out_base = report.__class__.__name__ + "_handin" + + obtain, possible = results['total'] + vstring = "_v"+report.version if report.version is not None else "" + + token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring) + token = os.path.normpath(os.path.join(output_dir, token)) + + + with open(token, 'wb') as f: + pickle.dump(results, f) + + if not args.autolab: + print(" ") + print("To get credit for your results, please upload the single unmodified file: ") + print(">", token) + # print("To campusnet without any modifications.") + + # print("Now time for some autolab fun") + +def source_instantiate(name, report1_source, payload): + eval("exec")(report1_source, globals()) + pl = pickle.loads(bytes.fromhex(payload)) + report = eval(name)(payload=pl, strict=True) + # report.set_payload(pl) + return report + + + +report1_source = '\n# import os\n# import lzma\n# import pickle\n\n# DONT\'t import stuff here since install script requires __version__\n\n# def cache_write(object, file_name, verbose=True):\n# # raise Exception("bad")\n# # import compress_pickle\n# dn = os.path.dirname(file_name)\n# if not os.path.exists(dn):\n# os.mkdir(dn)\n# if verbose: print("Writing cache...", file_name)\n# with lzma.open(file_name, \'wb\', ) as f:\n# pickle.dump(object, f)\n# if verbose: print("Done!")\n#\n#\n# def cache_exists(file_name):\n# # file_name = cn_(file_name) if cache_prefix else file_name\n# return os.path.exists(file_name)\n#\n#\n# def cache_read(file_name):\n# # import compress_pickle # Import here because if you import in top the __version__ tag will fail.\n# # file_name = cn_(file_name) if cache_prefix else file_name\n# if os.path.exists(file_name):\n# try:\n# with lzma.open(file_name, \'rb\') as f:\n# return pickle.load(f)\n# except Exception as e:\n# print("Tried to load a bad pickle file at", file_name)\n# print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")\n# print(e)\n# # return pickle.load(f)\n# else:\n# return None\n\n\n\n"""\ngit add . && git commit -m "Options" && git push && pip install git+ssh://git@gitlab.compute.dtu.dk/tuhe/unitgrade.git --upgrade\n"""\nimport numpy as np\nimport sys\nimport re\nimport threading\nimport tqdm\nimport pickle\nimport os\nfrom io import StringIO\nimport io\nfrom unittest.runner import _WritelnDecorator\nfrom typing import Any\nimport inspect\nimport textwrap\nimport colorama\nfrom colorama import Fore\nfrom functools import _make_key, RLock\nfrom collections import namedtuple\nimport unittest\nimport time\n\n_CacheInfo = namedtuple("CacheInfo", ["hits", "misses", "maxsize", "currsize"])\n\ncolorama.init(autoreset=True) # auto resets your settings after every output\n\ndef gprint(s):\n print(f"{Fore.GREEN}{s}")\n\nmyround = lambda x: np.round(x) # required.\nmsum = lambda x: sum(x)\nmfloor = lambda x: np.floor(x)\n\n\ndef setup_dir_by_class(C, base_dir):\n name = C.__class__.__name__\n return base_dir, name\n\n\nclass Logger(object):\n def __init__(self, buffer):\n assert False\n self.terminal = sys.stdout\n self.log = buffer\n\n def write(self, message):\n self.terminal.write(message)\n self.log.write(message)\n\n def flush(self):\n # this flush method is needed for python 3 compatibility.\n pass\n\n\nclass Capturing(list):\n def __init__(self, *args, stdout=None, unmute=False, **kwargs):\n self._stdout = stdout\n self.unmute = unmute\n super().__init__(*args, **kwargs)\n\n def __enter__(self, capture_errors=True): # don\'t put arguments here.\n self._stdout = sys.stdout if self._stdout == None else self._stdout\n self._stringio = StringIO()\n if self.unmute:\n sys.stdout = Logger(self._stringio)\n else:\n sys.stdout = self._stringio\n\n if capture_errors:\n self._sterr = sys.stderr\n sys.sterr = StringIO() # memory hole it\n self.capture_errors = capture_errors\n return self\n\n def __exit__(self, *args):\n self.extend(self._stringio.getvalue().splitlines())\n del self._stringio # free up some memory\n sys.stdout = self._stdout\n if self.capture_errors:\n sys.sterr = self._sterr\n\n\nclass Capturing2(Capturing):\n def __exit__(self, *args):\n lines = self._stringio.getvalue().splitlines()\n txt = "\\n".join(lines)\n numbers = extract_numbers(txt)\n self.extend(lines)\n del self._stringio # free up some memory\n sys.stdout = self._stdout\n if self.capture_errors:\n sys.sterr = self._sterr\n\n self.output = txt\n self.numbers = numbers\n\n\n# @classmethod\n# class OrderedClassMembers(type):\n# def __prepare__(self, name, bases):\n# assert False\n# return collections.OrderedDict()\n#\n# def __new__(self, name, bases, classdict):\n# ks = list(classdict.keys())\n# for b in bases:\n# ks += b.__ordered__\n# classdict[\'__ordered__\'] = [key for key in ks if key not in (\'__module__\', \'__qualname__\')]\n# return type.__new__(self, name, bases, classdict)\n\n\nclass Report:\n title = "report title"\n version = None\n questions = []\n pack_imports = []\n individual_imports = []\n nL = 120 # Maximum line width\n\n @classmethod\n def reset(cls):\n for (q, _) in cls.questions:\n if hasattr(q, \'reset\'):\n q.reset()\n\n @classmethod\n def mfile(clc):\n return inspect.getfile(clc)\n\n def _file(self):\n return inspect.getfile(type(self))\n\n def _import_base_relative(self):\n if hasattr(self.pack_imports[0], \'__path__\'):\n root_dir = self.pack_imports[0].__path__._path[0]\n else:\n root_dir = self.pack_imports[0].__file__\n\n root_dir = os.path.dirname(root_dir)\n relative_path = os.path.relpath(self._file(), root_dir)\n modules = os.path.normpath(relative_path[:-3]).split(os.sep)\n return root_dir, relative_path, modules\n\n def __init__(self, strict=False, payload=None):\n working_directory = os.path.abspath(os.path.dirname(self._file()))\n self.wdir, self.name = setup_dir_by_class(self, working_directory)\n # self.computed_answers_file = os.path.join(self.wdir, self.name + "_resources_do_not_hand_in.dat")\n for (q, _) in self.questions:\n q.nL = self.nL # Set maximum line length.\n\n if payload is not None:\n self.set_payload(payload, strict=strict)\n\n def main(self, verbosity=1):\n # Run all tests using standard unittest (nothing fancy).\n loader = unittest.TestLoader()\n for q, _ in self.questions:\n start = time.time() # A good proxy for setup time is to\n suite = loader.loadTestsFromTestCase(q)\n unittest.TextTestRunner(verbosity=verbosity).run(suite)\n total = time.time() - start\n q.time = total\n\n def _setup_answers(self, with_coverage=False):\n if with_coverage:\n for q, _ in self.questions:\n q._with_coverage = True\n q._report = self\n\n self.main() # Run all tests in class just to get that out of the way...\n report_cache = {}\n for q, _ in self.questions:\n # print(self.questions)\n if hasattr(q, \'_save_cache\'):\n q()._save_cache()\n print("q is", q())\n q()._cache_put(\'time\', q.time) # = q.time\n report_cache[q.__qualname__] = q._cache2\n else:\n report_cache[q.__qualname__] = {\'no cache see _setup_answers in unitgrade2.py\': True}\n if with_coverage:\n for q, _ in self.questions:\n q._with_coverage = False\n return report_cache\n\n def set_payload(self, payloads, strict=False):\n for q, _ in self.questions:\n q._cache = payloads[q.__qualname__]\n\n\ndef rm_progress_bar(txt):\n # More robust version. Apparently length of bar can depend on various factors, so check for order of symbols.\n nlines = []\n for l in txt.splitlines():\n pct = l.find("%")\n ql = False\n if pct > 0:\n i = l.find("|", pct + 1)\n if i > 0 and l.find("|", i + 1) > 0:\n ql = True\n if not ql:\n nlines.append(l)\n return "\\n".join(nlines)\n\n\ndef extract_numbers(txt):\n # txt = rm_progress_bar(txt)\n numeric_const_pattern = r\'[-+]? (?: (?: \\d* \\. \\d+ ) | (?: \\d+ \\.? ) )(?: [Ee] [+-]? \\d+ ) ?\'\n rx = re.compile(numeric_const_pattern, re.VERBOSE)\n all = rx.findall(txt)\n all = [float(a) if (\'.\' in a or "e" in a) else int(a) for a in all]\n if len(all) > 500:\n print(txt)\n raise Exception("unitgrade.unitgrade.py: Warning, too many numbers!", len(all))\n return all\n\n\nclass ActiveProgress():\n def __init__(self, t, start=True, title="my progress bar", show_progress_bar=True, file=None):\n if file == None:\n file = sys.stdout\n self.file = file\n self.t = t\n self._running = False\n self.title = title\n self.dt = 0.01\n self.n = int(np.round(self.t / self.dt))\n self.show_progress_bar = show_progress_bar\n self.pbar = None\n\n if start:\n self.start()\n\n def start(self):\n self._running = True\n if self.show_progress_bar:\n self.thread = threading.Thread(target=self.run)\n self.thread.start()\n self.time_started = time.time()\n\n def terminate(self):\n if not self._running:\n raise Exception("Stopping a stopped progress bar. ")\n self._running = False\n if self.show_progress_bar:\n self.thread.join()\n if self.pbar is not None:\n self.pbar.update(1)\n self.pbar.close()\n self.pbar = None\n\n self.file.flush()\n return time.time() - self.time_started\n\n def run(self):\n self.pbar = tqdm.tqdm(total=self.n, file=self.file, position=0, leave=False, desc=self.title, ncols=100,\n bar_format=\'{l_bar}{bar}| [{elapsed}<{remaining}]\')\n\n for _ in range(self.n - 1): # Don\'t terminate completely; leave bar at 99% done until terminate.\n if not self._running:\n self.pbar.close()\n self.pbar = None\n break\n\n time.sleep(self.dt)\n self.pbar.update(1)\n\ndef dprint(first, last, nL, extra = "", file=None, dotsym=\'.\', color=\'white\'):\n if file == None:\n file = sys.stdout\n\n # ss = self.item_title_print\n # state = "PASS" if success else "FAILED"\n dot_parts = (dotsym * max(0, nL - len(last) - len(first)))\n # if self.show_progress_bar or True:\n print(first + dot_parts, end="", file=file)\n # else:\n # print(dot_parts, end="", file=self.cc.file)\n last += extra\n # if tsecs >= 0.5:\n # state += " (" + str(tsecs) + " seconds)"\n print(last, file=file)\n\n\nclass UTextResult(unittest.TextTestResult):\n nL = 80\n number = -1 # HAcky way to set question number.\n show_progress_bar = True\n cc = None\n\n def __init__(self, stream, descriptions, verbosity):\n super().__init__(stream, descriptions, verbosity)\n self.successes = []\n\n def printErrors(self) -> None:\n self.printErrorList(\'ERROR\', self.errors)\n self.printErrorList(\'FAIL\', self.failures)\n\n def addError(self, test, err):\n super(unittest.TextTestResult, self).addFailure(test, err)\n self.cc_terminate(success=False)\n\n def addFailure(self, test, err):\n super(unittest.TextTestResult, self).addFailure(test, err)\n self.cc_terminate(success=False)\n\n def addSuccess(self, test: unittest.case.TestCase) -> None:\n self.successes.append(test)\n self.cc_terminate()\n\n def cc_terminate(self, success=True):\n if self.show_progress_bar or True:\n tsecs = np.round(self.cc.terminate(), 2)\n self.cc.file.flush()\n ss = self.item_title_print\n\n state = "PASS" if success else "FAILED"\n\n dot_parts = (\'.\' * max(0, self.nL - len(state) - len(ss)))\n if self.show_progress_bar or True:\n print(self.item_title_print + dot_parts, end="", file=self.cc.file)\n else:\n print(dot_parts, end="", file=self.cc.file)\n\n if tsecs >= 0.5:\n state += " (" + str(tsecs) + " seconds)"\n print(state, file=self.cc.file)\n\n def startTest(self, test):\n # j =self.testsRun\n self.testsRun += 1\n # item_title = self.getDescription(test)\n item_title = test.shortDescription() # Better for printing (get from cache).\n if item_title == None:\n # For unittest framework where getDescription may return None.\n item_title = self.getDescription(test)\n self.item_title_print = " * q%i.%i) %s" % (UTextResult.number + 1, self.testsRun, item_title)\n estimated_time = 10\n if self.show_progress_bar or True:\n self.cc = ActiveProgress(t=estimated_time, title=self.item_title_print, show_progress_bar=self.show_progress_bar, file=sys.stdout)\n else:\n print(self.item_title_print + (\'.\' * max(0, self.nL - 4 - len(self.item_title_print))), end="")\n\n self._test = test\n self._stdout = sys.stdout\n sys.stdout = io.StringIO()\n\n def stopTest(self, test):\n sys.stdout = self._stdout\n super().stopTest(test)\n\n def _setupStdout(self):\n if self._previousTestClass == None:\n total_estimated_time = 1\n if hasattr(self.__class__, \'q_title_print\'):\n q_title_print = self.__class__.q_title_print\n else:\n q_title_print = "<unnamed test. See unitgrade.py>"\n\n cc = ActiveProgress(t=total_estimated_time, title=q_title_print, show_progress_bar=self.show_progress_bar)\n self.cc = cc\n\n def _restoreStdout(self): # Used when setting up the test.\n if self._previousTestClass is None:\n q_time = self.cc.terminate()\n q_time = np.round(q_time, 2)\n sys.stdout.flush()\n if self.show_progress_bar:\n print(self.cc.title, end="")\n print(" " * max(0, self.nL - len(self.cc.title)) + (" (" + str(q_time) + " seconds)" if q_time >= 0.5 else ""))\n\n\nclass UTextTestRunner(unittest.TextTestRunner):\n def __init__(self, *args, **kwargs):\n stream = io.StringIO()\n super().__init__(*args, stream=stream, **kwargs)\n\n def _makeResult(self):\n # stream = self.stream # not you!\n stream = sys.stdout\n stream = _WritelnDecorator(stream)\n return self.resultclass(stream, self.descriptions, self.verbosity)\n\n\ndef cache(foo, typed=False):\n """ Magic cache wrapper\n https://github.com/python/cpython/blob/main/Lib/functools.py\n """\n maxsize = None\n def wrapper(self, *args, **kwargs):\n key = (self.cache_id(), ("@cache", foo.__name__, _make_key(args, kwargs, typed)))\n if not self._cache_contains(key):\n value = foo(self, *args, **kwargs)\n self._cache_put(key, value)\n else:\n value = self._cache_get(key)\n return value\n\n return wrapper\n\n\ndef get_hints(ss):\n if ss == None:\n return None\n try:\n ss = textwrap.dedent(ss)\n ss = ss.replace(\'\'\'"""\'\'\', "").strip()\n hints = ["hints:", ]\n j = np.argmax([ss.lower().find(h) for h in hints])\n h = hints[j]\n ss = ss[ss.find(h) + len(h) + 1:]\n ss = "\\n".join([l for l in ss.split("\\n") if not l.strip().startswith(":")])\n ss = textwrap.dedent(ss)\n ss = ss.strip()\n return ss\n except Exception as e:\n print("bad hints", ss, e)\n\n\nclass UTestCase(unittest.TestCase):\n _outcome = None # A dictionary which stores the user-computed outcomes of all the tests. This differs from the cache.\n _cache = None # Read-only cache. Ensures method always produce same result.\n _cache2 = None # User-written cache.\n _with_coverage = False\n _report = None # The report used. This is very, very hacky and should always be None. Don\'t rely on it!\n\n def capture(self):\n if hasattr(self, \'_stdout\') and self._stdout is not None:\n file = self._stdout\n else:\n # self._stdout = sys.stdout\n # sys._stdout = io.StringIO()\n file = sys.stdout\n return Capturing2(stdout=file)\n\n @classmethod\n def question_title(cls):\n """ Return the question title """\n return cls.__doc__.strip().splitlines()[0].strip() if cls.__doc__ is not None else cls.__qualname__\n\n @classmethod\n def reset(cls):\n print("Warning, I am not sure UTestCase.reset() is needed anymore and it seems very hacky.")\n cls._outcome = None\n cls._cache = None\n cls._cache2 = None\n\n def _callSetUp(self):\n if self._with_coverage:\n if not hasattr(self._report, \'covcache\'):\n self._report.covcache = {}\n import coverage\n self.cov = coverage.Coverage()\n self.cov.start()\n self.setUp()\n\n def _callTearDown(self):\n self.tearDown()\n if self._with_coverage:\n from pathlib import Path\n from snipper import snipper_main\n self.cov.stop()\n data = self.cov.get_data()\n base, _, _ = self._report._import_base_relative()\n for file in data.measured_files():\n file = os.path.normpath(file)\n root = Path(base)\n child = Path(file)\n if root in child.parents:\n with open(child, \'r\') as f:\n s = f.read()\n lines = s.splitlines()\n garb = \'GARBAGE\'\n\n lines2 = snipper_main.censor_code(lines, keep=True)\n assert len(lines) == len(lines2)\n\n for l in data.contexts_by_lineno(file):\n if lines2[l].strip() == garb:\n if self.cache_id() not in self._report.covcache:\n self._report.covcache[self.cache_id()] = {}\n\n rel = os.path.relpath(child, root)\n cc = self._report.covcache[self.cache_id()]\n j = 0\n for j in range(l, -1, -1):\n if "def" in lines2[j] or "class" in lines2[j]:\n break\n from snipper.legacy import gcoms\n fun = lines2[j]\n comments, _ = gcoms("\\n".join(lines2[j:l]))\n if rel not in cc:\n cc[rel] = {}\n cc[rel][fun] = (l, "\\n".join(comments))\n self._cache_put((self.cache_id(), \'coverage\'), self._report.covcache)\n\n def shortDescriptionStandard(self):\n sd = super().shortDescription()\n if sd is None:\n sd = self._testMethodName\n return sd\n\n def shortDescription(self):\n sd = self.shortDescriptionStandard()\n title = self._cache_get((self.cache_id(), \'title\'), sd)\n return title if title is not None else sd\n\n @property\n def title(self):\n return self.shortDescription()\n\n @title.setter\n def title(self, value):\n self._cache_put((self.cache_id(), \'title\'), value)\n\n def _get_outcome(self):\n if not (self.__class__, \'_outcome\') or self.__class__._outcome is None:\n self.__class__._outcome = {}\n return self.__class__._outcome\n\n def _callTestMethod(self, testMethod):\n t = time.time()\n self._ensure_cache_exists() # Make sure cache is there.\n if self._testMethodDoc is not None:\n self._cache_put((self.cache_id(), \'title\'), self.shortDescriptionStandard())\n\n self._cache2[(self.cache_id(), \'assert\')] = {}\n res = testMethod()\n elapsed = time.time() - t\n self._get_outcome()[self.cache_id()] = res\n self._cache_put((self.cache_id(), "time"), elapsed)\n\n def cache_id(self):\n c = self.__class__.__qualname__\n m = self._testMethodName\n return c, m\n\n def __init__(self, *args, **kwargs):\n super().__init__(*args, **kwargs)\n self._load_cache()\n self._assert_cache_index = 0\n\n def _ensure_cache_exists(self):\n if not hasattr(self.__class__, \'_cache\') or self.__class__._cache == None:\n self.__class__._cache = dict()\n if not hasattr(self.__class__, \'_cache2\') or self.__class__._cache2 == None:\n self.__class__._cache2 = dict()\n\n def _cache_get(self, key, default=None):\n self._ensure_cache_exists()\n return self.__class__._cache.get(key, default)\n\n def _cache_put(self, key, value):\n self._ensure_cache_exists()\n self.__class__._cache2[key] = value\n\n def _cache_contains(self, key):\n self._ensure_cache_exists()\n return key in self.__class__._cache\n\n def wrap_assert(self, assert_fun, first, *args, **kwargs):\n # sys.stdout = self._stdout\n key = (self.cache_id(), \'assert\')\n if not self._cache_contains(key):\n print("Warning, framework missing", key)\n self.__class__._cache[\n key] = {} # A new dict. We manually insert it because we have to use that the dict is mutable.\n cache = self._cache_get(key)\n id = self._assert_cache_index\n if not id in cache:\n print("Warning, framework missing cache index", key, "id =", id)\n _expected = cache.get(id, f"Key {id} not found in cache; framework files missing. Please run deploy()")\n\n # The order of these calls is important. If the method assert fails, we should still store the correct result in cache.\n cache[id] = first\n self._cache_put(key, cache)\n self._assert_cache_index += 1\n assert_fun(first, _expected, *args, **kwargs)\n\n def assertEqualC(self, first: Any, msg: Any = ...) -> None:\n self.wrap_assert(self.assertEqual, first, msg)\n\n def _cache_file(self):\n # The filename-directory stuff is a bit tricky but this seems robust.\n return os.path.dirname(inspect.getabsfile(type(self))) + "/unitgrade/" + self.__class__.__name__ + ".pkl"\n\n def _save_cache(self):\n # get the class name (i.e. what to save to).\n cfile = self._cache_file()\n if not os.path.isdir(os.path.dirname(cfile)):\n os.makedirs(os.path.dirname(cfile))\n\n if hasattr(self.__class__, \'_cache2\'):\n with open(cfile, \'wb\') as f:\n pickle.dump(self.__class__._cache2, f)\n\n # But you can also set cache explicitly.\n def _load_cache(self):\n if self._cache is not None: # Cache already loaded. We will not load it twice.\n return\n # raise Exception("Loaded cache which was already set. What is going on?!")\n cfile = self._cache_file()\n if os.path.exists(cfile):\n try:\n # print("\\ncache file", cfile)\n with open(cfile, \'rb\') as f:\n data = pickle.load(f)\n self.__class__._cache = data\n except Exception as e:\n print("Bad cache", cfile)\n print(e)\n else:\n print("Warning! data file not found", cfile)\n\n def _feedErrorsToResult(self, result, errors):\n """ Use this to show hints on test failure. """\n if not isinstance(result, UTextResult):\n er = [e for e, v in errors if v != None]\n import textwrap\n if len(er) > 0:\n hints = []\n key = (self.cache_id(), \'coverage\')\n if self._cache_contains(key):\n CC = self._cache_get(key)\n for id in CC:\n if id == self.cache_id():\n cl, m = id\n gprint(f"> An error occured while solving: {cl}.{m}. The files/methods you need to edit are:") # For the test {id} in {file} you should edit:")\n for file in CC[id]:\n rec = CC[id][file]\n gprint(f"> * {file}")\n for l in rec:\n _, comments = CC[id][file][l]\n hint = get_hints(comments)\n\n if hint != None:\n # hint = textwrap.dedent(hint)\n hints.append(hint)\n gprint(f"> - {l}")\n\n er = er[0]\n doc = er._testMethodDoc\n if doc is not None:\n hint = get_hints(er._testMethodDoc)\n if hint is not None:\n hints = [hint] + hints\n if len(hints) > 0:\n gprint("> Hints:")\n gprint(textwrap.indent("\\n".join(hints), "> "))\n\n super()._feedErrorsToResult(result, errors)\n\n def startTestRun(self):\n # print("asdfsdaf 11", file=sys.stderr)\n super().startTestRun()\n # print("asdfsdaf")\n\n def _callTestMethod(self, method):\n # print("asdfsdaf")\n super()._callTestMethod(method)\n\n\ndef hide(func):\n return func\n\n\ndef makeRegisteringDecorator(foreignDecorator):\n """\n Returns a copy of foreignDecorator, which is identical in every\n way(*), except also appends a .decorator property to the callable it\n spits out.\n """\n\n def newDecorator(func):\n # Call to newDecorator(method)\n # Exactly like old decorator, but output keeps track of what decorated it\n R = foreignDecorator(func) # apply foreignDecorator, like call to foreignDecorator(method) would have done\n R.decorator = newDecorator # keep track of decorator\n # R.original = func # might as well keep track of everything!\n return R\n\n newDecorator.__name__ = foreignDecorator.__name__\n newDecorator.__doc__ = foreignDecorator.__doc__\n return newDecorator\n\nhide = makeRegisteringDecorator(hide)\n\ndef methodsWithDecorator(cls, decorator):\n """\n Returns all methods in CLS with DECORATOR as the\n outermost decorator.\n\n DECORATOR must be a "registering decorator"; one\n can make any decorator "registering" via the\n makeRegisteringDecorator function.\n\n import inspect\n ls = list(methodsWithDecorator(GeneratorQuestion, deco))\n for f in ls:\n print(inspect.getsourcelines(f) ) # How to get all hidden questions.\n """\n for maybeDecorated in cls.__dict__.values():\n if hasattr(maybeDecorated, \'decorator\'):\n if maybeDecorated.decorator == decorator:\n print(maybeDecorated)\n yield maybeDecorated\n# 817\n\n\nimport numpy as np\nfrom tabulate import tabulate\nfrom datetime import datetime\nimport pyfiglet\nimport unittest\nimport inspect\nimport os\nimport argparse\nimport time\n\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Example: \nTo run all tests in a report: \n\n> python assignment1_dp.py\n\nTo run only question 2 or question 2.1\n\n> python assignment1_dp.py -q 2\n> python assignment1_dp.py -q 2.1\n\nNote this scripts does not grade your report. To grade your report, use:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'-q\', nargs=\'?\', type=str, default=None, help=\'Only evaluate this question (e.g.: -q 2)\')\nparser.add_argument(\'--showexpected\', action="store_true", help=\'Show the expected/desired result\')\nparser.add_argument(\'--showcomputed\', action="store_true", help=\'Show the answer your code computes\')\nparser.add_argument(\'--unmute\', action="store_true", help=\'Show result of print(...) commands in code\')\nparser.add_argument(\'--passall\', action="store_true", help=\'Automatically pass all tests. Useful when debugging.\')\nparser.add_argument(\'--noprogress\', action="store_true", help=\'Disable progress bars.\')\n\ndef evaluate_report_student(report, question=None, qitem=None, unmute=None, passall=None, ignore_missing_file=False, show_tol_err=False):\n args = parser.parse_args()\n if question is None and args.q is not None:\n question = args.q\n if "." in question:\n question, qitem = [int(v) for v in question.split(".")]\n else:\n question = int(question)\n\n if hasattr(report, "computed_answer_file") and not os.path.isfile(report.computed_answers_file) and not ignore_missing_file:\n raise Exception("> Error: The pre-computed answer file", os.path.abspath(report.computed_answers_file), "does not exist. Check your package installation")\n\n if unmute is None:\n unmute = args.unmute\n if passall is None:\n passall = args.passall\n\n\n results, table_data = evaluate_report(report, question=question, show_progress_bar=not unmute and not args.noprogress, qitem=qitem, verbose=False, passall=passall, show_expected=args.showexpected, show_computed=args.showcomputed,unmute=unmute,\n show_tol_err=show_tol_err)\n\n\n if question is None:\n print("Provisional evaluation")\n tabulate(table_data)\n table = table_data\n print(tabulate(table))\n print(" ")\n\n fr = inspect.getouterframes(inspect.currentframe())[1].filename\n gfile = os.path.basename(fr)[:-3] + "_grade.py"\n if os.path.exists(gfile):\n print("Note your results have not yet been registered. \\nTo register your results, please run the file:")\n print(">>>", gfile)\n print("In the same manner as you ran this file.")\n\n\n return results\n\n\ndef upack(q):\n # h = zip([(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()])\n h =[(i[\'w\'], i[\'possible\'], i[\'obtained\']) for i in q.values()]\n h = np.asarray(h)\n return h[:,0], h[:,1], h[:,2],\n\nclass UnitgradeTextRunner(unittest.TextTestRunner):\n def __init__(self, *args, **kwargs):\n super().__init__(*args, **kwargs)\n\nclass SequentialTestLoader(unittest.TestLoader):\n def getTestCaseNames(self, testCaseClass):\n test_names = super().getTestCaseNames(testCaseClass)\n # testcase_methods = list(testCaseClass.__dict__.keys())\n ls = []\n for C in testCaseClass.mro():\n if issubclass(C, unittest.TestCase):\n ls = list(C.__dict__.keys()) + ls\n testcase_methods = ls\n test_names.sort(key=testcase_methods.index)\n return test_names\n\ndef evaluate_report(report, question=None, qitem=None, passall=False, verbose=False, show_expected=False, show_computed=False,unmute=False, show_help_flag=True, silent=False,\n show_progress_bar=True,\n show_tol_err=False,\n big_header=True):\n\n from src.unitgrade2.version import __version__\n now = datetime.now()\n if big_header:\n ascii_banner = pyfiglet.figlet_format("UnitGrade", font="doom")\n b = "\\n".join( [l for l in ascii_banner.splitlines() if len(l.strip()) > 0] )\n else:\n b = "Unitgrade"\n dt_string = now.strftime("%d/%m/%Y %H:%M:%S")\n print(b + " v" + __version__ + ", started: " + dt_string+ "\\n")\n # print("Started: " + dt_string)\n s = report.title\n if hasattr(report, "version") and report.version is not None:\n s += " version " + report.version\n print(s, "(use --help for options)" if show_help_flag else "")\n # print(f"Loaded answers from: ", report.computed_answers_file, "\\n")\n table_data = []\n t_start = time.time()\n score = {}\n loader = SequentialTestLoader()\n\n for n, (q, w) in enumerate(report.questions):\n if question is not None and n+1 != question:\n continue\n suite = loader.loadTestsFromTestCase(q)\n qtitle = q.question_title() if hasattr(q, \'question_title\') else q.__qualname__\n q_title_print = "Question %i: %s"%(n+1, qtitle)\n print(q_title_print, end="")\n q.possible = 0\n q.obtained = 0\n q_ = {} # Gather score in this class.\n from src.unitgrade2.unitgrade2 import UTextTestRunner\n UTextResult.q_title_print = q_title_print # Hacky\n UTextResult.show_progress_bar = show_progress_bar # Hacky.\n UTextResult.number = n\n UTextResult.nL = report.nL\n\n res = UTextTestRunner(verbosity=2, resultclass=UTextResult).run(suite)\n\n possible = res.testsRun\n obtained = len(res.successes)\n\n assert len(res.successes) + len(res.errors) + len(res.failures) == res.testsRun\n\n obtained = int(w * obtained * 1.0 / possible ) if possible > 0 else 0\n score[n] = {\'w\': w, \'possible\': w, \'obtained\': obtained, \'items\': q_, \'title\': qtitle}\n q.obtained = obtained\n q.possible = possible\n\n s1 = f" * q{n+1}) Total"\n s2 = f" {q.obtained}/{w}"\n print(s1 + ("."* (report.nL-len(s1)-len(s2) )) + s2 )\n print(" ")\n table_data.append([f"q{n+1}) Total", f"{q.obtained}/{w}"])\n\n ws, possible, obtained = upack(score)\n possible = int( msum(possible) )\n obtained = int( msum(obtained) ) # Cast to python int\n report.possible = possible\n report.obtained = obtained\n now = datetime.now()\n dt_string = now.strftime("%H:%M:%S")\n\n dt = int(time.time()-t_start)\n minutes = dt//60\n seconds = dt - minutes*60\n plrl = lambda i, s: str(i) + " " + s + ("s" if i != 1 else "")\n\n from src.unitgrade2.unitgrade2 import dprint\n dprint(first = "Total points at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +")",\n last=""+str(report.obtained)+"/"+str(report.possible), nL = report.nL)\n\n # print(f"Completed at "+ dt_string + " (" + plrl(minutes, "minute") + ", "+ plrl(seconds, "second") +"). Total")\n\n table_data.append(["Total", ""+str(report.obtained)+"/"+str(report.possible) ])\n results = {\'total\': (obtained, possible), \'details\': score}\n return results, table_data\n\n\nimport bz2\nimport pickle\nimport os\n\n\ndef bzwrite(json_str, token): # to get around obfuscation issues\n with getattr(bz2, \'open\')(token, "wt") as f:\n f.write(json_str)\n\ndef gather_imports(imp):\n resources = {}\n m = imp\n # for m in pack_imports:\n # print(f"*** {m.__name__}")\n f = m.__file__\n # dn = os.path.dirname(f)\n # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n # top_package = str(__import__(m.__name__.split(\'.\')[0]).__path__)\n\n if hasattr(m, \'__file__\') and not hasattr(m, \'__path__\'): # Importing a simple file: m.__class__.__name__ == \'module\' and False:\n top_package = os.path.dirname(m.__file__)\n module_import = True\n else:\n top_package = __import__(m.__name__.split(\'.\')[0]).__path__._path[0]\n module_import = False\n\n # top_package = os.path.dirname(__import__(m.__name__.split(\'.\')[0]).__file__)\n # top_package = os.path.dirname(top_package)\n import zipfile\n # import strea\n # zipfile.ZipFile\n import io\n # file_like_object = io.BytesIO(my_zip_data)\n zip_buffer = io.BytesIO()\n with zipfile.ZipFile(zip_buffer, \'w\') as zip:\n # zip.write()\n for root, dirs, files in os.walk(top_package):\n for file in files:\n if file.endswith(".py"):\n fpath = os.path.join(root, file)\n v = os.path.relpath(os.path.join(root, file), os.path.dirname(top_package) if not module_import else top_package)\n zip.write(fpath, v)\n\n resources[\'zipfile\'] = zip_buffer.getvalue()\n resources[\'top_package\'] = top_package\n resources[\'module_import\'] = module_import\n return resources, top_package\n\n if f.endswith("__init__.py"):\n for root, dirs, files in os.walk(os.path.dirname(f)):\n for file in files:\n if file.endswith(".py"):\n # print(file)\n # print()\n v = os.path.relpath(os.path.join(root, file), top_package)\n with open(os.path.join(root, file), \'r\') as ff:\n resources[v] = ff.read()\n else:\n v = os.path.relpath(f, top_package)\n with open(f, \'r\') as ff:\n resources[v] = ff.read()\n return resources\n\nimport argparse\nparser = argparse.ArgumentParser(description=\'Evaluate your report.\', epilog="""Use this script to get the score of your report. Example:\n\n> python report1_grade.py\n\nFinally, note that if your report is part of a module (package), and the report script requires part of that package, the -m option for python may be useful.\nFor instance, if the report file is in Documents/course_package/report3_complete.py, and `course_package` is a python package, then change directory to \'Documents/` and run:\n\n> python -m course_package.report1\n\nsee https://docs.python.org/3.9/using/cmdline.html\n""", formatter_class=argparse.RawTextHelpFormatter)\nparser.add_argument(\'--noprogress\', action="store_true", help=\'Disable progress bars\')\nparser.add_argument(\'--autolab\', action="store_true", help=\'Show Autolab results\')\n\ndef gather_upload_to_campusnet(report, output_dir=None):\n n = report.nL\n args = parser.parse_args()\n results, table_data = evaluate_report(report, show_help_flag=False, show_expected=False, show_computed=False, silent=True,\n show_progress_bar=not args.noprogress,\n big_header=not args.autolab)\n # print(" ")\n # print("="*n)\n # print("Final evaluation")\n # print(tabulate(table_data))\n # also load the source code of missing files...\n\n sources = {}\n print("")\n if not args.autolab:\n if len(report.individual_imports) > 0:\n print("By uploading the .token file, you verify the files:")\n for m in report.individual_imports:\n print(">", m.__file__)\n print("Are created/modified individually by you in agreement with DTUs exam rules")\n report.pack_imports += report.individual_imports\n\n if len(report.pack_imports) > 0:\n print("Including files in upload...")\n for k, m in enumerate(report.pack_imports):\n nimp, top_package = gather_imports(m)\n _, report_relative_location, module_import = report._import_base_relative()\n\n # report_relative_location = os.path.relpath(inspect.getfile(report.__class__), top_package)\n nimp[\'report_relative_location\'] = report_relative_location\n nimp[\'report_module_specification\'] = module_import\n nimp[\'name\'] = m.__name__\n sources[k] = nimp\n # if len([k for k in nimp if k not in sources]) > 0:\n print(f" * {m.__name__}")\n # sources = {**sources, **nimp}\n results[\'sources\'] = sources\n\n if output_dir is None:\n output_dir = os.getcwd()\n\n payload_out_base = report.__class__.__name__ + "_handin"\n\n obtain, possible = results[\'total\']\n vstring = "_v"+report.version if report.version is not None else ""\n\n token = "%s_%i_of_%i%s.token"%(payload_out_base, obtain, possible,vstring)\n token = os.path.normpath(os.path.join(output_dir, token))\n\n\n with open(token, \'wb\') as f:\n pickle.dump(results, f)\n\n if not args.autolab:\n print(" ")\n print("To get credit for your results, please upload the single unmodified file: ")\n print(">", token)\n # print("To campusnet without any modifications.")\n\n # print("Now time for some autolab fun")\n\ndef source_instantiate(name, report1_source, payload):\n eval("exec")(report1_source, globals())\n pl = pickle.loads(bytes.fromhex(payload))\n report = eval(name)(payload=pl, strict=True)\n # report.set_payload(pl)\n return report\n\n\n__version__ = "0.0.3"\n\nfrom homework1 import find_primes\nimport homework1\n\nclass Week1(UTestCase):\n def test_find_all_primes(self):\n """\n Hints:\n * Insert a breakpoint and check what your function find_primes(4) actually outputs\n """\n self.assertEqual(find_primes(4), [2,3])\n\nclass Report1Hints(Report):\n title = "CS 106 Report 1"\n questions = [(Week1, 10)] # Include a single question for 10 credits.\n pack_imports = [homework1] # Unitgrade will recursively include all .py files from "cs101flat"' +report1_payload = '80049567020000000000007d948c055765656b31947d942868018c14746573745f66696e645f616c6c5f7072696d65739486948c08636f7665726167659486947d946801680386947d948c0c686f6d65776f726b312e7079947d94288c146465662066696e645f7072696d6573286e293a20944b098cf72222220a2020202052657475726e2061206c697374206f6620616c6c207072696d657320757020746f2028616e6420696e636c7564696e6729206e0a2020202048696e74733a0a20202020202020202a2052656d656d62657220746f2072657475726e2061202a6c6973742a2028616e64206e6f742061207475706c65206f72206e756d7079206e646172726179290a20202020202020202a2052656d656d62657220746f20696e636c756465206e206966206e2069732061207072696d650a20202020202020202a2054686520666972737420666577207072696d65732061726520322c20332c20352c202e2e2e0a202020202222229486948c116465662069735f7072696d65286e293a20944b148cd02222220a2020202052657475726e207472756520696666206e2069732061207072696d650a2020202048696e74733a0a20202020202020202a2041206e756d6265722069662061207072696d6520696620697420686173206e6f2064697669736f72730a20202020202020202a20596f752063616e20636865636b206966206b2064697669646573206e207573696e6720746865206d6f64756c6f2d6f70657261746f722e20492e652e206e2025206b203d3d2054727565206966206b2064697669646573206e2e0a202020202222229486947573738c0474696d6594473fe87a010000000075732e' +name="Report1Hints" + +report = source_instantiate(name, report1_source, report1_payload) +output_dir = os.path.dirname(__file__) +gather_upload_to_campusnet(report, output_dir) diff --git a/examples/example_hints/students/cs106/unitgrade/Week1.pkl b/examples/example_hints/students/cs106/unitgrade/Week1.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d6664eb2af6a64e0cbc9a10323e29c1ddc673bae GIT binary patch literal 604 zcmZo*nHtE%00y;FdRW6#Q?m`H^oW$C7MH}QW#*;CC+6hD7ZhdYrWQ|Wo6^IPoL`n& zl$f46rEN;>lnllUCJ^1jlaZgBTAp8&ZKzjJIi+@rMvq8JYMKJr0ElLdJWVTwDc+nt z-<6b<xD*r=6oOJqN{jLo5*2bXi%S&p(-abOaugtn6-o;fO7ayn67y0NGV_viN>eiP z(lr(G!1_Eg^Gb@Xz)X-aS_(m_xv9BHsYM_yMKD9PK&EOzjL6F`QAkuMDJ{rJRmd+= z$Sch)s8q;HNh~T#tklF|5X9P4g*=7KG!Rj&kO*-clKPO0RE4z6qT&*TwA6BlY_URO zQL2KGj)Jj{f~k&zo}M09y^@j=DD(tDfs$Da2~TK<i1b`Q3z3qd(o}`aG%VI)c-;}? z8IadA(_rocxi_;!AtSL^AunGcC9^EEIKQYE><UP5Mdp_(Bq!!6Bxj^1XM<E{gH@%Z z7Axc_lon^^r7M(Vq$=d*r<CU8>*g1v7A2PC7wIW@>ZR%_<SD2sWGmR(Duh5Bseq&z L*{h|+#l?C6Diglv literal 0 HcmV?d00001 -- GitLab