sportdb-formats 1.0.3 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Manifest.txt +1 -0
- data/lib/sportdb/formats/country/country_index.rb +7 -7
- data/lib/sportdb/formats/country/country_reader.rb +26 -6
- data/lib/sportdb/formats/league/league_outline_reader.rb +24 -7
- data/lib/sportdb/formats/league/league_reader.rb +3 -3
- data/lib/sportdb/formats/match/mapper.rb +63 -63
- data/lib/sportdb/formats/match/mapper_teams.rb +1 -1
- data/lib/sportdb/formats/match/match_parser.rb +99 -180
- data/lib/sportdb/formats/match/match_parser_csv.rb +19 -5
- data/lib/sportdb/formats/package.rb +36 -5
- data/lib/sportdb/formats/parser_helper.rb +11 -2
- data/lib/sportdb/formats/score/score_parser.rb +6 -0
- data/lib/sportdb/formats/structs/country.rb +6 -3
- data/lib/sportdb/formats/structs/group.rb +5 -12
- data/lib/sportdb/formats/structs/match.rb +5 -1
- data/lib/sportdb/formats/structs/round.rb +6 -13
- data/lib/sportdb/formats/structs/standings.rb +30 -9
- data/lib/sportdb/formats/structs/team.rb +1 -2
- data/lib/sportdb/formats/version.rb +2 -2
- data/test/helper.rb +1 -0
- data/test/test_country_index.rb +4 -4
- data/test/test_country_reader.rb +34 -4
- data/test/test_match_auto_relegation.rb +41 -0
- data/test/test_regex.rb +25 -7
- metadata +3 -2
| @@ -100,6 +100,9 @@ module SportDb | |
| 100 100 | 
             
                     ## optional headers - note: find_header returns nil if header NOT found
         | 
| 101 101 | 
             
                     header_stage = find_header( headers, ['Stage'] )
         | 
| 102 102 | 
             
                     headers_mapping[:stage]  =  header_stage   if header_stage
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                     header_league = find_header( headers, ['League'] )
         | 
| 105 | 
            +
                     headers_mapping[:league] = header_league   if header_league
         | 
| 103 106 | 
             
                  else
         | 
| 104 107 | 
             
                     ## else try footballdata.uk and others
         | 
| 105 108 | 
             
                     headers_mapping[:team1]  = find_header( headers, ['HomeTeam', 'HT', 'Home'] )
         | 
| @@ -167,7 +170,10 @@ module SportDb | |
| 167 170 |  | 
| 168 171 |  | 
| 169 172 | 
             
                  ## check if data present - if not skip (might be empty row)
         | 
| 170 | 
            -
                   | 
| 173 | 
            +
                  ##  note:  (old classic) csv reader returns nil for empty fields
         | 
| 174 | 
            +
                  ##         new modern csv reader ALWAYS returns strings (and empty strings for data not available (n/a))
         | 
| 175 | 
            +
                  if (team1.nil? || team1.empty?) &&
         | 
| 176 | 
            +
                     (team2.nil? || team2.empty?)
         | 
| 171 177 | 
             
                    puts "*** WARN: skipping empty? row[#{i}] - no teams found:"
         | 
| 172 178 | 
             
                    pp row
         | 
| 173 179 | 
             
                    next
         | 
| @@ -182,9 +188,11 @@ module SportDb | |
| 182 188 | 
             
                  col = row[ headers_mapping[ :date ]]
         | 
| 183 189 | 
             
                  col = col.strip   # make sure not leading or trailing spaces left over
         | 
| 184 190 |  | 
| 185 | 
            -
                  if col.empty? || | 
| 186 | 
            -
                      | 
| 187 | 
            -
                      | 
| 191 | 
            +
                  if col.empty? ||
         | 
| 192 | 
            +
                     col =~ /^-{1,}$/ ||      # e.g.  - or ---
         | 
| 193 | 
            +
                     col =~ /^\?{1,}$/        # e.g. ? or ???
         | 
| 194 | 
            +
                      ## note: allow missing / unknown date for match
         | 
| 195 | 
            +
                      date = nil
         | 
| 188 196 | 
             
                  else
         | 
| 189 197 | 
             
                    ## remove possible weekday or weeknumber  e.g. (Fri) (4) etc.
         | 
| 190 198 | 
             
                    col = col.sub( /\(W?\d{1,2}\)/, '' )  ## e.g. (W11), (4), (21) etc.
         | 
