sportradar-api 0.9.59 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.env.sample +5 -1
  3. data/Gemfile.lock +4 -4
  4. data/README.md +1 -1
  5. data/lib/sportradar/api.rb +1 -0
  6. data/lib/sportradar/api/basketball.rb +15 -6
  7. data/lib/sportradar/api/basketball/game.rb +285 -0
  8. data/lib/sportradar/api/basketball/injury.rb +6 -6
  9. data/lib/sportradar/api/basketball/nba.rb +22 -25
  10. data/lib/sportradar/api/basketball/nba/conference.rb +1 -1
  11. data/lib/sportradar/api/basketball/nba/division.rb +2 -1
  12. data/lib/sportradar/api/basketball/nba/game.rb +12 -249
  13. data/lib/sportradar/api/basketball/nba/hierarchy.rb +5 -4
  14. data/lib/sportradar/api/basketball/nba/player.rb +8 -8
  15. data/lib/sportradar/api/basketball/nba/quarter.rb +1 -1
  16. data/lib/sportradar/api/basketball/nba/schedule.rb +17 -6
  17. data/lib/sportradar/api/basketball/nba/scoring.rb +15 -95
  18. data/lib/sportradar/api/basketball/nba/season.rb +6 -5
  19. data/lib/sportradar/api/basketball/nba/team.rb +5 -122
  20. data/lib/sportradar/api/basketball/ncaamb.rb +133 -0
  21. data/lib/sportradar/api/basketball/ncaamb/conference.rb +41 -0
  22. data/lib/sportradar/api/basketball/ncaamb/division.rb +42 -0
  23. data/lib/sportradar/api/basketball/ncaamb/game.rb +60 -0
  24. data/lib/sportradar/api/basketball/ncaamb/half.rb +49 -0
  25. data/lib/sportradar/api/basketball/ncaamb/hierarchy.rb +65 -0
  26. data/lib/sportradar/api/basketball/ncaamb/player.rb +162 -0
  27. data/lib/sportradar/api/basketball/ncaamb/schedule.rb +41 -0
  28. data/lib/sportradar/api/basketball/ncaamb/season.rb +42 -0
  29. data/lib/sportradar/api/basketball/ncaamb/team.rb +40 -0
  30. data/lib/sportradar/api/basketball/play.rb +15 -5
  31. data/lib/sportradar/api/basketball/plays.rb +1 -0
  32. data/lib/sportradar/api/basketball/plays/base.rb +30 -6
  33. data/lib/sportradar/api/basketball/plays/deadball.rb +11 -0
  34. data/lib/sportradar/api/basketball/plays/end_period.rb +2 -2
  35. data/lib/sportradar/api/basketball/plays/free_throw_miss.rb +3 -1
  36. data/lib/sportradar/api/basketball/plays/rebound.rb +5 -1
  37. data/lib/sportradar/api/basketball/plays/shot_made.rb +4 -3
  38. data/lib/sportradar/api/basketball/plays/shot_miss.rb +4 -3
  39. data/lib/sportradar/api/basketball/plays/timeout.rb +0 -3
  40. data/lib/sportradar/api/basketball/plays/turnover.rb +1 -1
  41. data/lib/sportradar/api/basketball/record.rb +32 -0
  42. data/lib/sportradar/api/basketball/scoring.rb +103 -0
  43. data/lib/sportradar/api/basketball/team.rb +148 -0
  44. data/lib/sportradar/api/data.rb +2 -0
  45. data/lib/sportradar/api/poll.rb +40 -0
  46. data/lib/sportradar/api/request.rb +15 -6
  47. data/lib/sportradar/api/version.rb +1 -1
  48. metadata +18 -7
  49. data/lib/sportradar/api/basketball/bio.rb +0 -33
  50. data/lib/sportradar/api/basketball/nba/overview.rb +0 -64
  51. data/lib/sportradar/api/basketball/nba/record.rb +0 -34
  52. data/lib/sportradar/api/basketball/overview.rb +0 -74
  53. data/lib/sportradar/api/basketball/profile.rb +0 -48
@@ -12,7 +12,7 @@ module Sportradar
12
12
  @id = data["id"]
13
13
  @name = data["name"]
14
14
  @alias = data["alias"]
15
- @divisions_hash = create_data({}, response["division"], klass: Division, conference: self, api: @api) # if response["division"]
15
+ @divisions_hash = create_data({}, data["divisions"], klass: Division, conference: self, api: @api) # if response["division"]
16
16
  end
