refactor(tradein/scraper-kit): cian providers on shared _base.py (#2362) #2374

Merged
lekss361 merged 1 commit from feat/tradein-scraper-kit-f4b-cian into main 2026-07-04 06:32:31 +00:00
Owner

Что мигрировано

Group F (#2309), sub-issue F4b: четыре cian-провайдера в scraper_kit переведены на общие фабрики из _base.py:

  • providers/cian/serp.py__aenter__build_browser_fetcher
  • providers/cian/detail.py — own-session curl_cffi → build_curl_cffi_session
  • providers/cian/newbuilding.py — own-session curl_cffi → build_curl_cffi_session
  • providers/cian/session.py — own-session curl_cffi → build_curl_cffi_session

Все kwargs сохранены byte-for-byte относительно pre-diff версий (сверено через git show forgejo/main:... по каждому файлу).

Единственное намеренно пропущенное место — newbuilding.py::fetch_newbuilding's BrowserFetcher(source="cian", endpoint=endpoint) — было endpoint-only без use_pool/proxy_provider уже ДО этого диффа; правка добавила только explanatory comment, без изменения поведения. Caller-audit подтверждён: admin.py:1729 зовёт legacy app.services.scrapers.cian_newbuilding (не scraper_kit), orchestration/pipeline.py:2459 всегда передаёт config=.

Два companion-теста ретаргетнуты на новую точку конструирования (scraper_kit.providers._base):

  • test_kit_serp_proxy_pool.py
  • test_scraper_kit_pricehistory_session_parity.py

Review

Code-reviewer verdict: approve. Два minor-замечания, оба вне кода этого PR (не блокируют):

  • Report ссылался на несуществующий файл test_admin_cian_kit_parity.py — вероятно copy-paste опечатка в отчёте агента; реальное parity-покрытие обеспечено существующими test_scraper_kit_base_golden_parity.py + test_scraper_kit_group_c_backfill_kit_parity.py (проходят).
  • Pre-existing ruff-format drift на cian/serp.py (blank-line-before-comment) — воспроизводится и на forgejo/main без этого диффа, не introduced здесь.

Тесты

  • Targeted (7 файлов): 133 passed
  • Parity suite (pipeline/base-golden/backfill/endpoint): 30 passed
  • Full backend suite: 3278 passed, 6 skipped, 1 failed (test_search_api.py::test_search_cache_hit — pre-existing flake #2208, auth-default issue, не связан с этим диффом)
  • ruff check чисто на всех 6 изменённых файлах; ruff format --check флагует pre-existing drift на serp.py (см. выше)

Closes #2362

## Что мигрировано Group F (#2309), sub-issue F4b: четыре cian-провайдера в `scraper_kit` переведены на общие фабрики из `_base.py`: - `providers/cian/serp.py` — `__aenter__` → `build_browser_fetcher` - `providers/cian/detail.py` — own-session curl_cffi → `build_curl_cffi_session` - `providers/cian/newbuilding.py` — own-session curl_cffi → `build_curl_cffi_session` - `providers/cian/session.py` — own-session curl_cffi → `build_curl_cffi_session` Все kwargs сохранены byte-for-byte относительно pre-diff версий (сверено через `git show forgejo/main:...` по каждому файлу). Единственное намеренно пропущенное место — `newbuilding.py::fetch_newbuilding`'s `BrowserFetcher(source="cian", endpoint=endpoint)` — было endpoint-only без `use_pool`/`proxy_provider` уже ДО этого диффа; правка добавила только explanatory comment, без изменения поведения. Caller-audit подтверждён: `admin.py:1729` зовёт legacy `app.services.scrapers.cian_newbuilding` (не `scraper_kit`), `orchestration/pipeline.py:2459` всегда передаёт `config=`. Два companion-теста ретаргетнуты на новую точку конструирования (`scraper_kit.providers._base`): - `test_kit_serp_proxy_pool.py` - `test_scraper_kit_pricehistory_session_parity.py` ## Review Code-reviewer verdict: **approve**. Два minor-замечания, оба вне кода этого PR (не блокируют): - Report ссылался на несуществующий файл `test_admin_cian_kit_parity.py` — вероятно copy-paste опечатка в отчёте агента; реальное parity-покрытие обеспечено существующими `test_scraper_kit_base_golden_parity.py` + `test_scraper_kit_group_c_backfill_kit_parity.py` (проходят). - Pre-existing ruff-format drift на `cian/serp.py` (blank-line-before-comment) — воспроизводится и на `forgejo/main` без этого диффа, не introduced здесь. ## Тесты - Targeted (7 файлов): 133 passed - Parity suite (pipeline/base-golden/backfill/endpoint): 30 passed - Full backend suite: 3278 passed, 6 skipped, 1 failed (`test_search_api.py::test_search_cache_hit` — pre-existing flake #2208, auth-default issue, не связан с этим диффом) - `ruff check` чисто на всех 6 изменённых файлах; `ruff format --check` флагует pre-existing drift на `serp.py` (см. выше) Closes #2362
lekss361 added 1 commit 2026-07-04 06:30:16 +00:00
refactor(tradein/scraper-kit): cian providers on shared _base.py (#2362)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 12s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 15s
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 1m41s
96dd27c4ae
Мигрирует call-site'ы cian/{serp,detail,newbuilding,session}.py на shared
фабрики Foundation-модуля (#2358): build_browser_fetcher() (serp.py __aenter__)
и build_curl_cffi_session() (detail.py own-session path, newbuilding.py
resolve_cian_zhk_url[_via_search], session.py verify_session). Headers/timeout/
proxy-resolution сохранены байт-в-байт — чистый call-site swap, без изменения
поведения.

Caveat (config Optional footgun): newbuilding.py::fetch_newbuilding() НЕ
переведена на build_browser_fetcher() — build_browser_fetcher() требует
ScraperConfig mandatory (весь смысл фабрики, закрывает класс багов #2322/#2330),
но здесь config: ScraperConfig | None = None легитимно Optional (admin.py
debug-роут и test_scraper_kit_newbuilding_endpoint.py вызывают функцию без
config= и ожидают graceful endpoint=None). Подмена уронила бы AttributeError
на config=None вместо текущего degrade — реальная регрессия, не call-site swap.
Оставлено как есть с комментарием в коде.

Companion test updates (не ослабление, retarget под рефактор): CianScraper
теперь строит BrowserFetcher внутри _base.py, а не в serp.py — два теста в
test_kit_serp_proxy_pool.py, патчившие cian_serp.BrowserFetcher напрямую,
переключены на scraper_kit.providers._base.BrowserFetcher (тот же инвариант,
другая точка патча). Аналогично test_scraper_kit_pricehistory_session_parity.py
::test_fetch_detail_own_session_proxy_wiring_parity — патч AsyncSession
переключён с cian.detail на _base (тот же assert на итоговый proxies=dict).

Tests: full backend suite 3278 passed, 1 pre-existing flake
(test_search_api.py::test_search_cache_hit, #2208), 6 skipped. Все
parity/regression тесты (test_scraper_kit_pipeline_parity2.py,
test_scraper_kit_newbuilding_endpoint.py, test_scraper_kit_cian_golden_parity.py,
test_kit_serp_proxy_pool.py, test_scraper_kit_pricehistory_session_parity.py,
test_cian_serp_scraper.py, test_cian_session.py, test_cian_detail.py) зелёные.
ruff check + format --check чисто на всех изменённых файлах.
lekss361 merged commit 53947015e9 into main 2026-07-04 06:32:31 +00:00
lekss361 deleted branch feat/tradein-scraper-kit-f4b-cian 2026-07-04 06:32:31 +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#2374
No description provided.