diff --git a/src/auto_readme/parsers/__init__.py b/src/auto_readme/parsers/__init__.py new file mode 100644 index 0000000..4fa0427 --- /dev/null +++ b/src/auto_readme/parsers/__init__.py @@ -0,0 +1,56 @@ +"""Dependency parsers for the Auto README Generator.""" + +from abc import ABC, abstractmethod +from pathlib import Path +from typing import Optional, Protocol + +from ..models import Dependency + + +class DependencyParser(Protocol): + """Protocol for dependency parsers.""" + + def can_parse(self, path: Path) -> bool: ... + def parse(self, path: Path) -> list[Dependency]: ... + + +class BaseParser(ABC): + """Abstract base class for dependency parsers.""" + + @abstractmethod + def can_parse(self, path: Path) -> bool: + """Check if this parser can handle the given file.""" + pass + + @abstractmethod + def parse(self, path: Path) -> list[Dependency]: + """Parse dependencies from the file.""" + pass + + def _normalize_version(self, version: Optional[str]) -> Optional[str]: + """Normalize version string.""" + if version is None: + return None + version = version.strip() + if version.startswith("^") or version.startswith("~"): + version = version[1:] + if version.startswith(">="): + version = version[2:] + return version if version else None + + +from .python_parser import PythonDependencyParser +from .javascript_parser import JavaScriptDependencyParser +from .go_parser import GoDependencyParser +from .rust_parser import RustDependencyParser +from .parser_factory import DependencyParserFactory + +__all__ = [ + "DependencyParser", + "BaseParser", + "PythonDependencyParser", + "JavaScriptDependencyParser", + "GoDependencyParser", + "RustDependencyParser", + "DependencyParserFactory", +] \ No newline at end of file