feat(data): B1-2 指数成分同步(Provider + CLI sync index_weight)
- MarketDataProvider.get_index_weight(协议);Tushare 实现 normalize_index_weight + get_index_weight(ts_code=... 全历史成分权重);Sina 抛 DataSourceNotSupported; FailoverProvider 代理并审计每次尝试 - CLI:sync index_weight --code 000300.SH(拉取→幂等落库 index_weight→打印最新快照; 失败走 sync_log 审计并返回非零) - tests:Tushare 映射与调用(FakePro)、Failover 主源单源语义(新浪不支持被审计); 全量 pytest 通过
This commit is contained in:
@@ -224,3 +224,36 @@ class TestGetFinancialWindow:
|
||||
assert len(fake.kwargs) == 2
|
||||
assert fake.kwargs[1]["end_date"] < fake.kwargs[0]["end_date"]
|
||||
assert {r.report_date for r in rows} == {date.fromisoformat(e[:4] + "-" + e[4:6] + "-" + e[6:]) for e in newest + older}
|
||||
|
||||
|
||||
class TestIndexWeight:
|
||||
def test_normalize_mapping(self) -> None:
|
||||
from app.infrastructure.data_sources.tushare import TushareProvider
|
||||
|
||||
rows = TushareProvider.normalize_index_weight(
|
||||
[
|
||||
{"index_code": "000300.SH", "con_code": "600519.SH",
|
||||
"trade_date": "20240628", "weight": 1.53},
|
||||
{"con_code": "000001.SZ", "trade_date": "20240628", "weight": 0.9},
|
||||
],
|
||||
index_code_fallback="000300.SH",
|
||||
)
|
||||
assert len(rows) == 2
|
||||
assert rows[0].index_code == "000300.SH"
|
||||
assert rows[0].symbol == "600519.SH"
|
||||
assert rows[0].trade_date.isoformat() == "2024-06-28"
|
||||
assert float(rows[0].weight) == 1.53
|
||||
# 无 index_code 时用 fallback;con_code 缺失跳过
|
||||
assert rows[1].index_code == "000300.SH"
|
||||
|
||||
def test_provider_calls_index_weight(self) -> None:
|
||||
from app.infrastructure.data_sources.tushare import TushareProvider
|
||||
|
||||
pro = FakePro(
|
||||
payload=[{"index_code": "000300.SH", "con_code": "600519.SH",
|
||||
"trade_date": "20240628", "weight": 1.0}]
|
||||
)
|
||||
p = TushareProvider(token="t", pro=pro)
|
||||
rows = p.get_index_weight("000300.SH")
|
||||
assert pro.calls == ["index_weight"]
|
||||
assert len(rows) == 1 and rows[0].symbol == "600519.SH"
|
||||
|
||||
Reference in New Issue
Block a user