test(c2): 补齐导入次序回归,注明环状导入为预期且可自愈

test_bzzoiro_source_registry.py 增至 11 项:
- 新增 TestImportOrderSelfHeal:用独立子进程验证两种真实导入次序
  (sources 先 / bzzoiro 先)下注册表均可用。该缺陷只在真实模块初始化
  时序下成立,mock 照不出来,故不 mock。
- 新增未知名字仍抛 ValueError 的契约守卫。

src/data/sources.py:补全 _load_sources 文档,说明首次装载失败属正常的
环状导入(bzzoiro 仍在初始化),失败时保持 _loaded=False 使后续
get_source()/list_sources() 调用可重试装载(自愈)。

验证:
- tests/test_bzzoiro_source_registry.py:11 passed
- 两种导入次序实测均输出 bzzoiro ['bzzoiro']
This commit is contained in:
shangfangjian
2026-09-21 17:13:57 +08:00
parent 9ccda4bf51
commit b9d7b6423e
2 changed files with 59 additions and 1 deletions
+7 -1
View File
@@ -66,6 +66,11 @@ def _load_sources() -> None:
导入失败必须留下痕迹:静默吞掉 ImportError 会让注册表恒为空,
导致 get_source() 对所有数据源都报「未知数据源」,把导入错误
伪装成「不存在的名字」—— 这类静默失效极难定位,故在此显式记日志。
失败时保持 _loaded=False:后续调用会重新尝试导入。正常应用流程中
src.api.app 先导入本模块,此处的模块级预热是在 `src.data.bzzoiro`
尚未初始化时发起的,导入链在本模块内成环,首次必然失败(bzzoiro
仍在加载中),由后续 get_source() / list_sources() 调用完成真正的装载。
"""
global _loaded
if _loaded:
@@ -74,7 +79,8 @@ def _load_sources() -> None:
from src.data.bzzoiro import BzzoiroSource # noqa: F401
except Exception:
logger.exception(
"数据源模块导入失败,注册表为空 —— get_source() 会对所有名字报「未知数据源」"
"数据源模块导入失败(通常为初始化中途的环状导入),本次注册表为空;"
"下次 get_source()/list_sources() 调用会自动重试"
)
return # 保持 _loaded=False,下次调用可重试
_loaded = True