From c5a0f55e7045ee5dfa12677de20c9107727d91df Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Wed, 4 Feb 2026 14:56:29 +0000 Subject: [PATCH] Add package manager parsers (npm, pip, go, cargo) --- src/depcheck/parsers/__init__.py | 72 ++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/depcheck/parsers/__init__.py diff --git a/src/depcheck/parsers/__init__.py b/src/depcheck/parsers/__init__.py new file mode 100644 index 0000000..04ba980 --- /dev/null +++ b/src/depcheck/parsers/__init__.py @@ -0,0 +1,72 @@ +"""Base parser class and parser registry.""" + +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Optional + +from depcheck.models import Dependency, PackageManager + + +class Parser(ABC): + """Base class for package dependency parsers.""" + + package_manager: PackageManager = PackageManager.PIP + + @abstractmethod + def parse(self, file_path: Path) -> list[Dependency]: + """Parse a dependency file and return list of dependencies.""" + pass + + @abstractmethod + def supports_file(self, file_path: Path) -> bool: + """Check if this parser supports the given file.""" + pass + + def get_file_patterns(self) -> list[str]: + """Get file patterns this parser handles.""" + return [] + + +class ParserRegistry: + """Registry of available parsers.""" + + def __init__(self): + self._parsers: list[Parser] = [] + + def register(self, parser: Parser) -> None: + """Register a parser.""" + self._parsers.append(parser) + + def get_parser(self, file_path: Path) -> Optional[Parser]: + """Get parser for a specific file.""" + for parser in self._parsers: + if parser.supports_file(file_path): + return parser + return None + + def get_all_parsers(self) -> list[Parser]: + """Get all registered parsers.""" + return self._parsers + + def detect_package_manager(self, directory: Path) -> Optional[PackageManager]: + """Detect package manager based on file existence.""" + for parser in self._parsers: + for pattern in parser.get_file_patterns(): + if (directory / pattern).exists(): + return parser.package_manager + return None + + +def create_parser_registry() -> ParserRegistry: + """Create and register all available parsers.""" + from depcheck.parsers.npm import NpmParser + from depcheck.parsers.pip import PipParser + from depcheck.parsers.go import GoParser + from depcheck.parsers.cargo import CargoParser + + registry = ParserRegistry() + registry.register(NpmParser()) + registry.register(PipParser()) + registry.register(GoParser()) + registry.register(CargoParser()) + return registry