from typing import Dict, Optional from loguru import logger from adapters.base import BaseDataAdapter from adapters.eastmoney import EastmoneyAdapter from adapters.ths import THSAdapter from adapters.xueqiu import XueqiuAdapter from adapters.tencent import TencentAdapter from models import DataSourceType, DataSource class DataAdapterFactory: _adapters: Dict[DataSourceType, BaseDataAdapter] = {} _default_adapter: Optional[BaseDataAdapter] = None @classmethod def get_adapter(cls, source: DataSourceType = DataSourceType.EASTMONEY) -> BaseDataAdapter: if source not in cls._adapters: if source == DataSourceType.EASTMONEY: cls._adapters[source] = EastmoneyAdapter() elif source == DataSourceType.THS: cls._adapters[source] = THSAdapter() elif source == DataSourceType.XUEQIU: cls._adapters[source] = XueqiuAdapter() elif source == DataSourceType.TENCENT: cls._adapters[source] = TencentAdapter() else: cls._adapters[source] = EastmoneyAdapter() return cls._adapters[source] @classmethod def get_default_adapter(cls) -> BaseDataAdapter: if cls._default_adapter is None: cls._default_adapter = cls.get_adapter(DataSourceType.EASTMONEY) return cls._default_adapter @classmethod async def get_available_sources(cls) -> list: sources = [] for source_type in DataSourceType: adapter = cls.get_adapter(source_type) is_available = await adapter.is_available() sources.append(DataSource( id=source_type.value, name=adapter.name, icon=cls._get_icon(source_type), is_available=is_available, )) return sources @classmethod def _get_icon(cls, source: DataSourceType) -> str: icons = { DataSourceType.EASTMONEY: "TrendingUp", DataSourceType.THS: "BarChart3", DataSourceType.XUEQIU: "Activity", DataSourceType.TENCENT: "LineChart", } return icons.get(source, "Database") @classmethod async def close_all(cls): for adapter in cls._adapters.values(): if hasattr(adapter, 'close'): await adapter.close() cls._adapters.clear() cls._default_adapter = None