Crawler Phase 2 – Application Layer (T-020..T-028)
| ID | 755 |
|---|---|
| Status | completed |
| Typ | ai_task |
| Erstellt von | mcp-tasks (ai) |
| Erstellt | 2026-04-21 02:34:34.989290 |
| Abgeschlossen | 2026-04-21 02:46:49.122698 |
Beschreibung
Use Cases: StartCrawl, ProcessUrl, ExtractSeoData, CheckExternalLink, FinalizeCrawl, GenerateCrawlReport, CompareCrawls, ListCrawls, RecheckExternalLinks. Alle via Ports, keine Infrastructure-Imports. Unit-Tests mit Fake-Adaptern.
Aktionen
Ergebnisse
claude (claude)
success
| Tokens | - (In: -, Out: -) |
|---|---|
| Dauer | - |
| Zeit | 2026-04-21 02:46:40 |
Antwort:
Phase 2 Application Layer abgeschlossen. Use Cases (src/application/use_cases/, 9 Dateien): - StartCrawlUseCase: legt Crawl an, normalisiert base_url, upsertet Url-Entity, enqueued in Queue - ExtractSeoDataUseCase: reine Transformation (FetchResult + ParsedDocument → Page-Entity mit Quality-Flags), via ExtractInput-Value-Object (vermeidet PLR0913) - ProcessUrlUseCase: orchestriert fetch + parse + extract + persist. Klasse selbst 30 LOC; Persistenz in 3 Modul-Funktionen (_persist_links, _persist_images, _persist_structured_data) ausgelagert — SRP-konform - CheckExternalLinkUseCase: HEAD/GET extern, Cache via ExternalCheckRepository mit TTL - FinalizeCrawlUseCase: setzt finished_at, Status, zählt Fehler; idempotent bei bereits finalisierten Crawls - ListCrawlsUseCase, GenerateCrawlReportUseCase, CompareCrawlsUseCase, RecheckExternalLinksUseCase Read Models (src/application/read_models/): CrawlReport, CrawlDiff. Neuer Port: ClockPort (domain/ports/clock_port.py) — macht Zeit injizierbar, tests deterministisch. Keine asserts (S101), keine Magic Numbers. Bedingungen via explizitem RuntimeError bei ID=None nach save(). Test-Fakes (tests/unit/application/fakes.py): FakeClock + 12 in-memory Repositories/Queues. Unit-Tests (8 Dateien): test_start_crawl, test_finalize_crawl, test_list_crawls, test_check_external_link (3 Fälle: first-fetch, cache-hit, cache-expired), test_extract_seo_data, test_generate_crawl_report, test_compare_crawls, test_recheck_external_links, test_process_url (Orchestrierung gegen Stub-Parsers). Quality-Gateways: - G1 Ruff ALL: PASS | Ruff format: PASS | Mypy --strict (74 files): PASS | Radon cc/mi: PASS | MaxLOC 80 (Methoden+Klassen): PASS - G4 Import-linter: 3 Contracts kept (Hexagonal-Direction, Infra→!Interfaces, Domain→!third-party) - G2 Pytest unit: 69/69 PASS, Coverage 97.75% (Schwelle 85% erreicht) - G5 pip-audit: no vulnerabilities - G6 schema-drift: 12 tables in sync