Crawler Phase 2 – Application Layer (T-020..T-028)

ID755
Statuscompleted
Typai_task
Erstellt vonmcp-tasks (ai)
Erstellt2026-04-21 02:34:34.989290
Abgeschlossen2026-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

Bearbeiten

Ergebnisse

claude (claude) success
Tokens- (In: -, Out: -)
Dauer-
Zeit2026-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

← Zurück zur Task-Liste