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
60 changes: 30 additions & 30 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 All @@ -26,7 +26,7 @@ class AdvancedHittingSplit(MLBBaseModel):
The amount of sac bunts.
sac_flies : int
The amount of sac flies.
babip : str
babip : float
Batting Average on Balls in Play.
extra_base_hits : int
The amount of extra base hits.
Expand All @@ -38,17 +38,17 @@ class AdvancedHittingSplit(MLBBaseModel):
The amount of GIDP opportunities.
number_of_pitches : int
The number of pitches the batter has faced.
pitches_per_plate_appearance : str
pitches_per_plate_appearance : float
The avg amount of pitches per plate appearance.
walks_per_plate_appearance : str
walks_per_plate_appearance : float
The avg walks per plate appearance.
strikeouts_per_plate_appearance : str
strikeouts_per_plate_appearance : float
The amount of strike outs per plate appearance.
home_runs_per_plate_appearance : str
home_runs_per_plate_appearance : float
The amount of home runs per plate appearance.
walks_per_strikeout : str
walks_per_strikeout : float
The amount of walks per strike out.
iso : str
iso : float
Isolated power.
reached_on_error : int
The amount of times the batter has reached base on an error.
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] = Field(default=None, alias="walkOffs")
flyouts: Optional[int] = Field(default=None, alias="flyOuts")
Expand Down Expand Up @@ -144,19 +144,19 @@ class SimpleHittingSplit(MLBBaseModel):
The number of hits for the batter.
hit_by_pitch : int
The number of pitches the batter has been hit by.
avg : str
avg : float
The batting avg of the batter.
at_bats : int
The number of at bats of the batter.
obp : str
obp : float
The on base percentage of the batter.
slg : str
slg : float
The slugging percentage of the batter.
ops : str
ops : float
The on-base plus slugging of the batter.
caught_stealing : int
The amount of times the batter has been caught stealing.
caught_stealing_percentage : str
caught_stealing_percentage : float
The caught stealing percentage.
stolen_bases : int
The amount of stolen bases achieved by the batter.
Expand All @@ -180,7 +180,7 @@ class SimpleHittingSplit(MLBBaseModel):
The number of sac bunts performed by the batter.
sac_flies : int
The number of sac flies performed by the batter.
babip : str
babip : float
The batting average of balls in play of the batter.
groundouts_to_airouts : int
The groundout-to-airout ratio of the batter.
Expand All @@ -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