Add analyzers module (base, factory, Python, JavaScript)
This commit is contained in:
62
vibeguard/analyzers/factory.py
Normal file
62
vibeguard/analyzers/factory.py
Normal file
@@ -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())
|
||||||
Reference in New Issue
Block a user