"""Pydantic response schemas for the Prism v2 Overview API.""" from typing import Literal from pydantic import BaseModel, Field class SearchResult(BaseModel): symbol: str name: str exchange: str | None = None class MarketIndex(BaseModel): name: str price: float | None = None change_pct: float | None = None class Quote(BaseModel): price: float | None = None prev_close: float | None = None change: float | None = None change_pct: float | None = None class Signal(BaseModel): key: str state: Literal["pos", "warn", "neg", "neu"] value: str description: str class OverviewStats(BaseModel): market_cap: float | None = None trailing_pe: float | None = None trailing_eps: float | None = None volume: float | None = None average_volume: float | None = None beta: float | None = None class OverviewRatios(BaseModel): price_to_book: float | None = None price_to_sales: float | None = None ev_to_sales: float | None = None ev_to_ebitda: float | None = None gross_margin_ttm: float | None = None operating_margin_ttm: float | None = None net_margin_ttm: float | None = None roe_ttm: float | None = None roa_ttm: float | None = None roic_ttm: float | None = None debt_to_equity: float | None = None current_ratio: float | None = None dividend_yield_ttm: float | None = None dividend_payout_ratio_ttm: float | None = None class Range52Week(BaseModel): low: float | None = None high: float | None = None price: float | None = None class ShortInterest(BaseModel): short_percent_of_float: float | None = None short_ratio: float | None = None shares_short: int | None = None shares_short_prior_month: int | None = None shares_short_delta_pct: float | None = None class CompanyProfile(BaseModel): symbol: str name: str sector: str | None = None industry: str | None = None exchange: str | None = None website: str | None = None summary: str | None = None class OverviewMeta(BaseModel): status: Literal["complete", "partial"] is_partial: bool = False field_availability: dict[str, bool] = Field(default_factory=dict) sources: dict[str, str] = Field(default_factory=dict) class TickerOverview(BaseModel): profile: CompanyProfile quote: Quote signals: list[Signal] = Field(default_factory=list) stats: OverviewStats ratios: OverviewRatios range_52w: Range52Week short_interest: ShortInterest meta: OverviewMeta class HistoryPoint(BaseModel): date: str open: float | None = None high: float | None = None low: float | None = None close: float | None = None volume: float | None = None class FinancialRow(BaseModel): label: str indent: int = 0 is_total: bool = False is_section: bool = False is_margin: bool = False values: list[float | None] = Field(default_factory=list) class FinancialStatement(BaseModel): columns: list[str] = Field(default_factory=list) rows: list[FinancialRow] = Field(default_factory=list) class FinancialsResponse(BaseModel): period: Literal["annual", "quarterly"] income: FinancialStatement balance: FinancialStatement cash_flow: FinancialStatement class WatchlistItem(BaseModel): symbol: str created_at: str quote: Quote | None = None class WatchlistResponse(BaseModel): items: list[WatchlistItem] limit: int = 10 class ErrorResponse(BaseModel): detail: str