feat(tradein): scheduler-источник cian_city_sweep (newbuilding Phase 4), seed dormant (#973) #1296

Merged
lekss361 merged 2 commits from feat/cian-city-sweep-schedule into main 2026-06-15 17:48:34 +00:00
Owner

Закрывает #973 (950-E2: расписание newbuilding enrichment на scraper-контейнере).

Контекст

Newbuilding-обогащение уже реализовано как Phase 4 внутри run_cian_city_sweep (enrich_houses=True: для домов с cian_zhk_urlfetch_newbuilding + save_newbuilding_enrichment), но у cian_city_sweep не было scheduler-источника — он бежал только инлайн/вручную. Этот PR регистрирует его в in-app scheduler (теперь живёт в отдельном tradein-scraper контейнере, #1182).

Изменения

  • scheduler.py: импорт run_cian_city_sweep + trigger trigger_cian_city_sweep_run (зеркало trigger_yandex_city_sweep_run: _claim_run → новая SessionLocal() в spawned task → run_cian_city_sweep с enrich_houses=True) + dispatch-ветка elif source == "cian_city_sweep" + docstring.
  • data/sql/103_scrape_schedules_seed_cian_city_sweep.sql: seed-строка, enabled = false (DORMANT), окно 02:00–05:00 UTC, idempotent ON CONFLICT (source) DO NOTHING. default_params: pages_per_anchor=3, request_delay_sec=5, radius_m=1500, detail_top_n=10, enrich_houses=true.
  • tests/test_scheduler.py: 3 теста (claim создаёт run, skip при running, dispatch routing).

Почему DORMANT

Прокси (mproxy.site) сейчас недоступен — включённое расписание спамило бы падающими runs. По точному паттерну yandex_city_sweep (078) capability полностью wired, но засеяна выключенной. Включение оператором после восстановления прокси:

UPDATE scrape_schedules SET enabled = true WHERE source = 'cian_city_sweep';

Работоспособность намеренно НЕ verified (прод-smoke вне scope — прокси мёртв).

Review

  • code-reviewer: trigger корректно зеркалит паттерн (изоляция сессии, RUF006), dispatch/seed source совпадают байт-в-байт, SQL идемпотентен. Поймал и исправлен 🔴 блокер: коллизия номера миграции 101_ с 101_gendesign_reader_role.sql (#976) → переименовано в 103_.
  • 🟡 tech-debt (не блокер): test_scheduler_dispatch_routes_cian_city_sweep vacuous (вызывает trigger напрямую, не через scheduler_loop) — кандидат на follow-up.

Out of scope

#974 (yandex_newbuilding activation) — отдельный feature: требует новый run_yandex_newbuilding_sweep entrypoint, не покрывается этим PR.

Закрывает **#973** (950-E2: расписание newbuilding enrichment на scraper-контейнере). ## Контекст Newbuilding-обогащение уже реализовано как **Phase 4** внутри `run_cian_city_sweep` (`enrich_houses=True`: для домов с `cian_zhk_url` → `fetch_newbuilding` + `save_newbuilding_enrichment`), но у `cian_city_sweep` не было scheduler-источника — он бежал только инлайн/вручную. Этот PR регистрирует его в in-app scheduler (теперь живёт в отдельном `tradein-scraper` контейнере, #1182). ## Изменения - `scheduler.py`: импорт `run_cian_city_sweep` + trigger `trigger_cian_city_sweep_run` (зеркало `trigger_yandex_city_sweep_run`: `_claim_run` → новая `SessionLocal()` в spawned task → `run_cian_city_sweep` с `enrich_houses=True`) + dispatch-ветка `elif source == "cian_city_sweep"` + docstring. - `data/sql/103_scrape_schedules_seed_cian_city_sweep.sql`: seed-строка, **`enabled = false` (DORMANT)**, окно 02:00–05:00 UTC, idempotent `ON CONFLICT (source) DO NOTHING`. `default_params`: `pages_per_anchor=3, request_delay_sec=5, radius_m=1500, detail_top_n=10, enrich_houses=true`. - `tests/test_scheduler.py`: 3 теста (claim создаёт run, skip при running, dispatch routing). ## Почему DORMANT Прокси (`mproxy.site`) сейчас недоступен — включённое расписание спамило бы падающими runs. По точному паттерну `yandex_city_sweep` (078) capability полностью wired, но засеяна выключенной. **Включение оператором после восстановления прокси:** ```sql UPDATE scrape_schedules SET enabled = true WHERE source = 'cian_city_sweep'; ``` Работоспособность намеренно НЕ verified (прод-smoke вне scope — прокси мёртв). ## Review - ✅ code-reviewer: trigger корректно зеркалит паттерн (изоляция сессии, RUF006), dispatch/seed source совпадают байт-в-байт, SQL идемпотентен. Поймал и исправлен 🔴 блокер: коллизия номера миграции `101_` с `101_gendesign_reader_role.sql` (#976) → переименовано в `103_`. - 🟡 tech-debt (не блокер): `test_scheduler_dispatch_routes_cian_city_sweep` vacuous (вызывает trigger напрямую, не через `scheduler_loop`) — кандидат на follow-up. ## Out of scope **#974** (yandex_newbuilding activation) — отдельный feature: требует новый `run_yandex_newbuilding_sweep` entrypoint, не покрывается этим PR.
lekss361 added the
automation
GG-форсайт
scope/backend
scrapers
site-finder
labels 2026-06-13 08:28:29 +00:00
bot-backend force-pushed feat/cian-city-sweep-schedule from f07e1a391a to 1241d7fe4d 2026-06-15 16:10:53 +00:00 Compare
lekss361 merged commit 483fdb0caa into main 2026-06-15 17:48:34 +00:00
lekss361 deleted branch feat/cian-city-sweep-schedule 2026-06-15 17:48:34 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#1296
No description provided.