diff options
-rw-r--r-- | ExampleAssessments/CMP-4009B.yml | 24 | ||||
-rw-r--r-- | mark.py | 52 | ||||
-rw-r--r-- | reflect.py | 31 | ||||
-rw-r--r-- | reportWriter.py | 0 | ||||
-rw-r--r-- | requirements.txt | 1 |
5 files changed, 108 insertions, 0 deletions
diff --git a/ExampleAssessments/CMP-4009B.yml b/ExampleAssessments/CMP-4009B.yml new file mode 100644 index 0000000..373f7f4 --- /dev/null +++ b/ExampleAssessments/CMP-4009B.yml @@ -0,0 +1,24 @@ +files: + - pjtool.py: + classes: + - Date: + methods: + - __init__(4) + - __str__(1) + - __eq__(2) + - __lt__(2) + - numYears(2) + - numMonths(2) + tests: + - | + d1 = Date(2001, 8, 12) + d2 = Date(2001, 8, 12) + return d1 == d2 + - tester.py: + functions: + - dateTester(2) + - turbine.py: + classes: + - Turbine: + attributes: + - rating:int
\ No newline at end of file @@ -0,0 +1,52 @@ +import argparse +import tempfile +import zipfile +import yaml +import os + +def main(assessment_path, submission_path, student_no): + print(student_no) + + with open(assessment_path, "r") as f: + assessment_struct = yaml.safe_load(f) + + print(assessment_struct) + + for required_file in assessment_struct["files"]: + required_file = list(required_file.keys())[0] + print(required_file, required_file in os.listdir(submission_path)) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-a", "--assessment", + help = "Path to an assessment .yml file", + type = str, + required = True + ) + parser.add_argument( + "-s", "--submission", + help = "Path to a zip of a student's code", + type = str, + required = True + ) + args = vars(parser.parse_args()) + + with tempfile.TemporaryDirectory() as tempdir: + with zipfile.ZipFile(args["submission"]) as z: + z.extractall(tempdir) + + # some zipping applications make a folder inside the zip with the files in that folder. + # try to deal with this here. + submission_files = tempdir + if os.path.isdir( + os.path.join(submission_files, os.listdir(submission_files)[0]) + ) and len(os.listdir(submission_files)) == 1: + submission_files = os.path.join(submission_files, os.listdir(submission_files)[0]) + + main( + args["assessment"], + submission_files, + os.path.splitext(os.path.split(args["submission"])[-1])[0] + ) +
\ No newline at end of file diff --git a/reflect.py b/reflect.py new file mode 100644 index 0000000..2cfb2f3 --- /dev/null +++ b/reflect.py @@ -0,0 +1,31 @@ +from dataclasses import dataclass +import importlib +import inspect +import pkgutil +import sys +import os + +@dataclass +class Reflect: + client_code_path:str + imported_modules = {} + + def __post_init__(self): + sys.path.insert(1, self.client_code_path) + self.client_modules = [p for p in pkgutil.iter_modules() if str(p[0])[12:-2] == self.client_code_path] + + def import_module(self, module_name): + for module in self.client_modules: + if module.name == module_name: + self.imported_modules[module_name] = importlib.import_module(module.name) + + def get_module_doc(self, module_name): + return inspect.getdoc(self.imported_modules[module_name]) + + +if __name__ == "__main__": + user_code_path = "/media/veracrypt1/Nextcloud/UniStuff/3.0 - CMP 3rd Year Project/ExampleSubmissions/Submission_A" + + reflect = Reflect(user_code_path) + reflect.import_module("pjtool") + print(reflect.get_module_doc("pjtool")) diff --git a/reportWriter.py b/reportWriter.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/reportWriter.py diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bee6c14 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +PyYAML==6.0 |