sportdb-formats 2.0.1 → 2.1.0
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/CHANGELOG.md +1 -1
 - data/Manifest.txt +2 -19
 - data/Rakefile +2 -7
 - data/bin/fbchk +166 -0
 - data/lib/sportdb/formats/quick_match_linter.rb +195 -0
 - data/lib/sportdb/formats/version.rb +2 -2
 - data/lib/sportdb/formats.rb +10 -269
 - metadata +10 -82
 - data/lib/sportdb/formats/country/country_reader.rb +0 -142
 - data/lib/sportdb/formats/csv/goal.rb +0 -192
 - data/lib/sportdb/formats/csv/goal_parser_csv.rb +0 -28
 - data/lib/sportdb/formats/csv/match_parser_csv.rb +0 -490
 - data/lib/sportdb/formats/csv/match_status_parser.rb +0 -90
 - data/lib/sportdb/formats/datafile.rb +0 -59
 - data/lib/sportdb/formats/event/event_reader.rb +0 -119
 - data/lib/sportdb/formats/ground/ground_reader.rb +0 -289
 - data/lib/sportdb/formats/league/league_outline_reader.rb +0 -176
 - data/lib/sportdb/formats/league/league_reader.rb +0 -152
 - data/lib/sportdb/formats/match/conf_parser.rb +0 -132
 - data/lib/sportdb/formats/match/match_parser.rb +0 -733
 - data/lib/sportdb/formats/search/sport.rb +0 -372
 - data/lib/sportdb/formats/search/structs.rb +0 -116
 - data/lib/sportdb/formats/search/world.rb +0 -157
 - data/lib/sportdb/formats/team/club_reader.rb +0 -318
 - data/lib/sportdb/formats/team/club_reader_history.rb +0 -203
 - data/lib/sportdb/formats/team/club_reader_props.rb +0 -90
 - data/lib/sportdb/formats/team/wiki_reader.rb +0 -108
 
| 
         @@ -1,372 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ###
         
     | 
| 
       2 
     | 
    
         
            -
            #  sport search service api for leagues, clubs and more
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
     | 
    
         
            -
            # core api is:
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            class SportSearch
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            class Search    ## base search service - use/keep - why? why not?
         
     | 
| 
       10 
     | 
    
         
            -
              def initialize( service ) @service = service; end
         
     | 
| 
       11 
     | 
    
         
            -
            end  # class Search
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            class PlayerSearch < Search
         
     | 
| 
       15 
     | 
    
         
            -
              ###################
         
     | 
| 
       16 
     | 
    
         
            -
              ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       17 
     | 
    
         
            -
              def match_by( name:, country: nil, year: nil )
         
     | 
| 
       18 
     | 
    
         
            -
                @service.match_by( name:    name,
         
     | 
| 
       19 
     | 
    
         
            -
                                   country: country,
         
     | 
| 
       20 
     | 
    
         
            -
                                   year:    year )
         
     | 
| 
       21 
     | 
    
         
            -
              end
         
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
              ###############
         
     | 
| 
       24 
     | 
    
         
            -
              ### more deriv support functions / helpers
         
     | 
| 
       25 
     | 
    
         
            -
              def match( name ) match_by( name: name ); end
         
     | 
| 
       26 
     | 
    
         
            -
              ## add more here - why? why not?
         
     | 
| 
       27 
     | 
    
         
            -
            end   # class PlayerSearch
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
            class LeagueSearch < Search
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
              ###################
         
     | 
| 
       33 
     | 
    
         
            -
              ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       34 
     | 
    
         
            -
              def match_by( name: nil, code: nil, country: nil )
         
     | 
| 
       35 
     | 
    
         
            -
                 ## todo/fix upstream - remove "generic" match_by() - why? why not?
         
     | 
| 
       36 
     | 
    
         
            -
                 ###
         
     | 
| 
       37 
     | 
    
         
            -
                 if code && name.nil?
         
     | 
| 
       38 
     | 
    
         
            -
                  @service.match_by_code( code, country: country )
         
     | 
| 
       39 
     | 
    
         
            -
                elsif name && code.nil?
         
     | 
| 
       40 
     | 
    
         
            -
                  @service.match_by_name( name, country: country )
         
     | 
| 
       41 
     | 
    
         
            -
                else
         
     | 
| 
       42 
     | 
    
         
            -
                  raise ArgumentError, "LeagueSearch#match_by - one (and only one arg) required - code: or name:"
         
     | 
| 
       43 
     | 
    
         
            -
                end
         
     | 
| 
       44 
     | 
    
         
            -
                ## @service.match_by( name: name,
         
     | 
| 
       45 
     | 
    
         
            -
                ##                   country: country )
         
     | 
| 
       46 
     | 
    
         
            -
              end
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
              ## all-in-one query (name or code)
         
     | 
| 
       49 
     | 
    
         
            -
              def match( q, country: nil )
         
     | 
| 
       50 
     | 
    
         
            -
                 @service.match_by_name_or_code( q, country: country )
         
     | 
| 
       51 
     | 
    
         
            -
              end
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
              ###############
         
     | 
| 
       55 
     | 
    
         
            -
              ### more deriv support functions / helpers
         
     | 
| 
       56 
     | 
    
         
            -
              def find!( q )
         
     | 
| 
       57 
     | 
    
         
            -
                league = find( q )
         
     | 
| 
       58 
     | 
    
         
            -
                if league.nil?
         
     | 
| 
       59 
     | 
    
         
            -
                  puts "** !!! ERROR - no league match found for >#{q}<, add to leagues table; sorry"
         
     | 
| 
       60 
     | 
    
         
            -
                  exit 1
         
     | 
| 
       61 
     | 
    
         
            -
                end
         
     | 
| 
       62 
     | 
    
         
            -
                league
         
     | 
| 
       63 
     | 
    
         
            -
              end
         
     | 
| 
       64 
     | 
    
         
            -
             
     | 
| 
       65 
     | 
    
         
            -
              def find( q )
         
     | 
| 
       66 
     | 
    
         
            -
                league = nil
         
     | 
| 
       67 
     | 
    
         
            -
                recs = match( q )
         
     | 
| 
       68 
     | 
    
         
            -
                # pp m
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                if recs.empty?
         
     | 
| 
       71 
     | 
    
         
            -
                  ## fall through/do nothing
         
     | 
