lib/sportradar/api/soccer/tournament.rb in sportradar-api-0.12.3 vs lib/sportradar/api/soccer/tournament.rb in sportradar-api-0.13.0

- old
+ new

@@ -1,20 +1,308 @@ module Sportradar module Api - class Soccer::Tournament < Data - attr_accessor :response, :id, :name, :season_start, :season_end, :season, :type, :reference_id, :coverage, :teams + module Soccer + class Tournament < Data + attr_reader :id, :league_group, :name, :category - def initialize(data) - @response = data - @id = data["id"] - @name = data["name"] - @season_start = data["season_start"] - @season_end = data["season_end"] - @season = data["season"] - @reference_id = data["reference_id"] - @coverage = OpenStruct.new data["coverage"] if data["coverage"] - @teams = parse_into_array(selector: response["team"], klass: Sportradar::Api::Soccer::Team) if response["team"] - end + def initialize(data = {}, league_group: nil, **opts) + @response = data + @id = data["id"] + @api = opts[:api] + @league_group = league_group || data['league_group'] || @api&.league_group + @matches_hash = {} + @seasons_hash = {} + @teams_hash = {} + @standings_hash = {} + @groups_hash = {} + + update(data, **opts) + end + + def update(data, **opts) + if data['tournament'] + update(data['tournament']) + end + + @name = data["name"] + @category = data['category'] || @category + + parse_info(data) + parse_season(data) + parse_results(data) + parse_schedule(data) + parse_standings(data) + end + + def seasons + @seasons_hash.values + end + + def standings(type = nil) + if type + @standings_hash[type] + else + @standings_hash.values + end + end + + def groups + @groups_hash.values + end + + def group(name = nil) # nil represents the complete team listing + @groups_hash[name] + end + + def matches + @matches_hash.values + end + alias :games :matches + + # parsing helpers + def parse_info(data) + if data['groups'] + create_data(@groups_hash, data['groups'], klass: TeamGroup, api: api, tournament: self, identifier: 'name') + end + end + + def parse_season(data) + if data['season_coverage_info'] + data['season_coverage_info']['id'] ||= data['season_coverage_info'].delete('season_id') + create_data(@seasons_hash, data['season_coverage_info'], klass: Season, api: api, tournament: self) + end + if data['current_season'] + create_data(@seasons_hash, data['current_season'], klass: Season, api: api, tournament: self, current: true) + end + if data['seasons'] + create_data(@seasons_hash, data['seasons'], klass: Season, api: api, tournament: self) + end + end + + def parse_results(data) + if data['results'] + merged_data = Soccer.parse_results(data['results']) + create_data(@matches_hash, merged_data, klass: Match, api: api, tournament: self) + end + end + + def parse_schedule(data) + if data['sport_events'] + create_data(@matches_hash, data['sport_events'], klass: Match, api: api, tournament: self) + end + end + + def parse_standings(data) + if data['standings'] + create_data(@standings_hash, data['standings'], klass: Standing, api: api, tournament: self, identifier: 'type') + end + end + + def api + @api ||= Sportradar::Api::Soccer::Api.new(league_group: @league_group) + end + + # url path helpers + def path_base + "tournaments/#{ id }" + end + + def path_live_standings + "#{ path_base }/live_standings" + end + def get_live_standings + data = api.get_data(path_live_standings).to_h + ingest_live_standings(data) + end + alias :get_standings :get_live_standings + def ingest_live_standings(data) + update(data) + # TODO parse the rest of the data. keys: ["tournament", "season", "standings"] + data + end + def queue_live_standings + url, headers, options, timeout = api.get_request_info(path_live_standings) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_live_standings)} + end + + def path_results + "#{ path_base }/results" + end + def get_results + data = api.get_data(path_results).to_h + ingest_results(data) + end + def ingest_results(data) + update(data) + # TODO parse the rest of the data. keys: ["tournament", "results"] + data + end + def queue_results + url, headers, options, timeout = api.get_request_info(path_results) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_results)} + end + + def path_schedule + "#{ path_base }/schedule" + end + def get_schedule + data = api.get_data(path_schedule).to_h + ingest_schedule(data) + end + def ingest_schedule(data) + update(data) + # TODO parse the rest of the data. keys: ["tournament", "sport_events"] + data + end + def queue_schedule + url, headers, options, timeout = api.get_request_info(path_schedule) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_schedule)} + end + + def path_seasons + "#{ path_base }/seasons" + end + def get_seasons + data = api.get_data(path_seasons).to_h + ingest_seasons(data) + end + def ingest_seasons(data) + update(data) + # TODO parse the rest of the data. keys: ["tournament", "seasons"] + data + end + def queue_seasons + url, headers, options, timeout = api.get_request_info(path_seasons) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_seasons)} + end + + def path_info + "#{ path_base }/info" + end + def get_info + data = api.get_data(path_info).to_h + ingest_info(data) + end + def ingest_info(data) + update(data) + # TODO parse the rest of the data. keys: ["tournament", "season", "round", "season_coverage_info", "coverage_info", "groups"] + data + end + def queue_info + url, headers, options, timeout = api.get_request_info(path_info) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_info)} + end + + def path_leaders + "#{ path_base }/leaders" + end + def get_leaders + data = api.get_data(path_leaders).to_h + ingest_leaders(data) + end + def ingest_leaders(data) + update(data) + # TODO parse the rest of the data. keys: ["tournament", "season_coverage_info", "top_points", "top_goals", "top_assists", "top_cards", "top_own_goals"] + data + end + def queue_leaders + url, headers, options, timeout = api.get_request_leaders(path_leaders) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_leaders)} + end + + def self.tournament_ids + @tournament_ids ||= { + # Europe group + 'eu.uefa_champions_league' => "sr:tournament:7", + 'eu.la_liga' => "sr:tournament:8", + 'eu.eng_premier_league' => "sr:tournament:17", + 'eu.serie_a' => "sr:tournament:23", + 'eu.ligue_1' => "sr:tournament:34", + 'eu.bundesliga' => "sr:tournament:35", + 'eu.eredivisie' => "sr:tournament:37", + 'eu.first_division_a' => "sr:tournament:38", + 'eu.super_lig' => "sr:tournament:52", + 'eu.super_league' => "sr:tournament:185", + 'eu.rus_premier_league' => "sr:tournament:203", + 'eu.ukr_premier_league' => "sr:tournament:218", + 'eu.primeira_liga' => "sr:tournament:238", + 'eu.uefa_super_cup' => "sr:tournament:465", + 'eu.uefa_europa_league' => "sr:tournament:679", + 'eu.uefa_youth_league' => "sr:tournament:2324", + # international (partial listing) + "intl.world_cup" => "sr:tournament:16", + "intl.copa_america" => "sr:tournament:133", + "intl.gold_cup" => "sr:tournament:140", + "intl.africa_cup_of_nations" => "sr:tournament:270", + "intl.womens_world_cup" => "sr:tournament:290", + "intl.olympic_games" => "sr:tournament:436", + "intl.olympic_games_women" => "sr:tournament:437", + # other groups below + } + end + + self.tournament_ids.each do |tour_name, tour_id| + group_code, name = tour_name.split('.') + define_singleton_method(name) { Sportradar::Api::Soccer::Tournament.new({'id' => tour_id}, league_group: group_code) } + end + + end end end end + +__END__ + +{"id"=>"sr:tournament:17", + "name"=>"Premier League", + "sport"=>{"id"=>"sr:sport:1", "name"=>"Soccer"}, + "category"=>{"id"=>"sr:category:1", "name"=>"England", "country_code"=>"ENG"}, + "current_season"=>{"id"=>"sr:season:40942", "name"=>"Premier League 17/18", "start_date"=>"2017-08-11", "end_date"=>"2018-05-14", "year"=>"17/18"}, + "season_coverage_info"=>{"season_id"=>"sr:season:40942", "scheduled"=>381, "played"=>70, "max_coverage_level"=>"platinum", "max_covered"=>70, "min_coverage_level"=>"platinum"}} + + +group = Sportradar::Api::Soccer::Group.new(league_group: 'eu') +res = group.get_tournaments; +tour = group.tournaments.sample +tour.get_seasons +tour.get_results +res = tour.get_schedule +tour.matches.size +tour + +group = Sportradar::Api::Soccer::Group.new(league_group: 'eu') +res = group.get_tournaments; +infos = group.tournaments.map{|tour| sleep 1; tour.get_info } +standings = group.tournaments.map{|tour| sleep 1; tour.get_standings } +results = group.tournaments.each{|tour| sleep 1; tour.get_results }.flat_map(&:matches) +standings = group.tournaments.map{|tour| sleep 1; (tour.get_standings rescue nil) } + +{"UEFA Champions League"=>"sr:tournament:7", + "LaLiga"=>"sr:tournament:8", + "Premier League"=>"sr:tournament:218", + "Serie A"=>"sr:tournament:23", + "Ligue 1"=>"sr:tournament:34", + "Bundesliga"=>"sr:tournament:35", + "Eredivisie"=>"sr:tournament:37", + "First Division A"=>"sr:tournament:38", + "Super Lig"=>"sr:tournament:52", + "Super League"=>"sr:tournament:185", + "Primeira Liga"=>"sr:tournament:238", + "UEFA Super Cup"=>"sr:tournament:465", + "UEFA Europa League"=>"sr:tournament:679", + "UEFA Youth League"=>"sr:tournament:2324"} + +sample_leagues = [:la_liga, :eng_premier_league, :bundesliga, :serie_a, :ligue_1] +tours = sample_leagues.map { |code| Sportradar::Api::Soccer::Tournament.send(code) } +tours.each{|t| sleep 1; t.get_info } +teams = tours.flat_map(&:groups).flat_map(&:teams) +teams.each { |t| sleep 1; t.get_roster } + + +sample_leagues = [:la_liga, :eng_premier_league, :bundesliga, :serie_a, :ligue_1]; +tours = sample_leagues.map { |code| Sportradar::Api::Soccer::Tournament.send(code) }; +tours.each{|t| sleep 1; t.get_info }; +tours.flat_map(&:groups).flat_map(&:teams); +teams = tours.flat_map(&:groups).flat_map(&:teams); +teams.each { |t| sleep 1; t.get_roster }; +teams.map {|t| ["#{t.tournament_id} #{t.name}",t.jerseys]}.to_h