refactor(tradein/scrapers): удалить 6 осиротевших legacy scraper-модулей + тест-хирургия (#2397 Part E2) #2407

Merged
lekss361 merged 1 commit from chore/tradein-partE2-delete-orphaned-scrapers into main 2026-07-04 11:49:44 +00:00
Owner

Summary

Umbrella #2397 Part E2 (эпик #2277). Продолжение E1 (#2405, merged — удалил scrape_pipeline.py, последнего non-test импортёра этих модулей). Удаляет 6 legacy scraper-провайдеров, ставших 0-runtime-importer (прод-консюмеры уже на kit: admin.py/cian_history_backfill.pyscraper_kit.providers.cian.detail, admin.py:61 → kit CianScraper, и т.д.). Независимо подтверждено adversarial per-module аудитом + E1 deep-review.

Удалено:

  • Модули (app/services/scrapers/): cian.py, cian_detail.py, yandex_realty.py, domclick.py, domclick_exceptions.py, avito_houses.py.
  • 3 orphaned dev-скрипта (эксклюзивно гоняли удалённые legacy-скрейперы, superseded kit-путём): scripts/local-sweep-ekb{,-cian,-yandex}.py.
  • 18 тест-файлов (эксклюзивно тестировали удалённые модули / pure legacy-vs-kit parity без легаси-эталона): test_cian_detail.py, test_cian_serp_scraper.py, scrapers/test_cian_exhaustive.py, test_yandex_realty_serp.py, scrapers/test_domclick.py, test_avito_houses_dedup.py, test_avito_houses_parse.py, test_houses_rating_filter_entries_1789.py, test_scraper_kit_domclick_golden_parity.py, scrapers/test_admin_{avito,cian,yandex}_kit_parity.py.

НЕ удалено (остаётся LIVE — Part-D tasks импортируют): avito.py, avito_detail.py, avito_exceptions.py, avito_shared.py, base.py, browser_fetcher.py, cian_state_parser.py, cian_newbuilding.py, cian_valuation.py, house_type_normalizer.py, price_brackets.py, repair_state_normalizer.py, snapshot_writer.py, yandex_helpers.py, yandex_newbuilding.py. Директория scrapers/ + __init__.py сохранены (полное удаление каталога — «final E», после Part D).

⚠️ Отклонения от наивного плана (важно для review)

Grep-верификация вскрыла mixed live+legacy файлы, где полное удаление уронило бы coverage ещё-live модулей → CONVERT (вырезаны только legacy-ветки), не delete:

  • test_scraper_kit_bisection_parity.py — сохранён avito-bisection parity (был в одних parametrize со cian/domclick/yandex).
  • test_scraper_kit_group_c_backfill_kit_parity.py — убран только test_cian_fetch_detail_*; avito/house_imv_backfill/cian_history_backfill/ekb_geoportal parity сохранён.
  • test_scraper_kit_pricehistory_session_parity.py — убраны 2 fetch_detail-теста; cian_state_parser/base.ScrapedLot (live) сохранены.
  • test_yandex_scrapers_delay_wiring.py (yandex_newbuilding live), test_scraper_proxy.py (redundant с test_kit_serp_proxy_pool.py).
  • scrapers/test_avito_unix_date_tz_consistency.pyне был в наивном списке, ловился только по bare-name import from app.services.scrapers import avito, avito_houses, avito_shared → ретаргет на scraper_kit.providers.avito.houses (иначе ImportError на коллекции).

RETARGET на kit (символ жив, источник сменён): test_domclick_sweep.py (_map_item), test_yandex_city_sweep.py (DEFAULT_PRICE_RANGES/ROOM_PATH), test_pipeline_browser_routing.py (fetch_house_catalog + KitAvitoBlockedError), test_snapshot_writer.py + test_backfill_wave2.py (DetailEnrichment/save_detail_enrichment).

Coverage-loss (осознанно, как в E1 — для deep-review)

Удаление legacy-эталонов сняло offline-parity-проверку kit-парсинга: parse_houses_state/_parse_house_page (рейтинг из reviews.filterEntries #1789) и SERP _entity_to_lot/_format_address/_parse_serp_html (cian/yandex). Проверить в review, что у kit есть собственное standalone-покрытие этих парсеров; если нет — follow-up (аналог #2406).

Test plan

  • Full suite (tradein-mvp/backend, venv py3.12, tradein pg :5432): 2811 passed, 6 skipped, 1 failed — единственный fail = известный flake test_search_cache_hit (#2208), не регрессия. Падение числа тестов ожидаемо.
  • Import-sanity: import app.main; import app.scheduler_main → OK.
  • ruff check clean на всех тронутых файлах.
  • Grep-clean: grep -rn -E "scrapers\.(cian|cian_detail|yandex_realty|domclick|domclick_exceptions|avito_houses)\b" app/ scripts/ packages/ → только strangler-докстринги / past-tense.

Diff: +161 −13256 (36 файлов). Merge-base = 84716e61 (E1 merge) = current main → merge чистый.

Refs #2397, #2277

## Summary Umbrella #2397 **Part E2** (эпик #2277). Продолжение E1 (#2405, merged — удалил `scrape_pipeline.py`, последнего non-test импортёра этих модулей). Удаляет 6 legacy scraper-провайдеров, ставших **0-runtime-importer** (прод-консюмеры уже на kit: `admin.py`/`cian_history_backfill.py` → `scraper_kit.providers.cian.detail`, `admin.py:61` → kit `CianScraper`, и т.д.). Независимо подтверждено adversarial per-module аудитом + E1 deep-review. **Удалено:** - Модули (`app/services/scrapers/`): `cian.py`, `cian_detail.py`, `yandex_realty.py`, `domclick.py`, `domclick_exceptions.py`, `avito_houses.py`. - 3 orphaned dev-скрипта (эксклюзивно гоняли удалённые legacy-скрейперы, superseded kit-путём): `scripts/local-sweep-ekb{,-cian,-yandex}.py`. - 18 тест-файлов (эксклюзивно тестировали удалённые модули / pure legacy-vs-kit parity без легаси-эталона): `test_cian_detail.py`, `test_cian_serp_scraper.py`, `scrapers/test_cian_exhaustive.py`, `test_yandex_realty_serp.py`, `scrapers/test_domclick.py`, `test_avito_houses_dedup.py`, `test_avito_houses_parse.py`, `test_houses_rating_filter_entries_1789.py`, `test_scraper_kit_domclick_golden_parity.py`, `scrapers/test_admin_{avito,cian,yandex}_kit_parity.py`. **НЕ удалено (остаётся LIVE — Part-D tasks импортируют):** `avito.py`, `avito_detail.py`, `avito_exceptions.py`, `avito_shared.py`, `base.py`, `browser_fetcher.py`, `cian_state_parser.py`, `cian_newbuilding.py`, `cian_valuation.py`, `house_type_normalizer.py`, `price_brackets.py`, `repair_state_normalizer.py`, `snapshot_writer.py`, `yandex_helpers.py`, `yandex_newbuilding.py`. Директория `scrapers/` + `__init__.py` сохранены (полное удаление каталога — «final E», после Part D). ## ⚠️ Отклонения от наивного плана (важно для review) Grep-верификация вскрыла **mixed live+legacy файлы**, где полное удаление уронило бы coverage ещё-live модулей → **CONVERT (вырезаны только legacy-ветки)**, не delete: - `test_scraper_kit_bisection_parity.py` — сохранён avito-bisection parity (был в одних parametrize со cian/domclick/yandex). - `test_scraper_kit_group_c_backfill_kit_parity.py` — убран только `test_cian_fetch_detail_*`; avito/house_imv_backfill/cian_history_backfill/ekb_geoportal parity сохранён. - `test_scraper_kit_pricehistory_session_parity.py` — убраны 2 fetch_detail-теста; `cian_state_parser`/`base.ScrapedLot` (live) сохранены. - `test_yandex_scrapers_delay_wiring.py` (yandex_newbuilding live), `test_scraper_proxy.py` (redundant с `test_kit_serp_proxy_pool.py`). - `scrapers/test_avito_unix_date_tz_consistency.py` — **не был в наивном списке**, ловился только по bare-name import `from app.services.scrapers import avito, avito_houses, avito_shared` → ретаргет на `scraper_kit.providers.avito.houses` (иначе ImportError на коллекции). **RETARGET на kit** (символ жив, источник сменён): `test_domclick_sweep.py` (`_map_item`), `test_yandex_city_sweep.py` (`DEFAULT_PRICE_RANGES`/`ROOM_PATH`), `test_pipeline_browser_routing.py` (`fetch_house_catalog` + `KitAvitoBlockedError`), `test_snapshot_writer.py` + `test_backfill_wave2.py` (`DetailEnrichment`/`save_detail_enrichment`). ## Coverage-loss (осознанно, как в E1 — для deep-review) Удаление legacy-эталонов сняло offline-parity-проверку kit-парсинга: `parse_houses_state`/`_parse_house_page` (рейтинг из reviews.filterEntries #1789) и SERP `_entity_to_lot`/`_format_address`/`_parse_serp_html` (cian/yandex). Проверить в review, что у kit есть собственное standalone-покрытие этих парсеров; если нет — follow-up (аналог #2406). ## Test plan - [x] Full suite (`tradein-mvp/backend`, venv py3.12, tradein pg :5432): **2811 passed, 6 skipped, 1 failed** — единственный fail = известный flake `test_search_cache_hit` (#2208), не регрессия. Падение числа тестов ожидаемо. - [x] Import-sanity: `import app.main; import app.scheduler_main` → OK. - [x] `ruff check` clean на всех тронутых файлах. - [x] Grep-clean: `grep -rn -E "scrapers\.(cian|cian_detail|yandex_realty|domclick|domclick_exceptions|avito_houses)\b" app/ scripts/ packages/` → только strangler-докстринги / past-tense. Diff: **+161 −13256** (36 файлов). Merge-base = `84716e61` (E1 merge) = current main → merge чистый. Refs #2397, #2277
lekss361 added 1 commit 2026-07-04 11:39:21 +00:00
refactor(tradein/scrapers): удалить 6 осиротевших legacy scraper-модулей + тест-хирургия (#2397 Part E2)
All checks were successful
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 1m2s
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
575c233e51
app.services.scrapers.{cian,cian_detail,yandex_realty,domclick,domclick_exceptions,
avito_houses} имели 0 runtime-импортёров после E1 (scrape_pipeline.py удалён,
#2405) — admin.py/cian_history_backfill.py уже на scraper_kit.providers.*.

Удаление:
- 6 модулей целиком (avito_houses.py, cian.py, cian_detail.py, domclick.py,
  domclick_exceptions.py, yandex_realty.py)
- 3 осиротевших dev-sweep скрипта (local-sweep-ekb{,-cian,-yandex}.py) —
  эксклюзивно драйвили удалённые легаси-скраперы, kit-путь их заменяет

Тесты (18 файлов DELETE — эксклюзивно тестировали удалённые модули или были
чистым legacy-vs-kit parity, чей легаси-эталон исчез):
test_cian_detail.py, test_cian_serp_scraper.py, tests/scrapers/test_cian_exhaustive.py,
test_yandex_realty_serp.py, tests/scrapers/test_domclick.py,
test_avito_houses_dedup.py, test_avito_houses_parse.py,
test_houses_rating_filter_entries_1789.py, test_scraper_kit_domclick_golden_parity.py,
tests/scrapers/test_admin_{avito,cian,yandex}_kit_parity.py.

CONVERT (файл покрывает СМЕШАННЫЙ live+legacy набор — вырезаны только
секции удалённых модулей, live-покрытие сохранено):
- test_scraper_kit_cian_golden_parity.py — SERP/`_format_address`/detail
  (cian.py/cian_detail.py) убраны; extract_state (cian_state_parser, live)/
  valuation (cian_valuation, live)/newbuilding (cian_newbuilding, live)/
  no-app-imports guard — остались
- test_scraper_kit_yandex_golden_parity.py — SERP `_entity_to_lot`/
  `_parse_gate_json`/`_build_url` (yandex_realty) убраны; normalize_house_type
  (live)/newbuilding parse (yandex_newbuilding, live)/no-app-imports guard —
  остались
- test_scraper_kit_bisection_parity.py — cian/domclick/yandex-ветки убраны;
  avito-ветка (live, единственная оставшаяся легаси-бисекция) — осталась
  полностью, включая full-seed-grid
- test_scraper_kit_group_c_backfill_kit_parity.py — cian fetch_detail
  browser_fetcher parity-тест убран; avito/house_imv_backfill/
  cian_history_backfill/ekb_geoportal тесты — остались
- test_scraper_kit_pricehistory_session_parity.py — fetch_detail
  config-injection/proxy-wiring тесты (cian_detail) убраны; extract_state
  (cian_state_parser, live)/ScrapedLot (base, live) parity — остались
- test_yandex_scrapers_delay_wiring.py — yandex_realty delay-тест убран
  (kit-эквивалент уже покрыт test_kit_serp_proxy_pool.py); yandex_newbuilding
  (live)/yandex_detail/yandex_valuation (kit) тесты — остались
- test_scraper_proxy.py — yandex_realty BrowserFetcher-тест убран (redundant
  с test_kit_serp_proxy_pool.py::test_yandex_serp_no_pool_by_default)

RETARGET на kit (символ живёт, только источник поменялся):
- test_domclick_sweep.py — `_map_item` → scraper_kit.providers.domclick.serp
- test_yandex_city_sweep.py — DEFAULT_PRICE_RANGES/ROOM_PATH →
  scraper_kit.providers.yandex.serp
- test_pipeline_browser_routing.py — fetch_house_catalog →
  scraper_kit.providers.avito.houses (+ KitAvitoBlockedError для firewall-теста)
- test_snapshot_writer.py — DetailEnrichment/save_detail_enrichment →
  scraper_kit.providers.cian.detail (byte-identical strangler-копия)
- test_backfill_wave2.py — DetailEnrichment → scraper_kit.providers.cian.detail
- tests/scrapers/test_avito_unix_date_tz_consistency.py — avito_houses →
  scraper_kit.providers.avito.houses (houses-ветка _unix_to_date/RUS_MONTHS
  consolidation-проверки)

Stale-комментарии поправлены в cian_price_history.py, tests/scrapers/
test_domclick_detail.py (описывали ещё-живой domclick.py/domclick_exceptions.py).

grep -rn scrapers\.\(cian\|cian_detail\|yandex_realty\|domclick\|domclick_exceptions\|
avito_houses\) app/ scripts/ packages/ — только historical footnotes
("strangler-копия app.services.scrapers.X", past-tense "удалён/deleted").

Backend suite: 2811 passed, 6 skipped, 1 failed (known flake test_search_cache_hit
#2208, не регрессия). ruff check чист на всех изменённых файлах.
lekss361 merged commit eafa305ac8 into main 2026-07-04 11:49:44 +00:00
lekss361 deleted branch chore/tradein-partE2-delete-orphaned-scrapers 2026-07-04 11:49:45 +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#2407
No description provided.