75 lines
3.0 KiB
Python
75 lines
3.0 KiB
Python
"""
|
||
Конфигурация инструментария анализа 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()
|