lib/sportradar/api/baseball/mlb.rb in sportradar-api-0.11.69 vs lib/sportradar/api/baseball/mlb.rb in sportradar-api-0.12.0

- old
+ new

@@ -1,84 +1,275 @@ module Sportradar module Api module Baseball - class Mlb < Request - attr_accessor :league, :access_level, :simulation, :error + class Mlb < Data + attr_accessor :response, :id, :name, :alias, :year, :type + def all_attributes + [:name, :alias, :leagues, :divisions, :teams] + end - def initialize(access_level = default_access_level) - @league = 'mlb' - raise Sportradar::Api::Error::InvalidAccessLevel unless allowed_access_levels.include? access_level - @access_level = access_level + def initialize(data = {}, **opts) + # @response = data + @api = opts[:api] + @id = data['id'] + @season = opts[:year] + @type = opts[:type] + + @leagues_hash = {} + @games_hash = {} + @teams_hash = {} + + update(data, **opts) end - def sim! - @version = 5 - super + def update(data, source: nil, **opts) + # update stuff + @id = data.dig('league', 'id') if data.dig('league', 'id') + @name = data.dig('league', 'name') if data.dig('league', 'name') + @alias = data.dig('league', 'alias') if data.dig('league', 'alias') + + @year = data.dig('season', 'year') if data.dig('season', 'year') + @type = data.dig('season', 'type') if data.dig('season', 'type') + + @leagues_hash = create_data({}, data['leagues'], klass: League, hierarchy: self, api: api) if data['leagues'] + @teams_hash = create_data({}, data['teams'], klass: Team, hierarchy: self, api: api) if data['teams'] + if data['games'] && !data['games'].empty? + if data['games'].first.keys == ['game'] + data['games'].map! { |hash| hash['game'] } + end + @games_hash = create_data({}, data['games'], klass: Game, hierarchy: self, api: api) + end end - def get_data(url) - data = get request_url(url) - if data.is_a?(Sportradar::Api::Error) - puts request_url(url) - puts - puts data.inspect - raise 'Sportradar error' + def schedule + get_schedule if games.empty? + self + end + + def standings + get_standings if teams.first&.record.nil? + self + end + + def hierarchy + get_hierarchy if divisions.empty? + self + end + + def daily_schedule + # TODO + end + + def games + @games_hash.values + end + + def leagues + @leagues_hash.values + end + def divisions + leagues.flat_map(&:divisions) + end + def teams + teams = divisions.flat_map(&:teams) + if teams.empty? + if @teams_hash.empty? + get_hierarchy + divisions.flat_map(&:teams) + else + @teams_hash.values + end + else + teams end - data end + def team(team_id) + teams.detect { |team| team.id == team_id } + end + + + # api stuff + def api + @api || Sportradar::Api::Baseball::Mlb::Api.new + end + def default_year Date.today.year end def default_date Date.today end def default_season 'reg' end - def default_access_level - if (ENV['SPORTRADAR_ENV'] || ENV['SPORTRADAR_ENV_MLB'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']) == 'production' - 'p' - else - 't' - end + def season_year + @year || default_year end + def mlb_season + @type || default_season + end - def content_format - 'json' + + # url paths + def path_base + "league" end + def path_schedule + "games/#{season_year}/#{mlb_season}/schedule" + end + def path_series + "series/#{season_year}/#{mlb_season}/schedule" + end + def path_rankings + "seasontd/#{season_year}/#{mlb_season}/rankings" + end + def path_hierarchy + "#{ path_base }/hierarchy" + end + def path_depth_charts + "#{ path_base }/depth_charts" + end + def path_standings + "seasontd/#{season_year}/#{mlb_season}/standings" + end + def path_daily_summary(date) + "games/#{date.year}/#{date.month}/#{date.day}/summary" + end + def path_daily_boxscore(date) + "#{ path_base }/games/#{date.year}/#{date.month}/#{date.day}/boxscore" + end - private - def request_url(path) - "/mlb-#{access_level}#{version}/#{path}" + # data retrieval + + ## schedule + def get_schedule + data = api.get_data(path_schedule).to_h + ingest_schedule(data) end - def api_key - if !['t', 'sim'].include?(access_level) - Sportradar::Api.api_key_params('mlb', 'production') - elsif 'sim' == access_level - Sportradar::Api.api_key_params('mlb', 'simulation') - else - Sportradar::Api.api_key_params('mlb') - end + def ingest_schedule(data) + update(data, source: :games) + data end - def version - @version || Sportradar::Api.version('mlb') + 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 allowed_access_levels - %w[p t sim] + ## hierarchy + def get_hierarchy + data = api.get_data(path_hierarchy).to_h + ingest_hierarchy(data) end - def allowed_seasons - ["pre", "reg", "pst"] + def ingest_hierarchy(data) + update(data, source: :teams) + data end + def queue_hierarchy + url, headers, options, timeout = api.get_request_info(path_hierarchy) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_hierarchy)} + end + + ## depth_charts + def get_depth_charts + data = api.get_data(path_depth_charts).to_h + ingest_depth_charts(data) + end + + def ingest_depth_charts(data) + update(data, source: :teams) + data + end + + def queue_depth_charts + url, headers, options, timeout = api.get_request_info(path_depth_charts) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_depth_charts)} + end + + ## standings + def get_standings + data = api.get_data(path_standings).to_h + ingest_standings(data) + end + + def ingest_standings(data) + update(data.dig('league','season'), source: :teams) + data + end + + def queue_standings + url, headers, options, timeout = api.get_request_info(path_standings) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_standings)} + end + + ## depth_charts + def get_depth_charts + data = api.get_data(path_depth_charts).to_h + ingest_depth_charts(data) + end + + def ingest_depth_charts(data) + update(data, source: :teams) + data + end + + def queue_depth_charts + url, headers, options, timeout = api.get_request_info(path_depth_charts) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_depth_charts)} + end + + ## daily summary + def get_daily_summary(date = Date.today) + data = api.get_data(path_daily_summary(date)).to_h + ingest_daily_summary(data) + end + + def ingest_daily_summary(data) + update(data.dig('league'), source: :games) + data + end + + def queue_daily_summary(date = Date.today) + url, headers, options, timeout = api.get_request_info(path_daily_summary(date)) + {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_daily_summary)} + end + + ## venues + # def get_venues + # data = api.get_data(path_venues).to_h + # ingest_venues(data) + # end + + # def ingest_venues(data) + # update(data, source: :teams) + # data + # end + + # def queue_venues + # url, headers, options, timeout = api.get_request_info(path_venues) + # {url: url, headers: headers, params: options, timeout: timeout, callback: method(:ingest_venues)} + # end + end end end end __END__ -# mlb = Sportradar::Api::Baseball::Mlb::Hierarchy.new + +mlb = Sportradar::Api::Baseball::Mlb::Hierarchy.new +res = mlb.get_daily_summary; +res = mlb.get_hierarchy; +res = mlb.get_schedule; +t = mlb.teams.first; +t.get_season_stats; +t.players.sample + +res = mlb.get_schedule; +g = mlb.games.sort_by(&:scheduled).first + +portradar::Api::Baseball::Mlb::Hierarchy.new