lib/sportdb/reader.rb in sportdb-1.6.16 vs lib/sportdb/reader.rb in sportdb-1.6.17

- old
+ new

@@ -32,143 +32,85 @@ def initialize( include_path, opts={}) @include_path = include_path end - def load_setup( setup ) - ary = load_fixture_setup( setup ) - load( ary ) - end # method load_setup - - - ## fix/todo: rename ?? - def load_fixture_setup( name ) - - ## todo/fix: cleanup quick and dirty code - + def load_setup( name ) path = "#{include_path}/#{name}.yml" logger.info "parsing data '#{name}' (#{path})..." - text = File.read_utf8( path ) - - hash = YAML.load( text ) - - ### build up array for fixtures from hash - - ary = [] - - hash.each do |key_wild, value_wild| - key = key_wild.to_s.strip - - logger.debug "yaml key:#{key_wild.class.name} >>#{key}<<, value:#{value_wild.class.name} >>#{value_wild}<<" - - if value_wild.kind_of?( String ) # assume non-event data - ary << value_wild - elsif value_wild.kind_of?( Array ) # assume non_event data as array of strings - ary = ary + value_wild - elsif value_wild.kind_of?( Hash ) # assume event data - - value_wild.each do |event_key, event_values| - # e.g. - # at.2012/13: at/2012_13/bl, at/2012_13/bl2 - # becomes - # [ 'at.2012/13', 'at/2012_13/bl', 'at/2012_13/bl2' ] - ary << ( [ event_key.to_s ] + event_values.split(',') ) - end - - else - logger.error "unknow fixture type in setup (yaml key:#{key_wild.class.name} >>#{key}<<, value:#{value_wild.class.name} >>#{value_wild}<<); skipping" - end - + reader = FixtureReader.new( path ) + + reader.each do |fixture_name| + load( fixture_name ) end - - logger.debug "fixture setup:" - logger.debug ary.to_json - - ary - - end # load_fixture_setup + end # method load_setup - def load( ary ) # convenience helper for all-in-one reader + def load( name ) # convenience helper for all-in-one reader + + logger.debug "enter load( name=>>#{name}<<, include_path=>>#{include_path}<<)" - logger.debug "enter load(include_path=>>#{include_path}<<):" - logger.debug ary.to_json - - ary.each do |rec| - if rec.kind_of?( String ) - ## assume single fixture name - name = rec - - if name =~ /^circuits/ # e.g. circuits.txt in formula1.db - load_tracks( name ) - elsif name =~ /^drivers/ # e.g. drivers.txt in formula1.db - load_persons( name ) - elsif name =~ /^teams/ # e.g. teams.txt in formula1.db - load_teams( name ) - elsif name =~ /\/races/ # e.g. 2013/races.txt in formula1.db - load_races( name ) - elsif name =~ /\/squads/ || name =~ /\/rosters/ # e.g. 2013/squads.txt in formula1.db - load_rosters( name ) - elsif name =~ /\/([0-9]{2})-/ - race_pos = $1.to_i - # NB: assume @event is set from previous load - race = Race.find_by_event_id_and_pos( @event.id, race_pos ) - load_records( name, race_id: race.id ) # e.g. 2013/04-gp-monaco.txt in formula1.db - elsif name =~ /(?:^|\/)seasons/ # NB: ^seasons or also possible at-austria!/seasons - load_seasons( name ) - elsif name =~ /^leagues/ - if name =~ /club/ - # e.g. leagues_club - load_leagues( name, club: true ) - else - # e.g. leagues - load_leagues( name ) + if name =~ /^circuits/ # e.g. circuits.txt in formula1.db + load_tracks( name ) + elsif name =~ /^drivers/ # e.g. drivers.txt in formula1.db + load_persons( name ) + elsif name =~ /^teams/ # e.g. teams.txt in formula1.db + load_teams( name ) + elsif name =~ /\/races/ # e.g. 2013/races.txt in formula1.db + load_races( name ) + elsif name =~ /\/squads/ || name =~ /\/rosters/ # e.g. 2013/squads.txt in formula1.db + load_rosters( name ) + elsif name =~ /\/([0-9]{2})-/ + race_pos = $1.to_i + # NB: assume @event is set from previous load + race = Race.find_by_event_id_and_pos( @event.id, race_pos ) + load_records( name, race_id: race.id ) # e.g. 2013/04-gp-monaco.txt in formula1.db + elsif name =~ /(?:^|\/)seasons/ # NB: ^seasons or also possible at-austria!/seasons + load_seasons( name ) + elsif name =~ /^leagues/ + if name =~ /club/ + # e.g. leagues_club + load_leagues( name, club: true ) + else + # e.g. leagues + load_leagues( name ) + end + elsif match_leagues_for_country( name ) do |country_key| # name =~ /^([a-z]{2})\/leagues/ + # auto-add country code (from folder structure) for country-specific leagues + # e.g. at/leagues + country = Country.find_by_key!( country_key ) + load_leagues( name, club: true, country_id: country.id ) end - elsif match_leagues_for_country( name ) do |country_key| # name =~ /^([a-z]{2})\/leagues/ - # auto-add country code (from folder structure) for country-specific leagues - # e.g. at/leagues - country = Country.find_by_key!( country_key ) - load_leagues( name, club: true, country_id: country.id ) - end - elsif match_teams_for_country( name ) do |country_key| # name =~ /^([a-z]{2})\/teams/ - # auto-add country code (from folder structure) for country-specific teams - # e.g. at/teams at/teams.2 de/teams etc. - country = Country.find_by_key!( country_key ) - load_teams( name, club: true, country_id: country.id ) - end - elsif name =~ /\/teams/ - if name =~ /club/ - # club teams (many countries) - # e.g. club/europe/teams - load_teams( name, club: true ) - else - # assume national teams - # e.g. world/teams amercia/teams_n - load_teams( name, national: true ) + elsif match_teams_for_country( name ) do |country_key| # name =~ /^([a-z]{2})\/teams/ + # auto-add country code (from folder structure) for country-specific teams + # e.g. at/teams at/teams.2 de/teams etc. + country = Country.find_by_key!( country_key ) + load_teams( name, club: true, country_id: country.id ) end - else - logger.error "unknown sportdb fixture type >#{name}<" - # todo/fix: exit w/ error - end - else # more than one item in record? assume fixture starting w/ event key - - # assume first item is key - # assume second item is event plus fixture - # assume option third,etc are fixtures (e.g. bl2, etc.) - event_key = rec[0] # e.g. at.2012/13 - event_name = rec[1] # e.g. at/2012_13/bl - fixture_names = rec[1..-1] # e.g. at/2012_13/bl, at/2012_13/bl2 - - load_event( event_name ) - fixture_names.each do |fixture_name| - load_fixtures( event_key, fixture_name ) - end + elsif name =~ /\/teams/ + if name =~ /club/ + # club teams (many countries) + # e.g. club/europe/teams + load_teams( name, club: true ) + else + # assume national teams + # e.g. world/teams amercia/teams_n + load_teams( name, national: true ) end - - end # each ary + elsif name =~ /\/(\d{4}|\d{4}_\d{2})\// # e.g. must match /2012/ or /2012_13/ + load_event( name ) + event = fetch_event( name ) + fixtures = fetch_event_fixtures( name ) + fixtures.each do |fx| + load_fixtures( event.key, fx ) + end + else + logger.error "unknown sportdb fixture type >#{name}<" + # todo/fix: exit w/ error + end end # method load def load_leagues( name, more_attribs={} ) @@ -243,10 +185,48 @@ end # each line end # load_seasons + def fetch_event_fixtures( name ) + # todo: merge with fetch_event to make it single read op - why? why not?? + reader = HashReaderV2.new( name, include_path ) + + fixtures = [] + + reader.each_typed do |key, value| + if key == 'fixtures' && value.kind_of?( Array ) + logger.debug "fixtures:" + logger.debug value.to_json + ## todo: make sure we get an array!!!!! + fixtures = value + else + # skip; do nothing + end + end # each key,value + + if fixtures.empty? + logger.warn "no fixtures found for event - >#{name}<; assume fixture name is the same as event" + fixtures = [name] + else + ## add path to fixtures (use path from event e.g) + # - bl + at-austria!/2012_13/bl -> at-austria!/2012_13/bl + # - bl_ii + at-austria!/2012_13/bl -> at-austria!/2012_13/bl_ii + + dir = File.dirname( name ) # use dir for fixtures + + fixtures = fixtures.map do |fx| + fx_new = "#{dir}/#{fx}" # add path upfront + logger.debug "fx: #{fx_new} | >#{fx}< + >#{dir}<" + fx_new + end + end + + fixtures + end + + def fetch_event( name ) # get/fetch/find event from yml file ## todo/fix: use h = HashFile.load( path ) or similar instead of HashReader!! @@ -343,10 +323,10 @@ elsif key == 'team3' ## for now always assume false # todo: fix - use value and convert to boolean if not boolean event_attribs['team3'] = false else ## todo: add a source location struct to_s or similar (file, line, col) - logger.error "unknown event attrib; skipping attrib" + logger.error "unknown event attrib #{key}; skipping attrib" end end # each key,value league_id = event_attribs['league_id']