From 80b52fe77dbd030d29bdf10a5559cc25b463282f Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Tue, 3 Feb 2026 06:57:51 +0000 Subject: [PATCH] Add analyzers module (base, factory, Python, JavaScript) --- vibeguard/analyzers/factory.py | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 vibeguard/analyzers/factory.py diff --git a/vibeguard/analyzers/factory.py b/vibeguard/analyzers/factory.py new file mode 100644 index 0000000..cefd9d3 --- /dev/null +++ b/vibeguard/analyzers/factory.py @@ -0,0 +1,62 @@ +"""Analyzer factory for language detection.""" + +from pathlib import Path + +from vibeguard.analyzers.base import BaseAnalyzer +from vibeguard.analyzers.languages.python import PythonAnalyzer +from vibeguard.analyzers.languages.javascript import JavaScriptAnalyzer +from vibeguard.analyzers.languages.typescript import TypeScriptAnalyzer +from vibeguard.analyzers.languages.go import GoAnalyzer +from vibeguard.analyzers.languages.rust import RustAnalyzer + + +class AnalyzerFactory: + """Factory for creating language-specific analyzers.""" + + _analyzers: dict[str, type[BaseAnalyzer]] = { + "python": PythonAnalyzer, + "javascript": JavaScriptAnalyzer, + "typescript": TypeScriptAnalyzer, + "go": GoAnalyzer, + "rust": RustAnalyzer, + } + + _extension_map: dict[str, str] = { + ".py": "python", + ".js": "javascript", + ".jsx": "javascript", + ".ts": "typescript", + ".tsx": "typescript", + ".go": "go", + ".rs": "rust", + } + + @classmethod + def get_analyzer(cls, path: Path) -> BaseAnalyzer | None: + """Get an analyzer for the given file path.""" + ext = path.suffix.lower() + language = cls._extension_map.get(ext) + + if language and language in cls._analyzers: + return cls._analyzers[language]() + + return None + + @classmethod + def register_analyzer( + cls, language: str, analyzer_class: type[BaseAnalyzer], extensions: list[str] + ) -> None: + """Register a new analyzer for a language.""" + cls._analyzers[language] = analyzer_class + for ext in extensions: + cls._extension_map[ext] = language + + @classmethod + def get_supported_languages(cls) -> list[str]: + """Get list of supported language names.""" + return list(cls._analyzers.keys()) + + @classmethod + def get_supported_extensions(cls) -> list[str]: + """Get list of supported file extensions.""" + return list(cls._extension_map.keys())