fix: replace Python 3.10+ union type syntax with typing.Optional for Pydantic v2 compat
Some checks failed
CI/CD / go-lint (push) Has been skipped
CI/CD / python-lint (push) Has been skipped
CI/CD / nodejs-lint (push) Has been skipped
CI/CD / test-go-ai-compliance (push) Successful in 37s
CI/CD / test-python-backend-compliance (push) Successful in 35s
CI/CD / test-python-document-crawler (push) Successful in 24s
CI/CD / test-python-dsms-gateway (push) Successful in 19s
CI/CD / validate-canonical-controls (push) Successful in 12s
CI/CD / deploy-hetzner (push) Has been cancelled

from __future__ import annotations breaks Pydantic BaseModel runtime type
evaluation. Replaced str | None → Optional[str], list[str] → List[str] etc.
in control_generator.py, anchor_finder.py, control_generator_routes.py.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-13 09:36:14 +01:00
parent cdafc4d9f4
commit c530898963
3 changed files with 29 additions and 34 deletions

View File

@@ -12,11 +12,9 @@ Endpoints:
POST /v1/canonical/blocked-sources/cleanup — Start cleanup workflow
"""
from __future__ import annotations
import json
import logging
from typing import Optional
from typing import Optional, List
from fastapi import APIRouter, HTTPException, Query
from pydantic import BaseModel
@@ -39,8 +37,8 @@ router = APIRouter(prefix="/v1/canonical", tags=["control-generator"])
# =============================================================================
class GenerateRequest(BaseModel):
domain: str | None = None
collections: list[str] | None = None
domain: Optional[str] = None
collections: Optional[List[str]] = None
max_controls: int = 50
batch_size: int = 5
skip_web_search: bool = False
@@ -63,8 +61,8 @@ class GenerateResponse(BaseModel):
class ReviewRequest(BaseModel):
action: str # "approve", "reject", "needs_rework"
release_state: str | None = None # Override release_state
notes: str | None = None
release_state: Optional[str] = None # Override release_state
notes: Optional[str] = None
class ProcessedStats(BaseModel):
@@ -83,7 +81,7 @@ class BlockedSourceResponse(BaseModel):
document_title: str
reason: str
deletion_status: str
qdrant_collection: str | None = None
qdrant_collection: Optional[str] = None
marked_at: str
@@ -367,8 +365,8 @@ async def start_cleanup():
@router.get("/controls-customer")
async def get_controls_customer_view(
severity: str | None = Query(None),
domain: str | None = Query(None),
severity: Optional[str] = Query(None),
domain: Optional[str] = Query(None),
):
"""Get controls filtered for customer visibility.