feat(scraper-kit): protocol boundaries (matcher/config/session/jobs) + backend adapters (#2131) #2151

Merged
lekss361 merged 1 commit from feat/scraper-kit-contracts into main 2026-07-02 15:25:39 +00:00
Owner

Закрывает #2131 (Epic #2126, шаг B). Подготовка к переносу кода (C-G) — только новые файлы, код скрапперов не двигается, адаптеры пока не используются в рантайме (инертно).

Что

  • packages/scraper-kit/src/scraper_kit/contracts.py — 4 Protocol'а (HouseMatcher, ScraperConfig, SessionFactory, EnrichmentJobs), БЕЗ импортов app.* (verified)
  • tradein-mvp/backend/app/services/scraper_adapters.py — 4 адаптера над app.services.matching/geocoder/cian_session/config/db
  • tradein-mvp/backend/tests/test_scraper_adapters_contracts.py — 5 тестов (static _check для mypy + runtime isinstance против @runtime_checkable + guard «contracts не тянет app»)

Зафиксированные сигнатуры (для шага C)

  • HouseMatcher.match_or_create_house(db, ext_source, ext_id, address?, lat?, lon?, *, year_built?, building_cadastral_number?, cadastral_number?, source_url?) -> tuple[int, float, str] (house_id, confidence, method)
  • upsert_listing_source(db, *, listing_id, ext_source, ext_id, method, confidence, price_rub?, area_m2?, floor?, rooms_count?, source_url?, source_data?) -> None
  • ScraperConfig — 11 полей (scraper_fetch_mode, browser_http_endpoint, *_proxy_url, delays, glitchtip_dsn)
  • SessionFactory.__call__() -> Session; EnrichmentJobs (imv_backfill async / dedup_merge sync / yandex_address_backfill async)

Доменные результат-типы в contracts оставлены Any (не тянуть app.*), адаптер аннотирует точно через TYPE_CHECKING.

Verify

  • ruff clean; mypy 0 ошибок в новых файлах
  • from scraper_kit.contracts import ... OK; import app.services.scraper_adapters OK
  • pytest tests/test_scraper_adapters_contracts.py → 5 passed
Закрывает #2131 (Epic #2126, шаг B). Подготовка к переносу кода (C-G) — **только новые файлы, код скрапперов не двигается**, адаптеры пока не используются в рантайме (инертно). ## Что - `packages/scraper-kit/src/scraper_kit/contracts.py` — 4 Protocol'а (`HouseMatcher`, `ScraperConfig`, `SessionFactory`, `EnrichmentJobs`), БЕЗ импортов `app.*` (verified) - `tradein-mvp/backend/app/services/scraper_adapters.py` — 4 адаптера над `app.services.matching`/`geocoder`/`cian_session`/config/db - `tradein-mvp/backend/tests/test_scraper_adapters_contracts.py` — 5 тестов (static `_check` для mypy + runtime `isinstance` против `@runtime_checkable` + guard «contracts не тянет app») ## Зафиксированные сигнатуры (для шага C) - `HouseMatcher.match_or_create_house(db, ext_source, ext_id, address?, lat?, lon?, *, year_built?, building_cadastral_number?, cadastral_number?, source_url?) -> tuple[int, float, str]` (house_id, confidence, method) - `upsert_listing_source(db, *, listing_id, ext_source, ext_id, method, confidence, price_rub?, area_m2?, floor?, rooms_count?, source_url?, source_data?) -> None` - `ScraperConfig` — 11 полей (scraper_fetch_mode, browser_http_endpoint, *_proxy_url, delays, glitchtip_dsn) - `SessionFactory.__call__() -> Session`; `EnrichmentJobs` (imv_backfill async / dedup_merge sync / yandex_address_backfill async) Доменные результат-типы в contracts оставлены `Any` (не тянуть app.*), адаптер аннотирует точно через `TYPE_CHECKING`. ## Verify - ruff clean; mypy 0 ошибок в новых файлах - `from scraper_kit.contracts import ...` OK; `import app.services.scraper_adapters` OK - `pytest tests/test_scraper_adapters_contracts.py` → 5 passed
lekss361 added 1 commit 2026-07-02 15:25:30 +00:00
feat(scraper-kit): protocol boundaries (matcher/config/session/jobs) + backend adapters (#2131)
All checks were successful
CI / changes (pull_request) Successful in 8s
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
0b99882034
lekss361 merged commit 6391587572 into main 2026-07-02 15:25:39 +00:00
lekss361 deleted branch feat/scraper-kit-contracts 2026-07-02 15:25:39 +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#2151
No description provided.