f20080305d
Определение специфических рекомендаций (матрица профилей §8):
1. Ж/д слой (закрыт мёртвый railway ×2.5 у РАС):
- /api/v1/water/{case_id} отдаёт railway=rail как LineString
(без service/industrial/military веток), кэш общий v2;
- railway_warning «перекрыть/проверить немедленно» по профилям;
- SearchMap: Polyline слой ж/д (тёмно-красный), счётчики 💧/🚂.
2. cant_swim → профиль не_умеет_плавать (water ×3.0, без изменения
радиуса, critical_warning «обследовать водоёмы НЕМЕДЛЕННО»):
- раньше чекбокс влиял только на текст, в скоринге был пробел;
- derive в analyze._derive_profiles — работает и для closed_cases.
3. unmodeled_profiles: ДЦП/слабое зрение/слух — честная пометка
«вне поведенческой модели» с пояснением (vector_tasks B12:
профили без аналога не выдавать за учтённые); блок на фронте
в карточке здоровья.
Площадь воды: сферический эксцесс, проверен на квадрате 53° (744017 м²
vs 743272 точного). Тесты: 202 passed (новый test_cant_swim_profile).
108 lines
3.0 KiB
Python
108 lines
3.0 KiB
Python
"""
|
|
Hook wrapper "result" utilities.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from types import TracebackType
|
|
from typing import Callable
|
|
from typing import cast
|
|
from typing import final
|
|
from typing import Generic
|
|
from typing import Optional
|
|
from typing import TypeVar
|
|
|
|
|
|
_ExcInfo = tuple[type[BaseException], BaseException, Optional[TracebackType]]
|
|
ResultType = TypeVar("ResultType")
|
|
|
|
|
|
class HookCallError(Exception):
|
|
"""Hook was called incorrectly."""
|
|
|
|
|
|
@final
|
|
class Result(Generic[ResultType]):
|
|
"""An object used to inspect and set the result in a :ref:`hook wrapper
|
|
<hookwrappers>`."""
|
|
|
|
__slots__ = ("_result", "_exception", "_traceback")
|
|
|
|
def __init__(
|
|
self,
|
|
result: ResultType | None,
|
|
exception: BaseException | None,
|
|
) -> None:
|
|
""":meta private:"""
|
|
self._result = result
|
|
self._exception = exception
|
|
# Exception __traceback__ is mutable, this keeps the original.
|
|
self._traceback = exception.__traceback__ if exception is not None else None
|
|
|
|
@property
|
|
def excinfo(self) -> _ExcInfo | None:
|
|
""":meta private:"""
|
|
exc = self._exception
|
|
if exc is None:
|
|
return None
|
|
else:
|
|
return (type(exc), exc, self._traceback)
|
|
|
|
@property
|
|
def exception(self) -> BaseException | None:
|
|
""":meta private:"""
|
|
return self._exception
|
|
|
|
@classmethod
|
|
def from_call(cls, func: Callable[[], ResultType]) -> Result[ResultType]:
|
|
""":meta private:"""
|
|
__tracebackhide__ = True
|
|
result = exception = None
|
|
try:
|
|
result = func()
|
|
except BaseException as exc:
|
|
exception = exc
|
|
return cls(result, exception)
|
|
|
|
def force_result(self, result: ResultType) -> None:
|
|
"""Force the result(s) to ``result``.
|
|
|
|
If the hook was marked as a ``firstresult`` a single value should
|
|
be set, otherwise set a (modified) list of results. Any exceptions
|
|
found during invocation will be deleted.
|
|
|
|
This overrides any previous result or exception.
|
|
"""
|
|
self._result = result
|
|
self._exception = None
|
|
self._traceback = None
|
|
|
|
def force_exception(self, exception: BaseException) -> None:
|
|
"""Force the result to fail with ``exception``.
|
|
|
|
This overrides any previous result or exception.
|
|
|
|
.. versionadded:: 1.1.0
|
|
"""
|
|
self._result = None
|
|
self._exception = exception
|
|
self._traceback = exception.__traceback__ if exception is not None else None
|
|
|
|
def get_result(self) -> ResultType:
|
|
"""Get the result(s) for this hook call.
|
|
|
|
If the hook was marked as a ``firstresult`` only a single value
|
|
will be returned, otherwise a list of results.
|
|
"""
|
|
__tracebackhide__ = True
|
|
exc = self._exception
|
|
tb = self._traceback
|
|
if exc is None:
|
|
return cast(ResultType, self._result)
|
|
else:
|
|
raise exc.with_traceback(tb)
|
|
|
|
|
|
# Historical name (pluggy<=1.2), kept for backward compatibility.
|
|
_Result = Result
|