class Footty::OpenfootballDataset
Constants
- SOURCES
Public Class Methods
Source
# File lib/footty/openfootball.rb, line 76 def self.latest_season( league: ) spec = SOURCES[ league.downcase ] raise ArgumentError, "no dataset (source) for league #{league} found" if spec.nil? ## todo/fix - report error if no spec found season = if spec.is_a?( Hash ) ## assume lookup by year spec.keys[0] else ## assume vanilla urls (no lookup by year) ## default to 2025 or 2024/25 for now spec.index( '$year$') ? '2025' : '2024/25' end season end
auto-fill latest season
Source
# File lib/footty/openfootball.rb, line 71 def self.leagues() SOURCES.keys; end
return built-in league keys
Source
# File lib/footty/openfootball.rb, line 93 def initialize( league:, season: ) spec = SOURCES[ league.downcase ] urls = if spec.is_a?( Hash ) ## assume lookup by year spec[ season ] else ## assume vanilla urls (no lookup by year) spec end raise ArgumentError, "no dataset (source) for league #{league} found" if urls.nil? ## wrap single sources (strings) in array urls = urls.is_a?( Array ) ? urls : [urls] ## expand shortened url and fill-in template vars urls = urls.map { |url| openfootball_url( url, season: season ) } matches = [] urls.each do |url| txt = get!( url ) ## use "memoized" / cached result parser = SportDb::QuickMatchReader.new( txt ) matches += parser.parse ### for multiple source file use latest name as "definitive" @league_name = parser.league_name ### todo/fix - report errors end matches = matches.map {|match| match.as_json } # convert to json ## note - sort by date/time ## (assume stable sort; no reshuffle of matches if already sorted by date/time) matches = matches.sort do |l,r| result = l['date'] <=> r['date'] result = l['time'] <=> r['time'] if result == 0 && (l['time'] && r['time']) result end @matches = matches end
Public Instance Methods
Source
# File lib/footty/openfootball.rb, line 150 def get!( url ) ## use cached urls for 12h by default ## if expired in cache (or not present) than get/fetch if Webcache.expired_in_12h?( url ) response = Webget.text( url ) if response.status.ok? response.text # note - return text (utf-8) else ## dump headers response.headers.each do |key,value| puts " #{key}: #{value}" end puts "!! HTTP ERROR - #{response.status.code} #{response.status.message}" exit 1 end else Webcache.read( url ) end end
Source
# File lib/footty/openfootball.rb, line 146 def league_name() @league_name; end
Source
# File lib/footty/openfootball.rb, line 134 def openfootball_url( path, season: ) repo, local_path = path.split( '/', 2) url = "https://raw.githubusercontent.com/openfootball/#{repo}/master/#{local_path}" ## check for template vars too season = Season( season ) url = url.gsub( '$year$', season.start_year.to_s ) url = url.gsub( '$season$', season.to_path ) url end