""" Главный фасад инструментария — 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