sportdb-formats 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,15 @@
1
1
  ## 3rd party gems
2
- require 'sportdb/structs'
3
- require 'sportdb/parser'
4
- require 'date/formats'
2
+ # require 'sportdb/structs'
3
+ # require 'sportdb/parser'
4
+ require 'sportdb/quick'
5
5
 
6
6
 
7
7
  require 'zip' ## todo/check: if zip is alreay included in a required module
8
8
 
9
9
 
10
- ## note - add cocos (code commons)
11
- ##
12
- ## pulls in read_csv & parse_csv etc.
13
- require 'cocos'
14
10
 
11
+ ## todo/check
12
+ ## - logutils already added via quick!!
15
13
 
16
14
  require 'logutils'
17
15
  module SportDb
@@ -26,10 +24,8 @@ end
26
24
  # our own code
27
25
  require_relative 'formats/version' # let version always go first
28
26
 
29
- require_relative 'formats/datafile'
30
- require_relative 'formats/datafile_package'
31
27
  require_relative 'formats/package'
32
-
28
+ require_relative 'formats/datafile_package'
33
29
 
34
30
 
35
31
  ## let's put test configuration in its own namespace / module
@@ -46,271 +42,16 @@ end # module SportDb
46
42
 
47
43
 
48
44
 
49
- ###
50
- # define search services apis (move to its own gem later - why? why not?)
51
-
52
- module SportDb
53
- module Import
54
-
55
- class Configuration
56
- def world() @world ||= WorldSearch.new( countries: DummyCountrySearch.new ); end
57
- def world=(world) @world = world; end
58
-
59
- ## todo/fix - add/move catalog here from sportdb-catalogs!!!
60
- ## def catalog() @catalog ||= Catalog.new; end
61
- ## def catalog(catalog) @catalog = catalog; end
62
- end # class Configuration
63
-
64
- ## e.g. use config.catalog -- keep Import.catalog as a shortcut (for "read-only" access)
65
- ## def self.catalog() config.catalog; end
66
- def self.world() config.world; end
67
-
68
- ## lets you use
69
- ## SportDb::Import.configure do |config|
70
- ## config.catalog_path = './catalog.db'
71
- ## end
72
- def self.configure() yield( config ); end
73
- def self.config() @config ||= Configuration.new; end
74
- end # module Import
75
- end # module SportDb
76
-
77
-
78
- require_relative 'formats/search/world'
79
- require_relative 'formats/search/sport'
80
- require_relative 'formats/search/structs'
81
-
82
-
83
-
84
- module Sports
85
- ## note: just forward to SportDb::Import configuration!!!!!
86
- ## keep Sports module / namespace "clean" - why? why not?
87
- ## that is, only include data structures (e.g. Match,League,etc) for now - why? why not?
88
- def self.configure() yield( config ); end
89
- def self.config() SportDb::Import.config; end
90
- end # module Sports
91
-
92
-
93
- ###
94
- # csv (tabular dataset) support / machinery
95
- require_relative 'formats/csv/match_status_parser'
96
- require_relative 'formats/csv/goal'
97
- require_relative 'formats/csv/goal_parser_csv'
98
- require_relative 'formats/csv/match_parser_csv'
99
-
100
-
101
- ### add convenience shortcut helpers
102
- module Sports
103
- class Match
104
- def self.read_csv( path, headers: nil, filters: nil, converters: nil, sep: nil )
105
- SportDb::CsvMatchParser.read( path,
106
- headers: headers,
107
- filters: filters,
108
- converters: converters,
109
- sep: sep )
110
- end
111
-
112
- def self.parse_csv( txt, headers: nil, filters: nil, converters: nil, sep: nil )
113
- SportDb::CsvMatchParser.parse( txt,
114
- headers: headers,
115
- filters: filters,
116
- converters: converters,
117
- sep: sep )
118
- end
119
- end # class Match
120
- end # module Sports
121
-
122
-
123
-
124
-
125
-
126
-
127
-
128
-
129
- module SportDb
130
- module Import
131
- Season = ::Season ## add a convenience alias for top-level Season class
132
-
133
- ## add "old" convenience aliases for structs - why? why not?
134
- ## todo/check: just use include Sports !!!!
135
- Country = ::Sports::Country
136
- League = ::Sports::League
137
- Group = ::Sports::Group
138
- Round = ::Sports::Round
139
- Match = ::Sports::Match
140
- Matchlist = ::Sports::Matchlist
141
- Goal = ::Sports::Goal
142
- Team = ::Sports::Team
143
- NationalTeam = ::Sports::NationalTeam
144
- Club = ::Sports::Club
145
- Standings = ::Sports::Standings
146
- TeamUsage = ::Sports::TeamUsage
147
-
148
- Ground = ::Sports::Ground
149
-
150
- Player = ::Sports::Player
151
-
152
- EventInfo = ::Sports::EventInfo
153
-
154
-
155
- class Team
156
- ## add convenience lookup helper / method for name by season for now
157
- ## use clubs history - for now kept separate from struct - why? why not?
158
- def name_by_season( season )
159
- ## note: returns / fallback to "regular" name if no records found in history
160
- SportDb::Import.catalog.clubs_history.find_name_by( name: name, season: season ) || name
161
- end
162
- end # class Team
163
-
164
- end # module Import
165
- end # module SportDb
166
-
167
-
168
- require_relative 'formats/match/match_parser'
169
- require_relative 'formats/match/conf_parser'
170
-
171
-
172
-
173
- require_relative 'formats/country/country_reader'
174
-
175
-
176
- ## add convenience helper
177
- module SportDb
178
- module Import
179
- class Country
180
- def self.read( path ) CountryReader.read( path ); end
181
- def self.parse( txt ) CountryReader.parse( txt ); end
182
- end # class Country
183
- end # module Import
184
- end # module SportDb
185
-
186
-
187
- require_relative 'formats/league/league_reader'
188
- require_relative 'formats/league/league_outline_reader'
189
-
190
- ##
191
- ## add convenience helper / short-cuts
192
- module SportDb
193
- module Import
194
- class League
195
- def self.read( path ) LeagueReader.read( path ); end
196
- def self.parse( txt ) LeagueReader.parse( txt ); end
197
- end # class League
198
- end # module Import
199
- end # module SportDb
200
-
201
-
202
- require_relative 'formats/team/club_reader'
203
- require_relative 'formats/team/club_reader_props'
204
- require_relative 'formats/team/wiki_reader'
205
-
206
- require_relative 'formats/team/club_reader_history'
207
- require_relative 'formats/team/club_index_history'
208
-
209
-
210
- ###
211
- # add convenience helpers / shortcuts
212
- module SportDb
213
- module Import
214
-
215
- class Club
216
- def self.read( path ) ClubReader.read( path ); end
217
- def self.parse( txt ) ClubReader.parse( txt ); end
218
-
219
- def self.read_props( path ) ClubPropsReader.read( path ); end
220
- def self.parse_props( txt ) ClubPropsReader.parse( txt ); end
221
- ## todo/check: use ClubProps.read and ClubProps.parse convenience alternate shortcuts - why? why not?
222
- end # class Club
223
-
224
- end # module Import
225
- end # module SportDb
226
-
227
-
228
- require_relative 'formats/event/event_reader'
229
-
230
- ## add convenience helper
231
- module SportDb
232
- module Import
233
- class EventInfo
234
- def self.read( path ) EventInfoReader.read( path ); end
235
- def self.parse( txt ) EventInfoReader.parse( txt ); end
236
- end # class EventInfo
237
- end # module Import
238
- end # module SportDb
239
-
240
-
241
-
242
- require_relative 'formats/ground/ground_reader'
45
+ require_relative 'formats/quick_match_linter'
243
46
 