| 
       72 
     | 
    
         
            -
                elsif recs.size > 1
         
     | 
| 
       73 
     | 
    
         
            -
                  puts "** !!! ERROR - ambigious league query; too many leagues (#{recs.size}) found:"
         
     | 
| 
       74 
     | 
    
         
            -
                  pp recs
         
     | 
| 
       75 
     | 
    
         
            -
                  exit 1
         
     | 
| 
       76 
     | 
    
         
            -
                else
         
     | 
| 
       77 
     | 
    
         
            -
                  league = recs[0]
         
     | 
| 
       78 
     | 
    
         
            -
                end
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                league
         
     | 
| 
       81 
     | 
    
         
            -
              end
         
     | 
| 
       82 
     | 
    
         
            -
            end # class LeagueSearch
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
            class GroundSearch  < Search
         
     | 
| 
       87 
     | 
    
         
            -
              ###################
         
     | 
| 
       88 
     | 
    
         
            -
              ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       89 
     | 
    
         
            -
              def match_by( name:, country: nil, city: nil )
         
     | 
| 
       90 
     | 
    
         
            -
                @service.match_by( name:    name,
         
     | 
| 
       91 
     | 
    
         
            -
                                   country: country,
         
     | 
| 
       92 
     | 
    
         
            -
                                   city:    city )
         
     | 
| 
       93 
     | 
    
         
            -
              end
         
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
              ###############
         
     | 
| 
       96 
     | 
    
         
            -
              ### more deriv support functions / helpers
         
     | 
| 
       97 
     | 
    
         
            -
              def match( name ) match_by( name: name ); end
         
     | 
| 
       98 
     | 
    
         
            -
              ## add more here - why? why not?
         
     | 
| 
       99 
     | 
    
         
            -
            end  # class GroundSearch
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
     | 
    
         
            -
             
     | 
| 
       102 
     | 
    
         
            -
             
     | 
| 
       103 
     | 
    
         
            -
            class NationalTeamSearch  < Search
         
     | 
| 
       104 
     | 
    
         
            -
              ###################
         
     | 
| 
       105 
     | 
    
         
            -
              ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       106 
     | 
    
         
            -
             
     | 
| 
       107 
     | 
    
         
            -
              ## changle core api to match( q ) only - why? why not?
         
     | 
| 
       108 
     | 
    
         
            -
              ##   and make find and find! derivs???
         
     | 
| 
       109 
     | 
    
         
            -
              def find( q )    @service.find( q ); end
         
     | 
| 
       110 
     | 
    
         
            -
              def find!( q )   @service.find!( q ); end
         
     | 
| 
       111 
     | 
    
         
            -
            end # class NationalTeamSearch
         
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
            class ClubSearch  < Search
         
     | 
| 
       115 
     | 
    
         
            -
              ###################
         
     | 
| 
       116 
     | 
    
         
            -
              ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       117 
     | 
    
         
            -
             
     | 
| 
       118 
     | 
    
         
            -
              ## add mods here - why? why not?
         
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
              def match_by( name:, country: nil,
         
     | 
| 
       121 
     | 
    
         
            -
                                   league:  nil,
         
     | 
| 
       122 
     | 
    
         
            -
                                   mods:    nil )
         
     | 
| 
       123 
     | 
    
         
            -
                ## for now assume "global" mods  - checks only for name
         
     | 
| 
       124 
     | 
    
         
            -
                ##
         
     | 
| 
       125 
     | 
    
         
            -
                if mods && mods[ name ]
         
     | 
| 
       126 
     | 
    
         
            -
                  club = mods[ name ]
         
     | 
| 
       127 
     | 
    
         
            -
                  return [club]   # note: wrap (single record) in array
         
     | 
| 
       128 
     | 
    
         
            -
                end
         
     | 
| 
       129 
     | 
    
         
            -
             
     | 
| 
       130 
     | 
    
         
            -
                ## note: add "auto-magic" country calculation via league record
         
     | 
| 
       131 
     | 
    
         
            -
                ##            if league is a national league for football clubs
         
     | 
| 
       132 
     | 
    
         
            -
                if league
         
     | 
| 
       133 
     | 
    
         
            -
                    raise ArgumentError, "match_by - league AND country NOT supported; sorry"  if country
         
     | 
| 
       134 
     | 
    
         
            -
            ### find countries via league
         
     | 
| 
       135 
     | 
    
         
            -
            ###     support league.intl? too - why? why not?
         
     | 
| 
       136 
     | 
    
         
            -
            ###       or only nationa league
         
     | 
| 
       137 
     | 
    
         
            -
                    raise ArgumentError, "match_by - league - only national club leagues supported (not int'l or national teams for now); sorry"   unless league.national? && league.clubs?
         
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
       139 
     | 
    
         
            -
                    ### calc countries
         
     | 
| 
       140 
     | 
    
         
            -
                    ### uses "global" func in sports-catalogs for now
         
     | 
| 
       141 
     | 
    
         
            -
                    ##   move code here - why? why not?
         
     | 
| 
       142 
     | 
    
         
            -
                    country = find_countries_for_league( league )
         
     | 
| 
       143 
     | 
    
         
            -
                    @service.match_by( name:    name,
         
     | 
| 
       144 
     | 
    
         
            -
                                       country: country )
         
     | 
| 
       145 
     | 
    
         
            -
                else
         
     | 
| 
       146 
     | 
    
         
            -
                    @service.match_by( name:    name,
         
     | 
| 
       147 
     | 
    
         
            -
                                       country: country )
         
     | 
| 
       148 
     | 
    
         
            -
                end
         
     | 
| 
       149 
     | 
    
         
            -
              end
         
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
              ## todo/fix/check: use rename to find_canon  or find_canonical() or something??
         
     | 
| 
       153 
     | 
    
         
            -
              ##  remove (getting used?) - why? why not?
         
     | 
| 
       154 
     | 
    
         
            -
              # def []( name )    ## lookup by canoncial name only;  todo/fix: add find alias why? why not?
         
     | 
| 
       155 
     | 
    
         
            -
              #  puts "WARN!! do not use ClubIndex#[] for lookup >#{name}< - will get removed!!!"
         
     | 
| 
       156 
     | 
    
         
            -
              #  @clubs[ name ]
         
     | 
| 
       157 
     | 
    
         
            -
              # end
         
     | 
| 
       158 
     | 
    
         
            -
             
     | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
       160 
     | 
    
         
            -
              ###############
         
     | 
