fix(nspd): list_layers parse flat layers[] response, not children-tree #1077
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1077
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/nspd-list-layers-flat-parse"
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?
Баг
NSPDClient.list_layers()парсил_walk_layer_treeпоid/children, но НСПД/api/geoportal/v1/layers-theme-tree?themeId=Nотдаёт{"layers": [...flat...], "tree": ...}— слои лежат в плоскомlayers[]с ключомlayerId(неid), не в children-дереве. →list_layers()молча возвращал[]для любой темы.Найдено при ИРД-разведке НСПД 2026-06-06 (vault
research/NSPD_IRD_Layers_Automation_Recon_Jun06). Не было замечено раньше, т.к. overlay layer-ID зашиты вLAYERSвручную —list_layers()нигде на горячем пути не использовался.Фикс
list_layers(): сначала пробует плоскийdata["layers"](актуальная форма,layerId), иначе fallback на_walk_layer_tree(старое nested-деревоid/children) + сохранён{"data": ...}-unwrap. Defensive на missing id (layerId→id→ skip).Тесты
test_list_layers_parses_flat_layers_response(новая форма). Старые тесты (nested-tree / data-wrapper / garbage) проходят без изменений — backward-compat сохранён.pytest tests/test_nspd_client.py→ 32 passed.ruff checkclean.Refs #1067 (ИРД — discovery слоёв НСПД).
НСПД /layers-theme-tree отдаёт {"layers":[...flat...], "tree":...} с ключом layerId, а list_layers() ходил _walk_layer_tree по id/children → молча возвращал [] для любой темы (слои не в children-дереве). Добавлен flat-layers путь с fallback на nested-tree (id/children) + data-wrapper; defensive на missing id. Refs #1067 (ИРД — discovery слоёв НСПД).✅ APPROVE
Логика корректна: приоритет
data["layers"](актуальный flat-формат,layerId) → fallback_walk_layer_tree(старое nestedid/children) →[]при garbage. Все три пути покрыты тестами; backward-compat (nested-tree / data-wrapper / garbage) сохранён без изменений старых тестов.entry.get("layerId", entry.get("id"))+None-guard корректнее прежнегоint(entry["id"]). Расширение data-unwrap guard на"layers" not in dataверное.Anti-regression проверена против HEAD ветки и vault (
NSPD_IRD_Layers_Automation_Recon_Jun06) — diff применяется чисто, callerslist_layers(не ломаются (раньше всегда[], downstream к пустому уже устойчив).Минорные (advisory, не блок): пустой
layers[]молча →[]без warning-лога — диагностический gap, не регрессия. В очередь не выношу.Merge → деплой-verify.