sportradar-api 0.12.3 → 0.13.0

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +3 -3
  5. data/lib/sportradar/api/baseball/game.rb +6 -2
  6. data/lib/sportradar/api/baseball/mlb.rb +1 -1
  7. data/lib/sportradar/api/baseball/pitch.rb +5 -0
  8. data/lib/sportradar/api/basketball/game.rb +14 -2
  9. data/lib/sportradar/api/basketball/nba/player.rb +2 -2
  10. data/lib/sportradar/api/basketball/nba.rb +1 -1
  11. data/lib/sportradar/api/basketball/plays/base.rb +1 -1
  12. data/lib/sportradar/api/data.rb +2 -1
  13. data/lib/sportradar/api/error.rb +1 -1
  14. data/lib/sportradar/api/images.rb +1 -1
  15. data/lib/sportradar/api/request.rb +22 -1
  16. data/lib/sportradar/api/soccer/api.rb +66 -0
  17. data/lib/sportradar/api/soccer/event.rb +45 -0
  18. data/lib/sportradar/api/soccer/fact.rb +56 -53
  19. data/lib/sportradar/api/soccer/group.rb +70 -0
  20. data/lib/sportradar/api/soccer/lineup.rb +31 -0
  21. data/lib/sportradar/api/soccer/match.rb +224 -44
  22. data/lib/sportradar/api/soccer/player.rb +54 -67
  23. data/lib/sportradar/api/soccer/season.rb +58 -7
  24. data/lib/sportradar/api/soccer/standing.rb +43 -6
  25. data/lib/sportradar/api/soccer/team.rb +155 -53
  26. data/lib/sportradar/api/soccer/team_group.rb +57 -0
  27. data/lib/sportradar/api/soccer/tournament.rb +302 -14
  28. data/lib/sportradar/api/soccer/venue.rb +14 -13
  29. data/lib/sportradar/api/{soccer → soccer-old}/boxscore.rb +0 -0
  30. data/lib/sportradar/api/{soccer → soccer-old}/category.rb +0 -0
  31. data/lib/sportradar/api/soccer-old/fact.rb +61 -0
  32. data/lib/sportradar/api/{soccer → soccer-old}/hierarchy.rb +0 -0
  33. data/lib/sportradar/api/soccer-old/match.rb +55 -0
  34. data/lib/sportradar/api/soccer-old/player.rb +88 -0
  35. data/lib/sportradar/api/{soccer → soccer-old}/ranking.rb +0 -0
  36. data/lib/sportradar/api/{soccer → soccer-old}/schedule.rb +0 -0
  37. data/lib/sportradar/api/soccer-old/season.rb +14 -0
  38. data/lib/sportradar/api/soccer-old/standing.rb +13 -0
  39. data/lib/sportradar/api/{soccer → soccer-old}/statistic.rb +0 -0
  40. data/lib/sportradar/api/{soccer → soccer-old}/summary.rb +0 -0
  41. data/lib/sportradar/api/soccer-old/team.rb +63 -0
  42. data/lib/sportradar/api/soccer-old/tournament.rb +20 -0
  43. data/lib/sportradar/api/{soccer → soccer-old}/tournament_group.rb +0 -0
  44. data/lib/sportradar/api/soccer-old/venue.rb +21 -0
  45. data/lib/sportradar/api/soccer-old.rb +158 -0
  46. data/lib/sportradar/api/soccer.rb +18 -152
  47. data/lib/sportradar/api/version.rb +1 -1
  48. data/lib/sportradar/api.rb +17 -18
  49. data/soccer-old/boxscore_test.rb +14 -0
  50. data/soccer-old/hierarchy_test.rb +14 -0
  51. data/soccer-old/match_test.rb +23 -0
  52. data/soccer-old/player_test.rb +40 -0
  53. data/soccer-old/ranking_test.rb +16 -0
  54. data/soccer-old/schedule_test.rb +24 -0
  55. data/soccer-old/standing_test.rb +14 -0
  56. data/soccer-old/summary_test.rb +14 -0
  57. data/soccer-old/team_test.rb +21 -0
  58. data/soccer-old_test.rb +184 -0
  59. metadata +34 -10
