fix: None-поля в case_data ломали /analyze (float * NoneType)
Регресс B14: SearchInput.to_case_data() отдавал ключи с None
(elapsed_hours/age/...), а сервисы читают case_data.get(key, DEFAULT) —
ключ с None обманывает дефолт → TypeError в distance_service
('не удаётся запустить анализ' при запуске поиска со степ 1).
Фикс: to_case_data возвращает старую семантику _as_case_data —
None и пустые контейнеры выбрасываются. +2 регресс-теста.
192 passed.
This commit is contained in:
@@ -87,7 +87,12 @@ class SearchInput(BaseModel):
|
||||
|
||||
def to_case_data(self) -> dict[str, Any]:
|
||||
"""Плоский dict для сервисов (анализатор/скоринг) — тот же состав полей,
|
||||
что раньше уходил из analyze_case."""
|
||||
что раньше уходил из analyze_case.
|
||||
|
||||
None и пустые контейнеры выкидываются: сервисы читают через
|
||||
case_data.get(key, DEFAULT), и ключ с None обманывает дефолт
|
||||
(регресс 2026-09-09: elapsed_hours=None → TypeError в distance_service).
|
||||
"""
|
||||
data: dict[str, Any] = {
|
||||
'age': self.age,
|
||||
'gender': self.gender,
|
||||
@@ -114,7 +119,11 @@ class SearchInput(BaseModel):
|
||||
data['terrain_primary'] = _first_terrain(self.terrain)
|
||||
if self.time_of_day:
|
||||
data['time_of_day'] = self.time_of_day
|
||||
return data
|
||||
# Семантика старого _as_case_data: None и пустые ([]/{}) не проходят
|
||||
return {
|
||||
k: v for k, v in data.items()
|
||||
if v is not None and not (isinstance(v, (list, dict)) and len(v) == 0)
|
||||
}
|
||||
|
||||
|
||||
class SearchModel(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user