17
17
 
18
18
  def divisions
@@ -12,7 +12,8 @@ module Sportradar
12
12
  @id = data["id"]
13
13
  @name = data["name"]
14
14
  @alias = data["alias"]
15
- @teams_hash = create_data({}, response["team"], klass: Team, division: self, api: @api) # if response["team"]
15
+ @assigned_teams = nil
16
+ @teams_hash = create_data({}, data["teams"], klass: Team, division: self, api: @api) # if response["team"]
16
17
  end
17
18
 
18
19
  def teams
@@ -2,264 +2,27 @@ module Sportradar
2
2
  module Api
3
3
  module Basketball
4
4
  class Nba
5
- class Game < Data
6
- attr_accessor :response, :id, :home_id, :away_id, :score, :scoring, :status, :scheduled, :venue, :broadcast, :clock, :duration, :attendance, :quarter, :team_stats, :player_stats, :changes, :media_timeouts
7
- @all_hash = {}
8
- # def self.new(data, **opts)
9
- # existing = @all_hash[data['id']]
10
- # if existing
11
- # existing.update(data, **opts)
12
- # existing
13
- # else
14
- # @all_hash[data['id']] = super
15
- # end
16
- # end
17
- # def self.all
18
- # @all_hash.values
19
- # end
5
+ class Game < Sportradar::Api::Basketball::Game
20
6
 
21
- def initialize(data, **opts)
22
- @response = data
23
- @api = opts[:api]
24
- # @season = opts[:season]
25
- @updates = {}
26
- @changes = {}
27
-
28
- @score = {}
29
- @team_stats = {}
30
- @player_stats = {}
31
- @scoring_raw = Scoring.new(data, game: self)
32
- @teams_hash = {}
33
- @quarters_hash = {}
34
-
35
- @id = data['id']
36
-
37
- update(data, **opts)
38
- end
39
- def timeouts
40
- {}
41
- end
42
-
43
- def overview
44
- Overview.new(self)
45
- end
46
- def tied?
47
- @score[away_id].to_i == @score[home_id].to_i
48
- end
49
- def points(team_id)
50
- team_id.is_a?(Symbol) ? @score[@team_ids[team_id]].to_i : @score[team_id].to_i
51
- end
52
- def stats(team_id)
53
- team_id.is_a?(Symbol) ? @team_stats[@team_ids[team_id]].to_i : @team_stats[team_id].to_i
54
- end
55
-
56
- def scoring
57
- @scoring_raw.scores
58
- end
59
- def update_score(score)
60
- @score.merge!(score)
61
- end
62
- def update_stats(team, stats)
63
- @team_stats.merge!(team.id => stats.merge!(team: team))
64
- end
65
- def update_player_stats(player, stats)
66
- @player_stats.merge!(player.id => stats.merge!(player: player))
67
- end
68
-
69
- def parse_score(data)
70
- update_score(data.dig('home', 'id') => data.dig('home', 'points').to_i)
71
- update_score(data.dig('away', 'id') => data.dig('away', 'points').to_i)
72
- end
73
- def clock_seconds
74
- return unless @clock
75
- m,s = @clock.split(':')
76
- m.to_i * 60 + s.to_i
77
- end
78
-
79
- def update(data, source: nil, **opts)
80
- # via pbp
81
- @status = data['status'] if data['status']
82
- @coverage = data['coverage'] if data['coverage']
83
- @home_id = data['home_team'] if data['home_team'] # GUID
84
- @away_id = data['away_team'] if data['away_team'] # GUID
85
- @home_points = data['home_points'].to_i if data['home_points']
86
- @away_points = data['away_points'].to_i if data['away_points']
87
-
88
- @scheduled = Time.parse(data["scheduled"]) if data["scheduled"]
89
- @venue = Venue.new(data['venue']) if data['venue']
90
- @broadcast = Broadcast.new(data['broadcast']) if data['broadcast']
91
- @home = Team.new(data['home'], api: api, game: self) if data['home']
92
- @away = Team.new(data['away'], api: api, game: self) if data['away']
93
-
94
- @duration = data['duration'] if data['duration']
95
- @clock = data['clock'] if data['clock']
96
- @attendance = data['attendance'] if data['attendance']
97
- @lead_changes = data['lead_changes'] if data['lead_changes']
98
- @times_tied = data['times_tied'] if data['times_tied']
99
-
100
- @team_ids = { home: @home_id, away: @away_id}
101
-
102
- update_score(@home_id => @home_points.to_i) if @home_points
103
- update_score(@away_id => @away_points.to_i) if @away_points
104
- parse_score(data['scoring']) if data['scoring']
105
- @scoring_raw.update(data, source: source)
106
-
107
- create_data(@teams_hash, data['team'], klass: Team, api: api, game: self) if data['team']
108
- end
109
-
110
- def home
111
- @teams_hash[@home_id] || @home
112
- end
113
-
114
- def away
115
- @teams_hash[@away_id] || @away
116
- end
117
-
118
- def box
119
- @box ||= get_box
120
- end
121
- def pbp
122
- if !future? && quarters.empty?
123
- get_pbp
124
- end
125
- @pbp ||= quarters
126
- end
127
- def plays
128
- quarters.flat_map(&:plays)
129
- end
130
- def summary
131
- @summary ||= get_summary
132
- end
133
- alias :events :plays
134
-
135
- def quarters
136
- @quarters_hash.values
137
- end
7
+ # NBA specific
138
8
 