@@ -1,55 +1,235 @@
1
1
  module Sportradar
2
2
  module Api
3
- class Soccer::Match < Data
4
-
5
- attr_accessor :id, :status, :scheduled, :scratched, :season_id, :reference_id, :category, :tournament_group, :tournament, :home, :away, :venue, :round, :coverage, :period, :clock, :referee, :facts, :response, :future_game, :winner
6
-
7
- def initialize(data)
8
- @response = data
9
- @id = data["id"]
10
- @reference_id = data["reference_id"]
11
- @scheduled = Time.parse(data["scheduled"]) if data["scheduled"]
12
- @scratched = data["scratched"] == "true"
13
- @season_id = data["season_id"]
14
- @status = data["status"]
15
- @category = Sportradar::Api::Soccer::Category.new data["category"] if data["category"]
16
- @coverage = OpenStruct.new data["coverage"]
17
- @round = OpenStruct.new data["round"]
18
- @tournament = Sportradar::Api::Soccer::Tournament.new data["tournament"] if data["tournament"]
19
- @tournament_group = Sportradar::Api::Soccer::TournamentGroup.new data["tournament_group"] if data["tournament_group"]
20
-
21
- @away = Sportradar::Api::Soccer::Team.new data["away"] if data["away"]
22
- @home = Sportradar::Api::Soccer::Team.new data["home"] if data["home"]
23
- @venue = Sportradar::Api::Soccer::Venue.new data["venue"] if data["venue"]
24
-
25
- @future_game = @scheduled > Time.now.utc
26
- @winner = find_winner if @home && @away && !future_game
27
-
28
- # Actual stats from match summary
29
- @period = data["period"]
30
- @clock = data["clock"]
31
- @referee = OpenStruct.new data["referee"] if data["referee"]
32
- @facts = data["facts"]["fact"].map {|fact| Sportradar::Api::Soccer::Fact.new fact } if data["facts"]
33
- end
3
+ module Soccer
4
+ class Match < Data
5
+ attr_reader :id, :league_group, :scheduled, :start_time_tbd, :status, :tournament_round, :match_status, :venue
6
+ attr_reader :home_score, :away_score, :winner_id, :aggregate_home_score, :aggregate_away_score, :aggregate_winner_id
7
+ attr_reader :referee, :weather_info, :coverage_info, :probabilities
8
+ attr_reader :home, :away, :tournament_id
9
+
10
+ def initialize(data = {}, league_group: nil, **opts)
11
+ @response = data
12
+ @id = data['id']
13
+ @api = opts[:api]
14
+
15
+ @league_group = league_group || data['league_group'] || @api&.league_group
16
+
17
+ @timeline_hash = {}
18
+ @lineups_hash = {}
19
+ get_tournament_id(data, **opts)
20
+ @home = Team.new({}, api: api, match: self)
21
+ @away = Team.new({}, api: api, match: self)
22
+ @teams_hash = { away: @away, home: @home }
34
23
 
35
- def find_winner
36
- if @home.winner == 'draw'
37
- 'draw'
38
- else
39
- [@home, @away].find {|team| team.winner == "true" }
24
+ update(data, **opts)
40
25
  end
41
26
 
42
- end
27
+ def update(data, **opts)
28
+ @league_group = opts[:league_group] || data['league_group'] || @league_group
29
+ get_tournament_id(data, **opts)
30
+ if data["sport_event"]
31
+ update(data["sport_event"])
32
+ end
33
+ if data["sport_event_status"]
34
+ update(data["sport_event_status"])
35
+ end
36
+ if data['sport_event_conditions']
37
+ update(data['sport_event_conditions'])
38
+ end
39
+ if data['probabilities']
40
+ # update(data['probabilities'])
41
+ @probabilities = data['probabilities'] # tidy this up later
42
+ end
43
+ if data['lineups']
44
+ create_data(@lineups_hash, data['lineups'], klass: Lineup, identifier: 'team', api: api)
45
+ end
46
+ if (stats = data.dig('statistics', 'teams'))
47
+ update_teams(stats)
48
+ end
43
49
 
