arch-researcher/config.py

75 lines
3.0 KiB
Python
Raw Normal View History

2026-04-27 18:44:22 +00:00
"""
Конфигурация инструментария анализа 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()