| @@ -199,6 +207,8 @@ module SportDb | |
| 199 207 | 
             
                      date_fmt = '%Y-%m-%d'   # e.g. 1995-08-04
         | 
| 200 208 | 
             
                    elsif col =~ /^\d{1,2} \w{3} \d{4}$/
         | 
| 201 209 | 
             
                      date_fmt = '%d %b %Y'   # e.g. 8 Jul 2017
         | 
| 210 | 
            +
                    elsif col =~ /^\w{3} \w{3} \d{1,2} \d{4}$/
         | 
| 211 | 
            +
                      date_fmt = '%a %b %d %Y'   # e.g. Sat Aug 7 1993
         | 
| 202 212 | 
             
                    else
         | 
| 203 213 | 
             
                      puts "*** !!! wrong (unknown) date format >>#{col}<<; cannot continue; fix it; sorry"
         | 
| 204 214 | 
             
                      ## todo/fix: add to errors/warns list - why? why not?
         | 
| @@ -283,13 +293,17 @@ module SportDb | |
| 283 293 | 
             
                             end
         | 
| 284 294 | 
             
                  end
         | 
| 285 295 |  | 
| 296 | 
            +
                  league = nil
         | 
| 297 | 
            +
                  league = row[ headers_mapping[ :league ]]   if headers_mapping[ :league ]
         | 
| 298 | 
            +
             | 
| 286 299 |  | 
| 287 300 | 
             
                  match = Import::Match.new( date:    date,
         | 
| 288 301 | 
             
                                             team1:   team1,   team2:   team2,
         | 
| 289 302 | 
             
                                             score1:  score1,  score2:  score2,
         | 
| 290 303 | 
             
                                             score1i: score1i, score2i: score2i,
         | 
| 291 304 | 
             
                                             round:   round,
         | 
| 292 | 
            -
                                             stage:   stage | 
| 305 | 
            +
                                             stage:   stage,
         | 
| 306 | 
            +
                                             league:  league )
         | 
| 293 307 | 
             
                  matches << match
         | 
| 294 308 | 
             
                end
         | 
| 295 309 |  | 
| @@ -4,31 +4,50 @@ module SportDb | |
| 4 4 |  | 
| 5 5 | 
             
                ## todo/fix:   make all regexes case-insensitive with /i option - why? why not?
         | 
| 6 6 | 
             
                ##                e.g. .TXT and .txt
         | 
| 7 | 
            +
                ##   yes!! use /i option!!!!!
         | 
| 7 8 |  | 
| 8 9 | 
             
                CONF_RE = %r{  (?: ^|/ )               # beginning (^) or beginning of path (/)
         | 
| 9 10 | 
             
                    \.conf\.txt$
         | 
| 10 11 | 
             
                }x
         | 
| 11 12 |  | 
| 13 | 
            +
                ## leagues.txt or leagues_en.txt
         | 
| 14 | 
            +
                ##   remove support for en.leagues.txt - why? why not?
         | 
| 12 15 | 
             
                LEAGUES_RE = %r{  (?: ^|/ )               # beginning (^) or beginning of path (/)
         | 
| 13 16 | 
             
                   (?: [a-z]{1,4}\. )?   # optional country code/key e.g. eng.clubs.wiki.txt
         | 
| 14 | 
            -
                    leagues | 
| 17 | 
            +
                    leagues
         | 
| 18 | 
            +
                      (?:_[a-z0-9_-]+)?
         | 
| 19 | 
            +
                    \.txt$
         | 
| 15 20 | 
             
                }x
         | 
| 16 21 |  | 
| 22 | 
            +
                ## clubs.txt or clubs_en.txt
         | 
| 23 | 
            +
                ##   remove support for en.clubs.txt - why? why not?
         | 
| 17 24 | 
             
                CLUBS_RE = %r{  (?: ^|/ )               # beginning (^) or beginning of path (/)
         | 
| 18 25 | 
             
                   (?: [a-z]{1,4}\. )?   # optional country code/key e.g. eng.clubs.txt
         | 
| 19 | 
            -
                    clubs | 
| 26 | 
            +
                    clubs
         | 
| 27 | 
            +
                      (?:_[a-z0-9_-]+)?
         | 
| 28 | 
            +
                    \.txt$
         | 
| 20 29 | 
             
                }x
         | 
