From 26e2dc852d5461ca314b6099c2e6852664849a30 Mon Sep 17 00:00:00 2001 From: lxobr Date: Fri, 15 Nov 2024 09:26:41 +0100 Subject: [PATCH 01/13] feat: new repo-to-graph task --- cognee/tasks/repo_processor/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 cognee/tasks/repo_processor/__init__.py diff --git a/cognee/tasks/repo_processor/__init__.py b/cognee/tasks/repo_processor/__init__.py new file mode 100644 index 000000000..e69de29bb From ba83d71269d0af19e9b278b5e4b89b55add968f4 Mon Sep 17 00:00:00 2001 From: lxobr Date: Fri, 15 Nov 2024 09:28:13 +0100 Subject: [PATCH 02/13] feat: extract script dependencies --- .../local_script_dependencies.py | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 cognee/tasks/repo_processor/local_script_dependencies.py diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py new file mode 100644 index 000000000..244431212 --- /dev/null +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -0,0 +1,83 @@ +from typing import List, Dict, Optional +import jedi +import parso +import sys +from pathlib import Path +from parso.tree import BaseNode + + +def get_code_entities(node: parso.tree.NodeOrLeaf) -> List[Dict[str, any]]: + """ + Recursively extract code entities using parso. + """ + code_entity_list = [] + + if not hasattr(node, 'children'): + return code_entity_list + + # Process nodes of type 'name', which correspond to code entities + name_nodes = (child for child in node.children if child.type == 'name') + for name_node in name_nodes: + code_entity = { + 'name': name_node.value, + 'line': name_node.start_pos[0], + 'column': name_node.start_pos[1] + } + code_entity_list.append(code_entity) + + # Recursively process child nodes + for child in node.children: + code_entity_list.extend(get_code_entities(child)) + + return code_entity_list + + +def update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> None: + """ + Update a code_entity with (full_name, module_name, module_path) using Jedi + """ + results = script.goto(code_entity["line"], code_entity["column"], follow_imports=True) + if results: + code_entity["full_name"] = getattr(results[0], "full_name", None) + code_entity["module_name"] = getattr(results[0], "module_name", None) + code_entity["module_path"] = getattr(results[0], "module_path", None) + + +def get_local_script_dependencies(script_path: str, repo_path: Optional[str] = None) -> List[str]: + """ + Extract and return a list of unique module paths that the script depends on. + """ + if repo_path: + sys.path.insert(0, str(Path(repo_path).resolve())) + + with open(script_path, "r") as file: + source_code = file.read() + + script = jedi.Script(code=source_code, path=script_path) + + tree = parso.parse(source_code) + code_entities = get_code_entities(tree) + + for code_entity in code_entities: + update_code_entity(script, code_entity) + + module_paths = { + entity.get("module_path") + for entity in code_entities + if entity.get("module_path") + } + if repo_path: + repo_path_resolved = str(Path(repo_path).resolve(strict=False)) + module_paths = {path for path in module_paths if str(path).startswith(repo_path_resolved)} + + return sorted(path for path in module_paths if path) + +if __name__ == "__main__": + # Simple execution example, use absolute paths + script_path = ".../cognee/examples/python/simple_example.py" + repo_path = ".../cognee" + + dependencies = get_local_script_dependencies(script_path, repo_path) + print("Dependencies:") + for dependency in dependencies: + print(dependency) \ No newline at end of file From e148d32c14c19acc8d818b732186aecd48e59dd3 Mon Sep 17 00:00:00 2001 From: lxobr Date: Fri, 15 Nov 2024 17:59:10 +0100 Subject: [PATCH 03/13] refactor: Modify sys.path in context manager --- .../local_script_dependencies.py | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index 244431212..4beb584f4 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -1,3 +1,4 @@ +from contextlib import contextmanager from typing import List, Dict, Optional import jedi import parso @@ -6,7 +7,17 @@ from pathlib import Path from parso.tree import BaseNode -def get_code_entities(node: parso.tree.NodeOrLeaf) -> List[Dict[str, any]]: +@contextmanager +def add_sys_path(path): + original_sys_path = sys.path.copy() + sys.path.insert(0, path) + try: + yield + finally: + sys.path = original_sys_path + + +def _get_code_entities(node: parso.tree.NodeOrLeaf) -> List[Dict[str, any]]: """ Recursively extract code entities using parso. """ @@ -27,12 +38,12 @@ def get_code_entities(node: parso.tree.NodeOrLeaf) -> List[Dict[str, any]]: # Recursively process child nodes for child in node.children: - code_entity_list.extend(get_code_entities(child)) + code_entity_list.extend(_get_code_entities(child)) return code_entity_list -def update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> None: +def _update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> None: """ Update a code_entity with (full_name, module_name, module_path) using Jedi """ @@ -42,35 +53,38 @@ def update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> None code_entity["module_name"] = getattr(results[0], "module_name", None) code_entity["module_path"] = getattr(results[0], "module_path", None) - -def get_local_script_dependencies(script_path: str, repo_path: Optional[str] = None) -> List[str]: - """ - Extract and return a list of unique module paths that the script depends on. - """ - if repo_path: - sys.path.insert(0, str(Path(repo_path).resolve())) - +def _extract_dependencies(script_path: str) -> List[str]: with open(script_path, "r") as file: source_code = file.read() script = jedi.Script(code=source_code, path=script_path) tree = parso.parse(source_code) - code_entities = get_code_entities(tree) + code_entities = _get_code_entities(tree) for code_entity in code_entities: - update_code_entity(script, code_entity) + _update_code_entity(script, code_entity) module_paths = { entity.get("module_path") for entity in code_entities if entity.get("module_path") } - if repo_path: - repo_path_resolved = str(Path(repo_path).resolve(strict=False)) - module_paths = {path for path in module_paths if str(path).startswith(repo_path_resolved)} - return sorted(path for path in module_paths if path) + return sorted(str(path) for path in module_paths) + +def get_local_script_dependencies(script_path: str, repo_path: Optional[str] = None) -> List[str]: + """ + Extract and return a list of unique module paths that the script depends on. + """ + if repo_path: + repo_path_resolved = str(Path(repo_path).resolve()) + with add_sys_path(repo_path_resolved): + dependencies = _extract_dependencies(script_path) + dependencies = [path for path in dependencies if path.startswith(repo_path_resolved)] + else: + dependencies = _extract_dependencies(script_path) + return dependencies if __name__ == "__main__": # Simple execution example, use absolute paths From 2be2b802c0ec3d69e7a900b092570d0e52359dd0 Mon Sep 17 00:00:00 2001 From: lxobr Date: Fri, 15 Nov 2024 17:59:51 +0100 Subject: [PATCH 04/13] feat: Safely handle file read errors --- cognee/tasks/repo_processor/local_script_dependencies.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index 4beb584f4..8acdbff0c 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -54,8 +54,12 @@ def _update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> Non code_entity["module_path"] = getattr(results[0], "module_path", None) def _extract_dependencies(script_path: str) -> List[str]: - with open(script_path, "r") as file: - source_code = file.read() + try: + with open(script_path, "r") as file: + source_code = file.read() + except IOError as e: + print(f"Error opening {script_path}: {e}") + return [] script = jedi.Script(code=source_code, path=script_path) From 742792b6c10fe5c8ef88e1060ff04614baf27cde Mon Sep 17 00:00:00 2001 From: lxobr Date: Fri, 15 Nov 2024 18:02:35 +0100 Subject: [PATCH 05/13] refactor: Remove a comment --- cognee/tasks/repo_processor/local_script_dependencies.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index 8acdbff0c..bd856c7d5 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -26,7 +26,6 @@ def _get_code_entities(node: parso.tree.NodeOrLeaf) -> List[Dict[str, any]]: if not hasattr(node, 'children'): return code_entity_list - # Process nodes of type 'name', which correspond to code entities name_nodes = (child for child in node.children if child.type == 'name') for name_node in name_nodes: code_entity = { From 4bf2281cd543ea6eb867c696bfbba38848327fac Mon Sep 17 00:00:00 2001 From: lxobr Date: Fri, 15 Nov 2024 18:24:29 +0100 Subject: [PATCH 06/13] feat: Enable async processing --- .../repo_processor/local_script_dependencies.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index bd856c7d5..17120a32a 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -1,5 +1,7 @@ from contextlib import contextmanager from typing import List, Dict, Optional +import asyncio +import aiofiles import jedi import parso import sys @@ -52,10 +54,10 @@ def _update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> Non code_entity["module_name"] = getattr(results[0], "module_name", None) code_entity["module_path"] = getattr(results[0], "module_path", None) -def _extract_dependencies(script_path: str) -> List[str]: +async def _extract_dependencies(script_path: str) -> List[str]: try: - with open(script_path, "r") as file: - source_code = file.read() + async with aiofiles.open(script_path, "r") as file: + source_code = await file.read() except IOError as e: print(f"Error opening {script_path}: {e}") return [] @@ -76,17 +78,17 @@ def _extract_dependencies(script_path: str) -> List[str]: return sorted(str(path) for path in module_paths) -def get_local_script_dependencies(script_path: str, repo_path: Optional[str] = None) -> List[str]: +async def get_local_script_dependencies(script_path: str, repo_path: Optional[str] = None) -> List[str]: """ Extract and return a list of unique module paths that the script depends on. """ if repo_path: repo_path_resolved = str(Path(repo_path).resolve()) with add_sys_path(repo_path_resolved): - dependencies = _extract_dependencies(script_path) + dependencies = await _extract_dependencies(script_path) dependencies = [path for path in dependencies if path.startswith(repo_path_resolved)] else: - dependencies = _extract_dependencies(script_path) + dependencies = await _extract_dependencies(script_path) return dependencies if __name__ == "__main__": @@ -94,7 +96,8 @@ if __name__ == "__main__": script_path = ".../cognee/examples/python/simple_example.py" repo_path = ".../cognee" - dependencies = get_local_script_dependencies(script_path, repo_path) + dependencies = asyncio.run(get_local_script_dependencies(script_path, repo_path)) + print("Dependencies:") for dependency in dependencies: print(dependency) \ No newline at end of file From 3aadda9a890e9249acd70a4224db03d45bcbc179 Mon Sep 17 00:00:00 2001 From: lxobr Date: Mon, 18 Nov 2024 10:05:38 +0100 Subject: [PATCH 07/13] feat: Add argparse for testing purposes --- .../local_script_dependencies.py | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index 17120a32a..47839f8cf 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -1,14 +1,15 @@ -from contextlib import contextmanager -from typing import List, Dict, Optional +import argparse import asyncio +import sys +from contextlib import contextmanager +from pathlib import Path +from typing import List, Dict, Optional + import aiofiles import jedi import parso -import sys -from pathlib import Path from parso.tree import BaseNode - @contextmanager def add_sys_path(path): original_sys_path = sys.path.copy() @@ -91,13 +92,23 @@ async def get_local_script_dependencies(script_path: str, repo_path: Optional[st dependencies = await _extract_dependencies(script_path) return dependencies + if __name__ == "__main__": - # Simple execution example, use absolute paths - script_path = ".../cognee/examples/python/simple_example.py" - repo_path = ".../cognee" + parser = argparse.ArgumentParser(description="Get local script dependencies.") + + # Suggested path: .../cognee/examples/python/simple_example.py + parser.add_argument("script_path", type=str, help="Absolute path to the Python script file") + + # Suggested path: .../cognee + parser.add_argument("repo_path", type=str, help="Absolute path to the repository root") + + args = parser.parse_args() + + script_path = args.script_path + repo_path = args.repo_path dependencies = asyncio.run(get_local_script_dependencies(script_path, repo_path)) print("Dependencies:") for dependency in dependencies: - print(dependency) \ No newline at end of file + print(dependency) From 1a1452e177960de279b92a09617e8ba50501f4ed Mon Sep 17 00:00:00 2001 From: lxobr Date: Mon, 18 Nov 2024 16:16:59 +0100 Subject: [PATCH 08/13] fix: Add error handling for Jedi analysis, with debug mode --- .../repo_processor/local_script_dependencies.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index 47839f8cf..517a2d43d 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -49,11 +49,16 @@ def _update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> Non """ Update a code_entity with (full_name, module_name, module_path) using Jedi """ - results = script.goto(code_entity["line"], code_entity["column"], follow_imports=True) - if results: - code_entity["full_name"] = getattr(results[0], "full_name", None) - code_entity["module_name"] = getattr(results[0], "module_name", None) - code_entity["module_path"] = getattr(results[0], "module_path", None) + try: + results = script.goto(code_entity["line"], code_entity["column"], follow_imports=True) + if results: + result = results[0] + code_entity["full_name"] = getattr(result, "full_name", None) + code_entity["module_name"] = getattr(result, "module_name", None) + code_entity["module_path"] = getattr(result, "module_path", None) + except Exception as e: + # logging.warning(f"Failed to analyze code entity {code_entity['name']}: {e}") + print(f"Failed to analyze code entity {code_entity['name']}: {e}") async def _extract_dependencies(script_path: str) -> List[str]: try: @@ -63,6 +68,7 @@ async def _extract_dependencies(script_path: str) -> List[str]: print(f"Error opening {script_path}: {e}") return [] + jedi.set_debug_function(lambda color, str_out: None) script = jedi.Script(code=source_code, path=script_path) tree = parso.parse(source_code) From 2417d18607096622f4437c3299602c2d2dc5d4ba Mon Sep 17 00:00:00 2001 From: lxobr Date: Tue, 19 Nov 2024 08:34:06 +0100 Subject: [PATCH 09/13] fix: Add logging instead of print --- cognee/tasks/repo_processor/__init__.py | 3 +++ cognee/tasks/repo_processor/local_script_dependencies.py | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cognee/tasks/repo_processor/__init__.py b/cognee/tasks/repo_processor/__init__.py index e69de29bb..94dab6b3f 100644 --- a/cognee/tasks/repo_processor/__init__.py +++ b/cognee/tasks/repo_processor/__init__.py @@ -0,0 +1,3 @@ +import logging + +logger = logging.getLogger("task:repo_processor") diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index 517a2d43d..18576b359 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -10,6 +10,9 @@ import jedi import parso from parso.tree import BaseNode +from cognee.tasks.repo_processor import logger + + @contextmanager def add_sys_path(path): original_sys_path = sys.path.copy() @@ -58,14 +61,15 @@ def _update_code_entity(script: jedi.Script, code_entity: Dict[str, any]) -> Non code_entity["module_path"] = getattr(result, "module_path", None) except Exception as e: # logging.warning(f"Failed to analyze code entity {code_entity['name']}: {e}") - print(f"Failed to analyze code entity {code_entity['name']}: {e}") + logger.error(f"Failed to analyze code entity {code_entity['name']}: {e}") + async def _extract_dependencies(script_path: str) -> List[str]: try: async with aiofiles.open(script_path, "r") as file: source_code = await file.read() except IOError as e: - print(f"Error opening {script_path}: {e}") + logger.error(f"Error opening {script_path}: {e}") return [] jedi.set_debug_function(lambda color, str_out: None) From ebb811af8745f1ebaf9915d387beaf234094250e Mon Sep 17 00:00:00 2001 From: lxobr Date: Tue, 19 Nov 2024 09:08:54 +0100 Subject: [PATCH 10/13] fix: Filter out None values in module paths --- cognee/tasks/repo_processor/local_script_dependencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index 18576b359..a39680521 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -84,7 +84,7 @@ async def _extract_dependencies(script_path: str) -> List[str]: module_paths = { entity.get("module_path") for entity in code_entities - if entity.get("module_path") + if entity.get("module_path") is not None } return sorted(str(path) for path in module_paths) From 8bc26bba977470fbfff590bc75b836503358acaf Mon Sep 17 00:00:00 2001 From: lxobr Date: Tue, 19 Nov 2024 09:09:30 +0100 Subject: [PATCH 11/13] fix: Add error handling for path conversion --- .../tasks/repo_processor/local_script_dependencies.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index a39680521..f0c3b246f 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -87,7 +87,15 @@ async def _extract_dependencies(script_path: str) -> List[str]: if entity.get("module_path") is not None } - return sorted(str(path) for path in module_paths) + str_paths = [] + for module_path in module_paths: + try: + str_paths.append(str(module_path)) + except Exception as e: + logger.error(f"Error converting path to string: {e}") + + return sorted(str_paths) + async def get_local_script_dependencies(script_path: str, repo_path: Optional[str] = None) -> List[str]: """ From 263ecb914951b22da5431ed4c4844508c21aceff Mon Sep 17 00:00:00 2001 From: lxobr Date: Tue, 19 Nov 2024 09:10:04 +0100 Subject: [PATCH 12/13] fix: Add input validation and error handling for paths --- .../local_script_dependencies.py | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/local_script_dependencies.py index f0c3b246f..ed11640da 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/local_script_dependencies.py @@ -101,14 +101,29 @@ async def get_local_script_dependencies(script_path: str, repo_path: Optional[st """ Extract and return a list of unique module paths that the script depends on. """ - if repo_path: - repo_path_resolved = str(Path(repo_path).resolve()) - with add_sys_path(repo_path_resolved): - dependencies = await _extract_dependencies(script_path) - dependencies = [path for path in dependencies if path.startswith(repo_path_resolved)] - else: + try: + script_path = Path(script_path).resolve(strict=True) + except (FileNotFoundError, PermissionError) as e: + logger.error(f"Error resolving script path: {e}") + return [] + + if not repo_path: + return await _extract_dependencies(script_path) + + try: + repo_path = Path(repo_path).resolve(strict=True) + except (FileNotFoundError, PermissionError) as e: + logger.warning(f"Error resolving repo path: {e}. Proceeding without repo_path.") + return await _extract_dependencies(script_path) + + if not script_path.is_relative_to(repo_path): + logger.warning(f"Script {script_path} not in repo {repo_path}. Proceeding without repo_path.") + return await _extract_dependencies(script_path) + + with add_sys_path(str(repo_path)): dependencies = await _extract_dependencies(script_path) - return dependencies + + return [path for path in dependencies if path.startswith(str(repo_path))] if __name__ == "__main__": From f27dc0c91a1ee13c193adeedcbd202be25eb3d3f Mon Sep 17 00:00:00 2001 From: lxobr Date: Tue, 19 Nov 2024 14:33:08 +0100 Subject: [PATCH 13/13] fix: Rename, extract checker into a separate script --- .../code/get_local_dependencies_checker.py | 20 ++++++++++++++++++ ...endencies.py => get_local_dependencies.py} | 21 ------------------- 2 files changed, 20 insertions(+), 21 deletions(-) create mode 100644 cognee/tasks/code/get_local_dependencies_checker.py rename cognee/tasks/repo_processor/{local_script_dependencies.py => get_local_dependencies.py} (85%) diff --git a/cognee/tasks/code/get_local_dependencies_checker.py b/cognee/tasks/code/get_local_dependencies_checker.py new file mode 100644 index 000000000..5d465254a --- /dev/null +++ b/cognee/tasks/code/get_local_dependencies_checker.py @@ -0,0 +1,20 @@ +import argparse +import asyncio +from cognee.tasks.repo_processor.get_local_dependencies import get_local_script_dependencies + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Get local script dependencies.") + + # Suggested path: .../cognee/examples/python/simple_example.py + parser.add_argument("script_path", type=str, help="Absolute path to the Python script file") + + # Suggested path: .../cognee + parser.add_argument("repo_path", type=str, help="Absolute path to the repository root") + + args = parser.parse_args() + + dependencies = asyncio.run(get_local_script_dependencies(args.script_path, args.repo_path)) + + print("Dependencies:") + for dependency in dependencies: + print(dependency) diff --git a/cognee/tasks/repo_processor/local_script_dependencies.py b/cognee/tasks/repo_processor/get_local_dependencies.py similarity index 85% rename from cognee/tasks/repo_processor/local_script_dependencies.py rename to cognee/tasks/repo_processor/get_local_dependencies.py index ed11640da..fb4c68710 100644 --- a/cognee/tasks/repo_processor/local_script_dependencies.py +++ b/cognee/tasks/repo_processor/get_local_dependencies.py @@ -124,24 +124,3 @@ async def get_local_script_dependencies(script_path: str, repo_path: Optional[st dependencies = await _extract_dependencies(script_path) return [path for path in dependencies if path.startswith(str(repo_path))] - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Get local script dependencies.") - - # Suggested path: .../cognee/examples/python/simple_example.py - parser.add_argument("script_path", type=str, help="Absolute path to the Python script file") - - # Suggested path: .../cognee - parser.add_argument("repo_path", type=str, help="Absolute path to the repository root") - - args = parser.parse_args() - - script_path = args.script_path - repo_path = args.repo_path - - dependencies = asyncio.run(get_local_script_dependencies(script_path, repo_path)) - - print("Dependencies:") - for dependency in dependencies: - print(dependency)