44
- def period_name
45
- period_names = {"P1" => "Period one", "H" => "Halftime", "P2" => "Period two", "PX1" => "Pre-extra time one", "X1" => "Extra time one", "PX2" => "Pre-extra time two", "X2" => "Extra time two", "PP" => "Pre-penalty", "P" => "Penalty"}
46
- period_names[period] if period
47
- end
48
50
 
49
- def status_description
50
- status_descriptions = {"scheduled" => "The match is scheduled to be played", "inprogress" => "The match is currently in progress", "postponed" => "The match has been postponed to a future date", "delayed" => "The match has been temporarily delayed and will be continued", "canceled" => "The match has been canceled and will not be played", "closed" => "The match is over"}
51
- status_descriptions[status] if status
51
+ @scheduled = Time.parse(data['scheduled']) if data['scheduled']
52
+ @start_time_tbd = data['start_time_tbd'] if data.key?('start_time_tbd')
53
+ @status = data['status'] if data['status']
54
+ @match_status = data['match_status'] if data['match_status']
55
+ @tournament_round = data['tournament_round'] if data['tournament_round']
56
+ @venue = Venue.new(data['venue']) if data['venue']
57
+ @weather_info = OpenStruct.new(data["weather_info"]) if data["weather_info"]
58
+ @referee = OpenStruct.new(data["referee"]) if data["referee"]
59
+ @coverage_info = OpenStruct.new(data["coverage_info"]) if data["coverage_info"]
60
+
61
+ @home_score = data['home_score'] if data['home_score']
62
+ @away_score = data['away_score'] if data['away_score']
63
+ @winner_id = data['winner_id'] if data['winner_id']
64
+
65
+ @aggregate_home_score = data['aggregate_home_score'] if data['aggregate_home_score']
66
+ @aggregate_away_score = data['aggregate_away_score'] if data['aggregate_away_score']
67
+ @aggregate_winner_id = data['aggregate_winner_id'] if data['aggregate_winner_id']
68
+ create_data(@timeline_hash, data['timeline'], klass: Event, api: api)
69
+ # @season
70
+ # @tournament
71
+ if data['competitors']
72
+ update_teams(data['competitors'])
73
+ end
74
+
75
+ # parse_nested_data(data)
76
+ end
77
+
78
+ def update_teams(data)
79
+ home_hash = data.detect { |team_hash| team_hash["qualifier"] == "home" || team_hash["team"] == "home" }
80
+ away_hash = (data - [home_hash]).first
81
+ if home_hash && away_hash
82
+ @home.update(home_hash, match: self)
83
+ @away.update(away_hash, match: self)
84
+ @teams_hash[@home.id] = @home
85
+ @teams_hash[@away.id] = @away
86
+ end
87
+ end
88
+
89
+ def get_tournament_id(data, **opts)
90
+ @tournament_id ||= if opts[:tournament]
91
+ opts[:tournament].id
92
+ elsif opts[:season]
93
+ opts[:season].tournament_id
94
+ elsif opts[:match]
95
+ opts[:match].tournament_id
96
+ elsif data['tournament']
97
+ data.dig('tournament', 'id')
98
+ elsif data['season']
99
+ data.dig('season', 'tournament_id')
100
+ end
101
+ end
102
+
103
+ def team(place_or_id)
104
+ @teams_hash[place_or_id]
105
+ end
106
+
107
+ def timeline(type = nil)
108
+ if type
109
+ @timeline_hash.each_value.select { |ev| ev.type == type }
110
+ else
111
+ @timeline_hash.values
112
+ end
113
+ end
114
+
115
+ def lineups(which = nil)
116
+ if which
117
+ @lineups_hash[which.to_s]
118
+ else
119
+ @lineups_hash.values
120
+ end
121
+ end
122
+
123
+ def api
124
+ @api ||= Sportradar::Api::Soccer::Api.new(league_group: @league_group)
125
+ end
126
+
127
+ def path_base
128
+ "matches/#{ id }"
129
+ end
130
+
131
+ def path_summary
132
+ "#{ path_base }/summary"
133
+ end
134
+ def get_summary
135
+ data = api.get_data(path_summary).to_h
136
+ ingest_summary(data)
137
+ end
138
+ def ingest_summary(data)
139
+ update(data)
140
+ data
141
+ end
142
+ def queue_summary
143
+ url, headers, options, timeout = api.get_request_info(path_summary)
144
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_summary)}
145
+ end
146
+
147
+ def path_lineups
148
+ "#{ path_base }/lineups"
149
+ end
150
+ def get_lineups
151
+ data = api.get_data(path_lineups).to_h
152
+ ingest_lineups(data)
153
+ end
154
+ def ingest_lineups(data)
155
+ update(data)
156
+ data
157
+ end
158
+ def queue_lineups
159
+ url, headers, options, timeout = api.get_request_info(path_lineups)
160
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_lineups)}
161
+ end
162
+
163
+ def path_facts
164
+ "#{ path_base }/funfacts"
165
+ end
166
+ def get_facts
167
+ data = api.get_data(path_facts).to_h
168
+ ingest_facts(data)
169
+ end
170
+ def ingest_facts(data)
171
+ update(data)
172
+ data
173
+ end
174
+ def queue_facts
175
+ url, headers, options, timeout = api.get_request_info(path_facts)
176
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_facts)}
177
+ end
178
+
179
+ def path_probabilities
180
+ "#{ path_base }/probabilities"
181
+ end
182
+ def get_probabilities
183
+ data = api.get_data(path_probabilities).to_h
184
+ ingest_probabilities(data)
185
+ end
186
+ def ingest_probabilities(data)
187
+ update(data)
188
+ data
189
+ end
190
+ def queue_probabilities
191
+ url, headers, options, timeout = api.get_request_info(path_probabilities)
192
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_probabilities)}
193
+ end
194
+
195
+ def path_timeline
196
+ "#{ path_base }/timeline"
197
+ end
198
+ def get_timeline
199
+ data = api.get_data(path_timeline).to_h
200
+ ingest_timeline(data)
201
+ end
202
+ def ingest_timeline(data)
203
+ update(data)
204
+ data
205
+ end
206
+ def queue_timeline
207
+ url, headers, options, timeout = api.get_request_info(path_timeline)
208
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_timeline)}
209
+ end
210
+
52
211
  end