| 
       161 
     | 
    
         
            -
              ### more deriv support functions / helpers
         
     | 
| 
       162 
     | 
    
         
            -
              def match( name ) match_by( name: name ); end
         
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
              ##########
         
     | 
| 
       165 
     | 
    
         
            -
              #  "legacy" finders - return zero or one club
         
     | 
| 
       166 
     | 
    
         
            -
              ##    (if more than one match, exit/raise error/exception)
         
     | 
| 
       167 
     | 
    
         
            -
              def find( name )   find_by( name: name ); end
         
     | 
| 
       168 
     | 
    
         
            -
              def find!( name )  find_by!( name: name ); end
         
     | 
| 
       169 
     | 
    
         
            -
             
     | 
| 
       170 
     | 
    
         
            -
              ## find - always returns a single record / match or nil
         
     | 
| 
       171 
     | 
    
         
            -
              ##   if there is more than one match than find aborts / fails
         
     | 
| 
       172 
     | 
    
         
            -
              def find_by!( name:, country: nil,
         
     | 
| 
       173 
     | 
    
         
            -
                                   league:  nil )    ## todo/fix: add international or league flag?
         
     | 
| 
       174 
     | 
    
         
            -
                club = find_by( name:    name,
         
     | 
| 
       175 
     | 
    
         
            -
                                country: country,
         
     | 
| 
       176 
     | 
    
         
            -
                                league:  league )
         
     | 
| 
       177 
     | 
    
         
            -
             
     | 
| 
       178 
     | 
    
         
            -
                if club.nil?
         
     | 
| 
       179 
     | 
    
         
            -
                  puts "** !!! ERROR - no match for club >#{name}<"
         
     | 
| 
       180 
     | 
    
         
            -
                  exit 1
         
     | 
| 
       181 
     | 
    
         
            -
                end
         
     | 
| 
       182 
     | 
    
         
            -
             
     | 
| 
       183 
     | 
    
         
            -
                club
         
     | 
| 
       184 
     | 
    
         
            -
              end
         
     | 
| 
       185 
     | 
    
         
            -
             
     | 
| 
       186 
     | 
    
         
            -
             
     | 
| 
       187 
     | 
    
         
            -
              def find_by( name:, country: nil,
         
     | 
| 
       188 
     | 
    
         
            -
                                  league:  nil )    ## todo/fix: add international or league flag?
         
     | 
| 
       189 
     | 
    
         
            -
                ## note: allow passing in of country key too (auto-counvert)
         
     | 
| 
       190 
     | 
    
         
            -
                ##       and country struct too
         
     | 
| 
       191 
     | 
    
         
            -
                ##     - country assumes / allows the country key or fifa code for now
         
     | 
| 
       192 
     | 
    
         
            -
                recs = match_by( name:    name,
         
     | 
| 
       193 
     | 
    
         
            -
                                 country: country,
         
     | 
| 
       194 
     | 
    
         
            -
                                 league:  league )
         
     | 
| 
       195 
     | 
    
         
            -
             
     | 
| 
       196 
     | 
    
         
            -
                club = nil
         
     | 
| 
       197 
     | 
    
         
            -
                if recs.empty?
         
     | 
| 
       198 
     | 
    
         
            -
                  ## puts "** !!! WARN !!! no match for club >#{name}<"
         
     | 
| 
       199 
     | 
    
         
            -
                elsif recs.size > 1
         
     | 
| 
       200 
     | 
    
         
            -
                  puts "** !!! ERROR - too many matches (#{recs.size}) for club >#{name}<:"
         
     | 
| 
       201 
     | 
    
         
            -
                  pp recs
         
     | 
| 
       202 
     | 
    
         
            -
                  exit 1
         
     | 
| 
       203 
     | 
    
         
            -
                else   # bingo; match - assume size == 1
         
     | 
| 
       204 
     | 
    
         
            -
                  club = recs[0]
         
     | 
| 
       205 
     | 
    
         
            -
                end
         
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
       207 
     | 
    
         
            -
                club
         
     | 
| 
       208 
     | 
    
         
            -
              end
         
     | 
| 
       209 
     | 
    
         
            -
             
     | 
| 
       210 
     | 
    
         
            -
             
     | 
| 
       211 
     | 
    
         
            -
            #######
         
     | 
| 
       212 
     | 
    
         
            -
            # more support methods
         
     | 
| 
       213 
     | 
    
         
            -
              def build_mods( mods )
         
     | 
| 
       214 
     | 
    
         
            -
                ## e.g.
         
     | 
| 
       215 
     | 
    
         
            -
                ##  { 'Arsenal   | Arsenal FC'    => 'Arsenal, ENG',
         
     | 
| 
       216 
     | 
    
         
            -
                ##    'Liverpool | Liverpool FC'  => 'Liverpool, ENG',
         
     | 
| 
       217 
     | 
    
         
            -
                ##    'Barcelona'                 => 'Barcelona, ESP',
         
     | 
| 
       218 
     | 
    
         
            -
                ##    'Valencia'                  => 'Valencia, ESP' }
         
     | 
| 
       219 
     | 
    
         
            -
             
     | 
| 
       220 
     | 
    
         
            -
                mods.reduce({}) do |h,(club_names, club_line)|
         
     | 
| 
       221 
     | 
    
         
            -
             
     | 
| 
       222 
     | 
    
         
            -
                  values = club_line.split( ',' )
         
     | 
| 
       223 
     | 
    
         
            -
                  values = values.map { |value| value.strip }  ## strip all spaces
         
     | 
| 
       224 
     | 
    
         
            -
             
     | 
| 
       225 
     | 
    
         
            -
                  ## todo/fix: make sure country is present !!!!
         
     | 
| 
       226 
     | 
    
         
            -
                  club_name, country_name = values
         
     | 
| 
       227 
     | 
    
         
            -
                  club = find_by!( name: club_name, country: country_name )
         
     | 
| 
       228 
     | 
    
         
            -
             
     | 
| 
       229 
     | 
    
         
            -
                  values = club_names.split( '|' )
         
     | 
| 
       230 
     | 
    
         
            -
                  values = values.map { |value| value.strip }  ## strip all spaces
         
     | 
| 
       231 
     | 
    
         
            -
             
     | 
| 
       232 
     | 
    
         
            -
                  values.each do |club_name|
         
     | 
