sportdb-formats 1.0.2 → 1.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +5 -0
  3. data/Rakefile +2 -2
  4. data/lib/sportdb/formats.rb +17 -5
  5. data/lib/sportdb/formats/country/country_index.rb +7 -7
  6. data/lib/sportdb/formats/country/country_reader.rb +26 -6
  7. data/lib/sportdb/formats/datafile_package.rb +10 -7
  8. data/lib/sportdb/formats/league/league_outline_reader.rb +24 -7
  9. data/lib/sportdb/formats/league/league_reader.rb +3 -3
  10. data/lib/sportdb/formats/match/mapper.rb +63 -63
  11. data/lib/sportdb/formats/match/mapper_teams.rb +1 -1
  12. data/lib/sportdb/formats/match/match_parser.rb +99 -180
  13. data/lib/sportdb/formats/match/match_parser_csv.rb +321 -0
  14. data/lib/sportdb/formats/package.rb +165 -11
  15. data/lib/sportdb/formats/parser_helper.rb +11 -2
  16. data/lib/sportdb/formats/score/score_formats.rb +41 -1
  17. data/lib/sportdb/formats/score/score_parser.rb +6 -0
  18. data/lib/sportdb/formats/structs/country.rb +6 -3
  19. data/lib/sportdb/formats/structs/group.rb +5 -12
  20. data/lib/sportdb/formats/structs/round.rb +6 -13
  21. data/lib/sportdb/formats/structs/standings.rb +30 -9
  22. data/lib/sportdb/formats/structs/team.rb +1 -2
  23. data/lib/sportdb/formats/team/club_reader_props.rb +3 -3
  24. data/lib/sportdb/formats/version.rb +4 -2
  25. data/test/helper.rb +2 -1
  26. data/test/test_club_reader_props.rb +2 -2
  27. data/test/test_country_index.rb +4 -4
  28. data/test/test_country_reader.rb +34 -4
  29. data/test/test_csv_match_parser.rb +114 -0
  30. data/test/test_csv_match_parser_utils.rb +20 -0
  31. data/test/test_csv_reader.rb +5 -5
  32. data/test/test_datafile.rb +0 -32
  33. data/test/test_datafile_package.rb +46 -0
  34. data/test/test_match_auto_relegation.rb +41 -0
  35. data/test/test_package.rb +60 -28
  36. data/test/test_package_match.rb +27 -3
  37. data/test/test_regex.rb +25 -7
  38. data/test/test_scores.rb +58 -49
  39. metadata +9 -4
@@ -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?
@@ -27,7 +27,7 @@ class ClubPropsReader
27
27
  def parse
28
28
  recs = parse_csv( @txt )
29
29
  recs.each do |rec|
30
- name = rec[:name]
30
+ name = rec['Name']
31
31
  if name.nil?
32
32
  puts "** !!! ERROR !!! Name column required / missing / NOT found in row:"
33
33
  pp rec
@@ -62,8 +62,8 @@ class ClubPropsReader
62
62
  ## todo/fix: only updated "on-demand" from in-memory struct/records!!!!
63
63
 
64
64
  ## update attributes
65
- club_rec.key = rec[:key] if rec[:key]
66
- club_rec.code = rec[:code] if rec[:code]
65
+ club_rec.key = rec['Key'] if rec['Key']
66
+ club_rec.code = rec['Code'] if rec['Code']
67
67
  ## todo/fix: add (some) more props e.g. address, web, etc.
68
68
  end
69
69
  end
@@ -2,11 +2,12 @@
2
2
 
3
3
 
4
4
  module SportDb
5
+ module Module
5
6
  module Formats
6
7
 
7
8
  MAJOR = 1 ## todo: namespace inside version or something - why? why not??
8
- MINOR = 0
9
- PATCH = 2
9
+ MINOR = 1
10
+ PATCH = 0
10
11
  VERSION = [MAJOR,MINOR,PATCH].join('.')
11
12
 
12
13
  def self.version
@@ -22,4 +23,5 @@ module Formats
22
23
  end
23
24
 
24
25
  end # module Formats
26
+ end # module Module
25
27
  end # module SportDb
@@ -1,5 +1,6 @@
1
1
  ## note: use the local version of gems
2
2
  $LOAD_PATH.unshift( File.expand_path( '../date-formats/lib' ))
3
+ $LOAD_PATH.unshift( File.expand_path( '../sportdb-langs/lib' ))
3
4
 
