Improve scan terminal freshness and AMSC overlay consistency
This commit is contained in:
@@ -185,7 +185,18 @@ def build_realtime_event_from_canonical(canonical: dict[str, Any]) -> Optional[d
|
||||
text = str(canonical.get(key) or "").strip()
|
||||
if text:
|
||||
payload[key] = text
|
||||
for key in ("freshness_sec", "confidence"):
|
||||
for key in (
|
||||
"freshness_sec",
|
||||
"confidence",
|
||||
"max_so_far",
|
||||
"signed_gap",
|
||||
"gap_to_target",
|
||||
"touch_distance",
|
||||
"current_reference",
|
||||
"edge",
|
||||
"edge_percent",
|
||||
"deb_prediction",
|
||||
):
|
||||
value_meta = canonical.get(key)
|
||||
if value_meta is not None and value_meta != "":
|
||||
payload[key] = value_meta
|
||||
|
||||
@@ -28,6 +28,14 @@ def _to_int(value: Any) -> Optional[int]:
|
||||
return None
|
||||
|
||||
|
||||
def _first_float(*values: Any) -> Optional[float]:
|
||||
for value in values:
|
||||
number = _to_float(value)
|
||||
if number is not None:
|
||||
return number
|
||||
return None
|
||||
|
||||
|
||||
def _now_iso() -> str:
|
||||
return datetime.now(timezone.utc).isoformat()
|
||||
|
||||
@@ -127,6 +135,7 @@ def build_canonical_temperature(
|
||||
canonical = {
|
||||
"city": str(city or payload.get("name") or payload.get("city") or "").strip().lower(),
|
||||
"value": round(value, 2),
|
||||
"max_so_far": _first_float(current.get("max_so_far"), current.get("max_temp_so_far")),
|
||||
"temp_symbol": str(payload.get("temp_symbol") or "°C"),
|
||||
"source": source,
|
||||
"source_label": source_label,
|
||||
@@ -142,6 +151,10 @@ def build_canonical_temperature(
|
||||
}
|
||||
age_text = f" updated {freshness_sec}s ago" if freshness_sec is not None else ""
|
||||
canonical["explanation"] = f"{source_label or source or 'Source'}{age_text}."
|
||||
deb = payload.get("deb") if isinstance(payload.get("deb"), dict) else {}
|
||||
deb_prediction = _to_float(deb.get("prediction"))
|
||||
if deb_prediction is not None:
|
||||
canonical["deb_prediction"] = deb_prediction
|
||||
return canonical
|
||||
|
||||
|
||||
@@ -190,6 +203,7 @@ def build_city_weather_from_canonical(city: str, canonical: Dict[str, Any]) -> O
|
||||
}
|
||||
current = {
|
||||
"temp": value,
|
||||
"max_so_far": _first_float(canonical.get("max_so_far"), value),
|
||||
"source_code": source,
|
||||
"settlement_source": source,
|
||||
"settlement_source_label": source_label,
|
||||
@@ -201,6 +215,7 @@ def build_city_weather_from_canonical(city: str, canonical: Dict[str, Any]) -> O
|
||||
}
|
||||
airport_primary = {
|
||||
"temp": value,
|
||||
"max_so_far": _first_float(canonical.get("max_so_far"), value),
|
||||
"source_code": source,
|
||||
"source_label": source_label,
|
||||
"obs_time": observed_at or observed_at_local,
|
||||
|
||||
@@ -45,12 +45,19 @@ def _payload_latest_epoch(payload: dict[str, Any], keys: tuple[str, ...]) -> Opt
|
||||
def _block_epoch(block: Any) -> Optional[int]:
|
||||
if not isinstance(block, dict):
|
||||
return None
|
||||
return _payload_latest_epoch(
|
||||
canonical_epoch = _payload_latest_epoch(
|
||||
block,
|
||||
(
|
||||
"observed_at",
|
||||
"observation_time",
|
||||
"obs_time",
|
||||
),
|
||||
)
|
||||
if canonical_epoch is not None:
|
||||
return canonical_epoch
|
||||
return _payload_latest_epoch(
|
||||
block,
|
||||
(
|
||||
"observed_at_local",
|
||||
"observation_time_local",
|
||||
),
|
||||
|
||||
@@ -23,6 +23,17 @@ def _supports_timing_recorder(func: Any) -> bool:
|
||||
)
|
||||
|
||||
|
||||
def _supports_keyword(func: Any, name: str) -> bool:
|
||||
try:
|
||||
params = signature(func).parameters.values()
|
||||
except (TypeError, ValueError):
|
||||
return True
|
||||
return any(
|
||||
param.name == name or param.kind == Parameter.VAR_KEYWORD
|
||||
for param in params
|
||||
)
|
||||
|
||||
|
||||
async def get_scan_terminal_payload(
|
||||
request: Request,
|
||||
*,
|
||||
@@ -36,6 +47,8 @@ async def get_scan_terminal_payload(
|
||||
time_range: str = "today",
|
||||
limit: int = 25,
|
||||
force_refresh: bool = False,
|
||||
diff: bool = False,
|
||||
since_snapshot_id: str | None = None,
|
||||
region: str = "",
|
||||
timezone_offset_seconds: int | None = None,
|
||||
) -> Dict[str, Any]:
|
||||
@@ -67,6 +80,10 @@ async def get_scan_terminal_payload(
|
||||
async def build_payload():
|
||||
builder = legacy_routes.build_scan_terminal_payload
|
||||
kwargs: Dict[str, Any] = {"force_refresh": force_refresh}
|
||||
if _supports_keyword(builder, "diff"):
|
||||
kwargs["diff"] = diff
|
||||
if _supports_keyword(builder, "since_snapshot_id"):
|
||||
kwargs["since_snapshot_id"] = since_snapshot_id
|
||||
if _supports_timing_recorder(builder):
|
||||
kwargs["timing_recorder"] = timer
|
||||
return await run_in_threadpool(builder, filters, **kwargs)
|
||||
|
||||
Reference in New Issue
Block a user