compliance/api/screening_routes.py (597 LOC) -> 233 LOC thin routes +
353-line ScreeningService + 60-line schemas file. Manages SBOM generation
(CycloneDX 1.5) and OSV.dev vulnerability scanning.
Pure helpers (parse_package_lock, parse_requirements_txt, parse_yarn_lock,
detect_and_parse, generate_sbom, query_osv, map_osv_severity,
extract_fix_version, scan_vulnerabilities) moved to the service module.
The two lookup endpoints (get_screening, list_screenings) delegate to
the new ScreeningService class.
Test-mock compatibility: tests/test_screening_routes.py uses
`patch("compliance.api.screening_routes.SessionLocal", ...)` and
`patch("compliance.api.screening_routes.scan_vulnerabilities", ...)`.
Both names are re-imported and re-exported from the route module so the
patches still take effect. The scan handler keeps direct
`SessionLocal()` usage; the lookup handlers also use SessionLocal so the
test mocks intercept them.
Latent bug fixed: the original scan handler had
text = content.decode("utf-8")
on line 339, shadowing the imported `sqlalchemy.text` so that the
subsequent `text("INSERT ...")` calls would have raised at runtime.
The variable is now named `file_text`. Allowed under "minor behavior
fixes" — the bug was unreachable in tests because they always patched
SessionLocal.
Verified:
- 240/240 pytest pass
- OpenAPI 360/484 unchanged
- mypy compliance/ -> Success on 134 source files
- screening_routes.py 597 -> 233 LOC
- Hard-cap violations: 11 -> 10
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
92 lines
3.3 KiB
INI
92 lines
3.3 KiB
INI
[mypy]
|
|
python_version = 3.12
|
|
strict = True
|
|
implicit_reexport = True
|
|
ignore_missing_imports = True
|
|
warn_unused_configs = True
|
|
exclude = (?x)(
|
|
^compliance/tests/
|
|
| ^compliance/data/
|
|
| ^compliance/scripts/
|
|
)
|
|
|
|
# Tests are not type-checked (legacy; will be tightened when TestClient-based
|
|
# integration tests land in Phase 1 Step 4 follow-up).
|
|
[mypy-compliance.tests.*]
|
|
ignore_errors = True
|
|
|
|
# ----------------------------------------------------------------------
|
|
# Phase 1 refactor policy:
|
|
# - compliance.domain / compliance.schemas : fully strict
|
|
# - compliance.api._http_errors : fully strict
|
|
# - compliance.services.<new_clean_arch_service> : strict (list explicitly)
|
|
# - compliance.repositories.* : strict with ORM arg-type
|
|
# ignore (see per-file)
|
|
# - compliance.db.* : loose (ORM models)
|
|
# - compliance.services.<legacy utility modules> : loose (pre-refactor)
|
|
# - compliance.api.<route files> : loose until Step 4
|
|
# ----------------------------------------------------------------------
|
|
|
|
# Legacy utility services that predate the Phase 1 refactor. Not touched
|
|
# by the clean-arch extraction. Left loose until their own refactor pass.
|
|
[mypy-compliance.services.ai_compliance_assistant]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.audit_pdf_generator]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.auto_risk_updater]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.control_generator]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.export_generator]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.llm_provider]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.pdf_extractor]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.regulation_scraper]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.report_generator]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.seeder]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.similarity_detector]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.license_gate]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.anchor_finder]
|
|
ignore_errors = True
|
|
[mypy-compliance.services.rag_client]
|
|
ignore_errors = True
|
|
|
|
# SQLAlchemy ORM layer: models use Column() rather than Mapped[T], so
|
|
# static analysis sees descriptors as Column[T] while runtime returns T.
|
|
# Loose for the whole db package until a future Mapped[T] migration.
|
|
[mypy-compliance.db.*]
|
|
ignore_errors = True
|
|
|
|
# Route files (Phase 1 Step 4 in progress): only the refactored ones are
|
|
# checked strictly via explicit extension of the strict scope in CI.
|
|
# Until each file is refactored, it stays loose.
|
|
[mypy-compliance.api.*]
|
|
ignore_errors = True
|
|
|
|
# Refactored route modules under Step 4 — override the blanket rule above.
|
|
[mypy-compliance.api.audit_routes]
|
|
ignore_errors = False
|
|
[mypy-compliance.api.banner_routes]
|
|
ignore_errors = False
|
|
[mypy-compliance.api.tom_routes]
|
|
ignore_errors = False
|
|
[mypy-compliance.api.company_profile_routes]
|
|
ignore_errors = False
|
|
[mypy-compliance.api.vvt_routes]
|
|
ignore_errors = False
|
|
[mypy-compliance.api.canonical_control_routes]
|
|
ignore_errors = False
|
|
[mypy-compliance.api.source_policy_router]
|
|
ignore_errors = False
|
|
[mypy-compliance.api.screening_routes]
|
|
ignore_errors = False
|
|
[mypy-compliance.api._http_errors]
|
|
ignore_errors = False
|