From 37236fdc957f5900f6a4bbffbff6ccc07d412c44 Mon Sep 17 00:00:00 2001 From: jwansek Date: Mon, 10 Jan 2022 17:08:42 +0000 Subject: added to report maker and removed the first markdown renderer --- reflect.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 6 deletions(-) (limited to 'reflect.py') diff --git a/reflect.py b/reflect.py index 1cb6241..b8f83c4 100644 --- a/reflect.py +++ b/reflect.py @@ -4,6 +4,7 @@ import inspect import pkgutil import sys import os +import re @dataclass class Reflect: @@ -11,8 +12,9 @@ class Reflect: imported_modules = {} def __post_init__(self): + self.client_code_path = os.path.normpath(self.client_code_path) 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] + self.client_modules = [p for p in pkgutil.iter_modules() if os.path.normpath(str(p[0])[12:-2]) == self.client_code_path] def import_module(self, module_name): """Imports a module. Before reflection can be conducted, a module @@ -63,11 +65,10 @@ class Reflect: Returns: dict: A dictionary of the methods. The index is the function name, followed by a tuple - containing the function object, the documentation, and a list of the named arguments. - WARNING: Does not deal with *args and **kwargs and stuff. + containing the function object, the documentation, and the args as a dict. """ return { - i[0]: (i[1], inspect.getdoc(i[1]), inspect.getfullargspec(i[1])[0]) + i[0]: (i[1], inspect.getdoc(i[1]), inspect.getfullargspec(i[1])._asdict()) for i in inspect.getmembers( self.get_classes(module_name)[class_name][0], predicate=inspect.isfunction @@ -76,13 +77,79 @@ class Reflect: def get_functions(self, module_name): return { - i[0]: (i[1], inspect.getdoc(i[1]), inspect.getfullargspec(i[1])[0]) + i[0]: (i[1], inspect.getdoc(i[1]), inspect.getfullargspec(i[1])._asdict()) for i in inspect.getmembers(self.imported_modules[module_name]) if inspect.isfunction(i[1]) } +def gen_reflection_report(client_code_path, assessment_struct): + reflection = Reflect(client_code_path) + present_module_names = [i.name for i in reflection.client_modules] + out = assessment_struct + + for i, required_file in enumerate(assessment_struct["files"], 0): + required_file = list(required_file.keys())[0] + module_name = os.path.splitext(required_file)[0] + + if module_name in present_module_names: + out["files"][i][required_file]["present"] = True + else: + out["files"][i][required_file]["present"] = False + continue + + reflection.import_module(module_name) + required_files_features = assessment_struct["files"][i][required_file] + if "classes" in required_files_features.keys(): + + present_classes = reflection.get_classes(module_name) + for j, class_name in enumerate(required_files_features["classes"], 0): + class_name = list(class_name.keys())[0] + + if class_name in present_classes.keys(): + out["files"][i][required_file]["classes"][j][class_name]["present"] = True + else: + out["files"][i][required_file]["classes"][j][class_name]["present"] = True + continue + + out["files"][i][required_file]["classes"][j][class_name]["documentation"] = present_classes[class_name][1] + present_methods = reflection.get_class_methods(module_name, class_name) + + for k, required_method in enumerate(assessment_struct["files"][i][required_file]["classes"][j][class_name]["methods"], 0): + out["files"][i][required_file]["classes"][j][class_name]["methods"][k] = {required_method: {}} + + method_name = re.sub(r"\(\d+\)", "", required_method) + if method_name in present_methods.keys(): + out["files"][i][required_file]["classes"][j][class_name]["methods"][k][required_method]["present"] = True + else: + out["files"][i][required_file]["classes"][j][class_name]["methods"][k][required_method]["present"] = False + continue + + out["files"][i][required_file]["classes"][j][class_name]["methods"][k][required_method]["arguments"] = present_methods[method_name][-1] + out["files"][i][required_file]["classes"][j][class_name]["methods"][k][required_method]["documentation"] = present_methods[method_name][-2] + + if "functions" in required_files_features.keys(): + present_functions = reflection.get_functions(module_name) + # print(present_functions) + for j, required_function in enumerate(assessment_struct["files"][i][required_file]["functions"], 0): + function_name = re.sub(r"\(\d+\)", "", required_function) + out["files"][i][required_file]["functions"][j] = {required_function: {}} + + if function_name in present_functions.keys(): + out["files"][i][required_file]["functions"][j][required_function]["present"] = True + else: + out["files"][i][required_file]["functions"][j][required_function]["present"] = False + continue + + out["files"][i][required_file]["functions"][j][required_function]["documentation"] = present_functions[function_name][-2] + out["files"][i][required_file]["functions"][j][required_function]["arguments"] = present_functions[function_name][-1] + + return out + + + + if __name__ == "__main__": - user_code_path = "/media/veracrypt1/Nextcloud/UniStuff/3.0 - CMP 3rd Year Project/ExampleSubmissions/Submission_A" + user_code_path = "D:\\Edencloud\\UniStuff\\3.0 - CMP 3rd Year Project\\Smarker\\../ExampleSubmissions/Submission_A" reflect = Reflect(user_code_path) reflect.import_module("pjtool") -- cgit v1.2.3