| 
       233 
     | 
    
         
            -
                    h[club_name] = club
         
     | 
| 
       234 
     | 
    
         
            -
                  end
         
     | 
| 
       235 
     | 
    
         
            -
                  h
         
     | 
| 
       236 
     | 
    
         
            -
                end
         
     | 
| 
       237 
     | 
    
         
            -
              end
         
     | 
| 
       238 
     | 
    
         
            -
            end # class ClubSearch
         
     | 
| 
       239 
     | 
    
         
            -
             
     | 
| 
       240 
     | 
    
         
            -
             
     | 
| 
       241 
     | 
    
         
            -
             
     | 
| 
       242 
     | 
    
         
            -
            ## todo/check - change to EventInfoSearch - why? why not?
         
     | 
| 
       243 
     | 
    
         
            -
            class EventSearch < Search
         
     | 
| 
       244 
     | 
    
         
            -
              ##
         
     | 
| 
       245 
     | 
    
         
            -
              ## todo - eventinfo search still open / up for change
         
     | 
| 
       246 
     | 
    
         
            -
             
     | 
| 
       247 
     | 
    
         
            -
              ###################
         
     | 
| 
       248 
     | 
    
         
            -
              ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       249 
     | 
    
         
            -
              def seasons( league )
         
     | 
| 
       250 
     | 
    
         
            -
                  @service.seasons( league )
         
     | 
| 
       251 
     | 
    
         
            -
              end
         
     | 
| 
       252 
     | 
    
         
            -
              def find_by( league:, season: )
         
     | 
| 
       253 
     | 
    
         
            -
                  @service.find_by( league: league,
         
     | 
| 
       254 
     | 
    
         
            -
                                    season: season )
         
     | 
| 
       255 
     | 
    
         
            -
              end
         
     | 
| 
       256 
     | 
    
         
            -
            end # class EventSearch
         
     | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
       258 
     | 
    
         
            -
             
     | 
| 
       259 
     | 
    
         
            -
            ####
         
     | 
| 
       260 
     | 
    
         
            -
            ## virtual table for season lookup
         
     | 
| 
       261 
     | 
    
         
            -
            ##   note - use EventSeaon  to avoid name conflict with (global) Season class
         
     | 
| 
       262 
     | 
    
         
            -
            ##      find a better name SeasonInfo or SeasonFinder or SeasonStore
         
     | 
| 
       263 
     | 
    
         
            -
            ##                       or SeasonQ or ??
         
     | 
| 
       264 
     | 
    
         
            -
            class EventSeasonSearch
         
     | 
| 
       265 
     | 
    
         
            -
                def initialize( events: )
         
     | 
| 
       266 
     | 
    
         
            -
                    @events = events
         
     | 
| 
       267 
     | 
    
         
            -
                end
         
     | 
| 
       268 
     | 
    
         
            -
             
     | 
| 
       269 
     | 
    
         
            -
              ###############
         
     | 
| 
       270 
     | 
    
         
            -
              ## todo/fix:  find a better algo to guess season for date!!!
         
     | 
| 
       271 
     | 
    
         
            -
              ##
         
     | 
| 
       272 
     | 
    
         
            -
              def find_by( date:, league: )
         
     | 
| 
       273 
     | 
    
         
            -
                date = Date.strptime( date, '%Y-%m-%d' )   if date.is_a?( String )
         
     | 
| 
       274 
     | 
    
         
            -
             
     | 
| 
       275 
     | 
    
         
            -
                infos = @events.seasons( league )
         
     | 
| 
       276 
     | 
    
         
            -
             
     | 
| 
       277 
     | 
    
         
            -
                infos.each do |info|
         
     | 
| 
       278 
     | 
    
         
            -
                   return info.season   if info.include?( date )
         
     | 
| 
       279 
     | 
    
         
            -
                end
         
     | 
| 
       280 
     | 
    
         
            -
                nil
         
     | 
| 
       281 
     | 
    
         
            -
              end
         
     | 
| 
       282 
     | 
    
         
            -
            end # class EventSeasonSearch
         
     | 
| 
       283 
     | 
    
         
            -
             
     | 
| 
       284 
     | 
    
         
            -
             
     | 
| 
       285 
     | 
    
         
            -
            ######
         
     | 
| 
       286 
     | 
    
         
            -
            ### add virtual team search ( clubs + national teams)
         
     | 
| 
       287 
     | 
    
         
            -
            ##   note: no record base!!!!!
         
     | 
| 
       288 
     | 
    
         
            -
            class TeamSearch
         
     | 
| 
       289 
     | 
    
         
            -
                ## note: "virtual" index lets you search clubs and/or national_teams (don't care)
         
     | 
| 
       290 
     | 
    
         
            -
             
     | 
| 
       291 
     | 
    
         
            -
              def initialize( clubs:, national_teams: )
         
     | 
| 
       292 
     | 
    
         
            -
                @clubs          = clubs
         
     | 
| 
       293 
     | 
    
         
            -
                @national_teams = national_teams
         
     | 
| 
       294 
     | 
    
         
            -
              end
         
     | 
| 
       295 
     | 
    
         
            -
             
     | 
| 
       296 
     | 
    
         
            -
                ## todo/check: rename to/use map_by! for array version - why? why not?
         
     | 
| 
       297 
     | 
    
         
            -
                def find_by!( name:, league:, mods: nil )
         
     | 
| 
       298 
     | 
    
         
            -
                  if name.is_a?( Array )
         
     | 
| 
       299 
     | 
    
         
            -
                    recs = []
         
     | 
| 
       300 
     | 
    
         
            -
                    name.each do |q|
         
     | 
| 
       301 
     | 
    
         
            -
                      recs << _find_by!( name: q, league: league, mods: mods )
         
     | 
| 
       302 
     | 
    
         
            -
                    end
         
     | 
| 
       303 
     | 
    
         
            -
                    recs
         
     | 
| 
       304 
     | 
    
         
            -
                  else  ## assume single name
         
     | 
| 
       305 
     | 
    
         
            -
                    _find_by!( name: name, league: league, mods: mods )
         
     | 
| 
       306 
     | 
    
         
            -
                  end
         
     | 
| 
       307 
     | 
    
         
            -
                end
         
     | 
| 
       308 
     | 
    
         
            -
             
     | 
| 
       309 
     | 
    
         
            -
             
     | 