139
-
140
- # tracking updates
141
- def remember(key, object)
142
- @updates[key] = object
143
- end
144
- def not_updated?(key, object)
145
- @updates[key] == object
146
- end
147
- def changed?(key)
148
- @changes[key]
149
- end
150
- def check_newness(key, new_object)
151
- @changes[key] = !not_updated?(key, new_object)
152
- remember(key, new_object)
153
- end
154
-
155
- # url paths
156
- def path_base
157
- "games/#{ id }"
158
- end
159
- def path_box
160
- "#{ path_base }/boxscore"
161
- end
162
- def path_pbp
163
- "#{ path_base }/pbp"
164
- end
165
- def path_summary
166
- "#{ path_base }/summary"
9
+ def team_class
10
+ Team
167
11
  end
168
-
169
- # status helpers
170
- def postponed?
171
- 'postponed' == status
172
- end
173
- def future?
174
- ['scheduled', 'delayed', 'created'].include? status
175
- end
176
- def started?
177
- ['inprogress', 'halftime', 'delayed'].include? status
178
- end
179
- def finished?
180
- ['complete', 'closed'].include? status
181
- end
182
- def completed?
183
- 'complete' == status
184
- end
185
- def closed?
186
- 'closed' == status
187
- end
188
-
189
- # data retrieval
190
- def sync
191
- g.get_pbp
192
- g.get_box
193
- g.get_summary if finished?
12
+ def period_class
13
+ Quarter
194
14
  end
195
15
 
196
- def get_box
197
- api_res = api.get_data(path_box)
198
- data = api_res['game']
199
- ingest_box(data)
200
- end
201
-
202
- def ingest_box(data)
203
- update(data, source: :box)
204
- @quarter = data.delete('quarter').to_i
205
- check_newness(:box, @clock)
206
- data
207
- end
208
-
209
- def get_pbp
210
- api_res = api.get_data(path_pbp)
211
- data = api_res['game']
212
- ingest_pbp(data)
213
- end
214
-
215
- def ingest_pbp(data)
216
- update(data, source: :pbp)
217
- quarter_data = if data['quarter']
218
- @quarter = data['quarter'].first.to_i
219
- quarts = data['quarter'][1..-1]
220
- quarts.is_a?(Array) && (quarts.size == 1) ? quarts[0] : quarts
221
- else
222
- @quarter = nil
223
- []
224
- end
225
- if data['overtime']
226
- extra_quarters = data['overtime'].is_a?(Hash) ? [data['overtime']] : data['overtime']
227
- quarter_data.concat(extra_quarters)
228
- end
229
- set_pbp(quarter_data)
230
- @pbp = @quarters_hash.values
231
- check_newness(:pbp, plays.last)
232
- data
233
- end
234
-
235
- def get_summary
236
- api_res = api.get_data(path_summary)
237
- data = api_res['game']
238
- ingest_summary(data)
239
- end
240
-
241
- def ingest_summary(data)
242
- update(data, source: :summary)
243
- @quarter = data.delete('quarter').to_i
244
- check_newness(:box, @clock)
245
- data
246
- end
247
-
248
- def set_pbp(data)
249
- create_data(@quarters_hash, data, klass: Quarter, api: api, game: self)
250
- @plays = nil # to clear empty array empty
251
- @quarters_hash
16
+ def period_name
17
+ 'quarter'
252
18
  end
19
+ alias :quarter :period
20
+ alias :quarters :periods
253
21
 
254
22
  def api
