sportdb-formats 1.1.0 → 1.1.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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +6 -34
  3. data/Rakefile +3 -6
  4. data/lib/sportdb/formats.rb +54 -70
  5. data/lib/sportdb/formats/country/country_index.rb +2 -2
  6. data/lib/sportdb/formats/event/event_index.rb +141 -0
  7. data/lib/sportdb/formats/event/event_reader.rb +183 -0
  8. data/lib/sportdb/formats/league/league_index.rb +22 -18
  9. data/lib/sportdb/formats/league/league_outline_reader.rb +24 -7
  10. data/lib/sportdb/formats/league/league_reader.rb +7 -1
  11. data/lib/sportdb/formats/match/match_parser.rb +47 -18
  12. data/lib/sportdb/formats/package.rb +59 -11
  13. data/lib/sportdb/formats/team/club_index.rb +13 -11
  14. data/lib/sportdb/formats/team/club_index_history.rb +134 -0
  15. data/lib/sportdb/formats/team/club_reader_history.rb +203 -0
  16. data/lib/sportdb/formats/team/club_reader_props.rb +20 -5
  17. data/lib/sportdb/formats/version.rb +1 -1
  18. data/test/helper.rb +50 -81
  19. data/test/test_club_index_history.rb +107 -0
  20. data/test/test_club_reader_history.rb +212 -0
  21. data/test/test_datafile_package.rb +1 -1
  22. metadata +11 -81
  23. data/lib/sportdb/formats/config.rb +0 -40
  24. data/lib/sportdb/formats/match/match_parser_csv.rb +0 -321
  25. data/lib/sportdb/formats/name_helper.rb +0 -84
  26. data/lib/sportdb/formats/score/score_formats.rb +0 -220
  27. data/lib/sportdb/formats/score/score_parser.rb +0 -202
  28. data/lib/sportdb/formats/season_utils.rb +0 -27
  29. data/lib/sportdb/formats/structs/country.rb +0 -31
  30. data/lib/sportdb/formats/structs/group.rb +0 -18
  31. data/lib/sportdb/formats/structs/league.rb +0 -37
  32. data/lib/sportdb/formats/structs/match.rb +0 -151
  33. data/lib/sportdb/formats/structs/matchlist.rb +0 -220
  34. data/lib/sportdb/formats/structs/round.rb +0 -25
  35. data/lib/sportdb/formats/structs/season.rb +0 -123
  36. data/lib/sportdb/formats/structs/standings.rb +0 -268
  37. data/lib/sportdb/formats/structs/team.rb +0 -150
  38. data/lib/sportdb/formats/structs/team_usage.rb +0 -88
  39. data/test/test_clubs.rb +0 -40
  40. data/test/test_conf.rb +0 -65
  41. data/test/test_csv_match_parser.rb +0 -114
  42. data/test/test_csv_match_parser_utils.rb +0 -20
  43. data/test/test_csv_reader.rb +0 -31
  44. data/test/test_match.rb +0 -30
  45. data/test/test_match_auto.rb +0 -72
  46. data/test/test_match_auto_champs.rb +0 -45
  47. data/test/test_match_auto_euro.rb +0 -37
  48. data/test/test_match_auto_relegation.rb +0 -41
  49. data/test/test_match_auto_worldcup.rb +0 -61
  50. data/test/test_match_champs.rb +0 -27
  51. data/test/test_match_eng.rb +0 -26
  52. data/test/test_match_euro.rb +0 -27
  53. data/test/test_match_worldcup.rb +0 -27
  54. data/test/test_name_helper.rb +0 -67
  55. data/test/test_scores.rb +0 -122
  56. data/test/test_season.rb +0 -62
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 216e15369403af5707b3d2c6d82fcd6c72e2712d
4
- data.tar.gz: 5c73e0e7ce7309b2c8fb86e38d90d1d566f80688
3
+ metadata.gz: df02092c7b7825d8f490db2a084ee9ea597c1d03
4
+ data.tar.gz: 1a4668e864faae56d438ba834738ca73b3768810
5
5
  SHA512:
