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