Add core context generator module
This commit is contained in:
99
src/contextgen/context_generator.py
Normal file
99
src/contextgen/context_generator.py
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
"""Context generator that aggregates all analysis results."""
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from contextgen.analyzers.convention_extractor import ConventionExtractor
|
||||||
|
from contextgen.analyzers.framework_detector import FrameworkDetector
|
||||||
|
from contextgen.analyzers.language_detector import LanguageDetector
|
||||||
|
from contextgen.analyzers.project_analyzer import ProjectAnalyzer
|
||||||
|
from contextgen.analyzers.setup_generator import SetupInstructionGenerator
|
||||||
|
from contextgen.formatters.json_formatter import JSONFormatter
|
||||||
|
from contextgen.formatters.yaml_formatter import YAMLFormatter
|
||||||
|
|
||||||
|
|
||||||
|
class ContextGenerator:
|
||||||
|
"""Generates comprehensive context for a project."""
|
||||||
|
|
||||||
|
def __init__(self, project_path: Path):
|
||||||
|
self.project_path = Path(project_path).resolve()
|
||||||
|
self.project_name = self.project_path.name
|
||||||
|
|
||||||
|
def generate(self) -> dict[str, Any]:
|
||||||
|
"""Run all analyzers and generate context."""
|
||||||
|
project_info = self._analyze_project()
|
||||||
|
conventions = self._analyze_conventions()
|
||||||
|
setup = self._analyze_setup()
|
||||||
|
|
||||||
|
context = {
|
||||||
|
"project": {
|
||||||
|
"name": self.project_name,
|
||||||
|
"description": f"Auto-generated context for {self.project_name}",
|
||||||
|
"path": str(self.project_path),
|
||||||
|
"timestamp": datetime.utcnow().isoformat() + "Z",
|
||||||
|
},
|
||||||
|
"analysis": project_info,
|
||||||
|
"structure": {
|
||||||
|
"file_tree": project_info.get("file_tree", {}),
|
||||||
|
"key_files": project_info.get("key_files", {}),
|
||||||
|
"total_files": project_info.get("total_files", 0),
|
||||||
|
"total_dirs": project_info.get("total_dirs", 0),
|
||||||
|
},
|
||||||
|
"conventions": conventions,
|
||||||
|
"setup": setup,
|
||||||
|
}
|
||||||
|
|
||||||
|
return context
|
||||||
|
|
||||||
|
def _analyze_project(self) -> dict[str, Any]:
|
||||||
|
"""Analyze project structure and tech stack."""
|
||||||
|
results: dict[str, Any] = {}
|
||||||
|
|
||||||
|
project_analyzer = ProjectAnalyzer(self.project_path)
|
||||||
|
results.update(project_analyzer.analyze())
|
||||||
|
|
||||||
|
lang_detector = LanguageDetector(self.project_path)
|
||||||
|
results.update(lang_detector.analyze())
|
||||||
|
|
||||||
|
fw_detector = FrameworkDetector(self.project_path)
|
||||||
|
results.update(fw_detector.analyze())
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
def _analyze_conventions(self) -> dict[str, Any]:
|
||||||
|
"""Analyze coding conventions."""
|
||||||
|
extractor = ConventionExtractor(self.project_path)
|
||||||
|
return extractor.analyze()
|
||||||
|
|
||||||
|
def _analyze_setup(self) -> dict[str, Any]:
|
||||||
|
"""Generate setup instructions."""
|
||||||
|
generator = SetupInstructionGenerator(self.project_path)
|
||||||
|
return generator.generate()
|
||||||
|
|
||||||
|
def save(
|
||||||
|
self, output_path: Path, format: str = "json"
|
||||||
|
) -> None:
|
||||||
|
"""Generate and save context to file."""
|
||||||
|
context = self.generate()
|
||||||
|
|
||||||
|
if format == "json":
|
||||||
|
formatter = JSONFormatter(output_path)
|
||||||
|
elif format == "yaml":
|
||||||
|
formatter = YAMLFormatter(output_path)
|
||||||
|
else:
|
||||||
|
raise ValueError(f"Unknown format: {format}")
|
||||||
|
|
||||||
|
formatter.save(context)
|
||||||
|
|
||||||
|
def generate_from_template(
|
||||||
|
self, template_name: str, template_path: Path | None = None
|
||||||
|
) -> str:
|
||||||
|
"""Generate context using a custom template."""
|
||||||
|
from contextgen.templates.engine import TemplateEngine
|
||||||
|
|
||||||
|
context = self.generate()
|
||||||
|
context["timestamp"] = datetime.utcnow().isoformat() + "Z"
|
||||||
|
|
||||||
|
engine = TemplateEngine(template_path)
|
||||||
|
return engine.render(template_name, context)
|
||||||
Reference in New Issue
Block a user