mlb 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -0
- data/README.md +329 -108
- data/lib/mlb/affiliates.rb +28 -0
- data/lib/mlb/alumni.rb +30 -0
- data/lib/mlb/attendance.rb +28 -0
- data/lib/mlb/attendance_record.rb +157 -0
- data/lib/mlb/award.rb +89 -11
- data/lib/mlb/awards.rb +17 -7
- data/lib/mlb/baseball_stat.rb +65 -0
- data/lib/mlb/baseball_stats.rb +12 -0
- data/lib/mlb/boxscore.rb +81 -0
- data/lib/mlb/boxscore_team_stats.rb +210 -0
- data/lib/mlb/client.rb +71 -0
- data/lib/mlb/coaches.rb +28 -0
- data/lib/mlb/code_description_type.rb +45 -0
- data/lib/mlb/collection.rb +48 -0
- data/lib/mlb/comparable_by_attribute.rb +56 -0
- data/lib/mlb/conference.rb +8 -1
- data/lib/mlb/conferences.rb +18 -10
- data/lib/mlb/connection.rb +130 -7
- data/lib/mlb/context_metrics.rb +90 -0
- data/lib/mlb/division.rb +24 -6
- data/lib/mlb/divisions.rb +24 -18
- data/lib/mlb/draft.rb +83 -0
- data/lib/mlb/draft_pick.rb +155 -0
- data/lib/mlb/error_handler.rb +21 -1
- data/lib/mlb/errors/bad_gateway.rb +6 -1
- data/lib/mlb/errors/bad_request.rb +1 -0
- data/lib/mlb/errors/client_error.rb +1 -0
- data/lib/mlb/errors/connection_exception.rb +1 -0
- data/lib/mlb/errors/error.rb +1 -0
- data/lib/mlb/errors/forbidden.rb +1 -0
- data/lib/mlb/errors/gateway_timeout.rb +6 -1
- data/lib/mlb/errors/gone.rb +1 -0
- data/lib/mlb/errors/http_error.rb +22 -2
- data/lib/mlb/errors/internal_server_error.rb +1 -0
- data/lib/mlb/errors/network_error.rb +6 -1
- data/lib/mlb/errors/not_acceptable.rb +1 -0
- data/lib/mlb/errors/not_found.rb +1 -0
- data/lib/mlb/errors/payload_too_large.rb +1 -0
- data/lib/mlb/errors/retryable.rb +15 -0
- data/lib/mlb/errors/server_error.rb +1 -0
- data/lib/mlb/errors/service_unavailable.rb +6 -1
- data/lib/mlb/errors/too_many_redirects.rb +1 -0
- data/lib/mlb/errors/too_many_requests.rb +6 -1
- data/lib/mlb/errors/unauthorized.rb +1 -0
- data/lib/mlb/errors/unprocessable_entity.rb +1 -0
- data/lib/mlb/event_type.rb +61 -0
- data/lib/mlb/event_types.rb +12 -0
- data/lib/mlb/free_agent.rb +78 -0
- data/lib/mlb/free_agents.rb +34 -0
- data/lib/mlb/game_changes.rb +87 -0
- data/lib/mlb/game_content.rb +251 -0
- data/lib/mlb/game_data.rb +155 -0
- data/lib/mlb/game_pace.rb +173 -0
- data/lib/mlb/game_status.rb +94 -0
- data/lib/mlb/game_statuses.rb +12 -0
- data/lib/mlb/game_type.rb +98 -0
- data/lib/mlb/game_types.rb +12 -0
- data/lib/mlb/handedness.rb +28 -10
- data/lib/mlb/high_low.rb +121 -0
- data/lib/mlb/hit_trajectories.rb +12 -0
- data/lib/mlb/hit_trajectory.rb +6 -0
- data/lib/mlb/home_run_derby.rb +285 -0
- data/lib/mlb/id_description_type.rb +44 -0
- data/lib/mlb/inning_score.rb +87 -0
- data/lib/mlb/job.rb +58 -0
- data/lib/mlb/job_type.rb +39 -0
- data/lib/mlb/job_types.rb +12 -0
- data/lib/mlb/jobs.rb +87 -0
- data/lib/mlb/language.rb +48 -0
- data/lib/mlb/languages.rb +12 -0
- data/lib/mlb/leader.rb +79 -0
- data/lib/mlb/leaders.rb +68 -0
- data/lib/mlb/league.rb +95 -14
- data/lib/mlb/league_leader_type.rb +21 -0
- data/lib/mlb/league_leader_types.rb +12 -0
- data/lib/mlb/leagues.rb +24 -18
- data/lib/mlb/linescore.rb +342 -0
- data/lib/mlb/linescore_teams.rb +89 -0
- data/lib/mlb/live_feed.rb +130 -0
- data/lib/mlb/logical_event.rb +17 -0
- data/lib/mlb/logical_events.rb +12 -0
- data/lib/mlb/metric.rb +48 -0
- data/lib/mlb/metrics.rb +12 -0
- data/lib/mlb/people_changes.rb +34 -0
- data/lib/mlb/personnel.rb +28 -0
- data/lib/mlb/pitch_code.rb +90 -0
- data/lib/mlb/pitch_codes.rb +12 -0
- data/lib/mlb/pitch_type.rb +6 -0
- data/lib/mlb/pitch_types.rb +12 -0
- data/lib/mlb/platform.rb +30 -0
- data/lib/mlb/platforms.rb +12 -0
- data/lib/mlb/play.rb +300 -0
- data/lib/mlb/play_by_play.rb +52 -0
- data/lib/mlb/player.rb +182 -0
- data/lib/mlb/player_game_stats.rb +350 -0
- data/lib/mlb/player_stat.rb +70 -0
- data/lib/mlb/players.rb +34 -23
- data/lib/mlb/position.rb +65 -0
- data/lib/mlb/positions.rb +12 -0
- data/lib/mlb/postseason_schedule.rb +41 -0
- data/lib/mlb/postseason_series.rb +54 -0
- data/lib/mlb/redirect_handler.rb +80 -21
- data/lib/mlb/request_builder.rb +33 -2
- data/lib/mlb/review_reason.rb +6 -0
- data/lib/mlb/review_reasons.rb +12 -0
- data/lib/mlb/roster.rb +16 -12
- data/lib/mlb/roster_entry.rb +35 -0
- data/lib/mlb/roster_type.rb +39 -0
- data/lib/mlb/roster_types.rb +12 -0
- data/lib/mlb/schedule.rb +33 -0
- data/lib/mlb/schedule_date.rb +37 -0
- data/lib/mlb/schedule_event_type.rb +25 -0
- data/lib/mlb/schedule_event_types.rb +12 -0
- data/lib/mlb/scheduled_game.rb +321 -0
- data/lib/mlb/season.rb +15 -4
- data/lib/mlb/season_date_info.rb +1 -0
- data/lib/mlb/seasons.rb +24 -18
- data/lib/mlb/single_team_stats.rb +33 -0
- data/lib/mlb/situation_code.rb +116 -0
- data/lib/mlb/situation_codes.rb +12 -0
- data/lib/mlb/skies.rb +12 -0
- data/lib/mlb/sky.rb +3 -8
- data/lib/mlb/sport.rb +16 -5
- data/lib/mlb/sport_players.rb +30 -0
- data/lib/mlb/sports.rb +17 -7
- data/lib/mlb/standings.rb +47 -0
- data/lib/mlb/standings_record.rb +108 -0
- data/lib/mlb/standings_type.rb +25 -0
- data/lib/mlb/standings_types.rb +12 -0
- data/lib/mlb/stat_group.rb +21 -0
- data/lib/mlb/stat_groups.rb +12 -0
- data/lib/mlb/stat_type.rb +21 -0
- data/lib/mlb/stat_types.rb +12 -0
- data/lib/mlb/stat_values.rb +158 -0
- data/lib/mlb/stats.rb +41 -0
- data/lib/mlb/status.rb +14 -0
- data/lib/mlb/streaks.rb +184 -0
- data/lib/mlb/team.rb +62 -7
- data/lib/mlb/team_history.rb +28 -0
- data/lib/mlb/team_leader.rb +59 -0
- data/lib/mlb/team_leaders.rb +45 -0
- data/lib/mlb/team_record.rb +285 -0
- data/lib/mlb/team_stat.rb +50 -0
- data/lib/mlb/team_stats.rb +52 -0
- data/lib/mlb/teams.rb +28 -18
- data/lib/mlb/tied_games.rb +32 -0
- data/lib/mlb/transaction.rb +125 -0
- data/lib/mlb/transactions.rb +11 -6
- data/lib/mlb/uniforms.rb +97 -0
- data/lib/mlb/utils.rb +45 -0
- data/lib/mlb/venue.rb +7 -0
- data/lib/mlb/venues.rb +28 -18
- data/lib/mlb/version.rb +2 -1
- data/lib/mlb/win_probability.rb +64 -0
- data/lib/mlb/wind_direction.rb +3 -8
- data/lib/mlb/wind_directions.rb +12 -0
- data/lib/mlb.rb +61 -0
- data/sig/equalizer.rbs +3 -0
- data/sig/mlb.rbs +2055 -0
- data/sig/shale.rbs +29 -0
- metadata +107 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: db602fd85f9408753f1bafd303fde04b04f55397f22e991682b14a25add446f1
|
|
4
|
+
data.tar.gz: e4a3b1d6e2125c8b3a3fb31ae4318a8504bc9c290d6f798ad0c95a1386fe82cb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d4c25a70b9f418ff1a725f8e727ed0b8dbce4949f091302760f2aae8436cf84d2738cba2f8e2f73f3bbff36363637cdb94a7b9d548f406f1f25ee9e56ce2419b
|
|
7
|
+
data.tar.gz: 15c038e7a0bade972e0aacd3bf5a2ebadc67d07f4499bb9856057e43d52ed4b517a5dc7ed9e627e345897535a32df7290ad5181a87c273faaf9521da50f84d85
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
|
+
## [0.11.0] - 2025-12-30
|
|
2
|
+
* Add game data endpoints: Schedule, LiveFeed, Boxscore, Linescore, PlayByPlay
|
|
3
|
+
* Add Standings for league standings and team records
|
|
4
|
+
* Add Stats and Leaders for player/team statistics and league leaders
|
|
5
|
+
* Add HomeRunDerby for derby bracket, pool, and player performance data
|
|
6
|
+
* Add Draft for draft picks and prospect information
|
|
7
|
+
* Add FreeAgents for free agent tracking
|
|
8
|
+
* Add PostseasonSchedule and PostseasonSeries for playoff data
|
|
9
|
+
* Add Attendance for attendance records
|
|
10
|
+
* Add TeamStats, TeamLeaders, and TeamHistory endpoints
|
|
11
|
+
* Add metadata endpoints: GameTypes, GameStatuses, EventTypes, Positions, PitchTypes, PitchCodes, RosterTypes, and more
|
|
12
|
+
* Add WinProbability and ContextMetrics for advanced game analytics
|
|
13
|
+
* Add Jobs for umpires, official scorers, and datacasters
|
|
14
|
+
* Add Streaks for player hitting/pitching streaks
|
|
15
|
+
|
|
1
16
|
## [0.10.0] - 2025-04-30
|
|
2
17
|
* Drop support for Ruby 3.1
|
|
3
18
|
* Add equalizer for object identity
|
data/README.md
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
[](https://github.com/sferik/mlb-ruby/actions/workflows/test.yml)
|
|
2
|
-
[](https://codeclimate.com/github/sferik/mlb-ruby/test_coverage)
|
|
3
2
|
[](https://github.com/sferik/mlb-ruby/actions/workflows/mutant.yml)
|
|
4
3
|
[](https://github.com/sferik/mlb-ruby/actions/workflows/lint.yml)
|
|
5
|
-
[](https://codeclimate.com/github/sferik/mlb-ruby/maintainability)
|
|
6
4
|
[](https://rubygems.org/gems/mlb)
|
|
7
5
|
|
|
8
6
|
# A [Ruby](https://www.ruby-lang.org) interface to the [MLB Stats API](https://statsapi.mlb.com)
|
|
@@ -25,35 +23,326 @@ Or, if Bundler is not being used to manage dependencies:
|
|
|
25
23
|
|
|
26
24
|
```ruby
|
|
27
25
|
require "mlb"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Teams
|
|
29
|
+
|
|
30
|
+
```ruby
|
|
31
|
+
# Get all MLB teams for a season
|
|
32
|
+
teams = MLB::Teams.all(season: 2025)
|
|
33
|
+
teams.size # => 30
|
|
34
|
+
|
|
35
|
+
mets = teams.find { |t| t.id == MLB::Team::NYM }
|
|
36
|
+
mets.name # => "New York Mets"
|
|
37
|
+
mets.short_name # => "NY Mets"
|
|
38
|
+
mets.league.name # => "National League"
|
|
39
|
+
mets.division.name # => "National League East"
|
|
40
|
+
mets.first_year_of_play # => 1962
|
|
41
|
+
mets.venue.name # => "Citi Field"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Roster
|
|
45
|
+
|
|
46
|
+
```ruby
|
|
47
|
+
# Get a team's roster
|
|
48
|
+
roster = MLB::Roster.find(team: MLB::Team::NYM, season: 2025)
|
|
49
|
+
roster.size # => 39
|
|
50
|
+
|
|
51
|
+
# Find a specific player on the roster
|
|
52
|
+
entry = roster.find { |e| e.player.full_name == "Francisco Lindor" }
|
|
53
|
+
entry.player.full_name # => "Francisco Lindor"
|
|
54
|
+
entry.jersey_number # => 12
|
|
55
|
+
entry.position.name # => "Shortstop"
|
|
56
|
+
entry.status.description # => "Active"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Players
|
|
60
|
+
|
|
61
|
+
```ruby
|
|
62
|
+
# Find a player by ID
|
|
63
|
+
senga = MLB::Players.find(807882)
|
|
64
|
+
senga.full_name # => "Kodai Senga"
|
|
65
|
+
senga.primary_number # => 34
|
|
66
|
+
senga.primary_position.name # => "Pitcher"
|
|
67
|
+
senga.pitch_hand.description # => "Right"
|
|
68
|
+
senga.bat_side.description # => "Right"
|
|
69
|
+
senga.current_age # => 32
|
|
70
|
+
senga.birth_date.to_s # => "1993-01-30"
|
|
71
|
+
senga.birth_city # => "Nagaoka"
|
|
72
|
+
senga.birth_state_province # => "Niigata"
|
|
73
|
+
senga.birth_country # => "Japan"
|
|
74
|
+
senga.mlb_debut_date.to_s # => "2023-04-01"
|
|
75
|
+
senga.height # => "6' 1\""
|
|
76
|
+
senga.weight # => 200
|
|
77
|
+
senga.active? # => true
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Schedule
|
|
81
|
+
|
|
82
|
+
```ruby
|
|
83
|
+
# Get games for a specific date
|
|
84
|
+
games = MLB::Schedule.games(date: Date.new(2025, 6, 14))
|
|
85
|
+
games.size # => 15
|
|
86
|
+
|
|
87
|
+
# Get games for a specific team (Mets home opener)
|
|
88
|
+
mets_games = MLB::Schedule.games(date: Date.new(2025, 4, 4), team: MLB::Team::NYM)
|
|
89
|
+
game = mets_games.first
|
|
90
|
+
game.game_pk # => 778465
|
|
91
|
+
game.official_date.to_s # => "2025-04-04"
|
|
92
|
+
game.status.final? # => true
|
|
93
|
+
game.venue.name # => "Citi Field"
|
|
94
|
+
game.day? # => true
|
|
95
|
+
game.description # => "Mets home opener"
|
|
96
|
+
game.teams.away.team.name # => "Toronto Blue Jays"
|
|
97
|
+
game.teams.home.team.name # => "New York Mets"
|
|
98
|
+
game.teams.away.score # => 0
|
|
99
|
+
game.teams.home.score # => 5
|
|
100
|
+
game.teams.home.winner? # => true
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Standings
|
|
104
|
+
|
|
105
|
+
```ruby
|
|
106
|
+
# Get all division standings
|
|
107
|
+
standings = MLB::Standings.all(season: 2025)
|
|
108
|
+
standings.size # => 6
|
|
109
|
+
|
|
110
|
+
# Access a specific division
|
|
111
|
+
nl_east = standings.find { |s| s.division.name == "National League East" }
|
|
112
|
+
nl_east.division.name # => "National League East"
|
|
113
|
+
nl_east.team_records.size # => 5
|
|
114
|
+
|
|
115
|
+
# Get team standings info (Mets finished 2nd in NL East in 2025)
|
|
116
|
+
mets = nl_east.team_records.find { |r| r.team.name == "New York Mets" }
|
|
117
|
+
mets.team.name # => "New York Mets"
|
|
118
|
+
mets.wins # => 83
|
|
119
|
+
mets.losses # => 79
|
|
120
|
+
mets.winning_percentage # => ".512"
|
|
121
|
+
mets.games_back # => "13.0"
|
|
122
|
+
mets.runs_scored # => 766
|
|
123
|
+
mets.runs_allowed # => 715
|
|
124
|
+
mets.run_differential # => 51
|
|
125
|
+
mets.division_rank # => "2"
|
|
126
|
+
mets.streak.streak_code # => "L1"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Team Leaders
|
|
130
|
+
|
|
131
|
+
```ruby
|
|
132
|
+
# Get home run leaders for a specific team
|
|
133
|
+
hr_leaders = MLB::TeamLeaders.find(team: MLB::Team::NYM, category: "homeRuns", season: 2025)
|
|
134
|
+
hr_leaders.size # => 10
|
|
135
|
+
|
|
136
|
+
hr_leader = hr_leaders.first
|
|
137
|
+
hr_leader.rank # => 1
|
|
138
|
+
hr_leader.value # => "43"
|
|
139
|
+
hr_leader.person.full_name # => "Juan Soto"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### League Leaders
|
|
143
|
+
|
|
144
|
+
```ruby
|
|
145
|
+
# Get home run leaders
|
|
146
|
+
hr_leaders = MLB::Leaders.find(category: "homeRuns", season: 2025, limit: 5)
|
|
147
|
+
hr_leader = hr_leaders.first
|
|
148
|
+
hr_leader.rank # => 1
|
|
149
|
+
hr_leader.value # => "60"
|
|
150
|
+
hr_leader.person.full_name # => "Cal Raleigh"
|
|
151
|
+
hr_leader.team.name # => "Seattle Mariners"
|
|
152
|
+
|
|
153
|
+
# Get batting average leaders
|
|
154
|
+
avg_leaders = MLB::Leaders.find(category: "battingAverage", season: 2025, limit: 3)
|
|
155
|
+
avg_leaders.first.person.full_name # => "Aaron Judge"
|
|
156
|
+
avg_leaders.first.value # => ".331"
|
|
157
|
+
|
|
158
|
+
# Get wins leaders for pitchers
|
|
159
|
+
wins_leaders = MLB::Leaders.find(category: "wins", season: 2025, limit: 3)
|
|
160
|
+
wins_leaders.first.person.full_name # => "Max Fried"
|
|
161
|
+
wins_leaders.first.value # => "19"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Awards
|
|
165
|
+
|
|
166
|
+
```ruby
|
|
167
|
+
# Find an award and get its recipients
|
|
168
|
+
mvp = MLB::Awards.find("NLMVP")
|
|
169
|
+
recipients = mvp.recipients(season: 2025)
|
|
170
|
+
winner = recipients.first
|
|
171
|
+
winner.player.full_name # => "Shohei Ohtani"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Draft
|
|
175
|
+
|
|
176
|
+
```ruby
|
|
177
|
+
# Get draft picks for a year
|
|
178
|
+
picks = MLB::Draft.picks(year: 2025)
|
|
179
|
+
picks.size # => 615
|
|
180
|
+
|
|
181
|
+
# First overall pick
|
|
182
|
+
first_pick = picks.first
|
|
183
|
+
first_pick.pick_number # => 1
|
|
184
|
+
first_pick.pick_round # => "1"
|
|
185
|
+
first_pick.person.full_name # => "Eli Willits"
|
|
186
|
+
first_pick.team.name # => "Washington Nationals"
|
|
187
|
+
first_pick.school.name # => "Fort Cobb-Broxton HS"
|
|
188
|
+
first_pick.school.school_class # => "HS SR"
|
|
189
|
+
first_pick.pick_value # => "11075900"
|
|
190
|
+
first_pick.signing_bonus # => "8200000"
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Transactions
|
|
194
|
+
|
|
195
|
+
```ruby
|
|
196
|
+
# Get transactions for a date range
|
|
197
|
+
transactions = MLB::Transactions.between(
|
|
198
|
+
start_date: Date.new(2025, 12, 22),
|
|
199
|
+
end_date: Date.new(2025, 12, 22)
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
# Find a specific transaction
|
|
203
|
+
trade = transactions.find { |t| t.trade? && t.player&.full_name == "Jeff McNeil" }
|
|
204
|
+
trade.trade? # => true
|
|
205
|
+
trade.player.full_name # => "Jeff McNeil"
|
|
206
|
+
trade.from_team.name # => "New York Mets"
|
|
207
|
+
trade.to_team.name # => "Athletics"
|
|
208
|
+
trade.description # => "New York Mets traded 2B Jeff McNeil and cash to Athletics for RHP Yordan Rodriguez."
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Boxscore
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
# Get boxscore for Mets home opener (5-0 shutout win)
|
|
215
|
+
boxscore = MLB::Boxscore.find(game: 778465)
|
|
216
|
+
|
|
217
|
+
# Team batting stats
|
|
218
|
+
home_batting = boxscore.teams.home.team_stats.batting
|
|
219
|
+
home_batting.runs # => 5
|
|
220
|
+
home_batting.hits # => 4
|
|
221
|
+
home_batting.home_runs # => 1
|
|
222
|
+
home_batting.rbi # => 5
|
|
223
|
+
|
|
224
|
+
# Team pitching stats
|
|
225
|
+
home_pitching = boxscore.teams.home.team_stats.pitching
|
|
226
|
+
home_pitching.innings_pitched # => "9.0"
|
|
227
|
+
home_pitching.hits # => 4
|
|
228
|
+
home_pitching.strike_outs # => 10
|
|
229
|
+
home_pitching.earned_runs # => 0
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Linescore
|
|
233
|
+
|
|
234
|
+
```ruby
|
|
235
|
+
# Get linescore for 2025 World Series Game 7 (11 innings)
|
|
236
|
+
linescore = MLB::Linescore.find(game: 813024)
|
|
237
|
+
linescore.scheduled_innings # => 9
|
|
238
|
+
linescore.innings.count # => 11
|
|
239
|
+
|
|
240
|
+
# Team totals (runs, hits, errors)
|
|
241
|
+
linescore.teams.home.runs # => 4
|
|
242
|
+
linescore.teams.home.hits # => 14
|
|
243
|
+
linescore.teams.away.runs # => 5
|
|
244
|
+
linescore.teams.away.hits # => 11
|
|
245
|
+
|
|
246
|
+
# Inning-by-inning breakdown
|
|
247
|
+
eleventh = linescore.innings[10]
|
|
248
|
+
eleventh.ordinal_num # => "11th"
|
|
249
|
+
eleventh.away.runs # => 1
|
|
250
|
+
eleventh.away.hits # => 1
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### Play-by-Play
|
|
254
|
+
|
|
255
|
+
```ruby
|
|
256
|
+
# Get play-by-play for Mets home opener
|
|
257
|
+
pbp = MLB::PlayByPlay.find(game: 778465)
|
|
258
|
+
pbp.all_plays.size # => 65
|
|
259
|
+
pbp.scoring_plays.size # => 4
|
|
260
|
+
|
|
261
|
+
# Find scoring plays
|
|
262
|
+
scoring = pbp.all_plays.select { |p| p.about.scoring_play? }
|
|
263
|
+
hr = scoring.first
|
|
264
|
+
hr.about.inning # => 1
|
|
265
|
+
hr.about.scoring_play? # => true
|
|
266
|
+
hr.result.event # => "Home Run"
|
|
267
|
+
hr.result.description # => "Pete Alonso homers (3) on a fly ball to right field. Francisco Lindor scores."
|
|
268
|
+
hr.result.rbi # => 2
|
|
269
|
+
hr.matchup.batter.full_name # => "Pete Alonso"
|
|
270
|
+
hr.matchup.pitcher.full_name # => "Kevin Gausman"
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Win Probability
|
|
28
274
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
275
|
+
```ruby
|
|
276
|
+
# Get win probability data for 2025 World Series Game 7
|
|
277
|
+
# Dodgers vs Blue Jays at Rogers Centre (Dodgers won 5-4 in 11 innings)
|
|
278
|
+
wp = MLB::WinProbability.find(game: 813024)
|
|
279
|
+
wp.size # => 99
|
|
280
|
+
|
|
281
|
+
# Probability at game start (away team Dodgers slight favorites)
|
|
282
|
+
wp.first.at_bat_index # => 0
|
|
283
|
+
wp.first.home_team_win_probability # => 0.464
|
|
284
|
+
wp.first.away_team_win_probability # => 0.536
|
|
285
|
+
|
|
286
|
+
# After Bo Bichette's 3-run HR in the 3rd, Blue Jays led 3-0
|
|
287
|
+
wp[22].home_team_win_probability # => 0.828
|
|
288
|
+
wp[22].away_team_win_probability # => 0.172
|
|
289
|
+
|
|
290
|
+
# Miguel Rojas's game-tying HR in the 9th
|
|
291
|
+
wp[73].home_team_win_probability # => 0.558
|
|
292
|
+
wp[73].away_team_win_probability # => 0.442
|
|
293
|
+
|
|
294
|
+
# Will Smith's go-ahead HR in the 11th
|
|
295
|
+
wp[93].home_team_win_probability # => 0.194
|
|
296
|
+
wp[93].away_team_win_probability # => 0.806
|
|
297
|
+
|
|
298
|
+
# Final out - Dodgers clinch the title
|
|
299
|
+
wp.last.home_team_win_probability # => 0.0
|
|
300
|
+
wp.last.away_team_win_probability # => 1.0
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Venues
|
|
304
|
+
|
|
305
|
+
```ruby
|
|
306
|
+
# Get all MLB venues
|
|
307
|
+
venues = MLB::Venues.all(season: 2025)
|
|
308
|
+
venues.size # => 30
|
|
309
|
+
|
|
310
|
+
# Find a specific venue
|
|
311
|
+
citi_field = venues.find { |v| v.name == "Citi Field" }
|
|
312
|
+
citi_field.id # => 3289
|
|
313
|
+
citi_field.name # => "Citi Field"
|
|
314
|
+
citi_field.active? # => true
|
|
315
|
+
|
|
316
|
+
# Find venue by ID
|
|
317
|
+
citi_field = MLB::Venues.find(3289, season: 2025)
|
|
318
|
+
citi_field.name # => "Citi Field"
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Attendance
|
|
322
|
+
|
|
323
|
+
```ruby
|
|
324
|
+
# Get attendance data for a team
|
|
325
|
+
attendance = MLB::Attendance.find(team: MLB::Team::NYM, season: 2025)
|
|
326
|
+
record = attendance.first
|
|
327
|
+
record.team.name # => "New York Mets"
|
|
328
|
+
record.attendance_total # => 5816527
|
|
329
|
+
record.attendance_average_home # => 39316
|
|
330
|
+
record.attendance_high # => 43945
|
|
331
|
+
record.attendance_high_date # => 2025-04-04 (home opener)
|
|
332
|
+
record.games_home_total # => 82
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Game Pace
|
|
336
|
+
|
|
337
|
+
```ruby
|
|
338
|
+
# Get league-wide pace of play statistics
|
|
339
|
+
pace = MLB::GamePace.find(season: 2025)
|
|
340
|
+
pace.total_games # => 2430
|
|
341
|
+
pace.time_per_game # => "02:40:51"
|
|
342
|
+
pace.runs_per_game # => 8.89
|
|
343
|
+
pace.hits_per_game # => 16.52
|
|
344
|
+
pace.pitches_per_game # => 292.22
|
|
345
|
+
pace.total_extra_inn_games # => 209
|
|
57
346
|
```
|
|
58
347
|
|
|
59
348
|
## Sponsorship
|
|
@@ -70,82 +359,6 @@ Building and maintaining an open-source project like this takes a considerable a
|
|
|
70
359
|
|
|
71
360
|
[Click here to sponsor this project.](https://github.com/sponsors/sferik)
|
|
72
361
|
|
|
73
|
-
## TODO
|
|
74
|
-
|
|
75
|
-
Many of the MLB Stats API endpoints have not yet been implemented in this library. You can contribute to this library by implementing one or more of these endpoinds. If you are financially unable to sponsor this project, you can contribute code instead.
|
|
76
|
-
|
|
77
|
-
- [ ] /attendance
|
|
78
|
-
- [ ] /baseballStats
|
|
79
|
-
- [ ] /draft{prospects}{year}{latest}
|
|
80
|
-
- [ ] /eventTypes
|
|
81
|
-
- [ ] /game/changes
|
|
82
|
-
- [ ] /game/{gamePk}/boxscore
|
|
83
|
-
- [ ] /game/{gamePk}/content
|
|
84
|
-
- [ ] /game/{gamePk}/contextMetrics
|
|
85
|
-
- [ ] /game/{gamePk}/feed/color
|
|
86
|
-
- [ ] /game/{gamePk}/feed/color/diffPatch
|
|
87
|
-
- [ ] /game/{gamePk}/feed/color/timestamps
|
|
88
|
-
- [ ] /game/{gamePk}/feed/live
|
|
89
|
-
- [ ] /game/{gamePk}/feed/live/diffPatch
|
|
90
|
-
- [ ] /game/{gamePk}/feed/live/timestamps
|
|
91
|
-
- [ ] /game/{gamePk}/linescore
|
|
92
|
-
- [ ] /game/{gamePk}/playByPlay
|
|
93
|
-
- [ ] /game/{gamePk}/winProbability
|
|
94
|
-
- [ ] /gamePace
|
|
95
|
-
- [ ] /gameStatus
|
|
96
|
-
- [ ] /gameTypes
|
|
97
|
-
- [ ] /highLow/{orgType}
|
|
98
|
-
- [ ] /hitTrajectories
|
|
99
|
-
- [ ] /homeRunDerby/{gamePk}{bracket}{pool}
|
|
100
|
-
- [ ] /jobTypes
|
|
101
|
-
- [ ] /jobs
|
|
102
|
-
- [ ] /jobs/datacasters
|
|
103
|
-
- [ ] /jobs/officialScorers
|
|
104
|
-
- [ ] /jobs/umpires
|
|
105
|
-
- [ ] /jobs/umpires/games/{umpireId}
|
|
106
|
-
- [ ] /languages
|
|
107
|
-
- [ ] /league/{leagueId}/allStarBallot
|
|
108
|
-
- [ ] /league/{leagueId}/allStarFinalVote
|
|
109
|
-
- [ ] /league/{leagueId}/allStarWriteIns
|
|
110
|
-
- [ ] /leagueLeaderTypes
|
|
111
|
-
- [ ] /logicalEvents
|
|
112
|
-
- [ ] /metrics
|
|
113
|
-
- [ ] /people/changes
|
|
114
|
-
- [ ] /people/freeAgents
|
|
115
|
-
- [ ] /people/{personId}
|
|
116
|
-
- [ ] /people/{personId}/stats/game/{gamePk}
|
|
117
|
-
- [ ] /pitchCodes
|
|
118
|
-
- [ ] /pitchTypes
|
|
119
|
-
- [ ] /platforms
|
|
120
|
-
- [ ] /positions
|
|
121
|
-
- [ ] /reviewReasons
|
|
122
|
-
- [ ] /rosterTypes
|
|
123
|
-
- [ ] /schedule
|
|
124
|
-
- [ ] /schedule/games/tied
|
|
125
|
-
- [ ] /schedule/postseason
|
|
126
|
-
- [ ] /schedule/postseason/series
|
|
127
|
-
- [ ] /schedule/postseason/tuneIn
|
|
128
|
-
- [ ] /scheduleEventTypes
|
|
129
|
-
- [ ] /situationCodes
|
|
130
|
-
- [ ] /sky
|
|
131
|
-
- [ ] /standings
|
|
132
|
-
- [ ] /standingsTypes
|
|
133
|
-
- [ ] /statGroups
|
|
134
|
-
- [ ] /statTypes
|
|
135
|
-
- [ ] /stats
|
|
136
|
-
- [ ] /stats/leaders
|
|
137
|
-
- [ ] /stats/streaks
|
|
138
|
-
- [ ] /teams/affiliates
|
|
139
|
-
- [ ] /teams/history
|
|
140
|
-
- [ ] /teams/stats
|
|
141
|
-
- [ ] /teams/{teamId}/alumni
|
|
142
|
-
- [ ] /teams/{teamId}/coaches
|
|
143
|
-
- [ ] /teams/{teamId}/leaders
|
|
144
|
-
- [ ] /teams/{teamId}/personnel
|
|
145
|
-
- [ ] /teams/{teamId}/roster
|
|
146
|
-
- [ ] /teams/{teamId}/stats
|
|
147
|
-
- [ ] /windDirection
|
|
148
|
-
|
|
149
362
|
## Development
|
|
150
363
|
|
|
151
364
|
1. Checkout and repo:
|
|
@@ -182,14 +395,22 @@ Pull requests will only be accepted if they meet all the following criteria:
|
|
|
182
395
|
|
|
183
396
|
bundle exec rake rubocop
|
|
184
397
|
|
|
185
|
-
3.
|
|
398
|
+
3. Code must typecheck. This can be verified with:
|
|
399
|
+
|
|
400
|
+
bundle exec rake steep
|
|
401
|
+
|
|
402
|
+
4. 100% branch coverage. This can be verified with:
|
|
186
403
|
|
|
187
404
|
bundle exec rake test
|
|
188
405
|
|
|
189
|
-
|
|
406
|
+
5. 100% mutation coverage. This can be verified with:
|
|
190
407
|
|
|
191
408
|
bundle exec rake mutant
|
|
192
409
|
|
|
410
|
+
6. 100% documentation coverage. This can be verified with:
|
|
411
|
+
|
|
412
|
+
bundle exec rake yardstick
|
|
413
|
+
|
|
193
414
|
## License
|
|
194
415
|
|
|
195
416
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require "shale"
|
|
2
|
+
require_relative "team"
|
|
3
|
+
|
|
4
|
+
module MLB
|
|
5
|
+
# Provides methods for fetching team affiliates from the API
|
|
6
|
+
class Affiliates < Shale::Mapper
|
|
7
|
+
attribute :teams, Team, collection: true
|
|
8
|
+
|
|
9
|
+
json do
|
|
10
|
+
map "teams", to: :teams
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Retrieves affiliates for a team
|
|
14
|
+
#
|
|
15
|
+
# @api public
|
|
16
|
+
# @example Get affiliates for a team
|
|
17
|
+
# MLB::Affiliates.find(team: 147, season: 2024)
|
|
18
|
+
# @param team [Team, Integer] the team or team ID
|
|
19
|
+
# @param season [Integer, nil] the season year (defaults to current year)
|
|
20
|
+
# @return [Array<Team>] the affiliated teams
|
|
21
|
+
def self.find(team:, season: nil)
|
|
22
|
+
season ||= Utils.current_season
|
|
23
|
+
params = {teamIds: Utils.extract_id(team), season:}
|
|
24
|
+
response = CLIENT.get("teams/affiliates?#{Utils.build_query(params)}")
|
|
25
|
+
from_json(response).teams
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/mlb/alumni.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "shale"
|
|
2
|
+
require_relative "player"
|
|
3
|
+
|
|
4
|
+
module MLB
|
|
5
|
+
# Provides methods for fetching team alumni from the API
|
|
6
|
+
class Alumni < Shale::Mapper
|
|
7
|
+
attribute :people, Player, collection: true
|
|
8
|
+
|
|
9
|
+
json do
|
|
10
|
+
map "people", to: :people
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Retrieves alumni for a team
|
|
14
|
+
#
|
|
15
|
+
# @api public
|
|
16
|
+
# @example Get alumni for a team in a season
|
|
17
|
+
# MLB::Alumni.find(team: 147, season: 2024)
|
|
18
|
+
# @example Get alumni for a team object
|
|
19
|
+
# MLB::Alumni.find(team: Team.new(id: 147), season: 2024)
|
|
20
|
+
# @param team [Integer, Team] the team ID or Team object
|
|
21
|
+
# @param season [Integer, nil] the season year (defaults to current year)
|
|
22
|
+
# @return [Array<Player>] the alumni players
|
|
23
|
+
def self.find(team:, season: nil)
|
|
24
|
+
season ||= Utils.current_season
|
|
25
|
+
team_id = Utils.extract_id(team)
|
|
26
|
+
response = CLIENT.get("teams/#{team_id}/alumni?#{Utils.build_query(season:)}")
|
|
27
|
+
from_json(response).people
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require "shale"
|
|
2
|
+
require_relative "attendance_record"
|
|
3
|
+
|
|
4
|
+
module MLB
|
|
5
|
+
# Provides methods for fetching attendance data from the API
|
|
6
|
+
class Attendance < Shale::Mapper
|
|
7
|
+
attribute :records, AttendanceRecord, collection: true
|
|
8
|
+
|
|
9
|
+
json do
|
|
10
|
+
map "records", to: :records
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Retrieves attendance data for a team
|
|
14
|
+
#
|
|
15
|
+
# @api public
|
|
16
|
+
# @example Get attendance for a team
|
|
17
|
+
# MLB::Attendance.find(team: 147, season: 2024)
|
|
18
|
+
# @param team [Team, Integer] the team or team ID
|
|
19
|
+
# @param season [Integer, nil] the season year (defaults to current year)
|
|
20
|
+
# @return [Array<AttendanceRecord>] the attendance records
|
|
21
|
+
def self.find(team:, season: nil)
|
|
22
|
+
season ||= Utils.current_season
|
|
23
|
+
params = {teamId: Utils.extract_id(team), season:}
|
|
24
|
+
response = CLIENT.get("attendance?#{Utils.build_query(params)}")
|
|
25
|
+
from_json(response).records
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|