53
212
  end
54
213
  end
55
214
  end
215
+
216
+ __END__
217
+
218
+ "id"=>"sr:match:12090446",
219
+ "scheduled"=>"2018-05-20T18:45:00+00:00",
220
+ "start_time_tbd"=>true,
221
+ "status"=>"not_started",
222
+ "tournament_round"=>{"type"=>"group", "number"=>38},
223
+ "season"=>{"id"=>"sr:season:42720", "name"=>"Serie A 17/18", "start_date"=>"2017-08-19", "end_date"=>"2018-05-21", "year"=>"17/18", "tournament_id"=>"sr:tournament:23"},
224
+ "tournament"=>{"id"=>"sr:tournament:23", "name"=>"Serie A", "sport"=>{"id"=>"sr:sport:1", "name"=>"Soccer"}, "category"=>{"id"=>"sr:category:31", "name"=>"Italy", "country_code"=>"ITA"}},
225
+ "competitors"=>
226
+ [{"id"=>"sr:competitor:2793", "name"=>"US Sassuolo", "country"=>"Italy", "country_code"=>"ITA", "abbreviation"=>"SAS", "qualifier"=>"home"},
227
+ {"id"=>"sr:competitor:2702", "name"=>"AS Roma", "country"=>"Italy", "country_code"=>"ITA", "abbreviation"=>"ROM", "qualifier"=>"away"}]
228
+
229
+
230
+ m = Sportradar::Api::Soccer::Match.new({"id"=>"sr:match:12090446"}, league_group: 'eu')
231
+ res = m.get_summary
232
+ res = m.get_lineups
233
+ res = m.get_facts
234
+ res = m.get_probabilities
235
+ res = m.get_timeline
@@ -1,86 +1,73 @@
1
1
  module Sportradar