244
47
 
48
+ # require_relative 'formats/team/club_reader_history'
49
+ # require_relative 'formats/team/club_index_history'
245
50
 
246
51
 
247
52
 
248
53
  ### auto-configure builtin lookups via catalog.db(s)
249
- require 'sportdb/catalogs'
250
-
251
-
252
- module SportDb
253
- module Import
254
-
255
- class Configuration
256
- ## note: add more configs (open class), see sportdb-structs for original config!!!
257
-
258
- ###
259
- # find a better name for setting - why? why not?
260
- # how about catalogdb or ???
261
- attr_reader :catalog_path
262
- def catalog_path=(path)
263
- @catalog_path = path
264
- ########
265
- # reset database here to new path
266
- CatalogDb::Metal::Record.database = path
267
-
268
- ## plus automagically set world search too (to use CatalogDb)
269
- self.world = WorldSearch.new(
270
- countries: CatalogDb::Metal::Country,
271
- cities: CatalogDb::Metal::City,
272
- )
273
-
274
- @catalog_path
275
- end
276
-
277
- def catalog
278
- @catalog ||= SportSearch.new(
279
- leagues: CatalogDb::Metal::League,
280
- national_teams: CatalogDb::Metal::NationalTeam,
281
- clubs: CatalogDb::Metal::Club,
282
- grounds: CatalogDb::Metal::Ground,
283
- events: CatalogDb::Metal::EventInfo,
284
- players: CatalogDb::Metal::Player, # note - via players.db !!!
285
- )
286
- end
287
-
288
- ###
289
- # find a better name for setting - why? why not?
290
- # how about playersdb or ???
291
- attr_reader :players_path
292
- def players_path=(path)
293
- @players_path = path
294
- ########
295
- # reset database here to new path
296
- CatalogDb::Metal::PlayerRecord.database = path
297
-
298
- @players_path
299
- end
300
- end # class Configuration
301
-
302
-
303
- ## e.g. use config.catalog -- keep Import.catalog as a shortcut (for "read-only" access)
304
- def self.catalog() config.catalog; end
305
- end # module Import
306
- end # module SportDb
307
-
308
-
309
- ###
310
- ## add default/built-in catalog here - why? why not?
311
- ## todo/fix - set catalog_path on demand
312
- ## note: for now required for world search setup etc.
313
- SportDb::Import.config.catalog_path = "#{FootballDb::Data.data_dir}/catalog.db"
54
+ require 'sportdb/search'
314
55
 
