arch-researcher/analyzer.py
2026-04-27 23:44:22 +05:00

91 lines
3.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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