255
23
  @api || Sportradar::Api::Basketball::Nba.new
256
24
  end
257
25
 
258
-
259
- KEYS_PBP = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "scoring"]
260
-
261
- KEYS_BOX = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "team"]
262
-
263
26
  end
264
27
  end
265
28
  end
@@ -271,8 +34,8 @@ __END__
271
34
  ss = sr.schedule;
272
35
  sd = sr.daily_schedule;
273
36
  sr = Sportradar::Api::Basketball::Nba.new
274
- sd = sr.daily_schedule(Date.yesterday)
275
- sd = sr.daily_schedule(Date.new(2017, 1, 20))
37
+ sd = sr.daily_schedule(Date.yesterday);
38
+ sd = sr.daily_schedule(Date.new(2017, 1, 20));
276
39
  g = sd.games.first;
277
40
  box = g.get_box;
278
41
  pbp = g.get_pbp;
@@ -12,10 +12,11 @@ module Sportradar
12
12
  @response = data
13
13
  @api = opts[:api]
14
14
 
15
- @id = data["id"]
16
- @name = data["name"]
17
- @alias = data["alias"]
18
- @conferences_hash = create_data({}, data['conference'], klass: Conference, hierarchy: self, api: @api)
15
+ @id = data.dig('league', "id")
16
+ @name = data.dig('league', "name")
17
+ @alias = data.dig('league', "alias")
18
+ @season = Season.new(data['season']) if data['season']
19
+ @conferences_hash = create_data({}, data['conferences'], klass: Conference, hierarchy: self, api: @api)
19
20
  end
20
21
  def conferences
21
22
  @conferences_hash.values
@@ -29,10 +29,6 @@ module Sportradar
29
29
  update(data, **opts)
30
30
  end
31
31
 
32
- def bio
33
- Bio.new(self)
34
- end
35
-
36
32
  def name # to match api for NFL::Player
37
33
  full_name
38
34
  end
@@ -59,16 +55,20 @@ module Sportradar
59
55
  @primary_position = data['primary_position'] if data['primary_position'] # "C",
60
56
  @jersey_number = data['jersey_number'] if data['jersey_number'] # "31",
61
57
  @experience = data['experience'] if data['experience'] # "3",
62
- @college = data['college'] if data['college'] # "Vanderbilt",
63
58
  @birth_place = data['birth_place'].gsub(',,', ', ') if data['birth_place'] # "Benin City,, NGA",
64
- @birthdate = data['birthdate'] if data['birthdate'] # "1989-10-21",
65
59
  @updated = data['updated'] if data['updated'] # "2016-07-08T12:11:59+00:00",
60
+
61
+ # NBA specific below
62
+
63
+ @college = data['college'] if data['college'] # "Vanderbilt",
64
+ @birthdate = data['birthdate'] if data['birthdate'] # "1989-10-21",
65
+
66
66
  update_injuries(data)
67
67
  update_draft(data)
68
68
 
69
69
  @team.update_player_stats(self, data['statistics'], opts[:game]) if data['statistics']
70
- if avgs = data.dig('overall', 'average')
71
- @totals = data.dig('overall', 'total')
70
+ if avgs = data['average']
71
+ @totals = data['total']
72
72
  @averages = avgs.except(:player)
73
73
  @team.update_player_stats(self, avgs)
74
74
  end
@@ -32,7 +32,7 @@ module Sportradar
32
32
  update(data)
33
33
  end
34
34
  def update(data, **opts)
35
- create_data(@plays_hash, data.dig('events', 'event'), klass: Play, api: @api, quarter: self)
35
+ create_data(@plays_hash, data.dig('events'), klass: Play, api: @api, quarter: self)
36
36
  # rescue => e
37
37
  # binding.pry
38
38
  end
@@ -3,18 +3,21 @@ module Sportradar
3
3
  module Basketball
4
4
  class Nba
5
5
  class Schedule < Data
6
- attr_accessor :response, :matches
6
+ attr_accessor :response, :id, :name, :alias, :date
7
7
 
8
8
  def initialize(data, **opts)
9
9
  @response = data
10
10
  @api = opts[:api]
11
- @id = response['id']
12
- @name = response['name']
13
- @alias = response['alias']
14
- @date = response.dig('daily_schedule', 'date')
11
+
12
+ # binding.pry
13
+ # ['league']
14
+ @id = data.dig('league', 'id')
15
+ @name = data.dig('league', 'name')
16
+ @alias = data.dig('league', 'alias')
17
+ @date = data.dig('date')
15
18
 