2
2
  module Api
3
- class Soccer::Player < Data
3
+ module Soccer
4
+ class Player < Data
4
5
 
5
- attr_accessor :id, :first_name, :last_name, :country_code, :country, :reference_id, :full_first_name, :full_last_name, :position, :started, :jersey_number, :tactical_position, :tactical_order, :statistics, :preferred_foot, :birthdate, :height_in, :weight_lb, :height_cm, :weight_kg, :teams, :response, :rank, :total, :statistics, :last_modified
6
+ attr_reader :id, :league_group, :name, :type, :nationality, :country_code, :height, :weight, :jersey_number, :preferred_foot, :stats, :date_of_birth, :matches_played
7
+ alias :position :type
6
8
 
7
- def initialize(data)
8
- @response = data
9
- @teams = parse_into_array(selector: response["team"], klass: Sportradar::Api::Soccer::Team) if response["team"]
10
- @teams = parse_into_array(selector: response["teams"]["team"], klass: Sportradar::Api::Soccer::Team) if response["teams"] && response["teams"]["team"]
11
- @id = data["id"]
12
- @first_name = data["first_name"]
13
- @last_name = data["last_name"]
14
- @country_code = data["country_code"]
15
- @country = data["country"]
16
- @reference_id = data["reference_id"]
17
- @full_first_name = data["full_first_name"]
18
- @full_last_name = data["full_last_name"]
19
- @position = data["position"] || primary_team.try(:position)
20
- @started = data["started"]
21
- @jersey_number = data["jersey_number"] || primary_team.try(:jersey_number)
22
- @tactical_position = data["tactical_position"]
23
- @tactical_order = data["tactical_order"]
24
- @last_modified = data["last_modified"]
9
+ def initialize(data = {}, league_group: nil, **opts)
10
+ @response = data
11
+ @id = data['id'] if data['id']
12
+ @api = opts[:api]
13
+ @league_group = league_group || data['league_group'] || @api&.league_group
25
14
 
26
- # profile
27
- @preferred_foot = data["preferred_foot"]
28
- @birthdate = data["birthdate"]
29
- @height_in = data["height_in"]
30
- @weight_lb = data["weight_lb"]
31
- @height_cm = data["height_cm"]
32
- @weight_kg = data["weight_kg"]
33
- @rank = data["rank"]
34
- @total = OpenStruct.new data["total"] if data["total"]
35
- @statistics = parse_into_array(selector:response["statistics"]["season"], klass: Sportradar::Api::Soccer::Season) if response["statistics"] && response["statistics"]["season"]
15
+ update(data, **opts)
16
+ end
36
17
 
37
- end
18
+ def update(data, **opts)
19
+ @id = data['id'] if data['id']
20
+ @league_group = opts[:league_group] || data['league_group'] || @league_group
38
21
 
39
- def name
40
- [first_name, last_name].join(' ')
41
- end
22
+ if data['player']
23
+ update(data['player'])
24
+ end
42
25
 
