impact.py

Code Hygiene Score: 100

Keine Issues gefunden.

Dependencies 1

Funktionen 1

Code

"""code_impact - Impact-Analyse bei Klassenaenderung."""

from db import execute_query


def register_impact_tool(mcp):
    """Registriert code_impact Tool."""

    @mcp.tool()
    def code_impact(fqcn: str) -> dict:
        """
        Analysiert den Impact bei Aenderung einer Klasse.

        Args:
            fqcn: Vollstaendiger Klassenname (z.B. Controller\\HomeController)

        Returns:
            Dict mit fqcn, direct_dependents, risk_level, affected_namespaces, recommendation
        """
        # Dependents laden (gleiche Query wie code_dependents)
        sql = """
            SELECT ca.id as file_id, ca.file_name, ca.namespace, cd.dependency_type
            FROM code_dependencies cd
            JOIN code_analysis ca ON cd.analysis_id = ca.id
            WHERE cd.target_fqcn = %s
            ORDER BY ca.file_name
        """
        dependents = execute_query(sql, (fqcn,))
        count = len(dependents)

        # Risk Level berechnen
        if count == 0:
            risk_level = "low"
            recommendation = "Keine Abhaengigkeiten. Aenderungen sicher."
        elif count <= 5:
            risk_level = "medium"
            recommendation = f"Moderate Abhaengigkeiten ({count}). Aenderungen mit Vorsicht."
        elif count <= 15:
            risk_level = "high"
            recommendation = f"Viele Abhaengigkeiten ({count}). Gruendliche Tests empfohlen."
        else:
            risk_level = "critical"
            recommendation = f"Kritisch viele Abhaengigkeiten ({count}). Breaking Changes vermeiden!"

        # Betroffene Namespaces sammeln
        affected_namespaces = list(set(
            d["namespace"] for d in dependents if d["namespace"]
        ))
        affected_namespaces.sort()

        # Dependency-Typen gruppieren
        by_type = {}
        for d in dependents:
            t = d["dependency_type"]
            if t not in by_type:
                by_type[t] = 0
            by_type[t] += 1

        return {
            "fqcn": fqcn,
            "direct_dependents": count,
            "risk_level": risk_level,
            "affected_namespaces": affected_namespaces,
            "dependents_by_type": by_type,
            "recommendation": recommendation,
        }
← Übersicht