6
- metadata.gz: 8033e4db4d7b047b37ec8b3be61657d15df72b7a6c6295317ca8c9cd19c0f578f2ecd75c25cf11b0dcb9218c1ff3e8d2a8e0efb0c59ae235b568b353ef55c9d6
7
- data.tar.gz: e5b510b45d4c28c6d83d6baa43ef954e78ae64af116c8305a983b5c54d2fda486425a793b48c8332dcf8cf5c441da37f7183602d50a7e07066049995b5940f0f
6
+ metadata.gz: ad775203cc25f042c5b3008833512945ea5345bd9d2cf64787d87c92b163248d6785a52d0731ae2f61d06eb378c0bd8ca9cfa2e91c1dc5da710c9ccfe6bc8de4
7
+ data.tar.gz: 41fea36796164be0deff4b297b9a7cece1344f9a16ef2fbec184d1f104c353a59ee30e221db4b6c9ccce7ba9009aafb8051593f510f8c81a1fa72d7fb797f5a1
@@ -3,11 +3,12 @@ Manifest.txt
3
3
  README.md
4
4
  Rakefile
5
5
  lib/sportdb/formats.rb
6
- lib/sportdb/formats/config.rb
7
6
  lib/sportdb/formats/country/country_index.rb
8
7
  lib/sportdb/formats/country/country_reader.rb
9
8
  lib/sportdb/formats/datafile.rb
10
9
  lib/sportdb/formats/datafile_package.rb
10
+ lib/sportdb/formats/event/event_index.rb
11
+ lib/sportdb/formats/event/event_reader.rb
11
12
  lib/sportdb/formats/goals.rb
12
13
  lib/sportdb/formats/league/league_index.rb
13
14
  lib/sportdb/formats/league/league_outline_reader.rb
@@ -17,26 +18,13 @@ lib/sportdb/formats/match/mapper.rb
17
18
  lib/sportdb/formats/match/mapper_teams.rb
18
19
  lib/sportdb/formats/match/match_parser.rb
19
20
  lib/sportdb/formats/match/match_parser_auto_conf.rb
20
- lib/sportdb/formats/match/match_parser_csv.rb
21
- lib/sportdb/formats/name_helper.rb
22
21
  lib/sportdb/formats/outline_reader.rb
23
22
  lib/sportdb/formats/package.rb
24
23
  lib/sportdb/formats/parser_helper.rb
25
- lib/sportdb/formats/score/score_formats.rb
26
- lib/sportdb/formats/score/score_parser.rb
27
- lib/sportdb/formats/season_utils.rb
28
- lib/sportdb/formats/structs/country.rb
29
- lib/sportdb/formats/structs/group.rb
30
- lib/sportdb/formats/structs/league.rb
31
- lib/sportdb/formats/structs/match.rb
32
- lib/sportdb/formats/structs/matchlist.rb
33
- lib/sportdb/formats/structs/round.rb
34
- lib/sportdb/formats/structs/season.rb
35
- lib/sportdb/formats/structs/standings.rb
36
- lib/sportdb/formats/structs/team.rb
37
- lib/sportdb/formats/structs/team_usage.rb
38
24
  lib/sportdb/formats/team/club_index.rb
25
+ lib/sportdb/formats/team/club_index_history.rb
39
26
  lib/sportdb/formats/team/club_reader.rb
27
+ lib/sportdb/formats/team/club_reader_history.rb
40
28
  lib/sportdb/formats/team/club_reader_props.rb
41
29
  lib/sportdb/formats/team/national_team_index.rb
42
30
  lib/sportdb/formats/team/team_index.rb
@@ -44,36 +32,20 @@ lib/sportdb/formats/team/wiki_reader.rb
44
32
  lib/sportdb/formats/version.rb
45
33
  test/helper.rb
46
34
  test/test_club_index.rb
35
+ test/test_club_index_history.rb
47
36
  test/test_club_reader.rb
37
+ test/test_club_reader_history.rb
48
38
  test/test_club_reader_props.rb
49
- test/test_clubs.rb
50
- test/test_conf.rb
51
39
  test/test_country_index.rb
52
40
  test/test_country_reader.rb
53
- test/test_csv_match_parser.rb
54
- test/test_csv_match_parser_utils.rb
55
- test/test_csv_reader.rb
56
41
  test/test_datafile.rb
57
42
  test/test_datafile_package.rb
58
43
  test/test_goals.rb
59
44
  test/test_league_index.rb
60
45
  test/test_league_outline_reader.rb
61
46
  test/test_league_reader.rb
62
- test/test_match.rb
63
- test/test_match_auto.rb
64
- test/test_match_auto_champs.rb
65
- test/test_match_auto_euro.rb
66
- test/test_match_auto_relegation.rb
67
- test/test_match_auto_worldcup.rb
68
- test/test_match_champs.rb
69
- test/test_match_eng.rb
70
- test/test_match_euro.rb
71
- test/test_match_worldcup.rb
72
- test/test_name_helper.rb
73
47
  test/test_outline_reader.rb
