- factor_definition 表(migration b7f2a5e81c33,MySQL 已应用):name 主键 + 元数据 (formula/brief/frequency/lookback/direction/requires JSON/version)+ FactorDefinition entity(from_registry_def 由代码注册表构造) - FactorRepository Protocol + SQLAlchemy 实现(幂等 upsert/list/get) - /api/factors 改读 DB;目录为空自动 seed 注册表(幂等)—— 保留自定义因子登记能力 (计算仍须代码注册,引用未注册因子照常 FactorError,防伪因子) - tests/test_factor_catalog.py(repo 幂等/roundtrip/registry seed、API seed+字段齐全); test_api 的 client fixture 补 tmp sqlite session(factors 读库);全量 pytest 通过
22 lines
804 B
Python
22 lines
804 B
Python
"""因子目录用例:把代码注册表因子 seed 进 DB(M7.1)。
|
|
|
|
DB 为目录契约源;本服务在 /api/factors 首次读取为空时自动 seed(幂等),
|
|
后续代码新增因子也通过同一入口同步,保持目录与可计算因子一致。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from app.domain.entities.factor import FactorDefinition
|
|
from app.domain.repositories.factor import FactorRepository
|
|
from app.quant.factors import list_factors
|
|
|
|
|
|
def seed_registry_factors(repo: FactorRepository, session) -> int:
|
|
"""把 quant/factors 注册表的元数据 upsert 进 factor_definition(幂等)。"""
|
|
defs = [FactorDefinition.from_registry_def(d) for d in list_factors()]
|
|
if not defs:
|
|
return 0
|
|
n = repo.upsert_many(defs)
|
|
session.commit()
|
|
return n
|