fix(ptica): «0 мм осадков» перестаёт означать «данных нет» (#2464) #2947
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
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#2947
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2464-precipitation-unknown-not-zero"
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?
Ноль, означавший «не знаем»
weather_cacheотдавал0, когда open-meteo не прислал ряд осадков:Ноль здесь — утверждение о погоде («сухо»), а пустой ряд значит, что мы не знаем. Разница доходит до пользователя:
ptica-adaptзаворачивал значение вreal(...)безусловно, то есть подавал его как измеренную величину.Непоследовательность внутри одного литерала
Шесть соседних агрегатов при пустых данных дают
None:min_c,max_c,avg_max_c,avg_min_c,uv_index_max,max_speed_m_s. Осадки были единственным исключением.В сезонном блоке ещё нагляднее — эти две строки идут подряд и считаются из одного списка:
Класс уже был решён в этом же файле
Раздел 7 тестов
weather_cache:То же рассуждение, тот же файл, только про ветер. Новые тесты зеркалят его структуру, включая заголовок раздела — чтобы следующий читатель увидел, что это одна и та же мысль, а не два разных случая.
Фронт: типы нашли потребителей сами
Сделал оба поля
number | null— иtscвыдал четыре ошибки в двух файлах, плюс нашёлся сезонный блок. Ровно для этого смена типа и нужна.Везде теперь «нет данных» вместо числа. В
ptica-adaptприменён образец соседней строкиavg_min_c: есть значение →real(), нет →notReal().Проверка
origin/mainprecipitation_sum= nullAssertionError: ожидался None, получено 0 — ноль здесь читается как «осадков не будет»precipitation_sumнетassert 0 is None[0,0,0]Контроль существенен: без него правку можно было бы «сделать» так, что осадки всегда
None— и оба первых теста стали бы зелёными по неверной причине, а продукт перестал бы показывать законный измеренный ноль.pytest tests/services: 3089 passed, 14 skipped, rc=0 (перепрогнано после хуков)tsc --noEmit: rc=0 ·vitest: 36 файлов, 279 тестов, rc=0Refs #2464
weather_cache отдавал 0, когда open-meteo не прислал ряд осадков: "precipitation_total_mm": round(sum(precip), 1) if precip else 0 "total_precip_mm": round(sum(precip), 0) if precip else 0 (сезонные) Ноль здесь — утверждение о погоде («сухо»), а пустой ряд значит, что мы не знаем. Разница видна пользователю: ptica-adapt заворачивал значение в real(...) БЕЗУСЛОВНО, то есть подавал его как измеренную величину. Непоследовательность внутри одного литерала: шесть соседних агрегатов при пустых данных дают None (min_c / max_c / avg_max_c / avg_min_c / uv_index_max / max_speed_m_s). В сезонном блоке ещё нагляднее — avg_precip_per_day_mm и total_precip_mm считаются из ОДНОГО списка соседними строками, первый даёт None, второй давал 0. В репозитории уже был решён ровно этот класс: раздел 7 тестов weather_cache — «wind_d all-None → dominant_direction_deg = None, а не 0.0° (= север)». Новые тесты зеркалят его структуру, включая заголовок раздела. Фронт: оба поля стали nullable, и TypeScript сам нашёл всех потребителей — четыре ошибки в двух файлах плюс сезонный блок. Везде «нет данных» вместо числа. В ptica-adapt применён образец соседней строки avg_min_c: есть значение → real(), нет → notReal(). Тесты: 2 красных на origin/main — «AssertionError: ожидался None, получено 0 — ноль здесь читается как «осадков не будет»». Контроль отдельный: настоящая сухая неделя (precip=[0,0,0]) обязана давать ИЗМЕРЕННЫЙ 0.0, а не None — без него правку можно было бы «сделать» так, что осадки всегда None, и оба теста стали бы зелёными по неверной причине. pytest tests/services: 3089 passed, 14 skipped, rc=0 (перепрогнано после хуков) tsc --noEmit rc=0 · vitest 36 файлов / 279 тестов rc=0prune -afубиваетcompose pullдеплоя ПТИЦЫ (разные группы concurrency, один докер-демон) #2950