74
48
  test/test_package.rb
75
49
  test/test_package_match.rb
76
50
  test/test_regex.rb
77
- test/test_scores.rb
78
- test/test_season.rb
79
51
  test/test_wiki_reader.rb
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ Hoe.spec 'sportdb-formats' do
8
8
  self.summary = "sportdb-formats - sport.db format and text utilities"
9
9
  self.description = summary
10
10
 
11
- self.urls = ['https://github.com/sportdb/sport.db']
11
+ self.urls = { home: 'https://github.com/sportdb/sport.db' }
12
12
 
13
13
  self.author = 'Gerald Bauer'
14
14
  self.email = 'opensport@googlegroups.com'
@@ -20,12 +20,9 @@ Hoe.spec 'sportdb-formats' do
20
20
  self.licenses = ['Public Domain']
21
21
 
22
22
  self.extra_deps = [
23
- ['alphabets', '>= 1.0.0'],
24
- ['date-formats', '>= 1.0.1'],
25
- ['csvreader', '>= 1.2.4'],
26
- ['sportdb-langs', '>= 0.1.0'],
23
+ ['sportdb-structs', '>= 0.1.1'],
27
24
 
28
- ['rubyzip', '>= 1.2.4' ],
25
+ ['rubyzip', '>= 1.2.4' ],
29
26
  ]
30
27
 