| 
       310 
     | 
    
         
            -
                def _find_by!( name:, league:, mods: nil )
         
     | 
| 
       311 
     | 
    
         
            -
                  if mods && mods[ league.key ] && mods[ league.key ][ name ]
         
     | 
| 
       312 
     | 
    
         
            -
                    mods[ league.key ][ name ]
         
     | 
| 
       313 
     | 
    
         
            -
                  else
         
     | 
| 
       314 
     | 
    
         
            -
                    if league.clubs?
         
     | 
| 
       315 
     | 
    
         
            -
                      if league.intl?    ## todo/fix: add intl? to ActiveRecord league!!!
         
     | 
| 
       316 
     | 
    
         
            -
                        @clubs.find!( name )
         
     | 
| 
       317 
     | 
    
         
            -
                      else  ## assume clubs in domestic/national league tournament
         
     | 
| 
       318 
     | 
    
         
            -
                         ## note - search by league countries (may incl. more than one country
         
     | 
| 
       319 
     | 
    
         
            -
                         ##             e.g. us incl. ca, fr incl. mc, ch incl. li, etc.
         
     | 
| 
       320 
     | 
    
         
            -
                        @clubs.find_by!( name: name, league: league )
         
     | 
| 
       321 
     | 
    
         
            -
                      end
         
     | 
| 
       322 
     | 
    
         
            -
                    else   ## assume national teams (not clubs)
         
     | 
| 
       323 
     | 
    
         
            -
                      @national_teams.find!( name )
         
     | 
| 
       324 
     | 
    
         
            -
                    end
         
     | 
| 
       325 
     | 
    
         
            -
                  end
         
     | 
| 
       326 
     | 
    
         
            -
                end # method _find_by!
         
     | 
| 
       327 
     | 
    
         
            -
              end  # class TeamSearch
         
     | 
| 
       328 
     | 
    
         
            -
             
     | 
| 
       329 
     | 
    
         
            -
             
     | 
| 
       330 
     | 
    
         
            -
             
     | 
| 
       331 
     | 
    
         
            -
               def initialize( leagues:,
         
     | 
| 
       332 
     | 
    
         
            -
                               national_teams:,
         
     | 
| 
       333 
     | 
    
         
            -
                               clubs:,
         
     | 
| 
       334 
     | 
    
         
            -
                               grounds:,
         
     | 
| 
       335 
     | 
    
         
            -
                               events:,
         
     | 
| 
       336 
     | 
    
         
            -
                               players:
         
     | 
| 
       337 
     | 
    
         
            -
                               )
         
     | 
| 
       338 
     | 
    
         
            -
                   @leagues        = LeagueSearch.new( leagues )
         
     | 
| 
       339 
     | 
    
         
            -
                   @national_teams = NationalTeamSearch.new( national_teams )
         
     | 
| 
       340 
     | 
    
         
            -
                   @clubs          = ClubSearch.new( clubs )
         
     | 
| 
       341 
     | 
    
         
            -
                   @events         = EventSearch.new( events )
         
     | 
| 
       342 
     | 
    
         
            -
             
     | 
| 
       343 
     | 
    
         
            -
                   @grounds        = GroundSearch.new( grounds )
         
     | 
| 
       344 
     | 
    
         
            -
             
     | 
| 
       345 
     | 
    
         
            -
                   @players        = PlayerSearch.new( players )
         
     | 
| 
       346 
     | 
    
         
            -
             
     | 
| 
       347 
     | 
    
         
            -
                   ## virtual deriv ("composite") search services
         
     | 
| 
       348 
     | 
    
         
            -
                   @teams          = TeamSearch.new( clubs:          @clubs,
         
     | 
| 
       349 
     | 
    
         
            -
                                                     national_teams: @national_teams )
         
     | 
| 
       350 
     | 
    
         
            -
                   @event_seasons  = EventSeasonSearch.new( events: @events )
         
     | 
| 
       351 
     | 
    
         
            -
             
     | 
| 
       352 
     | 
    
         
            -
               end
         
     | 
| 
       353 
     | 
    
         
            -
             
     | 
| 
       354 
     | 
    
         
            -
                def countries
         
     | 
| 
       355 
     | 
    
         
            -
                    puts
         
     | 
| 
       356 
     | 
    
         
            -
                    puts "[WARN] do NOT use catalog.countries, deprecated!!!"
         
     | 
| 
       357 
     | 
    
         
            -
                    puts "   please, switch to new world.countries search service"
         
     | 
| 
       358 
     | 
    
         
            -
                    puts
         
     | 
| 
       359 
     | 
    
         
            -
                    exit 1
         
     | 
| 
       360 
     | 
    
         
            -
                end
         
     | 
| 
       361 
     | 
    
         
            -
             
     | 
| 
       362 
     | 
    
         
            -
             def leagues()        @leagues; end
         
     | 
| 
       363 
     | 
    
         
            -
             def national_teams() @national_teams; end
         
     | 
| 
       364 
     | 
    
         
            -
             def clubs()          @clubs; end
         
     | 
| 
       365 
     | 
    
         
            -
             def events()         @events; end
         
     | 
| 
       366 
     | 
    
         
            -
             def grounds()         @grounds; end
         
     | 
| 
       367 
     | 
    
         
            -
             
     | 
| 
       368 
     | 
    
         
            -
             def players()        @players; end
         
     | 
| 
       369 
     | 
    
         
            -
             
     | 
| 
       370 
     | 
    
         
            -
             def teams()          @teams; end         ## note - virtual table
         
     | 
| 
       371 
     | 
    
         
            -
             def seasons()        @event_seasons; end ## note - virtual table
         
     | 
| 
       372 
     | 
    
         
            -
            end  # class SportSearch
         
     | 
| 
         @@ -1,116 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ###
         
     | 
| 
       2 
     | 
    
         
            -
            #  note - extend all structs for with search api
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
     | 
    
         
            -
            #  todo - add more helpers!!!!
         
     | 
| 
       5 
     | 
    
         
            -
            #
         
     | 
| 
       6 
     | 
    
         
            -
            #
         
     | 
| 
       7 
     | 
    
         
            -
            #  todo - fix - move all non-core search functionality/machinery
         
     | 
| 
       8 
     | 
    
         
            -
            #                  over here - why? why not?
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
            module Sports
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            class Country
         
     | 
