refactor(tradein/scraper-kit): cian providers on shared _base.py (#2362) #2374
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2374
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-scraper-kit-f4b-cian"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что мигрировано
Group F (#2309), sub-issue F4b: четыре cian-провайдера в
scraper_kitпереведены на общие фабрики из_base.py:providers/cian/serp.py—__aenter__→build_browser_fetcherproviders/cian/detail.py— own-session curl_cffi →build_curl_cffi_sessionproviders/cian/newbuilding.py— own-session curl_cffi →build_curl_cffi_sessionproviders/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'sBrowserFetcher(source="cian", endpoint=endpoint)— было endpoint-only безuse_pool/proxy_providerуже ДО этого диффа; правка добавила только explanatory comment, без изменения поведения. Caller-audit подтверждён:admin.py:1729зовёт legacyapp.services.scrapers.cian_newbuilding(неscraper_kit),orchestration/pipeline.py:2459всегда передаётconfig=.Два companion-теста ретаргетнуты на новую точку конструирования (
scraper_kit.providers._base):test_kit_serp_proxy_pool.pytest_scraper_kit_pricehistory_session_parity.pyReview
Code-reviewer verdict: approve. Два minor-замечания, оба вне кода этого PR (не блокируют):
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(проходят).cian/serp.py(blank-line-before-comment) — воспроизводится и наforgejo/mainбез этого диффа, не introduced здесь.Тесты
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
Мигрирует 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 чисто на всех изменённых файлах.