sportdb-formats 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Manifest.txt +21 -0
- data/lib/sportdb/formats.rb +63 -0
- data/lib/sportdb/formats/country/country_index.rb +192 -0
- data/lib/sportdb/formats/country/country_reader.rb +122 -0
- data/lib/sportdb/formats/league/league_index.rb +174 -0
- data/lib/sportdb/formats/league/league_outline_reader.rb +141 -0
- data/lib/sportdb/formats/league/league_reader.rb +162 -0
- data/lib/sportdb/formats/team/club_index.rb +336 -0
- data/lib/sportdb/formats/team/club_reader.rb +350 -0
- data/lib/sportdb/formats/team/club_reader_props.rb +75 -0
- data/lib/sportdb/formats/team/national_team_index.rb +114 -0
- data/lib/sportdb/formats/team/team_index.rb +43 -0
- data/lib/sportdb/formats/team/wiki_reader.rb +108 -0
- data/lib/sportdb/formats/version.rb +1 -1
- data/test/helper.rb +72 -0
- data/test/test_club_index.rb +183 -0
- data/test/test_club_reader.rb +201 -0
- data/test/test_club_reader_props.rb +54 -0
- data/test/test_country_index.rb +63 -0
- data/test/test_country_reader.rb +59 -0
- data/test/test_league_index.rb +157 -0
- data/test/test_league_outline_reader.rb +55 -0
- data/test/test_league_reader.rb +72 -0
- data/test/test_regex.rb +49 -0
- data/test/test_wiki_reader.rb +77 -0
- metadata +22 -1
@@ -0,0 +1,75 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
module SportDb
|
5
|
+
module Import
|
6
|
+
|
7
|
+
|
8
|
+
class ClubPropsReader
|
9
|
+
|
10
|
+
def catalog() Import.catalog; end
|
11
|
+
|
12
|
+
|
13
|
+
def self.read( path ) ## use - rename to read_file or from_file etc. - why? why not?
|
14
|
+
txt = File.open( path, 'r:utf-8' ) {|f| f.read }
|
15
|
+
parse( txt )
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.parse( txt )
|
19
|
+
new( txt ).parse
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def initialize( txt )
|
24
|
+
@txt = txt
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse
|
28
|
+
recs = parse_csv( @txt )
|
29
|
+
recs.each do |rec|
|
30
|
+
name = rec[:name]
|
31
|
+
if name.nil?
|
32
|
+
puts "** !!! ERROR !!! Name column required / missing / NOT found in row:"
|
33
|
+
pp rec
|
34
|
+
exit 1
|
35
|
+
end
|
36
|
+
|
37
|
+
## find / match club by (canocial) name
|
38
|
+
m = catalog.clubs.match( name )
|
39
|
+
if m && m.size > 1
|
40
|
+
puts "** !!! WARN !!! ambigious (multiple) club matches (#{m.size}) for name >#{name}< in props row:"
|
41
|
+
pp rec
|
42
|
+
pp m
|
43
|
+
|
44
|
+
## todo/fix: try filter by canonical name if more than one match
|
45
|
+
m = m.select { |club| club.name == name }
|
46
|
+
m = nil if m.empty? ## note: reset to nil if no more matches
|
47
|
+
end
|
48
|
+
|
49
|
+
if m.nil?
|
50
|
+
puts "** !!! ERROR !!! no club match for (canonical) name >#{name}< in props row:"
|
51
|
+
pp rec
|
52
|
+
exit 1
|
53
|
+
elsif m.size > 1
|
54
|
+
puts "** !!! ERROR !!! ambigious (multiple) club matches (#{m.size}) for (canonical) name >#{name}< in props row:"
|
55
|
+
pp rec
|
56
|
+
pp m
|
57
|
+
exit 1
|
58
|
+
else ## assume size == 1, bingo!!!
|
59
|
+
club_rec = m[0]
|
60
|
+
## todo/fix: warn if name differes from (canonical) name
|
61
|
+
## todo/fix: also add props to in-memory structs/records!!!
|
62
|
+
## todo/fix: only updated "on-demand" from in-memory struct/records!!!!
|
63
|
+
|
64
|
+
## update attributes
|
65
|
+
club_rec.key = rec[:key] if rec[:key]
|
66
|
+
club_rec.code = rec[:code] if rec[:code]
|
67
|
+
## todo/fix: add (some) more props e.g. address, web, etc.
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end # method parse
|
71
|
+
|
72
|
+
end # class ClubPropsReader
|
73
|
+
|
74
|
+
end ## module Import
|
75
|
+
end ## module SportDb
|
@@ -0,0 +1,114 @@
|
|
1
|
+
|
2
|
+
module SportDb
|
3
|
+
module Import
|
4
|
+
|
5
|
+
class NationalTeamIndex
|
6
|
+
|
7
|
+
attr_reader :teams ## all (national) team records
|
8
|
+
|
9
|
+
def initialize( recs )
|
10
|
+
@teams = []
|
11
|
+
@teams_by_code = {}
|
12
|
+
@teams_by_name = {}
|
13
|
+
|
14
|
+
add( recs )
|
15
|
+
end
|
16
|
+
|
17
|
+
include NameHelper
|
18
|
+
## incl. strip_year( name )
|
19
|
+
## has_year?( name)
|
20
|
+
## strip_lang( name )
|
21
|
+
## normalize( name )
|
22
|
+
|
23
|
+
|
24
|
+
def add( recs )
|
25
|
+
###########################################
|
26
|
+
## auto-fill national teams
|
27
|
+
## pp recs
|
28
|
+
recs.each do |rec|
|
29
|
+
@teams << rec
|
30
|
+
|
31
|
+
## add fifa code lookup
|
32
|
+
if @teams_by_code[ rec.code.downcase ]
|
33
|
+
puts "** !! ERROR !! national team code (code) >#{rec.code}< already exits!!"
|
34
|
+
exit 1
|
35
|
+
else
|
36
|
+
@teams_by_code[ rec.code.downcase ] = rec
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
## add all names (canonical name + alt names
|
41
|
+
names = [rec.name] + rec.alt_names
|
42
|
+
more_names = []
|
43
|
+
## check "hand-typed" names for year (auto-add)
|
44
|
+
## check for year(s) e.g. (1887-1911), (-2013),
|
45
|
+
## (1946-2001,2013-) etc.
|
46
|
+
names.each do |name|
|
47
|
+
if has_year?( name )
|
48
|
+
more_names << strip_year( name )
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
names += more_names
|
53
|
+
## check for duplicates - simple check for now - fix/improve
|
54
|
+
## todo/fix: (auto)remove duplicates - why? why not?
|
55
|
+
count = names.size
|
56
|
+
count_uniq = names.uniq.size
|
57
|
+
if count != count_uniq
|
58
|
+
puts "** !!! ERROR !!! - #{count-count_uniq} duplicate name(s) in national teams:"
|
59
|
+
pp names
|
60
|
+
pp rec
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
|
64
|
+
names.each_with_index do |name,i|
|
65
|
+
## check lang codes e.g. [en], [fr], etc.
|
66
|
+
## todo/check/fix: move strip_lang up in the chain - check for duplicates (e.g. only lang code marker different etc.) - why? why not?
|
67
|
+
name = strip_lang( name )
|
68
|
+
norm = normalize( name )
|
69
|
+
old_rec = @teams_by_name[ norm ]
|
70
|
+
if old_rec
|
71
|
+
## check if tame name already is included or is new team rec
|
72
|
+
msg = "** !!! ERROR !!! - national team name conflict/duplicate - >#{name}< will overwrite >#{old_rec.name}< with >#{rec.name}<"
|
73
|
+
puts msg
|
74
|
+
exit 1
|
75
|
+
else
|
76
|
+
@teams_by_name[ norm ] = rec
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end ## each record
|
80
|
+
end # method initialize
|
81
|
+
|
82
|
+
## fix/todo: add find_by (alias for find_by_name/find_by_code)
|
83
|
+
def find_by_code( code )
|
84
|
+
code = code.to_s.downcase ## allow symbols (and always downcase e.g. AUT to aut etc.)
|
85
|
+
@teams_by_code[ code ]
|
86
|
+
end
|
87
|
+
|
88
|
+
def find_by_name( name )
|
89
|
+
name = normalize( name.to_s ) ## allow symbols too (e.g. use to.s first)
|
90
|
+
@teams_by_name[ name ]
|
91
|
+
end
|
92
|
+
|
93
|
+
def find( q )
|
94
|
+
## check longest match first (assume name is longer than code)
|
95
|
+
## try lookup / find by (normalized) name first
|
96
|
+
team = find_by_name( q )
|
97
|
+
team = find_by_code( q ) if team.nil?
|
98
|
+
team
|
99
|
+
end
|
100
|
+
|
101
|
+
def find!( q )
|
102
|
+
team = find( q )
|
103
|
+
if team.nil?
|
104
|
+
puts "** !!! ERROR - no match for national team >#{q}< found"
|
105
|
+
exit 1
|
106
|
+
end
|
107
|
+
team
|
108
|
+
end
|
109
|
+
end # class NationalTeamIndex
|
110
|
+
|
111
|
+
|
112
|
+
end # module Import
|
113
|
+
end # module SportDb
|
114
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
|
2
|
+
module SportDb
|
3
|
+
module Import
|
4
|
+
|
5
|
+
|
6
|
+
class TeamIndex
|
7
|
+
## note: "virtual" index lets you search clubs and/or national_teams (don't care)
|
8
|
+
|
9
|
+
def catalog() Import.catalog; end
|
10
|
+
|
11
|
+
## todo/check: rename to/use map_by! for array version - why? why not?
|
12
|
+
def find_by!( name:, league:, mods: nil )
|
13
|
+
if name.is_a?( Array )
|
14
|
+
recs = []
|
15
|
+
name.each do |q|
|
16
|
+
recs << __find_by!( name: q, league: league, mods: mods )
|
17
|
+
end
|
18
|
+
recs
|
19
|
+
else ## assume single name
|
20
|
+
__find_by!( name: name, league: league, mods: mods )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def __find_by!( name:, league:, mods: nil )
|
25
|
+
if mods && mods[ league.key ] && mods[ league.key ][ name ]
|
26
|
+
mods[ league.key ][ name ]
|
27
|
+
else
|
28
|
+
if league.clubs?
|
29
|
+
if league.intl? ## todo/fix: add intl? to ActiveRecord league!!!
|
30
|
+
catalog.clubs.find!( name )
|
31
|
+
else ## assume clubs in domestic/national league tournament
|
32
|
+
catalog.clubs.find_by!( name: name, country: league.country )
|
33
|
+
end
|
34
|
+
else ## assume national teams (not clubs)
|
35
|
+
catalog.national_teams.find!( name )
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end # method __find_by!
|
39
|
+
|
40
|
+
end # class TeamIndex
|
41
|
+
|
42
|
+
end # module Import
|
43
|
+
end # module SportDb
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
module SportDb
|
5
|
+
module Import
|
6
|
+
|
7
|
+
|
8
|
+
class WikiReader ## todo/check: rename to WikiClubReader - why? why not?
|
9
|
+
|
10
|
+
class WikiClub # nested class
|
11
|
+
attr_reader :name, :country
|
12
|
+
def initialize( name, country )
|
13
|
+
@name, @country = name, country
|
14
|
+
end
|
15
|
+
end # (nested) class WikiClub
|
16
|
+
|
17
|
+
|
18
|
+
def catalog() Import.catalog; end
|
19
|
+
|
20
|
+
|
21
|
+
def self.read( path ) ## use - rename to read_file or from_file etc. - why? why not?
|
22
|
+
txt = File.open( path, 'r:utf-8' ) { |f| f.read }
|
23
|
+
parse( txt )
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.parse( txt )
|
27
|
+
new( txt ).parse
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialize( txt )
|
31
|
+
@txt = txt
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse
|
35
|
+
recs = []
|
36
|
+
last_country = nil ## note: supports only one level of headings for now (and that is a country)
|
37
|
+
|
38
|
+
@txt.each_line do |line|
|
39
|
+
line = line.strip
|
40
|
+
|
41
|
+
next if line.empty?
|
42
|
+
next if line.start_with?( '#' ) ## skip comments too
|
43
|
+
|
44
|
+
## strip inline (until end-of-line) comments too
|
45
|
+
## e.g Eupen => KAS Eupen, ## [de]
|
46
|
+
## => Eupen => KAS Eupen,
|
47
|
+
line = line.sub( /#.*/, '' ).strip
|
48
|
+
pp line
|
49
|
+
|
50
|
+
|
51
|
+
next if line =~ /^={1,}$/ ## skip "decorative" only heading e.g. ========
|
52
|
+
|
53
|
+
## note: like in wikimedia markup (and markdown) all optional trailing ==== too
|
54
|
+
## todo/check: allow === Text =-=-=-=-=-= too - why? why not?
|
55
|
+
if line =~ /^(={1,}) ## leading ======
|
56
|
+
([^=]+?) ## text (note: for now no "inline" = allowed)
|
57
|
+
=* ## (optional) trailing ====
|
58
|
+
$/x
|
59
|
+
heading_marker = $1
|
60
|
+
heading_level = $1.length ## count number of = for heading level
|
61
|
+
heading = $2.strip
|
62
|
+
|
63
|
+
puts "heading #{heading_level} >#{heading}<"
|
64
|
+
|
65
|
+
if heading_level > 1
|
66
|
+
puts "** !!! ERROR [wiki reader] !!! - - headings level too deep - only top / one level supported for now; sorry"
|
67
|
+
exit 1
|
68
|
+
end
|
69
|
+
|
70
|
+
## assume country in heading; allow all "formats" supported by parse e.g.
|
71
|
+
## Österreich • Austria (at)
|
72
|
+
## Österreich • Austria
|
73
|
+
## Austria
|
74
|
+
## Deutschland (de) • Germany
|
75
|
+
country = catalog.countries.parse( heading )
|
76
|
+
## check country code - MUST exist for now!!!!
|
77
|
+
if country.nil?
|
78
|
+
puts "!!! error [wiki reader] - unknown country >#{heading}< - sorry - add country to config to fix"
|
79
|
+
exit 1
|
80
|
+
end
|
81
|
+
|
82
|
+
last_country = country
|
83
|
+
pp last_country
|
84
|
+
else
|
85
|
+
## strip and squish (white)spaces
|
86
|
+
# e.g. New York FC (2011-) => New York FC (2011-)
|
87
|
+
value = line.strip.gsub( /[ \t]+/, ' ' )
|
88
|
+
|
89
|
+
## normalize (allow underscore (-) - replace with space)
|
90
|
+
## e.g. Cercle_Brugge_K.S.V. => Cercle Brugge K.S.V.
|
91
|
+
value = value.gsub( '_', ' ' )
|
92
|
+
|
93
|
+
if last_country.nil?
|
94
|
+
puts "** !!! ERROR [wiki reader] !!! - country heading missing for club name; sorry - add country heading to fix"
|
95
|
+
exit 1
|
96
|
+
end
|
97
|
+
|
98
|
+
rec = WikiClub.new( value, last_country )
|
99
|
+
recs << rec
|
100
|
+
end
|
101
|
+
end # each_line
|
102
|
+
recs
|
103
|
+
end # method read
|
104
|
+
|
105
|
+
end # class WikiReader
|
106
|
+
|
107
|
+
end ## module Import
|
108
|
+
end ## module SportDb
|
data/test/helper.rb
CHANGED
@@ -10,6 +10,78 @@ require 'minitest/autorun'
|
|
10
10
|
require 'sportdb/formats'
|
11
11
|
|
12
12
|
|
13
|
+
|
14
|
+
module SportDb
|
15
|
+
module Import
|
16
|
+
|
17
|
+
class TestCatalog
|
18
|
+
def build_country_index
|
19
|
+
recs = CountryReader.read( "#{Test.data_dir}/world/countries.txt" )
|
20
|
+
index = CountryIndex.new( recs )
|
21
|
+
index
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_league_index
|
25
|
+
recs = SportDb::Import::LeagueReader.parse( <<TXT )
|
26
|
+
= England =
|
27
|
+
1 English Premier League
|
28
|
+
| ENG PL | England Premier League | Premier League
|
29
|
+
2 English Championship
|
30
|
+
| ENG CS | England Championship | Championship
|
31
|
+
3 English League One
|
32
|
+
| England League One | League One
|
33
|
+
4 English League Two
|
34
|
+
5 English National League
|
35
|
+
|
36
|
+
cup EFL Cup
|
37
|
+
| League Cup | Football League Cup
|
38
|
+
| ENG LC | England Liga Cup
|
39
|
+
|
40
|
+
= Scotland =
|
41
|
+
1 Scottish Premiership
|
42
|
+
2 Scottish Championship
|
43
|
+
3 Scottish League One
|
44
|
+
4 Scottish League Two
|
45
|
+
TXT
|
46
|
+
|
47
|
+
leagues = SportDb::Import::LeagueIndex.new
|
48
|
+
leagues.add( recs )
|
49
|
+
leagues
|
50
|
+
end
|
51
|
+
|
52
|
+
def build_club_index
|
53
|
+
recs = ClubReader.parse( <<TXT )
|
54
|
+
= England
|
55
|
+
|
56
|
+
Chelsea FC
|
57
|
+
Arsenal FC
|
58
|
+
Tottenham Hotspur
|
59
|
+
West Ham United
|
60
|
+
Crystal Palace
|
61
|
+
Manchester United
|
62
|
+
Manchester City
|
63
|
+
TXT
|
64
|
+
|
65
|
+
index = ClubIndex.new
|
66
|
+
index.add( recs )
|
67
|
+
index
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def countries() @countries ||= build_country_index; end
|
72
|
+
def leagues() @leagues ||= build_league_index; end
|
73
|
+
def clubs() @clubs ||= build_club_index; end
|
74
|
+
end
|
75
|
+
|
76
|
+
configure do |config|
|
77
|
+
config.catalog = TestCatalog.new
|
78
|
+
end
|
79
|
+
|
80
|
+
end # module Import
|
81
|
+
end # module SportDb
|
82
|
+
|
83
|
+
|
84
|
+
|
13
85
|
################
|
14
86
|
## helper
|
15
87
|
|
@@ -0,0 +1,183 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_club_index.rb
|
6
|
+
|
7
|
+
|
8
|
+
require 'helper'
|
9
|
+
|
10
|
+
class TestClubIndex < MiniTest::Test
|
11
|
+
|
12
|
+
def test_match
|
13
|
+
|
14
|
+
recs = SportDb::Import::ClubReader.parse( <<TXT )
|
15
|
+
=================================
|
16
|
+
= Austria
|
17
|
+
|
18
|
+
== Wien ==
|
19
|
+
|
20
|
+
FK Austria Wien, Wien (Favoriten)
|
21
|
+
| Austria Vienna | Austria Wien
|
22
|
+
SK Rapid Wien, Wien (Hütteldorf)
|
23
|
+
| Rapid Vienna | Rapid Wien
|
24
|
+
|
25
|
+
|
26
|
+
====================================
|
27
|
+
= England
|
28
|
+
|
29
|
+
Arsenal FC, 1886, @ Emirates Stadium, London ## Greater London
|
30
|
+
| Arsenal | FC Arsenal
|
31
|
+
Chelsea FC, 1905, @ Stamford Bridge, London ## Greater London
|
32
|
+
| Chelsea | FC Chelsea
|
33
|
+
|
34
|
+
|
35
|
+
=====================================
|
36
|
+
= Russia
|
37
|
+
|
38
|
+
Arsenal Tula, Tula
|
39
|
+
| Arsenal | FC Arsenal Tula
|
40
|
+
|
41
|
+
|
42
|
+
===========================
|
43
|
+
= Argentina
|
44
|
+
|
45
|
+
== Buenos Aires ==
|
46
|
+
|
47
|
+
Arsenal de Sarandí, Sarandí › Buenos Aires # Sarandí es una ciudad de la Zona Sur del Gran Buenos Aires
|
48
|
+
| Arsenal | Arsenal Sarandi
|
49
|
+
| Arsenal FC | Arsenal Fútbol Club
|
50
|
+
TXT
|
51
|
+
|
52
|
+
clubs = SportDb::Import::ClubIndex.new
|
53
|
+
clubs.add( recs )
|
54
|
+
|
55
|
+
pp clubs.errors
|
56
|
+
|
57
|
+
clubs.dump_duplicates
|
58
|
+
|
59
|
+
m = clubs.match( 'Rapid Wien' )
|
60
|
+
assert_equal 'SK Rapid Wien', m[0].name
|
61
|
+
assert_equal 'Austria', m[0].country.name
|
62
|
+
assert_equal 'Wien', m[0].city
|
63
|
+
|
64
|
+
m = clubs.match( 'rapid wien' )
|
65
|
+
assert_equal 'SK Rapid Wien', m[0].name
|
66
|
+
assert_equal 'Austria', m[0].country.name
|
67
|
+
assert_equal 'Wien', m[0].city
|
68
|
+
|
69
|
+
## note: all dots (.) get always removed
|
70
|
+
m = clubs.match( '...r.a.p.i.d w.i.e.n...' )
|
71
|
+
assert_equal 'SK Rapid Wien', m[0].name
|
72
|
+
assert_equal 'Austria', m[0].country.name
|
73
|
+
assert_equal 'Wien', m[0].city
|
74
|
+
|
75
|
+
## note: all spaces and dashes (-) get always removed
|
76
|
+
m = clubs.match( '--- r a p i d w i e n ---' )
|
77
|
+
assert_equal 'SK Rapid Wien', m[0].name
|
78
|
+
assert_equal 'Austria', m[0].country.name
|
79
|
+
assert_equal 'Wien', m[0].city
|
80
|
+
|
81
|
+
m = clubs.match( 'RAPID WIEN' )
|
82
|
+
assert_equal 'SK Rapid Wien', m[0].name
|
83
|
+
assert_equal 'Austria', m[0].country.name
|
84
|
+
assert_equal 'Wien', m[0].city
|
85
|
+
|
86
|
+
|
87
|
+
c = clubs[ 'SK Rapid Wien' ] ## check canoncial name match (only)
|
88
|
+
assert_equal 'SK Rapid Wien', c.name
|
89
|
+
assert_equal 'Austria', c.country.name
|
90
|
+
assert_equal 'Wien', c.city
|
91
|
+
|
92
|
+
|
93
|
+
m = clubs.match( 'Arsenal' )
|
94
|
+
assert_equal 3, m.size
|
95
|
+
|
96
|
+
m = clubs.match( 'ARSENAL' )
|
97
|
+
assert_equal 3, m.size
|
98
|
+
|
99
|
+
m = clubs.match_by( name: 'Arsenal', country: 'eng' )
|
100
|
+
assert_equal 1, m.size
|
101
|
+
assert_equal 'Arsenal FC', m[0].name
|
102
|
+
assert_equal 'England', m[0].country.name
|
103
|
+
assert_equal 'London', m[0].city
|
104
|
+
|
105
|
+
club = clubs.find_by!( name: 'Arsenal', country: 'eng' )
|
106
|
+
assert_equal 'Arsenal FC', club.name
|
107
|
+
assert_equal 'England', club.country.name
|
108
|
+
assert_equal 'London', club.city
|
109
|
+
|
110
|
+
|
111
|
+
m = clubs.match_by( name: 'Arsenal', country: 'ar' )
|
112
|
+
assert_equal 1, m.size
|
113
|
+
assert_equal 'Arsenal de Sarandí', m[0].name
|
114
|
+
assert_equal 'Argentina', m[0].country.name
|
115
|
+
assert_equal 'Sarandí', m[0].city
|
116
|
+
|
117
|
+
club = clubs.find_by!( name: 'Arsenal', country: 'ar' )
|
118
|
+
assert_equal 'Arsenal de Sarandí', club.name
|
119
|
+
assert_equal 'Argentina', club.country.name
|
120
|
+
assert_equal 'Sarandí', club.city
|
121
|
+
|
122
|
+
|
123
|
+
m = clubs.match_by( name: 'Arsenal', country: 'ru' )
|
124
|
+
assert_equal 1, m.size
|
125
|
+
assert_equal 'Arsenal Tula', m[0].name
|
126
|
+
assert_equal 'Russia', m[0].country.name
|
127
|
+
assert_equal 'Tula', m[0].city
|
128
|
+
|
129
|
+
|
130
|
+
m = clubs.match( 'Arsenal FC' )
|
131
|
+
assert_equal 2, m.size
|
132
|
+
|
133
|
+
m = clubs.match( 'Arsenal F.C.' )
|
134
|
+
assert_equal 2, m.size
|
135
|
+
|
136
|
+
m = clubs.match( '...A.r.s.e.n.a.l... F.C...' )
|
137
|
+
assert_equal 2, m.size
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
def test_wikipedia # test wikipedia names and links/urls
|
142
|
+
|
143
|
+
recs = SportDb::Import::ClubReader.parse( <<TXT )
|
144
|
+
==================================
|
145
|
+
= Belgium
|
146
|
+
|
147
|
+
== Brussels ==
|
148
|
+
|
149
|
+
RSC Anderlecht, 1908, Brussels ## use (just) Anderlecht or Brussel-Anderlecht ??
|
150
|
+
| Anderlecht | R.S.C. Anderlecht | Royal Sporting Club Anderlecht
|
151
|
+
|
152
|
+
== West-Vlaanderen › Vlaanderen ==
|
153
|
+
|
154
|
+
Club Brugge, 1891, Brugge › West-Vlaanderen › Vlaanderen
|
155
|
+
| Club Brugge KV | Club Brugge Koninklijke Voetbalvereniging
|
156
|
+
TXT
|
157
|
+
|
158
|
+
|
159
|
+
clubs = SportDb::Import::ClubIndex.new
|
160
|
+
clubs.add( recs )
|
161
|
+
|
162
|
+
recs = SportDb::Import::WikiReader.parse( <<TXT )
|
163
|
+
==================================
|
164
|
+
= Belgium
|
165
|
+
|
166
|
+
R.S.C. Anderlecht
|
167
|
+
Club Brugge KV
|
168
|
+
TXT
|
169
|
+
clubs.add_wiki( recs )
|
170
|
+
|
171
|
+
|
172
|
+
m = clubs.match( 'Club Brugge KV' )
|
173
|
+
assert_equal 1, m.size
|
174
|
+
assert_equal 'Club Brugge KV', m[0].wikipedia
|
175
|
+
assert_equal 'https://en.wikipedia.org/wiki/Club_Brugge_KV', m[0].wikipedia_url
|
176
|
+
|
177
|
+
m = clubs.match( 'RSC Anderlecht' )
|
178
|
+
assert_equal 1, m.size
|
179
|
+
assert_equal 'R.S.C. Anderlecht', m[0].wikipedia
|
180
|
+
assert_equal 'https://en.wikipedia.org/wiki/R.S.C._Anderlecht', m[0].wikipedia_url
|
181
|
+
end
|
182
|
+
|
183
|
+
end # class TestClubIndex
|