63 lines
1.9 KiB
Python
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())
|