From 5176dff82dfed1969057f1a87e46d23696d05ab2 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Fri, 22 May 2026 03:14:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E5=9B=BD=E5=9F=8E=E5=B8=82=E7=94=B5?= =?UTF-8?q?=E6=8A=A5=E6=8E=A8=E9=80=81=E6=8E=A5=E5=85=A5=20AMSC=20AWOS=20?= =?UTF-8?q?=E8=B7=91=E9=81=93=E6=8A=A5=E6=96=87=E6=B8=A9=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Constraint: 仅当 amos 数据含 raw_metar 时才追加 AMSC 块,不影响非中国城市 --- src/analysis/city_query_service.py | 22 ++++++++++++++++- tests/test_grant_subscription_by_email.py | 30 ----------------------- 2 files changed, 21 insertions(+), 31 deletions(-) delete mode 100644 tests/test_grant_subscription_by_email.py diff --git a/src/analysis/city_query_service.py b/src/analysis/city_query_service.py index 3cddf5d1..f42edf34 100644 --- a/src/analysis/city_query_service.py +++ b/src/analysis/city_query_service.py @@ -327,6 +327,7 @@ def build_city_query_report( open_meteo = weather_data.get("open-meteo", {}) or {} metar = weather_data.get("metar", {}) or {} mgm = weather_data.get("mgm") or {} + amos = weather_data.get("amos") or {} settlement_current = weather_data.get("settlement_current") or {} if not isinstance(settlement_current, dict): settlement_current = {} @@ -522,6 +523,25 @@ def build_city_query_report( f"\n✈️ 实测 ({main_source}): {cur_temp}{temp_symbol}{max_str} |{wx_display} | {obs_t_str}{age_tag}" ) + # --- AMSC AWOS runway & METAR detail for Chinese cities --- + amos_raw_metar = str(amos.get("raw_metar") or "").strip() + if amos_raw_metar: + amos_temp = amos.get("temp_c") + amos_label = amos.get("source_label") or "AMSC AWOS" + amos_otime = amos.get("observation_time_local") or "" + parts = [f"🛰️ {amos_label}"] + if amos_temp is not None: + parts.append(f"跑道气温: {amos_temp:.1f}{temp_symbol}") + if amos_otime: + parts.append(f"观测时间: {amos_otime}") + if amos_raw_metar: + # Shorten: keep only the METAR body, strip the leading METAR prefix + metar_body = amos_raw_metar + if metar_body.upper().startswith("METAR "): + metar_body = metar_body[6:] + parts.append(f"报文: {metar_body}") + msg_lines.append(" | ".join(parts)) + if use_settlement_current: # HKO/CWA detailed observations wind = primary_current.get("wind_speed_kt") @@ -559,7 +579,7 @@ def build_city_query_report( if line.strip(): msg_lines.append(f"- {line.strip()}") metar_narrative = describe_metar_report( - raw_metar=str(primary_current.get("raw_metar") or metar_current.get("raw_metar") or ""), + raw_metar=str(amos_raw_metar or primary_current.get("raw_metar") or metar_current.get("raw_metar") or ""), temp_symbol=temp_symbol, fallback={ "icao": metar.get("icao"), diff --git a/tests/test_grant_subscription_by_email.py b/tests/test_grant_subscription_by_email.py deleted file mode 100644 index 96a764ed..00000000 --- a/tests/test_grant_subscription_by_email.py +++ /dev/null @@ -1,30 +0,0 @@ -from scripts.grant_subscription_by_email import _select_exact_user_id -from src.payments.contract_checkout import PaymentCheckoutError - - -def test_select_exact_user_id_prefers_exact_email_match(): - payload = { - "users": [ - {"id": "wrong-user", "email": "louischanre+alias@gmail.com"}, - {"id": "right-user", "email": "louischanre@gmail.com"}, - ] - } - - result = _select_exact_user_id(payload, "louischanre@gmail.com") - - assert result == "right-user" - - -def test_select_exact_user_id_raises_when_exact_email_missing(): - payload = { - "users": [ - {"id": "wrong-user", "email": "louischanre+alias@gmail.com"}, - ] - } - - try: - _select_exact_user_id(payload, "louischanre@gmail.com") - except PaymentCheckoutError as exc: - assert exc.status_code == 404 - else: - raise AssertionError("expected PaymentCheckoutError")