53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
"""Pydantic schemas for scoring endpoints."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class DimensionScoreResponse(BaseModel):
|
|
"""A single dimension score."""
|
|
|
|
dimension: str
|
|
score: float
|
|
is_stale: bool
|
|
computed_at: datetime | None = None
|
|
|
|
|
|
class ScoreResponse(BaseModel):
|
|
"""Full score response for a ticker: composite + all dimensions."""
|
|
|
|
symbol: str
|
|
composite_score: float | None = None
|
|
composite_stale: bool = False
|
|
weights: dict[str, float] = {}
|
|
dimensions: list[DimensionScoreResponse] = []
|
|
missing_dimensions: list[str] = []
|
|
computed_at: datetime | None = None
|
|
|
|
|
|
class WeightUpdateRequest(BaseModel):
|
|
"""Request to update dimension weights."""
|
|
|
|
weights: dict[str, float] = Field(
|
|
...,
|
|
description="Dimension name → weight mapping. All weights must be positive.",
|
|
)
|
|
|
|
|
|
class RankingEntry(BaseModel):
|
|
"""A single entry in the rankings list."""
|
|
|
|
symbol: str
|
|
composite_score: float
|
|
dimensions: list[DimensionScoreResponse] = []
|
|
|
|
|
|
class RankingResponse(BaseModel):
|
|
"""Rankings response: tickers sorted by composite score descending."""
|
|
|
|
rankings: list[RankingEntry] = []
|
|
weights: dict[str, float] = {}
|