Files

5.3 KiB
Raw Permalink Blame History

Phase 7 Quality Review 07b: Type-Check (mypy)

Projekt: CRM-System (/a0/.a0/crm-system/) Tool: mypy v2.1.0 (mit --ignore-missing-imports) Datum: 2026-06-04 02:28 UTC Status: ⚠️ WARN 137 Fehler in 32 Dateien (53 geprüft)

Zusammenfassung

Metrik Wert
Geprüfte Quell-Dateien 53
Dateien mit Fehlern 32
Total mypy Errors 137
Kritische Typ-Fehler (Bugs) 3
Style/Pattern-Fehler 134

Fehler-Kategorien und Analyse

1. Class cannot subclass "BaseModel" / DeclarativeBase / BaseSettings 28x

Schweregrad: Warning

Diese Fehler treten in allen Pydantic-Schema-Files und SQLAlchemy-Base-Klassen auf. Sie sind KEIN Bug, sondern ein mypy-Konfigurationsproblem:

app/schemas/account.py:13: error: Class cannot subclass "BaseModel" (has type "Any")
app/core/config.py:17: error: Class cannot subclass "BaseSettings" (has type "Any")
app/core/db.py:22: error: Class cannot subclass "DeclarativeBase" (has type "Any")

Root Cause: Pydantic v2 und SQLAlchemy 2.0 liefern nicht in allen Installationen vollständige Type-Stubs. mypy kann den konkreten Typ von BaseModel/BaseSettings/DeclarativeBase nicht auflösen.

Fix:

  • pip install pydantic[mypy] für Pydantic-Plugin
  • mypy.ini / pyproject.toml anpassen:
[tool.mypy]
plugins = ["pydantic.mypy"]

Empfehlung: Kein Blocker für v1.0-Deployment. In v1.1 beheben.


2. Untyped decorator makes function ... untyped 50x

Schweregrad: Style

Jeder FastAPI-Router mit @router.get(...) / @router.post(...) erzeugt diesen Fehler:

app/api/v1/auth.py:26: error: Untyped decorator makes function "register" untyped
app/api/v1/deals.py:45: error: Untyped decorator makes function "create_deal" untyped

Root Cause: FastAPI-Decorators haben keine präzisen Type-Hints in den Stubs, die mypy lesen kann.

Fix:

# Expliziten Return-Type annotieren:
@router.post("/register", response_model=UserOut, status_code=201)
async def register(...) -> UserOut:  # ← Return-Type hinzufügen
    ...

Empfehlung: Kein Blocker. 50 Stellen manuell zu annotieren ist aufwändig, aber nicht funktional kritisch.


3. Returning Any from function declared to return ... (no-any-return) 20x

Schweregrad: Warning

Betrifft Service-Layer und einige Router:

app/core/security.py:28: error: Returning Any from function declared to return "str"
app/services/account_service.py:44: error: Returning Any from function declared to return "Account | None"
app/core/deps.py:53: error: Returning Any from function declared to return "User"

Root Cause: ORM-Ergebnisse (await session.execute()) liefern Any zurück, wenn das Result nicht explizit typisiert wird.

Fix (Beispiel):

# Statt:
result = await session.execute(query)
return result.scalar_one_or_none()  # mypy sagt: Any

# Besser:
result = await session.execute(query)
user: User | None = result.scalar_one_or_none()
return user

Empfehlung: Kein Blocker, aber die Services und deps.py sollten mittelfristig nachgebessert werden. Besonders kritisch ist deps.py:53 (get_current_user → User), weil hier ein Any-Wert durch das Dependency-System fließt.


4. Unused "type: ignore" comment 5x

Schweregrad: Info

app/core/config.py:86: error: Unused "type: ignore" comment
app/services/deal_service.py:30: error: Unused "type: ignore" comment
app/api/v1/dashboard.py:30: error: Unused "type: ignore" comment

Fix: # type: ignore[code] entfernen wo nicht mehr nötig, oder korrekten Error-Code ergänzen.

Empfehlung: Einfaches Cleanup vor v1.1.


5. Funktionale Type-Fehler (Bug-verdächtig) 3x ⚠️

a) app/services/contact_service.py:44 Inkompatibler Argument-Typ

app/services/contact_service.py:44: error: Argument 2 to "_validate_account" has incompatible type "int | None"; expected "int"

Risiko: account_id kann None sein, aber _validate_account erwartet int. MUSS gefixt werden.

b) app/services/activity_service.py:106 None hat kein Attribut value

app/services/activity_service.py:106: error: Item "None" of "ActivityType | None" has no attribute "value"

Risiko: ActivityType kann None sein, aber die enum.value Property wird trotzdem aufgerufen. MUSS gefixt werden.

c) app/api/v1/deals.py:106-107 Typ-Inkompatibilität bei Pipeline-Kalkulation

app/api/v1/deals.py:106: error: No overload variant of "int" matches argument type "object"
app/api/v1/deals.py:107: error: Argument 1 to "float" has incompatible type "object"; expected "str | Buffer | SupportsFloat | SupportsIndex"

Risiko: Pipeline-Wert-Berechnung nutzt unvalidierte Daten aus der DB. Potential für 500-Fehler bei unerwarteten DB-Werten.


Empfehlung

GO für Phase 8 mit Auflagen. Die 3 funktionalen Type-Fehler MÜSSEN vor dem Deployment gefixt werden:

  1. contact_service.py:44 account_id-None-Check
  2. activity_service.py:106 ActivityType-None-Check
  3. deals.py:106-107 Pipeline-Calculation-Type-Guard

Die restlichen 134 Fehler sind Non-Blocker (Style/Konfiguration/Stubs). Sie sind typisch für FastAPI+SQLAlchemy-Projekte unter mypy und sollten sukzessive in v1.1 bereinigt werden.

Priorität für Phase 8: Fix der 3 funktionalen Typ-Fehler → dann Deployment.