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,313 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class PlayStatistics < Data
5
+ attr_accessor :response, :kick, :return, :rush, :defense, :receive, :punt, :penalty, :pass, :first_down, :field_goal, :extra_point, :defense, :down_conversion
6
+ def initialize(data)
7
+ data = [data] if data.is_a?(Hash)
8
+ @response = data
9
+ data.each do |hash|
10
+ begin
11
+ klass = self.class.stat_type_classes[hash['stat_type']] || MiscStatistics
12
+ instance_variable_set("@#{hash['stat_type']}", klass.new(hash))
13
+ rescue => e
14
+ binding.pry
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.stat_type_classes
20
+ stat_type_classes ||= {
21
+ 'kick' => PlayKickStatistics,
22
+ 'return' => PlayReturnStatistics,
23
+ 'rush' => PlayRushStatistics,
24
+ 'fumble' => PlayFumbleStatistics,
25
+ 'defense' => PlayDefenseStatistics,
26
+ 'receive' => PlayReceiveStatistics,
27
+ 'punt' => PlayPuntStatistics,
28
+ 'penalty' => PlayPenaltyStatistics,
29
+ 'pass' => PlayPassingStatistics,
30
+ 'first_down' => PlayFirstDownStatistics,
31
+ 'field_goal' => PlayFieldGoalStatistics,
32
+ 'extra_point' => PlayExtraPointStatistics,
33
+ 'down_conversion' => PlayDownConversionStatistics,
34
+ 'conversion' => ConversionStatistics,
35
+ 'block' => BlockStatistics,
36
+ 'misc' => MiscStatistics,
37
+ }.freeze
38
+ end
39
+ end
40
+
41
+ class MiscStatistics < Data
42
+ attr_reader :team, :player, :yards
43
+ def initialize(data)
44
+ @yards = data['yards']
45
+ @team = OpenStruct.new(data['team']) if data['team']
46
+ @player = OpenStruct.new(data['player']) if data['player']
47
+ end
48
+ end
49
+
50
+ class BlockStatistics < Data
51
+ attr_reader :team, :player, :block, :category
52
+ def initialize(data)
53
+ @category = data['category']
54
+ @block = data['block']
55
+ @team = OpenStruct.new(data['team']) if data['team']
56
+ @player = OpenStruct.new(data['player']) if data['player']
57
+ end
58
+ end
59
+
60
+ class PlayDownConversionStatistics < Data
61
+ attr_accessor :attempt, :complete, :down, :nullified, :team
62
+ def initialize(data)
63
+ @attempt = data['attempt']
64
+ @complete = data['complete']
65
+ @down = data['down']
66
+ @team = OpenStruct.new(data['team']) if data['team']
67
+ @nullified = data['nullified']
68
+ end
69
+
70
+ def nullified?
71
+ @nullified.to_s == 'true'
72
+ end
73
+ end
74
+
75
+ class PlayDefenseStatistics < Data
76
+ attr_accessor :ast_tackle, :interception, :int_yards, :nullified, :pass_defended, :primary, :qb_hit, :sack, :sack_yards, :tlost, :tlost_yards, :team, :player, :tackle, :int_touchdown
77
+ def initialize(data)
78
+ @ast_tackle = data['ast_tackle']
79
+ @interception = data['interception']
80
+ @int_yards = data['int_yards']
81
+ @int_touchdown = data['int_touchdown']
82
+ @nullified = data['nullified']
83
+ @pass_defended = data['pass_defended']
84
+ @primary = data['primary']
85
+ @qb_hit = data['qb_hit']
86
+ @sack = data['sack']
87
+ @sack_yards = data['sack_yards']
88
+ @tlost = data['tlost']
89
+ @tlost_yards = data['tlost_yards']
90
+ @tackle = data['tackle']
91
+ @team = OpenStruct.new(data['team']) if data['team']
92
+ @player = OpenStruct.new(data['player']) if data['player']
93
+ @nullified = data['nullified']
94
+ end
95
+
96
+ def nullified?
97
+ @nullified.to_s == 'true'
98
+ end
99
+ end
100
+
101
+ class PlayExtraPointStatistics < Data
102
+ attr_accessor :attempt, :nullified
103
+ def initialize(data)
104
+ @attempt = data['attempt']
105
+ @nullified = data['nullified']
106
+ end
107
+
108
+ def nullified?
109
+ @nullified.to_s == 'true'
110
+ end
111
+ end
112
+
113
+ class PlayFieldGoalStatistics < Data
114
+ attr_accessor :attempt, :att_yards, :missed, :yards, :nullified, :blocked, :team, :player
115
+ def initialize(data)
116
+ @attempt = data['attempt']
117
+ @att_yards = data['att_yards']
118
+ @missed = data['missed']
119
+ @blocked = data['blocked']
120
+ @yards = data['yards']
121
+ @nullified = data['nullified']
122
+ @team = OpenStruct.new(data['team']) if data['team']
123
+ @player = OpenStruct.new(data['player']) if data['player']
124
+ end
125
+
126
+ def nullified?
127
+ @nullified.to_s == 'true'
128
+ end
129
+ end
130
+
131
+ class PlayFirstDownStatistics < Data
132
+ attr_accessor :category, :nullified, :team
133
+ def initialize(data)
134
+ @category = data['category']
135
+ @team = OpenStruct.new(data['team']) if data['team']
136
+ @nullified = data['nullified']
137
+ end
138
+
139
+ def nullified?
140
+ @nullified.to_s == 'true'
141
+ end
142
+ end
143
+
144
+ class PlayPassingStatistics < Data
145
+ attr_accessor :attempt, :att_yards, :complete, :firstdown, :goaltogo, :inside_20, :interception, :sack, :sack_yards, :touchdown, :yards, :nullified, :team, :player
146
+ def initialize(data)
147
+ @attempt = data['attempt']
148
+ @att_yards = data['att_yards']
149
+ @complete = data['complete']
150
+ @firstdown = data['firstdown']
151
+ @goaltogo = data['goaltogo']
152
+ @inside_20 = data['inside_20']
153
+ @interception = data['interception']
154
+ @sack = data['sack']
155
+ @sack_yards = data['sack_yards']
156
+ @touchdown = data['touchdown']
157
+ @yards = data['yards']
158
+ @team = OpenStruct.new(data['team']) if data['team']
159
+ @player = OpenStruct.new(data['player']) if data['player']
160
+ @nullified = data['nullified']
161
+ end
162
+
163
+ def nullified?
164
+ @nullified.to_s == 'true'
165
+ end
166
+ end
167
+
168
+ class PlayPenaltyStatistics < Data
169
+ attr_accessor :penalty, :yards, :nullified, :team, :player
170
+ def initialize(data)
171
+ @penalty = data['penalty'] if data['penalty']
172
+ @yards = data['yards'] if data['yards']
173
+ @team = OpenStruct.new(data['team']) if data['team']
174
+ @player = OpenStruct.new(data['player']) if data['player']
175
+ @nullified = data['nullified']
176
+ end
177
+
178
+ def nullified?
179
+ @nullified.to_s == 'true'
180
+ end
181
+ end
182
+
183
+ class PlayPuntStatistics < Data
184
+ attr_accessor :attempt, :downed, :faircatch, :inside_20, :out_of_bounds, :touchback, :yards, :nullified, :team, :player
185
+ def initialize(data)
186
+ data = data.first if data.is_a?(Array)
187
+ @attempt = data['attempt']
188
+ @downed = data['downed']
189
+ @inside_20 = data['inside_20']
190
+ @out_of_bounds = data['out_of_bounds']
191
+ @touchback = data['touchback']
192
+ @yards = data['yards']
193
+ @team = OpenStruct.new(data['team']) if data['team']
194
+ @player = OpenStruct.new(data['player']) if data['player']
195
+ @nullified = data['nullified']
196
+ end
197
+
198
+ def nullified?
199
+ @nullified.to_s == 'true'
200
+ end
201
+ end
202
+
203
+ class PlayReceiveStatistics < Data
204
+ attr_accessor :firstdown, :goaltogo, :inside_20, :reception, :target, :touchdown, :yards, :yards_after_catch, :nullified, :team, :player
205
+ def initialize(data)
206
+ @firstdown = data['firstdown']
207
+ @goaltogo = data['goaltogo']
208
+ @inside_20 = data['inside_20']
209
+ @reception = data['reception']
210
+ @target = data['target']
211
+ @touchdown = data['touchdown']
212
+ @yards = data['yards']
213
+ @yards_after_catch = data['yards_after_catch']
214
+ @team = OpenStruct.new(data['team']) if data['team']
215
+ @player = OpenStruct.new(data['player']) if data['player']
216
+ @nullified = data['nullified']
217
+ end
218
+
219
+ def nullified?
220
+ @nullified.to_s == 'true'
221
+ end
222
+ end
223
+
224
+ class PlayFumbleStatistics < Data
225
+ attr_reader :own_rec, :own_rec_yards, :forced, :team, :player
226
+ def initialize(data)
227
+ @own_rec = data['own_rec']
228
+ @own_rec_yards = data['own_rec_yards']
229
+ @forced = data['forced']
230
+
231
+ @team = OpenStruct.new(data['team']) if data['team']
232
+ @player = OpenStruct.new(data['player']) if data['player']
233
+ end
234
+ end
235
+
236
+ class PlayRushStatistics < Data
237
+ attr_accessor :attempt, :firstdown, :tlost, :tlost_yards, :yards, :inside_20, :goal_to_go, :team, :player, :nullified, :touchdown
238
+ def initialize(data)
239
+ @attempt = data['attempt']
240
+ @firstdown = data['firstdown']
241
+ @goal_to_go = data['goal_to_go']
242
+ @inside_20 = data['inside_20']
243
+ @tlost = data['tlost']
244
+ @tlost_yards = data['tlost_yards']
245
+ @touchdown = data['touchdown']
246
+ @yards = data['yards']
247
+
248
+ @team = OpenStruct.new(data['team']) if data['team']
249
+ @player = OpenStruct.new(data['player']) if data['player']
250
+ @nullified = data['nullified']
251
+ end
252
+
253
+ def nullified?
254
+ @nullified.to_s == 'true'
255
+ end
256
+ end
257
+
258
+
259
+ class PlayKickStatistics < Data
260
+ attr_accessor :attempt, :yards, :gross_yards, :touchback, :team, :player, :endzone, :inside_20, :nullified
261
+ def initialize(data)
262
+ @endzone = data['endzone']
263
+ @inside_20 = data['inside_20']
264
+ @attempt = data['attempt']
265
+ @yards = data['yards']
266
+ @gross_yards = data['gross_yards']
267
+ @touchback = data['touchback']
268
+ @team = OpenStruct.new(data['team']) if data['team']
269
+ @player = OpenStruct.new(data['player']) if data['player']
270
+ @nullified = data['nullified']
271
+ end
272
+
273
+ def nullified?
274
+ @nullified.to_s == 'true'
275
+ end
276
+ end
277
+
278
+ class ConversionStatistics < Data
279
+ attr_reader :stat_type, :attempt, :complete, :category, :player, :team
280
+ def initialize(data)
281
+ @stat_type = data['stat_type']
282
+ @attempt = data['attempt']
283
+ @complete = data['complete']
284
+ @category = data['category']
285
+ @player = data['player']
286
+ @team = data['team']
287
+ end
288
+ end
289
+
290
+ class PlayReturnStatistics < Data
291
+ attr_accessor :category, :downed, :faircatch, :out_of_bounds, :return, :touchback, :yards, :team, :nullified, :player, :touchdown
292
+ def initialize(data)
293
+ @category = data['category']
294
+ @downed = data['downed']
295
+ @faircatch = data['faircatch']
296
+ @out_of_bounds = data['out_of_bounds']
297
+ @return = data['return']
298
+ @touchback = data['touchback']
299
+ @touchdown = data['touchdown']
300
+ @yards = data['yards']
301
+ @team = OpenStruct.new(data['team']) if data['team']
302
+ @player = OpenStruct.new(data['player']) if data['player']
303
+ @nullified = data['nullified']
304
+ end
305
+
306
+ def nullified?
307
+ @nullified.to_s == 'true'
308
+ end
309
+ end
310
+
311
+ end
312
+ end
313
+ end
@@ -0,0 +1,121 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Player < Data
5
+ attr_accessor :response, :id, :preferred_name, :number, :name_full, :name_first, :name_last, :position, :birth_place, :college, :height, :weight, :averages, :totals, :draft, :depth, :api
6
+
7
+ def initialize(data, **opts)
8
+ @response = data
9
+ @api = opts[:api]
10
+ @team = opts[:team]
11
+
12
+ @id = data["id"]
13
+
14
+ update(data, **opts)
15
+ end
16
+
17
+ def first_name
18
+ @name_first || @first_name
19
+ end
20
+
21
+ def last_name
22
+ @name_last || @last_name
23
+ end
24
+
25
+ def name # to match api for NFL::Player
26
+ name_full
27
+ end
28
+ def display_name
29
+ preferred_name ? "#{preferred_name} #{last_name}" : name_full
30
+ end
31
+
32
+ def birth_date # to match api for NFL::Player
33
+ @birthdate
34
+ end
35
+
36
+ def jersey
37
+ @jersey_number
38
+ end
39
+
40
+ def update(data, **opts)
41
+ @status = data['status'] if data['status']
42
+ @preferred_name = data['preferred_name'] || data['name_preferred'] || @preferred_name
43
+ @name_full = data['name_full'] || data['name'] || @name_full
44
+ @name_first = data['name_first'] || data['first_name'] || @name_first
45
+ @name_last = data['name_last'] || data['last_name'] || @name_last
46
+ @name_abbr = data['name_abbr'] || data['abbr_name'] || @name_abbr
47
+ @height = data['height'] if data['height']
48
+ @weight = data['weight'] if data['weight']
49
+ @position = data['position'] if data['position']
50
+ @primary_position = data['primary_position'] if data['primary_position']
51
+ @jersey_number = data['jersey_number'] || data['jersey'] || @jersey_number
52
+ @experience = data['experience'] if data['experience']
53
+ @birth_place = data['birth_place'].gsub(',,', ', ') if data['birth_place'] # "Benin City,, NGA",
54
+ @updated = data['updated'] if data['updated'] # "2016-07-08T12:11:59+00:00",
55
+
56
+
57
+ @depth = data['depth'] if data['depth']
58
+ @games_started = data['games_started'] if data['games_started']
59
+ @games_played = data['games_played'] if data['games_played']
60
+ # NCAA specific below
61
+
62
+ # update_injuries(data)
63
+ # update_draft(data)
64
+
65
+ if stats = data['statistics']
66
+ @totals = stats
67
+ # binding.pry
68
+ @team.update_player_stats(self, stats.dup, opts[:game])
69
+ else
70
+ @totals = {}
71
+ end
72
+
73
+ self
74
+ end
75
+
76
+ def injured?
77
+ # !!(@injury && @injury.out?)
78
+ end
79
+
80
+ def age
81
+ # if birth_date.present?
82
+ # now = Time.now.utc.to_date
83
+ # dob = birth_date.to_date
84
+ # now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
85
+ # end
86
+ end
87
+
88
+ def update_draft(data)
89
+ # @draft = data['draft'] if data['draft'] # {"team_id"=>"583ec825-fb46-11e1-82cb-f4ce4684ea4c", "year"=>"2012", "round"=>"1", "pick"=>"30"},
90
+ end
91
+ def update_injuries(data)
92
+ # @injury = Injury.new(data['injuries']) if data['injuries']
93
+ # {"injury"=>
94
+ # {"id"=>"06423591-3fc1-4d2b-8c60-a3f30d735345",
95
+ # "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.",
96
+ # "desc"=>"Knee",
97
+ # "status"=>"Out",
98
+ # "start_date"=>"2016-10-25",
99
+ # "update_date"=>"2016-11-09"}}}
100
+ end
101
+
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ __END__
108
+
109
+ ncaafb = Marshal.load(File.binread('ncaafb.bin'));
110
+
111
+ t = ncaafb.teams.first;
112
+ t.get_roster;
113
+ t.players.first
114
+ t.players.first.totals
115
+
116
+ ncaafb = Marshal.load(File.binread('ncaafb.bin'));
117
+ t = ncaafb.teams.sample
118
+ data = t.get_season_stats(2016);
119
+ t.get_roster;
120
+ t.players.sample
121
+ t.players.sample.totals
@@ -0,0 +1,46 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Quarter < Data
5
+ attr_accessor :response, :api, :id, :number, :sequence, :home_points, :away_points, :scoring
6
+
7
+ def initialize(data, **opts)
8
+ @response = data
9
+ @id = data["number"]
10
+ @api = opts[:api]
11
+
12
+ @drives_hash = {}
13
+
14
+ update(data, **opts)
15
+ end
16
+
17
+ def update(data, **opts)
18
+ @number = data["number"]
19
+ @sequence = data["sequence"]
20
+ @home_points = data["home_points"]
21
+ @away_points = data["away_points"]
22
+
23
+ @home_info = data["home"]
24
+ @away_info = data["away"]
25
+
26
+ create_data(@drives_hash, data['pbp'], klass: drive_class, api: api, quarter: self) if data['pbp']
27
+
28
+ self
29
+ end
30
+
31
+ def overtime?
32
+ @number > 4
33
+ end
34
+
35
+ def drives
36
+ @drives_hash.values
37
+ end
38
+
39
+ def drive_class
40
+ Drive
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,48 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Record < Data
5
+ attr_accessor :id, :team, :wins, :losses, :win_pct, :points_for, :points_against, :point_diff, :games_behind, :streak
6
+
7
+ def initialize(data, type: 'overall', **opts)
8
+ @team = opts[:team]
9
+ @type = type
10
+
11
+ update(data, **opts)
12
+ end
13
+
14
+ def update(data, **opts)
15
+ @wins = data['wins']
16
+ @losses = data['losses']
17
+ @win_pct = data['win_pct']
18
+ @points_for = data['points_for']
19
+ @points_against = data['points_against']
20
+ @point_diff = data['point_diff']
21
+ @games_behind = data['games_behind']
22
+ @streak = data['streak']
23
+ end
24
+
25
+ def <=>(other)
26
+ self.win_pct <=> other.win_pct
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ __END__
35
+
36
+ "wins"=>14,
37
+ "losses"=>2,
38
+ "ties"=>0,
39
+ "win_pct"=>0.875,
40
+ "points_for"=>441,
41
+ "points_against"=>250,
42
+ "points_rank"=>4,
43
+ "touchdown_diff"=>24,
44
+ "conf_h2h"=>0,
45
+ "rank"=>{"conference"=>1, "division"=>1},
46
+ "streak"=>{"type"=>"win", "length"=>7, "desc"=>"Won 7"},
47
+ "strength_of_schedule"=>{"sos"=>0.439453, "wins"=>113, "total"=>256},
48
+ "strength_of_victory"=>{"sov"=>0.424, "wins"=>95, "total"=>224},
@@ -0,0 +1,92 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
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 :extended_box
22
+ parse_from_box(data)
23
+ when :pbp
24
+ parse_from_pbp(data)
25
+ when :summary
26
+ parse_from_summary(data)
27
+ when :statistics
28
+ parse_from_statistics(data)
29
+ else
30
+ if data['quarter'] || data['half']
31
+ parse_from_pbp(data)
32
+ elsif data['team']
33
+ parse_from_box(data)
34
+ else # schedule requests
35
+ {}
36
+ end
37
+ end
38
+ @scores.each { |k, v| v.merge!(new_scores.delete(k) || {} ) }
39
+ new_scores.each { |k, v| @scores.merge!(k => v) }
40
+ end
41
+
42
+ def points(team_id)
43
+ @score[team_id].to_i
44
+ end
45
+
46
+
47
+ private
48
+
49
+ def parse_from_box(data)
50
+ # home
51
+ id = data.dig('home_team', 'id')
52
+ da = data.dig('home_team', 'scoring')
53
+ return {} unless da
54
+ home = da.map { |h| [h['quarter'].to_i, { id => h['points'].to_i }] }.to_h
55
+ # away
56
+ id = data.dig('away_team', 'id')
57
+ da = data.dig('away_team', 'scoring')
58
+ return {} unless da
59
+ away = da.map { |h| [h['quarter'].to_i, { id => h['points'].to_i }] }.to_h
60
+
61
+ home.each { |quarter, hash| hash.merge!(away[quarter]) }
62
+ end
63
+
64
+ def parse_from_statistics(data)
65
+ {}
66
+ end
67
+
68
+ def parse_from_pbp(data)
69
+ # period_name = data.key?('quarter') ? 'quarter' : 'half'
70
+ # period_name = 'periods'
71
+ # return {} unless data[period_name] # game hasn't started
72
+ # quarters = data[period_name]#[1..-1]
73
+ # overtimes = data['overtime']
74
+ # overtimes = [overtimes] if !overtimes.is_a?(Array)
75
+ # quarters = quarters[0] if (quarters.is_a?(Array) && (quarters.size == 1) && quarters.first.is_a?(Array))
76
+ # data = (quarters + overtimes).compact.map{|q| q['scoring'] }
77
+ # data.map.with_index(1) { |h, i| [i, { h.dig('home', 'id') => h.dig('home', 'points').to_i, h.dig('away', 'id') => h.dig('away', 'points').to_i }] }.to_h
78
+ {}
79
+ end
80
+
81
+ # def period_name
82
+ # 'quarter'
83
+ # end
84
+
85
+ def parse_from_summary(data)
86
+ {} # nothing for college
87
+ end
88
+
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,32 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Situation < Data
5
+ attr_accessor :response, :clock, :down, :yfd, :possession, :location, :team_id
6
+
7
+ def initialize(data)
8
+ @response = data
9
+ @clock = data["clock"]
10
+ @down = data["down"]
11
+ @yfd = data["yfd"]
12
+ @possession = OpenStruct.new(data["possession"]) if data["possession"]
13
+ if data["location"]
14
+ @location = OpenStruct.new(data["location"])
15
+ elsif data['side'] && data['yard_line']
16
+ @location = OpenStruct.new(alias: data['side'], yardline: data['yard_line'])
17
+ end
18
+ @team_id = possession&.id || data["team"]
19
+ end
20
+
21
+ def spot
22
+ [location&.alias, location&.yardline].compact.join(' ')
23
+ end
24
+
25
+ def down_distance
26
+ [@down, @distance].compact.join(' & ')
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end