sportdb-formats 1.0.3 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|