arch-researcher/analyzer.py

91 lines
3.7 KiB
Python
Raw Normal View History

2026-04-27 18:44:22 +00:00
"""
Главный фасад инструментария Analyzer.
Orchestrates полный pipeline анализа:
Collector MetricsEngine DependencyAnalyzer DecisionEngine Reporter
Использование:
from analyzer import Analyzer, AnalyzerConfig
config = AnalyzerConfig(output_dir="my_report")
report = Analyzer(config).run("/path/to/project")
"""
import logging
import sys
from pathlib import Path
from config import AnalyzerConfig, DEFAULT_CONFIG
from models import AnalysisReport
from core.collector import Collector
from core.metrics_engine import MetricsEngine
from core.dependency_analyzer import DependencyAnalyzer
from core.decision_engine import DecisionEngine
from reporters.reporter import Reporter
logger = logging.getLogger(__name__)
class Analyzer:
"""
Главный оркестратор анализа унаследованной системы.
Реализует принцип разделения ответственности (SRP):
каждый шаг анализа выполняется специализированным модулем,
Analyzer лишь координирует их взаимодействие.
"""
def __init__(self, config: AnalyzerConfig = DEFAULT_CONFIG):
self.config = config
self._collector = Collector(config)
self._metrics = MetricsEngine(config)
self._dependencies = DependencyAnalyzer(config)
self._decisions = DecisionEngine(config)
self._reporter = Reporter(config)
def run(self, project_root: str) -> AnalysisReport:
"""
Выполняет полный цикл анализа проекта.
:param project_root: путь к корневой директории анализируемой системы
:returns: заполненный AnalysisReport
"""
root = str(Path(project_root).resolve())
logger.info("=" * 60)
logger.info("Запуск анализа: %s", root)
logger.info("=" * 60)
# 1. Сбор файловой структуры
logger.info("[1/4] Collector — обход файловой структуры...")
modules = self._collector.collect(root)
if not modules:
logger.warning("Не найдено ни одного анализируемого файла в %s", root)
# 2. Вычисление метрик сложности
logger.info("[2/4] MetricsEngine — вычисление метрик сложности...")
modules = self._metrics.analyze(modules)
# 3. Построение графа зависимостей
logger.info("[3/4] DependencyAnalyzer — построение графа зависимостей...")
modules, cycles = self._dependencies.analyze(modules, root)
# 4. Принятие решений
logger.info("[4/4] DecisionEngine — классификация риска и выбор стратегии...")
report = AnalysisReport(project_root=root, modules=modules)
report = self._decisions.analyze(report, cycles)
# 5. Формирование отчётов
logger.info("[5/5] Reporter — формирование отчётов...")
created_files = self._reporter.generate(report)
logger.info("=" * 60)
logger.info("Анализ завершён. Системный риск: %s", report.system_risk_level.name)
logger.info("Рекомендуемая стратегия: %s", report.recommended_system_strategy.name)
logger.info("Отчёты созданы:")
for f in created_files:
logger.info(" %s", f)
logger.info("=" * 60)
return report