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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile.lock +1 -1
- data/README.md +3 -3
- data/lib/sportradar/api/baseball/game.rb +6 -2
- data/lib/sportradar/api/baseball/mlb.rb +1 -1
- data/lib/sportradar/api/baseball/pitch.rb +5 -0
- data/lib/sportradar/api/basketball/game.rb +14 -2
- data/lib/sportradar/api/basketball/nba/player.rb +2 -2
- data/lib/sportradar/api/basketball/nba.rb +1 -1
- data/lib/sportradar/api/basketball/plays/base.rb +1 -1
- data/lib/sportradar/api/data.rb +2 -1
- data/lib/sportradar/api/error.rb +1 -1
- data/lib/sportradar/api/images.rb +1 -1
- data/lib/sportradar/api/request.rb +22 -1
- data/lib/sportradar/api/soccer/api.rb +66 -0
- data/lib/sportradar/api/soccer/event.rb +45 -0
- data/lib/sportradar/api/soccer/fact.rb +56 -53
- data/lib/sportradar/api/soccer/group.rb +70 -0
- data/lib/sportradar/api/soccer/lineup.rb +31 -0
- data/lib/sportradar/api/soccer/match.rb +224 -44
- data/lib/sportradar/api/soccer/player.rb +54 -67
- data/lib/sportradar/api/soccer/season.rb +58 -7
- data/lib/sportradar/api/soccer/standing.rb +43 -6
- data/lib/sportradar/api/soccer/team.rb +155 -53
- data/lib/sportradar/api/soccer/team_group.rb +57 -0
- data/lib/sportradar/api/soccer/tournament.rb +302 -14
- data/lib/sportradar/api/soccer/venue.rb +14 -13
- data/lib/sportradar/api/{soccer → soccer-old}/boxscore.rb +0 -0
- data/lib/sportradar/api/{soccer → soccer-old}/category.rb +0 -0
- data/lib/sportradar/api/soccer-old/fact.rb +61 -0
- data/lib/sportradar/api/{soccer → soccer-old}/hierarchy.rb +0 -0
- data/lib/sportradar/api/soccer-old/match.rb +55 -0
- data/lib/sportradar/api/soccer-old/player.rb +88 -0
- data/lib/sportradar/api/{soccer → soccer-old}/ranking.rb +0 -0
- data/lib/sportradar/api/{soccer → soccer-old}/schedule.rb +0 -0
- data/lib/sportradar/api/soccer-old/season.rb +14 -0
- data/lib/sportradar/api/soccer-old/standing.rb +13 -0
- data/lib/sportradar/api/{soccer → soccer-old}/statistic.rb +0 -0
- data/lib/sportradar/api/{soccer → soccer-old}/summary.rb +0 -0
- data/lib/sportradar/api/soccer-old/team.rb +63 -0
- data/lib/sportradar/api/soccer-old/tournament.rb +20 -0
- data/lib/sportradar/api/{soccer → soccer-old}/tournament_group.rb +0 -0
- data/lib/sportradar/api/soccer-old/venue.rb +21 -0
- data/lib/sportradar/api/soccer-old.rb +158 -0
- data/lib/sportradar/api/soccer.rb +18 -152
- data/lib/sportradar/api/version.rb +1 -1
- data/lib/sportradar/api.rb +17 -18
- data/soccer-old/boxscore_test.rb +14 -0
- data/soccer-old/hierarchy_test.rb +14 -0
- data/soccer-old/match_test.rb +23 -0
- data/soccer-old/player_test.rb +40 -0
- data/soccer-old/ranking_test.rb +16 -0
- data/soccer-old/schedule_test.rb +24 -0
- data/soccer-old/standing_test.rb +14 -0
- data/soccer-old/summary_test.rb +14 -0
- data/soccer-old/team_test.rb +21 -0
- data/soccer-old_test.rb +184 -0
- metadata +34 -10
@@ -1,55 +1,235 @@
|
|
1
1
|
module Sportradar
|
2
2
|
module Api
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
3
|
+
module Soccer
|
4
|
+
class Player < Data
|
4
5
|
|
5
|
-
|
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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
27
|
-
|
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
|
-
|
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
|
-
|
40
|
-
|
41
|
-
|
22
|
+
if data['player']
|
23
|
+
update(data['player'])
|
24
|
+
end
|
42
25
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
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
|
-
|
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
|
-
|
58
|
-
|
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
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end
|
47
|
+
def api
|
48
|
+
@api || Sportradar::Api::Soccer::Api.new(league_group: @league_group)
|
49
|
+
end
|
70
50
|
|
71
|
-
|
72
|
-
|
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
|
-
|
80
|
-
|
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
|
-
|
4
|
-
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
4
|
-
|
3
|
+
module Soccer
|
4
|
+
class Standing < Data
|
5
|
+
attr_reader :league_group, :id, :type
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|