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
|