sportradar 0.0.3 → 0.0.4

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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +563 -25
  3. data/lib/sportradar.rb +37 -0
  4. data/lib/sportradar/client/api_request.rb +8 -0
  5. data/lib/sportradar/client/client.rb +10 -4
  6. data/lib/sportradar/client/configuration.rb +7 -2
  7. data/lib/sportradar/feeds/league_hierarchy.rb +12 -0
  8. data/lib/sportradar/feeds/league_schedule.rb +18 -0
  9. data/lib/sportradar/mlb/league_hierarchy.rb +1 -7
  10. data/lib/sportradar/mlb/league_schedule.rb +7 -12
  11. data/lib/sportradar/mlb/models/scoring_play.rb +2 -2
  12. data/lib/sportradar/nfl/boxscore.rb +9 -0
  13. data/lib/sportradar/nfl/extended_boxscore.rb +9 -0
  14. data/lib/sportradar/nfl/game_depth_chart.rb +9 -0
  15. data/lib/sportradar/nfl/game_injuries.rb +9 -0
  16. data/lib/sportradar/nfl/game_request.rb +24 -0
  17. data/lib/sportradar/nfl/game_roster.rb +9 -0
  18. data/lib/sportradar/nfl/game_statistics.rb +9 -0
  19. data/lib/sportradar/nfl/game_summary.rb +9 -0
  20. data/lib/sportradar/nfl/league_hierarchy.rb +9 -0
  21. data/lib/sportradar/nfl/league_schedule.rb +33 -0
  22. data/lib/sportradar/nfl/parsers/boxscore_parser.rb +124 -0
  23. data/lib/sportradar/nfl/play_by_play.rb +9 -0
  24. data/lib/sportradar/nfl/play_summary.rb +27 -0
  25. data/lib/sportradar/nfl/rankings.rb +9 -0
  26. data/lib/sportradar/nfl/season_statistics.rb +28 -0
  27. data/lib/sportradar/nfl/standings.rb +9 -0
  28. data/lib/sportradar/nfl/team_depth_chart.rb +17 -0
  29. data/lib/sportradar/nfl/team_depth_charts.rb +17 -0
  30. data/lib/sportradar/nfl/team_roster.rb +17 -0
  31. data/lib/sportradar/nfl/team_rosters.rb +17 -0
  32. data/lib/sportradar/nfl/team_statistics.rb +18 -0
  33. data/lib/sportradar/nfl/teams_request.rb +39 -0
  34. data/lib/sportradar/nfl/weekly_boxscore.rb +9 -0
  35. data/lib/sportradar/nfl/weekly_extended_boxscores.rb +20 -0
  36. data/lib/sportradar/nfl/weekly_game_depth_charts.rb +20 -0
  37. data/lib/sportradar/nfl/weekly_game_statistics.rb +21 -0
  38. data/lib/sportradar/nfl/weekly_game_summary.rb +21 -0
  39. data/lib/sportradar/nfl/weekly_leaders.rb +9 -0
  40. data/lib/sportradar/nfl/weekly_play_by_play.rb +21 -0
  41. data/lib/sportradar/nfl/weekly_schedule.rb +26 -0
  42. data/lib/sportradar/version.rb +1 -1
  43. data/sample.env +7 -0
  44. data/sportradar.gemspec +1 -1
  45. metadata +36 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6fd07a092b78fc00238d29f30a170a0555eea953
4
- data.tar.gz: d653d2e7c3eb380a78209f836ad94ce5ad7c01e5
3
+ metadata.gz: 9e591077ce14b3b9fe91f220694d95d3c8cb280d
4
+ data.tar.gz: 14fdd483819317b7147600f8cb9f8d85821e6f91
5
5
  SHA512:
6
- metadata.gz: 8b8877a1d311f3ab4c318f6607783ddef5e0d16551fefe41a9d721ee68ded55237b3f7d44f5223ddedc573eaf52f1ae383631283fa7f33fabfc659526d310803
7
- data.tar.gz: a152c4ea1039c926d1518c79f7b9c73fd0ebf0acc50bc87c2efee9af0499f59620ecc0a146b5194795bcf1952c3e318281f12d33f4fde0cd60e8f8898f5b5719
6
+ metadata.gz: be241a229c81a3a6fdfbac96aa95540442ef84e92544a2df733bc17022ecb181555fd4f149c83e9e659ce8dd5b13e008f89f02458459f584efc52f32f19b9111
7
+ data.tar.gz: c61700ef6f70663299d7663010e78c060ae8f206868e12885f6ff9c5565c1f9c9adef6fc242002886c7827ff7a257373bc5e03a4a3c557236df264cba2cfa3f3
data/README.md CHANGED
@@ -2,14 +2,17 @@
2
2
 