315
56
 
316
57
 
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sportdb-formats
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-23 00:00:00.000000000 Z
11
+ date: 2024-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: sportdb-structs
14
+ name: sportdb-search
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.1
19
+ version: 0.0.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.3.1
26
+ version: 0.0.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: sportdb-parser
28
+ name: sportdb-quick
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -38,62 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.2.0
41
- - !ruby/object:Gem::Dependency
42
- name: sportdb-catalogs
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: 1.2.2
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: 1.2.2
55
- - !ruby/object:Gem::Dependency
56
- name: date-formats
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: 1.0.2
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: 1.0.2
69
- - !ruby/object:Gem::Dependency
70
- name: cocos
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: 0.4.0
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: 0.4.0
83
- - !ruby/object:Gem::Dependency
84
- name: logutils
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: 0.6.1
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: 0.6.1
97
41
  - !ruby/object:Gem::Dependency
98
42
  name: rubyzip
99
43
  requirement: !ruby/object:Gem::Requirement
@@ -144,7 +88,8 @@ dependencies:
144
88
  version: '4.1'
145
89
  description: sportdb-formats - sport.db format and text utilities
146
90
  email: gerald.bauer@gmail.com
147
- executables: []
91
+ executables:
92
+ - fbchk
148
93
  extensions: []
149
94
  extra_rdoc_files:
150
95
  - CHANGELOG.md
@@ -155,29 +100,12 @@ files:
155
100
  - Manifest.txt
156
101
  - README.md
157
102
  - Rakefile
103
+ - bin/fbchk
158
104
  - lib/sportdb/formats.rb
159
- - lib/sportdb/formats/country/country_reader.rb
160
- - lib/sportdb/formats/csv/goal.rb
161
- - lib/sportdb/formats/csv/goal_parser_csv.rb
162
- - lib/sportdb/formats/csv/match_parser_csv.rb
163
- - lib/sportdb/formats/csv/match_status_parser.rb
164
- - lib/sportdb/formats/datafile.rb
165
105
  - lib/sportdb/formats/datafile_package.rb
166
- - lib/sportdb/formats/event/event_reader.rb
167
- - lib/sportdb/formats/ground/ground_reader.rb
168
- - lib/sportdb/formats/league/league_outline_reader.rb
169
- - lib/sportdb/formats/league/league_reader.rb
170
- - lib/sportdb/formats/match/conf_parser.rb
171
- - lib/sportdb/formats/match/match_parser.rb
172
106
  - lib/sportdb/formats/package.rb
173
- - lib/sportdb/formats/search/sport.rb
174
- - lib/sportdb/formats/search/structs.rb
175
- - lib/sportdb/formats/search/world.rb
107
+ - lib/sportdb/formats/quick_match_linter.rb
176
108
  - lib/sportdb/formats/team/club_index_history.rb
177
- - lib/sportdb/formats/team/club_reader.rb
178
- - lib/sportdb/formats/team/club_reader_history.rb
179
- - lib/sportdb/formats/team/club_reader_props.rb
180
- - lib/sportdb/formats/team/wiki_reader.rb
181
109
  - lib/sportdb/formats/version.rb
182
110
  homepage: https://github.com/sportdb/sport.db
183
111
  licenses:
