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,273 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Ncaafb < Data
5
+ attr_accessor :response, :id, :name, :alias, :type
6
+ def all_attributes
7
+ [:name, :alias, :leagues, :divisions, :teams]
8
+ end
9
+
10
+ def initialize(data = {}, **opts)
11
+ # @response = data
12
+ @api = opts[:api]
13
+ @id = data['id']
14
+ @season = opts[:year]
15
+ @type = opts[:type]
16
+
17
+ @divisions_hash = {}
18
+ @weeks_hash = {}
19
+ @games_hash = {}
20
+ @teams_hash = {}
21
+
22
+ end
23
+
24
+ def update(data, source: nil, **opts)
25
+ # update stuff
26
+ @id = data['id'] if data['id']
27
+ @season = data['season'] if data['season']
28
+ @type = data['type'] if data['type']
29
+ # @name = data.dig('league', 'name') if data.dig('league', 'name')
30
+ # @alias = data.dig('league', 'alias') if data.dig('league', 'alias')
31
+
32
+ # @year = data.dig('season', 'year') if data.dig('season', 'year')
33
+ # @type = data.dig('season', 'type') if data.dig('season', 'type')
34
+
35
+ create_data(@divisions_hash, data['divisions'], klass: Division, hierarchy: self, api: api) if data['divisions']
36
+ create_data(@teams_hash, data['teams'], klass: Team, hierarchy: self, api: api) if data['teams']
37
+
38
+ if data['weeks']
39
+ create_data(@weeks_hash, data['weeks'], klass: Week, hierarchy: self, api: @api)
40
+ end
41
+
42
+ if data['games']
43
+ if data['games'].first.keys == ['game']
44
+ data['games'].map! { |hash| hash['game'] }
45
+ end
46
+ @games_hash = create_data(@games_hash, data['games'], klass: Game, hierarchy: self, api: api)
47
+ end
48
+ end
49
+ def weeks
50
+ @weeks_hash.values
51
+ end
52
+ def divisions
53
+ @divisions_hash.values
54
+ end
55
+ def division(code_name)
56
+ divisions_by_name[code_name]
57
+ end
58
+ private def divisions_by_name
59
+ @divisions_by_name ||= divisions.map { |d| [d.id, d] }.to_h
60
+ end
61
+ def conferences
62
+ divisions.flat_map(&:conferences)
63
+ end
64
+
65
+ def schedule
66
+ get_schedule if games.empty?
67
+ self
68
+ end
69
+
70
+ def standings
71
+ get_standings if divisions.empty? || teams.first&.record.nil?
72
+ self
73
+ end
74
+
75
+ def hierarchy
76
+ get_hierarchy if divisions.empty?
77
+ self
78
+ end
79
+
80
+ def games
81
+ get_schedule if @weeks_hash.empty?
82
+ weeks.flat_map(&:games)
83
+ end
84
+ def teams
85
+ teams = conferences.flat_map(&:teams)
86
+ if teams.empty?
87
+ if @teams_hash.empty?
88
+ get_hierarchy
89
+ conferences.flat_map(&:teams)
90
+ else
91
+ @teams_hash.values
92
+ end
93
+ else
94
+ teams
95
+ end
96
+ end
97
+ def team(team_id)
98
+ teams.detect { |team| team.id == team_id }
99
+ end
100
+
101
+ # api stuff
102
+ def api
103
+ @api || Sportradar::Api::Football::Ncaafb::Api.new
104
+ end
105
+
106
+ def default_year
107
+ (Date.today - 60).year
108
+ end
109
+ def default_date
110
+ Date.today
111
+ end
112
+ def default_season
113
+ 'reg'
114
+ end
115
+ def season_year
116
+ @season || default_year
117
+ end
118
+ alias :year :season_year
119
+ def ncaafb_season
120
+ @type || default_season
121
+ end
122
+ alias :season :ncaafb_season
123
+
124
+
125
+ # url paths
126
+ def path_base
127
+ "league"
128
+ end
129
+ def path_hierarchy(division = 'FBS')
130
+ "teams/#{division}/hierarchy"
131
+ end
132
+ def path_schedule
133
+ "#{season_year}/#{ncaafb_season}/schedule"
134
+ end
135
+ def path_weekly_schedule(ncaafb_season_week)
136
+ "#{season_year}/#{ncaafb_season}/#{ncaafb_season_week}/schedule"
137
+ end
138
+ def path_rankings(ncaafb_season_week, poll_name = 'AP25')
139
+ "polls/#{poll_name}/#{season_year}/#{ncaafb_season_week}/rankings"
140
+ end
141
+ def path_standings(division = 'FBS')
142
+ "teams/#{division}/#{season_year}/#{ncaafb_season}/standings"
143
+ end
144
+
145
+ # data retrieval
146
+
147
+ ## schedule
148
+ def get_schedule
149
+ data = api.get_data(path_schedule).to_h
150
+ ingest_schedule(data)
151
+ end
152
+
153
+ def ingest_schedule(data)
154
+ update(data, source: :weeks)
155
+ data
156
+ end
157
+
158
+ def queue_schedule
159
+ url, headers, options, timeout = api.get_request_info(path_schedule)
160
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_schedule)}
161
+ end
162
+
163
+ ## weekly schedule
164
+ def get_weekly_schedule(ncaafb_season_week = 1)
165
+ data = api.get_data(path_weekly_schedule(ncaafb_season_week)).to_h
166
+ ingest_weekly_schedule(data)
167
+ end
168
+
169
+ def ingest_weekly_schedule(data)
170
+ # update(data, source: :weeks)
171
+ create_data(@weeks_hash, data, klass: Week, hierarchy: self, api: api)
172
+ data
173
+ end
174
+
175
+ def queue_weekly_schedule(ncaafb_season_week = 1)
176
+ url, headers, options, timeout = api.get_request_info(path_weekly_schedule(ncaafb_season_week))
177
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_weekly_schedule)}
178
+ end
179
+
180
+ ## hierarchy
181
+ def get_hierarchy(division = 'FBS')
182
+ data = api.get_data(path_hierarchy(division)).to_h
183
+ ingest_hierarchy(data)
184
+ end
185
+
186
+ def ingest_hierarchy(data)
187
+ create_data(@divisions_hash, data, klass: Division, hierarchy: self, api: api)
188
+ data
189
+ end
190
+
191
+ def queue_hierarchy
192
+ url, headers, options, timeout = api.get_request_info(path_hierarchy)
193
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_hierarchy)}
194
+ end
195
+
196
+ ## depth_charts
197
+ def get_depth_charts
198
+ data = api.get_data(path_depth_charts).to_h
199
+ ingest_depth_charts(data)
200
+ end
201
+
202
+ def ingest_depth_charts(data)
203
+ update(data, source: :teams)
204
+ data
205
+ end
206
+
207
+ def queue_depth_charts
208
+ url, headers, options, timeout = api.get_request_info(path_depth_charts)
209
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_depth_charts)}
210
+ end
211
+
212
+ ## standings
213
+ def get_standings
214
+ data = api.get_data(path_standings).to_h
215
+ ingest_standings(data)
216
+ end
217
+
218
+ def ingest_standings(data)
219
+ update(data, source: :teams)
220
+ data
221
+ end
222
+
223
+ def queue_standings
224
+ url, headers, options, timeout = api.get_request_info(path_standings)
225
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_standings)}
226
+ end
227
+
228
+ ## statistics
229
+
230
+ ## venues
231
+ # def get_venues
232
+ # data = api.get_data(path_venues).to_h
233
+ # ingest_venues(data)
234
+ # end
235
+
236
+ # def ingest_venues(data)
237
+ # update(data, source: :teams)
238
+ # data
239
+ # end
240
+
241
+ # def queue_venues
242
+ # url, headers, options, timeout = api.get_request_info(path_venues)
243
+ # {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_venues)}
244
+ # end
245
+
246
+ def self.sim_api
247
+ Sportradar::Api::Football::Ncaafb::Api.new.sim!
248
+ end
249
+ def self.simulation
250
+ new({}, api: sim_api, year: 2015, type: 'reg')
251
+ end
252
+ def self.simulations
253
+ api = sim_api
254
+ ['2015/REG/1/WKY/MSH', '2015/REG/1/KEN/FLA', '2015/REG/1/WOU/PRST'].map do |game_uri|
255
+ Game.new({'id' => game_uri}).sim!
256
+ end
257
+ end
258
+
259
+ end
260
+ end
261
+ end
262
+ end
263
+
264
+ __END__
265
+
266
+
267
+
268
+ ncaafb = Sportradar::Api::Football::Ncaafb.new
269
+ ncaafb = Sportradar::Api::Football::Ncaafb.new(year: 2016)
270
+ gg = ncaafb.games;
271
+ tt = ncaafb.teams;
272
+ File.binwrite('ncaafb.bin', Marshal.dump(ncaafb))
273
+ ncaafb = Marshal.load(File.binread('ncaafb.bin'));
@@ -0,0 +1,76 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Api < Request
6
+ attr_accessor :league, :access_level, :error
7
+
8
+ def initialize(access_level = default_access_level)
9
+ @league = 'nfl'
10
+ raise ::Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level
11
+ @access_level = access_level
12
+ end
13
+
14
+ def default_year
15
+ default_date.year
16
+ end
17
+ def default_date
18
+ Date.today - 90
19
+ end
20
+ def default_season
21
+ 'reg'
22
+ end
23
+ def default_access_level
24
+ if (ENV['SPORTRADAR_ENV'] || ENV['SPORTRADAR_ENV_NFL'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']) == 'production'
25
+ 'o'
26
+ else
27
+ 'ot'
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def content_format
34
+ 'json'
35
+ end
36
+
37
+ def request_url(path)
38
+ "/nfl-#{access_level}#{version}/#{path}"
39
+ end
40
+
41
+ def api_key
42
+ if !['ot', 'sim'].include?(access_level) || (default_access_level == 'o' && access_level == 'sim')
43
+ ::Sportradar::Api.api_key_params('nfl', 'production')
44
+ else
45
+ ::Sportradar::Api.api_key_params('nfl')
46
+ end
47
+ end
48
+
49
+ def version
50
+ ::Sportradar::Api.version('nfl')
51
+ end
52
+
53
+ def allowed_access_levels
54
+ %w[rt o p s b t ot sim]
55
+ end
56
+
57
+ def allowed_seasons
58
+ ["pre", "reg", "pst"]
59
+ end
60
+ end
61
+
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ __END__
68
+
69
+ nfl = Sportradar::Api::Football.Nfl.new
70
+ sw = nfl.weekly_schedule;
71
+ ss = nfl.schedule;
72
+
73
+ ss.games.count
74
+ ss.weeks.count
75
+ ss.weeks.first.response['game'].count
76
+
@@ -0,0 +1,35 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Conference < Data
6
+ attr_accessor :response, :id, :name, :alias
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = data["id"]
13
+ @divisions_hash = {}
14
+
15
+ update(data, **opts)
16
+ end
17
+
18
+ def update(data, **opts)
19
+ @name = data["name"] if data["name"]
20
+ @alias = data["alias"] if data["alias"]
21
+ create_data(@divisions_hash, data["divisions"], klass: Division, conference: self, api: @api)
22
+
23
+ self
24
+ end
25
+
26
+ def divisions
27
+ @divisions_hash.values
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,53 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class DepthChart < Data
6
+ include Enumerable
7
+ attr_accessor :response, :chart
8
+
9
+ def initialize(data)
10
+ generate_chart(data)
11
+ end
12
+
13
+ def team(number)
14
+ teams[number]
15
+ end
16
+
17
+ def each
18
+ populate_teams
19
+ teams.each { |team| yield team }
20
+ end
21
+
22
+ private
23
+
24
+ def teams
25
+ @teams ||= populate_teams
26
+ end
27
+
28
+ def populate_teams
29
+ (1..3).each_with_object({}) do |i, hash|
30
+ hash[i] = generate_team(i)
31
+ end
32
+ end
33
+
34
+ def generate_team(number)
35
+ @chart.each_with_object({}) do |(pos_name, groups), memo|
36
+ memo[pos_name] = groups[number]
37
+ end
38
+ end
39
+
40
+ def generate_chart(data)
41
+ @chart = data.each_with_object({}) do |hash, memo|
42
+ position = hash['position']
43
+ players = position['players'].map { |h| Sportradar::Api::Football::Nfl::Player.new(h) }
44
+ memo[position['name']] = players.group_by(&:depth)
45
+ # binding.pry
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,37 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Division < Data
6
+ attr_accessor :response, :id, :name, :alias
7
+
8
+ def initialize(data, **opts)
9
+ @response = data
10
+ @api = opts[:api]
11
+
12
+ @id = data["id"]
13
+ @teams_hash = {}
14
+
15
+ update(data, **opts)
16
+ end
17
+
18
+ def update(data, **opts)
19
+ @name = data["name"]
20
+ @alias = data["alias"]
21
+ create_data(@teams_hash, data["teams"], klass: Team, division: self, api: @api)
22
+
23
+ self
24
+ end
25
+
26
+ def teams
27
+ @assigned_teams || @teams_hash.values
28
+ end
29
+ def teams=(array)
30
+ @assigned_teams = array
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,19 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Drive < Sportradar::Api::Football::Drive
6
+
7
+ def handle_plays_and_events(data, **opts)
8
+ things = (Array(data['events']) + Array(data['actions'])).group_by { |hash| hash['type'] }
9
+
10
+ create_data(@plays_hash, things['play'], klass: Play, api: api, drive: self) if things['play']
11
+ create_data(@events_hash, things['event'], klass: Event, api: api, drive: self) if things['setup']
12
+ create_data(@events_hash, things['event'], klass: Event, api: api, drive: self) if things['event']
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Event < Sportradar::Api::Football::Event
6
+
7
+ def self.new(data, **opts)
8
+ if data['type'] == 'play'
9
+ Play.new(data, **opts)
10
+ else
11
+ super(data, **opts)
12
+ end
13
+ end
14
+
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,77 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Game < Sportradar::Api::Football::Game
6
+
7
+
8
+ def update_teams(data)
9
+ if data['summary']
10
+ @home.update(data.dig('summary', 'home'), game: self)
11
+ @away.update(data.dig('summary', 'away'), game: self)
12
+ else
13
+ @home.update(data['home'], api: api, game: self) if data['home'].is_a?(Hash)
14
+ @away.update(data['away'], api: api, game: self) if data['away'].is_a?(Hash)
15
+ @home_alias = data['home'] if data['home'].is_a?(String) # this might actually be team ID and not alias. check in NFL
16
+ @away_alias = data['away'] if data['away'].is_a?(String) # this might actually be team ID and not alias. check in NFL
17
+ end
18
+ end
19
+
20
+
21
+ def path_base
22
+ "games/#{ id }"
23
+ end
24
+
25
+ def team_class
26
+ Team
27
+ end
28
+ def period_class
29
+ Quarter
30
+ end
31
+
32
+ def period_key
33
+ 'periods'
34
+ end
35
+
36
+ def quarter_class
37
+ Sportradar::Api::Football::Nfl::Quarter
38
+ end
39
+
40
+
41
+ def api
42
+ @api || Sportradar::Api::Football::Nfl::Api.new
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ __END__
52
+
53
+
54
+ nfl = Sportradar::Api::Football::Nfl.new
55
+ nfl = Sportradar::Api::Football::Nfl.new(year: 2016)
56
+ gg = nfl.games;
57
+ tt = nfl.teams;
58
+ File.binwrite('nfl.bin', Marshal.dump(nfl))
59
+ nfl = Marshal.load(File.binread('nfl.bin'));
60
+ g1 = nfl.games.sample;
61
+ g = gg.first;
62
+ g = gg.sample;
63
+ g.week_number
64
+ g.year
65
+ g.type
66
+ g.path_pbp
67
+ res = g.get_pbp;
68
+
69
+ nfl = Marshal.load(File.binread('nfl.bin'));
70
+ g = nfl.games.first;
71
+ res = g.get_pbp;
72
+ g.quarters.first.drives[1]
73
+
74
+ g = gg.detect{|g| g.id == "" } # overtime game
75
+
76
+ stats = %i[defense extra_points field_goals fumbles int_returns kickoffs misc_returns passing penalties punt_returns punts receiving rushing]
77
+ stats.all? { |st| g.stats(:home).send(st) }
@@ -0,0 +1,41 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class LeagueDepthChart < Data
6
+ include Enumerable
7
+ attr_accessor :response, :week_number, :charts
8
+
9
+ def initialize(data, **opts)
10
+ @response = data
11
+ @charts_hash = {}
12
+
13
+ update(data, **opts)
14
+ end
15
+
16
+ def update(data, **opts)
17
+ @week = data['week']
18
+ @week_number = data.dig('week', 'sequence')
19
+ create_data(@charts_hash, data["teams"], klass: TeamDepthChart, api: opts[:api])
20
+
21
+ self
22
+ end
23
+
24
+ def charts
25
+ @charts_hash.values
26
+ end
27
+
28
+ # id is preferred search, but we allow for team abbreviation too
29
+ def team(id = nil, abbrev: nil)
30
+ charts.detect { |chart| chart.team_id == id || chart.abbrev == abbrev }
31
+ end
32
+
33
+ def each
34
+ self.charts.each { |chart| yield chart }
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Play < Sportradar::Api::Football::Play
6
+
7
+ def down
8
+ start_situation.down
9
+ end
10
+
11
+ def yfd
12
+ start_situation.yfd
13
+ end
14
+ # def parse_player
15
+ # # TODO: Currently there is an issue where we are only mapping one player_id to a play, but there are plays with multiple players involved.
16
+ # play_stats = @statistics.penalty || @statistics.rush || @statistics.return || @statistics.receive
17
+ # if play_stats.is_a?(Array)
18
+ # play_stats = play_stats.first
19
+ # end
20
+ # @player_id = play_stats&.player&.id
21
+ # end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ module Sportradar
2
+ module Api
3
+ module Football
4
+ class Nfl
5
+ class Player < Sportradar::Api::Football::Player
6
+
7
+ def api
8
+ @api || Sportradar::Api::Football::Nfl::Api.new
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ __END__
18
+
19
+ nfl = Marshal.load(File.binread('nfl.bin'));
20
+
21
+ t = nfl.teams.first;
22
+ t.get_roster;
23
+ t.players.first
24
+ t.players.first.totals
25
+
26
+ nfl = Marshal.load(File.binread('nfl.bin'));
27
+ t = nfl.teams.sample
28
+ data = t.get_season_stats(2016);
29
+ t.get_roster;
30
+ t.players.sample
31
+ t.players.sample.totals