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()
|