arch-researcher/config.py
2026-04-27 23:44:22 +05:00

75 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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