From 7900a68d0739483a43d190e6017d045d62d20eef Mon Sep 17 00:00:00 2001 From: dekun Date: Wed, 3 Jun 2026 21:34:39 +0800 Subject: [PATCH] fix(hub): preserve key monitors when enrich_monitor returns partial payload Co-authored-by: Cursor --- hub_bridge.py | 50 ++++++++++++++++++++++++------- tests/test_hub_monitor_payload.py | 39 ++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 tests/test_hub_monitor_payload.py diff --git a/hub_bridge.py b/hub_bridge.py index 7350d6c..2bfd1d5 100644 --- a/hub_bridge.py +++ b/hub_bridge.py @@ -52,6 +52,30 @@ def _row_to_dict(row): return dict(row) if row is not None else {} +def build_hub_monitor_payload( + *, + keys, + orders, + trends, + rolls, + enrich=None, +) -> dict: + """合并 enrich 增量字段;enrich 只返回 trends 等局部时不得丢掉 keys/orders。""" + payload = { + "ok": True, + "keys": keys, + "orders": orders, + "trends": trends, + "rolls": rolls, + "key_prices": [], + } + if callable(enrich): + extra = enrich(keys=keys, orders=orders, trends=trends, rolls=rolls) + if isinstance(extra, dict): + payload.update(extra) + return payload + + _FAIL_HINTS = ( "失败", "错误", @@ -280,20 +304,24 @@ def register_hub_routes(app): enrich = c.get("enrich_monitor") if callable(enrich): try: - payload = enrich(keys=keys, orders=orders, trends=trends, rolls=rolls) - if isinstance(payload, dict): - return jsonify({"ok": True, **payload}) + return jsonify( + build_hub_monitor_payload( + keys=keys, + orders=orders, + trends=trends, + rolls=rolls, + enrich=enrich, + ) + ) except Exception as e: return jsonify({"ok": False, "msg": str(e)}), 500 return jsonify( - { - "ok": True, - "keys": keys, - "orders": orders, - "trends": trends, - "rolls": rolls, - "key_prices": [], - } + build_hub_monitor_payload( + keys=keys, + orders=orders, + trends=trends, + rolls=rolls, + ) ) @app.route("/api/hub/ohlcv") diff --git a/tests/test_hub_monitor_payload.py b/tests/test_hub_monitor_payload.py new file mode 100644 index 0000000..4912c10 --- /dev/null +++ b/tests/test_hub_monitor_payload.py @@ -0,0 +1,39 @@ +"""hub /api/hub/monitor:enrich 局部返回时须保留 keys。""" +from __future__ import annotations + +import sys +import unittest +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT)) + +from hub_bridge import build_hub_monitor_payload # noqa: E402 + + +class TestHubMonitorPayload(unittest.TestCase): + def test_partial_enrich_keeps_keys(self): + keys = [{"id": 7, "symbol": "BTC/USDT"}] + orders = [{"id": 1}] + trends = [{"id": 9, "symbol": "ETH/USDT"}] + rolls = [] + + def enrich_only_trends(**_kw): + return {"trends": [{"id": 9, "add_count": 2}]} + + out = build_hub_monitor_payload( + keys=keys, + orders=orders, + trends=trends, + rolls=rolls, + enrich=enrich_only_trends, + ) + self.assertTrue(out["ok"]) + self.assertEqual(out["keys"], keys) + self.assertEqual(out["orders"], orders) + self.assertEqual(out["rolls"], rolls) + self.assertEqual(out["trends"][0]["add_count"], 2) + + +if __name__ == "__main__": + unittest.main()