| 
       15 
     | 
    
         
            -
                def self._search #### use service/api or such - why? why not?
         
     | 
| 
       16 
     | 
    
         
            -
                    SportDb::Import.world.countries
         
     | 
| 
       17 
     | 
    
         
            -
                end
         
     | 
| 
       18 
     | 
    
         
            -
               def self.find_by( code: nil, name: nil )
         
     | 
| 
       19 
     | 
    
         
            -
                    _search.find_by( code: code, name: name )
         
     | 
| 
       20 
     | 
    
         
            -
               end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
               def self.find( q )   ## find by code (first) or name (second)
         
     | 
| 
       23 
     | 
    
         
            -
                   _search.find( q )
         
     | 
| 
       24 
     | 
    
         
            -
               end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
               def self.parse_heading( line )
         
     | 
| 
       27 
     | 
    
         
            -
                  ## fix - move parse code here from search - why? why not?
         
     | 
| 
       28 
     | 
    
         
            -
                  _search.parse( line )
         
     | 
| 
       29 
     | 
    
         
            -
               end
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
               ## add alternate names/aliases
         
     | 
| 
       32 
     | 
    
         
            -
               class << self
         
     | 
| 
       33 
     | 
    
         
            -
                alias_method :[],      :find    ### keep shortcut - why? why not?
         
     | 
| 
       34 
     | 
    
         
            -
                alias_method :heading, :parse_heading
         
     | 
| 
       35 
     | 
    
         
            -
               end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
            # open question - what name to use build or  parse_line or ?
         
     | 
| 
       39 
     | 
    
         
            -
            #                              or   parse_recs for CountryReader?
         
     | 
| 
       40 
     | 
    
         
            -
            #          remove CountryReader helper methods - why? why not?
         
     | 
| 
       41 
     | 
    
         
            -
            #   use parse_heading/heading for now !!!
         
     | 
| 
       42 
     | 
    
         
            -
            #
         
     | 
| 
       43 
     | 
    
         
            -
            #   def self.parse( line )  or build( line ) ??
         
     | 
| 
       44 
     | 
    
         
            -
            #      SportDb::Import.world.countries.parse( line )
         
     | 
| 
       45 
     | 
    
         
            -
            #   end
         
     | 
| 
       46 
     | 
    
         
            -
            #
         
     | 
| 
       47 
     | 
    
         
            -
            # !!!! note - conflict with
         
     | 
| 
       48 
     | 
    
         
            -
            #     def self.read( path )  CountryReader.read( path ); end
         
     | 
| 
       49 
     | 
    
         
            -
            #     def self.parse( txt )  CountryReader.parse( txt ); end
         
     | 
| 
       50 
     | 
    
         
            -
            #
         
     | 
| 
       51 
     | 
    
         
            -
            end # class Country
         
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
            ###
         
     | 
| 
       55 
     | 
    
         
            -
            ## todo/fix - add find_by( code: ), find_by( name: )
         
     | 
| 
       56 
     | 
    
         
            -
            ##                   split - why? why not?
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
            class League
         
     | 
| 
       60 
     | 
    
         
            -
                def self._search #### use service/api or such - why? why not?
         
     | 
| 
       61 
     | 
    
         
            -
                    SportDb::Import.catalog.leagues
         
     | 
| 
       62 
     | 
    
         
            -
                end
         
     | 
| 
       63 
     | 
    
         
            -
                def self.match_by( name: nil, code: nil,
         
     | 
| 
       64 
     | 
    
         
            -
                                    country: nil )
         
     | 
| 
       65 
     | 
    
         
            -
                   _search.match_by( name: name, code: code,
         
     | 
| 
       66 
     | 
    
         
            -
                                     country: country )
         
     | 
| 
       67 
     | 
    
         
            -
                end
         
     | 
| 
       68 
     | 
    
         
            -
                def self.match( q ) _search.match( q ); end
         
     | 
| 
       69 
     | 
    
         
            -
             
     | 
| 
       70 
     | 
    
         
            -
                def self.find!( q ) _search.find!( q ); end
         
     | 
| 
       71 
     | 
    
         
            -
                def self.find( q )  _search_find( q ); end
         
     | 
| 
       72 
     | 
    
         
            -
            end # class League
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
             
     | 
| 
       75 
     | 
    
         
            -
            class NationalTeam
         
     | 
| 
       76 
     | 
    
         
            -
                def self._search #### use service/api or such - why? why not?
         
     | 
| 
       77 
     | 
    
         
            -
                    SportDb::Import.catalog.national_teams
         
     | 
| 
       78 
     | 
    
         
            -
                end
         
     | 
| 
       79 
     | 
    
         
            -
             
     | 
| 
       80 
     | 
    
         
            -
                def self.find( q )   _search.find( q ); end
         
     | 
| 
       81 
     | 
    
         
            -
                def self.find!( q )  _search_find!( q ); end
         
     | 
| 
       82 
     | 
    
         
            -
            end # class NationalTeam
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
            class Club
         
     | 
| 
       86 
     | 
    
         
            -
                def self._search #### use service/api or such - why? why not?
         
     | 
| 
       87 
     | 
    
         
            -
                    SportDb::Import.catalog.clubs
         
     | 
| 
       88 
     | 
    
         
            -
                end
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
     | 
    
         
            -
                def self.match_by( name:, country: nil,
         
     | 
| 
       91 
     | 
    
         
            -
                                     league:  nil,
         
     | 
| 
       92 
     | 
    
         
            -
                                     mods:    nil )
         
     | 
| 
       93 
     | 
    
         
            -
                    _search.match_by( name: name, country: country,
         
     | 
| 
       94 
     | 
    
         
            -
                                      league: league, mods: mods )
         
     | 
| 
       95 
     | 
    
         
            -
                end
         
     | 
| 
       96 
     | 
    
         
            -
                def self.match( name ) match_by( name: name ); end
         
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
                def self.find( name )   _search.find_by( name: name ); end
         
     | 
| 
       99 
     | 
    
         
            -
                def self.find!( name )  _search.find_by!( name: name ); end
         
     | 
| 
       100 
     | 
    
         
            -
             
     | 
| 
       101 
     | 
    
         
            -
                def self.find_by!( name:, country: nil,
         
     | 
| 
       102 
     | 
    
         
            -
                                          league:  nil )
         
     | 