@@ -1,142 +0,0 @@
1
- # encoding: utf-8
2
-
3
-
4
- module SportDb
5
- module Import
6
-
7
-
8
- class CountryReader
9
-
10
-
11
- def self.read( path ) ## use - rename to read_file or from_file etc. - why? why not?
12
- txt = File.open( path, 'r:utf-8' ) { |f| f.read }
13
- parse( txt )
14
- end
15
-
16
- def self.parse( txt )
17
- new( txt ).parse
18
- end
19
-
20
-
21
- def initialize( txt )
22
- @txt = txt
23
- end
24
-
25
- def parse
26
- countries = []
27
- last_country = nil ## note/check/fix: use countries[-1] - why? why not?
28
-
29
- OutlineReader.parse( @txt ).each do |node|
30
-
31
- node_type = node[0]
32
-
33
- if [:h1, :h2].include?( node_type )
34
- ## skip headings (and headings) for now too
35
- elsif node_type == :p ## paragraph
36
- lines = node[1]
37
- lines.each do |line|
38
- if line.start_with?( '|' )
39
- ## assume continuation with line of alternative names
40
- ## note: skip leading pipe
41
- values = line[1..-1].split( '|' ) # team names - allow/use pipe(|)
42
- ## strip and squish (white)spaces
43
- # e.g. East Germany (-1989) => East Germany (-1989)
44
- values = values.map { |value| value.strip.gsub( /[ \t]+/, ' ' ) }
45
- last_country.alt_names += values
46
- elsif line =~ /^-[ ]*(\d{4})
47
- [ ]+
48
- (.+)$
49
- /x ## check for historic lines e.g. -1989
50
- year = $1.to_i
51
- parts = $2.split( /=>|⇒/ )
52
- values = parts[0].split( ',' )
53
- values = values.map { |value| value.strip.gsub( /[ \t]+/, ' ' ) }
54
-
55
- name = values[0]
56
- code = values[1]
57
-
58
- last_country = country = Country.new( name: "#{name} (-#{year})",
59
- code: code )
60
- ## country.alt_names << name ## note: for now do NOT add name without year to alt_names - gets auto-add by index!!!
61
-
62
- countries << country
63
- ## todo/fix: add reference to country today (in parts[1] !!!!)
64
- else
65
- ## assume "regular" line
66
- ## check if starts with id (todo/check: use a more "strict"/better regex capture pattern!!!)
67
- ## note: allow country codes upto 4 (!!) e.g. Northern Cyprus
68
- if line =~ /^([a-z]{2,4})
69
- [ ]+
70
- (.+)$/x
71
- key = $1
72
- values = $2.split( ',' )
73
- ## strip and squish (white)spaces
74
- # e.g. East Germany (-1989) => East Germany (-1989)
75
- values = values.map { |value| value.strip.gsub( /[ \t]+/, ' ' ) }
76
-
77
- ## note: remove "overlords" from geo-tree marked territories e.g. UK, US, etc. from name
78
- ## e.g. England › UK => England
79
- ## Puerto Rico › US => Puerto Rico
80
- geos = split_geo( values[0] )
81
- name = geos[0] ## note: ignore all other geos for now
82
-
83
- ## note: allow country codes up to 4 (!!) e.g. Northern Cyprus
84
- code = if values[1] && values[1] =~ /^[A-Z]{3,4}$/ ## note: also check format
85
- values[1]
86
- else
87
- if values[1]
88
- puts "** !!! ERROR !!! wrong code format >#{values[1]}<; expected three (or four)-letter all up-case"
89
- else
90
- puts "** !!! ERROR !!! missing code for (canonical) country name"
91
- end
92
- exit 1
93
- end
94
-
95
- tags = if values[2] ## check if tags presents
96
- split_tags( values[2] )
97
- else
98
- []
99
- end
100
-
101
- last_country = country = Country.new( key: key,
102
- name: name,
103
- code: code,
104
- tags: tags )
105
- countries << country
106
- else
107
- puts "** !! ERROR - missing key for (canonical) country name"
108
- exit 1
109
- end
110
- end
111
- end # each line
112
- else
113
- puts "** !! ERROR - unknown node type / (input) source line:"
114
- pp node
115
- exit 1
116
- end
117
- end # each node
118
-
119
- countries
120
- end # method parse
121
-
122
-
123
-
124
- #######################################
125
- ## helpers
126
- def split_tags( str )
127
- tags = str.split( /[|<>‹›]/ ) ## allow pipe (|) and (<>‹›) as divider for now - add more? why? why not?
128
- tags = tags.map { |tag| tag.strip }
129
- tags
130
- end
131
-
132
- def split_geo( str ) ## todo/check: rename to parse_geo(s) - why? why not?
133
- ## split into geo tree
134
- geos = str.split( /[<>‹›]/ ) ## note: allow > < or › ‹ for now
135
- geos = geos.map { |geo| geo.strip } ## remove all whitespaces
136
- geos
137
- end
138
-
139
- end # class CountryReader
140
-
141
- end # module Import
142
- end # module SportDb