5.3 KiB
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-Pluginmypy.ini/pyproject.tomlanpassen:
[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:
contact_service.py:44–account_id-None-Checkactivity_service.py:106–ActivityType-None-Checkdeals.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.