3
3
  Simple API client for [Sportradar API](http://developer.sportradar.us/).
4
4
 
5
- Currently supports [Major League Baseball API](http://developer.sportradar.us/docs/MLB_API) endpoints.
5
+ Currently supports
6
+
7
+ * a subset of [Major League Baseball API](http://developer.sportradar.us/docs/MLB_API) endpoints
8
+ * complete set of [NFL Classic Feed API](http://developer.sportradar.us/docs/read/NFL_Classic) endpoints
6
9
 
7
10
  ## Installation
8
11
 
9
12
  Add this line to your application's Gemfile:
10
13
 
11
14
  ```ruby
12
- gem 'sportradar'
15
+ gem 'sportradar', '>= 0.0.4'
13
16
  ```
14
17
 
15
18
  And then execute:
@@ -27,15 +30,26 @@ Or install it yourself as:
27
30
  In your `.env`:
28
31
 
29
32
  ```
30
- SPORTRADAR_ACCESS_LEVEL=t
33
+ SPORTRADAR_ACCESS_LEVEL_MLB=t
31
34
  SPORTRADAR_API_KEY_MLB=YOUR_API_KEY
35
+
36
+ SPORTRADAR_ACCESS_LEVEL_NBA=t
32
37
  SPORTRADAR_API_KEY_NBA=YOUR_API_KEY
38
+
39
+ SPORTRADAR_ACCESS_LEVEL_NFL=t
33
40
  SPORTRADAR_API_KEY_NFL=YOUR_API_KEY
41
+
42
+ SPORTRADAR_ACCESS_LEVEL_NHL=t
34
43
  SPORTRADAR_API_KEY_NHL=YOUR_API_KEY
44
+
35
45
  SPORTRADAR_FILE_PATH=/path/to/save/responses
36
46
  ```
37
47
 
38
- `SPORTRADAR_ACCESS_LEVEL` is `t` or 'p'
48
+ `SPORTRADAR_ACCESS_LEVEL` is `t` or 'p' (or 'rt')
49
+
50
+ Note: Currently only MLB and NFL support.
51
+
52
+ Important: This is a breaking change from version 0.0.3 that had a global access level.
39
53
 
40
54
  ### Console
41
55
 
@@ -65,34 +79,74 @@ Defaults to and supports API version 5 only.
65
79
  * `Sportradar::Mlb::TeamRosters.new().fetch`
66
80
  * `Sportradar::Mlb::Venues.new().fetch`
67
81
 
68
- Note: `.save` vs `.fetch` will store in the path specified in `SPORTRADAR_FILE_PATH`. However, you need to have a directory created for each request within that path.
82
+ Note: `.save` vs `.fetch` will store in the path specified in `SPORTRADAR_FILE_PATH`.
69
83
 
70
- For example:
84
+ #### Bulk Saves
85
+
86
+ Some helpers will call .save for each response as separate items.
87
+
88
+ * `Sportradar::Mlb::DailyGameSummary.new(date: Date.today).perform`
89
+ * `Sportradar::Mlb::DailyPlayByPlay.new(date: Date.today).perform`
90
+
91
+ ### Football/NFL
92
+
93
+ Defaults to and supports NFL Classic API feed version 1 only (not Official).
94
+
95
+ #### API Requests
71
96
 
72
- * `boxscore`
73
- * `daily_boxscore`
74
- * `daily_game_summary`
75
- * `daily_play_by_play`
76
- * `daily_schedule`
77
- * `daily_summary`
78
- * `game_summary`
79
- * `glossary`
80
- * `injuries`
81
- * `league_hierarchy`
82
- * `league_schedule`
83
- * `play_by_play`
84
- * `player_profile`
85
- * `team_active_rosters`
86
- * `team_profile`
87
- * `team_rosters`
88
- * `venues`
97
+ * `Sportradar::Nfl::LeagueHierarchy.new().fetch`
98
+ * `Sportradar::Nfl::WeeklySchedule.new(year: '2016', interval_type: <reg|pre|pst>, week: <0..17>).fetch`
99
+ * `Sportradar::Nfl::LeagueSchedule.new(year: '2016', interval_type: <reg|pre|pst>).fetch`
100
+ * `Sportradar::Nfl::GameStatistics.new(week: 1,
101
+ year: 2015,
102
+ interval_type: 'reg',
103
+ away_team_abbreviation: 'PIT',
104
+ home_team_abbreviation: 'NE').fetch`
105
+ * `Sportradar::Nfl::GameSummary.new(week: 1,
106
+ year: 2015,
107
+ interval_type: 'reg',
108
+ away_team_abbreviation: 'PIT',
109
+ home_team_abbreviation: 'NE').fetch`
110
+ * `Sportradar::Nfl::PlayByPlay.new(week: 1,
111
+ year: 2015,
112
+ interval_type: 'reg',
113
+ away_team_abbreviation: 'PIT',
114
+ home_team_abbreviation: 'NE').fetch`
115
+ * `Sportradar::Nfl::PlaySummary.new(week: 1,
116
+ year: 2015,
117
+ interval_type: 'reg',
118
+ away_team_abbreviation: 'PIT',
119
+ home_team_abbreviation: 'NE',
120
+ play_id: '4788eac3-c59e-4f82-94ef-d449ac6d6fca').fetch`
121
+ * `Sportradar::Nfl::Boxscore.new(week: 1,
122
+ year: 2015,
123
+ away_team_abbreviation: 'PIT',
124
+ home_team_abbreviation: 'NE').fetch`
125
+ * `Sportradar::Nfl::ExtendedBoxscore.new(week: 1,
126
+ year: 2015,
127
+ away_team_abbreviation: 'PIT',
128
+ home_team_abbreviation: 'NE').fetch`
129
+ * `Sportradar::Nfl::WeeklyBoxscore.new(week: 1, year: 2015).fetch`
130
+ * `Sportradar::Nfl::TeamRoster.new(team_abbreviation: 'NE').fetch`
131
+ * `Sportradar::Nfl::GameDepthChart.new(week: 1, year: 2015, away_team_abbreviation: 'PIT', home_team_abbreviation: 'NE').fetch`
132
+ * `Sportradar::Nfl::TeamDepthChart.new(team_abbreviation: 'NE').fetch`
133
+ * `Sportradar::Nfl::WeeklyLeaders.new(week: 1, year: 2015).fetch`
134
+ * `Sportradar::Nfl::Standings.new(year: 2015, interval_type: <reg|pre|pst>).fetch`
135
+ * `Sportradar::Nfl::Rankings.new(year: 2015).fetch`
136
+ * `Sportradar::Nfl::TeamStatistics.new(year: 2015, interval_type: 'reg', team_abbreviation: 'NE').fetch`
89
137
 
90
138
  #### Bulk Saves
91
139
 
92
140
  Some helpers will call `.save` for each response as separate items.
93
141
 
94
- * `Sportradar::Mlb::DailyGameSummary.new(date: Date.today).perform`
95
- * `Sportradar::Mlb::DailyPlayByPlay.new(date: Date.today).perform`
142
+ * `Sportradar::Nfl::TeamRosters.perform`
143
+ * `Sportradar::Nfl::TeamDepthCharts.perform`
144
+ * `Sportradar::Nfl::WeeklyExtendedBoxscores.perform(year: 2015, interval_type: 'reg', week: 1)`
145
+ * `Sportradar::Nfl::WeeklyGameDepthCharts.perform(year: 2015, interval_type: 'reg', week: 1)`
146
+ * `Sportradar::Nfl::WeeklyGameStatistics.perform(year: 2015, interval_type: 'reg', week: 2)`
147
+ * `Sportradar::Nfl::WeeklyGameSummary.perform(year: 2015, interval_type: 'reg', week: 2)`
148
+ * `Sportradar::Nfl::WeeklyPlayByPlay.perform(year: 2015, interval_type: 'reg', week: 1)`
149
+ * `Sportradar::Nfl::SeasonStatistics.perform(year: 2015, interval_type: 'reg')`
96
150
 
97
151
  ### Model Helpers
98
152
 
@@ -152,6 +206,490 @@ sp.home_team_runner_ids
152
206
  "8ec56596-5b8b-41f8-88a7-384f20b8b6a7"]
153
207
  ```
154
208
 
209
+ #### Play by Play, At Bats and Pitches
210
+
211
+ The `Sportradar::Mlb::Parsers::PlayByPlayParser.new(game_play_by_play: g.game_play_by_play)` takes thes play-by-play json and can return
212
+
213
+ * `.at_bats`
214
+ * `.at_bat_summary`
215
+ * `.pitches`
216
+ * `.pitch_summary`
217
+
218
+ Both the `at_bats` and `pitch` are models with each attribute, like `pitch_speed` or `hitter_id`.
219
+
220
+ The summary convenience methods list each at bat or pitch as text.
221
+
222
+ #### At Bat Summary
223
+
224
+ Given the play-by-play json, `Sportradar::Mlb::Parsers::PlayByPlayParser.new(game_play_by_play: g.game_play_by_play).at_bat_summary` returns:
225
+
226
+ ```
227
+ T of 1: Ruben Tejada strikes out swinging.
228
+ T of 1: Grant Green singles to shallow center field.
229
+ T of 1: Brandon Belt walks. Grant Green to second.
230
+ T of 1: Buster Posey singles to shallow right field. Brandon Belt to second. Grant Green to third.
231
+ T of 1: Brandon Crawford strikes out swinging.
232
+ T of 1: Mac Williamson grounds out to third base, Jake Lamb to Paul Goldschmidt.
233
+ B of 1: Jean Segura flies out to shallow right field to Mac Williamson.
234
+ B of 1: Michael Bourn singles to shallow infield.
235
+ B of 1: Paul Goldschmidt reaches on a fielder's choice to second base. Michael Bourn out at second.
236
+ B of 1: Jake Lamb strikes out swinging.
237
+ T of 2: Trevor Brown grounds out to third base, Jake Lamb to Paul Goldschmidt.
238
+ T of 2: Jarrett Parker grounds out to second base, Philip Gosselin to Paul Goldschmidt.
239
+ T of 2: Albert Suarez strikes out swinging.
240
+ B of 2: Yasmany Tomas grounds out to shortstop, Brandon Crawford to Buster Posey.
241
+ B of 2: Philip Gosselin doubles to deep left center field.
242
+ B of 2: Brandon Drury doubles to deep left center field. Philip Gosselin scores.
243
+ B of 2: Tuffy Gosewisch singles to shallow left field. Brandon Drury to third.
244
+ B of 2: Robbie Ray out on a sacrifice bunt to shallow infield, Buster Posey to Grant Green. Tuffy Gosewisch to second.
245
+ B of 2: Jean Segura flies out to center field to Jarrett Parker.
246
+ T of 3: Ruben Tejada lines out to left center field to Brandon Drury.
247
+ T of 3: Grant Green singles to center field.
248
+ T of 3: Brandon Belt singles to right field. Grant Green to second.
249
+ T of 3: Buster Posey lines out to center field to Michael Bourn.
250
+ T of 3: Brandon Crawford hit by pitch. Brandon Belt to second. Grant Green to third.
251
+ T of 3: Mac Williamson singles to shallow center field. Brandon Crawford to third. Brandon Belt scores. Grant Green scores.
252
+ T of 3: Trevor Brown called out on strikes.
253
+ B of 3: Michael Bourn grounds out to shortstop, Ruben Tejada to Buster Posey.
254
+ B of 3: Paul Goldschmidt grounds out to shortstop, Brandon Crawford to Buster Posey.
255
+ B of 3: Jake Lamb strikes out swinging.
256
+ T of 4: Jarrett Parker lines out to left field to Brandon Drury.
257
+ T of 4: Albert Suarez singles to shallow center field.
258
+ T of 4: Ruben Tejada doubles to deep center field. Albert Suarez to third.
259
+ T of 4: Grant Green flies out to left field to Brandon Drury.
260
+ T of 4: Brandon Belt doubles to left field. Ruben Tejada scores. Albert Suarez scores.
261
+ T of 4: Buster Posey walks.
262
+ T of 4: Brandon Crawford strikes out swinging.
263
+ B of 4: Yasmany Tomas strikes out swinging.
264
+ B of 4: Philip Gosselin grounds out to first base, Buster Posey to Albert Suarez.
265
+ B of 4: Brandon Drury grounds out to shortstop, Brandon Crawford to Buster Posey.
266
+ T of 5: Mac Williamson grounds out to third base, Jake Lamb to Paul Goldschmidt.
267
+ T of 5: Trevor Brown grounds out to third base, Jake Lamb to Paul Goldschmidt.
268
+ T of 5: Jarrett Parker called out on strikes.
269
+ B of 5: Tuffy Gosewisch grounds out to third base, Ruben Tejada to Brandon Crawford to Buster Posey.
270
+ B of 5: Robbie Ray grounds out to second base, Grant Green to Buster Posey.
271
+ B of 5: Jean Segura doubles to deep right field.
272
+ B of 5: Michael Bourn strikes out swinging.
273
+ T of 6: Albert Suarez strikes out swinging.
274
+ T of 6: Ruben Tejada grounds out to third base, Jake Lamb to Paul Goldschmidt.
275
+ T of 6: Grant Green strikes out swinging.
276
+ B of 6: Paul Goldschmidt homers to center field.
277
+ B of 6: Jake Lamb lines out to deep center field to Jarrett Parker.
278
+ B of 6: Yasmany Tomas grounds out to second base, Grant Green to Buster Posey.
279
+ B of 6: Philip Gosselin called out on strikes.
280
+ T of 7: Brandon Belt strikes out swinging.
281
+ T of 7: Buster Posey walks.
282
+ T of 7: Brandon Crawford strikes out on a foul tip.
283
+ T of 7: Mac Williamson lines out to deep left field to Brandon Drury.
284
+ B of 7: Brandon Drury flies out to deep left field to Brandon Belt.
285
+ B of 7: Tuffy Gosewisch singles to left field.
286
+ B of 7: Chris Herrmann strikes out swinging.
287
+ B of 7: Jean Segura grounds out to shallow infield, George Kontos to Buster Posey.
288
+ T of 8: Trevor Brown flies out to right center field to Yasmany Tomas.
289
+ T of 8: Jarrett Parker strikes out swinging.
290
+ T of 8: Conor Gillaspie grounds out to second base, Philip Gosselin to Paul Goldschmidt.
291
+ B of 8: Michael Bourn grounds out to first base to Buster Posey.
292
+ B of 8: Paul Goldschmidt reaches on error. Fielding error by Gerald Posey.
293
+ B of 8: Jake Lamb homers to right field. Paul Goldschmidt scores.
294
+ B of 8: Yasmany Tomas grounds out to first base, Buster Posey to Cory Gearrin.
295
+ B of 8: Philip Gosselin walks.
296
+ B of 8: Brandon Drury flies out to center field to Jarrett Parker.
297
+ T of 9: Ruben Tejada called out on strikes.
298
+ T of 9: Grant Green grounds out to shortstop, Jean Segura to Paul Goldschmidt.
299
+ T of 9: Brandon Belt walks.
300
+ T of 9: Buster Posey lines out to deep left field to Brandon Drury.
301
+ B of 9: Tuffy Gosewisch strikes out swinging.
302
+ B of 9: Rickie Weeks walks.
303
+ B of 9: Jean Segura lines out to shallow infield to Hunter Strickland. Rickie Weeks doubled off first.
304
+ T of 10: Brandon Crawford flies out to deep right center field to Yasmany Tomas.
305
+ T of 10: Mac Williamson strikes out on a foul tip.
306
+ T of 10: Trevor Brown called out on strikes.
307
+ B of 10: Michael Bourn grounds out to second base, Grant Green to Buster Posey.
308
+ B of 10: Paul Goldschmidt grounds out to shortstop, Brandon Crawford to Buster Posey.
309
+ B of 10: Jake Lamb strikes out swinging.
310
+ T of 11: Jarrett Parker walks.
311
+ T of 11: Ramiro Pena doubles to deep right field. Jarrett Parker scores.
312
+ T of 11: Ruben Tejada out on a sacrifice bunt to shallow infield, Enrique Burgos to Paul Goldschmidt. Ramiro Pena to third.
313
+ T of 11: Angel Pagan strikes out swinging.
314
+ T of 11: Brandon Belt pops out to shallow left field to Jake Lamb.
315
+ B of 11: Yasmany Tomas singles to shallow left field.
316
+ B of 11: Philip Gosselin out on a sacrifice bunt to shallow infield, Ruben Tejada to Ramiro Pena. Yasmany Tomas to second.
317
+ B of 11: Brandon Drury grounds out to third base, Ruben Tejada to Buster Posey.
318
+ B of 11: Welington Castillo walks.
319
+ B of 11: Peter O'Brien strikes out swinging.
320
+ ```
321
+
322
+ #### Pitch Summary
323
+
324
+ Given the play-by-play json, `Sportradar::Mlb::Parsers::PlayByPlayParser.new(game_play_by_play: g.game_play_by_play).pitch_summary` returns the type and result of each pitch:
325
+
326
+ ```
327
+ Fastball = Strike Looking
328
+ Fastball = Foul Ball
329
+ Fastball = Ball
330
+ Fastball = Foul Ball
331
+ Slider = Strike Swinging
332
+ Fastball = Strike Looking
333
+ Fastball = Foul Ball
334
+ Fastball = Single
335
+ Slider = Ball
336
+ Slider = Ball
337
+ Fastball = Ball
338
+ Fastball = Ball
339
+ Fastball = Foul Tip
340
+ Fastball = Single
341
+ Slider = Strike Swinging
342
+ Slider = Dirt Ball
343
+ Fastball = Strike Looking
344
+ Fastball = Ball
345
+ Fastball = Ball
346
+ Slider = Foul Ball
347
+ Fastball = Strike Swinging
348
+ Fastball = Strike Looking
349
+ Fastball = Ball
350
+ Fastball = Foul Ball
351
+ Slider = Ball
352
+ Fastball = Ground Out
353
+ Sinker = Ball
354
+ Fastball = Strike Looking
355
+ Sinker = Ball
356
+ Slider = Fly Out
357
+ Sinker = Ball
358
+ Fastball = Single
359
+ Slider = Strike Looking
360
+ Sinker = Dirt Ball
361
+ Sinker = Strike Swinging
362
+ Sinker = Foul Ball
363
+ Fastball = Ball
364
+ Slider = Fielders Choice
365
+ Fastball = Ball
366
+ Changeup = Foul Ball
367
+ Sinker = Ball
368
+ Fastball = Foul Ball
369
+ Curveball = Foul Ball
370
+ Curveball = Strike Swinging
371
+ Changeup = Ball
372
+ Fastball = Ground Out
373
+ Fastball = Strike Looking
374
+ Fastball = Foul Ball
375
+ Fastball = Ground Out
376
+ Fastball = Strike Looking
377
+ Fastball = Ball
378
+ Fastball = Ball
379
+ Fastball = Strike Swinging
380
+ Fastball = Strike Swinging
381
+ Sinker = Strike Looking
382
+ Slider = Foul Ball
383
+ Slider = Ground Out
384
+ Fastball = Strike Looking
385
+ Fastball = Ball
386
+ Changeup = Foul Ball
387
+ Sinker = Ball
388
+ Sinker = Ball
389
+ Slider = Double
390
+ Sinker = Double
391
+ Slider = Ball
392
+ Fastball = Strike Looking
393
+ Sinker = Strike Swinging
394
+ Curveball = Dirt Ball
395
+ Slider = Ball
396
+ Sinker = Single
397
+ Sinker = Foul Ball
398
+ Slider = Ball
399
+ Sinker = Sacrifice Bunt
400
+ Curveball = Ball
401
+ Fastball = Ball
402
+ Slider = Strike Looking
403
+ Slider = Fly Out
404
+ Fastball = Strike Looking
405
+ Curveball = Ball
406
+ Fastball = Line Out
407
+ Slider = Ball
408
+ Fastball = Single
409
+ Fastball = Strike Looking
410
+ Fastball = Foul Ball
411
+ Slider = Foul Ball
412
+ Fastball = Ball
413
+ Fastball = Foul Ball
414
+ Slider = Single
415
+ Fastball = Foul Ball
416
+ Slider = Line Out
417
+ Fastball = Strike Looking
418
+ Fastball = Hit By Pitch
419
+ Fastball = Single
420
+ Fastball = Strike Looking
421
+ Fastball = Strike Swinging
422
+ Fastball = Strike Looking
423
+ Sinker = Strike Looking
424
+ Curveball = Foul Ball
425
+ Sinker = Foul Ball
426
+ Fastball = Ground Out
427
+ Sinker = Ball
428
+ Slider = Ball
429
+ Fastball = Strike Looking
430
+ Slider = Strike Looking
431
+ Slider = Ball
432
+ Fastball = Foul Ball
433
+ Slider = Ground Out
434
+ Curveball = Ball
435
+ Changeup = Strike Looking
436
+ Curveball = Ball
437
+ Sinker = Foul Ball
438
+ Sinker = Foul Ball
439
+ Sinker = Foul Ball
440
+ Sinker = Ball
441
+ Curveball = Strike Swinging
442
+ Fastball = Line Out
443
+ Fastball = Strike Looking
444
+ Fastball = Ball
445
+ Fastball = Single
446
+ Fastball = Ball
447
+ Fastball = Foul Ball
448
+ Slider = Ball
449
+ Slider = Ball
450
+ Fastball = Double
451
+ Fastball = Ball
452
+ Fastball = Fly Out
453
+ Slider = Strike Swinging
454
+ Fastball = Strike Swinging
455
+ Fastball = Foul Ball
456
+ Fastball = Double
457
+ Intentional Ball = iBall
458
+ Intentional Ball = iBall
459
+ Intentional Ball = iBall
460
+ Intentional Ball = iBall
461
+ Slider = Strike Swinging
462
+ Fastball = Ball
463
+ Slider = Strike Swinging
464
+ Slider = Foul Ball
465
+ Fastball = Ball
466
+ Slider = Strike Swinging
467
+ Slider = Strike Swinging
468
+ Fastball = Ball
469
+ Slider = Foul Ball
470
+ Slider = Foul Ball
471
+ Fastball = Ball
472
+ Slider = Ball
473
+ Sinker = Strike Swinging
474
+ Slider = Ball
475
+ Fastball = Strike Looking
476
+ Sinker = Ground Out
477
+ Slider = Ball
478
+ Slider = Ball
479
+ Slider = Strike Looking
480
+ Fastball = Ground Out
481
+ Fastball = Strike Looking
482
+ Slider = Strike Looking
483
+ Slider = Foul Ball
484
+ Fastball = Foul Ball
485
+ Slider = Ball
486
+ Fastball = Ground Out
487
+ Slider = Ground Out
488
+ Slider = Ball
489
+ Slider = Strike Swinging
490
+ Slider = Strike Swinging
491
+ Fastball = Ball
492
+ Slider = Strike Looking
493
+ Sinker = Ground Out
494
+ Sinker = Strike Looking
495
+ Sinker = Foul Ball
496
+ Curveball = Ball
497
+ Curveball = Foul Ball
498
+ Fastball = Ground Out
499
+ Sinker = Foul Ball
500
+ Fastball = Double
501
+ Curveball = Strike Looking
502
+ Slider = Dirt Ball
503
+ Fastball = Foul Ball
504
+ Sinker = Strike Swinging
505
+ Fastball = Foul Ball
506
+ Slider = Foul Ball
507
+ Fastball = Foul Ball
508
+ Slider = Strike Swinging
509
+ Slider = Strike Looking
510
+ Slider = Ground Out
511
+ Slider = Strike Swinging
512
+ Fastball = Foul Ball
513
+ Slider = Strike Swinging
514
+ Slider = Ball
515
+ Slider = Foul Ball
516
+ Slider = Strike Swinging
517
+ Fastball = Ball
518
+ Curveball = Homerun
519
+ Changeup = Ball
520
+ Sinker = Line Out
521
+ Fastball = Ball
522
+ Fastball = Ball
523
+ Sinker = Ball
524
+ Sinker = Strike Looking
525
+ Sinker = Ground Out
526
+ Fastball = Foul Ball
527
+ Sinker = Ball
528
+ Sinker = Foul Ball
529
+ Sinker = Foul Ball
530
+ Sinker = Strike Looking
531
+ Slider = Ball
532
+ Sinker = Foul Ball
533
+ Sinker = Foul Ball
534
+ Sinker = Ball
535
+ Slider = Strike Swinging
536
+ Fastball = Ball
537
+ Slider = Ball
538
+ Changeup = Ball
539
+ Sinker = Foul Ball
540
+ Sinker = Ball
541
+ Sinker = Strike Swinging
542
+ Fastball = Ball
543
+ Slider = Foul Ball
544
+ Sinker = Ball
545
+ Fastball = Foul Tip
546
+ Fastball = Ball
547
+ Slider = Strike Looking
548
+ Fastball = Line Out
549
+ Slider = Fly Out
550
+ Cutter = Strike Looking
551
+ Cutter = Single
552
+ Fastball = Strike Swinging
553
+ Fastball = Foul Ball
554
+ Fastball = Ball
555
+ Fastball = Ball
556
+ Fastball = Ball
557
+ Fastball = Strike Swinging
558
+ Fastball = Ground Out
559
+ Slider = Ball
560
+ Fastball = Foul Ball
561
+ Slider = Fly Out
562
+ Fastball = Ball
563
+ Changeup = Foul Ball
564
+ Fastball = Ball
565
+ Fastball = Foul Ball
566
+ Fastball = Ball
567
+ Fastball = Strike Swinging
568
+ Fastball = Strike Looking
569
+ Fastball = Ground Out
570
+ Sinker = Ground Out
571
+ Sinker = Ball
572
+ Sinker = Foul Ball
573
+ Slider = Reached On Error
574
+ Sinker = Ball
575
+ Slider = Strike Swinging
576
+ Sinker = Foul Ball
577
+ Changeup = Ball
578
+ Changeup = Ball
579
+ Slider = Homerun
580
+ Sinker = Ball
581
+ Sinker = Ball
582
+ Sinker = Ground Out
583
+ Sinker = Ball
584
+ Slider = Ball
585
+ Sinker = Ball
586
+ Sinker = Ball
587
+ Fastball = Foul Ball
588
+ Slider = Ball
589
+ Sinker = Ball
590
+ Slider = Strike Looking
591
+ Slider = Fly Out
592
+ Sinker = Ball
593
+ Sinker = Strike Looking
594
+ Sinker = Ball
595
+ Sinker = Foul Ball
596
+ Sinker = Ball
597
+ Sinker = Foul Ball
598
+ Sinker = Strike Looking
599
+ Sinker = Foul Ball
600
+ Changeup = Strike Swinging
601
+ Curveball = Ball
602
+ Curveball = Ball
603
+ Sinker = Foul Ball
604
+ Sinker = Foul Ball
605
+ Changeup = Foul Ball
606
+ Changeup = Ground Out
607
+ Changeup = Ball
608
+ Sinker = Ball
609
+ Sinker = Ball
610
+ Sinker = Strike Looking
611
+ Sinker = Ball
612
+ Sinker = Line Out
613
+ Curveball = Ball
614
+ Fastball = Strike Swinging
615
+ Fastball = Strike Looking
616
+ Fastball = Foul Ball
617
+ Fastball = Strike Swinging
618
+ Fastball = Strike Swinging
619
+ Fastball = Ball
620
+ Curveball = Ball
621
+ Fastball = Foul Ball
622
+ Curveball = Ball
623
+ Fastball = Foul Ball
624
+ Fastball = Ball
625
+ Curveball = Foul Ball
626
+ Curveball = Line Out
627
+ Changeup = Fly Out
628
+ Fastball = Strike Looking
629
+ Curveball = Ball
630
+ Changeup = Strike Looking
631
+ Splitter = Foul Tip
632
+ Fastball = Ball
633
+ Fastball = Ball
634
+ Changeup = Ball
635
+ Fastball = Strike Looking
636
+ Changeup = Strike Swinging
637
+ Changeup = Foul Ball
638
+ Changeup = Foul Ball
639
+ Fastball = Foul Ball
640
+ Fastball = Strike Looking
641
+ Fastball = Strike Looking
642
+ Cutter = Strike Looking
643
+ Fastball = Ball
644
+ Fastball = Ground Out
645
+ Fastball = Foul Ball
646
+ Changeup = Ball
647
+ Changeup = Ball
648
+ Fastball = Ground Out
649
+ Changeup = Ball
650
+ Fastball = Strike Swinging
651
+ Fastball = Strike Looking
652
+ Fastball = Strike Swinging
653
+ Slider = Ball
654
+ Fastball = Strike Swinging
655
+ Fastball = Ball
656
+ Slider = Ball
657
+ Slider = Foul Ball
658
+ Fastball = Foul Ball
659
+ Fastball = Ball
660
+ Fastball = Ball
661
+ Slider = Double
662
+ Slider = Foul Ball
663
+ Fastball = Sacrifice Bunt
664
+ Slider = Strike Looking
665
+ Fastball = Strike Looking
666
+ Fastball = Strike Swinging
667
+ Slider = Ball
668
+ Slider = Strike Looking
669
+ Fastball = Ball
670
+ Fastball = Strike Swinging
671
+ Fastball = Ball
672
+ Slider = Pop Out
673
+ Fastball = Foul Ball
674
+ Fastball = Single
675
+ Fastball = Ball
676
+ Fastball = Sacrifice Bunt
677
+ Fastball = Ball
678
+ Curveball = Strike Looking
679
+ Slider = Ball
680
+ Curveball = Ball
681
+ Curveball = Ground Out
682
+ Fastball = Ball
683
+ Fastball = Ball
684
+ Fastball = Ball
685
+ Fastball = Ball
686
+ Fastball = Strike Swinging
687
+ Curveball = Ball
688
+ Fastball = Foul Ball
689
+ Fastball = Ball
690
+ Curveball = Strike Swinging
691
+ ```
692
+
155
693
  ## Development
156
694
 
157
695
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.