4
5
 
5
6
  ## minitest setup
@@ -147,7 +148,7 @@ def parse_json( str )
147
148
  end
148
149
 
149
150
  def read_test( path )
150
- blocks = read_blocks( "../football.txt/#{path}" )
151
+ blocks = read_blocks( "#{SportDb::Test.data_dir}/football.txt/#{path}" )
151
152
 
152
153
  if blocks.size == 2
153
154
  [blocks[0], parse_json( blocks[1] )]
@@ -29,8 +29,8 @@ TXT
29
29
  recs = parse_csv( ENG_CLUBS_PROPS_TXT )
30
30
  pp recs
31
31
 
32
- assert_equal [{ key: 'chelsea', name: 'Chelsea FC', code: 'CHE' },
33
- { key: 'arsenal', name: 'Arsenal FC', code: 'ARS' }], recs[0..1]
32
+ assert_equal [{ 'Key' => 'chelsea', 'Name' => 'Chelsea FC', 'Code' => 'CHE' },
33
+ { 'Key' => 'arsenal', 'Name' => 'Arsenal FC', 'Code' => 'ARS' }], recs[0..1]
34
34
  end
35
35
 
36
36
  CLUBS = SportDb::Import.catalog.clubs
@@ -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.fifa
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.fifa
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.fifa
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' )
@@ -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].fifa
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].fifa
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].fifa
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].fifa
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
@@ -0,0 +1,114 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_csv_match_parser.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestCsvMatchParser < MiniTest::Test
12
+
13
+ ##
14
+ # Div,Date,HomeTeam,AwayTeam,FTHG,FTAG,FTR,HTHG,HTAG,HTR,
15
+ # Referee,HS,AS,HST,AST,HF,AF,HC,AC,HY,AY,HR,AR,
16
+ # B365H,B365D,B365A,BWH,BWD,BWA,IWH,IWD,IWA,LBH,LBD,LBA,PSH,PSD,PSA,
17
+ # WHH,WHD,WHA,VCH,VCD,VCA,
18
+ # Bb1X2,BbMxH,BbAvH,BbMxD,BbAvD,BbMxA,BbAvA,BbOU,BbMx>2.5,BbAv>2.5,BbMx<2.5,BbAv<2.5,
19
+ # BbAH,BbAHh,BbMxAHH,BbAvAHH,BbMxAHA,BbAvAHA,PSCH,PSCD,PSCA
20
+ def test_eng_filters
21
+ path = "#{SportDb::Test.data_dir}/england/2017-18/E0.csv"
22
+
23
+ matches = SportDb::CsvMatchParser.read( path,
24
+ filters: { 'HomeTeam' => 'Arsenal' } )
25
+
26
+ pp path
27
+ pp matches[0..2]
28
+
29
+ m=matches[0]
30
+ assert_equal '2017-08-11', m.date
31
+ assert_equal 4, m.score1
32
+ assert_equal 3, m.score2
33
+ assert_equal 2, m.score1i
34
+ assert_equal 2, m.score2i
35
+ assert_equal 'Arsenal', m.team1
36
+ assert_equal 'Leicester', m.team2
37
+
38
+ m=matches[1]
39
+ assert_equal '2017-09-09', m.date
40
+ assert_equal 3, m.score1
41
+ assert_equal 0, m.score2
42
+ assert_equal 2, m.score1i
43
+ assert_equal 0, m.score2i
44
+ assert_equal 'Arsenal', m.team1
45
+ assert_equal 'Bournemouth', m.team2
46
+ end
47
+
48
+
49
+ def test_eng_headers
50
+ path = "#{SportDb::Test.data_dir}/england/2017-18/E0.csv"
51
+
52
+ headers = { team1: 'HomeTeam',
53
+ team2: 'AwayTeam',
54
+ date: 'Date',
55
+ score1: 'FTHG',
56
+ score2: 'FTAG' }
57
+
58
+ matches = SportDb::CsvMatchParser.read( path, headers: headers )
59
+
60
+ pp path
61
+ pp matches[0..2]
62
+
63
+ m=matches[0]
64
+ assert_equal '2017-08-11', m.date
65
+ assert_equal 4, m.score1
66
+ assert_equal 3, m.score2
67
+ assert_nil m.score1i ## todo/fix: missing half time (ht) score !!!!
68
+ assert_nil m.score2i ## todo/fix: missing half time (ht) score !!!!
69
+ assert_equal 'Arsenal', m.team1
70
+ assert_equal 'Leicester', m.team2
71
+
72
+ m=matches[1]
73
+ assert_equal '2017-08-12', m.date
74
+ assert_equal 0, m.score1
75
+ assert_equal 2, m.score2
76
+ assert_nil m.score1i ## todo/fix: missing half time (ht) score !!!!
77
+ assert_nil m.score2i ## todo/fix: missing half time (ht) score !!!!
78
+ assert_equal 'Brighton', m.team1
79
+ assert_equal 'Man City', m.team2
80
+ end
81
+
82
+
83
+ ###
84
+ # Country,League,Season,Date,Time,Home,Away,HG,AG,
85
+ # Res,PH,PD,PA,MaxH,MaxD,MaxA,AvgH,AvgD,AvgA
86
+ def test_at
87
+ path = "#{SportDb::Test.data_dir}/austria/AUT.csv"
88
+
89
+ matches = SportDb::CsvMatchParser.read( path, filters: { 'Season' => '2017/2018' } )
90
+
91
+ pp matches[0..2]
92
+ pp path
93
+
94
+ m=matches[0]
95
+ assert_equal '2017-07-22', m.date
96
+ assert_equal 2, m.score1
97
+ assert_equal 2, m.score2
98
+ assert_nil m.score1i ## todo/fix: missing half time (ht) score !!!!
99
+ assert_nil m.score2i ## todo/fix: missing half time (ht) score !!!!
100
+ assert_equal 'Rapid Vienna', m.team1
101
+ assert_equal 'Mattersburg', m.team2
102
+
103
+ m=matches[1]
104
+ assert_equal '2017-07-22', m.date
105
+ assert_equal 0, m.score1
106
+ assert_equal 2, m.score2
107
+ assert_nil m.score1i ## todo/fix: missing half time (ht) score !!!!
108
+ assert_nil m.score2i ## todo/fix: missing half time (ht) score !!!!
109
+ assert_equal 'AC Wolfsberger', m.team1
110
+ assert_equal 'Salzburg', m.team2
111
+ end
112
+
113
+
114
+ end # class TestCsvMatchParser
@@ -0,0 +1,20 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_csv_match_parser_utils.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+ class TestCsvMatchParserUtils < MiniTest::Test
11
+
12
+ def test_find_seasons
13
+ pp = SportDb::CsvMatchParser.find_seasons( "#{SportDb::Test.data_dir}/dl/AUT.csv" ) ## defaults to col: 'Season', col_sep: ','
14
+ pp = SportDb::CsvMatchParser.find_seasons( "#{SportDb::Test.data_dir}/dl/Bundesliga_1963_2014.csv", col: 'Saison', sep: ';' )
15
+ assert true
16
+ end
17
+
18
+ end # class TestCsvMatchParserUtils
19
+
20
+
@@ -13,7 +13,7 @@ class TestCsvReader < MiniTest::Test
13
13
  recs = parse_csv( <<TXT )
