class SportDb::CsvEventImporter
Public Class Methods
new( txt, league:, season:, headers: nil )
click to toggle source
# File lib/sportdb/importers/event.rb, line 22 def initialize( txt, league:, season:, headers: nil ) @txt = txt @headers = headers raise ArgumentError("string expected for league; got #{league.class.name}") unless league.is_a? String raise ArgumentError("string expected for season; got #{season.class.name}") unless season.is_a? String ## try mapping of league here - why? why not? @league = Import.catalog.leagues.find!( league ) @season = Season.parse( season ) end
parse( txt, league:, season:, headers: nil )
click to toggle source
# File lib/sportdb/importers/event.rb, line 14 def self.parse( txt, league:, season:, headers: nil ) new( txt, league: league, season: season, headers: headers ).parse end
read( path, league:, season:, headers: nil )
click to toggle source
# File lib/sportdb/importers/event.rb, line 6 def self.read( path, league:, season:, headers: nil ) txt = File.open( path, 'r:utf-8' ) {|f| f.read } parse( txt, league: league, season: season, headers: headers ) end
Public Instance Methods
parse()
click to toggle source
# File lib/sportdb/importers/event.rb, line 35 def parse ## todo/fix: add headers options (pass throughto CsvMatchReader) ## add filters too why? why not? ## todo/fix: ## add normalize: false/mapping: false flag for NOT mapping club/team names ## make normalize: false the default, anyways - why? why not? opts = {} opts[:headers] = @headers if @headers matches = CsvMatchParser.parse( @txt, **opts ) matchlist = Import::Matchlist.new( matches ) team_names = matchlist.teams ## was: find_teams_in_matches_txt( matches_txt ) puts "#{team_names.size} teams:" pp team_names ## note: allows duplicates - will return uniq struct recs in teams teams = Import.catalog.teams.find_by!( name: team_names, league: @league ) ## build mapping - name => team struct record team_mappings = team_names.zip( teams ).to_h pp team_mappings ####### # start with database updates / sync here event_rec = Sync::Event.find_or_create_by( league: @league, season: @season ) ## todo/fix: ## add check if event has teams ## if yes - only double check and do NOT create / add teams ## number of teams must match (use teams only for lookup/alt name matches) ## note: allows duplicates - will return uniq db recs in teams ## and mappings from names to uniq db recs ## todo/fix: rename to team_recs_cache or team_cache - why? why not? # maps struct record "canonical" team name to active record db record!! ## note: use "canonical" team name as hash key for now (and NOT the object itself) - why? why not? team_recs = Sync::Team.find_or_create( team_mappings.values.uniq ) ## todo/fix/check: ## add check if event has teams ## if yes - only double check and do NOT create / add teams ## number of teams must match (use teams only for lookup/alt name matches) ## add teams to event ## todo/fix: check if team is alreay included? ## or clear/destroy_all first!!! event_rec.teams = team_recs ## todo/check/fix: use team_ids instead - why? why not? ## add catch-all/unclassified "dummy" round # round_rec = Model::Round.create!( # event_id: event_rec.id, # title: 'Matchday ??? / Missing / Catch-All', ## find a better name? # pos: 999, # start_at: event_rec.start_at.to_date # ) ## add matches matches.each do |match| team1_rec = Sync::Team.cache[ team_mappings[match.team1].name ] team2_rec = Sync::Team.cache[ team_mappings[match.team2].name ] if match.date.nil? puts "!!! WARN: skipping match - play date missing!!!!!" pp match else ## find last pos - check if it can be nil? yes, is nil if no records found max_pos = Model::Match.where( event_id: event_rec.id ).maximum( 'pos' ) max_pos = max_pos ? max_pos+1 : 1 rec = Model::Match.create!( event_id: event_rec.id, team1_id: team1_rec.id, team2_id: team2_rec.id, ## round_id: round_rec.id, -- note: now optional pos: max_pos, date: Date.strptime( match.date, '%Y-%m-%d' ), score1: match.score1, score2: match.score2, score1i: match.score1i, score2i: match.score2i, ) end end # each match event_rec # note: return event database record end