fix(hub): preserve key monitors when enrich_monitor returns partial payload
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+39
-11
@@ -52,6 +52,30 @@ def _row_to_dict(row):
|
|||||||
return dict(row) if row is not None else {}
|
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 = (
|
_FAIL_HINTS = (
|
||||||
"失败",
|
"失败",
|
||||||
"错误",
|
"错误",
|
||||||
@@ -280,20 +304,24 @@ def register_hub_routes(app):
|
|||||||
enrich = c.get("enrich_monitor")
|
enrich = c.get("enrich_monitor")
|
||||||
if callable(enrich):
|
if callable(enrich):
|
||||||
try:
|
try:
|
||||||
payload = enrich(keys=keys, orders=orders, trends=trends, rolls=rolls)
|
return jsonify(
|
||||||
if isinstance(payload, dict):
|
build_hub_monitor_payload(
|
||||||
return jsonify({"ok": True, **payload})
|
keys=keys,
|
||||||
|
orders=orders,
|
||||||
|
trends=trends,
|
||||||
|
rolls=rolls,
|
||||||
|
enrich=enrich,
|
||||||
|
)
|
||||||
|
)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"ok": False, "msg": str(e)}), 500
|
return jsonify({"ok": False, "msg": str(e)}), 500
|
||||||
return jsonify(
|
return jsonify(
|
||||||
{
|
build_hub_monitor_payload(
|
||||||
"ok": True,
|
keys=keys,
|
||||||
"keys": keys,
|
orders=orders,
|
||||||
"orders": orders,
|
trends=trends,
|
||||||
"trends": trends,
|
rolls=rolls,
|
||||||
"rolls": rolls,
|
)
|
||||||
"key_prices": [],
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@app.route("/api/hub/ohlcv")
|
@app.route("/api/hub/ohlcv")
|
||||||
|
|||||||
@@ -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()
|
||||||
Reference in New Issue
Block a user