feat(tradein/scraper-kit): port domclick_detail + ekb_geoportal_client to kit (#2307) #2318

Merged
lekss361 merged 1 commit from feat/tradein-port-domclick-ekb-kit into main 2026-07-03 21:18:40 +00:00
Owner

Closes #2307 (Group D эпика #2277 — scraper_kit migration).

Что сделано

Эти два legacy-модуля НЕ имели kit-эквивалента вообще (в отличие от остальных 24/26 файлов
app/services/scrapers/*) — портированы с нуля, не просто смена импорта:

  • scraper_kit/providers/domclick/detail.pyapp/services/scrapers/domclick_detail.py
    (parse_detail_html, fetch_detail, save_detail_enrichment, DomClickDetailEnrichment)
  • scraper_kit/providers/ekb_geoportal/ (новый subpackage — первый non-listing-site provider
    в scraper_kit.providers, задаёт прецедент для будущих) ← app/services/scrapers/ekb_geoportal_client.py

Byte-diff подтверждает: логика перенесена без дрейфа (только import-пути + докстринги
отличаются).

Callers (exhaustive grep, не тронуты — это scope других issues)

  • domclick_detail.pyscripts/ingest_domclick_jsonl.py (issue #2305) + собственные тесты.
    scripts/domclick_local_runner.py упоминает только в комментариях, реальный caller — нет.
  • ekb_geoportal_client.pyapp/tasks/ekb_geoportal_ingest.py (issue #2310) + собственные тесты.

Parity (harness #2304/PR #2313)

  • tests/scrapers/test_domclick_detail_kit_parity.py (5 тестов) — реальная SSR-фикстура,
    divergence-catch на living_area_m2
  • tests/scrapers/test_ekb_geoportal_client_kit_parity.py (4 теста) — GeoJSON-фикстура,
    divergence-catch на floors
  • 9/9 passed

Проверено

  • Полный backend suite: 3170 passed / 6 skipped / 1 failed (test_search_cache_hit,
    подтверждено pre-existing и не связано — воспроизводится на HEAD~1 до этого PR)
  • ruff check + format — чисто
  • Code-review: APPROVE (verified caller-grep independently, byte-diffed port fidelity,
    confirmed issue #2305's DoD consumes exactly this module API)

Дальше

Разблокирует #2310 (Group C, ekb_geoportal_ingest.py) и делает доступным для #2305
(ingest_domclick_jsonl.py).

Closes #2307 (Group D эпика #2277 — scraper_kit migration). ## Что сделано Эти два legacy-модуля НЕ имели kit-эквивалента вообще (в отличие от остальных 24/26 файлов `app/services/scrapers/*`) — портированы с нуля, не просто смена импорта: - `scraper_kit/providers/domclick/detail.py` ← `app/services/scrapers/domclick_detail.py` (`parse_detail_html`, `fetch_detail`, `save_detail_enrichment`, `DomClickDetailEnrichment`) - `scraper_kit/providers/ekb_geoportal/` (новый subpackage — первый non-listing-site provider в `scraper_kit.providers`, задаёт прецедент для будущих) ← `app/services/scrapers/ekb_geoportal_client.py` Byte-diff подтверждает: логика перенесена без дрейфа (только import-пути + докстринги отличаются). ## Callers (exhaustive grep, не тронуты — это scope других issues) - `domclick_detail.py` ← `scripts/ingest_domclick_jsonl.py` (issue #2305) + собственные тесты. `scripts/domclick_local_runner.py` упоминает только в комментариях, реальный caller — нет. - `ekb_geoportal_client.py` ← `app/tasks/ekb_geoportal_ingest.py` (issue #2310) + собственные тесты. ## Parity (harness #2304/PR #2313) - `tests/scrapers/test_domclick_detail_kit_parity.py` (5 тестов) — реальная SSR-фикстура, divergence-catch на `living_area_m2` - `tests/scrapers/test_ekb_geoportal_client_kit_parity.py` (4 теста) — GeoJSON-фикстура, divergence-catch на `floors` - 9/9 passed ## Проверено - Полный backend suite: 3170 passed / 6 skipped / 1 failed (`test_search_cache_hit`, подтверждено pre-existing и не связано — воспроизводится на `HEAD~1` до этого PR) - ruff check + format — чисто - Code-review: ✅ APPROVE (verified caller-grep independently, byte-diffed port fidelity, confirmed issue #2305's DoD consumes exactly this module API) ## Дальше Разблокирует #2310 (Group C, `ekb_geoportal_ingest.py`) и делает доступным для #2305 (`ingest_domclick_jsonl.py`).
lekss361 added 1 commit 2026-07-03 21:13:35 +00:00
feat(tradein/scraper-kit): port domclick_detail + ekb_geoportal_client to kit (#2307)
All checks were successful
CI / changes (pull_request) Successful in 10s
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m44s
8c8289cdad
Group D of the scraper_kit migration epic (#2277). Both legacy modules had no
kit-side equivalent yet (per audit Scraper_Kit_Legacy_Dependency_Audit_0703),
unlike the other 24/26 files which were already strangler-duplicated.

- scraper_kit/providers/domclick/detail.py — Layer B detail-card enrichment
  (parse_detail_html/fetch_detail/save_detail_enrichment), no ScraperConfig
  injection needed (fetch_detail takes an already-open browser_fetcher).
- scraper_kit/providers/ekb_geoportal/{__init__,client}.py — new subpackage,
  first non-listing-site provider in scraper_kit. Legacy module had zero
  app.* coupling (only httpx), so the port is near-verbatim.

Parity proven via tests/support/parity.py (assert_parity) against the exact
legacy functions on realistic fixtures (live-card SSR JSON, GeoJSON
FeatureCollection).

Callers of both legacy modules are unchanged (out of scope — ekb_geoportal_ingest
switch is #2310; the only other domclick_detail caller is
scripts/ingest_domclick_jsonl.py, also untouched).
lekss361 merged commit a7677b0fba into main 2026-07-03 21:18:40 +00:00
lekss361 deleted branch feat/tradein-port-domclick-ekb-kit 2026-07-03 21:18:40 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2318
No description provided.