| 
       103 
     | 
    
         
            -
                   _search.find_by!( name: name, country: country,
         
     | 
| 
       104 
     | 
    
         
            -
                                                 league: league )
         
     | 
| 
       105 
     | 
    
         
            -
                end
         
     | 
| 
       106 
     | 
    
         
            -
                def self.find_by( name:, country: nil,
         
     | 
| 
       107 
     | 
    
         
            -
                                         league:  nil )
         
     | 
| 
       108 
     | 
    
         
            -
                   _search.find_by( name: name, country: country,
         
     | 
| 
       109 
     | 
    
         
            -
                                                league: league )
         
     | 
| 
       110 
     | 
    
         
            -
                end
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
               def self.build_mods( mods )
         
     | 
| 
       113 
     | 
    
         
            -
                   _search_build_mods( mods )
         
     | 
| 
       114 
     | 
    
         
            -
                end
         
     | 
| 
       115 
     | 
    
         
            -
              end # class Club
         
     | 
| 
       116 
     | 
    
         
            -
            end   # module Sports
         
     | 
| 
         @@ -1,157 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            ###
         
     | 
| 
       2 
     | 
    
         
            -
            #  world search service api for countries and more
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
     | 
    
         
            -
            # core api is:
         
     | 
| 
       5 
     | 
    
         
            -
            # -  world.countries.find_by_code
         
     | 
| 
       6 
     | 
    
         
            -
            # -                 .find_by_name
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            class WorldSearch
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            class CitySearch
         
     | 
| 
       12 
     | 
    
         
            -
              def initialize( service ) @service = service; end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
              ###################
         
     | 
| 
       15 
     | 
    
         
            -
              ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       16 
     | 
    
         
            -
              def match_by( name: )
         
     | 
| 
       17 
     | 
    
         
            -
                @service.match_by( name: name )
         
     | 
| 
       18 
     | 
    
         
            -
              end
         
     | 
| 
       19 
     | 
    
         
            -
            end  # class CitySearch
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            class CountrySearch
         
     | 
| 
       23 
     | 
    
         
            -
              def initialize( service ) @service = service; end
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
                ###################
         
     | 
| 
       26 
     | 
    
         
            -
                ## core required delegates  - use delegate generator - why? why not?
         
     | 
| 
       27 
     | 
    
         
            -
                def find_by_code( code )
         
     | 
| 
       28 
     | 
    
         
            -
                  puts "!! DEPRECATED - use CountrySearch#find_by( code: )"
         
     | 
| 
       29 
     | 
    
         
            -
                  @service.find_by_code( code )
         
     | 
| 
       30 
     | 
    
         
            -
                end
         
     | 
| 
       31 
     | 
    
         
            -
                def find_by_name( name )
         
     | 
| 
       32 
     | 
    
         
            -
                  puts "!! DEPRECATED - use CountrySearch#find_by( name: )"
         
     | 
| 
       33 
     | 
    
         
            -
                  @service.find_by_name( name )
         
     | 
| 
       34 
     | 
    
         
            -
                end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                def find_by( code: nil, name: nil )
         
     | 
| 
       37 
     | 
    
         
            -
                  ## todo/fix upstream - change to find_by( code:, name:, ) too
         
     | 
| 
       38 
     | 
    
         
            -
                  if code && name.nil?
         
     | 
| 
       39 
     | 
    
         
            -
                    @service.find_by_code( code )
         
     | 
| 
       40 
     | 
    
         
            -
                  elsif name && code.nil?
         
     | 
| 
       41 
     | 
    
         
            -
                    @service.find_by_name( name )
         
     | 
| 
       42 
     | 
    
         
            -
                  else
         
     | 
| 
       43 
     | 
    
         
            -
                    raise ArgumentError, "CountrySearch#find_by - one (and only one arg) required - code: or name:"
         
     | 
| 
       44 
     | 
    
         
            -
                  end
         
     | 
| 
       45 
     | 
    
         
            -
                end
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
                def find( q )
         
     | 
| 
       48 
     | 
    
         
            -
                  @service.find_by_name_or_code( q )
         
     | 
| 
       49 
     | 
    
         
            -
                end
         
     | 
| 
       50 
     | 
    
         
            -
                alias_method :[], :find    ### keep shortcut - why? why not?
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
             
     | 
| 
       53 
     | 
    
         
            -
                ###############
         
     | 
| 
       54 
     | 
    
         
            -
                ### more deriv support functions / helpers
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
             ###
         
     | 
| 
       57 
     | 
    
         
            -
             ##   split/parse country line
         
     | 
| 
       58 
     | 
    
         
            -
             ##
         
     | 
| 
       59 
     | 
    
         
            -
             ##  split on bullet e.g.
         
     | 
| 
       60 
     | 
    
         
            -
             ##   split into name and code with regex - make code optional
         
     | 
| 
       61 
     | 
    
         
            -
             ##
         
     | 
| 
       62 
     | 
    
         
            -
             ##  Examples:
         
     | 
| 
       63 
     | 
    
         
            -
             ##    Österreich • Austria (at)
         
     | 
| 
       64 
     | 
    
         
            -
             ##    Österreich • Austria
         
     | 
| 
       65 
     | 
    
         
            -
             ##    Austria
         
     | 
| 
       66 
     | 
    
         
            -
             ##    Deutschland (de) • Germany
         
     | 
| 
       67 
     | 
    
         
            -
             ##
         
     | 
| 
       68 
     | 
    
         
            -
             ##   todo/check: support more formats - why? why not?
         
     | 
| 
       69 
     | 
    
         
            -
             ##       e.g.  Austria, AUT  (e.g. with comma - why? why not?)
         
     | 
| 
       70 
     | 
    
         
            -
             def parse( line )
         
     | 
| 
       71 
     | 
    
         
            -
               values = line.split( '•' )   ## use/support multi-lingual separator
         
     | 
| 
       72 
     | 
    
         
            -
               country = nil
         
     | 
| 
       73 
     | 
    
         
            -
               values.each do |value|
         
     | 
| 
       74 
     | 
    
         
            -
                  value = value.strip
         
     | 
| 
       75 
     | 
    
         
            -
                  ## check for trailing country code e.g. (at), (eng), etc
         
     | 
| 
       76 
     | 
    
         
            -
                  ##   allow code 1 to 5 for now - northern cyprus(fifa) with 5 letters?.
         
     | 
