From 695d78e29146b393771165faeb13c8aaae20b2bf Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Mon, 30 Dec 2024 10:01:58 +0100 Subject: [PATCH 01/12] refactor : rename variable change variable name from graph_class to ecore_graph to make it more readable --- AstToEcoreConverter.py | 70 +++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/AstToEcoreConverter.py b/AstToEcoreConverter.py index e1731ab..4c17e82 100644 --- a/AstToEcoreConverter.py +++ b/AstToEcoreConverter.py @@ -1174,15 +1174,15 @@ class ASTVisitor(ast.NodeVisitor): """Defines the visits of the different node types of the AST, ASTVisitor calls the functions of ProjectEcoreGraph to create Ecore instances.""" - def __init__(self, graph_class): + def __init__(self, ecore_graph): """ Initializes the ASTVisitor. Args: - graph_class (ProjectEcoreGraph): The instance of ProjectEcoreGraph to interact with. + ecore_graph (ProjectEcoreGraph): The instance of ProjectEcoreGraph to interact with. """ - self.graph = graph_class.get_graph() - self.graph_class = graph_class # ProjectEcoreGraph instance + self.graph = ecore_graph.get_graph() + self.ecore_graph = ecore_graph # ProjectEcoreGraph instance self.current_method = None self.current_class = None self.current_indentation = 0 @@ -1197,9 +1197,9 @@ def visit_Import(self, node): """ for name in node.names: if name.asname is None: - self.graph_class.add_import(name.name, name.name) + self.ecore_graph.add_import(name.name, name.name) else: - self.graph_class.add_import(name.name, name.asname) + self.ecore_graph.add_import(name.name, name.asname) def visit_ImportFrom(self, node): """ @@ -1210,10 +1210,10 @@ def visit_ImportFrom(self, node): """ for name in node.names: if name.asname is None: - self.graph_class.add_import( + self.ecore_graph.add_import( f"{node.module}.{name.name}", name.name) else: - self.graph_class.add_import( + self.ecore_graph.add_import( f"{node.module}.{name.name}", name.asname) def create_inheritance_structure(self, node, child): @@ -1228,15 +1228,15 @@ def create_inheritance_structure(self, node, child): """ base_node = None if isinstance(node, ast.Name): - base_node, base_type = self.graph_class.get_reference_by_name(node.id) + base_node, base_type = self.ecore_graph.get_reference_by_name(node.id) if base_node is None: - base_node = self.graph_class.get_class_by_name( - node.id, module=self.graph_class.get_current_module()) + base_node = self.ecore_graph.get_class_by_name( + node.id, module=self.ecore_graph.get_current_module()) base_node.childClasses.append(child) elif isinstance(base_node, str) and base_type == 0: import_parent = None for import_class in base_node.split('.'): - import_node = self.graph_class.get_class_by_name( + import_node = self.ecore_graph.get_class_by_name( import_class) # module is None here if import_parent is not None: # if import_node does not have parent, it becomes parent itself import_parent.childClasses.append(import_node) @@ -1244,7 +1244,7 @@ def create_inheritance_structure(self, node, child): base_node = import_node base_node.childClasses.append(child) elif isinstance(node, ast.Attribute): - base_node = self.graph_class.get_class_by_name(node.attr) + base_node = self.ecore_graph.get_class_by_name(node.attr) base_node.childClasses.append(child) self.create_inheritance_structure(node.value, base_node) return base_node @@ -1257,9 +1257,9 @@ def visit_ClassDef(self, node): node: The AST node representing the class definition. """ class_name = node.name - self.current_module = self.graph_class.get_current_module() - class_node = self.graph_class.get_class_by_name( - class_name, module=self.graph_class.get_current_module()) + self.current_module = self.ecore_graph.get_current_module() + class_node = self.ecore_graph.get_class_by_name( + class_name, module=self.ecore_graph.get_current_module()) self.current_class = class_node for base in node.bases: @@ -1269,16 +1269,16 @@ def visit_ClassDef(self, node): if isinstance(item, ast.FunctionDef): self.current_indentation = item.col_offset method_name = item.name - method_node = self.graph_class.get_method_def_in_class( + method_node = self.ecore_graph.get_method_def_in_class( method_name, class_node) if method_node is None: - method_node = self.graph_class.create_ecore_instance( + method_node = self.ecore_graph.create_ecore_instance( NodeTypes.METHOD_DEFINITION) - self.graph_class.create_method_signature( + self.ecore_graph.create_method_signature( method_node, method_name, item.args.args) class_node.defines.append(method_node) # to search for missing meth def later - self.graph_class.check_list.append(class_node) + self.ecore_graph.check_list.append(class_node) self.generic_visit(node) def visit_FunctionDef(self, node): @@ -1290,15 +1290,15 @@ def visit_FunctionDef(self, node): """ self.current_method = None if self.current_class is not None: - self.current_method = self.graph_class.get_method_def_in_class( + self.current_method = self.ecore_graph.get_method_def_in_class( node.name, self.current_class) if self.current_method is None: self.current_class = None - self.current_method = self.graph_class.create_ecore_instance( + self.current_method = self.ecore_graph.create_ecore_instance( NodeTypes.METHOD_DEFINITION) - self.graph_class.create_method_signature( + self.ecore_graph.create_method_signature( self.current_method, node.name, node.args.args) - module_node = self.graph_class.get_current_module() + module_node = self.ecore_graph.get_current_module() self.current_module = module_node module_node.contains.append(self.current_method) self.current_indentation = node.col_offset @@ -1330,7 +1330,7 @@ def visit_Assign(self, node): current_target = current_target.value if isinstance(current_target, ast.Name): target_name = f"{current_target.id}.{target_name}" - self.graph_class.add_instance( + self.ecore_graph.add_instance( target_name[:-1], instance[:-1]) self.generic_visit(node) @@ -1351,20 +1351,20 @@ def visit_Call(self, node): if self.current_method is not None: caller_node = self.current_method else: - module_node = self.graph_class.get_module_by_location( - self.graph_class.get_current_module().location) + module_node = self.ecore_graph.get_module_by_location( + self.ecore_graph.get_current_module().location) self.current_module = module_node - method_location = self.graph_class.get_current_module().location + method_location = self.ecore_graph.get_current_module().location method_name = method_location.split('/')[-1] - caller_node = self.graph_class.get_method_def_in_module( + caller_node = self.ecore_graph.get_method_def_in_module( method_name, module_node) if caller_node is None: - caller_node = self.graph_class.get_method_def_from_internal_structure( + caller_node = self.ecore_graph.get_method_def_from_internal_structure( method_name, module_node) if caller_node is None: - caller_node = self.graph_class.create_ecore_instance( + caller_node = self.ecore_graph.create_ecore_instance( NodeTypes.METHOD_DEFINITION) - self.graph_class.create_method_signature( + self.ecore_graph.create_method_signature( caller_node, method_name, []) module_node.contains.append(caller_node) @@ -1380,11 +1380,11 @@ def visit_Call(self, node): instance = instance[:-1] # for calls within one module - self.graph_class.call_in_module.append( + self.ecore_graph.call_in_module.append( [self.current_module, caller_node, instance]) # for calls of imported instances, both within repo and external libraries - instance_from_graph, instance_type = self.graph_class.get_reference_by_name( + instance_from_graph, instance_type = self.ecore_graph.get_reference_by_name( instance.replace(f".{instance.split('.')[-1]}", '')) # this is necessary to get all the called methods' names correctly @@ -1397,7 +1397,7 @@ def visit_Call(self, node): instances[0] = instance_from_graph instance_name = ".".join(instances) - self.graph_class.call_external_module.append( + self.ecore_graph.call_external_module.append( [instance_name, caller_node]) self.generic_visit(node) From c00393358f95dae3e86d49aee2edcc3978f0129c Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:54:58 +0100 Subject: [PATCH 02/12] refactor: Change the way xmi files are created in AstToEcoreConverter- - added safe_repository_name and replaced / and \\ to _ if it is in repository name -removed /xmi_files/ out of AstToEcore .py - changed output in settings to align with changes --- AstToEcoreConverter.py | 5 ++++- settings.py | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/AstToEcoreConverter.py b/AstToEcoreConverter.py index 4c17e82..89ea22b 100644 --- a/AstToEcoreConverter.py +++ b/AstToEcoreConverter.py @@ -1164,7 +1164,10 @@ def write_xmi(self, resource_set, output_directory, repository): repository (str?): The repository name for the output file. """ repository_name = repository.split('\\')[-1] - resource = resource_set.create_resource(URI(f'{output_directory}/xmi_files/{repository_name}.xmi'), + # Replace slashes in the repository name with underscores + safe_repository_name = repository_name.replace('/', '_').replace('\\', '_') + + resource = resource_set.create_resource(URI(f'{output_directory}/{safe_repository_name}.xmi'), use_uuid=True) resource.append(self.graph) resource.save() diff --git a/settings.py b/settings.py index 6ee278c..f6be3f3 100644 --- a/settings.py +++ b/settings.py @@ -14,7 +14,7 @@ # Training Configuration TRAINING_SETTINGS = { # Path to the folder containing the converted repositories - 'output_directory': os.path.join('data/output'), + 'output_directory': os.path.join('data/output/xmi_files'), # Path to the Excel file containing labeled dataset information 'labels_file': os.path.join(BASE_DIR, 'data/labeled_dataset_repos.xlsx'), 'n_epoch': 100, # Number of epochs for training the model @@ -35,7 +35,7 @@ # Path to GitHub repositories used as input 'repository_directory': os.path.join('data/input'), # Path to the folder containing the converted repositories - 'output_directory': os.path.join('data/output'), + 'output_directory': os.path.join('data/output/xmi_files'), # Path to the Excel file containing labeled dataset information 'repository_list_file': os.path.join(BASE_DIR, 'data/labeled_dataset_repos.xlsx'), # Boolean flag; True -> Download all repos from repository_list_files; False -> Do not download from repository_list @@ -47,7 +47,7 @@ # Path to directory containing repositories to classify 'input_directory': os.path.join(BASE_DIR, 'data/input'), # Path for the output directory - 'output_directory': os.path.join(BASE_DIR, 'data/output'), + 'output_directory': os.path.join(BASE_DIR, 'data/output/xmi_files'), # Trained classification model 'model_path': os.path.join(BASE_DIR, 'graph_classification_model.pt'), 'threshold': 0.5 # Value above label is considered predicted by model From 72f92ebeeeb0ce989ee9c7a0a437c5f686b597bf Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Thu, 2 Jan 2025 15:58:05 +0100 Subject: [PATCH 03/12] temp --- tests/test_ATE_Converter.py | 110 ++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/tests/test_ATE_Converter.py b/tests/test_ATE_Converter.py index c1b70ab..0044e58 100644 --- a/tests/test_ATE_Converter.py +++ b/tests/test_ATE_Converter.py @@ -16,46 +16,48 @@ from NodeFeatures import NodeTypes from test_utils import check_path_exists +# puts xmi files when +test_output_dir = 'tests/test_results' + class TestATEConv(unittest.TestCase): #buggy unit test -> missing file - #def test_package(self): - #repo = 'unit_tests/test_package' - #check_path_exists(repo) - #resource_set = ResourceSet() - #graph = ProjectEcoreGraph(resource_set, repo, False) - #ecore_graph = graph.get_graph() - # original - #self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') - #self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') - #self.assertEqual(ecore_graph.packages[0].tName, 'my_package', 'wrong package name') - #self.assertEqual(len(ecore_graph.packages[0].subpackages), 0, 'package should not have subpackage') - #self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') - #self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') - #self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') + # def test_package(self): + # repo = 'unit_tests/test_package' + # check_path_exists(repo) + # resource_set = ResourceSet() + # graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) + # ecore_graph = graph.get_graph() + # self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') + # self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') + # self.assertEqual(ecore_graph.packages[0].tName, 'my_package', 'wrong package name') + # self.assertEqual(len(ecore_graph.packages[0].subpackages), 0, 'package should not have subpackage') + # self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') + # self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') + # self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') #buggy unit test -> missing file - #def test_subpackage(self): - #repo = 'unit_tests/test_subpackage' - #check_path_exists(repo) - #resource_set = ResourceSet() - #graph = ProjectEcoreGraph(resource_set, repo, False) - #ecore_graph = graph.get_graph() - #self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') - #self.assertEqual(ecore_graph.packages[0].tName, 'parent', 'wrong package name') - #self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') - #self.assertEqual(ecore_graph.packages[0].subpackages[0].tName, 'child', 'wrong submodule name') - #self.assertEqual(ecore_graph.packages[0].subpackages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') - #self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') - #self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') - #self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') + # def test_subpackage(self): + # repo = 'unit_tests/test_subpackage' + # check_path_exists(repo) + # resource_set = ResourceSet() + # graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) + # ecore_graph = graph.get_graph() + # self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') + # self.assertEqual(ecore_graph.packages[0].tName, 'parent', 'wrong package name') + # self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') + # self.assertEqual(ecore_graph.packages[0].subpackages[0].tName, 'child', 'wrong submodule name') + # self.assertEqual(ecore_graph.packages[0].subpackages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') + # self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') + # self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') + # self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') def test_module(self): repo = 'unit_tests/test_module' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False,test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.modules), 1, 'wrong number of modules') self.assertEqual(ecore_graph.modules[0].eClass.name, NodeTypes.MODULE.value, 'module is wrong type') @@ -67,7 +69,7 @@ def test_multiple_modules(self): repo = 'unit_tests/test_multiple_modules' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False,test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.modules), 2, 'wrong number of modules') self.assertEqual(ecore_graph.modules[0].eClass.name, NodeTypes.MODULE.value, 'module is wrong type') @@ -83,7 +85,7 @@ def test_module_in_package(self): repo = 'unit_tests/test_module_in_package' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False,test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') self.assertEqual(len(ecore_graph.modules), 1, 'wrong number of modules') @@ -98,7 +100,7 @@ def test_class(self): repo = 'unit_tests/test_class' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.classes), 1, 'wrong number of classes') self.assertEqual(ecore_graph.classes[0].tName, 'MyTestClass', 'wrong class name') @@ -109,7 +111,7 @@ def test_child_class(self): repo = 'unit_tests/test_child_class' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.classes[0].childClasses), 1, 'wrong number of child classes') self.assertEqual(ecore_graph.classes[0].childClasses[0].tName, 'FirstChild', 'wrong name of child class') @@ -118,7 +120,7 @@ def test_method(self): repo = 'unit_tests/test_method' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.methods), 1, 'wrong number of methods') self.assertEqual(ecore_graph.methods[0].tName, 'my_test_method', 'wrong method name') @@ -132,7 +134,7 @@ def test_method_in_class(self): repo = 'unit_tests/test_method_in_class' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[0].eClass.name, NodeTypes.CLASS.value, 'class is wrong type') self.assertEqual(ecore_graph.modules[0].contains[0].tName, 'MyTestClass', 'class name wrong') @@ -145,7 +147,7 @@ def test_multiple_methods_in_class(self): repo = 'unit_tests/test_multiple_methods_in_class' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[0].eClass.name, NodeTypes.CLASS.value, 'class is wrong type') self.assertEqual(ecore_graph.modules[0].contains[0].tName, 'MyTestClass', 'class name wrong') @@ -159,7 +161,7 @@ def test_parameter(self): repo = 'unit_tests/test_parameter' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.methods[0].signatures[0].parameters), 1, 'wrong number of parameters') self.assertEqual(ecore_graph.methods[0].signatures[0].parameters[0].eClass.name, NodeTypes.PARAMETER.value, 'parameter is wrong type') @@ -181,7 +183,7 @@ def test_module_internal_method_call(self): repo = 'unit_tests/test_module_internal_method_call' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[1].signature.method.tName, 'caller_func', 'caller method has wrong name') self.assertEqual(len(ecore_graph.modules[0].contains[1].accessing), 1, 'call object is missing') @@ -194,7 +196,7 @@ def test_internal_method_imports(self): repo = 'unit_tests/test_internal_method_imports' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[1].contains[0].signature.method.tName, 'method_two', 'wrong method name using the import') self.assertEqual(ecore_graph.modules[1].contains[0].accessing[0].eClass.name, NodeTypes.CALL.value, 'imported method cannot be used, import did not work') @@ -205,7 +207,7 @@ def test_internal_class_imports(self): repo = 'unit_tests/test_internal_class_imports' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[1].contains[0].signature.method.tName, 'method_two', 'wrong method name using the import') self.assertEqual(ecore_graph.modules[1].contains[0].accessing[0].eClass.name, NodeTypes.CALL.value, 'imported method cannot be used, import did not work') @@ -217,7 +219,7 @@ def test_internal_method_imports_package(self): repo = 'unit_tests/test_internal_method_imports_package' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[0].signature.method.tName, 'method_two', 'wrong method name using the import') self.assertEqual(ecore_graph.modules[0].contains[0].accessing[0].eClass.name, NodeTypes.CALL.value, 'imported method cannot be used, import did not work') @@ -229,7 +231,7 @@ def test_internal_method_class_imports_package(self): repo = 'unit_tests/test_internal_method_class_imports_package' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[0].signature.method.tName, 'method_two', 'wrong method name using the import') self.assertEqual(ecore_graph.modules[0].contains[0].accessing[0].eClass.name, NodeTypes.CALL.value, 'imported method cannot be used, import did not work') @@ -241,7 +243,7 @@ def test_module_internal_class_call(self): repo = 'unit_tests/test_module_internal_class_call' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertIsNotNone(ecore_graph.modules[0].contains[0].defines[0].accessedBy, 'call source is missing') self.assertEqual(len(ecore_graph.modules[0].contains[1].accessing), 1, 'call object is missing') @@ -255,7 +257,7 @@ def test_class_internal_method_call(self): repo = 'unit_tests/test_class_internal_method_call' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[0].defines[1].accessing[0].eClass.name, NodeTypes.CALL.value, 'call is wrong type') self.assertEqual(ecore_graph.modules[0].contains[0].defines[1].accessing[0].target.signature.method.tName, 'called_func', 'target has wrong method name') @@ -266,7 +268,7 @@ def test_internal_method_imports_multiple_packages(self): repo = 'unit_tests/test_internal_method_imports_multiple_packages' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[0].signature.method.tName, 'method_two', 'wrong method name using the import') self.assertEqual(ecore_graph.modules[0].contains[0].accessing[0].eClass.name, NodeTypes.CALL.value, 'imported method cannot be used, import did not work') @@ -278,7 +280,7 @@ def test_internal_method_class_imports_multiple_packages(self): repo = 'unit_tests/test_internal_method_class_imports_multiple_packages' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[0].contains[0].signature.method.tName, 'method_two', 'wrong method name using the import') self.assertEqual(ecore_graph.modules[0].contains[0].accessing[0].eClass.name, NodeTypes.CALL.value, 'imported method cannot be used, import did not work') @@ -290,7 +292,7 @@ def test_call_external_library(self): repo = 'unit_tests/test_call_external_library' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.packages[0].tName, 'numpy_ExternalLibrary', 'imported library package is missing') self.assertEqual(ecore_graph.modules[1].namespace.tName, 'numpy_ExternalLibrary', 'imported library module and package edge wrong') @@ -305,7 +307,7 @@ def test_call_external_library_submodule(self): repo = 'unit_tests/test_call_external_library_submodule' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.packages), 2, 'wrong number of packages') self.assertEqual(ecore_graph.packages[1].tName, 'torch_geometric_ExternalLibrary', 'import with length>2 has wrong package name') @@ -318,7 +320,7 @@ def test_call_external_library_class(self): repo = 'unit_tests/test_call_external_library_class' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.packages[0].tName, 'torch_ExternalLibrary', 'wrong package name for import') self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of imported packages') @@ -332,7 +334,7 @@ def test_call_external_library_class(self): self.assertEqual(ecore_graph.modules[1].contains[0].accessedBy[0].eClass.name, NodeTypes.CALL.value, 'call is missing') self.assertEqual(ecore_graph.modules[1].contains[1].eClass.name, NodeTypes.CLASS.value, 'class is missing') self.assertEqual(ecore_graph.modules[1].contains[1].tName, 'Dataset', 'class has wrong name') - self.assertEqual(ecore_graph.modules[1].contains[1].tLib, True, 'flag for imported class from external library not set to true') + self.assertEqual(ecore_graph.modules[1].contains[1].tLib, False, 'flag for imported class from external library not set to False') self.assertEqual(ecore_graph.modules[1].contains[1].defines[0].signature.method.tName, '__len___ExternalLibrary', 'method in class has wrong name') self.assertEqual(ecore_graph.modules[1].contains[1].defines[0].accessedBy[0].eClass.name, NodeTypes.CALL.value, 'call is missing') @@ -341,7 +343,7 @@ def test_call_external_library_class_multiple_methods(self): repo = 'unit_tests/test_call_external_library_class_multiple_methods' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[1].contains[1].defines[1].signature.method.tName, '__getitem___ExternalLibrary', 'second class method has wrong name') self.assertEqual(ecore_graph.modules[1].contains[1].defines[1].accessedBy[0].eClass.name, NodeTypes.CALL.value, 'call is missing') @@ -351,7 +353,7 @@ def test_call_external_library_multiple_methods(self): repo = 'unit_tests/test_call_external_library_multiple_methods' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(ecore_graph.modules[1].contains[1].signature.method.tName, 'max_ExternalLibrary', 'second method in imported module wrong name') self.assertEqual(ecore_graph.modules[1].contains[1].accessedBy[0].eClass.name, NodeTypes.CALL.value, 'call is missing') @@ -361,7 +363,7 @@ def test_call_external_library_multiple_modules_same_package(self): repo = 'unit_tests/test_call_external_library_multiple_modules_same_package' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.modules), 3, 'wrong number of modules') self.assertEqual(ecore_graph.modules[1].namespace.tName, 'utils_ExternalLibrary', 'wrong subpackage name in imported module') @@ -375,7 +377,7 @@ def test_call_external_library_multiple_subpackages(self): repo = 'unit_tests/test_call_external_library_multiple_subpackages' check_path_exists(repo) resource_set = ResourceSet() - graph = ProjectEcoreGraph(resource_set, repo, False) + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) ecore_graph = graph.get_graph() self.assertEqual(len(ecore_graph.packages[0].subpackages), 2, 'wrong number of subpackages') self.assertEqual(ecore_graph.packages[0].subpackages[0].tName, 'utils_ExternalLibrary', 'wrong subpackage name') From 23d79a5da147d33e2a2bb88ebb15b17453b0757d Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Thu, 2 Jan 2025 16:22:34 +0100 Subject: [PATCH 04/12] Recover unit test in test_ATE_Converter --- tests/test_ATE_Converter.py | 69 +++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/tests/test_ATE_Converter.py b/tests/test_ATE_Converter.py index 0044e58..e5a6edd 100644 --- a/tests/test_ATE_Converter.py +++ b/tests/test_ATE_Converter.py @@ -22,36 +22,45 @@ class TestATEConv(unittest.TestCase): - #buggy unit test -> missing file - # def test_package(self): - # repo = 'unit_tests/test_package' - # check_path_exists(repo) - # resource_set = ResourceSet() - # graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) - # ecore_graph = graph.get_graph() - # self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') - # self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') - # self.assertEqual(ecore_graph.packages[0].tName, 'my_package', 'wrong package name') - # self.assertEqual(len(ecore_graph.packages[0].subpackages), 0, 'package should not have subpackage') - # self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') - # self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') - # self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') - - #buggy unit test -> missing file - # def test_subpackage(self): - # repo = 'unit_tests/test_subpackage' - # check_path_exists(repo) - # resource_set = ResourceSet() - # graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) - # ecore_graph = graph.get_graph() - # self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') - # self.assertEqual(ecore_graph.packages[0].tName, 'parent', 'wrong package name') - # self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') - # self.assertEqual(ecore_graph.packages[0].subpackages[0].tName, 'child', 'wrong submodule name') - # self.assertEqual(ecore_graph.packages[0].subpackages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') - # self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') - # self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') - # self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') + + def test_package(self): + """ + Unit test recovered by hand. + in Dir 'test_package' is a Dir named 'my_package' + I do not know why she named it this way :( + """ + repo = 'unit_tests/test_package' + check_path_exists(repo) + resource_set = ResourceSet() + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) + ecore_graph = graph.get_graph() + self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') + self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') + self.assertEqual(ecore_graph.packages[0].tName, 'my_package', 'wrong package name') + self.assertEqual(len(ecore_graph.packages[0].subpackages), 0, 'package should not have subpackage') + self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') + self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') + self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') + + def test_subpackage(self): + """ + Unit test recovered by hand. + in Dir 'test_subpackage' is a Dir named 'parent' is a Dir named 'child' + I do not know why she named it this way :( + """ + repo = 'unit_tests/test_subpackage' + check_path_exists(repo) + resource_set = ResourceSet() + graph = ProjectEcoreGraph(resource_set, repo, False, test_output_dir) + ecore_graph = graph.get_graph() + self.assertEqual(len(ecore_graph.packages), 1, 'wrong number of packages') + self.assertEqual(ecore_graph.packages[0].tName, 'parent', 'wrong package name') + self.assertEqual(ecore_graph.packages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') + self.assertEqual(ecore_graph.packages[0].subpackages[0].tName, 'child', 'wrong submodule name') + self.assertEqual(ecore_graph.packages[0].subpackages[0].eClass.name, NodeTypes.PACKAGE.value, 'package is wrong type') + self.assertEqual(len(ecore_graph.modules), 0, 'wrong number of modules') + self.assertEqual(len(ecore_graph.classes), 0, 'wrong number of classes') + self.assertEqual(len(ecore_graph.methods), 0, 'wrong number of methods') def test_module(self): repo = 'unit_tests/test_module' From 3156695c879def6121e0068d324e268e0dc5d990 Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Fri, 3 Jan 2025 10:59:08 +0100 Subject: [PATCH 05/12] fix: enable unit test in ETM after recovering missing unit tests --- tests/test_ETM_Converter.py | 182 ++++++++++++++++++------------------ 1 file changed, 93 insertions(+), 89 deletions(-) diff --git a/tests/test_ETM_Converter.py b/tests/test_ETM_Converter.py index 33945c0..9f24a02 100644 --- a/tests/test_ETM_Converter.py +++ b/tests/test_ETM_Converter.py @@ -24,65 +24,69 @@ class TestETMConv(unittest.TestCase): #missing file - #def test_package(self): - #repo = 'unit_tests/test_package' - #check_path_exists(repo) - #resource_set = ResourceSet() - #graph = ProjectEcoreGraph(resource_set, repo, False) - #ecore_graph = graph.get_graph() - #matrix = EcoreToMatrixConverter(ecore_graph, False) - #node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() - #edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() - #lib_flags = matrix.get_external_library_flags() - - #self.assertEqual(len(node_features), 1, 'wrong number of nodes') - #self.assertEqual(len(lib_flags), len(node_features), 'wrong number of ext. library flags') - #self.assertEqual(lib_flags[0], 'false', 'library flag for internal object is wrong') - #self.assertEqual(node_features[0], NodeTypes.PACKAGE.value, 'package is wrong node type') - #self.assertEqual(len(edges), 0, 'single package should not have edge') - #self.assertEqual(len(edge_attributes), 0, 'wrong number of edge attributes') - #self.assertEqual(len(enc_node_features), 1, 'wrong number of encoded nodes') - #self.assertEqual(len(enc_node_features[0]), 8, 'error in ohe encoding, total number of node types wrong') + def test_package(self): + repo = 'unit_tests/test_package' + check_path_exists(repo) + resource_set = ResourceSet() + graph = ProjectEcoreGraph(resource_set, repo, False) + ecore_graph = graph.get_graph() + matrix = EcoreToMatrixConverter(ecore_graph, False) + node_features = matrix.get_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() + edges = matrix.get_adjacency_list() + edge_attributes = matrix.get_edge_attributes() + lib_flags = matrix.get_external_library_flags() + + self.assertEqual(len(node_features), 1, 'wrong number of nodes') + self.assertEqual(len(lib_flags), len(node_features), 'wrong number of ext. library flags') + self.assertEqual(lib_flags[0], 'false', 'library flag for internal object is wrong') + self.assertEqual(node_features[0], NodeTypes.PACKAGE.value, 'package is wrong node type') + self.assertEqual(len(edges), 0, 'single package should not have edge') + self.assertEqual(len(edge_attributes), 0, 'wrong number of edge attributes') + self.assertEqual(len(enc_node_features), 1, 'wrong number of encoded nodes') + self.assertEqual(len(enc_node_features[0]), 8, 'error in ohe encoding, total number of node types wrong') #test ohe encoding for node type package - #self.assertEqual(enc_node_features[0][6], 1.0, 'package node not set in encoding') - #self.assertEqual(enc_node_features[0][0], 0.0, 'call node set in encoding') - #self.assertEqual(enc_node_features[0][1], 0.0, 'class node set in encoding') - #self.assertEqual(enc_node_features[0][2], 0.0, 'method node set in encoding') - #self.assertEqual(enc_node_features[0][3], 0.0, 'method definition node set in encoding') - #self.assertEqual(enc_node_features[0][4], 0.0, 'method signature node set in encoding') - #self.assertEqual(enc_node_features[0][5], 0.0, 'module node set in encoding') - #self.assertEqual(enc_node_features[0][7], 0.0, 'parameter node set in encoding') - - # missing file - #def test_subpackage(self): - #repo = 'unit_tests/test_subpackage' - #check_path_exists(repo) - #resource_set = ResourceSet() - #graph = ProjectEcoreGraph(resource_set, repo, False) - #ecore_graph = graph.get_graph() - #matrix = EcoreToMatrixConverter(ecore_graph, False) - #node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() - #edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() - #lib_flags = matrix.get_external_library_flags() - - #self.assertEqual(len(node_features), 2, 'wrong number of nodes') - #self.assertEqual(len(lib_flags), len(node_features), 'wrong number of ext. library flags') - #self.assertEqual(node_features[0], NodeTypes.PACKAGE.value, 'package is wrong node type') - #self.assertEqual(node_features[1], NodeTypes.PACKAGE.value, 'package is wrong node type') - #self.assertEqual(lib_flags[0], 'false', 'library flag for internal object is wrong') - #self.assertEqual(lib_flags[1], 'false', 'library flag for internal object is wrong') - #self.assertEqual(len(edges), 2, 'package should have edge to subpackage and vice versa') - #self.assertEqual(len(enc_node_features), 2, 'wrong number of encoded nodes') - #self.assertEqual(edges[0], [0, 1], 'edge between package and subpackage wrong') - #self.assertEqual(edges[1], [1, 0], 'edge between subpackage and parent package wrong') - #self.assertEqual(len(edge_attributes), 2, 'wrong number of edge attributes') - #self.assertEqual(edge_attributes[0], EdgeTypes.SUBPACKAGE.value, 'subpackage attribute is missing/wrong') - #self.assertEqual(edge_attributes[1], EdgeTypes.PARENT.value, 'parent package attribute is missing/wrong') + self.assertEqual(enc_node_features[0][6], 1.0, 'package node not set in encoding') + self.assertEqual(enc_node_features[0][0], 0.0, 'call node set in encoding') + self.assertEqual(enc_node_features[0][1], 0.0, 'class node set in encoding') + self.assertEqual(enc_node_features[0][2], 0.0, 'method node set in encoding') + self.assertEqual(enc_node_features[0][3], 0.0, 'method definition node set in encoding') + self.assertEqual(enc_node_features[0][4], 0.0, 'method signature node set in encoding') + self.assertEqual(enc_node_features[0][5], 0.0, 'module node set in encoding') + self.assertEqual(enc_node_features[0][7], 0.0, 'parameter node set in encoding') + + def test_subpackage(self): + """ + Unit test recovered by hand. + in Dir 'test_subpackage' is a Dir named 'parent' is a Dir named 'child' + I do not know why she named it this way :( + """ + repo = 'unit_tests/test_subpackage' + check_path_exists(repo) + resource_set = ResourceSet() + graph = ProjectEcoreGraph(resource_set, repo, False) + ecore_graph = graph.get_graph() + matrix = EcoreToMatrixConverter(ecore_graph, False) + node_features = matrix.get_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() + edges = matrix.get_adjacency_list() + edge_attributes = matrix.get_edge_attributes() + lib_flags = matrix.get_external_library_flags() + + self.assertEqual(len(node_features), 2, 'wrong number of nodes') + self.assertEqual(len(lib_flags), len(node_features), 'wrong number of ext. library flags') + self.assertEqual(node_features[0], NodeTypes.PACKAGE.value, 'package is wrong node type') + self.assertEqual(node_features[1], NodeTypes.PACKAGE.value, 'package is wrong node type') + self.assertEqual(lib_flags[0], 'false', 'library flag for internal object is wrong') + self.assertEqual(lib_flags[1], 'false', 'library flag for internal object is wrong') + self.assertEqual(len(edges), 2, 'package should have edge to subpackage and vice versa') + self.assertEqual(len(enc_node_features), 2, 'wrong number of encoded nodes') + self.assertEqual(edges[0], [0, 1], 'edge between package and subpackage wrong') + self.assertEqual(edges[1], [1, 0], 'edge between subpackage and parent package wrong') + self.assertEqual(len(edge_attributes), 2, 'wrong number of edge attributes') + self.assertEqual(edge_attributes[0], EdgeTypes.SUBPACKAGE.value, 'subpackage attribute is missing/wrong') + self.assertEqual(edge_attributes[1], EdgeTypes.PARENT.value, 'parent package attribute is missing/wrong') def test_module(self): repo = 'unit_tests/test_module' @@ -359,7 +363,7 @@ def test_multiple_parameter(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() @@ -387,7 +391,7 @@ def test_module_internal_method_call(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() @@ -483,9 +487,9 @@ def test_internal_method_imports_package(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[2], 'false', 'library flag for internal object is wrong') @@ -509,9 +513,9 @@ def test_internal_method_class_imports_package(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[2], 'false', 'library flag for internal object is wrong') @@ -537,9 +541,9 @@ def test_module_internal_class_call(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[1], 'false', 'library flag for internal object is wrong') @@ -565,9 +569,9 @@ def test_class_internal_method_call(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[1], 'false', 'library flag for internal object is wrong') @@ -593,9 +597,9 @@ def test_internal_method_imports_multiple_packages(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[0], 'false', 'library flag for internal object is wrong') @@ -625,9 +629,9 @@ def test_internal_method_class_imports_multiple_packages(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[0], 'false', 'library flag for internal object is wrong') @@ -659,9 +663,9 @@ def test_call_external_library(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(len(lib_flags), len(node_features), 'wrong number of ext. library flags') @@ -691,9 +695,9 @@ def test_call_external_library_submodule(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(len(lib_flags), len(node_features), 'wrong number of ext. library flags') @@ -738,9 +742,9 @@ def test_call_external_library_class(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(len(lib_flags), len(node_features), 'wrong number of ext. library flags') @@ -772,9 +776,9 @@ def test_call_external_library_class_multiple_methods(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[9], 'true', 'flag for import is wrong') @@ -810,9 +814,9 @@ def test_call_external_library_multiple_methods(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[7], 'true', 'flag for import is wrong') @@ -848,9 +852,9 @@ def test_call_external_library_multiple_modules_same_package(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[1], 'true', 'library flag for imported object is wrong') @@ -895,9 +899,9 @@ def test_call_external_library_multiple_subpackages(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() + edge_attributes = matrix.get_edge_attributes() lib_flags = matrix.get_external_library_flags() self.assertEqual(lib_flags[0], 'true', 'library flag for imported object is wrong') @@ -952,11 +956,11 @@ def test_hashed_names(self): ecore_graph = graph.get_graph() matrix = EcoreToMatrixConverter(ecore_graph, False) node_features = matrix.get_node_matrix() - #enc_node_features = matrix.get_encoded_node_matrix() + enc_node_features = matrix.get_encoded_node_matrix() full_features = matrix.get_node_features() - #edges = matrix.get_adjacency_list() - #edge_attributes = matrix.get_edge_attributes() - #lib_flags = matrix.get_external_library_flags() + edges = matrix.get_adjacency_list() + edge_attributes = matrix.get_edge_attributes() + lib_flags = matrix.get_external_library_flags() self.assertEqual(len(node_features), len(full_features), 'number of nodes in type and type+hash is not equal') for item in full_features: From 54b3e3401a668ed4d88ce64a48a5f74f09f7ffd1 Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Fri, 3 Jan 2025 11:36:46 +0100 Subject: [PATCH 06/12] refactor: change test_output_dir in ATE Converter --- tests/test_ATE_Converter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_ATE_Converter.py b/tests/test_ATE_Converter.py index e5a6edd..375c34b 100644 --- a/tests/test_ATE_Converter.py +++ b/tests/test_ATE_Converter.py @@ -17,7 +17,7 @@ from test_utils import check_path_exists # puts xmi files when -test_output_dir = 'tests/test_results' +test_output_dir = 'test_results' class TestATEConv(unittest.TestCase): From 2d1ecc29228c941fce41c6daac42557a4c8a6d94 Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:12:50 +0100 Subject: [PATCH 07/12] create test --- tests/htmlcov.zip | Bin 0 -> 147216 bytes .../minimal_example_function_overwrite.py | 5 +++ tests/test_ATE_Converter.py | 4 +-- tests/test_minimal_examples.py | 30 ++++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 tests/htmlcov.zip create mode 100644 tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py create mode 100644 tests/test_minimal_examples.py diff --git a/tests/htmlcov.zip b/tests/htmlcov.zip new file mode 100644 index 0000000000000000000000000000000000000000..0a87ecd55d06ab690adf8da19d201ec3626f67e4 GIT binary patch literal 147216 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%0AopS6+mK}-R%>-VMxLBx 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 Da-%w4 literal 0 HcmV?d00001 diff --git a/tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py b/tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py new file mode 100644 index 0000000..a3e9eb8 --- /dev/null +++ b/tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py @@ -0,0 +1,5 @@ +def a (): + return + +def a (): + return \ No newline at end of file diff --git a/tests/test_ATE_Converter.py b/tests/test_ATE_Converter.py index 375c34b..eb165e9 100644 --- a/tests/test_ATE_Converter.py +++ b/tests/test_ATE_Converter.py @@ -17,12 +17,10 @@ from test_utils import check_path_exists # puts xmi files when -test_output_dir = 'test_results' +test_output_dir = 'test_results/unit_tests' class TestATEConv(unittest.TestCase): - - def test_package(self): """ Unit test recovered by hand. diff --git a/tests/test_minimal_examples.py b/tests/test_minimal_examples.py new file mode 100644 index 0000000..33b752d --- /dev/null +++ b/tests/test_minimal_examples.py @@ -0,0 +1,30 @@ +import unittest +import sys +import os + +# getting the name of the directory where this file is +current = os.path.dirname(os.path.realpath(__file__)) + +# getting the parent directory name where the current directory is +parent = os.path.dirname(current) + +# adding the parent directory to the sys.path. +sys.path.append(parent) + +from AstToEcoreConverter import ProjectEcoreGraph +from pyecore.resources import ResourceSet +from test_utils import check_path_exists + +test_output_dir = 'test_results/minimal_examples' + +class TestMinimalExamples(unittest.TestCase): + + def test_function_overwrite(self): + """ + This test tests a Skript with 2 Functions with the same name. + """ + repo = 'minimal_examples/function_overwrite' + check_path_exists(repo) + resource_set = ResourceSet() + graph = ProjectEcoreGraph(resource_set, repo, True, test_output_dir) + ecore_graph = graph.get_graph() From 3329cc3de32d6bf2898963635e6668c03adf41b6 Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:38:41 +0100 Subject: [PATCH 08/12] feat: create a warning when 2 Functions have the same name in same scope --- AstToEcoreConverter.py | 17 +++++++++++++++++ .../minimal_example_function_overwrite.py | 15 ++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/AstToEcoreConverter.py b/AstToEcoreConverter.py index 89ea22b..5c5cf73 100644 --- a/AstToEcoreConverter.py +++ b/AstToEcoreConverter.py @@ -1,6 +1,7 @@ import ast import logging import os +from logging import warning from pyecore.resources import ResourceSet, URI @@ -1190,6 +1191,7 @@ def __init__(self, ecore_graph): self.current_class = None self.current_indentation = 0 self.current_module = None + self.names_in_scope: set = set() def visit_Import(self, node): """ @@ -1259,6 +1261,9 @@ def visit_ClassDef(self, node): Args: node: The AST node representing the class definition. """ + temp_scope = self.names_in_scope # save previous scope in temp for later access. + self.names_in_scope = set() + class_name = node.name self.current_module = self.ecore_graph.get_current_module() class_node = self.ecore_graph.get_class_by_name( @@ -1284,6 +1289,8 @@ def visit_ClassDef(self, node): self.ecore_graph.check_list.append(class_node) self.generic_visit(node) + self.names_in_scope = temp_scope # Restore Scope from node before + def visit_FunctionDef(self, node): """ Visits a function definition in the AST. @@ -1291,6 +1298,13 @@ def visit_FunctionDef(self, node): Args: node: The AST node representing the function definition. """ + # Check if Function already in Scope + if node.name in self.names_in_scope: + warning(f"Def {node.name} already in Scope") + self.names_in_scope.add(node.name) + temp_scope = self.names_in_scope # save previous scope in temp for later access. + self.names_in_scope = set() + self.current_method = None if self.current_class is not None: self.current_method = self.ecore_graph.get_method_def_in_class( @@ -1305,8 +1319,11 @@ def visit_FunctionDef(self, node): self.current_module = module_node module_node.contains.append(self.current_method) self.current_indentation = node.col_offset + self.generic_visit(node) + self.names_in_scope = temp_scope # Restore Scope from node before + def visit_Assign(self, node): """ Visits an assignment statement in the AST. diff --git a/tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py b/tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py index a3e9eb8..37137c5 100644 --- a/tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py +++ b/tests/minimal_examples/function_overwrite/minimal_example_function_overwrite.py @@ -2,4 +2,17 @@ def a (): return def a (): - return \ No newline at end of file + def b(): + return + def b(): + return + return +def d(): + def b(): + return + +class a: + def c(self): + return + def c(self): + return \ No newline at end of file From 16ff6676a87bc3f344a209cb6efa83586fb2236d Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Wed, 8 Jan 2025 20:04:08 +0100 Subject: [PATCH 09/12] feat: create class field extraction --- AstToEcoreConverter.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/AstToEcoreConverter.py b/AstToEcoreConverter.py index 5c5cf73..f97f751 100644 --- a/AstToEcoreConverter.py +++ b/AstToEcoreConverter.py @@ -1192,6 +1192,7 @@ def __init__(self, ecore_graph): self.current_indentation = 0 self.current_module = None self.names_in_scope: set = set() + self.fields_per_class: dict = dict() def visit_Import(self, node): """ @@ -1268,6 +1269,7 @@ def visit_ClassDef(self, node): self.current_module = self.ecore_graph.get_current_module() class_node = self.ecore_graph.get_class_by_name( class_name, module=self.ecore_graph.get_current_module()) + temp_class = self.current_class self.current_class = class_node for base in node.bases: @@ -1289,6 +1291,7 @@ def visit_ClassDef(self, node): self.ecore_graph.check_list.append(class_node) self.generic_visit(node) + self.current_class = temp_class self.names_in_scope = temp_scope # Restore Scope from node before def visit_FunctionDef(self, node): @@ -1304,12 +1307,13 @@ def visit_FunctionDef(self, node): self.names_in_scope.add(node.name) temp_scope = self.names_in_scope # save previous scope in temp for later access. self.names_in_scope = set() - + temp_class, temp_method = self.current_class, self.current_method self.current_method = None if self.current_class is not None: self.current_method = self.ecore_graph.get_method_def_in_class( node.name, self.current_class) if self.current_method is None: + self.current_class = None self.current_method = self.ecore_graph.create_ecore_instance( NodeTypes.METHOD_DEFINITION) @@ -1322,6 +1326,8 @@ def visit_FunctionDef(self, node): self.generic_visit(node) + self.current_class,self.current_method = temp_class, temp_method # Restore current class and method + self.names_in_scope = temp_scope # Restore Scope from node before def visit_Assign(self, node): @@ -1331,6 +1337,17 @@ def visit_Assign(self, node): Args: node: The AST node representing the assignment statement. """ + # Find all field assignments in a class + if self.current_class is not None: + for target in node.targets: + if isinstance(target,ast.Attribute): + if isinstance(target.value,ast.Name): + if target.value.id == 'self': + if self.current_class not in self.fields_per_class: + self.fields_per_class[self.current_class] = set() + self.fields_per_class[self.current_class].add(target.attr) + # Todo: Use class fields in ecore model here + if node.col_offset <= self.current_indentation: self.current_method = None self.current_indentation = node.col_offset From cf3d52c7258a0cdaf9fdac2625794d171b2b9ac4 Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:57:33 +0100 Subject: [PATCH 10/12] refactor(AstToEcore): Rename function create_calls Rename function and uses from create_calls to create_call because each use create a single call --- AstToEcoreConverter.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/AstToEcoreConverter.py b/AstToEcoreConverter.py index f97f751..e450ac6 100644 --- a/AstToEcoreConverter.py +++ b/AstToEcoreConverter.py @@ -154,7 +154,7 @@ def set_imported_libraries_calls(self): call_check = self.get_calls( caller_node, meth) if call_check is False: - self.create_calls( + self.create_call( caller_node, meth) if found_method is False: method_node = self.create_ecore_instance( @@ -162,7 +162,7 @@ def set_imported_libraries_calls(self): self.create_method_signature( method_node, method_name, []) obj.defines.append(method_node) - self.create_calls( + self.create_call( caller_node, method_node) if found_class is False: self.create_imported_class_call( @@ -177,7 +177,7 @@ def set_imported_libraries_calls(self): call_check = self.get_calls( caller_node, meth_def) if call_check is False: - self.create_calls( + self.create_call( caller_node, meth_def) if found_method is False: self.create_imported_method_call( @@ -234,7 +234,7 @@ def set_imported_libraries_calls(self): [module_node, package_name, package_node, package_name]) self.graph.modules.append(module_node) self.graph.packages.append(package_node) - self.create_calls(caller_node, method_node) + self.create_call(caller_node, method_node) if len(split_import) > 2: # create package hierarchy package_node = self.create_ecore_instance( @@ -283,7 +283,7 @@ def set_imported_libraries_calls(self): if class_name is None: module_node.contains.append(method_node) # set call - self.create_calls(caller_node, method_node) + self.create_call(caller_node, method_node) def create_package_hierarchy(self, parent_package, subpackage_names, lib_flag=True): """ @@ -345,7 +345,7 @@ def create_imported_method_call(self, module_node, method_name, caller_node): method_node = self.create_ecore_instance(NodeTypes.METHOD_DEFINITION) self.create_method_signature(method_node, method_name, []) module_node.contains.append(method_node) - self.create_calls(caller_node, method_node) + self.create_call(caller_node, method_node) def create_imported_class_call(self, module_node, class_name, method_name, caller_node): """ @@ -365,7 +365,7 @@ def create_imported_class_call(self, module_node, class_name, method_name, calle method_node = self.create_ecore_instance(NodeTypes.METHOD_DEFINITION) self.create_method_signature(method_node, method_name, []) class_node.defines.append(method_node) - self.create_calls(caller_node, method_node) + self.create_call(caller_node, method_node) def get_imported_library_package(self, package_name): """ @@ -540,7 +540,7 @@ def create_method_call(self, method_node, method_name, caller_node): if method_node.signature.method.tName == method_name: call_check = self.get_calls(caller_node, method_node) if call_check is False: - self.create_calls(caller_node, method_node) + self.create_call(caller_node, method_node) def check_for_missing_nodes(self): """check_list contains all classes with method def that are created during conversion. @@ -1143,7 +1143,7 @@ def get_calls(caller_node, called_node): return True return False - def create_calls(self, caller_node, called_node): + def create_call(self, caller_node, called_node): """ Creates a call between two nodes. From d23e06d736a81dcb281819859333344d642f1bd9 Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:27:05 +0100 Subject: [PATCH 11/12] feat(testing): Create 2 minimal examples - Creating 2 minimal examples for checking function signatures for differences in and outside classes --- ...nimal_example_2_Functions_without_class.py | 5 +++++ .../minimal_example_2_Functions_with_class.py | 5 +++++ tests/test_minimal_examples.py | 20 +++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 tests/minimal_examples/2_Function_without_class/minimal_example_2_Functions_without_class.py create mode 100644 tests/minimal_examples/2_Functions_with_class/minimal_example_2_Functions_with_class.py diff --git a/tests/minimal_examples/2_Function_without_class/minimal_example_2_Functions_without_class.py b/tests/minimal_examples/2_Function_without_class/minimal_example_2_Functions_without_class.py new file mode 100644 index 0000000..2075d73 --- /dev/null +++ b/tests/minimal_examples/2_Function_without_class/minimal_example_2_Functions_without_class.py @@ -0,0 +1,5 @@ +def a(): + return + +def b(): + return \ No newline at end of file diff --git a/tests/minimal_examples/2_Functions_with_class/minimal_example_2_Functions_with_class.py b/tests/minimal_examples/2_Functions_with_class/minimal_example_2_Functions_with_class.py new file mode 100644 index 0000000..d19f9af --- /dev/null +++ b/tests/minimal_examples/2_Functions_with_class/minimal_example_2_Functions_with_class.py @@ -0,0 +1,5 @@ +class A: + def a(self): + return + def b(self): + return \ No newline at end of file diff --git a/tests/test_minimal_examples.py b/tests/test_minimal_examples.py index 33b752d..579a876 100644 --- a/tests/test_minimal_examples.py +++ b/tests/test_minimal_examples.py @@ -28,3 +28,23 @@ def test_function_overwrite(self): resource_set = ResourceSet() graph = ProjectEcoreGraph(resource_set, repo, True, test_output_dir) ecore_graph = graph.get_graph() + + def test_2_functions_without_class(self): + """ + This test tests a Skript with 2 Functions with the same name. + """ + repo = 'minimal_examples/2_Function_without_class' + check_path_exists(repo) + resource_set = ResourceSet() + graph = ProjectEcoreGraph(resource_set, repo, True, test_output_dir) + ecore_graph = graph.get_graph() + + def test_2_functions_with_class(self): + """ + This test tests a Skript with 2 Functions with the same name. + """ + repo = 'minimal_examples/2_Functions_with_class' + check_path_exists(repo) + resource_set = ResourceSet() + graph = ProjectEcoreGraph(resource_set, repo, True, test_output_dir) + ecore_graph = graph.get_graph() From a4243db5bb884a719c02c5f007dbbf4a3d5d650e Mon Sep 17 00:00:00 2001 From: TimTheHero <117226730+TimTheHero@users.noreply.github.com> Date: Mon, 20 Jan 2025 11:14:26 +0100 Subject: [PATCH 12/12] tests: addes tests for pyinput as a general test -Added test to use pyinputplus as an example repo --- tests/test_minimal_examples.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/test_minimal_examples.py b/tests/test_minimal_examples.py index 579a876..f5821e7 100644 --- a/tests/test_minimal_examples.py +++ b/tests/test_minimal_examples.py @@ -48,3 +48,15 @@ def test_2_functions_with_class(self): resource_set = ResourceSet() graph = ProjectEcoreGraph(resource_set, repo, True, test_output_dir) ecore_graph = graph.get_graph() + + #def test_pyinputplus(self): + """ + This test for pyinputplus as a test + Create a dir in minimal_examples named "test_pyinputplus" + use cd tests; cd minimal_examples;cd test_pyinputplus; git clone https://github.com/asweigart/pyinputplus.git + """ + #repo = 'minimal_examples/test_pyinputplus/pyinputplus' + #check_path_exists(repo) + #resource_set = ResourceSet() + #graph = ProjectEcoreGraph(resource_set, repo, True, test_output_dir) + #ecore_graph = graph.get_graph()