sportdb-readers 0.4.7 → 0.4.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 46dc2a6de0074a2c9a5f007503f99d34030e4c80
4
- data.tar.gz: e5cd5ae577346962dcb69361a11504fbe7540a22
3
+ metadata.gz: 8fdbf4230ab31efee1c3f29d51e3f447caf9b161
4
+ data.tar.gz: 48df0e0b7e1e28c06670431d7642bf9b0d2d6fbf
5
5
  SHA512:
6
- metadata.gz: 54a9a0865d2d8af5a405f0cb9a64eea7bc2e7f6ea7cae870dded60dd51f38301c4f40b494a5833330f248b4b556daf17e81984ba8243cef3f170dd838565ef92
7
- data.tar.gz: ee0035b74ada7e5d829f6778421e0c7be57728ac78aaa167edcebe44f93280310df9b09c7906580c9dca3a8b9d8360f9baf50959bbe0469a5bd3560187ee5837
6
+ metadata.gz: 40ce7917d320fada2dd95eb7625ea5f1ec9646729c38c9f540c6cd0e78bf5e7fe8200e82a2b6f546239faa5da120af527c867f364a4aa61fe001a3f8b2fae775
7
+ data.tar.gz: 581fffa22c4ffad1e1c8cb385e99307cc19a7099700a76d387e65e5cfb6194aa35ebd0e104a50473f15893b325955e25b648e429b29835241b2440a5641a7515
@@ -4,16 +4,12 @@ README.md
4
4
  Rakefile
5
5
  lib/sportdb/readers.rb
6
6
  lib/sportdb/readers/conf_linter.rb
7
- lib/sportdb/readers/conf_parser_auto.rb
8
7
  lib/sportdb/readers/conf_reader.rb
9
8
  lib/sportdb/readers/league_outline_reader.rb
10
9
  lib/sportdb/readers/match_linter.rb
11
- lib/sportdb/readers/match_parser.rb
12
10
  lib/sportdb/readers/match_reader.rb
13
11
  lib/sportdb/readers/package.rb
14
12
  lib/sportdb/readers/version.rb
15
13
  test/helper.rb
16
- test/test_conf_parser_auto.rb
17
- test/test_match_parser.rb
18
14
  test/test_read.rb
19
15
  test/test_reader.rb
data/Rakefile CHANGED
@@ -21,7 +21,7 @@ Hoe.spec 'sportdb-readers' do
21
21
 
22
22
  self.extra_deps = [
23
23
  ['sportdb-config', '>= 0.9.0'],
24
- ['sportdb-models', '>= 1.18.4'],
24
+ ['sportdb-models', '>= 1.18.6'],
25
25
  ['sportdb-sync', '>= 0.1.0'],
26
26
  ]
27
27
 
@@ -10,10 +10,8 @@ require 'sportdb/sync'
10
10
  # our own code
11
11
  require 'sportdb/readers/version' # let version always go first
12
12
  require 'sportdb/readers/league_outline_reader'
13
- require 'sportdb/readers/conf_parser_auto'
14
13
  require 'sportdb/readers/conf_reader'
15
14
  require 'sportdb/readers/conf_linter'
16
- require 'sportdb/readers/match_parser'
17
15
  require 'sportdb/readers/match_reader'
18
16
  require 'sportdb/readers/match_linter'
19
17
  require 'sportdb/readers/package'
@@ -6,7 +6,7 @@ module Readers
6
6
 
7
7
  MAJOR = 0 ## todo: namespace inside version or something - why? why not??
8
8
  MINOR = 4
9
- PATCH = 7
9
+ PATCH = 8
10
10
  VERSION = [MAJOR,MINOR,PATCH].join('.')
11
11
 
12
12
  def self.version
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sportdb-readers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.7
4
+ version: 0.4.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.18.4
33
+ version: 1.18.6
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.18.4
40
+ version: 1.18.6
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sportdb-sync
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -96,17 +96,13 @@ files:
96
96
  - Rakefile
97
97
  - lib/sportdb/readers.rb
98
98
  - lib/sportdb/readers/conf_linter.rb
99
- - lib/sportdb/readers/conf_parser_auto.rb
100
99
  - lib/sportdb/readers/conf_reader.rb
101
100
  - lib/sportdb/readers/league_outline_reader.rb
102
101
  - lib/sportdb/readers/match_linter.rb
103
- - lib/sportdb/readers/match_parser.rb
104
102
  - lib/sportdb/readers/match_reader.rb
105
103
  - lib/sportdb/readers/package.rb
106
104
  - lib/sportdb/readers/version.rb
107
105
  - test/helper.rb
108
- - test/test_conf_parser_auto.rb
109
- - test/test_match_parser.rb
110
106
  - test/test_read.rb
111
107
  - test/test_reader.rb
112
108
  homepage: https://github.com/sportdb/sport.db
