sportradar-api 0.12.3 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
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