Use lightweight ticker APIs for liquidity rank to cut memory.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,14 +1,20 @@
|
||||
from datetime import datetime
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from hub_volume_rank_lib import (
|
||||
CACHE_VERSION,
|
||||
LIQUIDITY_RANK_CACHE_VERSION,
|
||||
TOP_N_DEFAULT,
|
||||
_exchange_rank_row_stale,
|
||||
_okx_turnover_usdt,
|
||||
_scores_from_binance,
|
||||
_scores_from_gate,
|
||||
build_usdt_swap_volume_ranks,
|
||||
cache_needs_refresh,
|
||||
format_volume_quote,
|
||||
merge_exchange_rank,
|
||||
rank_date_label,
|
||||
resolve_daily_volume_rank,
|
||||
)
|
||||
|
||||
|
||||
@@ -63,3 +69,73 @@ def test_short_item_list_is_stale():
|
||||
assert _exchange_rank_row_stale(row) is True
|
||||
full = {"items": items + [{"rank": i, "symbol": f"X{i}/USDT"} for i in range(13, TOP_N_DEFAULT + 1)], "total_symbols": 300}
|
||||
assert _exchange_rank_row_stale(full) is False
|
||||
|
||||
|
||||
def test_scores_from_binance_uses_fapi_lightweight_api():
|
||||
ex = MagicMock()
|
||||
ex.id = "binance"
|
||||
ex.fapiPublicGetTicker24hr.return_value = [
|
||||
{"symbol": "BTCUSDT", "quoteVolume": "9000000"},
|
||||
{"symbol": "ETHUSDT", "quoteVolume": "5000000"},
|
||||
]
|
||||
scored = _scores_from_binance(ex)
|
||||
assert scored[0][1] == "BTC"
|
||||
assert scored[0][2] == 9000000.0
|
||||
ex.fetch_tickers.assert_not_called()
|
||||
|
||||
|
||||
def test_scores_from_gate_uses_futures_tickers_api():
|
||||
ex = MagicMock()
|
||||
ex.id = "gateio"
|
||||
ex.publicFuturesGetSettleTickers.return_value = [
|
||||
{"contract": "BTC_USDT", "volume_24h_quote": "8000000"},
|
||||
{"contract": "ETH_USDT", "volume_24h_quote": "4000000"},
|
||||
]
|
||||
scored = _scores_from_gate(ex)
|
||||
assert scored[0][1] == "BTC"
|
||||
ex.fetch_tickers.assert_not_called()
|
||||
|
||||
|
||||
def test_resolve_daily_volume_rank_caches_result():
|
||||
cache = {"version": 0, "updated_at": 0.0, "ranks": {}, "total": 0}
|
||||
ex = MagicMock()
|
||||
ex.id = "binance"
|
||||
ex.fapiPublicGetTicker24hr.return_value = [
|
||||
{"symbol": "BTCUSDT", "quoteVolume": "100"},
|
||||
{"symbol": "ETHUSDT", "quoteVolume": "50"},
|
||||
]
|
||||
|
||||
rank, total = resolve_daily_volume_rank(
|
||||
"BTC",
|
||||
cache,
|
||||
now_ts=1000.0,
|
||||
ttl_sec=60.0,
|
||||
exchange=ex,
|
||||
ensure_markets_loaded=lambda: None,
|
||||
)
|
||||
assert rank == 1
|
||||
assert total == 2
|
||||
assert cache["version"] == LIQUIDITY_RANK_CACHE_VERSION
|
||||
calls = ex.fapiPublicGetTicker24hr.call_count
|
||||
|
||||
rank2, _ = resolve_daily_volume_rank(
|
||||
"BTC",
|
||||
cache,
|
||||
now_ts=1010.0,
|
||||
ttl_sec=60.0,
|
||||
exchange=ex,
|
||||
ensure_markets_loaded=lambda: None,
|
||||
)
|
||||
assert rank2 == 1
|
||||
assert ex.fapiPublicGetTicker24hr.call_count == calls
|
||||
|
||||
|
||||
def test_build_usdt_swap_volume_ranks():
|
||||
ex = MagicMock()
|
||||
ex.id = "binance"
|
||||
ex.fapiPublicGetTicker24hr.return_value = [
|
||||
{"symbol": "SOLUSDT", "quoteVolume": "200"},
|
||||
]
|
||||
ranks, total = build_usdt_swap_volume_ranks(ex, lambda: None)
|
||||
assert ranks["SOL"] == 1
|
||||
assert total == 1
|
||||
|
||||
Reference in New Issue
Block a user