16
19
  @games_hash = {}
17
- update_games(data.dig('daily_schedule', 'games', 'game'))
20
+ update_games(data.dig('games'))
18
21
  end
19
22
 
20
23
  def games
@@ -30,3 +33,11 @@ module Sportradar
30
33
  end
31
34
  end
32
35
  end
36
+
37
+ __END__
38
+
39
+ sr = Sportradar::Api::Basketball::Nba.new
40
+ sd = sr.daily_schedule(Date.new(2017, 1, 21));
41
+ g = sd.games.sample
42
+
43
+ ss = sr.schedule;
@@ -1,95 +1,15 @@
1
- module Sportradar
2
- module Api
3
- module Basketball
4
- class Nba
5
- class Scoring < Data
6
- attr_accessor :response, :api, :id, :home, :away, :scores
7
-
8
- def initialize(data, **opts)
9
- @api = opts[:api]
10
- @game = opts[:game]
11
-
12
- @scores = {}
13
- @id = data['id']
14
-
15
- update(data, **opts)
16
- end
17
-
18
- def update(data, source: nil, **opts)
19
- new_scores = case source
20
- when :box
21
- parse_from_box(data)
22
- when :pbp
23
- parse_from_pbp(data)
24
- when :summary
25
- parse_from_box(data)
26
- else
27
- if data['quarter']
28
- parse_from_pbp(data)
29
- elsif data['team']
30
- parse_from_box(data)
31
- else # schedule requests
32
- {}
33
- end
34
- end
35
- # parse data structure
36
- # handle data from team (all quarters)
37
- # handle data from quarter (both teams)
38
- # handle data from game?
39
- @scores.each { |k, v| v.merge!(new_scores.delete(k) || {} ) }
40
- new_scores.each { |k, v| @scores.merge!(k => v) }
41
- end
42
-
43
- def points(team_id)
44
- @score[team_id].to_i
45
- end
46
-
47
-
48
- private
49
-
50
- def parse_from_box(data)
51
- id = data.dig('team', 0, 'id')
52
- return {} if data.dig('team', 0, 'scoring').is_a?(String) # game hasn't started yet
53
- da = data.dig('team', 0, 'scoring', 'quarter')
54
- da_ot = data.dig('team', 0, 'scoring', 'overtime')
55
- arr = [da].compact.flatten(1)
56
- a = arr + [da_ot].compact.flatten(1)
57
- a.each { |h| h[id] = h.delete('points').to_i }
58
- id = data.dig('team', 1, 'id')
59
- da = data.dig('team', 1, 'scoring', 'quarter')
60
- da_ot = data.dig('team', 1, 'scoring', 'overtime')
61
- arr = [da].compact.flatten(1)
62
- b = arr + [da_ot].compact.flatten(1)
63
- b.each { |h| h[id] = h.delete('points').to_i }
64
- a.zip(b).map{ |a, b| [a['sequence'].to_i, a.merge(b)] }.sort{ |(a,_), (b,_)| a <=> b }.to_h
65
- # rescue => e
66
- # {}
67
- end
68
-
69
- def parse_from_pbp(data)
70
- return {} unless data['quarter'] # game hasn't started
71
- quarters = data['quarter'][1..-1]
72
- overtimes = data['overtime']
73
- overtimes = [overtimes] if !overtimes.is_a?(Array)
74
- quarters = quarters[0] if (quarters.is_a?(Array) && (quarters.size == 1) && quarters.first.is_a?(Array))
75
- data = (quarters + overtimes).compact.map{|q| q['scoring'] }
76
- 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
77
- # rescue => e
78
- # {}
79
- end
80
-
81
- def parse_from_summary(data)
82
- #
83
- end
84
-
85
-
86
-
87
- KEYS_PBP = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "scoring"]
88
-
89
- KEYS_BOX = ["xmlns", "id", "status", "coverage", "home_team", "away_team", "scheduled", "duration", "attendance", "lead_changes", "times_tied", "clock", "quarter", "team"]
90
-
91
- end
92
- end
93
- end
94
- end
95
- end
1
+ # module Sportradar
2
+ # module Api
3
+ # module Basketball
4
+ # class Nba
5
+ # class Scoring < Sportradar::Api::Basketball::Game
6
+
7
+ # private def period_name
8
+ # 'quarter'
9
+ # end
10
+
11
+ # end
12
+ # end
13
+ # end
14
+ # end
15
+ # end