""" Конфигурация инструментария анализа legacy-систем. Все пороговые значения вынесены сюда для удобной настройки под конкретный проект. """ from dataclasses import dataclass, field from typing import List @dataclass class ThresholdConfig: """Пороговые значения метрик для классификации риска.""" # Цикломатическая сложность (McCabe, 1976) ccn_warn: int = 10 # > 10 — функция требует внимания ccn_critical: int = 20 # > 20 — функция является кандидатом на рефакторинг # Число строк кода без комментариев в функции nloc_warn: int = 50 nloc_critical: int = 100 # Число параметров функции params_warn: int = 5 params_critical: int = 8 # Исходящая связность модуля (fan-out) coupling_out_warn: int = 5 coupling_out_critical: int = 10 # Входящая связность модуля (fan-in) — высокое значение = нестабильный центральный модуль coupling_in_warn: int = 10 coupling_in_critical: int = 20 # Нестабильность (Instability = C_out / (C_in + C_out)), метрика Р. Мартина # 0 — абсолютно стабильный, 1 — абсолютно нестабильный instability_warn: float = 0.7 instability_critical: float = 0.9 # Доля "тяжёлых" функций в модуле (с CCN > ccn_warn) heavy_functions_ratio_warn: float = 0.3 heavy_functions_ratio_critical: float = 0.6 @dataclass class AnalyzerConfig: """Основная конфигурация анализатора.""" # Расширения файлов для анализа cpp_extensions: List[str] = field(default_factory=lambda: [ ".cpp", ".cxx", ".cc", ".c", ".hpp", ".hxx", ".h" ]) js_extensions: List[str] = field(default_factory=lambda: [ ".js", ".mjs", ".cjs", ".ts" ]) # Директории, которые игнорируются при обходе ignored_dirs: List[str] = field(default_factory=lambda: [ "node_modules", ".git", "build", "dist", "out", "__pycache__", ".venv", "venv", "vendor", "third_party" ]) # Путь к libclang (.so / .dylib / .dll). # None — автоматическое определение; если не найден — fallback на regex. libclang_path: str = None thresholds: ThresholdConfig = field(default_factory=ThresholdConfig) # Форматы отчётов output_formats: List[str] = field(default_factory=lambda: ["json", "html"]) output_dir: str = "legacy_report" # Инстанция по умолчанию — используется если конфиг не передан явно DEFAULT_CONFIG = AnalyzerConfig()