| 21 30 |  | 
| 22 31 | 
             
                CLUBS_WIKI_RE = %r{  (?:^|/)               # beginning (^) or beginning of path (/)
         | 
| 23 32 | 
             
                    (?:[a-z]{1,4}\.)?   # optional country code/key e.g. eng.clubs.wiki.txt
         | 
| 24 | 
            -
                   clubs | 
| 33 | 
            +
                   clubs
         | 
| 34 | 
            +
                     (?:_[a-z0-9_-]+)?
         | 
| 35 | 
            +
                   \.wiki\.txt$
         | 
| 25 36 | 
             
                }x
         | 
| 26 37 |  | 
| 27 38 | 
             
                CLUB_PROPS_RE = %r{  (?: ^|/ )               # beginning (^) or beginning of path (/)
         | 
| 28 39 | 
             
                  (?: [a-z]{1,4}\. )?   # optional country code/key e.g. eng.clubs.props.txt
         | 
| 29 | 
            -
                    clubs | 
| 40 | 
            +
                    clubs
         | 
| 41 | 
            +
                      (?:_[a-z0-9_-]+)?
         | 
| 42 | 
            +
                    \.props\.txt$
         | 
| 30 43 | 
             
                }x
         | 
| 31 44 |  | 
| 45 | 
            +
                ##  teams.txt or teams_history.txt
         | 
| 46 | 
            +
                TEAMS_RE = %r{  (?: ^|/ )               # beginning (^) or beginning of path (/)
         | 
| 47 | 
            +
                                  teams
         | 
| 48 | 
            +
                                    (?:_[a-z0-9_-]+)?
         | 
| 49 | 
            +
                                  \.txt$
         | 
| 50 | 
            +
                }x
         | 
| 32 51 |  | 
| 33 52 | 
             
                ### season folder:
         | 
| 34 53 | 
             
                ##            e.g. /2019-20   or
         | 
| @@ -36,7 +55,7 @@ module SportDb | |
| 36 55 | 
             
                ##                 /2016--france
         | 
