Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions mlbstatsapi/models/base.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,28 @@
from pydantic import BaseModel, ConfigDict


from pydantic import BaseModel, ConfigDict, BeforeValidator
from typing import Annotated
def to_camel_case(value: str) -> str:
parts = value.split("_")
if not parts:
return value
return parts[0] + "".join(part[:1].upper() + part[1:] for part in parts[1:])


def float_or_none(v)-> float | None:
try:
f = float(v)
return f
except (TypeError, ValueError):
return None

OptionalFloat = Annotated[float | None, BeforeValidator(float_or_none)]

class MLBBaseModel(BaseModel):
"""Common base for all MLB Stats API models.

- Pydantic v2
- Ignores unknown fields to remain resilient to API changes
- populate_by_name allows alias-based population when needed
"""

model_config = ConfigDict(
extra="ignore",
alias_generator=to_camel_case,
Expand Down
30 changes: 15 additions & 15 deletions mlbstatsapi/models/stats/catching.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Optional, List, ClassVar
from pydantic import Field
from mlbstatsapi.models.base import MLBBaseModel
from mlbstatsapi.models.base import MLBBaseModel, OptionalFloat
from mlbstatsapi.models.teams import Team
from mlbstatsapi.models.game import Game
from .stats import Split
Expand Down Expand Up @@ -30,23 +30,23 @@ class SimpleCatchingSplit(MLBBaseModel):
The number of hits while catching.
hit_by_pitch : int
The number of batters hit by a pitch while catching.
avg : str
avg : float
The batting average while catching.
at_bats : int
The number of at bats while catching.
obp : str
obp : float
The on base percentage while catching.
slg : str
slg : float
The slugging percentage while catching.
ops : str
ops : float
The on-base slugging while catching.
caught_stealing : int
The number of runners caught stealing by the catcher.
caught_stealing_percentage : str
caught_stealing_percentage : float
Percentage of runners caught stealing by the catcher.
stolen_bases : int
The number of stolen bases while catching.
stolen_base_percentage : str
stolen_base_percentage : float
The stolen base percentage against the catcher.
earned_runs : int
The earned run amount against the catcher.
Expand All @@ -62,7 +62,7 @@ class SimpleCatchingSplit(MLBBaseModel):
The number of pick offs while catching.
total_bases : int
The total number of bases.
strikeout_walk_ratio : str
strikeout_walk_ratio : float
The strike out to walk ratio while catching.
catchers_interference : int
The number of times catcher interference committed.
Expand All @@ -84,23 +84,23 @@ class SimpleCatchingSplit(MLBBaseModel):
intentional_walks: Optional[int] = Field(default=None, alias="intentionalWalks")
hits: Optional[int] = None
hit_by_pitch: Optional[int] = Field(default=None, alias="hitByPitch")
avg: Optional[str] = None
avg: OptionalFloat = None
at_bats: Optional[int] = Field(default=None, alias="atBats")
obp: Optional[str] = None
slg: Optional[str] = None
ops: Optional[str] = None
obp: OptionalFloat = None
slg: OptionalFloat = None
ops: OptionalFloat = None
caught_stealing: Optional[int] = Field(default=None, alias="caughtStealing")
caught_stealing_percentage: Optional[str] = Field(default=None, alias="caughtStealingPercentage")
caught_stealing_percentage: OptionalFloat = Field(default=None, alias="caughtStealingPercentage")
stolen_bases: Optional[int] = Field(default=None, alias="stolenBases")
stolen_base_percentage: Optional[str] = Field(default=None, alias="stolenBasePercentage")
stolen_base_percentage: OptionalFloat = Field(default=None, alias="stolenBasePercentage")
earned_runs: Optional[int] = Field(default=None, alias="earnedRuns")
batters_faced: Optional[int] = Field(default=None, alias="battersFaced")
games_pitched: Optional[int] = Field(default=None, alias="gamesPitched")
hit_batsmen: Optional[int] = Field(default=None, alias="hitBatsmen")
wild_pitches: Optional[int] = Field(default=None, alias="wildPitches")
pickoffs: Optional[int] = None
total_bases: Optional[int] = Field(default=None, alias="totalBases")
strikeout_walk_ratio: Optional[str] = Field(default=None, alias="strikeoutWalkRatio")
strikeout_walk_ratio: OptionalFloat = Field(default=None, alias="strikeoutWalkRatio")
catchers_interference: Optional[int] = Field(default=None, alias="catchersInterference")
sac_bunts: Optional[int] = Field(default=None, alias="sacBunts")
sac_flies: Optional[int] = Field(default=None, alias="sacFlies")
Expand Down
30 changes: 15 additions & 15 deletions mlbstatsapi/models/stats/fielding.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Optional, Any, List, ClassVar
from pydantic import Field, field_validator
from mlbstatsapi.models.base import MLBBaseModel
from mlbstatsapi.models.base import MLBBaseModel, OptionalFloat
from mlbstatsapi.models.people import Position
from mlbstatsapi.models.teams import Team
from mlbstatsapi.models.game import Game
Expand All @@ -21,11 +21,11 @@ class SimpleFieldingSplit(MLBBaseModel):
The number of games started.
caught_stealing : int
The number of runners caught stealing.
caught_stealing_percentage : str
caught_stealing_percentage : float
The percentage of runners caught stealing.
stolen_bases : int
The number of stolen bases.
stolen_base_percentage : str
stolen_base_percentage : float
The stolen base percentage.
assists : int
The number of assists.
Expand All @@ -35,13 +35,13 @@ class SimpleFieldingSplit(MLBBaseModel):
The number of errors committed.
chances : int
The number of chances.
fielding : str
fielding : float
The fielding percentage.
range_factor_per_game : str
range_factor_per_game : float
Range rating per game.
range_factor_per_9_inn : str
range_factor_per_9_inn : float
Range factor per 9 innings.
innings : str
innings : float
The number of innings played.
games : int
The number of games played.
Expand All @@ -51,7 +51,7 @@ class SimpleFieldingSplit(MLBBaseModel):
The number of double plays.
triple_plays : int
The number of triple plays.
catcher_era : str
catcher_era : float
The catcher ERA of the fielding stat.
catchers_interference : int
The number of times catchers interference was committed.
Expand All @@ -67,22 +67,22 @@ class SimpleFieldingSplit(MLBBaseModel):
games_played: Optional[int] = Field(default=None, alias="gamesPlayed")
games_started: Optional[int] = Field(default=None, alias="gamesStarted")
caught_stealing: Optional[int] = Field(default=None, alias="caughtStealing")
caught_stealing_percentage: Optional[str] = Field(default=None, alias="caughtStealingPercentage")
caught_stealing_percentage: OptionalFloat = Field(default=None, alias="caughtStealingPercentage")
stolen_bases: Optional[int] = Field(default=None, alias="stolenBases")
stolen_base_percentage: Optional[str] = Field(default=None, alias="stolenBasePercentage")
stolen_base_percentage: OptionalFloat = Field(default=None, alias="stolenBasePercentage")
assists: Optional[int] = None
putouts: Optional[int] = None
errors: Optional[int] = None
chances: Optional[int] = None
fielding: Optional[str] = None
range_factor_per_game: Optional[str] = Field(default=None, alias="rangeFactorPerGame")
range_factor_per_9_inn: Optional[str] = Field(default=None, alias="rangeFactorPer9Inn")
innings: Optional[str] = None
fielding: OptionalFloat = None
range_factor_per_game: OptionalFloat = Field(default=None, alias="rangeFactorPerGame")
range_factor_per_9_inn: OptionalFloat = Field(default=None, alias="rangeFactorPer9Inn")
innings: OptionalFloat = None
games: Optional[int] = None
passed_ball: Optional[int] = Field(default=None, alias="passedBall")
double_plays: Optional[int] = Field(default=None, alias="doublePlays")
triple_plays: Optional[int] = Field(default=None, alias="triplePlays")
catcher_era: Optional[str] = Field(default=None, alias="catcherEra")
catcher_era: OptionalFloat = Field(default=None, alias="catcherEra")
catchers_interference: Optional[int] = Field(default=None, alias="catchersInterference")
wild_pitches: Optional[int] = Field(default=None, alias="wildPitches")
throwing_errors: Optional[int] = Field(default=None, alias="throwingErrors")
Expand Down
34 changes: 17 additions & 17 deletions mlbstatsapi/models/stats/hitting.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from typing import Optional, List, Any, ClassVar
from pydantic import Field, field_validator
from mlbstatsapi.models.base import MLBBaseModel
from mlbstatsapi.models.base import MLBBaseModel, OptionalFloat
from mlbstatsapi.models.people import Person, Position, Batter, Pitcher
from mlbstatsapi.models.teams import Team
from mlbstatsapi.models.game import Game
Expand Down Expand Up @@ -83,18 +83,18 @@ class AdvancedHittingSplit(MLBBaseModel):
left_on_base: Optional[int] = Field(default=None, alias="leftOnBase")
sac_bunts: Optional[int] = Field(default=None, alias="sacBunts")
sac_flies: Optional[int] = Field(default=None, alias="sacFlies")
babip: Optional[str] = None
babip: OptionalFloat = None
extra_base_hits: Optional[int] = Field(default=None, alias="extraBaseHits")
hit_by_pitch: Optional[int] = Field(default=None, alias="hitByPitch")
gidp: Optional[int] = None
gidp_opp: Optional[int] = Field(default=None, alias="gidpOpp")
number_of_pitches: Optional[int] = Field(default=None, alias="numberOfPitches")
pitches_per_plate_appearance: Optional[str] = Field(default=None, alias="pitchesPerPlateAppearance")
walks_per_plate_appearance: Optional[str] = Field(default=None, alias="walksPerPlateAppearance")
strikeouts_per_plate_appearance: Optional[str] = Field(default=None, alias="strikeoutsPerPlateAppearance")
home_runs_per_plate_appearance: Optional[str] = Field(default=None, alias="homeRunsPerPlateAppearance")
walks_per_strikeout: Optional[str] = Field(default=None, alias="walksPerStrikeout")
iso: Optional[str] = None
pitches_per_plate_appearance: OptionalFloat = Field(default=None, alias="pitchesPerPlateAppearance")
walks_per_plate_appearance: OptionalFloat = Field(default=None, alias="walksPerPlateAppearance")
strikeouts_per_plate_appearance: OptionalFloat = Field(default=None, alias="strikeoutsPerPlateAppearance")
home_runs_per_plate_appearance: OptionalFloat = Field(default=None, alias="homeRunsPerPlateAppearance")
walks_per_strikeout: OptionalFloat = Field(default=None, alias="walksPerStrikeout")
iso: OptionalFloat = None
reached_on_error: Optional[int] = Field(default=None, alias="reachedOnError")
walkoffs: Optional[int] = None
flyouts: Optional[int] = None
Expand Down Expand Up @@ -203,15 +203,15 @@ class SimpleHittingSplit(MLBBaseModel):
intentional_walks: Optional[int] = Field(default=None, alias="intentionalWalks")
hits: Optional[int] = None
hit_by_pitch: Optional[int] = Field(default=None, alias="hitByPitch")
avg: Optional[str] = None
avg: OptionalFloat = None
at_bats: Optional[int] = Field(default=None, alias="atBats")
obp: Optional[str] = None
slg: Optional[str] = None
ops: Optional[str] = None
obp: OptionalFloat = None
slg: OptionalFloat = None
ops: OptionalFloat = None
caught_stealing: Optional[int] = Field(default=None, alias="caughtStealing")
caught_stealing_percentage: Optional[str] = Field(default=None, alias="caughtStealingPercentage")
caught_stealing_percentage: OptionalFloat = Field(default=None, alias="caughtStealingPercentage")
stolen_bases: Optional[int] = Field(default=None, alias="stolenBases")
stolen_base_percentage: Optional[str] = Field(default=None, alias="stolenBasePercentage")
stolen_base_percentage: OptionalFloat = Field(default=None, alias="stolenBasePercentage")
ground_into_double_play: Optional[int] = Field(default=None, alias="groundIntoDoublePlay")
ground_into_triple_play: Optional[int] = Field(default=None, alias="groundIntoTriplePlay")
number_of_pitches: Optional[int] = Field(default=None, alias="numberOfPitches")
Expand All @@ -221,10 +221,10 @@ class SimpleHittingSplit(MLBBaseModel):
left_on_base: Optional[int] = Field(default=None, alias="leftOnBase")
sac_bunts: Optional[int] = Field(default=None, alias="sacBunts")
sac_flies: Optional[int] = Field(default=None, alias="sacFlies")
babip: Optional[str] = None
groundouts_to_airouts: Optional[str] = Field(default=None, alias="groundoutsToAirouts")
babip: OptionalFloat = None
groundouts_to_airouts: OptionalFloat = Field(default=None, alias="groundoutsToAirouts")
catchers_interference: Optional[int] = Field(default=None, alias="catchersInterference")
at_bats_per_home_run: Optional[str] = Field(default=None, alias="atBatsPerHomeRun")
at_bats_per_home_run: OptionalFloat = Field(default=None, alias="atBatsPerHomeRun")


class HittingWinLoss(Split):
Expand Down
Loading
Loading