rebuild(stage-5): establish market data gateway and charts

This commit is contained in:
leefer
2026-07-30 02:35:42 +08:00
parent 40ad5d6836
commit cf0ab7026f
45 changed files with 2701 additions and 46 deletions
+34
View File
@@ -0,0 +1,34 @@
from __future__ import annotations
from dataclasses import dataclass
from backend.data.contracts import DataSource, DataUsage
class DataPolicyError(RuntimeError):
pass
@dataclass(frozen=True, slots=True)
class DataSourcePolicy:
calculation_sources: frozenset[DataSource] = frozenset(
{DataSource.TUSHARE, DataSource.IFIND, DataSource.LOCAL}
)
display_sources: frozenset[DataSource] = frozenset(DataSource)
def assert_allowed(self, source: DataSource, usage: DataUsage) -> None:
allowed = (
self.calculation_sources if usage is DataUsage.CALCULATION else self.display_sources
)
if source not in allowed:
raise DataPolicyError(f"{source.value} cannot be used for {usage.value}")
def candidates(self, dataset: str, usage: DataUsage) -> tuple[DataSource, ...]:
routes = {
("calendar", DataUsage.CALCULATION): (DataSource.TUSHARE,),
("entities", DataUsage.CALCULATION): (DataSource.TUSHARE,),
("daily_chart", DataUsage.DISPLAY): (DataSource.IFIND, DataSource.TUSHARE),
("minute_chart", DataUsage.DISPLAY): (DataSource.IFIND, DataSource.EASTMONEY),
("realtime_quote", DataUsage.CALCULATION): (DataSource.IFIND, DataSource.TUSHARE),
}
return routes.get((dataset, usage), ())