@@ -1,171 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module SportDb
4
-
5
-
6
- class AutoConfParser
7
-
8
- def self.parse( lines, start: )
9
- ## todo/fix: add support for txt and lines
10
- ## check if lines_or_txt is an array or just a string
11
- parser = new( lines, start )
12
- parser.parse
13
- end
14
-
15
-
16
- include LogUtils::Logging
17
-
18
- def initialize( lines, start )
19
- @lines = lines ## todo/check: change to text instead of array of lines - why? why not?
20
- @start = start
21
- end
22
-
23
- def parse
24
- ## try to find all clubs in match schedule
25
- @last_round = nil
26
- @rounds = {} ## track usage counter and match (two clubs) counter
27
- @clubs = Hash.new(0) ## keep track of usage counter
28
-
29
-
30
- @lines.each do |line|
31
- if is_round?( line )
32
- logger.info "skipping matched round line: >#{line}<"
33
-
34
- round = @rounds[ line ] ||= {count: 0, match_count: 0} ## usage counter, match counter
35
- round[:count] +=1
36
- @last_round = round
37
- elsif try_parse_game( line )
38
- # do nothing here
39
- else
40
- logger.warn "skipping line (no match found): >#{line}<"
41
- end
42
- end # lines.each
43
-
44
- [@clubs, @rounds]
45
- end
46
-
47
- def is_round?( line )
48
- ## note: =~ return nil if not match found, and 0,1, etc for match
49
- (line =~ SportDb.lang.regex_round) != nil
50
- end
51
-
52
- def try_parse_game( line )
53
- # note: clone line; for possible test do NOT modify in place for now
54
- # note: returns true if parsed, false if no match
55
- parse_game( line.dup )
56
- end
57
-
58
- def parse_game( line )
59
- logger.debug "parsing game (fixture) line: >#{line}<"
60
-
61
- ## remove all protected text runs e.g. []
62
- ## fix: add [ to end-of-line too
63
- ## todo/fix: move remove protected text runs AFTER find date!! - why? why not?
64
-
65
- line = line.gsub( /\[
66
- [^\]]+?
67
- \]/x, '' ).strip
68
- return true if line.empty? ## note: return true (for valid line with no match/clubs)
69
-
70
-
71
- ## split by geo (@) - remove for now
72
- values = line.split( '@' )
73
- line = values[0]
74
-
75
-
76
- ## try find date
77
- date = find_date!( line, start: @start )
78
- if date ## if found remove tagged run too; note using singular sub (NOT global gsub)
79
- line = line.sub( /\[
80
- [^\]]+?
81
- \]/x, '' ).strip
82
-
83
- else
84
- ## check for leading hours only e.g. 20.30 or 20:30 or 20h30 or 20H30 or 09h00
85
- ## todo/fix: make language dependent (or move to find_date/hour etc.) - why? why not?
86
- line = line.sub( %r{^ ## MUST be anchored to beginning of line
87
- [012]?[0-9]
88
- [.:hH]
89
- [0-9][0-9]
90
- (?=[ ]) ## must be followed by space for now (add end of line too - why? why not?)
91
- }x, '' ).strip
92
- end
93
-
94
- return true if line.empty? ## note: return true (for valid line with no match/clubs)
95
-
96
-
97
- scores = find_scores!( line )
98
-
99
- logger.debug " line: >#{line}<"
100
-
101
- line = line.sub( /\[
102
- [^\]]+?
103
- \]/x, '$$' ) # note: replace first score tag with $$
104
- line = line.gsub( /\[
105
- [^\]]+?
106
- \]/x, '' ) # note: replace/remove all other score tags with nothing
107
-
108
- ## clean-up remove all text run inside () or empty () too
109
- line = line.gsub( /\(
110
- [^)]*?
111
- \)/x, '' )
112
-
113
-
114
- ## check for more match separators e.g. - or vs for now
115
- line = line.sub( / \s+
116
- ( -
117
- | v
118
- | vs\.? # note: allow optional dot eg. vs.
119
- )
120
- \s+
121
- /ix, '$$' )
122
-
123
- values = line.split( '$$' )
124
- values = values.map { |value| value.strip } ## strip spaces
125
- values = values.select { |value| !value.empty? } ## remove empty strings
126
-
127
- return true if values.size == 0 ## note: return true (for valid line with no match/clubs)
128
-
129
- if values.size == 1
130
- puts "(auto config) try matching clubs separated by spaces (2+):"
131
- pp values
132
-
133
- values = values[0].split( /[ ]{2,}/ )
134
- pp values
135
- end
136
-
137
- return false if values.size != 2
138
-
139
- puts "(auto config) try matching clubs:"
140
- pp values
141
-
142
- @clubs[ values[0] ] += 1 ## update usage counters
143
- @clubs[ values[1] ] += 1
144
-
145
- @last_round[ :match_count ] += 1
146
-
147
- true
148
- end
149
-
150
-
151
-
152
- def find_scores!( line, opts={} )
153
- # note: always call after find_dates !!!
154
- # scores match date-like patterns!! e.g. 10-11 or 10:00 etc.
155
- # -- note: score might have two digits too
156
-
157
- finder = ScoresFinder.new
158
- finder.find!( line, opts )
159
- end
160
-
161
- def find_date!( line, start: )
162
- ## NB: lets us pass in start_at/end_at date (for event)
163
- # for auto-complete year
164
-
165
- # extract date from line
166
- # and return it
167
- # NB: side effect - removes date from line string
168
- DateFormats.find!( line, start: start )
169
- end
170
- end # class AutoConfParser
171
- end # module SportDb
@@ -1,476 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module SportDb
4
-
5
- class MatchParserSimpleV2 ## simple match parser for club match schedules
6
-
7
- def self.parse( lines, teams, start: )
8
- ## todo/fix: add support for txt and lines
9
- ## check if lines_or_txt is an array or just a string
10
- ## use teams: like start: why? why not?
11
- parser = new( lines, teams, start )
12
- parser.parse
13
- end
14
-
15
-
16
- include LogUtils::Logging
17
-
18
- def initialize( lines, teams, start )
19
- @lines = lines ## todo/check: change to text instead of array of lines - why? why not?
20
- @mapper_teams = TeamMapper.new( teams )
21
- @start = start
22
-
23
- ## build lookup hash by (team) key
24
- @teams = teams.reduce({}) { |h,team| h[team.key]=team; h }
25
-
26
- ## debug_dump_teams( teams )
27
- ## exit 1
28
- end
29
-
30
- def debug_dump_teams( teams )
31
- puts "== #{teams.size} teams"
32
- teams.each do |team|
33
- print "#{team.key}, "
34
- print "#{team.title}, "
35
- print "#{team.synonyms.split('|').join(', ')}"
36
- puts
37
- end
38
- end
39
-
40
-
41
-
42
- Round = Struct.new( :pos, :title )
43
- ##
44
- ## todo: change db schema
45
- ## make start and end date optional
46
- ## change pos to num - why? why not?
47
- ## make pos/num optional too
48
- ##
49
- ## sort round by scheduled/planed start date
50
- Match = Struct.new( :date,
51
- :team1, :team2, ## todo/fix: use team1_name, team2_name or similar - for compat with db activerecord version? why? why not?
52
- :score1i, :score2i, ## half time (first (i) part)
53
- :score1, :score2, ## full time
54
- :round )
55
-
56
- def parse
57
- @last_date = nil
58
- @last_round = nil
59
- @rounds = {}
60
- @matches = []
61
-
62
-
63
- @lines.each do |line|
64
- if is_round?( line )
65
- parse_round_header( line )
66
- elsif try_parse_game( line )
67
- # do nothing here
68
- elsif try_parse_date_header( line )
69
- # do nothing here
70
- else
71
- logger.info "skipping line (no match found): >#{line}<"
72
- end
73
- end # lines.each
74
-
75
- ## todo/fix: reverse - pass matches as first para
76
- [@rounds.values, @matches]
77
- end # method parse
78
-
79
-
80
- def is_round?( line )
81
- ## note: =~ return nil if not match found, and 0,1, etc for match
82
- (line =~ SportDb.lang.regex_round) != nil
83
- end
84
-
85
-
86
- def find_round_pos!( line )
87
- # pass #1) extract optional round pos from line
88
- # e.g. (1) - must start line
89
- regex_pos = /^[ \t]*\((\d{1,3})\)[ \t]+/
90
-
91
- # pass #2) find free standing number e.g. Matchday 3 or Round 5 or 3. Spieltag etc.
92
- # note: /\b(\d{1,3})\b/
93
- # will match -12
94
- # thus, use space required - will NOT match -2 e.g. Group-2 Play-off
95
- # note: allow 1. Runde n
96
- # 1^ Giornata
97
- regex_num = /(?:^|\s)(\d{1,3})(?:[.\^\s]|$)/
98
-
99
- if line =~ regex_pos
100
- logger.debug " pos: >#{$1}<"
101
-
102
- line.sub!( regex_pos, '[ROUND.POS] ' ) ## NB: add back trailing space that got swallowed w/ regex -> [ \t]+
103
- return $1.to_i
104
- elsif line =~ regex_num
105
- ## assume number in title is pos (e.g. Jornada 3, 3 Runde etc.)
106
- ## NB: do NOT remove pos from string (will get removed by round title)
107
-
108
- num = $1.to_i # note: clone capture; keep a copy (another regex follows; will redefine $1)
109
-
110
- #### fix:
111
- # use/make keywords required
112
- # e.g. Round of 16 -> should NOT match 16!
113
- # Spiel um Platz 3 (or 5) etc -> should NOT match 3!
114
- # Round 16 - ok
115
- # thus, check for required keywords
116
-
117
- ## quick hack for round of 16
118
- # todo: mask match e.g. Round of xxx ... and try again - might include something
119
- # reuse pattern for Group XX Replays for example
120
- if line =~ /^\s*Round of \d{1,3}\b/
121
- return nil
122
- end
123
-
124
- logger.debug " pos: >#{num}<"
125
- return num
126
- else
127
- ## fix: add logger.warn no round pos found in line
128
- return nil
129
- end
130
- end # method find_round_pos!
131
-
132
- def find_round_header_title!( line )
133
- # assume everything left is the round title
134
- # extract all other items first (round title2, round pos, group title n pos, etc.)
135
-
136
- ## todo/fix:
137
- ## cleanup method
138
- ## use buf.index( '//' ) to split string (see found_round_def)
139
- ## why? simpler why not?
140
- ## - do we currently allow groups if title2 present? add example if it works?
141
-
142
- buf = line.dup
143
- logger.debug " find_round_header_title! line-before: >>#{buf}<<"
144
-
145
- buf.gsub!( /\[[^\]]+\]/, '' ) # e.g. remove [ROUND.POS], [ROUND.TITLE2], [GROUP.TITLE+POS] etc.
146
- buf.strip! # remove leading and trailing whitespace
147
-
148
- logger.debug " find_round_title! line-after: >>#{buf}<<"
149
-
150
- ### bingo - assume what's left is the round title
151
-
152
- logger.debug " title: >>#{buf}<<"
153
- line.sub!( buf, '[ROUND.TITLE]' )
154
-
155
- buf
156
- end
157
-
158
- def parse_round_header( line )
159
- logger.debug "parsing round header line: >#{line}<"
160
-
161
- ## todo/check/fix:
162
- # make sure Round of 16 will not return pos 16 -- how? possible?
163
- # add unit test too to verify
164
- pos = find_round_pos!( line )
165
-
166
- title = find_round_header_title!( line )
167
-
168
- logger.debug " line: >#{line}<"
169
-
170
-
171
- round = @rounds[ title ]
172
- if round.nil?
173
- round = Round.new( pos, title )
174
- @rounds[ title ] = round
175
- end
176
- ## todo/check: if pos match (MUST always match for now)
177
- @last_round = round
178
-
179
-
180
- ## NB: dummy/placeholder start_at, end_at date
181
- ## replace/patch after adding all games for round
182
-
183
- =begin
184
- round_attribs = {
185
- title: title,
186
- title2: title2,
187
- knockout: knockout_flag
188
- }
189
-
190
- if pos > 999000
191
- # no pos (e.g. will get autonumbered later) - try match by title for now
192
- # e.g. lets us use title 'Group Replays', for example, multiple times
193
- @round = Round.find_by_event_id_and_title( @event.id, title )
194
- else
195
- @round = Round.find_by_event_id_and_pos( @event.id, pos )
196
- end
197
-
198
- if @round.present?
199
- logger.debug "update round #{@round.id}:"
200
- else
201
- logger.debug "create round:"
202
- @round = Round.new
203
-
204
- round_attribs = round_attribs.merge( {
205
- event_id: @event.id,
206
- pos: pos,
207
- start_at: Date.parse('1911-11-11'),
208
- end_at: Date.parse('1911-11-11')
209
- })
210
- end
211
-
212
- logger.debug round_attribs.to_json
213
-
214
- @round.update_attributes!( round_attribs )
215
-
216
- @patch_round_ids_pos << @round.id if pos > 999000
217
- ### store list of round ids for patching start_at/end_at at the end
218
- @patch_round_ids_dates << @round.id # todo/fix/check: check if round has definition (do NOT patch if definition (not auto-added) present)
219
- =end
220
- end
221
-
222
-
223
- def find_scores!( line, opts={} )
224
- # note: always call after find_dates !!!
225
- # scores match date-like patterns!! e.g. 10-11 or 10:00 etc.
226
- # -- note: score might have two digits too
227
-
228
- finder = ScoresFinder.new
229
- finder.find!( line, opts )
230
- end
231
-
232
- def try_parse_game( line )
233
- # note: clone line; for possible test do NOT modify in place for now
234
- # note: returns true if parsed, false if no match
235
- parse_game( line.dup )
236
- end
237
-
238
-
239
- def parse_game( line )
240
- logger.debug "parsing game (fixture) line: >#{line}<"
241
-
242
- @mapper_teams.map_teams!( line ) ### todo/fix: limit mapping to two(2) teams - why? why not? might avoid matching @ Barcelona ??
243
- team_keys = @mapper_teams.find_teams!( line )
244
- team1_key = team_keys[0]
245
- team2_key = team_keys[1]
246
-
247
- ## note: if we do NOT find two teams; return false - no match found
248
- if team1_key.nil? || team2_key.nil?
249
- logger.debug " no game match (two teams required) found for line: >#{line}<"
250
- return false
251
- end
252
-
253
- ## pos = find_game_pos!( line )
254
-
255
- date = find_date!( line, start: @start )
256
-
257
- ###
258
- # check if date found?
259
- # NB: ruby falsey is nil & false only (not 0 or empty array etc.)
260
- if date
261
- ### check: use date_v2 if present? why? why not?
262
- @last_date = date # keep a reference for later use
263
- else
264
- date = @last_date # no date found; (re)use last seen date
265
- end
266
-
267
-
268
- scores = find_scores!( line )
269
-
270
- logger.debug " line: >#{line}<"
271
-
272
-
273
- ## todo/check: scores are integers or strings?
274
- @matches << Match.new( date,
275
- @teams[ team1_key ],
276
- @teams[ team2_key ],
277
- scores[0], ## score1i - half time (first (i) part)
278
- scores[1], ## score2i
279
- scores[2], ## score1 - full time
280
- scores[3], ## score2
281
- @last_round )
282
-
283
- ### todo: cache team lookups in hash?
284
-
285
- =begin
286
- team1 = Team.find_by_key!( team1_key )
287
- team2 = Team.find_by_key!( team2_key )
288
-
289
- @last_team1 = team1 # store for later use for goals etc.
290
- @last_team2 = team2
291
-
292
-
293
- if @round.nil?
294
- ## no round header found; calculate round from date
295
-
296
- ###
297
- ## todo/fix: add some unit tests for round look up
298
- # fix: use date_v2 if present!! (old/original date; otherwise use date)
299
-
300
- #
301
- # fix: check - what to do with hours e.g. start_at use 00:00 and for end_at use 23.59 ??
302
- # -- for now - remove hours (e.g. use end_of_day and beginnig_of_day)
303
-
304
- ##
305
- # note: start_at and end_at are dates ONLY (note datetime)
306
- # - do NOT pass in hours etc. in query
307
- # again use --> date.end_of_day, date.beginning_of_day
308
- # new: not working: date.to_date, date.to_date
309
- # will not find round if start_at same as date !! (in theory hours do not matter)
310
-
311
- ###
312
- # hack:
313
- # special case for sqlite3 (date compare not working reliable; use casts)
314
- # fix: move to adapter_name to activerecord_utils as sqlite? or similar?
315
-
316
- if ActiveRecord::Base.connection.adapter_name.downcase.starts_with?( 'sqlite' )
317
- logger.debug( " [sqlite] using sqlite-specific query for date compare for rounds finder" )
318
- round = Round.where( 'event_id = ? AND ( julianday(start_at) <= julianday(?)'+
319
- 'AND julianday(end_at) >= julianday(?))',
320
- @event.id, date.to_date, date.to_date).first
321
- else # all other dbs (postgresql, mysql, etc.)
322
- round = Round.where( 'event_id = ? AND (start_at <= ? AND end_at >= ?)',
323
- @event.id, date.to_date, date.to_date).first
324
- end
325
-
326
- pp round
327
- if round.nil?
328
- logger.warn( " !!!! no round match found for date #{date}" )
329
- pp Round.all
330
-
331
- ###################################
332
- # -- try auto-adding matchday
333
- round = Round.new
334
-
335
- round_attribs = {
336
- event_id: @event.id,
337
- title: "Matchday #{date.to_date}",
338
- pos: 999001+@patch_round_ids_pos.length, # e.g. 999<count> - 999001,999002,etc.
339
- start_at: date.to_date,
340
- end_at: date.to_date
341
- }
342
-
343
- logger.info( " auto-add round >Matchday #{date.to_date}<" )
344
- logger.debug round_attribs.to_json
345
-
346
- round.update_attributes!( round_attribs )
347
-
348
- @patch_round_ids_pos << round.id # todo/check - add just id or "full" record as now - why? why not?
349
- end
350
-
351
- # store pos for auto-number next round if missing
352
- # - note: only if greater/bigger than last; use max
353
- # - note: last_round_pos might be nil - thus set to 0
354
- if round.pos > 999000
355
- # note: do NOT update last_round_pos for to-be-patched rounds
356
- else
357
- @last_round_pos = [round.pos,@last_round_pos||0].max
358
- end
359
-
360
- ## note: will crash (round.pos) if round is nil
361
- logger.debug( " using round #{round.pos} >#{round.title}< start_at: #{round.start_at}, end_at: #{round.end_at}" )
362
- else
363
- ## use round from last round header
364
- round = @round
365
- end
366
-
367
-
368
- ### check if games exists
369
- ## with this teams in this round if yes only update
370
- game = Game.find_by_round_id_and_team1_id_and_team2_id(
371
- round.id, team1.id, team2.id
372
- )
373
-
374
- game_attribs = {
375
- score1i: scores[0],
376
- score2i: scores[1],
377
- score1: scores[2],
378
- score2: scores[3],
379
- score1et: scores[4],
380
- score2et: scores[5],
381
- score1p: scores[6],
382
- score2p: scores[7],
383
- play_at: date,
384
- play_at_v2: date_v2,
385
- postponed: postponed,
386
- knockout: round.knockout, ## note: for now always use knockout flag from round - why? why not??
387
- ground_id: ground.present? ? ground.id : nil,
388
- group_id: @group.present? ? @group.id : nil
389
- }
390
-
391
- game_attribs[ :pos ] = pos if pos.present?
392
-
393
- ####
394
- # note: only update if any changes (or create if new record)
395
- if game.present? &&
396
- game.check_for_changes( game_attribs ) == false
397
- logger.debug " skip update game #{game.id}; no changes found"
398
- else
399
- if game.present?
400
- logger.debug "update game #{game.id}:"
401
- else
402
- logger.debug "create game:"
403
- game = Game.new
404
-
405
- more_game_attribs = {
406
- round_id: round.id,
407
- team1_id: team1.id,
408
- team2_id: team2.id
409
- }
410
-
411
- ## NB: use round.games.count for pos
412
- ## lets us add games out of order if later needed
413
- more_game_attribs[ :pos ] = round.games.count+1 if pos.nil?
414
-
415
- game_attribs = game_attribs.merge( more_game_attribs )
416
- end
417
-
418
- logger.debug game_attribs.to_json
419
- game.update_attributes!( game_attribs )
420
- end
421
-
422
- @last_game = game # store for later reference (e.g. used for goals etc.)
423
- =end
424
-
425
- return true # game match found
426
- end # method parse_game
427
-
428
-
429
-
430
- def try_parse_date_header( line )
431
- # note: clone line; for possible test do NOT modify in place for now
432
- # note: returns true if parsed, false if no match
433
- parse_date_header( line.dup )
434
- end
435
-
436
- def find_date!( line, start: )
437
- ## NB: lets us pass in start_at/end_at date (for event)
438
- # for auto-complete year
439
-
440
- # extract date from line
441
- # and return it
442
- # NB: side effect - removes date from line string
443
- DateFormats.find!( line, start: start )
444
- end
445
-
446
-
447
- def parse_date_header( line )
448
- # note: returns true if parsed, false if no match
449
-
450
- # line with NO teams plus include date e.g.
451
- # [Fri Jun/17] or
452
- # Jun/17 or
453
- # Jun/17: etc.
454
-
455
- @mapper_teams.map_teams!( line )
456
- team_keys = @mapper_teams.find_teams!( line )
457
- team1_key = team_keys[0]
458
- team2_key = team_keys[1]
459
-
460
- date = find_date!( line, start: @start )
461
-
462
- if date && team1_key.nil? && team2_key.nil?
463
- logger.debug( "date header line found: >#{line}<")
464
- logger.debug( " date: #{date}")
465
-
466
- @last_date = date # keep a reference for later use
467
- return true
468
- else
469
- return false
470
- end
471
- end
472
-
473
-
474
-
475
- end # class MatchParserSimpleV2
476
- end # module SportDb
@@ -1,489 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_conf_parser_auto.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestAutoConfParser < MiniTest::Test
12
-
13
- def test_mx
14
- txt= <<TXT
15
- Jornada 1 // 3, 4 y 5 de enero
16
-
17
- Vie 3 Ene Monarcas Morelia vs. Querétaro @ Estadio Morelos
18
- Vie 3 Ene Santos Laguna vs. Guadalajara @ Estadio Corona TSM
19
- Sáb 4 Ene América vs. Tigres UANL @ Estadio Azteca
20
- Sáb 4 Ene Monterrey vs. Cruz Azul @ Estadio Tecnológico
21
- Sáb 4 Ene Pachuca vs. Toluca @ Estadio Hidalgo
22
- Sáb 4 Ene Jaguares de Chiapas vs. Veracruz @ Estadio Víctor M. Reyna
23
- Sáb 4 Ene Atlas vs. Tijuana @ Estadio Jalisco
24
- Dom 5 Ene Universidad Nacional vs. Puebla @ Estadio Olímpico Universitario
25
- Dom 5 Ene Atlante vs. León @ Estadio Andrés Quintana Roo
26
-
27
- Jornada 2 // 10, 11 y 12 de enero
28
-
29
- Vie 10 Ene Querétaro vs. Universidad Nacional @ Estadio La Corregidora
30
- Vie 10 Ene Tijuana vs. América @ Estadio Caliente
31
- Sáb 11 Ene Veracruz vs. Atlante @ Estadio Luis Pirata Fuente
32
- Sáb 11 Ene Cruz Azul vs. Santos Laguna @ Estadio Azul
33
- Sáb 11 Ene Tigres UANL vs. Pachuca @ Estadio Universitario
34
- Sáb 11 Ene León vs. Atlas @ Estadio Nou Camp
35
- Dom 12 Ene Puebla vs. Monterrey @ Estadio Cuauhtémoc
36
- Dom 12 Ene Toluca vs. Monarcas Morelia @ Estadio Nemesio Díez
37
- Dom 12 Ene Guadalajara vs. Jaguares de Chiapas @ Estadio Omnilife
38
- TXT
39
- clubs, rounds = parse( txt, lang: 'es' )
40
-
41
- assert_equal Hash(
42
- 'Monarcas Morelia'=>2,
43
- 'Querétaro'=>2,
44
- 'Santos Laguna'=>2,
45
- 'Guadalajara'=>2,
46
- 'América'=>2,
47
- 'Tigres UANL'=>2,
48
- 'Monterrey'=>2,
49
- 'Cruz Azul'=>2,
50
- 'Pachuca'=>2,
51
- 'Toluca'=>2,
52
- 'Jaguares de Chiapas'=>2,
53
- 'Veracruz'=>2,
54
- 'Atlas'=>2,
55
- 'Tijuana'=>2,
56
- 'Universidad Nacional'=>2,
57
- 'Puebla'=>2,
58
- 'Atlante'=>2,
59
- 'León'=>2 ), clubs
60
-
61
- assert_equal Hash(
62
- 'Jornada 1 // 3, 4 y 5 de enero' => { count: 1, match_count: 9},
63
- 'Jornada 2 // 10, 11 y 12 de enero' => { count: 1, match_count: 9} ), rounds
64
- end
65
-
66
- def test_br
67
- txt= <<TXT
68
- 1ª Rodada
69
- 29/03/2003 - Sábado
70
- 16h00 Guarani 4x2 Vasco @ Brinco de Ouro
71
- Atlético-PR 2x0 Grêmio @ Arena da Baixada
72
-
73
- 30/03/2003 - Domingo
74
- 09h00 Flamengo 1x1 Coritiba @ Maracanã
75
- 16h00 Goiás 2x2 Paysandu @ Serra Dourada
76
- Internacional 1x1 Ponte Preta @ Beira Rio
77
- Criciúma 2x0 Fluminense @ Heriberto Hulse
78
- Juventude 2x2 São Paulo @ Alfredo Jaconi
79
- Fortaleza 0x0 Bahia @ Castelão
80
- Cruzeiro 2x2 São Caetano @ Mineirão
81
- Vitória 1x1 Figueirense @ Barradão
82
- 18h00 Santos 2x2 Paraná @ Vila Belmiro
83
- Corinthians 0x3 Atlético-MG @ Pacaembu
84
-
85
- 2ª Rodada
86
- 05/04/2003 - Sábado
87
- 16h00 Fluminense 1x1 Fortaleza @ Maracanã
88
- Atlético-MG 0x0 Santos @ Mineirão
89
- Coritiba 0x1 Internacional @ Couto Pereira
90
- 18h00 Grêmio 3x1 Guarani @ Olímpico
91
-
92
- 06/04/2003 - Domingo
93
- 16h00 Bahia 1x2 Flamengo @ Fonte Nova
94
- Figueirense 3x3 Corinthians @ Orlando Scarpelli
95
- Paysandu 1x2 Vitória @ Mangueirão
96
- Ponte Preta 1x0 Juventude @ Moisés Lucarelli
97
- Paraná 3x0 Atlético-PR @ Pinheirão
98
- São Caetano 3x2 Criciúma @ Anacleto Campanella
99
- 18h00 São Paulo 2x4 Cruzeiro @ Morumbi
100
- Vasco 6x4 Goiás @ São Januário
101
- TXT
102
- clubs, rounds = parse( txt, lang: 'pt' )
103
-
104
- assert_equal Hash(
105
- 'Guarani'=>2,
106
- 'Vasco'=>2,
107
- 'Atlético-PR'=>2,
108
- 'Grêmio'=>2,
109
- 'Flamengo'=>2,
110
- 'Coritiba'=>2,
111
- 'Goiás'=>2,
112
- 'Paysandu'=>2,
113
- 'Internacional'=>2,
114
- 'Ponte Preta'=>2,
115
- 'Criciúma'=>2,
116
- 'Fluminense'=>2,
117
- 'Juventude'=>2,
118
- 'São Paulo'=>2,
119
- 'Fortaleza'=>2,
120
- 'Bahia'=>2,
121
- 'Cruzeiro'=>2,
122
- 'São Caetano'=>2,
123
- 'Vitória'=>2,
124
- 'Figueirense'=>2,
125
- 'Santos'=>2,
126
- 'Paraná'=>2,
127
- 'Corinthians'=>2,
128
- 'Atlético-MG'=>2 ), clubs
129
-
130
- assert_equal Hash(
131
- '1ª Rodada' => {count: 1, match_count: 12},
132
- '2ª Rodada' => {count: 1, match_count: 12} ), rounds
133
- end
134
-
135
-
136
- def test_at
137
- txt = <<TXT
138
- 29. Runde
139
-
140
- Sa 7.4.
141
- 16.00 RB Salzburg 2:0 Wacker Innsbruck
142
- 18.30 SV Ried 0:1 Austria Wien
143
- Kapfenberger SV 2:3 Admira Wacker
144
- Rapid Wien 2:1 Wr. Neustadt
145
- So 8.4.
146
- 16.00 SV Mattersburg 0:2 Sturm Graz
147
-
148
-
149
- 30. Runde
150
-
151
- Sa 14.4.
152
- 16.00 Wr. Neustadt 0:0 Kapfenberger SV
153
- 18.30 Admira Wacker 1:1 Wacker Innsbruck
154
- Sturm Graz 2:2 RB Salzburg
155
- SV Ried 2:0 SV Mattersburg
156
- So 15.4.
157
- 16.00 Austria Wien 0:0 Rapid Wien
158
- TXT
159
-
160
- clubs, rounds = parse( txt, lang: 'de' )
161
-
162
- assert_equal Hash(
163
- 'RB Salzburg' => 2,
164
- 'Wacker Innsbruck' => 2,
165
- 'SV Ried' => 2,
166
- 'Austria Wien' => 2,
167
- 'Kapfenberger SV' => 2,
168
- 'Admira Wacker' => 2,
169
- 'Rapid Wien' => 2,
170
- 'Wr. Neustadt' => 2,
171
- 'SV Mattersburg' => 2,
172
- 'Sturm Graz' => 2 ), clubs
173
-
174
- assert_equal Hash(
175
- '29. Runde' => { count: 1, match_count: 5 },
176
- '30. Runde' => { count: 1, match_count: 5 } ), rounds
177
- end
178
-
179
- def test_es
180
- txt = <<TXT
181
- Jornada 1
182
-
183
- 18.08.2012 Barcelona R. Sociedad 5-1
184
- 18.08.2012 Levante Atlético 1-1
185
- 18.08.2012 Athletic Betis 3-5
186
- 18.08.2012 Zaragoza Valladolid 0-1
187
- 18.08.2012 R. Madrid Valencia 1-1
188
- 18.08.2012 Celta Málaga 0-1
189
- 18.08.2012 Sevilla Getafe 2-1
190
- 18.08.2012 Mallorca Espanyol 2-1
191
- 18.08.2012 Rayo Granada 1-0
192
- 18.08.2012 Deportivo Osasuna 2-0
193
-
194
-
195
- Jornada 2
196
-
197
- 25.08.2012 Valladolid Levante 2-0
198
- 25.08.2012 Espanyol Zaragoza 1-2
199
- 25.08.2012 Málaga Mallorca 1-1
200
- 25.08.2012 R. Sociedad Celta 2-1
201
- 25.08.2012 Osasuna Barcelona 1-2
202
- 25.08.2012 Valencia Deportivo 3-3
203
- 25.08.2012 Getafe R. Madrid 2-1
204
- 25.08.2012 Granada Sevilla 1-1
205
- 25.08.2012 Betis Rayo 1-2
206
- 25.08.2012 Atlético Athletic 4-0
207
- TXT
208
-
209
- clubs, rounds = parse( txt, lang: 'es' )
210
-
211
- assert_equal Hash(
212
- 'Barcelona' => 2,
213
- 'R. Sociedad' => 2,
214
- 'Levante' => 2,
215
- 'Atlético' => 2,
216
- 'Athletic' => 2,
217
- 'Betis' => 2,
218
- 'Zaragoza' => 2,
219
- 'Valladolid' => 2,
220
- 'R. Madrid' => 2,
221
- 'Valencia' => 2,
222
- 'Celta' => 2,
223
- 'Málaga' => 2,
224
- 'Sevilla' => 2,
225
- 'Getafe' => 2,
226
- 'Mallorca' => 2,
227
- 'Espanyol' => 2,
228
- 'Rayo' => 2,
229
- 'Granada' => 2,
230
- 'Deportivo' => 2,
231
- 'Osasuna' => 2), clubs
232
-
233
- assert_equal Hash(
234
- 'Jornada 1' => {count: 1, match_count: 10},
235
- 'Jornada 2' => {count: 1, match_count: 10} ), rounds
236
- end
237
-
238
-
239
- def test_fr
240
- txt = <<TXT
241
- Journée 1
242
-
243
- Ven 8. Août
244
- 20h30 Stade de Reims 2-2 Paris SG
245
- Sam 9. Août
246
- 21h00 SC Bastia 3-3 Olympique de Marseille
247
- Évian TG 0-3 SM Caen
248
- EA Guingamp 0-2 AS Saint-Étienne
249
- LOSC Lille 0-0 FC Metz
250
- Montpellier Hérault SC 0-1 Girondins de Bordeaux
251
- FC Nantes 1-0 RC Lens
252
- OGC Nice 3-2 Toulouse FC
253
- Dim 10. Août
254
- 17h00 Olympique Lyonnais 2-0 Stade Rennais FC
255
- 21h00 AS Monaco FC 1-2 FC Lorient
256
-
257
- Journée 2
258
-
259
- Ven 15. Août
260
- 20h30 SM Caen 0-1 LOSC Lille
261
- Sam 16. Août
262
- 17h00 Paris SG 2-0 SC Bastia
263
- 20h00 RC Lens 0-1 EA Guingamp
264
- FC Lorient 0-0 OGC Nice
265
- FC Metz 1-1 FC Nantes
266
- Stade Rennais FC 6-2 Évian TG
267
- Toulouse FC 2-1 Olympique Lyonnais
268
- Dim 17. Août
269
- 17h00 Olympique de Marseille 0-2 Montpellier Hérault SC
270
- AS Saint-Étienne 3-1 Stade de Reims
271
- 21h00 Girondins de Bordeaux 4-1 AS Monaco FC
272
- TXT
273
-
274
- clubs, rounds = parse( txt, lang: 'fr' )
275
-
276
- assert_equal Hash(
277
- 'Stade de Reims' => 2,
278
- 'Paris SG' => 2,
279
- 'SC Bastia' => 2,
280
- 'Olympique de Marseille' => 2,
281
- 'Évian TG' => 2,
282
- 'SM Caen' => 2,
283
- 'EA Guingamp' => 2,
284
- 'AS Saint-Étienne' => 2,
285
- 'LOSC Lille' => 2,
286
- 'FC Metz' => 2,
287
- 'Montpellier Hérault SC' => 2,
288
- 'Girondins de Bordeaux' => 2,
289
- 'FC Nantes' => 2,
290
- 'RC Lens' => 2,
291
- 'OGC Nice' => 2,
292
- 'Toulouse FC' => 2,
293
- 'Olympique Lyonnais' => 2,
294
- 'Stade Rennais FC' => 2,
295
- 'AS Monaco FC' => 2,
296
- 'FC Lorient' => 2), clubs
297
-
298
- assert_equal Hash(
299
- 'Journée 1' => { count: 1, match_count: 10 },
300
- 'Journée 2' => { count: 1, match_count: 10 } ), rounds
301
- end
302
-
303
-
304
- def test_eng
305
- txt = <<TXT
306
- Matchday 1
307
-
308
- Fri, Aug 11
309
- Arsenal FC 4-3 Leicester City
310
- Sat, Aug 12
311
- Watford FC 3-3 Liverpool FC
312
- Chelsea FC 2-3 Burnley FC
313
- Crystal Palace 0-3 Huddersfield Town
314
- Everton FC 1-0 Stoke City
315
- Southampton FC 0-0 Swansea City
316
- West Bromwich Albion 1-0 AFC Bournemouth
317
- Brighton & Hove Albion 0-2 Manchester City
318
- Sun, Aug 13
319
- Newcastle United 0-2 Tottenham Hotspur
320
- Manchester United 4-0 West Ham United
321
-
322
-
323
- Matchday 2
324
-
325
- Sat, Aug 19
326
- Swansea City 0-4 Manchester United
327
- AFC Bournemouth 0-2 Watford FC
328
- Burnley FC 0-1 West Bromwich Albion
329
- Leicester City 2-0 Brighton & Hove Albion
330
- Liverpool FC 1-0 Crystal Palace
331
- Southampton FC 3-2 West Ham United
332
- Stoke City 1-0 Arsenal FC
333
- Sun, Aug 20
334
- Huddersfield Town 1-0 Newcastle United
335
- Tottenham Hotspur 1-2 Chelsea FC
336
- Mon, Aug 21
337
- Manchester City 1-1 Everton FC
338
- TXT
339
-
340
- clubs, rounds = parse( txt )
341
-
342
- assert_equal Hash(
343
- 'Arsenal FC' => 2,
344
- 'Leicester City' => 2,
345
- 'Watford FC' => 2,
346
- 'Liverpool FC' => 2,
347
- 'Chelsea FC' => 2,
348
- 'Burnley FC' => 2,
349
- 'Crystal Palace' => 2,
350
- 'Huddersfield Town' => 2,
351
- 'Everton FC' => 2,
352
- 'Stoke City' => 2,
353
- 'Southampton FC' => 2,
354
- 'Swansea City' => 2,
355
- 'West Bromwich Albion' => 2,
356
- 'AFC Bournemouth' => 2,
357
- 'Brighton & Hove Albion' => 2,
358
- 'Manchester City' => 2,
359
- 'Newcastle United' => 2,
360
- 'Tottenham Hotspur' => 2,
361
- 'Manchester United' => 2,
362
- 'West Ham United' => 2 ), clubs
363
-
364
- assert_equal Hash(
365
- 'Matchday 1' => { count: 1, match_count: 10},
366
- 'Matchday 2' => { count: 1, match_count: 10} ), rounds
367
-
368
-
369
- txt =<<TXT
370
- Round 38
371
-
372
- May/22 Aston Villa 1-0 Liverpool
373
- May/22 Bolton 0-2 Manchester City
374
- May/22 Everton 1-0 Chelsea
375
- May/22 Fulham 2-2 Arsenal
376
- May/22 Manchester United 4-2 Blackpool
377
- May/22 Newcastle Utd 3-3 West Brom
378
- May/22 Stoke City 0-1 Wigan
379
- May/22 Tottenham 2-1 Birmingham
380
- May/22 West Ham 0-3 Sunderland
381
- May/22 Wolves 2-3 Blackburn
382
-
383
- Round 37
384
-
385
- May/17 Manchester City 3-0 Stoke City
386
- May/15 Arsenal 1-2 Aston Villa
387
- May/15 Birmingham 0-2 Fulham
388
- May/15 Liverpool 0-2 Tottenham
389
- May/15 Wigan 3-2 West Ham
390
- May/15 Chelsea 2-2 Newcastle Utd
391
- May/14 Blackburn 1-1 Manchester United
392
- May/14 Blackpool 4-3 Bolton
393
- May/14 Sunderland 1-3 Wolves
394
- May/14 West Brom 1-0 Everton
395
- TXT
396
- clubs, rounds = parse( txt )
397
-
398
- assert_equal Hash(
399
- 'Aston Villa' => 2,
400
- 'Liverpool' => 2,
401
- 'Bolton' => 2,
402
- 'Manchester City' => 2,
403
- 'Everton' => 2,
404
- 'Chelsea' => 2,
405
- 'Fulham' => 2,
406
- 'Arsenal' => 2,
407
- 'Manchester United' => 2,
408
- 'Blackpool' => 2,
409
- 'Newcastle Utd' => 2,
410
- 'West Brom' => 2,
411
- 'Stoke City'=> 2,
412
- 'Wigan' => 2,
413
- 'Tottenham' => 2,
414
- 'Birmingham' => 2,
415
- 'West Ham' => 2,
416
- 'Sunderland' => 2,
417
- 'Wolves' => 2,
418
- 'Blackburn' => 2), clubs
419
-
420
- assert_equal Hash(
421
- 'Round 38' => { count: 1, match_count: 10 },
422
- 'Round 37' => { count: 1, match_count: 10 } ), rounds
423
- end # method test_parse
424
-
425
-
426
- def test_mauritius
427
- txt = <<TXT
428
- Preliminary Round
429
- Mon Jun 22
430
- Pointe-aux-Sables Mates 3-4 AS Port-Louis 2000 @ St. François Xavier Stadium, Port Louis
431
-
432
- Quarterfinals
433
- Wed Jun 24
434
- Rivière du Rempart 3-1 pen (1-1) La Cure Sylvester @ Auguste Vollaire Stadium, Central Flacq
435
- Chamarel SC 3-4 Petite Rivière Noire @ Germain Comarmond Stadium, Bambous
436
- Thu Jun 25
437
- Pamplemousses 2-0 AS Port-Louis 2000 @ Auguste Vollaire Stadium, Central Flacq
438
- Sat Jun 27
439
- Savanne SC 3-6 Entente Boulet Rouge @ Anjalay Stadium, Mapou
440
-
441
- Semifinals
442
- Wed Jul 15
443
- Rivière du Rempart 2-3 Petite Rivière Noire @ New George V Stadium, Curepipe
444
- Entente Boulet Rouge 0-2 Pamplemousses @ Germain Comarmond Stadium, Bambous
445
-
446
- Final
447
- Sun Jul 19
448
- Petite Rivière Noire 2-0 Pamplemousses @ New George V Stadium, Curepipe
449
- TXT
450
-
451
- clubs, rounds = parse( txt )
452
-
453
- assert_equal Hash(
454
- 'Pointe-aux-Sables Mates' => 1,
455
- 'AS Port-Louis 2000' => 2,
456
- 'Rivière du Rempart' => 2,
457
- 'La Cure Sylvester' => 1,
458
- 'Chamarel SC' => 1,
459
- 'Petite Rivière Noire' => 3,
460
- 'Pamplemousses' => 3,
461
- 'Savanne SC' => 1,
462
- 'Entente Boulet Rouge' => 2), clubs
463
-
464
- assert_equal Hash(
465
- 'Preliminary Round' => {count: 1, match_count: 1},
466
- 'Quarterfinals' => {count: 1, match_count: 4},
467
- 'Semifinals' => {count: 1, match_count: 2},
468
- 'Final' => {count: 1, match_count: 1} ), rounds
469
- end
470
-
471
-
472
- ################
473
- ## helper
474
- def parse( txt, lang: 'en' )
475
- lines = txt.split( /\n+/ ) # note: removes/strips empty lines
476
- pp lines
477
-
478
- start = Date.new( 2017, 7, 1 )
479
-
480
- DateFormats.lang = lang # e.g. 'en'
481
- SportDb.lang.lang = lang
482
-
483
- parser = SportDb::AutoConfParser.new( lines, start )
484
- clubs, rounds = parser.parse
485
- pp rounds
486
- pp clubs
487
- [clubs, rounds]
488
- end
489
- end # class AutoConfParser
@@ -1,107 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_match_parser.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
-
12
- class TestMatchParser < MiniTest::Test
13
-
14
- ## build ActiveRecord-like club records/structs
15
- Club = Struct.new( :key, :title, :synonyms )
16
- def Club.read( txt )
17
- recs = []
18
- txt.each_line do |line|
19
- values = line.split( '|' )
20
- values = values.map { |value| value.strip }
21
-
22
- title = values[0]
23
- ## note: quick hack - auto-generate key, that is, remove all non-ascii chars and downcase
24
- key = title.downcase.gsub( /[^a-z]/, '' )
25
- synonyms = values.size > 1 ? values[1..-1].join( '|' ) : nil
26
-
27
- recs << Club.new( key, title, synonyms )
28
- end
29
- recs
30
- end
31
-
32
-
33
- def test_parse
34
- txt = <<TXT
35
- Matchday 1
36
-
37
- [Fri Aug/11]
38
- Arsenal FC 4-3 Leicester City
39
- [Sat Aug/12]
40
- Watford FC 3-3 Liverpool FC
41
- Chelsea FC 2-3 Burnley FC
42
- Crystal Palace 0-3 Huddersfield Town
43
- Everton FC 1-0 Stoke City
44
- Southampton FC 0-0 Swansea City
45
- West Bromwich Albion 1-0 AFC Bournemouth
46
- Brighton & Hove Albion 0-2 Manchester City
47
- [Sun Aug/13]
48
- Newcastle United 0-2 Tottenham Hotspur
49
- Manchester United 4-0 West Ham United
50
-
51
-
52
- Matchday 2
53
-
54
- [Sat Aug/19]
55
- Swansea City 0-4 Manchester United
56
- AFC Bournemouth 0-2 Watford FC
57
- Burnley FC 0-1 West Bromwich Albion
58
- Leicester City 2-0 Brighton & Hove Albion
59
- Liverpool FC 1-0 Crystal Palace
60
- Southampton FC 3-2 West Ham United
61
- Stoke City 1-0 Arsenal FC
62
- [Sun Aug/20]
63
- Huddersfield Town 1-0 Newcastle United
64
- Tottenham Hotspur 1-2 Chelsea FC
65
- [Mon Aug/21]
66
- Manchester City 1-1 Everton FC
67
- TXT
68
-
69
- clubs_txt = <<TXT
70
- Arsenal FC | Arsenal | FC Arsenal
71
- Leicester City FC | Leicester | Leicester City
72
- Watford FC | Watford | FC Watford
73
- Liverpool FC | Liverpool | FC Liverpool
74
- Chelsea FC | Chelsea | FC Chelsea
75
- Burnley FC | Burnley | FC Burnley
76
- Crystal Palace FC | Crystal Palace | C Palace | Palace | Crystal P
77
- Huddersfield Town AFC | Huddersfield | Huddersfield Town
78
- Everton FC | Everton | FC Everton
79
- Stoke City FC | Stoke | Stoke City
80
- Southampton FC | Southampton | FC Southampton
81
- Swansea City FC | Swansea | Swansea City | Swansea City AFC
82
- West Bromwich Albion FC | West Brom | West Bromwich Albion | West Bromwich | Albion
83
- AFC Bournemouth | Bournemouth | A.F.C. Bournemouth | Bournemouth FC
84
- Brighton & Hove Albion FC | Brighton | Brighton & Hove | Brighton & Hove Albion
85
- Manchester City FC | Man City | Manchester City | Man. City | Manchester C
86
- Newcastle United FC | Newcastle | Newcastle Utd | Newcastle United
87
- Tottenham Hotspur FC | Tottenham | Tottenham Hotspur | Spurs
88
- Manchester United FC | Man Utd | Man. United | Manchester U. | Manchester Utd | Manchester United
89
- West Ham United FC | West Ham | West Ham United
90
- TXT
91
-
92
-
93
- clubs = Club.read( clubs_txt )
94
- pp clubs
95
-
96
- lines = txt.split( /\n+/ ) # note: removes/strips empty lines
97
- pp lines
98
-
99
- start = Date.new( 2017, 7, 1 )
100
-
101
- DateFormats.lang = 'en'
102
- parser = SportDb::MatchParserSimpleV2.new( lines, clubs, start )
103
- rounds, matches = parser.parse
104
- pp rounds
105
- pp matches
106
- end # method test_parse
107
- end # class TestMatchParser