| 
       77 
     | 
    
         
            -
                  ##     add/allow  gb-eng, gb-wal (official iso2!!), in the future too - why? why not?
         
     | 
| 
       78 
     | 
    
         
            -
                  if value =~ /[ ]+\((?<code>[A-Za-z]{1,5})\)$/  ## e.g. Austria (at)
         
     | 
| 
       79 
     | 
    
         
            -
                    code =  $~[:code]
         
     | 
| 
       80 
     | 
    
         
            -
                    name = value[0...(value.size-code.size-2)].strip  ## note: add -2 for brackets
         
     | 
| 
       81 
     | 
    
         
            -
                    candidates = [ find_by( code: code ), find_by( name: name ) ]
         
     | 
| 
       82 
     | 
    
         
            -
                    if candidates[0].nil?
         
     | 
| 
       83 
     | 
    
         
            -
                      puts "** !!! ERROR Country.parse_heading - unknown code >#{code}< in line: #{line}"
         
     | 
| 
       84 
     | 
    
         
            -
                      pp line
         
     | 
| 
       85 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       86 
     | 
    
         
            -
                    end
         
     | 
| 
       87 
     | 
    
         
            -
                    if candidates[1].nil?
         
     | 
| 
       88 
     | 
    
         
            -
                      puts "** !!! ERROR Country.parse_heading - unknown name >#{code}< in line: #{line}"
         
     | 
| 
       89 
     | 
    
         
            -
                      pp line
         
     | 
| 
       90 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       91 
     | 
    
         
            -
                    end
         
     | 
| 
       92 
     | 
    
         
            -
                    if candidates[0] != candidates[1]
         
     | 
| 
       93 
     | 
    
         
            -
                      puts "** !!! ERROR Country.parse_heading - name and code do NOT match the same country:"
         
     | 
| 
       94 
     | 
    
         
            -
                      pp line
         
     | 
| 
       95 
     | 
    
         
            -
                      pp candidates
         
     | 
| 
       96 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       97 
     | 
    
         
            -
                    end
         
     | 
| 
       98 
     | 
    
         
            -
                    if country && country != candidates[0]
         
     | 
| 
       99 
     | 
    
         
            -
                      puts "** !!! ERROR Country.parse_heading - names do NOT match the same country:"
         
     | 
| 
       100 
     | 
    
         
            -
                      pp line
         
     | 
| 
       101 
     | 
    
         
            -
                      pp country
         
     | 
| 
       102 
     | 
    
         
            -
                      pp candidates
         
     | 
| 
       103 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       104 
     | 
    
         
            -
                    end
         
     | 
| 
       105 
     | 
    
         
            -
                    country = candidates[0]
         
     | 
| 
       106 
     | 
    
         
            -
                  else
         
     | 
| 
       107 
     | 
    
         
            -
                    ## just assume value is name or code
         
     | 
| 
       108 
     | 
    
         
            -
                    candidate = find( value )
         
     | 
| 
       109 
     | 
    
         
            -
                    if candidate.nil?
         
     | 
| 
       110 
     | 
    
         
            -
                      puts "** !!! ERROR Country.parse_heading - unknown name or code >#{value}< in line: #{line}"
         
     | 
| 
       111 
     | 
    
         
            -
                      pp line
         
     | 
| 
       112 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       113 
     | 
    
         
            -
                    end
         
     | 
| 
       114 
     | 
    
         
            -
                    if country && country != candidate
         
     | 
| 
       115 
     | 
    
         
            -
                      puts "** !!! ERROR Country.parse_heading - names do NOT match the same country:"
         
     | 
| 
       116 
     | 
    
         
            -
                      pp line
         
     | 
| 
       117 
     | 
    
         
            -
                      pp country
         
     | 
| 
       118 
     | 
    
         
            -
                      pp candidate
         
     | 
| 
       119 
     | 
    
         
            -
                      exit 1
         
     | 
| 
       120 
     | 
    
         
            -
                    end
         
     | 
| 
       121 
     | 
    
         
            -
                    country = candidate
         
     | 
| 
       122 
     | 
    
         
            -
                  end
         
     | 
| 
       123 
     | 
    
         
            -
               end
         
     | 
| 
       124 
     | 
    
         
            -
               country
         
     | 
| 
       125 
     | 
    
         
            -
             end # method parse
         
     | 
| 
       126 
     | 
    
         
            -
            end  # class CountrySearch
         
     | 
| 
       127 
     | 
    
         
            -
             
     | 
| 
       128 
     | 
    
         
            -
             
     | 
| 
       129 
     | 
    
         
            -
                def initialize( countries:, cities: )
         
     | 
| 
       130 
     | 
    
         
            -
                    ## change service to country_service or such - why? why not?
         
     | 
| 
       131 
     | 
    
         
            -
                    ##  add city_service and such later
         
     | 
| 
       132 
     | 
    
         
            -
                    @countries = CountrySearch.new( countries )
         
     | 
| 
       133 
     | 
    
         
            -
                    @cities    = CitySearch.new( cities )
         
     | 
| 
       134 
     | 
    
         
            -
                end
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
                ####
         
     | 
| 
       137 
     | 
    
         
            -
                #  note: for now setup only for countries
         
     | 
| 
       138 
     | 
    
         
            -
                def countries() @countries;  end
         
     | 
| 
       139 
     | 
    
         
            -
                def cities()    @cities;  end
         
     | 
| 
       140 
     | 
    
         
            -
            end  # class WorldSearch
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
             
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
            class DummyCountrySearch
         
     | 
| 
       147 
     | 
    
         
            -
                def find_by_code( code )
         
     | 
| 
       148 
     | 
    
         
            -
                    puts "[WARN] no world search configured; cannot find country by code"
         
     | 
| 
       149 
     | 
    
         
            -
                    nil
         
     | 
| 
       150 
     | 
    
         
            -
                end
         
     | 
| 
       151 
     | 
    
         
            -
                def find_by_name( name )
         
     | 
| 
       152 
     | 
    
         
            -
                    puts "[WARN] no world search configured; cannot find country by name"
         
     | 
| 
       153 
     | 
    
         
            -
                    nil
         
     | 
| 
       154 
     | 
    
         
            -
                end
         
     | 
| 
       155 
     | 
    
         
            -
            end  # class DummyCountrySearch
         
     | 
| 
       156 
     | 
    
         
            -
             
     | 
| 
       157 
     | 
    
         
            -
             
     |