sportdb-config 0.3.4 → 0.3.5
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 +5 -3
- data/Rakefile +4 -0
- data/config/world/countries.txt +307 -0
- data/config/{geos → world}/eng.txt +0 -0
- data/lib/sportdb/config/{team_reader.rb → club_reader.rb} +7 -30
- data/lib/sportdb/config/clubs.rb +126 -0
- data/lib/sportdb/config/config.rb +33 -158
- data/lib/sportdb/config/countries.rb +61 -140
- data/lib/sportdb/config/version.rb +1 -5
- data/lib/sportdb/config.rb +8 -1
- data/test/{test_team_reader.rb → test_club_reader.rb} +8 -8
- data/test/test_clubs.rb +32 -15
- data/test/test_config.rb +10 -7
- data/test/test_countries.rb +19 -3
- metadata +23 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b96366c57a674d8504918759864f3b2d77242ab1
|
|
4
|
+
data.tar.gz: 867a992ef3dd1b31b5e360e0b2b80b123a2abff3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0c5197829655457ac0b38a8d995e611804f3e385cf25b78f0a4c4e83c68fececfed3d16c4b51201c6f4f0d8f29f9189e629dc20a30a602f4f534c46bc6eaf2ea
|
|
7
|
+
data.tar.gz: 676a5a68e7827b9c34c7d9b07ed9d5ab7894bff4514841f98fbf989c29049f17d44968b3032bbf3a00bc273f7917a572460f632b6aea4e6b404385cdd10bde89
|
data/Manifest.txt
CHANGED
|
@@ -2,25 +2,27 @@ HISTORY.md
|
|
|
2
2
|
Manifest.txt
|
|
3
3
|
README.md
|
|
4
4
|
Rakefile
|
|
5
|
-
config/geos/eng.txt
|
|
6
5
|
config/leagues/eng.txt
|
|
7
6
|
config/leagues/fr.txt
|
|
8
7
|
config/leagues/gr.txt
|
|
9
8
|
config/leagues/sco.txt
|
|
9
|
+
config/world/countries.txt
|
|
10
|
+
config/world/eng.txt
|
|
10
11
|
lib/sportdb/config.rb
|
|
12
|
+
lib/sportdb/config/club_reader.rb
|
|
13
|
+
lib/sportdb/config/clubs.rb
|
|
11
14
|
lib/sportdb/config/config.rb
|
|
12
15
|
lib/sportdb/config/countries.rb
|
|
13
16
|
lib/sportdb/config/league.rb
|
|
14
17
|
lib/sportdb/config/league_reader.rb
|
|
15
18
|
lib/sportdb/config/league_utils.rb
|
|
16
19
|
lib/sportdb/config/season_utils.rb
|
|
17
|
-
lib/sportdb/config/team_reader.rb
|
|
18
20
|
lib/sportdb/config/version.rb
|
|
19
21
|
test/helper.rb
|
|
22
|
+
test/test_club_reader.rb
|
|
20
23
|
test/test_clubs.rb
|
|
21
24
|
test/test_config.rb
|
|
22
25
|
test/test_countries.rb
|
|
23
26
|
test/test_league_reader.rb
|
|
24
27
|
test/test_league_utils.rb
|
|
25
28
|
test/test_season_utils.rb
|
|
26
|
-
test/test_team_reader.rb
|
data/Rakefile
CHANGED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
##########################
|
|
2
|
+
# FIFA country codes
|
|
3
|
+
#
|
|
4
|
+
# see en.wikipedia.org/wiki/List_of_FIFA_country_codes
|
|
5
|
+
# and github.com/openmundi/world.db/blob/master/1-codes/fifa.txt
|
|
6
|
+
# and www.rsssf.com/miscellaneous/fifa-codes.html
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# note: all dependencies n territories marked w/
|
|
10
|
+
# (UK), (FR), (NZ), (AU), (US), (NL), (DK), (CN) etc.
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
###
|
|
14
|
+
# todo: group by world.db "continents" - south america, africa, etc.
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#################
|
|
19
|
+
## 209 (now in 2019 211(!) which two got added ??) regular FIFA members
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Key, FIFA, Name
|
|
23
|
+
|
|
24
|
+
af, AFG, Afghanistan
|
|
25
|
+
al, ALB, Albania
|
|
26
|
+
dz, ALG, Algeria
|
|
27
|
+
as, ASA, American Samoa (US)
|
|
28
|
+
ad, AND, Andorra
|
|
29
|
+
ao, ANG, Angola
|
|
30
|
+
ai, AIA, Anguilla (UK)
|
|
31
|
+
ag, ATG, Antigua and Barbuda
|
|
32
|
+
ar, ARG, Argentina
|
|
33
|
+
am, ARM, Armenia
|
|
34
|
+
aw, ARU, Aruba (NL)
|
|
35
|
+
au, AUS, Australia
|
|
36
|
+
at, AUT, Austria
|
|
37
|
+
az, AZE, Azerbaijan
|
|
38
|
+
|
|
39
|
+
bs, BAH, Bahamas
|
|
40
|
+
bh, BHR, Bahrain
|
|
41
|
+
bd, BAN, Bangladesh
|
|
42
|
+
bb, BRB, Barbados
|
|
43
|
+
by, BLR, Belarus
|
|
44
|
+
be, BEL, Belgium
|
|
45
|
+
bz, BLZ, Belize
|
|
46
|
+
bj, BEN, Benin
|
|
47
|
+
bm, BER, Bermuda (UK)
|
|
48
|
+
bt, BHU, Bhutan
|
|
49
|
+
bo, BOL, Bolivia
|
|
50
|
+
ba, BIH, Bosnia and Herzegovina ## or use Bosnia-Herzegovina ?
|
|
51
|
+
bw, BOT, Botswana
|
|
52
|
+
br, BRA, Brazil
|
|
53
|
+
bn, BRU, Brunei
|
|
54
|
+
bg, BUL, Bulgaria
|
|
55
|
+
bf, BFA, Burkina Faso
|
|
56
|
+
bi, BDI, Burundi
|
|
57
|
+
|
|
58
|
+
kh, CAM, Cambodia
|
|
59
|
+
cm, CMR, Cameroon
|
|
60
|
+
ca, CAN, Canada
|
|
61
|
+
cv, CPV, Cabo Verde
|
|
62
|
+
ky, CAY, Cayman Islands (UK)
|
|
63
|
+
cf, CTA, Central African Republic
|
|
64
|
+
td, CHA, Chad
|
|
65
|
+
cl, CHI, Chile
|
|
66
|
+
cn, CHN, China
|
|
67
|
+
co, COL, Colombia
|
|
68
|
+
km, COM, Comoros
|
|
69
|
+
cg, CGO, Congo
|
|
70
|
+
cd, COD, Congo DR
|
|
71
|
+
ck, COK, Cook Islands (NZ)
|
|
72
|
+
cr, CRC, Costa Rica
|
|
73
|
+
hr, CRO, Croatia
|
|
74
|
+
cu, CUB, Cuba
|
|
75
|
+
cw, CUW, Curaçao (NL)
|
|
76
|
+
cy, CYP, Cyprus
|
|
77
|
+
cz, CZE, Czech Republic
|
|
78
|
+
ci, CIV, Côte d'Ivoire # Ivory Coast
|
|
79
|
+
|
|
80
|
+
dk, DEN, Denmark
|
|
81
|
+
dj, DJI, Djibouti
|
|
82
|
+
dm, DMA, Dominica
|
|
83
|
+
do, DOM, Dominican Republic
|
|
84
|
+
|
|
85
|
+
ec, ECU, Ecuador
|
|
86
|
+
eg, EGY, Egypt
|
|
87
|
+
eng, ENG, England (UK)
|
|
88
|
+
gq, EQG, Equatorial Guinea
|
|
89
|
+
er, ERI, Eritrea
|
|
90
|
+
ee, EST, Estonia
|
|
91
|
+
et, ETH, Ethiopia
|
|
92
|
+
es, ESP, Spain
|
|
93
|
+
|
|
94
|
+
fo, FRO, Faroe Islands (DK)
|
|
95
|
+
fj, FIJ, Fiji
|
|
96
|
+
fi, FIN, Finland
|
|
97
|
+
fr, FRA, France
|
|
98
|
+
|
|
99
|
+
ga, GAB, Gabon
|
|
100
|
+
gm, GAM, Gambia
|
|
101
|
+
ge, GEO, Georgia
|
|
102
|
+
de, GER, Germany
|
|
103
|
+
gh, GHA, Ghana
|
|
104
|
+
gr, GRE, Greece
|
|
105
|
+
gd, GRN, Grenada
|
|
106
|
+
gu, GUM, Guam (US)
|
|
107
|
+
gt, GUA, Guatemala
|
|
108
|
+
gn, GUI, Guinea
|
|
109
|
+
gw, GNB, Guinea-Bissau
|
|
110
|
+
gy, GUY, Guyana
|
|
111
|
+
|
|
112
|
+
ht, HAI, Haiti
|
|
113
|
+
hn, HON, Honduras
|
|
114
|
+
hk, HKG, Hong Kong (CN)
|
|
115
|
+
hu, HUN, Hungary
|
|
116
|
+
|
|
117
|
+
is, ISL, Iceland
|
|
118
|
+
in, IND, India
|
|
119
|
+
id, IDN, Indonesia
|
|
120
|
+
ir, IRN, Iran
|
|
121
|
+
iq, IRQ, Iraq
|
|
122
|
+
il, ISR, Israel
|
|
123
|
+
it, ITA, Italy
|
|
124
|
+
ie, IRL, Ireland
|
|
125
|
+
|
|
126
|
+
jm, JAM, Jamaica
|
|
127
|
+
jp, JPN, Japan
|
|
128
|
+
jo, JOR, Jordan
|
|
129
|
+
|
|
130
|
+
kz, KAZ, Kazakhstan
|
|
131
|
+
ke, KEN, Kenya
|
|
132
|
+
kw, KUW, Kuwait
|
|
133
|
+
kg, KGZ, Kyrgyzstan
|
|
134
|
+
sa, KSA, Saudi Arabia
|
|
135
|
+
kr, KOR, South Korea
|
|
136
|
+
|
|
137
|
+
la, LAO, Laos
|
|
138
|
+
lv, LVA, Latvia
|
|
139
|
+
lb, LIB, Lebanon
|
|
140
|
+
ls, LES, Lesotho
|
|
141
|
+
lr, LBR, Liberia
|
|
142
|
+
ly, LBY, Libya
|
|
143
|
+
li, LIE, Liechtenstein
|
|
144
|
+
lt, LTU, Lithuania
|
|
145
|
+
lu, LUX, Luxembourg
|
|
146
|
+
lc, LCA, Saint Lucia
|
|
147
|
+
|
|
148
|
+
mo, MAC, Macao (CN)
|
|
149
|
+
mk, MKD, Macedonia
|
|
150
|
+
mg, MAD, Madagascar
|
|
151
|
+
mw, MWI, Malawi
|
|
152
|
+
my, MAS, Malaysia
|
|
153
|
+
mv, MDV, Maldives
|
|
154
|
+
ml, MLI, Mali
|
|
155
|
+
mt, MLT, Malta
|
|
156
|
+
mr, MTN, Mauritania
|
|
157
|
+
mu, MRI, Mauritius
|
|
158
|
+
mx, MEX, Mexico
|
|
159
|
+
md, MDA, Moldova
|
|
160
|
+
mn, MNG, Mongolia
|
|
161
|
+
me, MNE, Montenegro
|
|
162
|
+
ms, MSR, Montserrat (UK)
|
|
163
|
+
ma, MAR, Morocco
|
|
164
|
+
mz, MOZ, Mozambique
|
|
165
|
+
mm, MYA, Myanmar
|
|
166
|
+
|
|
167
|
+
na, NAM, Namibia
|
|
168
|
+
np, NEP, Nepal
|
|
169
|
+
nl, NED, Netherlands
|
|
170
|
+
nc, NCL, New Caledonia (FR)
|
|
171
|
+
nz, NZL, New Zealand
|
|
172
|
+
ni, NCA, Nicaragua
|
|
173
|
+
ne, NIG, Niger
|
|
174
|
+
ng, NGA, Nigeria
|
|
175
|
+
nir, NIR, Northern Ireland (UK)
|
|
176
|
+
no, NOR, Norway
|
|
177
|
+
|
|
178
|
+
om, OMA, Oman
|
|
179
|
+
|
|
180
|
+
pk, PAK, Pakistan
|
|
181
|
+
ps, PLE, Palestine
|
|
182
|
+
pa, PAN, Panama
|
|
183
|
+
pg, PNG, Papua New Guinea
|
|
184
|
+
py, PAR, Paraguay
|
|
185
|
+
pe, PER, Peru
|
|
186
|
+
ph, PHI, Philippines
|
|
187
|
+
pl, POL, Poland
|
|
188
|
+
pt, POR, Portugal
|
|
189
|
+
pr, PUR, Puerto Rico (US)
|
|
190
|
+
kp, PRK, North Korea
|
|
191
|
+
|
|
192
|
+
qa, QAT, Qatar
|
|
193
|
+
|
|
194
|
+
ro, ROU, Romania
|
|
195
|
+
ru, RUS, Russia
|
|
196
|
+
rw, RWA, Rwanda
|
|
197
|
+
za, RSA, South Africa
|
|
198
|
+
|
|
199
|
+
kn, SKN, Saint Kitts and Nevis
|
|
200
|
+
ws, SAM, Samoa
|
|
201
|
+
sm, SMR, San Marino
|
|
202
|
+
st, STP, São Tomé and Príncipe
|
|
203
|
+
sco, SCO, Scotland (UK)
|
|
204
|
+
sn, SEN, Senegal
|
|
205
|
+
rs, SRB, Serbia
|
|
206
|
+
sc, SEY, Seychelles
|
|
207
|
+
sl, SLE, Sierra Leone
|
|
208
|
+
sg, SIN, Singapore
|
|
209
|
+
sk, SVK, Slovakia
|
|
210
|
+
si, SVN, Slovenia
|
|
211
|
+
sb, SOL, Solomon Islands
|
|
212
|
+
so, SOM, Somalia
|
|
213
|
+
ss, SSD, South Sudan
|
|
214
|
+
lk, SRI, Sri Lanka
|
|
215
|
+
sd, SDN, Sudan
|
|
216
|
+
sr, SUR, Suriname
|
|
217
|
+
sz, SWZ, Swaziland
|
|
218
|
+
se, SWE, Sweden
|
|
219
|
+
ch, SUI, Switzerland
|
|
220
|
+
sy, SYR, Syria
|
|
221
|
+
sv, SLV, El Salvador
|
|
222
|
+
|
|
223
|
+
pf, TAH, Tahiti (FR) # todo/check: use French Polynesia (FR) as name - why? why not?
|
|
224
|
+
tj, TJK, Tajikistan
|
|
225
|
+
tz, TAN, Tanzania
|
|
226
|
+
th, THA, Thailand
|
|
227
|
+
tl, TLS, Timor-Leste
|
|
228
|
+
tg, TOG, Togo
|
|
229
|
+
to, TGA, Tonga
|
|
230
|
+
tt, TRI, Trinidad and Tobago
|
|
231
|
+
tn, TUN, Tunisia
|
|
232
|
+
tr, TUR, Turkey
|
|
233
|
+
tm, TKM, Turkmenistan
|
|
234
|
+
tc, TCA, Turks and Caicos Islands (UK)
|
|
235
|
+
tw, TPE, Taiwan # Chinese Tapei
|
|
236
|
+
|
|
237
|
+
ug, UGA, Uganda
|
|
238
|
+
ua, UKR, Ukraine
|
|
239
|
+
ae, UAE, United Arab Emirates
|
|
240
|
+
us, USA, United States
|
|
241
|
+
uy, URU, Uruguay
|
|
242
|
+
uz, UZB, Uzbekistan
|
|
243
|
+
|
|
244
|
+
vu, VAN, Vanuatu
|
|
245
|
+
ve, VEN, Venezuela
|
|
246
|
+
vn, VIE, Vietnam
|
|
247
|
+
vi, VIR, US Virgin Islands (US) # United States Virgin Islands; Virgin Islands (U.S.)
|
|
248
|
+
vc, VIN, Saint Vincent and the Grenadines
|
|
249
|
+
vg, VGB, British Virgin Islands (UK)
|
|
250
|
+
|
|
251
|
+
wal, WAL, Wales (UK)
|
|
252
|
+
|
|
253
|
+
ye, YEM, Yemen
|
|
254
|
+
|
|
255
|
+
zm, ZAM, Zambia
|
|
256
|
+
zw, ZIM, Zimbabwe
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
###################
|
|
260
|
+
## Non-FIFA member codes
|
|
261
|
+
|
|
262
|
+
bq, BOE, Bonaire # CONCACAF
|
|
263
|
+
gf, GYF, French Guiana (FR) # CONCACAF
|
|
264
|
+
gp, GPE, Guadeloupe (FR) # CONCACAF
|
|
265
|
+
mq, MTQ, Martinique (FR) # CONCACAF
|
|
266
|
+
sx, SXM, Sint Maarten (NL) # CONCACAF
|
|
267
|
+
|
|
268
|
+
gi, GIB, Gibraltar (UK) # UEFA
|
|
269
|
+
xk, KOS, Kosovo # UEFA -- note: Kosovo is not listed as an ISO standard country. The unofficial 2 and 3-digit codes are used by the European Commission and others until Kosovo is assigned an ISO code
|
|
270
|
+
|
|
271
|
+
re, REU, Réunion (FR) # CAF
|
|
272
|
+
zan, ZAN, Zanzibar (TZ) # CAF -- note: is a semi-autonomous region of Tanzania
|
|
273
|
+
|
|
274
|
+
tv, TUV, Tuvalu # OFC
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
####################
|
|
278
|
+
## Irregular codes
|
|
279
|
+
|
|
280
|
+
mp, NMI, Northern Mariana Islands (US) # AFC
|
|
281
|
+
|
|
282
|
+
mf, SMT, Saint Martin (FR) # CONCACAF
|
|
283
|
+
|
|
284
|
+
fm, FSM, Micronesia # OFC
|
|
285
|
+
ki, KIR, Kiribati # OFC
|
|
286
|
+
nu, NIU, Niue (NZ) # OFC
|
|
287
|
+
pw, PLW, Palau # OFC
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
#################
|
|
291
|
+
# not members
|
|
292
|
+
#
|
|
293
|
+
# in europe:
|
|
294
|
+
# - Great Britain - only all its member e.g. England/Wales/Scotland/Northern Irland
|
|
295
|
+
|
|
296
|
+
va, VAT, Vatican City ## no "official" fifa code - listed in "irregular" codes
|
|
297
|
+
mc, MCO, Monaco ## no "official" fifa code - listed in "irregular" codes
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
#
|
|
301
|
+
# in oceania:
|
|
302
|
+
# - Kiribati
|
|
303
|
+
# - Marshall Islands
|
|
304
|
+
# - Micronesia
|
|
305
|
+
# - Nauru
|
|
306
|
+
# - Palau
|
|
307
|
+
# - Tuvalu
|
|
File without changes
|
|
@@ -5,31 +5,7 @@ module SportDb
|
|
|
5
5
|
module Import
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
class
|
|
9
|
-
|
|
10
|
-
##
|
|
11
|
-
# note: use our own (internal) team struct for now - why? why not?
|
|
12
|
-
# - check that shape/structure/fields/attributes match
|
|
13
|
-
# the Team struct in sportdb-text (in SportDb::Struct::Team) !!!!
|
|
14
|
-
class Team
|
|
15
|
-
## todo: use just names for alt_names - why? why not?
|
|
16
|
-
attr_accessor :name, :alt_names, :year, :ground, :city
|
|
17
|
-
|
|
18
|
-
## more attribs - todo/fix - also add "upstream" to struct & model!!!!!
|
|
19
|
-
attr_accessor :district, :geos, :year_end, :country
|
|
20
|
-
|
|
21
|
-
def historic?() @year_end ? true : false; end
|
|
22
|
-
alias_method :past?, :historic?
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def initialize
|
|
26
|
-
@alt_names = []
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
end # class Team
|
|
32
|
-
|
|
8
|
+
class ClubReader
|
|
33
9
|
|
|
34
10
|
|
|
35
11
|
def self.read( path ) ## use - rename to read_file or from_file etc. - why? why not?
|
|
@@ -89,12 +65,13 @@ def self.parse( txt )
|
|
|
89
65
|
## quick hack: if level is 1 assume country for now
|
|
90
66
|
## and extract country code e.g.
|
|
91
67
|
## Austria (at) => at
|
|
68
|
+
## todo/fix: allow code only e.g. at or aut without enclosing () too - why? why not?
|
|
92
69
|
if heading_level == 1
|
|
93
|
-
if heading =~ /\(([a-z]{2,3})\)/
|
|
70
|
+
if heading =~ /\(([a-z]{2,3})\)/i ## note allow (at) or (AUT) too
|
|
94
71
|
country_code = $1
|
|
95
72
|
|
|
96
73
|
## check country code - MUST exist for now!!!!
|
|
97
|
-
country = SportDb::Import.config.countries[ country_code
|
|
74
|
+
country = SportDb::Import.config.countries[ country_code ]
|
|
98
75
|
if country.nil?
|
|
99
76
|
puts "!!! error [team reader] - unknown country with code >#{country_code}< - sorry - add country to config to fix"
|
|
100
77
|
exit 1
|
|
@@ -150,7 +127,7 @@ def self.parse( txt )
|
|
|
150
127
|
else
|
|
151
128
|
values = line.split( ',' )
|
|
152
129
|
|
|
153
|
-
rec =
|
|
130
|
+
rec = Club.new
|
|
154
131
|
value = values.shift ## get first item
|
|
155
132
|
## strip and squish (white)spaces
|
|
156
133
|
# e.g. New York FC (2011-) => New York FC (2011-)
|
|
@@ -231,7 +208,7 @@ def self.parse( txt )
|
|
|
231
208
|
|
|
232
209
|
## 1) add country if present
|
|
233
210
|
if headings.size > 0 && headings[0]
|
|
234
|
-
country = SportDb::Import.config.countries[ headings[0]
|
|
211
|
+
country = SportDb::Import.config.countries[ headings[0] ]
|
|
235
212
|
rec.country = country
|
|
236
213
|
else
|
|
237
214
|
## make it an error - why? why not?
|
|
@@ -292,7 +269,7 @@ def self.split_geo( str )
|
|
|
292
269
|
geos
|
|
293
270
|
end
|
|
294
271
|
|
|
295
|
-
end # class
|
|
272
|
+
end # class ClubReader
|
|
296
273
|
|
|
297
274
|
|
|
298
275
|
end ## module Import
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module SportDb
|
|
4
|
+
module Import
|
|
5
|
+
|
|
6
|
+
##
|
|
7
|
+
# note: use our own (internal) club struct for now - why? why not?
|
|
8
|
+
# - check that shape/structure/fields/attributes match
|
|
9
|
+
# the Team struct in sportdb-text (in SportDb::Struct::Team) !!!!
|
|
10
|
+
class Club
|
|
11
|
+
## todo: use just names for alt_names - why? why not?
|
|
12
|
+
attr_accessor :name, :alt_names, :year, :ground, :city
|
|
13
|
+
|
|
14
|
+
## more attribs - todo/fix - also add "upstream" to struct & model!!!!!
|
|
15
|
+
attr_accessor :district, :geos, :year_end, :country
|
|
16
|
+
|
|
17
|
+
def historic?() @year_end ? true : false; end
|
|
18
|
+
alias_method :past?, :historic?
|
|
19
|
+
|
|
20
|
+
def initialize
|
|
21
|
+
@alt_names = []
|
|
22
|
+
end
|
|
23
|
+
end # class Club
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ClubIndex
|
|
28
|
+
|
|
29
|
+
def initialize
|
|
30
|
+
@clubs = {} ## clubs (indexed) by canonical name
|
|
31
|
+
@clubs_by_name = {}
|
|
32
|
+
@errors = []
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
attr_reader :errors
|
|
36
|
+
def errors?() @errors.empty? == false; end
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def add( rec_or_recs ) ## add club record / alt_names
|
|
40
|
+
recs = rec_or_recs.is_a?( Array ) ? rec_or_recs : [rec_or_recs] ## wrap (single) rec in array
|
|
41
|
+
|
|
42
|
+
recs.each do |rec|
|
|
43
|
+
## puts "adding:"
|
|
44
|
+
## pp rec
|
|
45
|
+
### step 1) add canonical name
|
|
46
|
+
old_rec = @clubs[ rec.name ]
|
|
47
|
+
if old_rec
|
|
48
|
+
puts "** !!! ERROR !!! - (canonical) name conflict - duplicate - >#{rec.name}< will overwrite >#{old_rec.name}<:"
|
|
49
|
+
pp old_rec
|
|
50
|
+
pp rec
|
|
51
|
+
exit 1
|
|
52
|
+
else
|
|
53
|
+
@clubs[ rec.name ] = rec
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
## step 2) add all names (canonical name + alt names)
|
|
57
|
+
names = [rec.name] + rec.alt_names
|
|
58
|
+
|
|
59
|
+
## check for duplicates - simple check for now - fix/improve
|
|
60
|
+
## todo/fix: (auto)remove duplicates - why? why not?
|
|
61
|
+
count = names.size
|
|
62
|
+
count_uniq = names.uniq.size
|
|
63
|
+
if count != count_uniq
|
|
64
|
+
puts "** !!! ERROR !!! - #{count-count_uniq} duplicate name(s):"
|
|
65
|
+
pp rec
|
|
66
|
+
exit 1
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
names.each_with_index do |name,i|
|
|
70
|
+
alt_recs = @clubs_by_name[ name ]
|
|
71
|
+
if alt_recs
|
|
72
|
+
msg = "** !!! WARN !!! - name conflict/duplicate - >#{name}< will overwrite >#{alt_recs[0].name}, #{alt_recs[0].country.name}< with >#{rec.name}, #{rec.country.name}<"
|
|
73
|
+
puts msg
|
|
74
|
+
@errors << msg
|
|
75
|
+
alt_recs << rec
|
|
76
|
+
else
|
|
77
|
+
@clubs_by_name[ name ] = [rec]
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end # method add
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def []( name ) ## lookup by canoncial name only
|
|
85
|
+
@clubs[ name ]
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def match( name )
|
|
89
|
+
## todo/check: return empty array if no match!!! and NOT nil (add || []) - why? why not?
|
|
90
|
+
@clubs_by_name[ name ]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def match_by( name:, country: )
|
|
95
|
+
## note: match must for now always include name
|
|
96
|
+
m = match( name )
|
|
97
|
+
if m ## filter by country
|
|
98
|
+
## note: country assumes / allows the country key or fifa code for now
|
|
99
|
+
country_rec = SportDb::Import.config.countries[ country ]
|
|
100
|
+
if country_rec.nil?
|
|
101
|
+
puts "** !!! ERROR !!! - unknown country >#{country}< - no match found, sorry - add to world/countries.txt in config"
|
|
102
|
+
exit 1
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
m = m.select { |club| club.country.key == country_rec.key }
|
|
106
|
+
m = nil if m.empty? ## note: reset to nil if no more matches
|
|
107
|
+
end
|
|
108
|
+
m
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def dump_duplicates # debug helper - report duplicate club name records
|
|
114
|
+
@clubs_by_name.each do |name, clubs|
|
|
115
|
+
if clubs.size > 1
|
|
116
|
+
puts "#{clubs.size} duplicates for >#{name}<:"
|
|
117
|
+
pp clubs
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end # class ClubIndex
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
end # module Import
|
|
126
|
+
end # module SportDb
|
|
@@ -6,41 +6,36 @@ module SportDb
|
|
|
6
6
|
|
|
7
7
|
class Configuration
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@
|
|
9
|
+
## todo/check: rename to country_mappings/index - why? why not?
|
|
10
|
+
## or countries_by_code or countries_by_key
|
|
11
|
+
def countries
|
|
12
|
+
@countries ||= build_country_index
|
|
13
|
+
@countries
|
|
13
14
|
end
|
|
14
15
|
|
|
15
|
-
def
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
def build_country_index ## todo/check: rename to setup_country_index or read_country_index - why? why not?
|
|
17
|
+
recs = read_csv( "#{SportDb::Boot.data_dir}/world/countries.txt" )
|
|
18
|
+
CountryIndex.new( recs )
|
|
18
19
|
end
|
|
19
20
|
|
|
20
|
-
def leagues
|
|
21
|
-
read_leagues() if @leagues.nil?
|
|
22
|
-
@leagues
|
|
23
|
-
end
|
|
24
21
|
|
|
25
22
|
|
|
23
|
+
def clubs
|
|
24
|
+
@clubs ||= build_club_index
|
|
25
|
+
@clubs
|
|
26
|
+
end
|
|
27
|
+
|
|
26
28
|
####
|
|
27
29
|
# todo/fix: find a better way to configure club / team datasets
|
|
28
30
|
attr_accessor :clubs_dir
|
|
29
31
|
def clubs_dir() @clubs_dir ||= './clubs'; end
|
|
30
32
|
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
CLUBS_REGEX2 = %r{ (?:^|/) # beginning (^) or beginning of path (/)
|
|
37
|
-
(?<country>[a-z]{2,3})-[^/]+?
|
|
38
|
-
/clubs\.txt$
|
|
34
|
+
CLUBS_REGEX = %r{ (?:^|/) # beginning (^) or beginning of path (/)
|
|
35
|
+
(?:[a-z]{1,3}\.)? # optional country code/key e.g. eng.clubs.txt
|
|
36
|
+
clubs\.txt$
|
|
39
37
|
}x
|
|
40
38
|
|
|
41
|
-
CLUBS_REGEX = Regexp.union( CLUBS_REGEX1, CLUBS_REGEX2 )
|
|
42
|
-
|
|
43
|
-
|
|
44
39
|
def find_clubs_datafiles( path )
|
|
45
40
|
datafiles = [] ## note: [country, path] pairs for now
|
|
46
41
|
|
|
@@ -48,106 +43,15 @@ class Configuration
|
|
|
48
43
|
candidates = Dir.glob( "#{path}/**/*.txt" )
|
|
49
44
|
pp candidates
|
|
50
45
|
candidates.each do |candidate|
|
|
51
|
-
|
|
52
|
-
if m
|
|
53
|
-
datafiles << [m[:country], candidate]
|
|
54
|
-
end
|
|
46
|
+
datafiles << candidate if CLUBS_REGEX.match( candidate )
|
|
55
47
|
end
|
|
56
48
|
|
|
57
49
|
pp datafiles
|
|
58
50
|
datafiles
|
|
59
51
|
end
|
|
60
52
|
|
|
61
|
-
=begin
|
|
62
|
-
CLUBS_DATAFILES = { ## path by country to clubs.txt
|
|
63
|
-
de: 'europe/de-deutschland',
|
|
64
|
-
fr: 'europe/fr-france',
|
|
65
|
-
mc: 'europe/mc-monaco',
|
|
66
|
-
es: 'europe/es-espana',
|
|
67
|
-
it: 'europe/it-italy',
|
|
68
|
-
pt: 'europe/pt-portugal',
|
|
69
|
-
nl: 'europe/nl-netherlands',
|
|
70
|
-
be: 'europe/be-belgium',
|
|
71
|
-
tr: 'europe/tr-turkey',
|
|
72
|
-
gr: 'europe/gr-greece',
|
|
73
|
-
eng: 'europe/eng-england',
|
|
74
|
-
wal: 'europe/wal-wales',
|
|
75
|
-
sco: 'europe/sco-scotland',
|
|
76
|
-
nir: 'europe/nir-northern-ireland',
|
|
77
|
-
at: 'europe/at-austria',
|
|
78
|
-
al: 'europe/al-albania',
|
|
79
|
-
bg: 'europe/bg-bulgaria',
|
|
80
|
-
by: 'europe/by-belarus',
|
|
81
|
-
ch: 'europe/ch-confoederatio-helvetica',
|
|
82
|
-
cy: 'europe/cy-cyprus',
|
|
83
|
-
cz: 'europe/cz-czech-republic',
|
|
84
|
-
dk: 'europe/dk-denmark',
|
|
85
|
-
fi: 'europe/fi-finland',
|
|
86
|
-
ge: 'europe/ge-georgia',
|
|
87
|
-
hr: 'europe/hr-croatia',
|
|
88
|
-
hu: 'europe/hu-hungary',
|
|
89
|
-
ie: 'europe/ie-ireland',
|
|
90
|
-
is: 'europe/is-iceland',
|
|
91
|
-
lu: 'europe/lu-luxembourg',
|
|
92
|
-
md: 'europe/md-moldova',
|
|
93
|
-
mt: 'europe/mt-malta',
|
|
94
|
-
no: 'europe/no-norway',
|
|
95
|
-
pl: 'europe/pl-poland',
|
|
96
|
-
ro: 'europe/ro-romania',
|
|
97
|
-
rs: 'europe/rs-serbia',
|
|
98
|
-
ru: 'europe/ru-russia',
|
|
99
|
-
se: 'europe/se-sweden',
|
|
100
|
-
si: 'europe/si-slovenia',
|
|
101
|
-
sk: 'europe/sk-slovakia',
|
|
102
|
-
ua: 'europe/ua-ukraine',
|
|
103
|
-
mx: 'north-america/mx-mexico',
|
|
104
|
-
us: 'north-america/us-united-states',
|
|
105
|
-
ca: 'north-america/ca-canada',
|
|
106
|
-
ar: 'south-america/ar-argentina',
|
|
107
|
-
br: 'south-america/br-brazil',
|
|
108
|
-
jp: 'asia/jp-japan',
|
|
109
|
-
cn: 'asia/cn-china' }
|
|
110
|
-
=end
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class ClubsHash ## todo/check: use (rename to) ClubsMapping(s) - why? why not?
|
|
115
|
-
def initialize
|
|
116
|
-
@h = {}
|
|
117
|
-
@errors = []
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
attr_reader :errors
|
|
121
|
-
def errors?() @errors.empty? == false; end
|
|
122
|
-
|
|
123
|
-
def add( rec ) ## add club record / alt_names
|
|
124
|
-
rec.alt_names.each do |alt_name|
|
|
125
|
-
alt_recs = @h[ alt_name ]
|
|
126
|
-
if alt_recs
|
|
127
|
-
msg = "** !!! WARN !!! - alt name conflict/duplicate - >#{alt_name}< will overwrite >#{alt_recs[0].name}, #{alt_recs[0].country.name}< with >#{rec.name}, #{rec.country.name}<"
|
|
128
|
-
puts msg
|
|
129
|
-
@errors << msg
|
|
130
|
-
alt_recs << rec
|
|
131
|
-
else
|
|
132
|
-
@h[ alt_name ] = [rec]
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
53
|
|
|
137
|
-
|
|
138
|
-
def []( alt_name ) ## quick fix: for now returns first name; use fetch for recs array for now!!!
|
|
139
|
-
## keep "compatible" with old code for now
|
|
140
|
-
alt_recs = @h[ alt_name ]
|
|
141
|
-
if alt_recs
|
|
142
|
-
alt_recs[0].name ## use canonical name of first match for now
|
|
143
|
-
else
|
|
144
|
-
nil # nothing found
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
end # class ClubHash
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
def read_teams ## todo/fix: rename to read_clubs - why? why not?
|
|
54
|
+
def build_club_index
|
|
151
55
|
## unify team names; team (builtin/known/shared) name mappings
|
|
152
56
|
## cleanup team names - use local ("native") name with umlaut etc.
|
|
153
57
|
recs = []
|
|
@@ -159,61 +63,32 @@ class Configuration
|
|
|
159
63
|
## check that name and alt_names for a club are all unique (not duplicates)
|
|
160
64
|
datafiles = find_clubs_datafiles( clubs_dir )
|
|
161
65
|
datafiles.each do |datafile|
|
|
162
|
-
|
|
163
|
-
path = datafile[1]
|
|
164
|
-
recs += TeamReader.read( path )
|
|
66
|
+
recs += ClubReader.read( datafile )
|
|
165
67
|
end
|
|
166
68
|
|
|
167
|
-
############################
|
|
168
|
-
## add team mappings
|
|
169
|
-
## alt names to canonical pretty (recommended unique) name
|
|
170
|
-
@team_mappings = ClubsHash.new
|
|
171
|
-
recs.each { |rec| @team_mappings.add( rec ) }
|
|
172
|
-
|
|
173
|
-
###
|
|
174
|
-
## reverse hash for lookup/list of "official / registered(?)"
|
|
175
|
-
## pretty recommended canonical unique (long form)
|
|
176
|
-
## team names
|
|
177
|
-
|
|
178
|
-
@teams = {}
|
|
179
|
-
recs.each do |rec|
|
|
180
|
-
old_rec = @teams[ rec.name ]
|
|
181
|
-
if old_rec
|
|
182
|
-
puts "** !!! ERROR !!! - (canonical) name conflict - duplicate - >#{rec.name}< will overwrite >#{old_rec.name}<:"
|
|
183
|
-
pp old_rec
|
|
184
|
-
pp rec
|
|
185
|
-
exit 1
|
|
186
|
-
else
|
|
187
|
-
@teams[ rec.name ] = rec
|
|
188
|
-
|
|
189
|
-
## note: check if there's an alternative name registered
|
|
190
|
-
## for the canonical name
|
|
191
|
-
## todo/fix: find a better scheme for (alt) name mapping - why? why not?
|
|
192
|
-
## allow alt names same as canonical names if not is the same club/record - why? why not?
|
|
193
|
-
alt_recs = @team_mappings.fetch( rec.name )
|
|
194
|
-
if alt_recs
|
|
195
|
-
puts "** !!! ERROR !!! - (canonical) name conflict - >#{rec.name}< registered already as alternative name mapping:"
|
|
196
|
-
pp alt_recs
|
|
197
|
-
|
|
198
|
-
## note: exit now only if it's the same club (that has alt name that is the canonical name)
|
|
199
|
-
exit 1 if alt_recs.include?(rec)
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
69
|
|
|
204
|
-
|
|
70
|
+
clubs = ClubIndex.new
|
|
71
|
+
clubs.add( recs )
|
|
72
|
+
|
|
73
|
+
if clubs.errors?
|
|
205
74
|
puts ""
|
|
206
75
|
puts "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
|
|
207
|
-
puts " #{
|
|
208
|
-
pp
|
|
76
|
+
puts " #{clubs.errors.size} errors:"
|
|
77
|
+
pp clubs.errors
|
|
209
78
|
## exit 1
|
|
210
79
|
end
|
|
211
80
|
|
|
212
|
-
|
|
213
|
-
end
|
|
81
|
+
clubs
|
|
82
|
+
end # method build_club_index
|
|
83
|
+
|
|
214
84
|
|
|
215
85
|
|
|
216
86
|
|
|
87
|
+
def leagues
|
|
88
|
+
read_leagues() if @leagues.nil?
|
|
89
|
+
@leagues
|
|
90
|
+
end
|
|
91
|
+
|
|
217
92
|
def read_leagues
|
|
218
93
|
#####
|
|
219
94
|
# add / read-in leagues config
|
|
@@ -3,154 +3,75 @@
|
|
|
3
3
|
module SportDb
|
|
4
4
|
module Import
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
li: ['Liechtenstein', 'LIE'],
|
|
22
|
-
pl: ['Poland', 'POL'],
|
|
23
|
-
cz: ['Czech Republic', 'CZE'],
|
|
24
|
-
sk: ['Slovakia', 'SVK'],
|
|
25
|
-
hu: ['Hungary', 'HUN'],
|
|
26
|
-
si: ['Slovenia', 'SVN'],
|
|
27
|
-
|
|
28
|
-
## western europe
|
|
29
|
-
be: ['Belgium', 'BEL'],
|
|
30
|
-
nl: ['Netherlands', 'NED'],
|
|
31
|
-
lu: ['Luxembourg', 'LUX'],
|
|
32
|
-
fr: ['France', 'FRA'],
|
|
33
|
-
mc: ['Monaco', 'MCO'],
|
|
34
|
-
es: ['Spain', 'ESP'],
|
|
35
|
-
ad: ['Andorra', 'AND'],
|
|
36
|
-
|
|
37
|
-
## northern europe / skandinavia
|
|
38
|
-
dk: ['Denmark', 'DEN'],
|
|
39
|
-
fi: ['Finland', 'FIN'],
|
|
40
|
-
no: ['Norway', 'NOR'],
|
|
41
|
-
se: ['Sweden', 'SWE'],
|
|
42
|
-
|
|
43
|
-
## eastern europe
|
|
44
|
-
ro: ['Romania', 'ROU'],
|
|
45
|
-
ru: ['Russia', 'RUS'],
|
|
46
|
-
al: ['Albania', 'ALB'],
|
|
47
|
-
am: ['Armenia', 'ARM'],
|
|
48
|
-
az: ['Azerbaijan', 'AZE'],
|
|
49
|
-
ba: ['Bosnia and Herzegovina', 'BIH'],
|
|
50
|
-
bg: ['Bulgaria', 'BUL'],
|
|
51
|
-
by: ['Belarus', 'BLR'],
|
|
52
|
-
|
|
53
|
-
## more european
|
|
54
|
-
cy: ['Cyprus', 'CYP'],
|
|
55
|
-
is: ['Iceland', 'ISL'],
|
|
56
|
-
fo: ['Faroe Islands', 'FRO'],
|
|
57
|
-
ge: ['Georgia', 'GEO'],
|
|
58
|
-
gi: ['Gibraltar', 'GIB'],
|
|
59
|
-
gr: ['Greece', 'GRE'],
|
|
60
|
-
hr: ['Croatia', 'CRO'],
|
|
61
|
-
it: ['Italy', 'ITA'],
|
|
62
|
-
sm: ['San Marino', 'SMR'],
|
|
63
|
-
ee: ['Estonia', 'EST'],
|
|
64
|
-
lt: ['Lithuania', 'LTU'],
|
|
65
|
-
lv: ['Latvija', 'LVA'],
|
|
66
|
-
md: ['Moldova', 'MDA'],
|
|
67
|
-
me: ['Montenegro', 'MNE'],
|
|
68
|
-
mk: ['Macedonia', 'MKD'],
|
|
69
|
-
mt: ['Malta', 'MLT'],
|
|
70
|
-
pt: ['Portugal', 'POR'],
|
|
71
|
-
rs: ['Serbia', 'SRB'],
|
|
72
|
-
tr: ['Turkey', 'TUR'],
|
|
73
|
-
ua: ['Ukraine', 'UKR'],
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
## north america
|
|
77
|
-
us: ['United States', 'USA'],
|
|
78
|
-
mx: ['Mexico', 'MEX'],
|
|
79
|
-
ca: ['Canada', 'CAN'],
|
|
80
|
-
|
|
81
|
-
## caribbean
|
|
82
|
-
ht: ['Haiti', 'HAI'],
|
|
83
|
-
pr: ['Puerto Rico', 'PUR'],
|
|
84
|
-
tt: ['Trinidad and Tobago', 'TRI'],
|
|
85
|
-
|
|
86
|
-
## central america
|
|
87
|
-
cr: ['Costa Rica', 'CRC'],
|
|
88
|
-
gt: ['Guatemala', 'GUA'],
|
|
89
|
-
hn: ['Honduras', 'HON'],
|
|
90
|
-
ni: ['Nicaragua', 'NCA'],
|
|
91
|
-
pa: ['Panama', 'PAN'],
|
|
92
|
-
sv: ['El Salvador', 'SLV'],
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
## south america
|
|
96
|
-
ar: ['Argentina', 'ARG'],
|
|
97
|
-
br: ['Brazil', 'BRA'],
|
|
98
|
-
bo: ['Bolivia', 'BOL'],
|
|
99
|
-
cl: ['Chile', 'CHI'],
|
|
100
|
-
co: ['Colombia', 'COL'],
|
|
101
|
-
ec: ['Ecuador', 'ECU'],
|
|
102
|
-
gy: ['Guyana', 'GUY'],
|
|
103
|
-
pe: ['Peru', 'PER'],
|
|
104
|
-
py: ['Paraguay', 'PAR'],
|
|
105
|
-
uy: ['Uruguay', 'URU'],
|
|
106
|
-
ve: ['Venezuela', 'VEN'],
|
|
107
|
-
|
|
108
|
-
## middle east
|
|
109
|
-
il: ['Israel', 'ISR'],
|
|
6
|
+
## built-in countries for (quick starter) auto-add
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# note: use our own (internal) country struct for now - why? why not?
|
|
10
|
+
# - check that shape/structure/fields/attributes match
|
|
11
|
+
# the Country struct in sportdb-text (in SportDb::Struct::Country)
|
|
12
|
+
## and the ActiveRecord model !!!!
|
|
13
|
+
class Country
|
|
14
|
+
## note: is read-only/immutable for now - why? why not?
|
|
15
|
+
## add cities (array/list) - why? why not?
|
|
16
|
+
attr_reader :key, :name, :fifa
|
|
17
|
+
def initialize( key, name, fifa )
|
|
18
|
+
@key, @name, @fifa = key, name, fifa
|
|
19
|
+
end
|
|
20
|
+
end # class Country
|
|
110
21
|
|
|
111
|
-
## asia
|
|
112
|
-
cn: ['China', 'CHN'],
|
|
113
|
-
jp: ['Japan', 'JPN'],
|
|
114
|
-
kz: ['Kazakhstan', 'KAZ'],
|
|
115
|
-
kr: ['South Korea', 'KOR'],
|
|
116
22
|
|
|
117
|
-
|
|
118
|
-
eg: ['Egypt', 'EGY'],
|
|
119
|
-
ma: ['Morocco', 'MAR'],
|
|
23
|
+
class CountryIndex
|
|
120
24
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
25
|
+
def initialize( recs )
|
|
26
|
+
@countries = []
|
|
27
|
+
@countries_by_code = {}
|
|
125
28
|
|
|
29
|
+
add( recs )
|
|
30
|
+
end
|
|
126
31
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
32
|
+
def add( recs )
|
|
33
|
+
###########################################
|
|
34
|
+
## auto-fill countries
|
|
35
|
+
## pp recs
|
|
36
|
+
recs.each do |rec|
|
|
37
|
+
## rec e.g. { key:'af', fifa:'AFG', name:'Afghanistan'}
|
|
38
|
+
|
|
39
|
+
key = rec[:key]
|
|
40
|
+
## note: remove territory of marker e.g. (UK), (US), etc. from name
|
|
41
|
+
## e.g. England (UK) => England
|
|
42
|
+
## Puerto Rico (US) => Puerto Rico
|
|
43
|
+
name = rec[:name].sub( /\([A-Z]{2}\)/, '' ).strip
|
|
44
|
+
fifa = rec[:fifa]
|
|
45
|
+
|
|
46
|
+
country = Country.new( key, name, fifa )
|
|
47
|
+
@countries << country
|
|
48
|
+
|
|
49
|
+
## add codes lookups - key, fifa, ...
|
|
50
|
+
if @countries_by_code[ country.key ]
|
|
51
|
+
puts "** !! ERROR !! country code (key) >#{country.key}< already exits!!"
|
|
52
|
+
exit 1
|
|
53
|
+
else
|
|
54
|
+
@countries_by_code[ country.key ] = country
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
## add fifa code (only) if different from key
|
|
58
|
+
if country.key != country.fifa.downcase
|
|
59
|
+
if @countries_by_code[ country.fifa.downcase ]
|
|
60
|
+
puts "** !! ERROR !! country code (fifa) >#{country.fifa.downcase}< already exits!!"
|
|
61
|
+
exit 1
|
|
62
|
+
else
|
|
63
|
+
@countries_by_code[ country.fifa.downcase ] = country
|
|
64
|
+
end
|
|
65
|
+
end
|
|
138
66
|
end
|
|
139
|
-
end
|
|
67
|
+
end # method initialize
|
|
140
68
|
|
|
141
|
-
|
|
142
|
-
##
|
|
143
|
-
|
|
144
|
-
## note: convertcountry data to "proper" struct
|
|
145
|
-
@countries ||= COUNTRIES.each.reduce({}) do |h,(key,value)|
|
|
146
|
-
## note: convert key (e.g. :eng to string e.g. 'eng')
|
|
147
|
-
h[key] = Country.new( key.to_s, value[0], value[1] )
|
|
148
|
-
h
|
|
149
|
-
end
|
|
150
|
-
@countries
|
|
69
|
+
def []( key )
|
|
70
|
+
key = key.to_s.downcase ## allow symbols (and always downcase e.g. AUT to aut etc.)
|
|
71
|
+
@countries_by_code[ key ]
|
|
151
72
|
end
|
|
73
|
+
end # class CountryIndex
|
|
74
|
+
|
|
152
75
|
|
|
153
|
-
end # class Configuration
|
|
154
76
|
end # module Import
|
|
155
77
|
end # module SportDb
|
|
156
|
-
|
|
@@ -8,7 +8,7 @@ module Boot ## note: use a different module than Config to avoid confusion
|
|
|
8
8
|
|
|
9
9
|
MAJOR = 0 ## todo: namespace inside version or something - why? why not??
|
|
10
10
|
MINOR = 3
|
|
11
|
-
PATCH =
|
|
11
|
+
PATCH = 5
|
|
12
12
|
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
|
13
13
|
|
|
14
14
|
def self.version
|
|
@@ -28,9 +28,5 @@ module Boot ## note: use a different module than Config to avoid confusion
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
# def self.test_data_dir
|
|
32
|
-
# "#{root}/test/data"
|
|
33
|
-
# end
|
|
34
|
-
|
|
35
31
|
end # module Boot
|
|
36
32
|
end # module SportDb
|
data/lib/sportdb/config.rb
CHANGED
|
@@ -6,6 +6,12 @@ require 'date'
|
|
|
6
6
|
require 'fileutils'
|
|
7
7
|
|
|
8
8
|
|
|
9
|
+
## 3rd party gems
|
|
10
|
+
require 'csvreader'
|
|
11
|
+
|
|
12
|
+
def read_csv( path )
|
|
13
|
+
CsvHash.read( path, :header_converters => :symbol )
|
|
14
|
+
end
|
|
9
15
|
|
|
10
16
|
###
|
|
11
17
|
# our own code
|
|
@@ -15,9 +21,10 @@ require 'sportdb/config/season_utils'
|
|
|
15
21
|
require 'sportdb/config/league_utils'
|
|
16
22
|
require 'sportdb/config/league'
|
|
17
23
|
require 'sportdb/config/league_reader'
|
|
18
|
-
require 'sportdb/config/team_reader'
|
|
19
24
|
|
|
20
25
|
require 'sportdb/config/countries'
|
|
26
|
+
require 'sportdb/config/clubs'
|
|
27
|
+
require 'sportdb/config/club_reader'
|
|
21
28
|
require 'sportdb/config/config'
|
|
22
29
|
|
|
23
30
|
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
###
|
|
4
4
|
# to run use
|
|
5
|
-
# ruby -I ./lib -I ./test test/
|
|
5
|
+
# ruby -I ./lib -I ./test test/test_club_reader.rb
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
require 'helper'
|
|
9
9
|
|
|
10
|
-
class
|
|
10
|
+
class TestClubReader < MiniTest::Test
|
|
11
11
|
|
|
12
12
|
def test_parse_at
|
|
13
|
-
recs = SportDb::Import::
|
|
13
|
+
recs = SportDb::Import::ClubReader.parse( <<TXT )
|
|
14
14
|
==================================
|
|
15
15
|
= Austria (at)
|
|
16
16
|
|
|
@@ -29,7 +29,7 @@ TXT
|
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def test_parse_us
|
|
32
|
-
recs = SportDb::Import::
|
|
32
|
+
recs = SportDb::Import::ClubReader.parse( <<TXT )
|
|
33
33
|
==================================================
|
|
34
34
|
= United States (us)
|
|
35
35
|
|
|
@@ -59,7 +59,7 @@ TXT
|
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
def test_parse_years
|
|
62
|
-
recs = SportDb::Import::
|
|
62
|
+
recs = SportDb::Import::ClubReader.parse( <<TXT )
|
|
63
63
|
= United States (us)
|
|
64
64
|
FC Dallas (1996-), Frisco › Texas
|
|
65
65
|
Miami Fusion (1998-2001), Fort Lauderdale › Florida
|
|
@@ -84,7 +84,7 @@ TXT
|
|
|
84
84
|
end
|
|
85
85
|
|
|
86
86
|
def test_parse_geos
|
|
87
|
-
recs = SportDb::Import::
|
|
87
|
+
recs = SportDb::Import::ClubReader.parse( <<TXT )
|
|
88
88
|
= England (eng)
|
|
89
89
|
== Greater London
|
|
90
90
|
|
|
@@ -123,7 +123,7 @@ TXT
|
|
|
123
123
|
|
|
124
124
|
|
|
125
125
|
def test_parse_headings
|
|
126
|
-
recs = SportDb::Import::
|
|
126
|
+
recs = SportDb::Import::ClubReader.parse( <<TXT )
|
|
127
127
|
==============
|
|
128
128
|
====
|
|
129
129
|
===========
|
|
@@ -147,4 +147,4 @@ TXT
|
|
|
147
147
|
assert_equal 0, recs.size
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
-
end # class
|
|
150
|
+
end # class TestClubReader
|
data/test/test_clubs.rb
CHANGED
|
@@ -9,28 +9,45 @@ require 'helper'
|
|
|
9
9
|
|
|
10
10
|
class TestClubs < MiniTest::Test
|
|
11
11
|
|
|
12
|
+
def test_clubs
|
|
13
|
+
## todo/check: move config.clubs_dir to test/helper for global setting - why? why not?
|
|
14
|
+
SportDb::Import.config.clubs_dir = '../../../openfootball/clubs'
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
def match2( txt ) SportDb::Import::Configuration::CLUBS_REGEX2.match( txt ); end
|
|
16
|
+
pp SportDb::Import.config.clubs.errors
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
m = match1( 'de.clubs.txt' )
|
|
18
|
-
assert_equal 'de', m[:country]
|
|
18
|
+
SportDb::Import.config.clubs.dump_duplicates
|
|
19
19
|
|
|
20
|
-
m =
|
|
21
|
-
assert_equal '
|
|
20
|
+
m = SportDb::Import.config.clubs.match( 'Rapid Wien' )
|
|
21
|
+
assert_equal 'SK Rapid Wien', m[0].name
|
|
22
|
+
assert_equal 'Austria', m[0].country.name
|
|
23
|
+
assert_equal 'Wien', m[0].city
|
|
22
24
|
|
|
23
|
-
|
|
24
|
-
assert_equal '
|
|
25
|
+
c = SportDb::Import.config.clubs[ 'SK Rapid Wien' ] ## check canoncial name match (only)
|
|
26
|
+
assert_equal 'SK Rapid Wien', c.name
|
|
27
|
+
assert_equal 'Austria', c.country.name
|
|
28
|
+
assert_equal 'Wien', c.city
|
|
25
29
|
|
|
26
|
-
m = match2( 'de-deutschland/clubs.txt' )
|
|
27
|
-
assert_equal 'de', m[:country]
|
|
28
30
|
|
|
31
|
+
m = SportDb::Import.config.clubs.match( 'Arsenal' )
|
|
32
|
+
assert_equal 3, m.size
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
m = SportDb::Import.config.clubs.match_by( name: 'Arsenal', country: 'eng' )
|
|
35
|
+
assert_equal 1, m.size
|
|
36
|
+
assert_equal 'Arsenal FC', m[0].name
|
|
37
|
+
assert_equal 'England', m[0].country.name
|
|
38
|
+
assert_equal 'London', m[0].city
|
|
39
|
+
|
|
40
|
+
m = SportDb::Import.config.clubs.match_by( name: 'Arsenal', country: 'ar' )
|
|
41
|
+
assert_equal 1, m.size
|
|
42
|
+
assert_equal 'Arsenal de Sarandí', m[0].name
|
|
43
|
+
assert_equal 'Argentina', m[0].country.name
|
|
44
|
+
assert_equal 'Sarandí', m[0].city
|
|
45
|
+
|
|
46
|
+
m = SportDb::Import.config.clubs.match_by( name: 'Arsenal', country: 'ru' )
|
|
47
|
+
assert_equal 1, m.size
|
|
48
|
+
assert_equal 'Arsenal Tula', m[0].name
|
|
49
|
+
assert_equal 'Russia', m[0].country.name
|
|
50
|
+
assert_equal 'Tula', m[0].city
|
|
34
51
|
end
|
|
35
52
|
|
|
36
53
|
end # class TestClubs
|
data/test/test_config.rb
CHANGED
|
@@ -9,12 +9,15 @@ require 'helper'
|
|
|
9
9
|
|
|
10
10
|
class TestConfig < MiniTest::Test
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
def match( txt ) SportDb::Import::Configuration::CLUBS_REGEX.match( txt ); end
|
|
13
|
+
|
|
14
|
+
def test_find_clubs
|
|
15
|
+
assert match( 'de.clubs.txt' )
|
|
16
|
+
assert match( 'deutschland/de.clubs.txt' )
|
|
17
|
+
assert match( 'europe/de-deutschland/clubs.txt' )
|
|
18
|
+
assert match( 'de-deutschland/clubs.txt' )
|
|
19
|
+
assert match( 'clubs.txt' )
|
|
20
|
+
assert match( 'deutschland/clubs.txt' )
|
|
21
|
+
end
|
|
19
22
|
|
|
20
23
|
end # class TestConfig
|
data/test/test_countries.rb
CHANGED
|
@@ -9,18 +9,34 @@ require 'helper'
|
|
|
9
9
|
|
|
10
10
|
class TestCountries < MiniTest::Test
|
|
11
11
|
|
|
12
|
+
def test_read_countries
|
|
13
|
+
recs = read_csv( "#{SportDb::Boot.data_dir}/world/countries.txt" )
|
|
14
|
+
## pp recs
|
|
15
|
+
|
|
16
|
+
assert_equal [{ key:'af', fifa:'AFG', name:'Afghanistan'},
|
|
17
|
+
{ key:'al', fifa:'ALB', name:'Albania'}], recs[0..1]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
12
21
|
def test_countries
|
|
13
|
-
pp SportDb::Import.config.countries
|
|
22
|
+
## pp SportDb::Import.config.countries
|
|
14
23
|
|
|
15
24
|
eng = SportDb::Import.config.countries[:eng]
|
|
16
25
|
assert_equal 'eng', eng.key
|
|
17
26
|
assert_equal 'England', eng.name
|
|
18
|
-
assert_equal 'ENG', eng.
|
|
27
|
+
assert_equal 'ENG', eng.fifa
|
|
19
28
|
|
|
20
29
|
at = SportDb::Import.config.countries[:at]
|
|
21
30
|
assert_equal 'at', at.key
|
|
22
31
|
assert_equal 'Austria', at.name
|
|
23
|
-
assert_equal 'AUT', at.
|
|
32
|
+
assert_equal 'AUT', at.fifa
|
|
33
|
+
|
|
34
|
+
aut = SportDb::Import.config.countries[:aut]
|
|
35
|
+
assert_equal 'at', aut.key
|
|
36
|
+
assert_equal 'Austria', aut.name
|
|
37
|
+
assert_equal 'AUT', aut.fifa
|
|
38
|
+
|
|
39
|
+
assert aut == at
|
|
24
40
|
end
|
|
25
41
|
|
|
26
42
|
end # class TestCountries
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sportdb-config
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Gerald Bauer
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-07-
|
|
11
|
+
date: 2019-07-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: csvreader
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: 1.2.4
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: 1.2.4
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: rdoc
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -46,38 +60,41 @@ extra_rdoc_files:
|
|
|
46
60
|
- HISTORY.md
|
|
47
61
|
- Manifest.txt
|
|
48
62
|
- README.md
|
|
49
|
-
- config/geos/eng.txt
|
|
50
63
|
- config/leagues/eng.txt
|
|
51
64
|
- config/leagues/fr.txt
|
|
52
65
|
- config/leagues/gr.txt
|
|
53
66
|
- config/leagues/sco.txt
|
|
67
|
+
- config/world/countries.txt
|
|
68
|
+
- config/world/eng.txt
|
|
54
69
|
files:
|
|
55
70
|
- HISTORY.md
|
|
56
71
|
- Manifest.txt
|
|
57
72
|
- README.md
|
|
58
73
|
- Rakefile
|
|
59
|
-
- config/geos/eng.txt
|
|
60
74
|
- config/leagues/eng.txt
|
|
61
75
|
- config/leagues/fr.txt
|
|
62
76
|
- config/leagues/gr.txt
|
|
63
77
|
- config/leagues/sco.txt
|
|
78
|
+
- config/world/countries.txt
|
|
79
|
+
- config/world/eng.txt
|
|
64
80
|
- lib/sportdb/config.rb
|
|
81
|
+
- lib/sportdb/config/club_reader.rb
|
|
82
|
+
- lib/sportdb/config/clubs.rb
|
|
65
83
|
- lib/sportdb/config/config.rb
|
|
66
84
|
- lib/sportdb/config/countries.rb
|
|
67
85
|
- lib/sportdb/config/league.rb
|
|
68
86
|
- lib/sportdb/config/league_reader.rb
|
|
69
87
|
- lib/sportdb/config/league_utils.rb
|
|
70
88
|
- lib/sportdb/config/season_utils.rb
|
|
71
|
-
- lib/sportdb/config/team_reader.rb
|
|
72
89
|
- lib/sportdb/config/version.rb
|
|
73
90
|
- test/helper.rb
|
|
91
|
+
- test/test_club_reader.rb
|
|
74
92
|
- test/test_clubs.rb
|
|
75
93
|
- test/test_config.rb
|
|
76
94
|
- test/test_countries.rb
|
|
77
95
|
- test/test_league_reader.rb
|
|
78
96
|
- test/test_league_utils.rb
|
|
79
97
|
- test/test_season_utils.rb
|
|
80
|
-
- test/test_team_reader.rb
|
|
81
98
|
homepage: https://github.com/sportdb/sport.db
|
|
82
99
|
licenses:
|
|
83
100
|
- Public Domain
|