beneggett/sportradar-api

View on GitHub
lib/sportradar/api/basketball/ncaamb.rb

Summary

Maintainability
C
1 day
Test Coverage
module Sportradar
  module Api
    module Basketball
      class Ncaamb < Data
        attr_accessor :response, :id, :name, :alias
        def all_attributes
          [:name, :alias, :conferences, :divisions, :teams]
        end

        def initialize(data = {}, **opts)
          @response = data
          @api      = opts[:api]
          @id       = data['id']
          @season   = opts[:year]
          @type     = opts[:type]

          @divisions_hash     = create_data({}, {"id" => "c5a8d640-5093-4044-851d-2c562e929994", "name" => "NCAA Division I", "alias" => "D1"}, klass: Division, api: api)
          @weeks_hash         = {}
          @games_hash         = {}
          @tournaments_hash   = {}
          @teams_hash         = {}

          update(data, **opts)
        end

        def update(data, **opts)
          @id     = data['id'] if data['id']

          if data['league']
            @id    = data.dig('league', 'id')
            @name  = data.dig('league', 'name')
            @alias = data.dig('league', 'alias')
          end

          if data['season'].is_a?(Hash)
            @season   = data.dig('season', 'year')
            @type     = data.dig('season', 'type')
          else
            @season = data['season']  if data['season']
            @type   = data['type']    if data['type']
          end

          create_data(@teams_hash,        data['teams'],        klass: Team,        api: api) if data['teams']
          create_data(@divisions_hash,    data['divisions'],    klass: Division,    api: api) if data['divisions']
          create_data(@games_hash,        data['games'],        klass: Game,        api: api) if data['games']
          create_data(@tournaments_hash,  data['tournaments'],  klass: Tournament,  api: api) if data['tournaments']
        end

        def divisions
          @divisions_hash.values
        end
        def division(code_name)
          divisions_by_name[code_name]
        end
        private def divisions_by_name
          @divisions_by_name ||= divisions.map { |d| [d.alias, d] }.to_h
        end
        def conferences
          divisions.flat_map(&:conferences)
        end

        def schedule
          get_schedule if games.empty?
          self
        end

        def standings
          get_standings if divisions.empty? || teams.first&.record.nil?
          self
        end

        def hierarchy
          get_hierarchy if divisions.empty?
          self
        end

        def tournaments
          get_tournaments if @tournaments_hash.empty?
          @tournaments_hash.values
        end

        def games
          @games_hash.values
        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
        end

        def team(team_id)
          teams.detect { |team| team.id == team_id }
        end

        def get_schedule
          data = api.get_data(path_schedule).to_h
          ingest_schedule(data)
        end
        def ingest_schedule(data)
          update(data)
          data
        end

        def get_tournaments(tourney_season = 'pst')
          data = api.get_data(path_tournaments(tourney_season)).to_h
          ingest_tournaments(data)
        end
        def ingest_tournaments(data)
          update(data)
          data
        end

        def get_conference_tournaments
          data = api.get_data(path_conference_tournaments).to_h
          ingest_conference_tournaments(data)
        end
        def ingest_conference_tournaments(data)
          update(data)
          data
        end

        def get_daily_schedule(date = default_date)
          data = api.get_data(path_daily_schedule(date)).to_h
          ingest_daily_schedule(data)
        end
        def ingest_daily_schedule(data)
          update(data)
          data
        end

        def get_rankings(poll_name, ncaamb_week = nil)
          data = api.get_data(path_rankings(poll_name, ncaamb_week)).to_h
          ingest_rankings(data)
        end
        def ingest_rankings(data)
          update(data)
          data
        end

        def get_hierarchy
          data = api.get_data(path_hierarchy).to_h
          ingest_hierarchy(data)
        end
        def ingest_hierarchy(data)
          update(data)
          data
        end

        def get_standings
          data = api.get_data(path_standings).to_h
          ingest_standings(data)
        end
        def ingest_standings(data)
          division('D1').update(data)
          data
        end

        def api
          @api || Sportradar::Api::Basketball::Ncaamb::Api.new
        end

        def default_year
          (Date.today - 210).year
        end
        def default_date
          Date.today
        end
        def default_season
          'reg'
        end
        def season_year
          @season || default_year
        end
        alias :year :season_year
        def ncaamb_season
          @type || default_season
        end
        alias :season :ncaamb_season

        def path_schedule
          "games/#{season_year}/#{ncaamb_season}/schedule"
        end

        def path_tournaments(tourney_season = 'pst')
          "tournaments/#{season_year}/#{tourney_season}/schedule"
        end

        def path_conference_tournaments
          path_tournaments('ct')
        end

        def path_daily_schedule(date = default_date)
          "games/#{ date.year }/#{ date.month }/#{ date.day }/schedule"
        end

        def path_rankings(poll_name, ncaamb_week = nil, season_year = default_year)
          "polls/#{poll_name}/#{season_year}/#{ncaamb_week}/rankings"
        end

        def path_hierarchy
          "league/hierarchy"
        end

        def path_standings
          "seasontd/#{season_year}/#{ncaamb_season}/standings"
        end

      end
    end
  end
end

__END__

sr = Sportradar::Api::Basketball::Ncaamb.new
ss = sr.schedule(2015, 'ct');
ss = sr.schedule(2015, 'pst');
rank = sr.rankings('US');
ds = sr.daily_schedule;

# not ready
lh = sr.league_hierarchy;
ls = sr.standings;