Files
vibeguard/vibeguard/analyzers/factory.py
7000pctAUTO 80b52fe77d
Some checks failed
CI / test (push) Has been cancelled
CI / build (push) Has been cancelled
Add analyzers module (base, factory, Python, JavaScript)
2026-02-03 06:57:51 +00:00

63 lines
1.9 KiB
Python

"""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())