chore(tradein/geocoder): удалить остатки скриптов Яндекс-геокодера, часть 3 (#2593) #2599

Merged
lekss361 merged 2 commits from chore/tradein-remove-yandex-scripts into main 2026-07-31 20:53:43 +00:00
Owner

Часть 3 выпиливания Yandex-геокодера (части 1-2 — PR #2595, #2596, −845 строк). Nominatim остаётся единственным живым внешним геокодером (app/services/geocoder.py).

Удалено

  • scripts/_yandex_reverse.py, scripts/audit_address_mismatch.py, scripts/backfill_house_coords.py — мёртвые ops-скрипты, опирались на Yandex Geocoder API, недостижимы после частей 1-2
  • их тесты: tests/test_audit_address_mismatch.py, tests/test_backfill_house_coords.py
  • фикстура tests/fixtures/yandex_geocode_sample.json — использовалась только в test_audit_address_mismatch.py (grep по всем тестам подтвердил отсутствие других потребителей), стала сиротой
  • scripts/audit_address_sample.sql, scripts/address_audit_report.sql — SQL-хелперы, использовались только audit_address_mismatch.py (не в исходном списке задачи, добавлены как логичное продолжение — были бы осиротевшими ad-hoc report-скриптами без вызывающего кода)

Документация (трейл)

  • tradein-mvp/backend/scripts/README.md — убраны секции "Production usage" и "Address audit + backfill (issue #582)", целиком описывавшие удалённые скрипты; оставлена короткая заметка о том, что и почему убрано + куда теперь смотреть (geocode_deals_nominatim.py)
  • tradein-mvp/DEPLOY.md — убраны все упоминания YANDEX_GEOCODER_API_KEY (переменная больше нигде не читается живым кодом)
  • docs/Secrets_Rotation_Policy.md — убрана строка YANDEX_GEOCODER_API_KEY из таблицы секретов tradein-стека и из класса ротации D

Осознанно НЕ тронуто (вне scope / живой код)

  • scripts/geocode_deals_nominatim.py и его тесты — живой скрипт (не трогал по прямому указанию); в его docstring остались 2 стилистически устаревшие строки про YANDEX_GEOCODER_API_KEY (переменная там ни на что не влияет, реального os.environ.get на неё нет) — не правил, т.к. модуль вне scope этого PR
  • app/services/geocoder.py — модуль не модифицировался (только что дважды переработан); в нём остались исторические комментарии про удалённый _yandex_reverse (задокументированы как dead-but-kept для parity с фронтом)
  • tradein-mvp/docker-compose.prod.yml — комментарии про YANDEX_GEOCODER_API_KEY/backfill_house_coords.py устарели, но файл вне scope backend-engineer (devops-owned) — не трогал
  • tests/services/test_cadastral_reverse.py:215 — инертный mock_settings.yandex_geocoder_api_key = None на MagicMock (в реальном Settings такого поля больше нет) — безобидный мусор, не функциональный трейл, оставил
  • таблица address_mismatch_audit (data/sql/066_*.sql) и её использование в house_dedup_merge.py — живая часть house-dedup pipeline, независимая от Yandex-аудита, не трогал
  • ~7 файлов тестов/скриптов с комментариями вида "тот же паттерн, что в test_backfill_house_coords.py" (SAVEPOINT convention citation, не про Yandex-функциональность) — не правил, минорный doc drift, не incorrect по факту
  • подсистема Яндекс.НЕДВИЖИМОСТЬ (скрапер source='yandex', deploy/cron-scrape.sh) — другая подсистема, не трогал

Новый тест

tests/test_geocoder_nominatim_lookup.py — closes coverage gap, оставленный удалением yandex-тестов (они были единственной проверкой, что city/city_hint реально доходит до исходящего HTTP-запроса, а не только до cache-ключа). Мокает HTTP-транспорт через httpx.MockTransport (паттерн test_geocoder_bbox.py/tests/services/test_dadata.py) и ассертит параметр q= реального GET к nominatim.openstreetmap.org/search:

  • test_nominatim_lookup_sends_city_hint_in_query_paramcity_hint="Нижний Тагил" попадает в q=
  • test_nominatim_lookup_no_city_sends_bare_address — без города q= остаётся bare-адресом (regression guard против молчаливого дефолта, #2576)

Тесты

Полный pytest в tradein-mvp/backend: 2900 passed, 1 failed (pre-existing), 9 skipped (~124s).

Pre-existing fail: tests/test_search_api.py::test_search_cache_hit (assert 401 == 200) — воспроизведён и на чистом forgejo/main (до этого PR), не связан с geocoder-изменениями; похоже на регрессию недавнего auth-db PR #2597 (RBAC на /api/v1/search).

Refs #2593

Часть 3 выпиливания Yandex-геокодера (части 1-2 — PR #2595, #2596, −845 строк). Nominatim остаётся единственным живым внешним геокодером (`app/services/geocoder.py`). ## Удалено - `scripts/_yandex_reverse.py`, `scripts/audit_address_mismatch.py`, `scripts/backfill_house_coords.py` — мёртвые ops-скрипты, опирались на Yandex Geocoder API, недостижимы после частей 1-2 - их тесты: `tests/test_audit_address_mismatch.py`, `tests/test_backfill_house_coords.py` - фикстура `tests/fixtures/yandex_geocode_sample.json` — использовалась только в `test_audit_address_mismatch.py` (grep по всем тестам подтвердил отсутствие других потребителей), стала сиротой - `scripts/audit_address_sample.sql`, `scripts/address_audit_report.sql` — SQL-хелперы, использовались только `audit_address_mismatch.py` (не в исходном списке задачи, добавлены как логичное продолжение — были бы осиротевшими ad-hoc report-скриптами без вызывающего кода) ## Документация (трейл) - `tradein-mvp/backend/scripts/README.md` — убраны секции "Production usage" и "Address audit + backfill (issue #582)", целиком описывавшие удалённые скрипты; оставлена короткая заметка о том, что и почему убрано + куда теперь смотреть (`geocode_deals_nominatim.py`) - `tradein-mvp/DEPLOY.md` — убраны все упоминания `YANDEX_GEOCODER_API_KEY` (переменная больше нигде не читается живым кодом) - `docs/Secrets_Rotation_Policy.md` — убрана строка `YANDEX_GEOCODER_API_KEY` из таблицы секретов tradein-стека и из класса ротации D ## Осознанно НЕ тронуто (вне scope / живой код) - `scripts/geocode_deals_nominatim.py` и его тесты — живой скрипт (не трогал по прямому указанию); в его docstring остались 2 стилистически устаревшие строки про `YANDEX_GEOCODER_API_KEY` (переменная там ни на что не влияет, реального `os.environ.get` на неё нет) — не правил, т.к. модуль вне scope этого PR - `app/services/geocoder.py` — модуль не модифицировался (только что дважды переработан); в нём остались исторические комментарии про удалённый `_yandex_reverse` (задокументированы как dead-but-kept для parity с фронтом) - `tradein-mvp/docker-compose.prod.yml` — комментарии про `YANDEX_GEOCODER_API_KEY`/`backfill_house_coords.py` устарели, но файл вне scope backend-engineer (devops-owned) — не трогал - `tests/services/test_cadastral_reverse.py:215` — инертный `mock_settings.yandex_geocoder_api_key = None` на MagicMock (в реальном `Settings` такого поля больше нет) — безобидный мусор, не функциональный трейл, оставил - таблица `address_mismatch_audit` (`data/sql/066_*.sql`) и её использование в `house_dedup_merge.py` — живая часть house-dedup pipeline, независимая от Yandex-аудита, не трогал - ~7 файлов тестов/скриптов с комментариями вида "тот же паттерн, что в test_backfill_house_coords.py" (SAVEPOINT convention citation, не про Yandex-функциональность) — не правил, минорный doc drift, не incorrect по факту - подсистема Яндекс.НЕДВИЖИМОСТЬ (скрапер `source='yandex'`, `deploy/cron-scrape.sh`) — другая подсистема, не трогал ## Новый тест `tests/test_geocoder_nominatim_lookup.py` — closes coverage gap, оставленный удалением yandex-тестов (они были единственной проверкой, что `city`/`city_hint` реально доходит до исходящего HTTP-запроса, а не только до cache-ключа). Мокает HTTP-транспорт через `httpx.MockTransport` (паттерн `test_geocoder_bbox.py`/`tests/services/test_dadata.py`) и ассертит параметр `q=` реального GET к `nominatim.openstreetmap.org/search`: - `test_nominatim_lookup_sends_city_hint_in_query_param` — `city_hint="Нижний Тагил"` попадает в `q=` - `test_nominatim_lookup_no_city_sends_bare_address` — без города `q=` остаётся bare-адресом (regression guard против молчаливого дефолта, #2576) ## Тесты Полный `pytest` в `tradein-mvp/backend`: **2900 passed, 1 failed (pre-existing), 9 skipped** (~124s). Pre-existing fail: `tests/test_search_api.py::test_search_cache_hit` (`assert 401 == 200`) — воспроизведён и на чистом `forgejo/main` (до этого PR), не связан с geocoder-изменениями; похоже на регрессию недавнего auth-db PR #2597 (RBAC на `/api/v1/search`). Refs #2593
lekss361 added 1 commit 2026-07-31 20:19:03 +00:00
chore(tradein/geocoder): удалить остатки скриптов Яндекс-геокодера, часть 3 (#2593)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
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 2m33s
feff55bea9
Удалены мёртвые ops-скрипты Yandex Geocoder (уже недостижимы после #2593 частей 1-2):
- scripts/_yandex_reverse.py, scripts/audit_address_mismatch.py, scripts/backfill_house_coords.py
- их тесты + осиротевшая фикстура tests/fixtures/yandex_geocode_sample.json
- осиротевшие SQL-хелперы scripts/audit_address_sample.sql, scripts/address_audit_report.sql (использовались только audit_address_mismatch.py)

Обновлена документация (осиротевшие упоминания YANDEX_GEOCODER_API_KEY / удалённых
скриптов): scripts/README.md, tradein-mvp/DEPLOY.md, docs/Secrets_Rotation_Policy.md.

Добавлен tests/test_geocoder_nominatim_lookup.py — покрывает _nominatim_lookup
(единственный живой внешний геокодер) на предмет реальной передачи city_hint в
исходящий HTTP-запрос к Nominatim; закрывает дыру в coverage, оставленную
удалёнными yandex-тестами.

Refs #2593
bot-backend added 1 commit 2026-07-31 20:37:03 +00:00
chore(tradein/geocoder): убрать мёртвую YANDEX_GEOCODER_API_KEY из .env.example (#2593)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
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 2m37s
10a62a0a56
lekss361 merged commit 090ab48992 into main 2026-07-31 20:53:43 +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#2599
No description provided.