| 37 56 | 
             
                SEASON_RE = %r{ (?:
         | 
| 38 57 | 
             
                                   \d{4}-\d{2}
         | 
| 39 | 
            -
                                 | \d{4}(--[ | 
| 58 | 
            +
                                 | \d{4}(--[a-z0-9_-]+)?
         | 
| 40 59 | 
             
                                )
         | 
| 41 60 | 
             
                              }x
         | 
| 42 61 | 
             
                SEASON = SEASON_RE.source    ## "inline" helper for embedding in other regexes - keep? why? why not?
         | 
| @@ -54,6 +73,10 @@ module SportDb | |
| 54 73 | 
             
                                   /[a-z0-9_.-]+\.csv$  ## note: allow dot (.) too e.g /eng.1.csv
         | 
| 55 74 | 
             
                                }x
         | 
| 56 75 |  | 
| 76 | 
            +
                ### add "generic" pattern to find all csv datafiles
         | 
| 77 | 
            +
                CSV_RE = %r{ (?: ^|/ )
         | 
| 78 | 
            +
                               [a-z0-9_.-]+\.csv$  ## note: allow dot (.) too e.g /eng.1.csv
         | 
| 79 | 
            +
                           }x
         | 
| 57 80 |  | 
| 58 81 |  | 
| 59 82 | 
             
                ## move class-level "static" finders to DirPackage (do NOT work for now for zip packages) - why? why not?
         | 
| @@ -74,6 +97,8 @@ module SportDb | |
| 74 97 | 
             
               end
         | 
| 75 98 |  | 
| 76 99 |  | 
| 100 | 
            +
               def self.find_teams( path, pattern: TEAMS_RE )  find( path, pattern ); end
         | 
| 101 | 
            +
               def self.match_teams( path )  TEAMS_RE.match( path ); end
         | 
| 77 102 |  | 
| 78 103 | 
             
               def self.find_clubs( path, pattern: CLUBS_RE )            find( path, pattern ); end
         | 
| 79 104 | 
             
               def self.find_clubs_wiki( path, pattern: CLUBS_WIKI_RE )  find( path, pattern ); end
         | 
| @@ -97,7 +122,11 @@ module SportDb | |
| 97 122 | 
             
               end
         | 
| 98 123 | 
             
               ## add match_match and match_match_csv  - why? why not?
         | 
| 99 124 |  | 
| 125 | 
            +
             | 
| 100 126 | 
             
               class << self
         | 
| 127 | 
            +
                 alias_method :match_teams?, :match_teams
         | 
| 128 | 
            +
                 alias_method :teams?,       :match_teams
         | 
| 129 | 
            +
             | 
| 101 130 | 
             
                 alias_method :match_clubs?, :match_clubs
         | 
| 102 131 | 
             
                 alias_method :clubs?,       :match_clubs
         | 
| 103 132 |  | 
| @@ -188,6 +217,8 @@ module SportDb | |
| 188 217 | 
             
                  end
         | 
| 189 218 | 
             
                end
         | 
| 190 219 | 
             
                def each_match_csv( &blk )  each( pattern: MATCH_CSV_RE, &blk ); end
         | 
| 220 | 
            +
                def each_csv( &blk )        each( pattern: CSV_RE, &blk );       end
         | 
| 221 | 
            +
             | 
| 191 222 | 
             
                def each_club_props( &blk ) each( pattern: CLUB_PROPS_RE, &blk ); end
         | 
| 192 223 |  | 
| 193 224 | 
             
                def each_leagues( &blk )    each( pattern: LEAGUES_RE, &blk ); end
         | 
| @@ -18,10 +18,19 @@ module SportDb | |
| 18 18 |  | 
| 19 19 |  | 
| 20 20 | 
             
              def is_round?( line )
         | 
| 21 | 
            -
                ## note: =~  | 
| 22 | 
            -
             | 
| 21 | 
            +
                ## note: =~ returns nil if not match found, and 0,1, etc for match
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                ##  note: allow "free standing" leg 1 and leg 2 too
         | 
| 24 | 
            +
                ##         (e.g. Hinspiel, Rückspiel etc. used for now in Relegation, for example)
         | 
| 25 | 
            +
                ##    note ONLY allowed if "free standing", that is, full line with nothing else
         | 
| 26 | 
            +
                ##          use "custom" regex for special case for now
         | 
| 27 | 
            +
                ##               avoids match HIN in PascHINg, for example (hin in german for leg 1)
         | 
| 28 | 
            +
                line =~ SportDb.lang.regex_round    ||
         | 
| 29 | 
            +
                line =~ /^(#{SportDb.lang.leg1})$/i ||
         | 
| 30 | 
            +
                line =~ /^(#{SportDb.lang.leg2})$/i
         | 
| 23 31 | 
             
              end
         | 
| 24 32 |  | 
| 33 | 
            +
             | 
| 25 34 | 
             
              def is_knockout_round?( line )
         | 
| 26 35 |  | 
| 27 36 | 
             
                ## todo: check for adding ignore case for regex (e.g. 1st leg/1st Leg)
         | 
| @@ -90,6 +90,12 @@ class ScoreParser | |
| 90 90 |  | 
| 91 91 |  | 
| 92 92 | 
             
              def parse( line )
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                 ##########
         | 
| 95 | 
            +
                 ## todo/fix/check: add unicode to regular dash conversion - why? why not?
         | 
| 96 | 
            +
                 ##  e.g. – becomes -  (yes, the letters a different!!!)
         | 
| 97 | 
            +
                 #############
         | 
| 98 | 
            +
             | 
| 93 99 | 
             
                score = nil
         | 
| 94 100 | 
             
                @formats.each do |format|
         | 
| 95 101 | 
             
                  re = format[0]
         | 
| @@ -11,11 +11,14 @@ class Country | |
| 11 11 |  | 
| 12 12 | 
             
              ## note: is read-only/immutable for now - why? why not?
         | 
| 13 13 | 
             
              ##          add cities (array/list) - why? why not?
         | 
| 14 | 
            -
              attr_reader   :key, :name, : | 
| 14 | 
            +
              attr_reader   :key, :name, :code, :tags
         | 
| 15 15 | 
             
              attr_accessor :alt_names
         | 
| 16 16 |  | 
| 17 | 
            -
              def initialize( key | 
| 18 | 
            -
                 | 
| 17 | 
            +
              def initialize( key: nil, name:, code:, tags: [] )
         | 
| 18 | 
            +
                ## note: auto-generate key "on-the-fly" if missing for now - why? why not?
         | 
| 19 | 
            +
                ## note: quick hack - auto-generate key, that is, remove all non-ascii chars and downcase
         | 
| 20 | 
            +
                @key = key || name.downcase.gsub( /[^a-z]/, '' )
         | 
| 21 | 
            +
                @name, @code = name, code
         | 
| 19 22 | 
             
                @alt_names      = []
         | 
| 20 23 | 
             
                @tags           = tags
         | 
| 21 24 | 
             
              end
         | 
| @@ -2,20 +2,13 @@ module SportDb | |
| 2 2 | 
             
              module Import
         | 
| 3 3 |  | 
| 4 4 | 
             
                class Group
         | 
| 5 | 
            -
                  attr_reader | 
| 5 | 
            +
                  attr_reader :key, :name, :teams
         | 
| 6 6 |  | 
| 7 | 
            -
                   | 
| 8 | 
            -
             | 
| 9 | 
            -
                  ##    make start and end date optional
         | 
| 10 | 
            -
                  ##    change pos to num - why? why not?
         | 
| 11 | 
            -
                  ##    make pos/num optional too
         | 
| 12 | 
            -
                  ##
         | 
| 13 | 
            -
                  ##    sort round by scheduled/planed start date
         | 
| 14 | 
            -
                  def initialize( title:,
         | 
| 15 | 
            -
                                  pos:,
         | 
| 7 | 
            +
                  def initialize( key: nil,
         | 
| 8 | 
            +
                                  name:,
         | 
| 16 9 | 
             
                                  teams: )
         | 
| 17 | 
            -
                    @ | 
| 18 | 
            -
                    @ | 
| 10 | 
            +
                    @key    = key    ## e.g. A,B,C  or 1,2,3, - note: always a string or nil
         | 
| 11 | 
            +
                    @name   = name
         | 
| 19 12 | 
             
                    @teams  = teams
         | 
| 20 13 | 
             
                  end
         | 
| 21 14 | 
             
                end  # class Group
         | 
| @@ -20,7 +20,8 @@ class Match | |
| 20 20 | 
             
                          :group,
         | 
| 21 21 | 
             
                          :conf1,    :conf2,      ## special case for mls e.g. conference1, conference2 (e.g. west, east, central)
         | 
| 22 22 | 
             
                          :country1, :country2,    ## special case for champions league etc. - uses FIFA country code
         | 
| 23 | 
            -
                          :comments
         | 
| 23 | 
            +
                          :comments,
         | 
| 24 | 
            +
                          :league      ## (optinal) added as text for now (use struct?)
         | 
| 24 25 |  | 
| 25 26 | 
             
              def initialize( **kwargs )
         | 
| 26 27 | 
             
                update( kwargs )  unless kwargs.empty?
         | 
| @@ -47,6 +48,9 @@ class Match | |
| 47 48 | 
             
                @group    = kwargs[:group]    if kwargs.has_key? :group
         | 
| 48 49 | 
             
                @comments = kwargs[:comments] if kwargs.has_key? :comments
         | 
| 49 50 |  | 
| 51 | 
            +
                @league   = kwargs[:league]   if kwargs.has_key? :league
         | 
| 52 | 
            +
             | 
| 53 | 
            +
             | 
| 50 54 | 
             
                if kwargs.has_key?( :score )   ## check all-in-one score struct for convenience!!!
         | 
| 51 55 | 
             
                  score = kwargs[:score]
         | 
| 52 56 | 
             
                  if score.nil?   ## reset all score attribs to nil!!
         | 
| @@ -2,24 +2,17 @@ module SportDb | |
| 2 2 | 
             
              module Import
         | 
| 3 3 |  | 
| 4 4 | 
             
                class Round
         | 
| 5 | 
            -
                  attr_reader   : | 
| 6 | 
            -
                  attr_accessor : | 
| 5 | 
            +
                  attr_reader   :name, :start_date, :end_date, :knockout
         | 
| 6 | 
            +
                  attr_accessor :num   # note: make read & writable - why? why not?
         | 
| 7 7 |  | 
| 8 | 
            -
                   | 
| 9 | 
            -
             | 
| 10 | 
            -
                  ##    make start and end date optional
         | 
| 11 | 
            -
                  ##    change pos to num - why? why not?
         | 
| 12 | 
            -
                  ##    make pos/num optional too
         | 
| 13 | 
            -
                  ##
         | 
| 14 | 
            -
                  ##    sort round by scheduled/planed start date
         | 
| 15 | 
            -
                  def initialize( title:,
         | 
| 16 | 
            -
                                  pos: nil,
         | 
| 8 | 
            +
                  def initialize( name:,
         | 
| 9 | 
            +
                                  num: nil,
         | 
| 17 10 | 
             
                                  start_date: nil,
         | 
| 18 11 | 
             
                                  end_date: nil,
         | 
| 19 12 | 
             
                                  knockout: false,
         | 
| 20 13 | 
             
                                  auto: true )
         | 
| 21 | 
            -
                    @ | 
| 22 | 
            -
                    @ | 
| 14 | 
            +
                    @name       = name
         | 
| 15 | 
            +
                    @num        = num
         | 
| 23 16 | 
             
                    @start_date = start_date
         | 
| 24 17 | 
             
                    @end_date   = end_date
         | 
| 25 18 | 
             
                    @knockout   = knockout
         | 
| @@ -12,7 +12,7 @@ module SportDb | |
| 12 12 |  | 
| 13 13 | 
             
            class Standings
         | 
| 14 14 |  | 
| 15 | 
            -
              class StandingsLine     ## nested class StandinsLine
         | 
| 15 | 
            +
              class StandingsLine     ## nested class StandinsLine - todo/fix: change to Line - why? why not?
         | 
| 16 16 | 
             
                attr_accessor  :rank, :team,
         | 
| 17 17 | 
             
                               :played, :won, :lost, :drawn,                      ## -- total
         | 
| 18 18 | 
             
                               :goals_for, :goals_against, :pts,
         | 
| @@ -21,8 +21,13 @@ class Standings | |
| 21 21 | 
             
                               :away_played, :away_won, :away_lost, :away_drawn,  ## -- away
         | 
| 22 22 | 
             
                               :away_goals_for, :away_goals_against, :away_pts
         | 
| 23 23 |  | 
| 24 | 
            +
                 alias_method :team_name, :team     ## note: team for now always a string
         | 
| 25 | 
            +
                 alias_method :pos,       :rank     ##  rename back to use pos instead of rank - why? why not?
         | 
| 26 | 
            +
             | 
| 27 | 
            +
             | 
| 24 28 | 
             
                def initialize( team )
         | 
| 25 29 | 
             
                  @rank = nil # use 0? why? why not?
         | 
| 30 | 
            +
                  ## change rank back to pos - why? why not?
         | 
| 26 31 | 
             
                  @team = team
         | 
| 27 32 | 
             
                  @played = @home_played = @away_played = 0
         | 
| 28 33 | 
             
                  @won    = @home_won    = @away_won    = 0
         | 
| @@ -49,7 +54,12 @@ class Standings | |
| 49 54 |  | 
| 50 55 | 
             
              def update( match_or_matches )
         | 
| 51 56 | 
             
                ## convenience - update all matches at once
         | 
| 52 | 
            -
                 | 
| 57 | 
            +
                ## todo/check:  check for ActiveRecord_Associations_CollectionProxy and than use to_a (to "force" array) - why? why not?
         | 
| 58 | 
            +
                matches = if match_or_matches.is_a?(Array)
         | 
| 59 | 
            +
                            match_or_matches
         | 
| 60 | 
            +
                          else
         | 
| 61 | 
            +
                            [match_or_matches]
         | 
| 62 | 
            +
                          end
         | 
| 53 63 |  | 
| 54 64 | 
             
                matches.each_with_index do |match,i| # note: index(i) starts w/ zero (0)
         | 
| 55 65 | 
             
                  update_match( match )
         | 
| @@ -171,19 +181,30 @@ class Standings | |
| 171 181 | 
             
            private
         | 
| 172 182 | 
             
              def update_match( m )   ## add a match
         | 
| 173 183 |  | 
| 174 | 
            -
                ## | 
| 184 | 
            +
                ## note: always use team as string for now
         | 
| 185 | 
            +
                ##   for now allow passing in of string OR struct - why? why not?
         | 
| 186 | 
            +
                ##   todo/fix:  change to m.team1_name and m.team2_name - why? why not?
         | 
| 187 | 
            +
                team1 = m.team1.is_a?( String ) ? m.team1 : m.team1.name
         | 
| 188 | 
            +
                team2 = m.team2.is_a?( String ) ? m.team2 : m.team2.name
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                score = m.score_str
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                ##  puts "   #{team1} - #{team2} #{score}"
         | 
| 193 | 
            +
             | 
| 175 194 | 
             
                unless m.over?
         | 
| 176 | 
            -
                  puts " !!!! skipping match - not yet over ( | 
| 195 | 
            +
                  puts " !!!! skipping match - not yet over (date in the future) => #{m.date}"
         | 
| 177 196 | 
             
                  return
         | 
| 178 197 | 
             
                end
         | 
| 179 198 |  | 
| 180 199 | 
             
                unless m.complete?
         | 
| 181 | 
            -
                  puts "!!! [calc_standings] skipping match #{ | 
| 200 | 
            +
                  puts "!!! [calc_standings] skipping match #{team1} - #{team2} w/ past date #{m.date} - scores incomplete => #{score}"
         | 
| 182 201 | 
             
                  return
         | 
| 183 202 | 
             
                end
         | 
| 184 203 |  | 
| 185 | 
            -
             | 
| 186 | 
            -
             | 
| 204 | 
            +
             | 
| 205 | 
            +
             | 
| 206 | 
            +
                line1 = @lines[ team1 ] || StandingsLine.new( team1 )
         | 
| 207 | 
            +
                line2 = @lines[ team2 ] || StandingsLine.new( team2 )
         | 
| 187 208 |  | 
| 188 209 | 
             
                line1.played      += 1
         | 
| 189 210 | 
             
                line1.home_played += 1
         | 
| @@ -236,8 +257,8 @@ private | |
| 236 257 | 
             
                  puts "*** warn: [standings] skipping match with missing scores: #{m.inspect}"
         | 
| 237 258 | 
             
                end
         | 
| 238 259 |  | 
| 239 | 
            -
                @lines[  | 
| 240 | 
            -
                @lines[  | 
| 260 | 
            +
                @lines[ team1 ] = line1
         | 
| 261 | 
            +
                @lines[ team2 ] = line2
         | 
| 241 262 | 
             
              end  # method update_match
         | 
| 242 263 |  | 
| 243 264 | 
             
            end  # class Standings
         | 
| @@ -11,10 +11,9 @@ class Team | |
| 11 11 | 
             
              ##  todo: use just names for alt_names - why? why not?
         | 
| 12 12 | 
             
              attr_accessor :key, :name, :alt_names,
         | 
| 13 13 | 
             
                            :code,    ## code == abbreviation e.g. ARS etc.
         | 
| 14 | 
            -
                            :year, :year_end,   ## todo/fix: change year_end to end_year (like in season)!!!
         | 
| 14 | 
            +
                            :year, :year_end,   ## todo/fix: change year to start_year and year_end to end_year (like in season)!!!
         | 
| 15 15 | 
             
                            :country
         | 
| 16 16 |  | 
| 17 | 
            -
              alias_method :title, :name  ## add alias/compat - why? why not
         | 
| 18 17 |  | 
| 19 18 | 
             
              def names
         | 
| 20 19 | 
             
                ## todo/check: add alt_names_auto too? - why? why not?
         | 
    
        data/test/helper.rb
    CHANGED
    
    
    
        data/test/test_country_index.rb
    CHANGED
    
    | @@ -16,12 +16,12 @@ class TestCountryIndex < MiniTest::Test | |
| 16 16 | 
             
                eng = countries[:eng]
         | 
| 17 17 | 
             
                assert_equal 'eng',      eng.key
         | 
| 18 18 | 
             
                assert_equal 'England',  eng.name
         | 
| 19 | 
            -
                assert_equal 'ENG',      eng. | 
| 19 | 
            +
                assert_equal 'ENG',      eng.code
         | 
| 20 20 |  | 
| 21 21 | 
             
                at  = countries[:at]
         | 
| 22 22 | 
             
                assert_equal 'at',                at.key
         | 
| 23 23 | 
             
                assert_equal 'Austria',           at.name
         | 
| 24 | 
            -
                assert_equal 'AUT',               at. | 
| 24 | 
            +
                assert_equal 'AUT',               at.code
         | 
| 25 25 | 
             
                assert_equal ['Österreich [de]'], at.alt_names
         | 
| 26 26 |  | 
| 27 27 | 
             
                assert at == countries['AT']
         | 
| @@ -48,13 +48,13 @@ class TestCountryIndex < MiniTest::Test | |
| 48 48 | 
             
                assert at == countries.parse( 'Österreich • Austria' )
         | 
| 49 49 | 
             
                assert at == countries.parse( 'Austria' )
         | 
| 50 50 | 
             
                assert at == countries.parse( 'at' )    ## (iso alpha2) country code
         | 
| 51 | 
            -
                assert at == countries.parse( 'AUT' )   ## fifa code
         | 
| 51 | 
            +
                assert at == countries.parse( 'AUT' )   ## (fifa) country code
         | 
| 52 52 |  | 
| 53 53 |  | 
| 54 54 | 
             
                de  = countries[:de]
         | 
| 55 55 | 
             
                assert_equal 'de',                 de.key
         | 
| 56 56 | 
             
                assert_equal 'Germany',            de.name
         | 
| 57 | 
            -
                assert_equal 'GER',                de. | 
| 57 | 
            +
                assert_equal 'GER',                de.code
         | 
| 58 58 | 
             
                assert_equal ['Deutschland [de]'], de.alt_names
         | 
| 59 59 |  | 
| 60 60 | 
             
                assert de == countries.parse( 'Deutschland (de) • Germany' )
         | 
    
        data/test/test_country_reader.rb
    CHANGED
    
    | @@ -16,12 +16,12 @@ class TestCountryReader < MiniTest::Test | |
| 16 16 | 
             
                assert_equal 232, recs.size
         | 
| 17 17 |  | 
| 18 18 | 
             
                assert_equal 'Albania',        recs[0].name
         | 
| 19 | 
            -
                assert_equal 'ALB',            recs[0]. | 
| 19 | 
            +
                assert_equal 'ALB',            recs[0].code
         | 
| 20 20 | 
             
                assert_equal 'al',             recs[0].key
         | 
| 21 21 | 
             
                assert_equal ['fifa', 'uefa'], recs[0].tags
         | 
| 22 22 |  | 
| 23 23 | 
             
                assert_equal 'Andorra',        recs[1].name
         | 
| 24 | 
            -
                assert_equal 'AND',            recs[1]. | 
| 24 | 
            +
                assert_equal 'AND',            recs[1].code
         | 
| 25 25 | 
             
                assert_equal 'ad',             recs[1].key
         | 
| 26 26 | 
             
                assert_equal ['fifa', 'uefa'], recs[1].tags
         | 
| 27 27 | 
             
              end
         | 
| @@ -44,16 +44,46 @@ TXT | |
| 44 44 |  | 
| 45 45 | 
             
                assert_equal 4, recs.size
         | 
| 46 46 | 
             
                assert_equal 'Afghanistan',    recs[0].name
         | 
| 47 | 
            -
                assert_equal 'AFG',            recs[0]. | 
| 47 | 
            +
                assert_equal 'AFG',            recs[0].code
         | 
| 48 48 | 
             
                assert_equal 'af',             recs[0].key
         | 
| 49 49 | 
             
                assert_equal [],               recs[0].alt_names
         | 
| 50 50 | 
             
                assert_equal ['fifa', 'afc'],  recs[0].tags
         | 
| 51 51 |  | 
| 52 52 | 
             
                assert_equal 'American Samoa', recs[3].name
         | 
| 53 | 
            -
                assert_equal 'ASA',            recs[3]. | 
| 53 | 
            +
                assert_equal 'ASA',            recs[3].code
         | 
| 54 54 | 
             
                assert_equal 'as',             recs[3].key
         | 
| 55 55 | 
             
                assert_equal ['Am. Samoa'],    recs[3].alt_names
         | 
| 56 56 | 
             
                assert_equal [],               recs[3].tags
         | 
| 57 57 | 
             
              end
         | 
| 58 58 |  | 
| 59 | 
            +
              def test_parse_historic
         | 
| 60 | 
            +
                recs = SportDb::Import::CountryReader.parse( <<TXT )
         | 
| 61 | 
            +
            ###########################################
         | 
| 62 | 
            +
            # Former national teams
         | 
| 63 | 
            +
            #   with former FIFA country codes etc.
         | 
| 64 | 
            +
            -1992   Czechoslovakia, TCH      ⇒  Czech Republic
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            -1991   Soviet Union,   URS      ⇒  Russia
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            -1989   West Germany,   FRG      =>  Germany
         | 
| 69 | 
            +
            -1989   East Germany,   GDR      =>  Germany
         | 
| 70 | 
            +
            TXT
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                pp recs
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                assert_equal 4, recs.size
         | 
| 75 | 
            +
                assert_equal 'Czechoslovakia (-1992)', recs[0].name
         | 
| 76 | 
            +
                assert_equal 'TCH',                    recs[0].code
         | 
| 77 | 
            +
                assert_equal 'czechoslovakia',         recs[0].key
         | 
| 78 | 
            +
                assert_equal [],                       recs[0].alt_names
         | 
| 79 | 
            +
                assert_equal [],                       recs[0].tags
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                assert_equal 'East Germany (-1989)',   recs[3].name
         | 
| 82 | 
            +
                assert_equal 'GDR',                    recs[3].code
         | 
| 83 | 
            +
                assert_equal 'eastgermany',            recs[3].key
         | 
| 84 | 
            +
                assert_equal [],                       recs[3].alt_names
         | 
| 85 | 
            +
                assert_equal [],                       recs[3].tags
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
             | 
| 59 89 | 
             
            end # class TestCountryReader
         |