summaryrefslogtreecommitdiffstats
path: root/reflect.py
diff options
context:
space:
mode:
Diffstat (limited to 'reflect.py')
-rw-r--r--reflect.py60
1 files changed, 59 insertions, 1 deletions
diff --git a/reflect.py b/reflect.py
index 2cfb2f3..1cb6241 100644
--- a/reflect.py
+++ b/reflect.py
@@ -15,17 +15,75 @@ class Reflect:
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):
+ """Imports a module. Before reflection can be conducted, a module
+ must be imported. WARNING: This will execute module code if it isn't
+ in a if __name__ == "__main__". Takes a module name (that the student made)
+ as the first argument.
+
+ Args:
+ module_name (str): The name of a student's module to import
+ """
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):
+ """Gets the documentation provided for a module.
+
+ Args:
+ module_name (str): The student's module name to get documentation for
+
+ Returns:
+ str: Provided documentation
+ """
return inspect.getdoc(self.imported_modules[module_name])
+ def get_classes(self, module_name):
+ """Gets the classes in a given module. The module must be imported first.
+
+ Args:
+ module_name (str): The name of an imported module to get the name of.
+
+ Returns:
+ dict: Dictionary of classes. The name of the class is the index, followed by
+ a tuple containing the class object and the classes' documentation.
+ """
+ return {
+ i[0]: (i[1], inspect.getdoc(i[1]))
+ for i in inspect.getmembers(self.imported_modules[module_name])
+ if inspect.isclass(i[1])
+ }
+
+ def get_class_methods(self, module_name, class_name):
+ """Gets the user generated methods of a given class. The module must be imported first.
+
+ Args:
+ module_name (str): The name of the module in which the class is contained.
+ class_name (str): The name of the class.
+
+ 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.
+ """
+ return {
+ i[0]: (i[1], inspect.getdoc(i[1]), inspect.getfullargspec(i[1])[0])
+ for i in inspect.getmembers(
+ self.get_classes(module_name)[class_name][0],
+ predicate=inspect.isfunction
+ )
+ }
+
+ def get_functions(self, module_name):
+ return {
+ i[0]: (i[1], inspect.getdoc(i[1]), inspect.getfullargspec(i[1])[0])
+ for i in inspect.getmembers(self.imported_modules[module_name])
+ if inspect.isfunction(i[1])
+ }
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"))
+ print(reflect.get_class_methods("pjtool", "Date"))