feat(composite): M7.2b 因子组合落库 + /api/composites CRUD

- factor_composite 表(migration c3e9a0d1f4b5,MySQL 已应用;name 唯一)
- CompositeDefinition/Component 实体 + CompositeRepository Protocol + SQLAlchemy 实现
- /api/composites:POST(注册表自动填充组件 direction;未注册因子 400)、GET 列表/详情、DELETE
- tests/test_composites_api.py(repo CRUD/同名拒绝/删除、API 方向填充/404/400);全量 pytest 通过
This commit is contained in:
Simon
2026-09-09 00:30:37 +08:00
parent 273aee2772
commit 4fa2bb748e
10 changed files with 412 additions and 1 deletions
@@ -0,0 +1,37 @@
"""factor_composite 表(M7.2b 因子组合保存/复用)
Revision ID: c3e9a0d1f4b5
Revises: b7f2a5e81c33
Create Date: 2026-09-09
"""
from __future__ import annotations
from collections.abc import Sequence
import sqlalchemy as sa
from alembic import op
revision: str = "c3e9a0d1f4b5"
down_revision: str | None = "b7f2a5e81c33"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
def upgrade() -> None:
op.create_table(
"factor_composite",
sa.Column("id", sa.String(length=32), nullable=False),
sa.Column("name", sa.String(length=64), nullable=False),
sa.Column("method", sa.String(length=16), nullable=False),
sa.Column("description", sa.String(length=300), nullable=False),
sa.Column("components_json", sa.Text(), nullable=False),
sa.Column("created_at", sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint("id"),
sa.UniqueConstraint("name", name="uq_factor_composite_name"),
)
def downgrade() -> None:
op.drop_table("factor_composite")