14
14
  ### World Countries
15
15
 
16
- key, fifa, name
16
+ Key, Code, Name
17
17
  af, AFG, Afghanistan
18
18
  al, ALB, Albania
19
19
  dz, ALG, Algeria
@@ -21,10 +21,10 @@ as, ASA, American Samoa (US)
21
21
  TXT
22
22
 
23
23
  pp recs
24
- assert_equal [{ key:'af', fifa:'AFG', name:'Afghanistan'},
25
- { key:'al', fifa:'ALB', name:'Albania'},
26
- { key:'dz', fifa:'ALG', name:'Algeria'},
27
- { key:'as', fifa:'ASA', name:'American Samoa (US)'},
24
+ assert_equal [{ 'Key' => 'af', 'Code' => 'AFG', 'Name' => 'Afghanistan'},
25
+ { 'Key' => 'al', 'Code' => 'ALB', 'Name' => 'Albania'},
26
+ { 'Key' => 'dz', 'Code' => 'ALG', 'Name' => 'Algeria'},
27
+ { 'Key' => 'as', 'Code' => 'ASA', 'Name' => 'American Samoa (US)'},
28
28
  ], recs[0..3]
29
29
  end
30
30
 
@@ -27,36 +27,4 @@ class TestDatafile < MiniTest::Test
27
27
  assert Datafile::Package.match_exclude?( '/.build/leagues.txt' )
28
28
  assert Datafile::Package.match_exclude?( '/.git/leagues.txt' )
29
29
  end
30
-
31
-
32
- CLUBS_DIR = '../../../openfootball/clubs' ## source repo directory path
33
- LEAGUES_DIR = '../../../openfootball/leagues'
34
-
35
- def test_bundle
36
- datafiles = SportDb::Package.find_clubs( CLUBS_DIR )
37
- pp datafiles
38
-
39
- ## todo/fix: turn into Datafile::Bundle.new and Bundle#write/save -why? why not?
40
- bundle = Datafile::Bundle.new( './tmp/clubs.txt' )
41
- bundle.write <<TXT
42
- ##########################################
43
- # auto-generated all-in-one single datafile clubs.txt bundle
44
- # on #{Time.now} from #{datafiles.size} datafile(s)
45
- TXT
46
- bundle.write datafiles
47
- bundle.close
48
- end
49
-
50
- def test_bundle_old
51
- datafiles = SportDb::Package.find_leagues( LEAGUES_DIR )
52
- pp datafiles
53
-
54
- Datafile.write_bundle( './tmp/leagues.txt',
55
- datafiles: datafiles,
56
- header: <<TXT )
57
- ##########################################
58
- # auto-generated all-in-one single datafile leagues.txt bundle
59
- # on #{Time.now} from #{datafiles.size} datafile(s)
60
- TXT
61
- end
62
30
  end # class TestDatafile
@@ -0,0 +1,46 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_datafile_package.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestDatafilePackage < MiniTest::Test
12
+
13
+ def test_read
14
+ [Datafile::DirPackage.new( '../../../openfootball/england' ),
15
+ Datafile::ZipPackage.new( 'tmp/england-master.zip' )
16
+ ].each do |eng|
17
+ assert eng.find( '2015-16/.conf.txt' ).read.start_with?( '= English Premier League 2015/16' )
18
+ assert eng.find( '2017-18/.conf.txt' ).read.start_with?( '= English Premier League 2017/18' )
19
+ assert eng.find( '2015-16/1-premierleague-i.txt' ).read.start_with?( '= English Premier League 2015/16' )
20
+ end
21
+
22
+ [Datafile::DirPackage.new( '../../../openfootball/austria' ),
23
+ Datafile::ZipPackage.new( 'tmp/austria-master.zip' )
24
+ ].each do |at|
25
+ assert at.find( '2018-19/.conf.txt' ).read.start_with?( '= Österr. Bundesliga 2018/19' )
26
+ end
27
+
28
+ puts "DirPackage:"
29
+ pack = Datafile::DirPackage.new( '../../../openfootball/austria' )
30
+ puts pack.name
31
+ puts " entries:"
32
+ pack.each( pattern: /\.txt$/ ) do |entry|
33
+ puts entry.name
34
+ end
35
+
36
+ puts "ZipPackage:"
37
+ pack = Datafile::ZipPackage.new( 'tmp/austria-master.zip' )
38
+ puts pack.name
39
+ puts " entries:"
40
+ pack.each( pattern: /\.txt$/ ) do |entry|
41
+ puts entry.name
42
+ end
43
+
44
+ end # method test_read
45
+
46
+ end # class TestDatafilePackage
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_match_auto_relegation.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestMatchAutoRelegation < MiniTest::Test
12
+
13
+ def test_rel
14
+ txt = <<TXT
15
+ Hinspiel
16
+ [31.5.]
17
+ SC Wiener Neustadt 0-2 SKN St. Pölten
18
+
19
+ Rückspiel
20
+ [3.6.]
21
+ SKN St. Pölten 1-1 SC Wiener Neustadt
22
+ TXT
23
+
24
+ start = Date.new( 2017, 7, 1 )
25
+ SportDb::Import.config.lang = 'de'
26
+
27
+ teams, rounds, groups, round_defs, group_defs = SportDb::AutoConfParser.parse( txt, start: start )
28
+
29
+ puts "teams:"
30
+ pp teams
31
+ puts "rounds:"
32
+ pp rounds
33
+ puts "groups:"
34
+ pp groups
35
+ puts "round defs:"
36
+ pp round_defs
37
+ puts "group defs:"
38
+ pp group_defs
39
+ end
40
+
41
+ end # class TestMatchAutoRelegation