43
- def full_name
44
- full = [full_first_name, full_last_name].join(' ')
45
- full == " " ? name : full
46
- end
26
+ @name = data['name'] if data['name']
27
+ @last_name = data['last_name'] if data['last_name']
28
+ @first_name = data['first_name'] if data['first_name']
29
+ @type = data['type'] if data['type']
30
+ @nationality = data['nationality'] if data['nationality']
31
+ @country_code = data['country_code'] if data['country_code']
32
+ @height = data['height'] if data['height']
33
+ @weight = data['weight'] if data['weight']
34
+ @jersey_number = data['jersey_number'] if data['jersey_number']
35
+ @preferred_foot = data['preferred_foot'] if data['preferred_foot']
36
+ @matches_played = data['matches_played'] if data['matches_played']
47
37
 
48
- def position_name
49
- positions = {"G" => "Goalie", "D" => "Defender", "M" => "Midfielder", "F" => "Forward", "" => "N/A"}
50
- if position
51
- positions[position]
52
- elsif primary_team.present?
53
- positions[primary_team.position]
54
- end
55
- end
38
+ @stats = data['statistics'] if data['statistics']
56
39
 
57
- def primary_team
58
- if teams.count == 1
59
- teams.first
60
- else
61
- teams.find {|team| team.name != team.country_code}
62
- end if teams
63
- end
40
+ @date_of_birth = Date.parse(data['date_of_birth']) if data['date_of_birth']
41
+ end
64
42
 
43
+ def display_name
44
+ @name || [@first_name, @last_name].join(' ')
45
+ end
65
46
 
66
- def tactical_position_name
67
- tactical_positions = { "0" => "Unknown", "1" => "Goalkeeper", "2" => "Right Back", "3" => "Central Defender", "4" => "Left Back", "5" => "Right winger", "6" => "Central Midfielder", "7" => "Left Winger", "8" => "Forward" }
68
- tactical_positions[tactical_position] if tactical_position
69
- end
47
+ def api
48
+ @api || Sportradar::Api::Soccer::Api.new(league_group: @league_group)
49
+ end
70
50
 
71
- def age
72
- if birthdate.present?
73
- now = Time.now.utc.to_date
74
- dob = birthdate.to_date
75
- now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
51
+ def path_base
52
+ "players/#{ id }"
76
53
  end
77
- end
78
54
 
79
- def height_ft
80
- if height_in.present?
81
- feet, inches = height_in.to_i.divmod(12)
82
- "#{feet}' #{inches}\""
55
+ def path_profile
56
+ "#{ path_base }/profile"
83
57
  end
58
+ def get_profile
59
+ data = api.get_data(path_profile).to_h
60
+ ingest_profile(data)
61
+ end
62
+ def ingest_profile(data)
63
+ update(data)
64
+ data
65
+ end
66
+ def queue_profile
67
+ url, headers, options, timeout = api.get_request_info(path_profile)
68
+ {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_profile)}
69
+ end
70
+
84
71
  end
85
72
 
86
73
  end
@@ -1,14 +1,65 @@
1
1
  module Sportradar
2
2
  module Api
3
- class Soccer::Season < Data
4
- attr_accessor :response, :year, :statistics
3
+ module Soccer
4
+ class Season < Data
5
+ attr_reader :id, :league_group, :name, :category, :current_season, :season_coverage_info, :tournament_id
5
6
 
