From 6c933b1457445367c4a854bf546b9003944fcd90 Mon Sep 17 00:00:00 2001 From: CJ Williams Date: Mon, 23 Jan 2023 13:06:27 +0000 Subject: [PATCH 01/18] Fix missing controflow format argument --- .gitignore | 1 + inspect4py/cli.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 150e5c1..a66fc2a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ build/* dist/* env/* .vscode/ +.idea/ .ipynb_checkpoints/ config.json __pycache__/ diff --git a/inspect4py/cli.py b/inspect4py/cli.py index 166b275..65a93d9 100644 --- a/inspect4py/cli.py +++ b/inspect4py/cli.py @@ -51,7 +51,7 @@ def __init__(self, path, out_control_flow_path, out_json_path, control_flow, abs self.bodyInfo = self.inspect_body() if control_flow: self.out_control_flow_path = out_control_flow_path - self.controlFlowInfo = self.inspect_controlflow() + self.controlFlowInfo = self.inspect_controlflow("png") else: self.controlFlowInfo = {} self.fileJson = self.file_json() @@ -1290,7 +1290,7 @@ def main(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requir else: dir_info[out_dir].append(code_info.fileJson[0]) except: - print("Error when processing " + f + ": ", sys.exc_info()[0]) + print("Error when processing " + f + ": ", sys.exc_info()) continue # Generate the call list of the Dir From 81de96d1eeaa7240dd1b6011b44811d404ea6f40 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:18:48 +0100 Subject: [PATCH 02/18] Add files via upload --- inspect4py/cli.py | 47 +++- .../models/json_files/__init__.json | 1 + inspect4py/output_dir/directory_info.json | 1 + inspect4py/parse_setup_files.py | 4 +- inspect4py/resources/my-languages.so | Bin 0 -> 408064 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 247 bytes .../__pycache__/builder.cpython-39.pyc | Bin 0 -> 12726 bytes .../staticfg/__pycache__/model.cpython-39.pyc | Bin 0 -> 7447 bytes inspect4py/utils.py | 257 +++++++++++++++++- 9 files changed, 300 insertions(+), 10 deletions(-) create mode 100644 inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json create mode 100644 inspect4py/output_dir/directory_info.json create mode 100644 inspect4py/resources/my-languages.so create mode 100644 inspect4py/staticfg/__pycache__/__init__.cpython-39.pyc create mode 100644 inspect4py/staticfg/__pycache__/builder.cpython-39.pyc create mode 100644 inspect4py/staticfg/__pycache__/model.cpython-39.pyc diff --git a/inspect4py/cli.py b/inspect4py/cli.py index 166b275..6ee07bd 100644 --- a/inspect4py/cli.py +++ b/inspect4py/cli.py @@ -1,13 +1,16 @@ +import ast import json import tokenize import types import builtins import click from docstring_parser import parse as doc_parse +from tree_sitter import Language, Parser from inspect4py import __version__ from inspect4py.staticfg import builder from inspect4py.utils import * +# from utils import * """ Code Inspector @@ -26,7 +29,7 @@ class CodeInspection: - def __init__(self, path, out_control_flow_path, out_json_path, control_flow, abstract_syntax_tree, source_code): + def __init__(self, path, out_control_flow_path, out_json_path, control_flow, abstract_syntax_tree, source_code, data_flow, parser): """ init method initializes the Code_Inspection object :param self self: represent the instance of the class :param str path: the file to inspect @@ -41,6 +44,8 @@ def __init__(self, path, out_control_flow_path, out_json_path, control_flow, abs self.out_json_path = out_json_path self.abstract_syntax_tree = abstract_syntax_tree self.source_code = source_code + self.data_flow = data_flow + self.parser = parser self.tree = self.parser_file() if self.tree != "AST_ERROR": self.nodes = self.walk() @@ -58,6 +63,7 @@ def __init__(self, path, out_control_flow_path, out_json_path, control_flow, abs else: self.fileJson = {} + def find_classDef(self): classDef_nodes = [node for node in self.nodes if isinstance(node, ast.ClassDef)] class_init=[] @@ -466,6 +472,13 @@ def file_json(self): json.dump(prune_json(file_dict), outfile) return [file_dict, json_file] + # def get_parser_data_flow(self): + # parser = Parser() + # LANGUAGE = Language(self.symbol_table, "python") + # parser.set_language(LANGUAGE) + # parser = [parser, DFG_python] + # return parser + def _f_definitions(self, functions_definitions): """_f_definitions extracts the name, args, docstring returns, raises of a list of functions or a methods. @@ -477,11 +490,15 @@ def _f_definitions(self, functions_definitions): :param list functions_definitions: represent a list with all functions or methods nodes :return dictionary: a dictionary with the all the information at function/method level """ - + # print(functions_definitions) funcs_info = {} for f in functions_definitions: + # for node in ast.walk(f): + # print(node.name) + funcs_info[f.name] = {} ds_f = ast.get_docstring(f) + # print(ds_f) try: docstring = doc_parse(ds_f) funcs_info[f.name]["doc"] = {} @@ -577,7 +594,10 @@ def _f_definitions(self, functions_definitions): funcs_info[f.name]["ast"] = ast_to_json(f) if self.source_code: funcs_info[f.name]["source_code"] = ast_to_source_code(f) - + if self.data_flow: + code_tokens, dfg = extract_dataflow(funcs_info[f.name]["source_code"], self.parser, "python") + funcs_info[f.name]["data_flow"] = dfg + funcs_info[f.name]["code_tokens"] = code_tokens return funcs_info def _skip_dynamic_calls(self, funcs_info, classes_info, check_name, name, var_name): @@ -1204,6 +1224,7 @@ def create_output_dirs(output_dir, control_flow): @click.option('-i', '--input_path', type=str, required=True, help="input path of the file or directory to inspect.") @click.option('-o', '--output_dir', type=str, default="output_dir", help="output directory path to store results. If the directory does not exist, the tool will create it.") +@click.option('-st','--symbol_table', type=str, default="my_language.so", help="symbol table for the target function") @click.option('-ignore_dir', '--ignore_dir_pattern', multiple=True, default=[".", "__pycache__"], help="ignore directories starting with a certain pattern. This parameter can be provided multiple times " "to ignore multiple directory patterns.") @@ -1231,16 +1252,28 @@ def create_output_dirs(output_dir, control_flow): help="extract all readme files in the target repository.") @click.option('-md', '--metadata', type=bool, is_flag=True, help="extract metadata of the target repository using Github API. (requires repository to have the .git folder)") +@click.option('-df', '--data_flow', type=bool, is_flag=True, + help="extract data flow graph of every function in the target repository") + def main(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, html_output, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, - metadata): + metadata, data_flow, symbol_table): + if data_flow: + LANGUAGE = Language(symbol_table, "python") + parser = Parser() + parser.set_language(LANGUAGE) + parser = [parser, DFG_python] + else: + parser = [] + + # print(parsers) if (not os.path.isfile(input_path)) and (not os.path.isdir(input_path)): print('The file or directory specified does not exist') sys.exit() if os.path.isfile(input_path): cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) # Generate the call list of a file call_list_data = call_list_file(code_info) @@ -1279,11 +1312,13 @@ def main(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requir for f in files: if ".py" in f and not f.endswith(".pyc"): try: + path = os.path.join(subdir, f) relative_path = Path(subdir).relative_to(Path(input_path).parent) out_dir = str(Path(output_dir) / relative_path) cf_dir, json_dir = create_output_dirs(out_dir, control_flow) - code_info = CodeInspection(path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + # print(parsers) if code_info.fileJson: if out_dir not in dir_info: dir_info[out_dir] = [code_info.fileJson[0]] diff --git a/inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json b/inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json new file mode 100644 index 0000000..81fe488 --- /dev/null +++ b/inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json @@ -0,0 +1 @@ +{"file": {"path": "D:\\inspect4py-main\\test\\Autumn945_MGNN-SPred\\MGNN-SPred-master\\models\\__init__.py", "fileNameBase": "__init__", "extension": "py"}, "dependencies": [{"from_module": "base", "import": "Base", "type": "internal", "type_element": "class"}, {"from_module": "base", "import": "GNN", "type": "internal", "type_element": "class"}], "is_test": false} \ No newline at end of file diff --git a/inspect4py/output_dir/directory_info.json b/inspect4py/output_dir/directory_info.json new file mode 100644 index 0000000..a934e9c --- /dev/null +++ b/inspect4py/output_dir/directory_info.json @@ -0,0 +1 @@ +{"output_dir\\Autumn945_MGNN-SPred\\MGNN-SPred-master\\models": [{"file": {"path": "D:\\inspect4py-main\\test\\Autumn945_MGNN-SPred\\MGNN-SPred-master\\models\\__init__.py", "fileNameBase": "__init__", "extension": "py"}, "dependencies": [{"from_module": "base", "import": "Base", "type": "internal", "type_element": "class"}, {"from_module": "base", "import": "GNN", "type": "internal", "type_element": "class"}], "is_test": false}]} \ No newline at end of file diff --git a/inspect4py/parse_setup_files.py b/inspect4py/parse_setup_files.py index 593c99e..126130c 100644 --- a/inspect4py/parse_setup_files.py +++ b/inspect4py/parse_setup_files.py @@ -56,7 +56,9 @@ def parse_setup_py(parent_dir): if single_line: elem = setup_content[console_index] cs = elem.split("=") - cs_string = cs[0].strip().replace('\'', '').split('["')[1] + # print(cs) + # print(cs[1].strip()) + cs_string = cs[1].strip().replace('\'', '').split('["')[1] cs_list.append(normalize(cs_string)) setup_info["installation"] = "pip install " + cs_string setup_info["run"].append(cs_string) diff --git a/inspect4py/resources/my-languages.so b/inspect4py/resources/my-languages.so new file mode 100644 index 0000000000000000000000000000000000000000..921ee0bf7e20ede73a280a92f6ef33a8cb1aabae GIT binary patch literal 408064 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¬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 literal 0 HcmV?d00001 diff --git a/inspect4py/staticfg/__pycache__/builder.cpython-39.pyc b/inspect4py/staticfg/__pycache__/builder.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d912845c414fcaf90cdafc77c6459c6a0473576b GIT binary patch literal 12726 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 literal 0 HcmV?d00001 diff --git a/inspect4py/staticfg/__pycache__/model.cpython-39.pyc b/inspect4py/staticfg/__pycache__/model.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e464c6992bdc54e5a56fd4977419479541d0e953 GIT binary patch literal 7447 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 dict: return github_metadata - def find_index_init(depInfo, calls, class_init): index_remove=[] for dep in depInfo: @@ -793,9 +792,261 @@ def update_list_calls(info, index_remove): if i in index_remove: continue updated_calls.append(info["calls"][i]) - ### These lines are for removing duplicate calls + ### These lines are for removing duplicate calls res = [] for i in updated_calls : if i not in res: res.append(i) return res + +def tree_to_variable_index(root_node, index_to_code): + if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment': + index = (root_node.start_point, root_node.end_point) + _, code = index_to_code[index] + if root_node.type != code: + return [(root_node.start_point, root_node.end_point)] + else: + return [] + else: + code_tokens = [] + for child in root_node.children: + code_tokens += tree_to_variable_index(child, index_to_code) + return code_tokens + +def DFG_python(root_node, index_to_code, states): + assignment = ['assignment', 'augmented_assignment', 'for_in_clause'] + if_statement = ['if_statement'] + for_statement = ['for_statement'] + while_statement = ['while_statement'] + do_first_statement = ['for_in_clause'] + def_statement = ['default_parameter'] + states = states.copy() + if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment': + idx, code = index_to_code[(root_node.start_point, root_node.end_point)] + if root_node.type == code: + return [], states + elif code in states: + return [(code, idx, 'comesFrom', [code], states[code].copy())], states + else: + if root_node.type == 'identifier': + states[code] = [idx] + return [(code, idx, 'comesFrom', [], [])], states + elif root_node.type in def_statement: + name = root_node.child_by_field_name('name') + value = root_node.child_by_field_name('value') + DFG = [] + if value is None: + indexs = tree_to_variable_index(name, index_to_code) + for index in indexs: + idx, code = index_to_code[index] + DFG.append((code, idx, 'comesFrom', [], [])) + states[code] = [idx] + return sorted(DFG, key=lambda x: x[1]), states + else: + name_indexs = tree_to_variable_index(name, index_to_code) + value_indexs = tree_to_variable_index(value, index_to_code) + temp, states = DFG_python(value, index_to_code, states) + DFG += temp + for index1 in name_indexs: + idx1, code1 = index_to_code[index1] + for index2 in value_indexs: + idx2, code2 = index_to_code[index2] + DFG.append((code1, idx1, 'comesFrom', [code2], [idx2])) + states[code1] = [idx1] + return sorted(DFG, key=lambda x: x[1]), states + elif root_node.type in assignment: + if root_node.type == 'for_in_clause': + right_nodes = [root_node.children[-1]] + left_nodes = [root_node.child_by_field_name('left')] + else: + if root_node.child_by_field_name('right') is None: + return [], states + left_nodes = [x for x in root_node.child_by_field_name('left').children if x.type != ','] + right_nodes = [x for x in root_node.child_by_field_name('right').children if x.type != ','] + if len(right_nodes) != len(left_nodes): + left_nodes = [root_node.child_by_field_name('left')] + right_nodes = [root_node.child_by_field_name('right')] + if len(left_nodes) == 0: + left_nodes = [root_node.child_by_field_name('left')] + if len(right_nodes) == 0: + right_nodes = [root_node.child_by_field_name('right')] + DFG = [] + for node in right_nodes: + temp, states = DFG_python(node, index_to_code, states) + DFG += temp + + for left_node, right_node in zip(left_nodes, right_nodes): + left_tokens_index = tree_to_variable_index(left_node, index_to_code) + right_tokens_index = tree_to_variable_index(right_node, index_to_code) + temp = [] + for token1_index in left_tokens_index: + idx1, code1 = index_to_code[token1_index] + temp.append((code1, idx1, 'computedFrom', [index_to_code[x][1] for x in right_tokens_index], + [index_to_code[x][0] for x in right_tokens_index])) + states[code1] = [idx1] + DFG += temp + return sorted(DFG, key=lambda x: x[1]), states + elif root_node.type in if_statement: + DFG = [] + current_states = states.copy() + others_states = [] + tag = False + if 'else' in root_node.type: + tag = True + for child in root_node.children: + if 'else' in child.type: + tag = True + if child.type not in ['elif_clause', 'else_clause']: + temp, current_states = DFG_python(child, index_to_code, current_states) + DFG += temp + else: + temp, new_states = DFG_python(child, index_to_code, states) + DFG += temp + others_states.append(new_states) + others_states.append(current_states) + if tag is False: + others_states.append(states) + new_states = {} + for dic in others_states: + for key in dic: + if key not in new_states: + new_states[key] = dic[key].copy() + else: + new_states[key] += dic[key] + for key in new_states: + new_states[key] = sorted(list(set(new_states[key]))) + return sorted(DFG, key=lambda x: x[1]), new_states + elif root_node.type in for_statement: + DFG = [] + for i in range(2): + right_nodes = [x for x in root_node.child_by_field_name('right').children if x.type != ','] + left_nodes = [x for x in root_node.child_by_field_name('left').children if x.type != ','] + if len(right_nodes) != len(left_nodes): + left_nodes = [root_node.child_by_field_name('left')] + right_nodes = [root_node.child_by_field_name('right')] + if len(left_nodes) == 0: + left_nodes = [root_node.child_by_field_name('left')] + if len(right_nodes) == 0: + right_nodes = [root_node.child_by_field_name('right')] + for node in right_nodes: + temp, states = DFG_python(node, index_to_code, states) + DFG += temp + for left_node, right_node in zip(left_nodes, right_nodes): + left_tokens_index = tree_to_variable_index(left_node, index_to_code) + right_tokens_index = tree_to_variable_index(right_node, index_to_code) + temp = [] + for token1_index in left_tokens_index: + idx1, code1 = index_to_code[token1_index] + temp.append((code1, idx1, 'computedFrom', [index_to_code[x][1] for x in right_tokens_index], + [index_to_code[x][0] for x in right_tokens_index])) + states[code1] = [idx1] + DFG += temp + if root_node.children[-1].type == "block": + temp, states = DFG_python(root_node.children[-1], index_to_code, states) + DFG += temp + dic = {} + for x in DFG: + if (x[0], x[1], x[2]) not in dic: + dic[(x[0], x[1], x[2])] = [x[3], x[4]] + else: + dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3])) + dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4]))) + DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])] + return sorted(DFG, key=lambda x: x[1]), states + elif root_node.type in while_statement: + DFG = [] + for i in range(2): + for child in root_node.children: + temp, states = DFG_python(child, index_to_code, states) + DFG += temp + dic = {} + for x in DFG: + if (x[0], x[1], x[2]) not in dic: + dic[(x[0], x[1], x[2])] = [x[3], x[4]] + else: + dic[(x[0], x[1], x[2])][0] = list(set(dic[(x[0], x[1], x[2])][0] + x[3])) + dic[(x[0], x[1], x[2])][1] = sorted(list(set(dic[(x[0], x[1], x[2])][1] + x[4]))) + DFG = [(x[0], x[1], x[2], y[0], y[1]) for x, y in sorted(dic.items(), key=lambda t: t[0][1])] + return sorted(DFG, key=lambda x: x[1]), states + else: + DFG = [] + for child in root_node.children: + if child.type in do_first_statement: + temp, states = DFG_python(child, index_to_code, states) + DFG += temp + for child in root_node.children: + if child.type not in do_first_statement: + temp, states = DFG_python(child, index_to_code, states) + DFG += temp + + return sorted(DFG,key=lambda x:x[1]),states + +def tree_to_variable_index(root_node, index_to_code): + if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment': + index = (root_node.start_point, root_node.end_point) + _, code = index_to_code[index] + if root_node.type != code: + return [(root_node.start_point, root_node.end_point)] + else: + return [] + else: + code_tokens = [] + for child in root_node.children: + code_tokens += tree_to_variable_index(child, index_to_code) + return code_tokens + + +def index_to_code_token(index, code): + start_point = index[0] + end_point = index[1] + if start_point[0] == end_point[0]: + s = code[start_point[0]][start_point[1]:end_point[1]] + else: + s = "" + s += code[start_point[0]][start_point[1]:] + for i in range(start_point[0] + 1, end_point[0]): + s += code[i] + s += code[end_point[0]][:end_point[1]] + return s + +def tree_to_token_index(root_node): + if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment': + return [(root_node.start_point, root_node.end_point)] + else: + code_tokens = [] + for child in root_node.children: + code_tokens += tree_to_token_index(child) + return code_tokens + +def extract_dataflow(code, parser,lang): + #obtain dataflow + if lang=="php": + code="" + try: + tree = parser[0].parse(bytes(code,'utf8')) + root_node = tree.root_node + tokens_index=tree_to_token_index(root_node) + code=code.split('\n') + code_tokens=[index_to_code_token(x,code) for x in tokens_index] + index_to_code={} + for idx,(index,code) in enumerate(zip(tokens_index,code_tokens)): + index_to_code[index]=(idx,code) + try: + DFG,_=parser[1](root_node,index_to_code,{}) + except: + DFG=[] + DFG=sorted(DFG,key=lambda x:x[1]) + indexs=set() + for d in DFG: + if len(d[-1])!=0: + indexs.add(d[1]) + for x in d[-1]: + indexs.add(x) + new_DFG=[] + for d in DFG: + if d[1] in indexs: + new_DFG.append(d) + dfg=new_DFG + except: + dfg=[] + return code_tokens, dfg \ No newline at end of file From 67f475758ec34758fbdc7b2541a3fc21fe7baaf0 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:19:37 +0100 Subject: [PATCH 03/18] Add files via upload --- test/test_files/test_data_flow.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test/test_files/test_data_flow.py diff --git a/test/test_files/test_data_flow.py b/test/test_files/test_data_flow.py new file mode 100644 index 0000000..8924a86 --- /dev/null +++ b/test/test_files/test_data_flow.py @@ -0,0 +1,8 @@ +def max(a, b): + x = 0 + if a > b: + x = a + else: + x = b + return x + From 9e4e5ce9f4e9bdabf31756d86379359c861edda6 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:19:52 +0100 Subject: [PATCH 04/18] Add files via upload --- test/test_inspect4py.py | 252 +++++++++++++++++++++++----------------- 1 file changed, 145 insertions(+), 107 deletions(-) diff --git a/test/test_inspect4py.py b/test/test_inspect4py.py index ce2ae50..5c1283f 100644 --- a/test/test_inspect4py.py +++ b/test/test_inspect4py.py @@ -15,8 +15,10 @@ def test_call_list_super(self): control_flow = False abstract_syntax_tree = False source_code = False + data_flow = False + parser = [] cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data["classes"]['Rectangle'] == dictionary['Rectangle']) @@ -35,8 +37,10 @@ def test_call_list_super_test_5(self): control_flow = False abstract_syntax_tree = False source_code = False + data_flow = False + parser = [] cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data['body'] == dictionary['body']) @@ -48,11 +52,12 @@ def test_call_list_nested(self): input_path = "./test_files/test_inheritance/nested_call.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -68,11 +73,13 @@ def test_call_list_super_nested(self): input_path = "./test_files/test_inheritance/super_nested_call.py" output_dir = "./output_dir" control_flow = False + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -85,11 +92,13 @@ def test_call_list_import(self): input_path = "./test_files/test_inheritance/test_import.py" output_dir = "./output_dir" control_flow = False + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -100,11 +109,12 @@ def test_call_list_external_module(self): input_path = "./test_files/test_random.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data['body'] == dictionary['body']) @@ -116,11 +126,12 @@ def test_call_list_argument_call(self): input_path = "./test_files/test_dynamic/argument_call.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data['body'] == dictionary['body']) @@ -131,11 +142,12 @@ def test_call_list_dynamic_body(self): input_path = "./test_files/test_dynamic/test_dynamic.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -146,11 +158,12 @@ def test_call_list_dynamic_func(self): input_path = "./test_files/test_dynamic/test_dynamic_func.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -162,11 +175,12 @@ def test_call_list_dynamic_body_import(self): input_path = "./test_files/test_dynamic/test_dynamic_import.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -178,11 +192,12 @@ def test_call_list_dynamic_body_from_import(self): input_path = "./test_files/test_dynamic/test_dynamic_from_import.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -194,11 +209,12 @@ def test_call_list_dynamic_import_alias(self): input_path = "./test_files/test_dynamic/test_dynamic_import_alias.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -210,11 +226,12 @@ def test_call_list_dynamic_import_method(self): input_path = "./test_files/test_dynamic/test_dynamic_method.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -228,11 +245,12 @@ def test_call_list_dynamic_import_method_variable(self): input_path = "./test_files/test_dynamic/test_dynamic_method_variable.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -244,19 +262,21 @@ def test_call_list_dynamic_class_import(self): input_path = "./test_files/test_dynamic/test_dynamic_class_import.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) def test_service(self): - input_path = "./test_files/Chowlk" + input_path = "D:\\inspect4py-main\\test\\test_files\\Chowlk" output_dir = "./output_dir" - + data_flow = False + symbol_table = "" ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] requirements = False @@ -271,14 +291,14 @@ def test_service(self): metadata = False dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table) current_type = dir_info['software_type'] shutil.rmtree(output_dir) assert current_type[0]["type"] == "service" def test_package(self): - input_path = "./test_files/somef" - output_dir = "./output_dir" + input_path = "D:\\inspect4py-main\\test\\test_files\\somef" + output_dir = "D:\\inspect4py-main\\test\\output_dir" ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] @@ -292,9 +312,11 @@ def test_package(self): license_detection = False readme = False metadata = False + data_flow = False + symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table) current_type = dir_info['software_type'] shutil.rmtree(output_dir) assert current_type[0]["type"] == "package" @@ -315,9 +337,11 @@ def test_library(self): license_detection = False readme = False metadata = False + data_flow = False + symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table) current_type = dir_info['software_type'] shutil.rmtree(output_dir) assert current_type[0]["type"] == "library" @@ -339,9 +363,11 @@ def test_multiple_mains(self): license_detection = False readme = False metadata = False + data_flow = False + symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table) imports = dir_info['software_invocation'] shutil.rmtree(output_dir) for i in imports: @@ -353,7 +379,7 @@ def test_multiple_mains(self): def test_script(self): - input_path = "./test_files/BoostingMonocularDepth" + input_path = "D:\\inspect4py-main\\test\\test_files\\BoostingMonocularDepth" output_dir = "./output_dir" ignore_dir_pattern = [".", "__pycache__"] @@ -368,9 +394,11 @@ def test_script(self): license_detection = False readme = False metadata = False + data_flow = False + symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table) current_type = dir_info['software_type'] shutil.rmtree(output_dir) assert current_type[0]["type"] == "script" @@ -402,8 +430,10 @@ def test_ast_function(self): abstract_syntax_tree = True source_code = False + data_flow = False + parser = [] cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) shutil.rmtree(output_dir) expected_ast = [ @@ -426,15 +456,45 @@ def test_ast_function(self): actual_ast = code_info.fileJson[0]["functions"]["foo"]["ast"] assert expected_ast == actual_ast + def test_data_flow(self): + input_path = "D:\\inspect4py-main\\test\\test_files\\test_data_flow.py" + output_dir = "./output_dir" + control_flow = False + abstract_syntax_tree = False + source_code = True + data_flow=True + LANGUAGE = Language("D:\\inspect4py-main\\my-languages.so", "python") + parser = Parser() + parser.set_language(LANGUAGE) + parser = [parser, DFG_python] + cf_dir, json_dir = create_output_dirs(output_dir, control_flow) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + expected_dfg = [('a', 3, 'comesFrom', [], []), + ('b', 5, 'comesFrom', [], []), + ('x', 8, 'computedFrom', ['0'], [10]), + ('0', 10, 'comesFrom', [], []), + ('a', 12, 'comesFrom', ['a'], [3]), + ('b', 14, 'comesFrom', ['b'], [5]), + ('x', 16, 'computedFrom', ['a'], [18]), + ('a', 18, 'comesFrom', ['a'], [3]), + ('x', 21, 'computedFrom', ['b'], [23]), + ('b', 23, 'comesFrom', ['b'], [5]), + ('x', 25, 'comesFrom', ['x'], [16, 21])] + actual_dfg = code_info.fileJson[0]["functions"]["max"]["data_flow"] + assert actual_dfg == expected_dfg + + + def test_ast_method(self): input_path = "./test_files/test_basic/test_basic_method.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = True source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) shutil.rmtree(output_dir) expected_ast = [ @@ -467,11 +527,12 @@ def test_ast_body(self): input_path = "./test_files/test_basic/test_basic_body.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = True source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) shutil.rmtree(output_dir) expected_ast = [ @@ -490,14 +551,15 @@ def test_ast_body(self): assert expected_ast == actual_ast def test_source_code_function(self): - input_path = "./test_files/test_basic/test_basic_function.py" + input_path = "D:\\inspect4py-main\\test\\test_files\\test_basic\\test_basic_function.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = True cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) shutil.rmtree(output_dir) expected_code = "def foo(arg1, arg2):\n print('Hello %s', arg1)\n return arg2" # Single double quote sensitive @@ -506,14 +568,15 @@ def test_source_code_function(self): def test_source_code_method(self): - input_path = "./test_files/test_basic/test_basic_method.py" + input_path = "D:\\inspect4py-main\\test\\test_files\\test_basic\\test_basic_method.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = True cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) shutil.rmtree(output_dir) expected_code = "def __init__(self, arg):\n self.arg = arg\n print('Hello %s' % self.arg)" @@ -521,14 +584,15 @@ def test_source_code_method(self): assert expected_code == actual_code def test_source_code_body(self): - input_path = "./test_files/test_basic/test_basic_body.py" + input_path = "D:\\inspect4py-main\\test\\test_files\\test_basic\\test_basic_body.py" output_dir = "./output_dir" control_flow = False - + data_flow = False + parser = [] abstract_syntax_tree = False source_code = True cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) shutil.rmtree(output_dir) expected_code = ["print('Hello world')", "print(var)"] @@ -537,8 +601,8 @@ def test_source_code_body(self): def test_license_detection(self): - input_paths = ["./test_files/Chowlk", "./test_files/pylops", "./test_files/somef"] - output_dir = "./output_dir" + input_paths = ["D:\\inspect4py-main\\test\\test_files\Chowlk", "D:\\inspect4py-main\\test\\test_files\\pylops", "D:\\inspect4py-main\\test\\test_files\\somef"] + output_dir = "D:\\inspect4py-main\\test\\output_dir" fig = False ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] @@ -552,7 +616,8 @@ def test_license_detection(self): license_detection = True readme = False metadata = False - + data_flow = False + symbol_table = "" expected_liceses = ['Apache-2.0', 'LGPL-3.0', 'MIT'] first_rank_licenses = [] for input_path in input_paths: @@ -560,7 +625,7 @@ def test_license_detection(self): ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table) first_rank_licenses.append(next(iter(dir_info["license"]["detected_type"][0]))) shutil.rmtree(output_dir) @@ -568,8 +633,8 @@ def test_license_detection(self): def test_license_text_extraction(self): license_text = "A random license." - input_path = "./test_files/test_license_extraction" - output_dir = "./output_dir" + input_path = "D:\\inspect4py-main\\test\\test_files\\test_license_extraction" + output_dir = "D:\\inspect4py-main\\test\\output_dir" fig = False ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] @@ -583,19 +648,20 @@ def test_license_text_extraction(self): license_detection = True readme = False metadata = False - + data_flow = False + symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table=symbol_table) assert dir_info["license"]["extracted_text"] == license_text def test_readme(self): - input_path = "./test_files/test_readme" - output_dir = "./output_dir" + input_path = "D:\\inspect4py-main\\test\\test_files\\test_readme" + output_dir = "D:\\inspect4py-main\\test\\output_dir" ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] @@ -609,59 +675,31 @@ def test_readme(self): license_detection = False readme = True metadata = False - + data_flow = False + symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata) + source_code, license_detection, readme, metadata, data_flow, symbol_table) expected_readme_files = { - f"{output_dir}/test_readme/README.md": "README.md in root dir\n", - f"{output_dir}/test_readme/subdir/README.txt": "README.txt in subdir\n", - f"{output_dir}/test_readme/subdir/subsubdir/README.rst": "README.rst in subsubdir\n" + f"{output_dir}\\test_readme\\README.md": "README.md in root dir\n", + f"{output_dir}\\test_readme\\subdir\\README.txt": "README.txt in subdir\n", + f"{output_dir}\\test_readme\\subdir\\subsubdir\\README.rst": "README.rst in subsubdir\n" } actual_readme_files = dir_info["readme_files"] assert expected_readme_files == actual_readme_files - #def test_metadata(self): - # """ - # Need to execute under test/test_files/: - # `git clone https://github.com/githubtraining/hellogitworld.git` - # to pass this test, as getting metadata requires the local repository - # to have a .git folder. - # """ - # input_path = "./test_files/hellogitworld" - # output_dir = "./output_dir" - # - # ignore_dir_pattern = [".", "__pycache__"] - # ignore_file_pattern = [".", "__pycache__"] - # requirements = False - # call_list = False - # control_flow = False - # directory_tree = False - # software_invocation = False - ## abstract_syntax_tree = False - # source_code = False - # license_detection = False - # readme = False - # metadata = True - # - # dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, - # call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - # source_code, license_detection, readme, metadata) - # try: - # response = requests.get("https://api.github.com/repos/githubtraining/hellogitworld") - # expected_metadata = response.json() - # except requests.RequestException as e: - # print(f"Error sending requests to Github API: {e}") - # raise e - # actual_metadata = dir_info["metadata"] - # assert expected_metadata == actual_metadata - - -def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, - call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata): +def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, + control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, + metadata, data_flow, symbol_table): + if data_flow: + LANGUAGE = Language(symbol_table, "python") + parser = Parser() + parser.set_language(LANGUAGE) + parser = [parser, DFG_python] + else: + parser = [] dir_info = {} # retrieve readme text at the root level (if any) readme = "" @@ -684,7 +722,7 @@ def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pat relative_path = Path(subdir).relative_to(Path(input_path).parent) out_dir = str(Path(output_dir) / relative_path) cf_dir, json_dir = create_output_dirs(out_dir, control_flow) - code_info = CodeInspection(path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code) + code_info = CodeInspection(path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) if out_dir not in dir_info: dir_info[out_dir] = [code_info.fileJson[0]] else: @@ -700,7 +738,7 @@ def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pat call_file_html = output_dir + "/call_graph.html" generate_output_html(pruned_call_list_data, call_file_html) call_json_file = output_dir + "/call_graph.json" - with open(call_json_file, 'w') as outfile: + with open(call_json_file, 'rb') as outfile: json.dump(pruned_call_list_data, outfile) # Note:1 for visualising the tree, nothing or 0 for not. if requirements: @@ -729,7 +767,7 @@ def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pat dir_info["software_type"] = rank_software_invocation(soft_invocation_info_list) if license_detection: licenses_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "../inspect4py/licenses") + "..\\inspect4py\\licenses") license_text = extract_license(input_path) rank_list = detect_license(license_text, licenses_path) dir_info["license"] = {} From 1297b6e1878cf6d0ae9c03b7d54db5479ef977df Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:20:32 +0100 Subject: [PATCH 05/18] Add files via upload --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index d78af49..428c3c9 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,11 @@ Inspect4py currently works **only for Python 3 projects**. ## Background: +`inspect4py` added the functionality of capture [Data Flow Graphs](http://bears.ece.ucsb.edu/research-info/DP/dfg.html) for each function inspired by GraphCodeBERT: [Github](https://github.com/microsoft/CodeBERT) & [Paper](https://arxiv.org/abs/2009.08366). The illustration is given: +|Source Code|List Output|Networkx Image| +|:-:|:-:|:-:| +|
def max(a, b):
x = 0
if a > b:
x = a
else:
x = b
return x
|
('a', 3, 'comesFrom', [], [])
('b', 5, 'comesFrom', [], [])
('x', 8, 'computedFrom', ['0'], [10])
('0', 10, 'comesFrom', [], [])
('a', 12, 'comesFrom', ['a'], [3])
('b', 14, 'comesFrom', ['b'], [5])
('x', 16, 'computedFrom', ['a'], [18])
('a', 18, 'comesFrom', ['a'], [3])
('x', 21, 'computedFrom', ['b'], [23])
('b', 23, 'comesFrom', ['b'], [5])
('x', 25, 'comesFrom', ['x'], [16, 21])
|![image](docs/images/data_flow.png)| + `inspect4py` uses [ASTs](https://en.wikipedia.org/wiki/Abstract_syntax_tree), more specifically the [ast](https://docs.python.org/3/library/ast.html) module in Python, generating a tree of objects (per file) whose classes all inherit from [ast.AST](https://docs.python.org/3/library/ast.html#ast.AST). From f0c0c00419410fe375b58053da4a7cafdb7fd5c3 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:21:22 +0100 Subject: [PATCH 06/18] Add files via upload --- docs/images/data_flow.png | Bin 0 -> 19124 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/data_flow.png diff --git a/docs/images/data_flow.png b/docs/images/data_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..4e993a0c32519485dfdd7039d917a41d215010d0 GIT binary patch literal 19124 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 n0u|q3$D5 Date: Mon, 27 Feb 2023 14:22:52 +0100 Subject: [PATCH 07/18] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 428c3c9..af17272 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Inspect4py currently works **only for Python 3 projects**. `inspect4py` added the functionality of capture [Data Flow Graphs](http://bears.ece.ucsb.edu/research-info/DP/dfg.html) for each function inspired by GraphCodeBERT: [Github](https://github.com/microsoft/CodeBERT) & [Paper](https://arxiv.org/abs/2009.08366). The illustration is given: |Source Code|List Output|Networkx Image| |:-:|:-:|:-:| -|
def max(a, b):
x = 0
if a > b:
x = a
else:
x = b
return x
|
('a', 3, 'comesFrom', [], [])
('b', 5, 'comesFrom', [], [])
('x', 8, 'computedFrom', ['0'], [10])
('0', 10, 'comesFrom', [], [])
('a', 12, 'comesFrom', ['a'], [3])
('b', 14, 'comesFrom', ['b'], [5])
('x', 16, 'computedFrom', ['a'], [18])
('a', 18, 'comesFrom', ['a'], [3])
('x', 21, 'computedFrom', ['b'], [23])
('b', 23, 'comesFrom', ['b'], [5])
('x', 25, 'comesFrom', ['x'], [16, 21])
|![image](docs/images/data_flow.png)| +|
def max(a, b):
x = 0
if a > b:
x = a
else:
x = b
return x
|
('a', 3, 'comesFrom', [], [])
('b', 5, 'comesFrom', [], [])
('x', 8, 'computedFrom', ['0'], [10])
('0', 10, 'comesFrom', [], [])
('a', 12, 'comesFrom', ['a'], [3])
('b', 14, 'comesFrom', ['b'], [5])
('x', 16, 'computedFrom', ['a'], [18])
('a', 18, 'comesFrom', ['a'], [3])
('x', 21, 'computedFrom', ['b'], [23])
('b', 23, 'comesFrom', ['b'], [5])
('x', 25, 'comesFrom', ['x'], [16, 21])
|![image](docs/images/data_flow.png)| `inspect4py` uses [ASTs](https://en.wikipedia.org/wiki/Abstract_syntax_tree), more specifically the [ast](https://docs.python.org/3/library/ast.html) module in Python, generating From 80ed5e495cb09dfd7511c5e91f3ba0e67bcf4d5c Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:29:55 +0100 Subject: [PATCH 08/18] Add files via upload --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af17272..e169faa 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,12 @@ Please cite our MSR 2022 demo paper: ### Preliminaries +Make sure you have tree-sitter installed, C complier is needed, more [info](https://github.com/tree-sitter/tree-sitter): + +``` +pip install tree-sitter +``` + Make sure you have graphviz installed: ``` @@ -76,7 +82,7 @@ We have tested `inspect4py` in Python 3.7+. **Our recommended version is Python ### Operative System -We have tested `inspect4py` in Unix and MacOs. +We have tested `inspect4py` in Unix, MacOS and Windows 11(22621.1265). ### Installation from pypi `inspect4py` is [available in pypi!](https://pypi.org/project/inspect4py/) Just install it like a regular package: @@ -111,6 +117,7 @@ pigar setuptools==54.2.0 json2html configparser +tree-sitter ``` If you want to run the evaluations, do not forget to add `pandas` to the previous set. @@ -223,6 +230,8 @@ Options: -rm, --readme extract all readme files in the target repository. -md, --metadata extract metadata of the target repository using Github API. + -df, --data_flow extract data flow graph for every function + -st, --symbol_table symbol table file location. --help Show this message and exit. ``` From 6d0c754240f6a1012efe2802abf6836ee1b4c4d5 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:30:36 +0100 Subject: [PATCH 09/18] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 82d2c73..28e5068 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,3 +8,4 @@ json2html configparser bigcode_astgen GitPython +tree-sitter From c26ab1b445c9051e9d0a7b9d177eaddb415494a4 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:30:55 +0100 Subject: [PATCH 10/18] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e169faa..d4a085f 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,8 @@ pigar setuptools==54.2.0 json2html configparser +bigcode_astgen +GitPython tree-sitter ``` From 7fad3e9672066071c12298213f6871bcfa02eae1 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:31:29 +0100 Subject: [PATCH 11/18] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d4a085f..a5da5a6 100644 --- a/README.md +++ b/README.md @@ -232,8 +232,8 @@ Options: -rm, --readme extract all readme files in the target repository. -md, --metadata extract metadata of the target repository using Github API. - -df, --data_flow extract data flow graph for every function - -st, --symbol_table symbol table file location. + -df, --data_flow extract data flow graph for every function, BOOL + -st, --symbol_table symbol table file location. STR --help Show this message and exit. ``` From 92b736686f75cbe876277281a97915bbb98365e2 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:08:56 +0100 Subject: [PATCH 12/18] Delete inspect4py/staticfg/__pycache__ directory --- .../__pycache__/__init__.cpython-39.pyc | Bin 247 -> 0 bytes .../staticfg/__pycache__/builder.cpython-39.pyc | Bin 12726 -> 0 bytes .../staticfg/__pycache__/model.cpython-39.pyc | Bin 7447 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 inspect4py/staticfg/__pycache__/__init__.cpython-39.pyc delete mode 100644 inspect4py/staticfg/__pycache__/builder.cpython-39.pyc delete mode 100644 inspect4py/staticfg/__pycache__/model.cpython-39.pyc diff --git a/inspect4py/staticfg/__pycache__/__init__.cpython-39.pyc b/inspect4py/staticfg/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 007ff8ec7ecb1f0fd9d57cb6b1c31d108ec94e70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmYe~<>g`kg1wX8C%XXY#~=WHo#+K%!+JT%^46=xa5dgE2JBk1R diff --git a/inspect4py/staticfg/__pycache__/builder.cpython-39.pyc b/inspect4py/staticfg/__pycache__/builder.cpython-39.pyc deleted file mode 100644 index d912845c414fcaf90cdafc77c6459c6a0473576b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12726 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 diff --git a/inspect4py/staticfg/__pycache__/model.cpython-39.pyc b/inspect4py/staticfg/__pycache__/model.cpython-39.pyc deleted file mode 100644 index e464c6992bdc54e5a56fd4977419479541d0e953..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7447 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 Date: Mon, 27 Feb 2023 16:09:08 +0100 Subject: [PATCH 13/18] Delete inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files directory --- .../MGNN-SPred-master/models/json_files/__init__.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json diff --git a/inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json b/inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json deleted file mode 100644 index 81fe488..0000000 --- a/inspect4py/output_dir/Autumn945_MGNN-SPred/MGNN-SPred-master/models/json_files/__init__.json +++ /dev/null @@ -1 +0,0 @@ -{"file": {"path": "D:\\inspect4py-main\\test\\Autumn945_MGNN-SPred\\MGNN-SPred-master\\models\\__init__.py", "fileNameBase": "__init__", "extension": "py"}, "dependencies": [{"from_module": "base", "import": "Base", "type": "internal", "type_element": "class"}, {"from_module": "base", "import": "GNN", "type": "internal", "type_element": "class"}], "is_test": false} \ No newline at end of file From 5201992ae9ef694110cca439c856fe3c82d04442 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:09:22 +0100 Subject: [PATCH 14/18] Delete directory_info.json --- inspect4py/output_dir/directory_info.json | 1 - 1 file changed, 1 deletion(-) delete mode 100644 inspect4py/output_dir/directory_info.json diff --git a/inspect4py/output_dir/directory_info.json b/inspect4py/output_dir/directory_info.json deleted file mode 100644 index a934e9c..0000000 --- a/inspect4py/output_dir/directory_info.json +++ /dev/null @@ -1 +0,0 @@ -{"output_dir\\Autumn945_MGNN-SPred\\MGNN-SPred-master\\models": [{"file": {"path": "D:\\inspect4py-main\\test\\Autumn945_MGNN-SPred\\MGNN-SPred-master\\models\\__init__.py", "fileNameBase": "__init__", "extension": "py"}, "dependencies": [{"from_module": "base", "import": "Base", "type": "internal", "type_element": "class"}, {"from_module": "base", "import": "GNN", "type": "internal", "type_element": "class"}], "is_test": false}]} \ No newline at end of file From 34161acca9d570ef46fd989e6aca3ab926e34a68 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:11:00 +0100 Subject: [PATCH 15/18] Create output_dir --- inspect4py/output_dir/output_dir | 1 + 1 file changed, 1 insertion(+) create mode 100644 inspect4py/output_dir/output_dir diff --git a/inspect4py/output_dir/output_dir b/inspect4py/output_dir/output_dir new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/inspect4py/output_dir/output_dir @@ -0,0 +1 @@ +12 From aab6774fe6cfd1f163f71de7117b5b1b04b576e8 Mon Sep 17 00:00:00 2001 From: Clark Wang <107419732+OEG-Clark@users.noreply.github.com> Date: Mon, 27 Feb 2023 16:11:12 +0100 Subject: [PATCH 16/18] Delete output_dir --- inspect4py/output_dir/output_dir | 1 - 1 file changed, 1 deletion(-) delete mode 100644 inspect4py/output_dir/output_dir diff --git a/inspect4py/output_dir/output_dir b/inspect4py/output_dir/output_dir deleted file mode 100644 index 48082f7..0000000 --- a/inspect4py/output_dir/output_dir +++ /dev/null @@ -1 +0,0 @@ -12 From 648ff1ae4e1a32601a4d4f601117ff02b6faf2d6 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Sat, 4 Mar 2023 23:30:42 +0100 Subject: [PATCH 17/18] Fixing tests so they become platform-independent --- inspect4py/__init__.py | 2 +- inspect4py/cli.py | 13 +- inspect4py/resources/my-languages.so | Bin 408064 -> 0 bytes inspect4py/utils.py | 139 ++++++----- pyproject.toml | 1 + test/test_inspect4py.py | 360 +++++++++++++++------------ 6 files changed, 281 insertions(+), 234 deletions(-) delete mode 100644 inspect4py/resources/my-languages.so diff --git a/inspect4py/__init__.py b/inspect4py/__init__.py index fa9c4ec..2792152 100644 --- a/inspect4py/__init__.py +++ b/inspect4py/__init__.py @@ -1 +1 @@ -__version__ = '0.0.6' +__version__ = '0.0.7' diff --git a/inspect4py/cli.py b/inspect4py/cli.py index b619cde..1890ec4 100644 --- a/inspect4py/cli.py +++ b/inspect4py/cli.py @@ -1259,9 +1259,16 @@ def main(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requir control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, metadata, data_flow, symbol_table): if data_flow: - LANGUAGE = Language(symbol_table, "python") + if symbol_table == "my_language.so": # default option + path_to_languages = str(Path(__file__).parent / "resources") + if sys.platform.startswith("win") or sys.platform.startswith("cygwin"): + language = Language(path_to_languages + os.path.sep + "python_win.so", "python") + else: + language = Language(path_to_languages + os.path.sep + "python_unix.so", "python") + else: + language = Language(symbol_table, "python") parser = Parser() - parser.set_language(LANGUAGE) + parser.set_language(language) parser = [parser, DFG_python] else: parser = [] @@ -1367,7 +1374,7 @@ def main(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requir dir_info["software_type"] = "not found" if license_detection: try: - licenses_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "licenses") + licenses_path = str(Path(__file__).parent / "licenses") license_text = extract_license(input_path) rank_list = detect_license(license_text, licenses_path) dir_info["license"] = {} diff --git a/inspect4py/resources/my-languages.so b/inspect4py/resources/my-languages.so deleted file mode 100644 index 921ee0bf7e20ede73a280a92f6ef33a8cb1aabae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408064 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¬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 cmd: %s" %cmd) + + # print("-----> cmd: %s" %cmd) proc = subprocess.Popen(cmd.encode('utf-8'), shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = proc.communicate() @@ -118,7 +118,7 @@ def extract_requirements(input_path): for line in lines: try: if line != "\n": - if " == " in line: + if " == " in line: splitLine = line.split(" == ") else: splitLine = line.split("==") @@ -128,8 +128,8 @@ def extract_requirements(input_path): # Note: Pigar requirement file is being deleted # in the future we might want to keep it (just commenting the line bellow) - #os.system('rm ' + file_name) - #print("Exracted requirements :%s" %req_dict) + # os.system('rm ' + file_name) + # print("Exracted requirements :%s" %req_dict) return req_dict except: @@ -175,7 +175,7 @@ def extract_software_invocation(dir_info, dir_tree_info, input_path, call_list, body_only_files = [] flag_service_main = 0 for key in dir_info: # filter (lambda key: key not in "directory_tree", dir_info): - if key!="requirements" and key!="directory_tree": # Note: We need to filter out directory_tree + if key != "requirements" and key != "directory_tree": # Note: We need to filter out directory_tree for elem in dir_info[key]: if elem["main_info"]["main_flag"]: flag_service_main = 0 @@ -188,7 +188,7 @@ def extract_software_invocation(dir_info, dir_tree_info, input_path, call_list, try: # 2. Exploration for services in files with "mains" flag_service, software_invocation_info = service_check(elem, software_invocation_info, - server_dependencies, "main", readme) + server_dependencies, "main", readme) except: main_files.append(elem["file"]["path"]) @@ -209,19 +209,19 @@ def extract_software_invocation(dir_info, dir_tree_info, input_path, call_list, # this list (of lists) stores the mains that each main import import_mains = [] - + # this list (of lists) stores the mains that each main is imported by - imported_by = [None]*len(main_files) + imported_by = [None] * len(main_files) # 3. Exploration for main scripts for m in range(0, len(main_files)): m_calls = find_file_calls(main_files[m], call_list) # HERE I STORE WHICH OTHER MAIN FILES CALLS EACH "M" MAIN_FILE m_imports = extract_relations(main_files[m], m_calls, main_files, call_list) - + # storing those m_imports in the import_mains[m] import_mains.append(m_imports) - + for m_i in m_imports: m_secondary[main_files.index(m_i)] = 1 @@ -286,7 +286,6 @@ def extract_software_invocation(dir_info, dir_tree_info, input_path, call_list, return software_invocation_info - def generate_output_html(pruned_json, output_file_html): """ Method to generate a simple HTML view of the obtained JSON. @@ -331,9 +330,9 @@ def list_functions_classes_from_module(m, path): type = "internal" except: - - #module = __import__(m) - #functions = dir(module) + + # module = __import__(m) + # functions = dir(module) type = "external" return functions, classes, type @@ -352,22 +351,22 @@ def type_module(m, i, path): return "internal" else: if m: - m = m.replace(".", "/") - file_module = abs_repo_path + "/" + m + ".py" - file_module_path = Path(file_module) - if file_module_path.is_file(): - return "internal" - else: - file_module = abs_repo_path + "/" + m + "/main.py" - file_module_path = Path(file_module) - if file_module_path.is_file(): - return "internal" - else: - return "external" + m = m.replace(".", "/") + file_module = abs_repo_path + "/" + m + ".py" + file_module_path = Path(file_module) + if file_module_path.is_file(): + return "internal" + else: + file_module = abs_repo_path + "/" + m + "/main.py" + file_module_path = Path(file_module) + if file_module_path.is_file(): + return "internal" + else: + return "external" else: dir_module = abs_repo_path + "/" + i if os.path.exists(dir_module): - return "internal" + return "internal" else: return "external" @@ -419,7 +418,8 @@ def call_list_dir(dir_info): call_list[dir][file_path]["body"] = extract_call_functions(file_info, body=1) call_list[dir][file_path]["classes"] = {} for class_n in file_info["classes"]: - call_list[dir][file_path]["classes"][class_n] = extract_call_methods(file_info["classes"][class_n]["methods"]) + call_list[dir][file_path]["classes"][class_n] = extract_call_methods( + file_info["classes"][class_n]["methods"]) return call_list @@ -433,8 +433,8 @@ def find_file_calls(file_name, call_list): def find_module_calls(module, call_list): for dir in call_list: for elem in call_list[dir]: - if "/"+module+"." in elem: - #print("---MODULE %s, elem %s, giving call_list[%s][%s]" %(module, elem, dir, elem)) + if "/" + module + "." in elem: + # print("---MODULE %s, elem %s, giving call_list[%s][%s]" %(module, elem, dir, elem)) return call_list[dir][elem] # DFS algorithm - Allowing up to 2 levels of depth. @@ -457,7 +457,7 @@ def file_in_call(base, call, file, m_imports, call_list, orig_base, level): elif orig_base in call: return 0 - elif level < level_depth and call!="": + elif level < level_depth and call != "": m_calls_extern = {} module_base = call.split(".")[0] module_base = module_base + "." @@ -522,7 +522,7 @@ def extract_relations(file_name, m_calls, main_files, call_list): level = 0 flag_found = extract_data(base, m_calls[m_c], file, m_imports, flag_found, call_list, orig_base, level) if flag_found: - #return m_imports + # return m_imports break return m_imports @@ -622,6 +622,7 @@ def rank_software_invocation(soft_invocation_info_list): entry["ranking"] = position return soft_invocation_info_list + def ast_to_json(ast_obj): """ Function to convert the AST object into JSON format. @@ -631,6 +632,7 @@ def ast_to_json(ast_obj): ast_generator.tree = ast_obj return ast_generator.generate_ast() + def ast_to_source_code(ast_obj): """ Function to convert the AST object into source code. @@ -650,8 +652,8 @@ def dice_coefficient(a, b): if len(b) == 1: b = b + u"." - a_bigrams = {a[i : i + 2] for i in range(len(a) - 1)} - b_bigrams = {b[i : i + 2] for i in range(len(b) - 1)} + a_bigrams = {a[i: i + 2] for i in range(len(a) - 1)} + b_bigrams = {b[i: i + 2] for i in range(len(b) - 1)} overlap = len(a_bigrams & b_bigrams) dice_coeff = overlap * 2.0 / (len(a_bigrams) + len(b_bigrams)) @@ -727,6 +729,7 @@ def detect_license(license_text, licenses_path, threshold=0.9): return sorted(rank_list, key=lambda t: t[1], reverse=True) + def extract_readme(input_path: str, output_dir: str) -> dict: """ Function to extract content of all readme file under the input directory. @@ -744,6 +747,7 @@ def extract_readme(input_path: str, output_dir: str) -> dict: return readme_files + def get_github_metadata(input_path: str) -> dict: """ Function to extract metadata from the remote repository using Github api. @@ -773,8 +777,9 @@ def get_github_metadata(input_path: str) -> dict: return github_metadata + def find_index_init(depInfo, calls, class_init): - index_remove=[] + index_remove = [] for dep in depInfo: if dep["type_element"] == "class": if dep["import"] in calls: @@ -786,19 +791,21 @@ def find_index_init(depInfo, calls, class_init): index_remove.append(calls.index(i)) return index_remove + def update_list_calls(info, index_remove): - updated_calls=[] + updated_calls = [] for i in range(0, len(info["calls"])): if i in index_remove: continue updated_calls.append(info["calls"][i]) ### These lines are for removing duplicate calls res = [] - for i in updated_calls : + for i in updated_calls: if i not in res: res.append(i) return res + def tree_to_variable_index(root_node, index_to_code): if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment': index = (root_node.start_point, root_node.end_point) @@ -813,6 +820,7 @@ def tree_to_variable_index(root_node, index_to_code): code_tokens += tree_to_variable_index(child, index_to_code) return code_tokens + def DFG_python(root_node, index_to_code, states): assignment = ['assignment', 'augmented_assignment', 'for_in_clause'] if_statement = ['if_statement'] @@ -979,7 +987,8 @@ def DFG_python(root_node, index_to_code, states): temp, states = DFG_python(child, index_to_code, states) DFG += temp - return sorted(DFG,key=lambda x:x[1]),states + return sorted(DFG, key=lambda x: x[1]), states + def tree_to_variable_index(root_node, index_to_code): if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment': @@ -1009,6 +1018,7 @@ def index_to_code_token(index, code): s += code[end_point[0]][:end_point[1]] return s + def tree_to_token_index(root_node): if (len(root_node.children) == 0 or root_node.type == 'string') and root_node.type != 'comment': return [(root_node.start_point, root_node.end_point)] @@ -1018,35 +1028,36 @@ def tree_to_token_index(root_node): code_tokens += tree_to_token_index(child) return code_tokens -def extract_dataflow(code, parser,lang): - #obtain dataflow - if lang=="php": - code="" + +def extract_dataflow(code, parser, lang): + # obtain dataflow + if lang == "php": + code = "" try: - tree = parser[0].parse(bytes(code,'utf8')) + tree = parser[0].parse(bytes(code, 'utf8')) root_node = tree.root_node - tokens_index=tree_to_token_index(root_node) - code=code.split('\n') - code_tokens=[index_to_code_token(x,code) for x in tokens_index] - index_to_code={} - for idx,(index,code) in enumerate(zip(tokens_index,code_tokens)): - index_to_code[index]=(idx,code) + tokens_index = tree_to_token_index(root_node) + code = code.split('\n') + code_tokens = [index_to_code_token(x, code) for x in tokens_index] + index_to_code = {} + for idx, (index, code) in enumerate(zip(tokens_index, code_tokens)): + index_to_code[index] = (idx, code) try: - DFG,_=parser[1](root_node,index_to_code,{}) + DFG, _ = parser[1](root_node, index_to_code, {}) except: - DFG=[] - DFG=sorted(DFG,key=lambda x:x[1]) - indexs=set() + DFG = [] + DFG = sorted(DFG, key=lambda x: x[1]) + indexs = set() for d in DFG: - if len(d[-1])!=0: + if len(d[-1]) != 0: indexs.add(d[1]) for x in d[-1]: indexs.add(x) - new_DFG=[] + new_DFG = [] for d in DFG: if d[1] in indexs: new_DFG.append(d) - dfg=new_DFG + dfg = new_DFG except: - dfg=[] - return code_tokens, dfg \ No newline at end of file + dfg = [] + return code_tokens, dfg diff --git a/pyproject.toml b/pyproject.toml index 882a3f9..af12a37 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,5 +9,6 @@ requires = [ "setuptools==54.2.0", "json2html", "configparser", + "tree-sitter" ] build-backend = "setuptools.build_meta" diff --git a/test/test_inspect4py.py b/test/test_inspect4py.py index 5c1283f..72376f4 100644 --- a/test/test_inspect4py.py +++ b/test/test_inspect4py.py @@ -1,24 +1,27 @@ +import os.path import unittest -import json import shutil -import requests +from tree_sitter import Parser from inspect4py.cli import * -from inspect4py import cli, utils + +test_data_path = str(Path(__file__).parent / "test_files") + os.path.sep +test_out_path = str(Path(__file__).parent) class Test(unittest.TestCase): def test_call_list_super(self): dictionary = {'Rectangle': {}, 'Square': {'__init__': {'local': ['super_test.Rectangle.__init__']}}} - input_path = "./test_files/test_inheritance/super_test.py" - output_dir = "./output_dir" + input_path = test_data_path + "test_inheritance" + os.path.sep + "super_test.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False abstract_syntax_tree = False source_code = False data_flow = False parser = [] cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data["classes"]['Rectangle'] == dictionary['Rectangle']) @@ -33,72 +36,80 @@ def test_call_list_super_test_5(self): 'face_area': {'local': ['super_test_5.Rectangle.area']}, 'surface_area': {'local': ['super_test_5.Rectangle.area']}}} input_path = "./test_files/test_inheritance/super_test_5.py" - output_dir = "./output_dir" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False abstract_syntax_tree = False source_code = False data_flow = False parser = [] cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data['body'] == dictionary['body']) def test_call_list_nested(self): - dictionary = {'functions': {'test': {'local': ['nested_call.MyClass.func']}}, + dictionary = {'functions': {'test': {'local': ['nested_call.MyClass.func']}}, 'body': {'local': ['nested_call.test']}, 'classes': {'MyClass': { - 'func': {'local': ['nested_call.MyClass.func.nested'], 'nested': {'nested': {'local': ['print']}}}}}} - input_path = "./test_files/test_inheritance/nested_call.py" - output_dir = "./output_dir" + 'func': {'local': ['nested_call.MyClass.func.nested'], 'nested': {'nested': {'local': ['print']}}}}}} + input_path = test_data_path + os.path.sep + "test_inheritance" + os.path.sep +"nested_call.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) def test_call_list_super_nested(self): - dictionary = {'functions': {'func_d': {'local': ['super_nested_call.func_d.func_e'], - 'nested': {'func_e': {'local': ['print']}}}, - 'main': {'local': ['super_nested_call.MyClass.func_a', 'super_nested_call.func_d']}}, + dictionary = {'functions': {'func_d': {'local': ['super_nested_call.func_d.func_e'], + 'nested': {'func_e': {'local': ['print']}}}, + 'main': { + 'local': ['super_nested_call.MyClass.func_a', 'super_nested_call.func_d']}}, 'body': {'local': ['super_nested_call.main']}, - 'classes': {'MyClass': {'func_a': {'local': ['print', 'super_nested_call.MyClass.func_a.func_b'], - 'nested': {'func_b': {'local': ['print', 'super_nested_call.MyClass.func_a.func_b.func_c'], - 'nested': {'func_c': {'local': ['print']}}}}}}}} - input_path = "./test_files/test_inheritance/super_nested_call.py" - output_dir = "./output_dir" + 'classes': {'MyClass': {'func_a': {'local': ['print', 'super_nested_call.MyClass.func_a.func_b'], + 'nested': {'func_b': {'local': ['print', + 'super_nested_call.MyClass.func_a.func_b.func_c'], + 'nested': { + 'func_c': {'local': ['print']}}}}}}}} + input_path = test_data_path + os.path.sep + "test_inheritance" +os.path.sep +"super_nested_call.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] - + abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) def test_call_list_import(self): dictionary = {'functions': {'funct_D': {'local': ['print', 'test_functions.funct_A']}}, 'body': { - 'local': ['test_functions.funct_A', 'test_import.funct_D']}, - 'classes': {'MyClass_D': {'__init__': {'local': ['print', 'test_functions.funct_C', 'test_import.funct_D']}}, - 'MyClass_E': {'__init__': {'local': ['print']}}}} - input_path = "./test_files/test_inheritance/test_import.py" - output_dir = "./output_dir" + 'local': ['test_functions.funct_A', 'test_import.funct_D']}, + 'classes': {'MyClass_D': { + '__init__': {'local': ['print', 'test_functions.funct_C', 'test_import.funct_D']}}, + 'MyClass_E': {'__init__': {'local': ['print']}}}} + input_path = test_data_path + os.path.sep + "test_inheritance" + os.path.sep + "test_import.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] - + abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -106,15 +117,16 @@ def test_call_list_import(self): def test_call_list_external_module(self): dictionary = {'body': { 'local': ['random.seed', 'print', 'random.random']}} - input_path = "./test_files/test_random.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_random.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data['body'] == dictionary['body']) @@ -123,15 +135,16 @@ def test_call_list_argument_call(self): dictionary = {'functions': {'func_1': {'local': ['print', 'argument_call.func_2']}}, 'body': {'local': ['print', 'argument_call.func_1', 'argument_call.MyClass.func_a']}, 'classes': {'MyClass': {'func_a': {'local': ['print', 'argument_call.MyClass.func_b']}}}} - input_path = "./test_files/test_dynamic/argument_call.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic" + os.path.sep +"argument_call.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data['body'] == dictionary['body']) @@ -139,31 +152,34 @@ def test_call_list_argument_call(self): def test_call_list_dynamic_body(self): dictionary = {'functions': {'func_2': {'local': ['test_dynamic.func_1']}}, 'body': {'local': ['test_dynamic.func_2', 'print']}, 'classes': {}} - input_path = "./test_files/test_dynamic/test_dynamic.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic" + os.path.sep + "test_dynamic.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) def test_call_list_dynamic_func(self): dictionary = {'functions': {'func_2': {'local': ['test_dynamic_func.func_1']}, - 'main': {'local': ['test_dynamic_func.func_2', 'print']}}, 'body': {'local': ['test_dynamic_func.main']}, 'classes': {}} - input_path = "./test_files/test_dynamic/test_dynamic_func.py" - output_dir = "./output_dir" + 'main': {'local': ['test_dynamic_func.func_2', 'print']}}, + 'body': {'local': ['test_dynamic_func.main']}, 'classes': {}} + input_path = test_data_path + os.path.sep + "test_dynamic" + os.path.sep + "test_dynamic_func.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -172,15 +188,16 @@ def test_call_list_dynamic_body_import(self): dictionary = {'functions': {'func_3': {'local': ['test_dynamic_func.func_1']}}, 'body': {'local': ['test_dynamic_import.func_3', 'print']}, 'classes': {}} - input_path = "./test_files/test_dynamic/test_dynamic_import.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic"+ os.path.sep + "test_dynamic_import.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -189,15 +206,16 @@ def test_call_list_dynamic_body_from_import(self): dictionary = {'functions': {'func_3': {'local': ['test_dynamic_func.func_1']}}, 'body': {'local': ['test_dynamic_from_import.func_3', 'print']}, 'classes': {}} - input_path = "./test_files/test_dynamic/test_dynamic_from_import.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic" + os.path.sep + "test_dynamic_from_import.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -206,15 +224,16 @@ def test_call_list_dynamic_import_alias(self): dictionary = {'functions': {'func_3': {'local': ['test_dynamic_func.td.func_1']}}, 'body': {'local': ['test_dynamic_import_alias.func_3', 'print']}, 'classes': {}} - input_path = "./test_files/test_dynamic/test_dynamic_import_alias.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic"+os.path.sep+"test_dynamic_import_alias.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -223,34 +242,35 @@ def test_call_list_dynamic_import_method(self): dictionary = {'functions': {'func_2': {'local': ['test_dynamic_method.MyClass.func_1']}, 'main': { 'local': ['test_dynamic_method.func_2', 'print']}}, 'body': {'local': ['test_dynamic_method.main']}, 'classes': {'MyClass': {}}} - input_path = "./test_files/test_dynamic/test_dynamic_method.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic"+ os.path.sep+"test_dynamic_method.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) def test_call_list_dynamic_import_method_variable(self): - dictionary = {'functions': {'func_2': {'local': ['test_dynamic_method_variable.MyClass.func_1']}, - 'main': {'local': ['test_dynamic_method_variable.func_2', 'print']}}, - 'body': {'local': ['test_dynamic_method_variable.main']}, 'classes': {'MyClass': {}}} + dictionary = {'functions': {'func_2': {'local': ['test_dynamic_method_variable.MyClass.func_1']}, + 'main': {'local': ['test_dynamic_method_variable.func_2', 'print']}}, + 'body': {'local': ['test_dynamic_method_variable.main']}, 'classes': {'MyClass': {}}} - - input_path = "./test_files/test_dynamic/test_dynamic_method_variable.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic" + os.path.sep + "test_dynamic_method_variable.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) @@ -259,22 +279,23 @@ def test_call_list_dynamic_class_import(self): dictionary = {'functions': {}, 'body': { 'local': ['test_dynamic_class_import.MyClass.func_3']}, 'classes': {'MyClass': {'func_3': {'local': ['test_dynamic_func.func_1']}}}} - input_path = "./test_files/test_dynamic/test_dynamic_class_import.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_dynamic" + os.path.sep + "test_dynamic_class_import.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) call_list_data = call_list_file(code_info) shutil.rmtree(output_dir) assert (call_list_data == dictionary) def test_service(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\Chowlk" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "Chowlk" + output_dir = test_out_path + os.path.sep + "output_dir" data_flow = False symbol_table = "" ignore_dir_pattern = [".", "__pycache__"] @@ -290,16 +311,16 @@ def test_service(self): readme = False metadata = False dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, - call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, + call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, metadata, data_flow, symbol_table) current_type = dir_info['software_type'] shutil.rmtree(output_dir) assert current_type[0]["type"] == "service" def test_package(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\somef" - output_dir = "D:\\inspect4py-main\\test\\output_dir" - + input_path = test_data_path + os.path.sep + "somef" + output_dir = test_out_path + os.path.sep + "output_dir" + ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] requirements = False @@ -315,16 +336,16 @@ def test_package(self): data_flow = False symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, - call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, + call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, metadata, data_flow, symbol_table) current_type = dir_info['software_type'] shutil.rmtree(output_dir) assert current_type[0]["type"] == "package" def test_library(self): - input_path = "./test_files/pylops" - output_dir = "./output_dir" - + input_path = test_data_path + os.path.sep + "pylops" + output_dir = test_out_path + os.path.sep + "output_dir" + ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] requirements = False @@ -340,17 +361,16 @@ def test_library(self): data_flow = False symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, - call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, + call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, metadata, data_flow, symbol_table) current_type = dir_info['software_type'] shutil.rmtree(output_dir) assert current_type[0]["type"] == "library" - def test_multiple_mains(self): - input_path = "./test_files/test_multiple_mains" - output_dir = "./output_dir" - + input_path = test_data_path + os.path.sep + "test_multiple_mains" + output_dir = test_out_path + os.path.sep + "output_dir" + ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] requirements = False @@ -370,18 +390,17 @@ def test_multiple_mains(self): source_code, license_detection, readme, metadata, data_flow, symbol_table) imports = dir_info['software_invocation'] shutil.rmtree(output_dir) + num_imports = 0 for i in imports: if "test.py" in i['run']: - num_imports = len (i['imports']) - break + num_imports = len(i['imports']) + break assert num_imports == 2 - - def test_script(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\BoostingMonocularDepth" - output_dir = "./output_dir" - + input_path = test_data_path + os.path.sep + "BoostingMonocularDepth" + output_dir = test_out_path + os.path.sep + "output_dir" + ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] requirements = False @@ -403,37 +422,38 @@ def test_script(self): shutil.rmtree(output_dir) assert current_type[0]["type"] == "script" -# Test for testing ast trees -# def test_issue_110(): -# output_html_file = "test_issue_110_output.html" -# self.assertEquals(3, 4) -# m = MakeDocco(input_data_file="test_issue_110_input.ttl") -# m.document(destination=output_html_file) -# assert "balance between £1,000 and £1,000,000 GBP" in open(output_html_file).read() - -# def crop_transform68(rimg, landmark, image_size, src): -# -# assert landmark.shape[0] == 68 or landmark.shape[0] == 5 -# assert landmark.shape[1] == 2 -# tform = trans.SimilarityTransform() -# -# tform.estimate(landmark, src) -# M = tform.params[0:2, :] -# img = cv2.warpAffine( -# rimg, M, (image_size[1], image_size[0]), borderValue=0.0) -# return img + # Test for testing ast trees + # def test_issue_110(): + # output_html_file = "test_issue_110_output.html" + # self.assertEquals(3, 4) + # m = MakeDocco(input_data_file="test_issue_110_input.ttl") + # m.document(destination=output_html_file) + # assert "balance between £1,000 and £1,000,000 GBP" in open(output_html_file).read() + + # def crop_transform68(rimg, landmark, image_size, src): + # + # assert landmark.shape[0] == 68 or landmark.shape[0] == 5 + # assert landmark.shape[1] == 2 + # tform = trans.SimilarityTransform() + # + # tform.estimate(landmark, src) + # M = tform.params[0:2, :] + # img = cv2.warpAffine( + # rimg, M, (image_size[1], image_size[0]), borderValue=0.0) + # return img def test_ast_function(self): - input_path = "./test_files/test_basic/test_basic_function.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_basic" + os.path.sep +"test_basic_function.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False - + abstract_syntax_tree = True source_code = False data_flow = False parser = [] cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) shutil.rmtree(output_dir) expected_ast = [ @@ -457,44 +477,48 @@ def test_ast_function(self): assert expected_ast == actual_ast def test_data_flow(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\test_data_flow.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_data_flow.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False abstract_syntax_tree = False source_code = True - data_flow=True - LANGUAGE = Language("D:\\inspect4py-main\\my-languages.so", "python") + data_flow = True + path_to_languages = str(Path(__file__).parent.parent / "inspect4py" / "resources") + if sys.platform.startswith("win") or sys.platform.startswith("cygwin"): + language = Language(path_to_languages + os.path.sep + "python_win.so", "python") + else: # mac and unix should be compatible + language = Language(path_to_languages + os.path.sep + "python_unix.so", "python") parser = Parser() - parser.set_language(LANGUAGE) + parser.set_language(language) parser = [parser, DFG_python] cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) expected_dfg = [('a', 3, 'comesFrom', [], []), - ('b', 5, 'comesFrom', [], []), - ('x', 8, 'computedFrom', ['0'], [10]), - ('0', 10, 'comesFrom', [], []), - ('a', 12, 'comesFrom', ['a'], [3]), - ('b', 14, 'comesFrom', ['b'], [5]), - ('x', 16, 'computedFrom', ['a'], [18]), - ('a', 18, 'comesFrom', ['a'], [3]), - ('x', 21, 'computedFrom', ['b'], [23]), - ('b', 23, 'comesFrom', ['b'], [5]), - ('x', 25, 'comesFrom', ['x'], [16, 21])] + ('b', 5, 'comesFrom', [], []), + ('x', 8, 'computedFrom', ['0'], [10]), + ('0', 10, 'comesFrom', [], []), + ('a', 12, 'comesFrom', ['a'], [3]), + ('b', 14, 'comesFrom', ['b'], [5]), + ('x', 16, 'computedFrom', ['a'], [18]), + ('a', 18, 'comesFrom', ['a'], [3]), + ('x', 21, 'computedFrom', ['b'], [23]), + ('b', 23, 'comesFrom', ['b'], [5]), + ('x', 25, 'comesFrom', ['x'], [16, 21])] actual_dfg = code_info.fileJson[0]["functions"]["max"]["data_flow"] assert actual_dfg == expected_dfg - - def test_ast_method(self): - input_path = "./test_files/test_basic/test_basic_method.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_basic" + os.path.sep + "test_basic_method.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = True source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) shutil.rmtree(output_dir) expected_ast = [ @@ -524,15 +548,16 @@ def test_ast_method(self): assert expected_ast == actual_ast def test_ast_body(self): - input_path = "./test_files/test_basic/test_basic_body.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep +"test_basic" + os.path.sep + "test_basic_body.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = True source_code = False cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) shutil.rmtree(output_dir) expected_ast = [ @@ -546,37 +571,38 @@ def test_ast_body(self): {"id": 1, "type": "NameLoad", "value": "print"}, {"id": 2, "type": "NameLoad", "value": "var"}, ], - ] + ] actual_ast = code_info.fileJson[0]["body"]["ast"] assert expected_ast == actual_ast def test_source_code_function(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\test_basic\\test_basic_function.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep +"test_basic" + os.path.sep + "test_basic_function.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = True cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) shutil.rmtree(output_dir) - expected_code = "def foo(arg1, arg2):\n print('Hello %s', arg1)\n return arg2" # Single double quote sensitive + expected_code = "def foo(arg1, arg2):\n print('Hello %s', arg1)\n return arg2" # Single double quote sensitive actual_code = code_info.fileJson[0]["functions"]["foo"]["source_code"] assert expected_code == actual_code - def test_source_code_method(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\test_basic\\test_basic_method.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_basic" + os.path.sep +"test_basic_method.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = True cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) shutil.rmtree(output_dir) expected_code = "def __init__(self, arg):\n self.arg = arg\n print('Hello %s' % self.arg)" @@ -584,25 +610,26 @@ def test_source_code_method(self): assert expected_code == actual_code def test_source_code_body(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\test_basic\\test_basic_body.py" - output_dir = "./output_dir" + input_path = test_data_path + os.path.sep + "test_basic" + os.path.sep + "test_basic_body.py" + output_dir = test_out_path + os.path.sep + "output_dir" control_flow = False data_flow = False parser = [] abstract_syntax_tree = False source_code = True cf_dir, json_dir = create_output_dirs(output_dir, control_flow) - code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(input_path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) shutil.rmtree(output_dir) expected_code = ["print('Hello world')", "print(var)"] actual_code = code_info.fileJson[0]["body"]["source_code"] assert expected_code == actual_code - def test_license_detection(self): - input_paths = ["D:\\inspect4py-main\\test\\test_files\Chowlk", "D:\\inspect4py-main\\test\\test_files\\pylops", "D:\\inspect4py-main\\test\\test_files\\somef"] - output_dir = "D:\\inspect4py-main\\test\\output_dir" + input_paths = [test_data_path + os.path.sep + "Chowlk", test_data_path + os.path.sep + "pylops", + test_data_path + os.path.sep + "somef"] + output_dir = test_out_path + os.path.sep + "output_dir" fig = False ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] @@ -633,8 +660,8 @@ def test_license_detection(self): def test_license_text_extraction(self): license_text = "A random license." - input_path = "D:\\inspect4py-main\\test\\test_files\\test_license_extraction" - output_dir = "D:\\inspect4py-main\\test\\output_dir" + input_path = test_data_path + os.path.sep + "test_license_extraction" + output_dir = test_out_path + os.path.sep + "output_dir" fig = False ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] @@ -654,15 +681,15 @@ def test_license_text_extraction(self): ignore_file_pattern, requirements, call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, - source_code, license_detection, readme, metadata, data_flow, symbol_table=symbol_table) + source_code, license_detection, readme, metadata, data_flow, + symbol_table=symbol_table) assert dir_info["license"]["extracted_text"] == license_text - def test_readme(self): - input_path = "D:\\inspect4py-main\\test\\test_files\\test_readme" - output_dir = "D:\\inspect4py-main\\test\\output_dir" - + input_path = test_data_path + os.path.sep + "test_readme" + output_dir = test_out_path + os.path.sep + "output_dir" + ignore_dir_pattern = [".", "__pycache__"] ignore_file_pattern = [".", "__pycache__"] requirements = False @@ -678,21 +705,22 @@ def test_readme(self): data_flow = False symbol_table = "" dir_info = invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, - call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, + call_list, control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, metadata, data_flow, symbol_table) expected_readme_files = { - f"{output_dir}\\test_readme\\README.md": "README.md in root dir\n", - f"{output_dir}\\test_readme\\subdir\\README.txt": "README.txt in subdir\n", - f"{output_dir}\\test_readme\\subdir\\subsubdir\\README.rst": "README.rst in subsubdir\n" + f"{output_dir}"+os.path.sep+"test_readme"+os.path.sep+"README.md": "README.md in root dir\n", + f"{output_dir}"+os.path.sep+"test_readme"+os.path.sep+"subdir"+os.path.sep+"README.txt": "README.txt in subdir\n", + f"{output_dir}"+os.path.sep+"test_readme"+os.path.sep+"subdir"+os.path.sep+"subsubdir"+os.path.sep+"README.rst": "README.rst in subsubdir\n" } actual_readme_files = dir_info["readme_files"] - assert expected_readme_files == actual_readme_files + assert expected_readme_files == actual_readme_files def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pattern, requirements, call_list, - control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, license_detection, readme, - metadata, data_flow, symbol_table): + control_flow, directory_tree, software_invocation, abstract_syntax_tree, source_code, + license_detection, readme, + metadata, data_flow, symbol_table): if data_flow: LANGUAGE = Language(symbol_table, "python") parser = Parser() @@ -722,7 +750,8 @@ def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pat relative_path = Path(subdir).relative_to(Path(input_path).parent) out_dir = str(Path(output_dir) / relative_path) cf_dir, json_dir = create_output_dirs(out_dir, control_flow) - code_info = CodeInspection(path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, data_flow, parser) + code_info = CodeInspection(path, cf_dir, json_dir, control_flow, abstract_syntax_tree, source_code, + data_flow, parser) if out_dir not in dir_info: dir_info[out_dir] = [code_info.fileJson[0]] else: @@ -766,8 +795,7 @@ def invoke_inspector(input_path, output_dir, ignore_dir_pattern, ignore_file_pat # Extract the first for software type. dir_info["software_type"] = rank_software_invocation(soft_invocation_info_list) if license_detection: - licenses_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), - "..\\inspect4py\\licenses") + licenses_path = str(Path(__file__).parent.parent / "inspect4py" / "licenses") license_text = extract_license(input_path) rank_list = detect_license(license_text, licenses_path) dir_info["license"] = {} From 21da57df3173c7a3ed84faefb5861cf748866d79 Mon Sep 17 00:00:00 2001 From: Daniel Garijo Date: Sat, 4 Mar 2023 23:31:29 +0100 Subject: [PATCH 18/18] compiled parsers for unix and win --- inspect4py/resources/python_unix.so | Bin 0 -> 491384 bytes inspect4py/resources/python_win.so | Bin 0 -> 408064 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 inspect4py/resources/python_unix.so create mode 100644 inspect4py/resources/python_win.so diff --git a/inspect4py/resources/python_unix.so b/inspect4py/resources/python_unix.so new file mode 100755 index 0000000000000000000000000000000000000000..cf3d771c7070ff0fa164e6eb5f60c06db7c8a2a5 GIT binary patch literal 491384 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 z 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¬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