scraper-kit B: Protocol-границы (matcher/config/session/jobs) + adapters #2131

Closed
opened 2026-07-02 13:40:15 +00:00 by lekss361 · 1 comment
Owner

Часть Epic #2126, шаг B. Depends: шаг A (скаффолд). Активировать (status/ready) после merge A.

Goal

В scraper_kit объявить Protocol-контракты для инжекта продуктовой логики; на продуктовой стороне — тонкие адаптеры над существующими app.services.*. Код скрапперов ещё НЕ двигается.

Protocols:

  • HouseMatchermatch_or_create_house, upsert_listing_source (зафиксировать ТОЧНУЮ сигнатуру из matching/houses.py — возвращает (house_id, conf, method); grep всех callers)
  • ScraperConfig — dataclass с полями settings, что реально читаются скрапперами
  • SessionFactory — фабрика сессий БД
  • EnrichmentJobs — реестр callback'ов (imv_backfill / dedup_merge / address_backfill)

Files

  • packages/scraper-kit/src/scraper_kit/contracts.py (новый)
  • tradein-mvp/backend/app/services/scraper_adapters.py (новый — конкретные импл из app.*)

Acceptance

  • mypy/ruff зелёные
  • adapters структурно удовлетворяют Protocol'ам (structural typing тест)

Risk

runtime-mismatch сигнатуры matcher → зафиксировать по факту из matching/houses.py, не по памяти.

Agent: backend-engineer

Часть Epic #2126, шаг B. ⛔ Depends: шаг A (скаффолд). Активировать (status/ready) после merge A. ## Goal В `scraper_kit` объявить Protocol-контракты для инжекта продуктовой логики; на продуктовой стороне — тонкие адаптеры над существующими `app.services.*`. Код скрапперов ещё НЕ двигается. Protocols: - `HouseMatcher` — `match_or_create_house`, `upsert_listing_source` (зафиксировать ТОЧНУЮ сигнатуру из `matching/houses.py` — возвращает `(house_id, conf, method)`; grep всех callers) - `ScraperConfig` — dataclass с полями `settings`, что реально читаются скрапперами - `SessionFactory` — фабрика сессий БД - `EnrichmentJobs` — реестр callback'ов (imv_backfill / dedup_merge / address_backfill) ## Files - `packages/scraper-kit/src/scraper_kit/contracts.py` (новый) - `tradein-mvp/backend/app/services/scraper_adapters.py` (новый — конкретные импл из `app.*`) ## Acceptance - mypy/ruff зелёные - adapters структурно удовлетворяют Protocol'ам (structural typing тест) ## Risk runtime-mismatch сигнатуры matcher → зафиксировать по факту из `matching/houses.py`, не по памяти. **Agent:** backend-engineer
lekss361 added the
priority/p2
scope/backend
tech-debt
tradein
labels 2026-07-02 13:41:52 +00:00
lekss361 added the
status/ready
status/wip
labels 2026-07-02 15:18:23 +00:00
Author
Owner

Смержено (PR #2151). Инертный шагcontracts.py + scraper_adapters.py не подключены к рантайм-графу (main.py/скрапперы их не импортируют), поведение на проде не меняется. Локально verified: import app.services.scraper_adapters OK, pytest 5 passed, ruff/mypy чисто. Prod-smoke отложен до шага C — когда save_listings реально начнёт ходить через HouseMatcher-адаптер, тогда и проверим цепочку живьём (dedup/matching на реальном sweep).

Смержено (PR #2151). **Инертный шаг** — `contracts.py` + `scraper_adapters.py` не подключены к рантайм-графу (`main.py`/скрапперы их не импортируют), поведение на проде не меняется. Локально verified: `import app.services.scraper_adapters` OK, `pytest` 5 passed, ruff/mypy чисто. Prod-smoke отложен до шага C — когда `save_listings` реально начнёт ходить через `HouseMatcher`-адаптер, тогда и проверим цепочку живьём (dedup/matching на реальном sweep).
lekss361 removed the
status/ready
status/wip
labels 2026-07-02 15:26:18 +00:00
Sign in to join this conversation.
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#2131
No description provided.