6
- def initialize(data)
7
- @response = data
8
- @year = data["year"]
9
- @statistics = parse_into_array(selector: response["statistic"], klass: Sportradar::Api::Soccer::Statistic) if response["statistic"]
10
- end
7
+ def initialize(data = {}, league_group: nil, **opts)
8
+ @response = data
9
+ @id = data["id"]
10
+ @api = opts[:api]
11
+ @league_group = league_group || data['league_group'] || @api&.league_group
12
+
13
+ update(data, **opts)
14
+ end
15
+
16
+ def update(data, **opts)
17
+ @league_group = opts[:league_group] || data['league_group'] || @league_group
18
+ @id = data['id'] || data['season_id'] || @id
19
+ @current = opts[:current] || @current
20
+ get_tournament_id(data, **opts)
21
+
22
+ @name = data['name'] || @name
23
+ @start_date = data['start_date'] || @start_date
24
+ @end_date = data['end_date'] || @end_date
25
+ @year = data['year'] || @year
26
+ @scheduled = data['scheduled'] || @scheduled
27
+ @played = data['played'] || @played
28
+ @max_coverage_level = data['max_coverage_level'] || @max_coverage_level
29
+ @max_covered = data['max_covered'] || @max_covered
30
+ @min_coverage_level = data['min_coverage_level'] || @min_coverage_level
31
+ end
32
+
33
+ def get_tournament_id(data, **opts)
34
+ @tournament_id ||= if opts[:tournament]
35
+ opts[:tournament].id
36
+ elsif data['tournament_id']
37
+ data['tournament_id']
38
+ elsif data['tournament']
39
+ data.dig('tournament', 'id')
40
+ end
41
+ end
42
+
43
+ def current?
44
+ !!@current
45
+ end
11
46
 
47
+ def api
48
+ @api ||= Sportradar::Api::Soccer::Api.new(league_group: @league_group)
49
+ end
50
+
51
+ end
12
52
  end
13
53
  end
14
54
  end
55
+
56
+ __END__
57
+ "current_season"=>{"id"=>"sr:season:41988", "name"=>"Primeira Liga 17/18", "start_date"=>"2017-08-05", "end_date"=>"2018-05-31", "year"=>"17/18"}
58
+ "season_coverage_info"=>{"season_id"=>"sr:season:41988", "scheduled"=>306, "played"=>72, "max_coverage_level"=>"gold", "max_covered"=>72, "min_coverage_level"=>"gold"}
59
+
60
+
61
+ group = Sportradar::Api::Soccer::Group.new(league_group: 'eu')
62
+ res = group.get_tournaments;
63
+ tour = group.tournaments.sample
64
+ tour.get_seasons
65
+ tour
@@ -1,13 +1,50 @@
1
1
  module Sportradar
2
2
  module Api
3
- class Soccer::Standing < Data
4
- attr_accessor :response, :categories
3
+ module Soccer
4
+ class Standing < Data
5
+ attr_reader :league_group, :id, :type
5
6
 
6
- def initialize(data)
7
- @response = data
8
- @categories = parse_into_array(selector: response["categories"]["category"], klass: Sportradar::Api::Soccer::Category) if response["categories"] && response["categories"]["category"]
9
- end
7
+ def initialize(data = {}, league_group: nil, **opts)
8
+ @response = data
9
+ @id = data["id"] || data['type']
10
+ @api = opts[:api]
11
+ @league_group = league_group || data['league_group'] || @api&.league_group
12
+
13
+ @groups_hash = {}
14
+
15
+ update(data, **opts)
16
+ end
17
+
18
+ def update(data, **opts)
19
+ @type = data['type']
20
+ @tie_break_rule = data['tie_break_rule'] if data['tie_break_rule']
21
+
22
+ if data['groups']
23
+ create_data(@groups_hash, data['groups'], klass: TeamGroup, api: api, identifier: 'name')
24
+ end
25
+ end
26
+
27
+ def groups(name = nil)
28
+ @groups_hash.values
29
+ end
10
30
 
31
+ def group(name = nil) # nil represents the complete team listing
32
+ @groups_hash[name]
33
+ end
34
+
35
+ def teams
36
+ @groups_hash.values.flat_map(&:teams)
37
+ end
38
+
39
+ def team(id)
40
+ @groups_hash.values.flat_map(&:teams).detect { |team| team.id == id }
41
+ end
42
+
43
+ def api
44
+ @api ||= Sportradar::Api::Soccer::Api.new(league_group: @league_group)
45
+ end
46
+
47
+ end
11
48
  end
12
49
  end
13
50
  end