31
28
  self.spec_extras = {
@@ -1,43 +1,9 @@
1
- # encoding: utf-8
2
-
3
-
4
1
  ## 3rd party gems
5
- require 'alphabets' # downcase_i18n, unaccent, variants, ...
6
- require 'date/formats' # DateFormats.parse, find!, ...
7
- require 'csvreader'
8
-
9
- require 'zip' ## todo/check: if zip is alreay included in a required module
10
-
11
-
12
-
13
- def read_csv( path, sep: nil,
14
- symbolize_names: nil )
15
- opts = {}
16
- opts[:sep] = sep if sep
17
- opts[:header_converters] = :symbol if symbolize_names
18
-
19
- CsvHash.read( path, **opts )
20
- end
21
-
22
- def parse_csv( txt, sep: nil,
23
- symbolize_names: nil )
24
- opts = {}
25
- opts[:sep] = sep if sep
26
- opts[:header_converters] = :symbol if symbolize_names
2
+ require 'sportdb/structs'
27
3
 
28
- CsvHash.parse( txt, **opts )
29
- end
30
-
31
-
32
-
33
- ## more sportdb libs/gems
34
- require 'sportdb/langs'
35
4
 
5
+ require 'zip' ## todo/check: if zip is alreay included in a required module
36
6
 
37
- ## todo/fix: move shortcut to sportdb/langs!!!
38
- module SportDb
39
- Logging = LogUtils::Logging ## logging machinery shortcut; use LogUtils for now
40
- end
41
7
 
42
8
 
43
9
 
@@ -45,41 +11,59 @@ end
45
11
  # our own code
46
12
  require 'sportdb/formats/version' # let version always go first
47
13
 
48
- require 'sportdb/formats/config' # let "global" config "framework" go next - why? why not?
49
-
50
14
  require 'sportdb/formats/outline_reader'
51
15
  require 'sportdb/formats/datafile'
52
16
  require 'sportdb/formats/datafile_package'
53
17
  require 'sportdb/formats/package'
54
- require 'sportdb/formats/season_utils'
55
18
 
56
- require 'sportdb/formats/name_helper'
19
+
57
20
  require 'sportdb/formats/parser_helper'
58
21
 
59
- require 'sportdb/formats/structs/country'
60
- require 'sportdb/formats/structs/season'
61
- require 'sportdb/formats/structs/league'
62
- require 'sportdb/formats/structs/team'
63
- require 'sportdb/formats/structs/round'
64
- require 'sportdb/formats/structs/group'
65
- require 'sportdb/formats/structs/match'
66
- require 'sportdb/formats/structs/matchlist'
67
- require 'sportdb/formats/structs/standings'
68
- require 'sportdb/formats/structs/team_usage'
22
+
23
+ module SportDb
24
+ module Import
25
+ Season = ::Season ## add a convenience alias for top-level Season class
26
+
27
+ ## add "old" convenience aliases for structs - why? why not?
28
+ ## todo/check: just use include Sports !!!!
29
+ Country = ::Sports::Country
30
+ League = ::Sports::League
31
+ Group = ::Sports::Group
32
+ Round = ::Sports::Round
33
+ Match = ::Sports::Match
34
+ Matchlist = ::Sports::Matchlist
35
+ Goal = ::Sports::Goal
36
+ Team = ::Sports::Team
37
+ NationalTeam = ::Sports::NationalTeam
38
+ Club = ::Sports::Club
39
+ Standings = ::Sports::Standings
40
+ TeamUsage = ::Sports::TeamUsage
41
+
42
+
43
+ class Team
44
+ ## add convenience lookup helper / method for name by season for now
45
+ ## use clubs history - for now kept separate from struct - why? why not?
46
+ def name_by_season( season )
47
+ ## note: returns / fallback to "regular" name if no records found in history
48
+ SportDb::Import.catalog.clubs_history.find_name_by( name: name, season: season ) || name
49
+ end
50
+ end # class Team
51
+
52
+ end # module Import
53
+ end # module SportDb
69
54
 
70
55
 
71
- require 'sportdb/formats/score/score_formats'
72
- require 'sportdb/formats/score/score_parser'
73
56
  require 'sportdb/formats/goals'
74
57
 
75
58
 
59
+
76
60
  require 'sportdb/formats/match/mapper'
77
61
  require 'sportdb/formats/match/mapper_teams'
78
62
  require 'sportdb/formats/match/match_parser'
79
63
  require 'sportdb/formats/match/match_parser_auto_conf'
80
64
  require 'sportdb/formats/match/conf_parser'
81
65
 
82
- require 'sportdb/formats/match/match_parser_csv'
66
+
83
67
 
84
68
  require 'sportdb/formats/country/country_reader'
85
69
  require 'sportdb/formats/country/country_index'
@@ -119,11 +103,15 @@ require 'sportdb/formats/team/wiki_reader'
119
103
  require 'sportdb/formats/team/national_team_index'
120
104
  require 'sportdb/formats/team/team_index'
121
105
 
106
+ require 'sportdb/formats/team/club_reader_history'
107
+ require 'sportdb/formats/team/club_index_history'
108
+
122
109
 
123
110
  ###
124
111
  # add convenience helpers / shortcuts
125
112
  module SportDb
126
- module Import
113
+ module Import
114
+
127
115
  class Club
128
116
  def self.read( path ) ClubReader.read( path ); end
129
117
  def self.parse( txt ) ClubReader.parse( txt ); end
@@ -132,31 +120,27 @@ class Club
132
120
  def self.parse_props( txt ) ClubPropsReader.parse( txt ); end
133
121
  ## todo/check: use ClubProps.read and ClubProps.parse convenience alternate shortcuts - why? why not?
134
122
  end # class Club
123
+
135
124
  end # module Import
136
125
  end # module SportDb
137
126
 
138
127
 
128
+ require 'sportdb/formats/event/event_reader'
129
+ require 'sportdb/formats/event/event_index'
139
130
 
140
-
141
-
142
-
143
-
144
-
145
-
146
-
147
- ## let's put test configuration in its own namespace / module
131
+ ## add convenience helper
148
132
  module SportDb
149
- class Test ## todo/check: works with module too? use a module - why? why not?
150
-
151
- ####
152
- # todo/fix: find a better way to configure shared test datasets - why? why not?
153
- # note: use one-up (..) directory for now as default - why? why not?
154
- def self.data_dir() @data_dir ||= '../test'; end
155
- def self.data_dir=( path ) @data_dir = path; end
156
- end
133
+ module Import
134
+ class EventInfo
135
+ def self.read( path ) EventInfoReader.read( path ); end
136
+ def self.parse( txt ) EventInfoReader.parse( txt ); end
137
+ end # class EventInfo
138
+ end # module Import
157
139
  end # module SportDb
158
140
 
159
141
 
160
142
 
161
143
 
144
+
145
+
162
146
  puts SportDb::Module::Formats.banner # say hello
@@ -109,12 +109,12 @@ class CountryIndex
109
109
  @countries_by_name[ name ]
110
110
  end
111
111
 
112
- def []( key )
112
+ def find( key )
113
113
  country = find_by_code( key )
114
114
  country = find_by_name( key ) if country.nil? ## try lookup / find by (normalized) name
115
115
  country
116
116
  end
117
- alias_method :find, :[]
117
+ alias_method :[], :find
118
118
 
119
119
 
120
120
  ###
@@ -0,0 +1,141 @@
1
+ module SportDb
2
+ module Import
3
+
4
+
5
+
6
+ class EventIndex
7
+
8
+ def self.build( path )
9
+ pack = Package.new( path ) ## lets us use direcotry or zip archive
10
+
11
+ recs = []
12
+ pack.each_seasons do |entry|
13
+ recs += EventInfoReader.parse( entry.read )
14
+ end
15
+ recs
16
+
17
+ index = new
18
+ index.add( recs )
19
+ index
20
+ end
21
+
22
+
23
+
24
+ attr_reader :events
25
+ def initialize
26
+ @events = []
27
+ @leagues = {}
28
+ end
29
+
30
+ def add( recs )
31
+ @events += recs ## add to "linear" records
32
+
33
+ recs.each do |rec|
34
+ league = rec.league
35
+ season = rec.season
36
+
37
+ seasons = @leagues[ league.key ] ||= {}
38
+ seasons[season.key] = rec
39
+ end
40
+ ## build search index by leagues (and season)
41
+ end
42
+
43
+ def find_by( league:, season: )
44
+ league_key = league.is_a?( String ) ? league : league.key
45
+ season_key = season.is_a?( String ) ? season : season.key
46
+
47
+ seasons = @leagues[ league_key ]
48
+ if seasons
49
+ seasons[ season_key ]
50
+ else
51
+ nil
52
+ end
53
+ end # method find_by
54
+ end ## class EventIndex
55
+
56
+
57
+
58
+ class SeasonIndex
59
+ def initialize( *args )
60
+ @leagues = {} ## use a league hash by years for now; change later
61
+
62
+ if args.size == 1 && args[0].is_a?( EventIndex )
63
+ ## convenience setup/hookup
64
+ ## (auto-)add all events from event index
65
+ add( args[0].events )
66
+ else
67
+ pp args
68
+ raise ArgumentError.new( 'unsupported arguments' )
69
+ end
70
+ end
71
+
72
+ def add( recs )
73
+ ## use a lookup index by year for now
74
+ ## todo - find something better/more generic for searching/matching date periods!!!
75
+ recs.each do |rec|
76
+ league = rec.league
77
+ season = rec.season
78
+
79
+ years = @leagues[ league.key ] ||= {}
80
+ if season.year?
81
+ years[season.start_year] ||= []
82
+ years[season.start_year] << rec
83
+ else
84
+ years[season.start_year] ||= []
85
+ years[season.end_year] ||= []
86
+ years[season.start_year] << rec
87
+ years[season.end_year] << rec
88
+ end
89
+ end
90
+ end # method add
91
+
92
+ def find_by( date:, league: )
93
+ date = Date.strptime( date, '%Y-%m-%d' ) if date.is_a?( String )
94
+ league_key = league.is_a?( String ) ? league : league.key
95
+
96
+ years = @leagues[ league_key ]
97
+ if years
98
+ year = years[ date.year ]
99
+ if year
100
+ season_key = nil
101
+ year.each do |event|
102
+ ## todo/check: rename/use between? instead of include? - why? why not?
103
+ if event.include?( date )
104
+ season_key = event.season.key
105
+ break
106
+ end
107
+ end
108
+ if season_key.nil?
109
+ puts "!! WARN: date >#{date}< out-of-seasons for year #{date.year} in league #{league_key}:"
110
+ year.each do |event|
111
+ puts " #{event.season.key} | #{event.start_date} - #{event.end_date}"
112
+ end
113
+ ## retry again and pick season with "overflow" at the end (date is great end_date)
114
+ year.each do |event|
115
+ if date > event.end_date
116
+ diff_in_days = date.to_date.jd - event.end_date.to_date.jd
117
+ puts " +#{diff_in_days} days - adding overflow to #{event.season.key} ending on #{event.end_date} ++ #{date}"
118
+ season_key = event.season.key
119
+ break
120
+ end
121
+ end
122
+ ## exit now for sure - if still empty!!!!
123
+ if season_key.nil?
124
+ puts "!! ERROR: CANNOT auto-fix / (auto-)append date at the end of an event; check season setup - sorry"
125
+ exit 1
126
+ end
127
+ end
128
+ season_key
129
+ else
130
+ nil ## no year defined / found for league
131
+ end
132
+ else
133
+ nil ## no league defined / found
134
+ end
135
+ end # method find
136
+
137
+ end # class SeasonIndex
138
+
139
+
140
+ end # module Import
141
+ end # module SportDb