""" Earnings Surprise schemas """ from datetime import date from typing import Any, Dict, List, Optional from pydantic import BaseModel, ConfigDict, Field class EarningsSurpriseEntry(BaseModel): model_config = ConfigDict(from_attributes=True) fiscal_date_ending: date reported_date: Optional[date] = None reported_eps: Optional[float] = None estimated_eps: Optional[float] = None surprise: Optional[float] = None surprise_percentage: Optional[float] = None beat: Optional[bool] = None @classmethod def from_orm_obj(cls, obj) -> "EarningsSurpriseEntry": surprise = obj.surprise return cls( fiscal_date_ending=( obj.fiscal_date_ending.date() if hasattr(obj.fiscal_date_ending, "date") else obj.fiscal_date_ending ), reported_date=( obj.reported_date.date() if obj.reported_date and hasattr(obj.reported_date, "date") else obj.reported_date ), reported_eps=obj.reported_eps, estimated_eps=obj.estimated_eps, surprise=surprise, surprise_percentage=obj.surprise_percentage, beat=surprise > 0 if surprise is not None else None, ) class EarningsSurpriseResponse(BaseModel): symbol: str quarters: List[EarningsSurpriseEntry] streak: int = 0 # positive = consecutive beats, negative = consecutive misses avg_surprise_pct: Optional[float] = None metadata: Dict[str, Any] = Field(default_factory=dict)