From bcb3850d510af10cee3866b3ff8daa55ca27a261 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Fri, 30 Jan 2026 12:19:01 +0000 Subject: [PATCH] Initial commit: CodeMap v0.1.0 - CLI tool for code analysis and diagram generation --- codemap/parsers/python_parser.py | 55 ++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 codemap/parsers/python_parser.py diff --git a/codemap/parsers/python_parser.py b/codemap/parsers/python_parser.py new file mode 100644 index 0000000..e4b5ed9 --- /dev/null +++ b/codemap/parsers/python_parser.py @@ -0,0 +1,55 @@ +import ast +from pathlib import Path +from typing import List, Set +from codemap.parsers.base import BaseParser, Dependency, ParsedFile + + +class PythonParser(BaseParser): + supported_extensions = [".py", ".pyi"] + + def parse(self, file_path: Path) -> ParsedFile: + module_name = self.extract_module_name(file_path) + dependencies: List[Dependency] = [] + + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + tree = ast.parse(content, filename=str(file_path)) + except (SyntaxError, UnicodeDecodeError) as e: + return ParsedFile( + file_path=file_path, + module_name=module_name, + dependencies=[], + file_type="python" + ) + + for node in ast.walk(tree): + if isinstance(node, ast.Import): + for alias in node.names: + dep = Dependency( + module_name=alias.name, + file_path=file_path, + line_number=node.lineno, + alias=alias.asname + ) + dependencies.append(dep) + elif isinstance(node, ast.ImportFrom): + if node.module: + for alias in node.names: + dep = Dependency( + module_name=node.module, + file_path=file_path, + line_number=node.lineno, + alias=alias.asname + ) + dependencies.append(dep) + + return ParsedFile( + file_path=file_path, + module_name=module_name, + dependencies=dependencies, + file_type="python" + ) + + def extract_module_name(self, file_path: Path) -> str: + return file_path.stem