sportradar-api 0.9.12 → 0.11.21

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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +6 -0
  3. data/.travis.yml +1 -0
  4. data/Gemfile.lock +32 -30
  5. data/README.md +12 -9
  6. data/lib/sportradar/api/baseball/README.md +28 -0
  7. data/lib/sportradar/api/baseball/error.rb +25 -0
  8. data/lib/sportradar/api/baseball/event.rb +44 -0
  9. data/lib/sportradar/api/baseball/events/at_bat.rb +96 -0
  10. data/lib/sportradar/api/baseball/events/lineup.rb +41 -0
  11. data/lib/sportradar/api/baseball/events/warming_up.rb +35 -0
  12. data/lib/sportradar/api/baseball/fielder.rb +26 -0
  13. data/lib/sportradar/api/baseball/game.rb +472 -0
  14. data/lib/sportradar/api/baseball/half_inning.rb +69 -0
  15. data/lib/sportradar/api/baseball/inning.rb +42 -0
  16. data/lib/sportradar/api/baseball/lineup.rb +116 -0
  17. data/lib/sportradar/api/baseball/mlb/division.rb +32 -0
  18. data/lib/sportradar/api/baseball/mlb/hierarchy.rb +273 -0
  19. data/lib/sportradar/api/baseball/mlb/league.rb +27 -0
  20. data/lib/sportradar/api/baseball/mlb.rb +84 -0
  21. data/lib/sportradar/api/baseball/outcome.rb +87 -0
  22. data/lib/sportradar/api/baseball/pitch.rb +245 -0
  23. data/lib/sportradar/api/baseball/player.rb +119 -0
  24. data/lib/sportradar/api/baseball/record.rb +42 -0
  25. data/lib/sportradar/api/baseball/runner.rb +78 -0
  26. data/lib/sportradar/api/baseball/scoring.rb +86 -0
  27. data/lib/sportradar/api/baseball/team.rb +147 -0
  28. data/lib/sportradar/api/baseball/venue.rb +51 -0
  29. data/lib/sportradar/api/baseball.rb +46 -0
  30. data/lib/sportradar/api/basketball/broadcast.rb +15 -0
  31. data/lib/sportradar/api/basketball/game.rb +339 -0
  32. data/lib/sportradar/api/basketball/injury.rb +41 -0
  33. data/lib/sportradar/api/basketball/nba/conference.rb +27 -0
  34. data/lib/sportradar/api/basketball/nba/division.rb +30 -0
  35. data/lib/sportradar/api/basketball/nba/game.rb +62 -0
  36. data/lib/sportradar/api/basketball/nba/hierarchy.rb +47 -0
  37. data/lib/sportradar/api/basketball/nba/player.rb +160 -0
  38. data/lib/sportradar/api/basketball/nba/quarter.rb +51 -0
  39. data/lib/sportradar/api/basketball/nba/schedule.rb +43 -0
  40. data/lib/sportradar/api/basketball/nba/scoring.rb +15 -0
  41. data/lib/sportradar/api/basketball/nba/season.rb +54 -0
  42. data/lib/sportradar/api/basketball/nba/series.rb +82 -0
  43. data/lib/sportradar/api/basketball/nba/team.rb +74 -0
  44. data/lib/sportradar/api/basketball/nba.rb +129 -0
  45. data/lib/sportradar/api/basketball/ncaamb/bracket.rb +44 -0
  46. data/lib/sportradar/api/basketball/ncaamb/conference.rb +41 -0
  47. data/lib/sportradar/api/basketball/ncaamb/division.rb +42 -0
  48. data/lib/sportradar/api/basketball/ncaamb/game.rb +75 -0
  49. data/lib/sportradar/api/basketball/ncaamb/half.rb +49 -0
  50. data/lib/sportradar/api/basketball/ncaamb/hierarchy.rb +65 -0
  51. data/lib/sportradar/api/basketball/ncaamb/player.rb +162 -0
  52. data/lib/sportradar/api/basketball/ncaamb/round.rb +55 -0
  53. data/lib/sportradar/api/basketball/ncaamb/schedule.rb +41 -0
  54. data/lib/sportradar/api/basketball/ncaamb/season.rb +55 -0
  55. data/lib/sportradar/api/basketball/ncaamb/team.rb +61 -0
  56. data/lib/sportradar/api/basketball/ncaamb/tournament.rb +154 -0
  57. data/lib/sportradar/api/basketball/ncaamb.rb +149 -0
  58. data/lib/sportradar/api/basketball/play.rb +75 -0
  59. data/lib/sportradar/api/basketball/plays/assist.rb +14 -0
  60. data/lib/sportradar/api/basketball/plays/base.rb +126 -0
  61. data/lib/sportradar/api/basketball/plays/block.rb +14 -0
  62. data/lib/sportradar/api/basketball/plays/clear_path_foul.rb +11 -0
  63. data/lib/sportradar/api/basketball/plays/deadball.rb +11 -0
  64. data/lib/sportradar/api/basketball/plays/defensive_three_seconds.rb +11 -0
  65. data/lib/sportradar/api/basketball/plays/delay.rb +11 -0
  66. data/lib/sportradar/api/basketball/plays/ejection.rb +14 -0
  67. data/lib/sportradar/api/basketball/plays/end_period.rb +28 -0
  68. data/lib/sportradar/api/basketball/plays/flagrant_one.rb +11 -0
  69. data/lib/sportradar/api/basketball/plays/flagrant_two.rb +11 -0
  70. data/lib/sportradar/api/basketball/plays/foul.rb +17 -0
  71. data/lib/sportradar/api/basketball/plays/free_throw_made.rb +23 -0
  72. data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +25 -0
  73. data/lib/sportradar/api/basketball/plays/jumpball.rb +12 -0
  74. data/lib/sportradar/api/basketball/plays/kickball.rb +11 -0
  75. data/lib/sportradar/api/basketball/plays/lineup_change.rb +11 -0
  76. data/lib/sportradar/api/basketball/plays/offensive_foul.rb +11 -0
  77. data/lib/sportradar/api/basketball/plays/official_timeout.rb +11 -0
  78. data/lib/sportradar/api/basketball/plays/open_inbound.rb +9 -0
  79. data/lib/sportradar/api/basketball/plays/open_tip.rb +11 -0
  80. data/lib/sportradar/api/basketball/plays/personal_foul.rb +9 -0
  81. data/lib/sportradar/api/basketball/plays/rebound.rb +28 -0
  82. data/lib/sportradar/api/basketball/plays/review.rb +11 -0
  83. data/lib/sportradar/api/basketball/plays/shooting_foul.rb +9 -0
  84. data/lib/sportradar/api/basketball/plays/shot_made.rb +22 -0
  85. data/lib/sportradar/api/basketball/plays/shot_miss.rb +22 -0
  86. data/lib/sportradar/api/basketball/plays/steal.rb +11 -0
  87. data/lib/sportradar/api/basketball/plays/team_timeout.rb +14 -0
  88. data/lib/sportradar/api/basketball/plays/technical_foul.rb +14 -0
  89. data/lib/sportradar/api/basketball/plays/three_point_made.rb +14 -0
  90. data/lib/sportradar/api/basketball/plays/three_point_miss.rb +11 -0
  91. data/lib/sportradar/api/basketball/plays/timeout.rb +24 -0
  92. data/lib/sportradar/api/basketball/plays/turnover.rb +19 -0
  93. data/lib/sportradar/api/basketball/plays/tv_timeout.rb +11 -0
  94. data/lib/sportradar/api/basketball/plays/two_point_made.rb +14 -0
  95. data/lib/sportradar/api/basketball/plays/two_point_miss.rb +11 -0
  96. data/lib/sportradar/api/basketball/plays.rb +39 -0
  97. data/lib/sportradar/api/basketball/record.rb +28 -0
  98. data/lib/sportradar/api/basketball/scoring.rb +103 -0
  99. data/lib/sportradar/api/basketball/season.rb +20 -0
  100. data/lib/sportradar/api/basketball/team.rb +136 -0
  101. data/lib/sportradar/api/basketball/venue.rb +54 -0
  102. data/lib/sportradar/api/basketball.rb +35 -0
  103. data/lib/sportradar/api/{nfl/broadcast.rb → broadcast.rb} +1 -1
  104. data/lib/sportradar/api/content/article.rb +1 -1
  105. data/lib/sportradar/api/content/article_list.rb +1 -1
  106. data/lib/sportradar/api/content.rb +17 -5
  107. data/lib/sportradar/api/data.rb +53 -0
  108. data/lib/sportradar/api/football/README.md +62 -0
  109. data/lib/sportradar/api/football/drive.rb +114 -0
  110. data/lib/sportradar/api/football/event.rb +36 -0
  111. data/lib/sportradar/api/football/game.rb +404 -0
  112. data/lib/sportradar/api/football/game_stats.rb +135 -0
  113. data/lib/sportradar/api/football/ncaafb/api.rb +81 -0
  114. data/lib/sportradar/api/football/ncaafb/conference.rb +53 -0
  115. data/lib/sportradar/api/football/ncaafb/division.rb +42 -0
  116. data/lib/sportradar/api/football/ncaafb/drive.rb +36 -0
  117. data/lib/sportradar/api/football/ncaafb/game.rb +130 -0
  118. data/lib/sportradar/api/football/ncaafb/play.rb +97 -0
  119. data/lib/sportradar/api/football/ncaafb/player.rb +31 -0
  120. data/lib/sportradar/api/football/ncaafb/quarter.rb +15 -0
  121. data/lib/sportradar/api/football/ncaafb/subdivision.rb +43 -0
  122. data/lib/sportradar/api/football/ncaafb/team.rb +49 -0
  123. data/lib/sportradar/api/football/ncaafb/week.rb +24 -0
  124. data/lib/sportradar/api/football/ncaafb.rb +273 -0
  125. data/lib/sportradar/api/football/nfl/api.rb +76 -0
  126. data/lib/sportradar/api/football/nfl/conference.rb +35 -0
  127. data/lib/sportradar/api/football/nfl/depth_chart.rb +53 -0
  128. data/lib/sportradar/api/football/nfl/division.rb +37 -0
  129. data/lib/sportradar/api/football/nfl/drive.rb +19 -0
  130. data/lib/sportradar/api/football/nfl/event.rb +19 -0
  131. data/lib/sportradar/api/football/nfl/game.rb +77 -0
  132. data/lib/sportradar/api/football/nfl/league_depth_chart.rb +41 -0
  133. data/lib/sportradar/api/football/nfl/play.rb +27 -0
  134. data/lib/sportradar/api/football/nfl/player.rb +31 -0
  135. data/lib/sportradar/api/football/nfl/quarter.rb +15 -0
  136. data/lib/sportradar/api/football/nfl/team.rb +42 -0
  137. data/lib/sportradar/api/football/nfl/team_depth_chart.rb +44 -0
  138. data/lib/sportradar/api/football/nfl/week.rb +24 -0
  139. data/lib/sportradar/api/football/nfl.rb +322 -0
  140. data/lib/sportradar/api/football/play.rb +116 -0
  141. data/lib/sportradar/api/football/play_statistics.rb +313 -0
  142. data/lib/sportradar/api/football/player.rb +121 -0
  143. data/lib/sportradar/api/football/quarter.rb +46 -0
  144. data/lib/sportradar/api/football/record.rb +48 -0
  145. data/lib/sportradar/api/football/scoring.rb +92 -0
  146. data/lib/sportradar/api/football/situation.rb +32 -0
  147. data/lib/sportradar/api/football/stat_pack/defense.rb +20 -20
  148. data/lib/sportradar/api/football/stat_pack/extra_points.rb +5 -4
  149. data/lib/sportradar/api/football/stat_pack/field_goals.rb +6 -5
  150. data/lib/sportradar/api/football/stat_pack/fumbles.rb +11 -9
  151. data/lib/sportradar/api/football/stat_pack/kick_returns.rb +8 -7
  152. data/lib/sportradar/api/football/stat_pack/kickoffs.rb +9 -7
  153. data/lib/sportradar/api/football/stat_pack/misc_returns.rb +1 -1
  154. data/lib/sportradar/api/football/stat_pack/passing.rb +13 -11
  155. data/lib/sportradar/api/football/stat_pack/penalties.rb +2 -2
  156. data/lib/sportradar/api/football/stat_pack/punt_returns.rb +7 -6
  157. data/lib/sportradar/api/football/stat_pack/punts.rb +12 -10
  158. data/lib/sportradar/api/football/stat_pack/receiving.rb +10 -9
  159. data/lib/sportradar/api/football/stat_pack/rushing.rb +11 -9
  160. data/lib/sportradar/api/football/stat_pack.rb +7 -3
  161. data/lib/sportradar/api/football/team.rb +160 -0
  162. data/lib/sportradar/api/football/venue.rb +25 -0
  163. data/lib/sportradar/api/football/week.rb +57 -0
  164. data/lib/sportradar/api/football.rb +47 -0
  165. data/lib/sportradar/api/images/asset.rb +2 -1
  166. data/lib/sportradar/api/images/ref.rb +15 -0
  167. data/lib/sportradar/api/images.rb +51 -9
  168. data/lib/sportradar/api/mma/event.rb +111 -0
  169. data/lib/sportradar/api/mma/fight.rb +107 -0
  170. data/lib/sportradar/api/mma/fighter.rb +95 -0
  171. data/lib/sportradar/api/mma/judge.rb +70 -0
  172. data/lib/sportradar/api/mma/league.rb +63 -0
  173. data/lib/sportradar/api/mma/referee.rb +70 -0
  174. data/lib/sportradar/api/mma/result.rb +68 -0
  175. data/lib/sportradar/api/mma/roster.rb +72 -0
  176. data/lib/sportradar/api/mma/schedule.rb +53 -0
  177. data/lib/sportradar/api/mma/score.rb +83 -0
  178. data/lib/sportradar/api/mma/venue.rb +72 -0
  179. data/lib/sportradar/api/mma.rb +195 -0
  180. data/lib/sportradar/api/poll.rb +40 -0
  181. data/lib/sportradar/api/request.rb +40 -8
  182. data/lib/sportradar/api/soccer/schedule.rb +1 -0
  183. data/lib/sportradar/api/version.rb +1 -1
  184. data/lib/sportradar/api.rb +20 -34
  185. metadata +157 -34
  186. data/lib/sportradar/api/nfl/.play_statistics.rb.swo +0 -0
  187. data/lib/sportradar/api/nfl/changelog.rb +0 -17
  188. data/lib/sportradar/api/nfl/coach.rb +0 -17
  189. data/lib/sportradar/api/nfl/conference.rb +0 -16
  190. data/lib/sportradar/api/nfl/depth_chart.rb +0 -47
  191. data/lib/sportradar/api/nfl/division.rb +0 -16
  192. data/lib/sportradar/api/nfl/draft.rb +0 -16
  193. data/lib/sportradar/api/nfl/drive.rb +0 -73
  194. data/lib/sportradar/api/nfl/event.rb +0 -19
  195. data/lib/sportradar/api/nfl/franchise.rb +0 -14
  196. data/lib/sportradar/api/nfl/game.rb +0 -94
  197. data/lib/sportradar/api/nfl/game_statistic.rb +0 -133
  198. data/lib/sportradar/api/nfl/hierarchy.rb +0 -19
  199. data/lib/sportradar/api/nfl/injury.rb +0 -16
  200. data/lib/sportradar/api/nfl/league_depth_chart.rb +0 -26
  201. data/lib/sportradar/api/nfl/play.rb +0 -39
  202. data/lib/sportradar/api/nfl/play_statistics.rb +0 -247
  203. data/lib/sportradar/api/nfl/player.rb +0 -49
  204. data/lib/sportradar/api/nfl/position.rb +0 -14
  205. data/lib/sportradar/api/nfl/quarter.rb +0 -29
  206. data/lib/sportradar/api/nfl/scoring.rb +0 -25
  207. data/lib/sportradar/api/nfl/season.rb +0 -23
  208. data/lib/sportradar/api/nfl/situation.rb +0 -18
  209. data/lib/sportradar/api/nfl/statistic.rb +0 -28
  210. data/lib/sportradar/api/nfl/summary.rb +0 -17
  211. data/lib/sportradar/api/nfl/team.rb +0 -56
  212. data/lib/sportradar/api/nfl/team_depth_chart.rb +0 -44
  213. data/lib/sportradar/api/nfl/venue.rb +0 -22
  214. data/lib/sportradar/api/nfl/week.rb +0 -16
  215. data/lib/sportradar/api/nfl.rb +0 -205
@@ -0,0 +1,245 @@
1
+ module Sportradar
2
+ module Api
3
+ module Baseball
4
+ class Pitch < Data
5
+ attr_accessor :response, :id, :at_bat, :outcome_id, :status, :count, :is_ab_over, :is_hit, :warming_up, :runners, :errors, :pitch_type_name, :x, :y, :zone, :total_pitch_count, :atbat_pitch_count, :speed, :outcome, :hit_type, :balls, :strikes, :outs, :fielders
6
+
7
+ def initialize(data, **opts)
8
+ @response = data
9
+ @api = opts[:api]
10
+ @at_bat = opts[:at_bat]
11
+ # @half_inning = opts[:half_inning]
12
+
13
+ @id = data["id"]
14
+
15
+ update(data)
16
+ end
17
+ def ==(other)
18
+ @id == other.id && @count == other.count && @outcome_id == other.outcome_id
19
+ end
20
+ def update(data, **opts)
21
+
22
+ if data['outcome_id']
23
+ @outcome_id = data['outcome_id']
24
+ @outcome = self.class.pitch_outcome(@outcome_id)
25
+ end
26
+ @description = data['description'] if data['description']
27
+ @status = data['status'] if data['status']
28
+
29
+ parse_hit(data)
30
+ parse_runners(data['runners']) if data['runners']
31
+ parse_pitcher(data['pitcher']) if data['pitcher']
32
+ parse_flags(data['flags']) if data['flags']
33
+ parse_count(data['count']) if data['count']
34
+ parse_warming_up(data['warming_up']) if data['warming_up']
35
+ parse_fielders(data['fielders']) if data['fielders']
36
+ parse_errors(data['errors']) if data['errors']
37
+ end
38
+
39
+ def pitches
40
+ @pitches_hash.values
41
+ end
42
+
43
+ def homerun?
44
+ @outcome_id == 'aHR'
45
+ end
46
+
47
+ def foul?
48
+ ['kF','kFT'].include? @outcome_id
49
+ end
50
+
51
+ def ball?
52
+ ['bAB', 'bB', 'bDB', 'bIB', 'bPO'].include? @outcome_id
53
+ end
54
+
55
+ def strike?
56
+ ['aKLAD1', 'aKLAD2', 'aKLAD3', 'aKLAD4', 'aKSAD1', 'aKSAD2', 'aKSAD3', 'aKSAD4', 'kF', 'kFT', 'kKL', 'kKS', 'oKLT1', 'oKLT2', 'oKLT3', 'oKLT4', 'oKST1', 'oKST2', 'oKST3', 'oKST4'].include? @outcome_id
57
+ end
58
+
59
+ def hit_ends_ab?
60
+ @hit_location.present? && !foul?
61
+ end
62
+
63
+ def parse_hit(data)
64
+ @hit_type = data['hit_type'] if data['hit_type']
65
+ @hit_location = data['hit_location'] if data['hit_location']
66
+ end
67
+
68
+ def parse_runners(data)
69
+ @runners = data.map { |hash| Runner.new(hash) }
70
+ end
71
+
72
+ def parse_errors(data)
73
+ @errors = data.map { |hash| Error.new(hash) }
74
+ end
75
+
76
+ def parse_fielders(data)
77
+ @fielders = data.map { |hash| Fielder.new(hash) }
78
+ end
79
+
80
+ def parse_pitcher(data)
81
+ @type = data['pitch_type'] if data['pitch_type']
82
+ @speed = data['pitch_speed'] if data['pitch_speed']
83
+ @x = data['pitch_x'] if data['pitch_x']
84
+ @y = data['pitch_y'] if data['pitch_y']
85
+ @zone = data['pitch_zone'] if data['pitch_zone']
86
+
87
+ @pitch_type_name = self.class.pitch_type(@type)
88
+ @total_pitch_count = data['pitch_count'] if data['pitch_count']
89
+ end
90
+
91
+ def parse_flags(data)
92
+ @is_ab_over = data['is_ab_over'] if data['is_ab_over']
93
+ @is_bunt = data['is_bunt'] if data['is_bunt']
94
+ @is_bunt_shown = data['is_bunt_shown'] if data['is_bunt_shown']
95
+ @is_hit = data['is_hit'] if data['is_hit']
96
+ @is_wild_pitch = data['is_wild_pitch'] if data['is_wild_pitch']
97
+ @is_passed_ball = data['is_passed_ball'] if data['is_passed_ball']
98
+ @is_double_play = data['is_double_play'] if data['is_double_play']
99
+ @is_triple_play = data['is_triple_play'] if data['is_triple_play']
100
+ end
101
+
102
+ def parse_count(data)
103
+ @count = data
104
+ @balls = data['balls'] if data['balls']
105
+ @strikes = data['strikes'] if data['strikes']
106
+ @outs = data['outs'] if data['outs']
107
+ @atbat_pitch_count = data['pitch_count'] if data['pitch_count']
108
+ end
109
+
110
+ def parse_warming_up(data)
111
+ @warming_id = data['id']
112
+ @warming_player_id = data['player_id']
113
+ @warming_team_id = data['team_id']
114
+ @warming_last_name = data['last_name']
115
+ @warming_first_name = data['first_name']
116
+ @warming_preferred_name = data['preferred_name']
117
+ @warming_jersey_number = data['jersey_number']
118
+ @warming_up = "#{data['preferred_name'] || data['first_name']} #{data['last_name']}"
119
+ end
120
+
121
+ def parse_steal(data)
122
+
123
+ end
124
+
125
+ {"type"=>"steal", "id"=>"76762fd9-683c-42f2-8c72-8d9fd4f5bc7b", "status"=>"official", "created_at"=>"2017-05-06T02:56:49+00:00", "pitcher"=>{"id"=>"9dd06397-4353-44e8-81bb-6e88a75e42b5"}, "runners"=>[{"id"=>"3e39fe20-6dca-4894-807b-1ce76ff93e29", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"", "out"=>false, "last_name"=>"Owings", "first_name"=>"Christopher", "preferred_name"=>"Chris", "jersey_number"=>"16"}]}
126
+
127
+ {"type"=>"steal", "id"=>"df01b116-afcd-467f-9b9c-99d3891629c6", "status"=>"official", "created_at"=>"2017-05-06T03:00:58+00:00", "pitcher"=>{"id"=>"90fb6719-5135-42f3-88c0-0ccde448368c"}, "runners"=>[{"id"=>"106e6fb6-6460-412e-abdb-9f73469a27b9", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"CK", "out"=>false, "last_name"=>"DeShields", "first_name"=>"Delino", "preferred_name"=>"Delino", "jersey_number"=>"3"}]}
128
+ {"type"=>"steal", "id"=>"37c9192d-cac9-4320-b721-f68955eecf24", "status"=>"official", "created_at"=>"2017-05-06T03:02:16+00:00", "pitcher"=>{"id"=>"90fb6719-5135-42f3-88c0-0ccde448368c"}, "runners"=>[{"id"=>"106e6fb6-6460-412e-abdb-9f73469a27b9", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"CK", "out"=>false, "last_name"=>"DeShields", "first_name"=>"Delino", "preferred_name"=>"Delino", "jersey_number"=>"3"}]}
129
+ {"type"=>"steal", "id"=>"b8dcebfa-e02c-470e-ba73-e9b6b553cc0d", "status"=>"official", "created_at"=>"2017-05-06T03:38:48+00:00", "pitcher"=>{"id"=>"1a2638a3-28df-46b3-9cca-0f8eb29b581f"}, "runners"=>[{"id"=>"2847c4e0-01be-46bd-992e-701ee447e3f5", "starting_base"=>1, "ending_base"=>1, "outcome_id"=>"CK", "out"=>false, "last_name"=>"Upton", "first_name"=>"Justin", "preferred_name"=>"Justin", "jersey_number"=>"8"}, {"id"=>"f27a7574-57db-4eeb-8f88-377048806de2", "starting_base"=>3, "ending_base"=>3, "outcome_id"=>"", "out"=>false, "last_name"=>"Martínez", "first_name"=>"Victor", "preferred_name"=>"Victor", "jersey_number"=>"41"}]}
130
+
131
+
132
+ def self.pitch_type(code)
133
+ pitch_types[code]
134
+ end
135
+
136
+ def self.pitch_types
137
+ @pitch_types ||= {
138
+ 'FA' => 'Fastball',
139
+ 'SI' => 'Sinker',
140
+ 'CT' => 'Cutter',
141
+ 'CU' => 'Curveball',
142
+ 'SL' => 'Slider',
143
+ 'CH' => 'Changeup',
144
+ 'KN' => 'Knuckleball',
145
+ 'SP' => 'Splitter',
146
+ 'SC' => 'Screwball',
147
+ 'FO' => 'Forkball',
148
+ 'IB' => 'Intentional Ball',
149
+ 'PI' => 'Pitchout',
150
+ }
151
+ end
152
+ def self.pitch_outcome(code)
153
+ pitch_outcomes[code]
154
+ end
155
+ def self.pitch_outcomes
156
+ @pitch_outcomes ||= {
157
+ 'aBK' => 'Balk',
158
+ 'aCI' => 'Catcher Interference',
159
+ 'aD' => 'Double',
160
+ 'aDAD3' => 'Double - Adv 3rd',
161
+ 'aDAD4' => 'Double - Adv Home',
162
+ 'aFCAD2' => 'Fielders Choice - Adv 2nd',
163
+ 'aFCAD3' => 'Fielders Choice - Adv 3rd',
164
+ 'aFCAD4' => 'Fielders Choice - Adv Home',
165
+ 'aHBP' => 'Hit By Pitch',
166
+ 'aHR' => 'Homerun',
167
+ 'aIBB' => 'Intentional Walk',
168
+ 'aKLAD1' => 'Strike Looking - Adv 1st',
169
+ 'aKLAD2' => 'Strike Looking - Adv 2nd',
170
+ 'aKLAD3' => 'Strike Looking - Adv 3rd',
171
+ 'aKLAD4' => 'Strike Looking - Adv Home',
172
+ 'aKSAD1' => 'Strike Swinging - Adv 1st',
173
+ 'aKSAD2' => 'Strike Swinging - Adv 2nd',
174
+ 'aKSAD3' => 'Strike Swinging - Adv 3rd',
175
+ 'aKSAD4' => 'Strike Swinging - Adv Home',
176
+ 'aROE' => 'Reached On Error',
177
+ 'aROEAD2' => 'Reached On Error - Adv 2nd',
178
+ 'aROEAD3' => 'Reached On Error - Adv 3rd',
179
+ 'aROEAD4' => 'Reached On Error - Adv Home',
180
+ 'aS' => 'Single',
181
+ 'aSAD2' => 'Single - Adv 2nd',
182
+ 'aSAD3' => 'Single - Adv 3rd',
183
+ 'aSAD4' => 'Single - Adv Home',
184
+ 'aSBAD1' => 'Sacrifice Bunt - Adv 1st',
185
+ 'aSBAD2' => 'Sacrifice Bunt - Adv 2nd',
186
+ 'aSBAD3' => 'Sacrifice Bunt - Adv 3rd',
187
+ 'aSBAD4' => 'Sacrifice Bunt - Adv Home',
188
+ 'aSFAD1' => 'Sacrifice Fly - Adv 1st',
189
+ 'aSFAD2' => 'Sacrifice Fly - Adv 2nd',
190
+ 'aSFAD3' => 'Sacrifice Fly - Adv 3rd',
191
+ 'aSFAD4' => 'Sacrifice Fly - Adv Home',
192
+ 'aT' => 'Triple',
193
+ 'aTAD4' => 'Triple - Adv Home',
194
+ 'bAB' => 'Enforced Ball',
195
+ 'bB' => 'Ball',
196
+ 'bDB' => 'Dirt Ball',
197
+ 'bIB' => 'Intentional Ball',
198
+ 'bPO' => 'Pitchout',
199
+ 'kF' => 'Foul Ball',
200
+ 'kFT' => 'Foul Tip',
201
+ 'kKL' => 'Strike Looking',
202
+ 'kKS' => 'Strike Swinging',
203
+ 'oBI' => 'Hitter Interference',
204
+ 'oDT3' => 'Double - Out at 3rd',
205
+ 'oDT4' => 'Double - Out at Home',
206
+ 'oFC' => 'Fielders Choice',
207
+ 'oFCT2' => 'Fielders Choice - Out at 2nd',
208
+ 'oFCT3' => 'Fielders Choice - Out at 3rd',
209
+ 'oFCT4' => 'Fielders Choice - Out at Home',
210
+ 'oFO' => 'Fly Out',
211
+ 'oGO' => 'Ground Out',
212
+ 'oKLT1' => 'Strike Looking - Out at 1st',
213
+ 'oKLT2' => 'Strike Looking - Out at 2nd',
214
+ 'oKLT3' => 'Strike Looking - Out at 3rd',
215
+ 'oKLT4' => 'Strike Looking - Out at Home',
216
+ 'oKST1' => 'Strike Swinging - Out at 1st',
217
+ 'oKST2' => 'Strike Swinging - Out at 2nd',
218
+ 'oKST3' => 'Strike Swinging - Out at 3rd',
219
+ 'oKST4' => 'Strike Swinging - Out at Home',
220
+ 'oLO' => 'Line Out',
221
+ 'oOBB' => 'Out of Batters Box',
222
+ 'oOP' => 'Out on Appeal',
223
+ 'oPO' => 'Pop Out',
224
+ 'oROET2' => 'Reached On Error - Out at 2nd',
225
+ 'oROET3' => 'Reached On Error - Out at 3rd',
226
+ 'oROET4' => 'Reached On Error - Out at Home',
227
+ 'oSB' => 'Sacrifice Bunt',
228
+ 'oSBT2' => 'Sacrifice Bunt - Out at 2nd',
229
+ 'oSBT3' => 'Sacrifice Bunt - Out at 3rd',
230
+ 'oSBT4' => 'Sacrifice Bunt - Out at Home',
231
+ 'oSF' => 'Sacrifice Fly',
232
+ 'oSFT2' => 'Sacrifice Fly - Out at 2nd',
233
+ 'oSFT3' => 'Sacrifice Fly - Out at 3rd',
234
+ 'oSFT4' => 'Sacrifice Fly - Out at Home',
235
+ 'oST2' => 'Single - Out at 2nd',
236
+ 'oST3' => 'Single - Out at 3rd',
237
+ 'oST4' => 'Single - Out at Home',
238
+ 'oTT4' => 'Triple - Out at Home',
239
+ }
240
+ end
241
+ {"type"=>"steal", "id"=>"01ead210-1586-4d07-9713-6fd3d17b2b4c", "status"=>"official", "created_at"=>"2017-05-15T23:55:53+00:00", "pitcher"=>{"id"=>"9c12832b-c487-40d4-915b-e44097632d7c"}, "runners"=>[{"id"=>"65de4cd1-ca86-468c-9346-1e68d6279a8e", "starting_base"=>1, "ending_base"=>0, "outcome_id"=>"PO", "out"=>true, "last_name"=>"Gordon", "first_name"=>"Devaris", "preferred_name"=>"Dee", "jersey_number"=>"9", "description"=>"Dee Gordon picked off.", "fielders"=>[{"id"=>"bd519b9f-7539-4282-a741-3bd2bf532c40", "type"=>"putout", "sequence"=>1, "last_name"=>"Gurriel", "first_name"=>"Yulieski", "preferred_name"=>"Yulieski", "jersey_number"=>"10"}, {"id"=>"9c12832b-c487-40d4-915b-e44097632d7c", "type"=>"assist", "sequence"=>1, "last_name"=>"Musgrove", "first_name"=>"Joseph", "preferred_name"=>"Joe", "jersey_number"=>"59"}]}]}
242
+ end
243
+ end
244
+ end
245
+ end
@@ -0,0 +1,119 @@
1
+ module Sportradar
2
+ module Api
3
+ module Baseball
4
+ class Player < Data
5
+ attr_accessor :response, :id, :number, :full_name, :first_name, :last_name, :position, :primary_position, :birth_place, :college, :height, :weight, :draft, :hitting, :pitching, :fielding, :team
6
+
7
+ def initialize(data, **opts)
8
+ @response = data # comment this out when done developing
9
+ @api = opts[:api]
10
+ @team = opts[:team]
11
+
12
+ @id = data["id"]
13
+
14
+ update(data, **opts)
15
+ end
16
+
17
+ def name # to match api for NFL::Player
18
+ full_name
19
+ end
20
+ def display_name
21
+ full_name || "#{@preferred_name || @first_name} #{@last_name}"
22
+ end
23
+ def jersey
24
+ @jersey_number
25
+ end
26
+
27
+ def birth_date # to match api for NFL::Player
28
+ @birthdate
29
+ end
30
+
31
+ def update(data, **opts)
32
+ @depth = data['depth'] if data['depth']
33
+ @experience = data['experience'] if data['experience']
34
+ @birth_place = data['birth_place'].gsub(',,', ', ') if data['birth_place']
35
+ @college = data['college'] if data['college']
36
+
37
+ # from team roster
38
+ @status = data['status'] if data['status']
39
+ @position = data['position'] if data['position']
40
+ @primary_position = data['primary_position'] if data['primary_position']
41
+ @first_name = data['first_name'] if data['first_name']
42
+ @last_name = data['last_name'] if data['last_name']
43
+ @preferred_name = data['preferred_name'] if data['preferred_name']
44
+ @jersey_number = data['jersey_number'] if data['jersey_number']
45
+ @full_name = data['full_name'] if data['full_name']
46
+ @mlbam_id = data['mlbam_id'] if data['mlbam_id']
47
+ @height = data['height'] if data['height']
48
+ @weight = data['weight'] if data['weight']
49
+ @throw_hand = data['throw_hand'] if data['throw_hand']
50
+ @bat_hand = data['bat_hand'] if data['bat_hand']
51
+ @high_school = data['high_school'] if data['high_school']
52
+ @birthdate = data['birthdate'] if data['birthdate']
53
+ @birthstate = data['birthstate'] if data['birthstate']
54
+ @birthcountry = data['birthcountry'] if data['birthcountry']
55
+ @birthcity = data['birthcity'] if data['birthcity']
56
+ @pro_debut = data['pro_debut'] if data['pro_debut']
57
+ @updated = data['updated'] if data['updated']
58
+ @active = data['active'] if data['active']
59
+
60
+
61
+ update_injuries(data)
62
+ update_draft(data)
63
+
64
+ @team.update_player_stats(self, data['statistics'], opts[:game]) if data['statistics']
65
+ if stats = data['statistics']
66
+ @fielding = stats.dig('fielding', 'overall')
67
+ @pitching = stats.dig('pitching', 'overall')
68
+ @hitting = stats.dig('hitting', 'overall')
69
+
70
+ # used to be @team, lets leave as opt until it needs to go back
71
+ opts[:team].update_player_stats(self, stats)
72
+ end
73
+
74
+ self
75
+ end
76
+
77
+ def injured?
78
+ !!(@injury && @injury.out?)
79
+ end
80
+
81
+ def age
82
+ if birth_date.present?
83
+ now = Time.now.utc.to_date
84
+ dob = birth_date.to_date
85
+ now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
86
+ end
87
+ end
88
+
89
+ def update_draft(data)
90
+ @draft = data['draft'] if data['draft'] # {"team_id"=>"583ec825-fb46-11e1-82cb-f4ce4684ea4c", "year"=>"2012", "round"=>"1", "pick"=>"30"},
91
+ end
92
+ def update_injuries(data)
93
+ # @injury = Injury.new(data['injuries']) if data['injuries']
94
+ # {"injury"=>
95
+ # {"id"=>"06423591-3fc1-4d2b-8c60-a3f30d735345",
96
+ # "comment"=>"Ezeli suffered a setback in his recovery from a procedure on his knee and there is no timetable for his return, according to Jason Quick of csnnw.com.",
97
+ # "desc"=>"Knee",
98
+ # "status"=>"Out",
99
+ # "start_date"=>"2016-10-25",
100
+ # "update_date"=>"2016-11-09"}}}
101
+ end
102
+
103
+ def api
104
+ @api || Sportradar::Api::Baseball::Mlb.new
105
+ end
106
+
107
+ end
108
+ end
109
+ end
110
+ end
111
+
112
+ __END__
113
+
114
+ mlb = Sportradar::Api::Baseball::Mlb::Hierarchy.new
115
+ mlb.get_hierarchy;
116
+ t = mlb.teams.first;
117
+ t.get_season_stats(2016);
118
+ t.players.sample
119
+
@@ -0,0 +1,42 @@
1
+ module Sportradar
2
+ module Api
3
+ module Baseball
4
+ class Record < Data
5
+ attr_accessor :id, :team, :wins, :losses, :win_pct, :streak, :games_back #, :runs_for, :runs_against, :run_diff, :games_behind, :streak
6
+ alias :games_behind :games_back
7
+
8
+ def initialize(data, type: 'overall', **opts)
9
+ @team = opts[:team]
10
+ @type = type
11
+
12
+ update(data, **opts)
13
+ end
14
+
15
+ def update(data, **opts)
16
+ @wins = data["win"]
17
+ @losses = data["loss"]
18
+ @win_pct = data["win_p"]
19
+ @home_win = data["home_win"]
20
+ @home_loss = data["home_loss"]
21
+ @away_win = data["away_win"]
22
+ @away_loss = data["away_loss"]
23
+ @streak = data["streak"]
24
+ @e_win = data["e_win"]
25
+ @e_loss = data["e_loss"]
26
+ @c_win = data["c_win"]
27
+ @c_loss = data["c_loss"]
28
+ @w_win = data["w_win"]
29
+ @w_loss = data["w_loss"]
30
+ @al_win = data["al_win"]
31
+ @al_loss = data["al_loss"]
32
+ @last_10_won = data["last_10_won"]
33
+ @last_10_lost = data["last_10_lost"]
34
+ @games_back = data["games_back"]
35
+ @wild_card_back = data["wild_card_back"]
36
+ @elimination_number = data["elimination_number"]
37
+ end
38
+
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,78 @@
1
+ module Sportradar
2
+ module Api
3
+ module Baseball
4
+ class Runner < Data
5
+ attr_accessor :response, :id, :starting_base, :ending_base, :outcome_id, :out, :description, :fielders, :outcome
6
+
7
+ def initialize(data, **opts)
8
+ @response = data
9
+ # @game = opts[:game]
10
+
11
+ update(data)
12
+ end
13
+ def update(data, **opts)
14
+ @id = data["id"]
15
+ @starting_base = data["starting_base"]
16
+ @ending_base = data["ending_base"]
17
+ @outcome_id = data["outcome_id"]
18
+ @outcome = runner_outcome(@outcome_id)
19
+ @out = data["out"]
20
+ @last_name = data["last_name"]
21
+ @first_name = data["first_name"]
22
+ @preferred_name = data["preferred_name"]
23
+ @jersey_number = data["jersey_number"]
24
+ @description = data['description']
25
+ @fielders = data['fielders'].map { |hash| Fielder.new(hash) } if data['fielders']
26
+ end
27
+
28
+ def runner_outcome(code)
29
+ runner_outcomes[code]
30
+ end
31
+ def runner_outcomes
32
+ @runner_outcomes ||= {
33
+ 'CK' => 'Checked',
34
+ 'ERN' => 'Earned Run/RBI',
35
+ 'eRN' => 'Earned Run/No RBI',
36
+ 'URN' => 'Unearned Run/RBI',
37
+ 'uRN' => 'Unearned Run/No RBI',
38
+ 'PO' => 'Pickoff',
39
+ 'POCS2' => 'Pickoff/Caught Stealing 2nd',
40
+ 'POCS3' => 'Pickoff/Caught Stealing 3nd',
41
+ 'POCS4' => 'Pickoff/Caught Stealing Home',
42
+ 'AD1' => 'Advance 1st',
43
+ 'AD2' => 'Advance 2nd',
44
+ 'AD3' => 'Advance 3rd',
45
+ 'SB2' => 'Stole 2nd',
46
+ 'SB2E4E' => 'Stole 2nd, error to home (earned)',
47
+ 'SB3' => 'Stole 3rd',
48
+ 'SB3E4E' => 'Stole 3rd, error to home (earned)',
49
+ 'SB4' => 'Stole Home',
50
+ 'TO2' => 'Tag out 2nd',
51
+ 'TO3' => 'Tag out 3rd',
52
+ 'TO4' => 'Tag out Home',
53
+ 'FO1' => 'Force out 1st',
54
+ 'FO2' => 'Force out 2nd',
55
+ 'FO3' => 'Force out 3rd',
56
+ 'FO4' => 'Force out Home',
57
+ 'CS2' => 'Caught Stealing 2nd',
58
+ 'CS3' => 'Caught Stealing 3rd',
59
+ 'CS4' => 'Caught Stealing Home',
60
+ 'SB2E3' => 'Stole 2nd, error to 3rd',
61
+ 'SB2E4' => 'Stole 2nd, error to Home',
62
+ 'SB3E4' => 'Stole 3nd, error to Home',
63
+ 'DI2' => 'Indifference to 2nd',
64
+ 'DI3' => 'Indifference to 3rd',
65
+ 'DO1' => 'Doubled off 1st',
66
+ 'DO2' => 'Doubled off 2nd',
67
+ 'DO3' => 'Doubled off 3rd',
68
+ 'RI' => 'Runner Interference',
69
+ 'OOA' => 'Out on Appeal',
70
+ 'OBP' => 'Out of Base Path',
71
+ 'HBB' => 'Hit by Batted Ball',
72
+ }
73
+ end
74
+
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,86 @@
1
+ module Sportradar
2
+ module Api
3
+ module Baseball
4
+ class Scoring < Data
5
+ attr_accessor :response, :api, :id, :home, :away, :scores
6
+
7
+ def initialize(data, **opts)
8
+ @api = opts[:api]
9
+ @game = opts[:game]
10
+
11
+ @scores = {}
12
+ @id = data['id']
13
+
14
+ update(data, **opts)
15
+ end
16
+
17
+ def update(data, source: nil, **opts)
18
+ new_scores = case source
19
+ when :box
20
+ parse_from_box(data)
21
+ when :pbp
22
+ parse_from_pbp(data)
23
+ when :summary
24
+ parse_from_box(data)
25
+ when :rhe
26
+ data
27
+ else
28
+ # if data['quarter'] || data['half']
29
+ # parse_from_pbp(data)
30
+ # elsif data['team']
31
+ # parse_from_box(data)
32
+ # else # schedule requests
33
+ # {}
34
+ # end
35
+ {}
36
+ end
37
+ # parse data structure
38
+ # handle data from team (all quarters)
39
+ # handle data from quarter (both teams)
40
+ # handle data from game?
41
+ @scores.each { |k, v| v.merge!(new_scores.delete(k) || {} ) }
42
+ new_scores.each { |k, v| @scores.merge!(k => v) }
43
+ end
44
+
45
+ def runs(team_id)
46
+ @scores.dig(team_id, 'runs').to_i
47
+ end
48
+ def hits(team_id)
49
+ @scores.dig(team_id, 'hits').to_i
50
+ end
51
+ def errors(team_id)
52
+ @scores.dig(team_id, 'errors').to_i
53
+ end
54
+
55
+ alias :points :runs
56
+
57
+ private
58
+
59
+ def parse_from_pbp(data)
60
+ scoring = data['innings'].map {|i| i['scoring'] }.compact
61
+ return {} if scoring.empty?
62
+ scoring.each_with_object({}).with_index(1) do |(hash, memo), idx|
63
+ memo[idx] = {hash.dig('home', 'id') => hash.dig('home', 'runs'), hash.dig('away', 'id') => hash.dig('away', 'runs')}
64
+ end
65
+ end
66
+
67
+ def parse_from_box(data)
68
+ id = data.dig('home', 'id')
69
+ da = data.dig('home', 'scoring')
70
+ return {} unless da
71
+ da.each { |h| h[id] = h.delete('runs') }
72
+ id = data.dig('away', 'id')
73
+ db = data.dig('away', 'scoring')
74
+ return {} unless db
75
+ db.each { |h| h[id] = h.delete('runs') }
76
+ da.zip(db).map{ |a, b| [a['sequence'].to_i, a.merge(b)] }.sort{ |(a,_), (b,_)| a <=> b }.to_h
77
+ end
78
+
79
+ def parse_from_summary(data)
80
+ #
81
+ end
82
+
83
+ end
84
+ end
85
+ end
86
+ end