sportdb 1.8.10 → 1.8.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 40a271851bbcc415daa4d38228107ff187b11ada
4
+ data.tar.gz: e8566c5664d8c3041f090450d811399633960789
5
+ SHA512:
6
+ metadata.gz: ea16708dac574bd45d742d4f5621b4226b0e24511a1b88c07758acfa056ce1b6eb8bdb8fbd24dedcde57bb58e702196c5658d17c38ea0651f6c4390e05e5ed6a
7
+ data.tar.gz: 267916684d3cc873c8edec9796b47fda7612f40aecde32b5b12153a86394d3b27df6ed33745bae9894770ad9606ba6fb3425cb4757f5f5fcef3036a0063680e7
@@ -116,7 +116,8 @@ test/test_cursor.rb
116
116
  test/test_date.rb
117
117
  test/test_lang.rb
118
118
  test/test_reader.rb
119
- test/test_round.rb
119
+ test/test_round_def.rb
120
+ test/test_round_header.rb
120
121
  test/test_scores.rb
121
122
  test/test_utils.rb
122
123
  test/test_winner.rb
File without changes
@@ -27,7 +27,7 @@ round32: Round of 32|Last 32
27
27
  round16: Round of 16|Last 16
28
28
  quarterfinals: Quarterfinals|Quarter-finals|Quarters|Quarterfinal # todo: check if singular Quaterfinal is possible??
29
29
  semifinals: Semifinals|Semi-finals|Semis
30
- thirdplace: Third-place play-off|Third place play-off|Third place|3rd place match
30
+ thirdplace: Third-place play-off|Third place play-off|Third place|3rd place match|Match for third place
31
31
  final: Final|Finals
32
32
 
33
33
  ### Pair matches/games if marked with leg1 n leg2
@@ -87,7 +87,6 @@ class GameReader
87
87
 
88
88
  ## reset cached values
89
89
  @patch_rounds = {}
90
- @knockout_flag = false
91
90
  @round = nil
92
91
 
93
92
 
@@ -115,8 +114,12 @@ class GameReader
115
114
  logger.debug " title: >#{title}<"
116
115
  logger.debug " pos: >#{pos}<"
117
116
  logger.debug " line: >#{line}<"
117
+
118
+ # set group for games
119
+ @group = Group.find_by_event_id_and_pos!( @event.id, pos )
118
120
  end
119
121
 
122
+
120
123
  def parse_group_def( line )
121
124
  logger.debug "parsing group def line: >#{line}<"
122
125
 
@@ -160,20 +163,57 @@ class GameReader
160
163
  def parse_round_def( line )
161
164
  logger.debug "parsing round def line: >#{line}<"
162
165
 
166
+ ### todo/fix/check: move cut off optional comment in reader for all lines? why? why not?
167
+ cut_off_end_of_line_comment!( line ) # cut off optional comment starting w/ #
168
+
163
169
  start_at = find_date!( line, start_at: @event.start_at )
164
170
  end_at = find_date!( line, start_at: @event.start_at )
171
+
172
+ # note: if end_at missing -- assume start_at is (==) end_at
173
+ end_at = start_at if end_at.nil?
174
+
165
175
 
166
- # note: if end_at nil? -- assume start_at == end_at
176
+ pos = find_round_pos!( line )
177
+ title = find_round_def_title!( line )
178
+ # NB: use extracted round title for knockout check
179
+ knockout_flag = is_knockout_round?( title )
167
180
 
168
- ## pos = find_round_pos!( line )
169
- ## title = find_round_title!( line )
170
181
 
171
182
  logger.debug " start_at: #{start_at}"
172
183
  logger.debug " end_at: #{end_at}"
184
+ logger.debug " pos: #{pos}"
185
+ logger.debug " title: >#{title}<"
186
+ logger.debug " knockout_flag: #{knockout_flag}"
173
187
 
174
188
  logger.debug " line: >#{line}<"
175
- end
176
189
 
190
+ #######################################
191
+ # fix: add auto flag is false !!!!
192
+
193
+ round_attribs = {
194
+ title: title,
195
+ knockout: knockout_flag,
196
+ start_at: start_at,
197
+ end_at: end_at
198
+ }
199
+
200
+ round = Round.find_by_event_id_and_pos( @event.id, pos )
201
+ if round.present?
202
+ logger.debug "update round #{round.id}:"
203
+ else
204
+ logger.debug "create round:"
205
+ round = Round.new
206
+
207
+ round_attribs = round_attribs.merge( {
208
+ event_id: @event.id,
209
+ pos: pos
210
+ })
211
+ end
212
+
213
+ logger.debug round_attribs.to_json
214
+
215
+ round.update_attributes!( round_attribs )
216
+ end
177
217
 
178
218
 
179
219
  def parse_round_header( line )
@@ -183,7 +223,7 @@ class GameReader
183
223
  cut_off_end_of_line_comment!( line ) # cut off optional comment starting w/ #
184
224
 
185
225
  # NB: cut off optional title2 starting w/ // first
186
- title2 = find_round_title2!( line )
226
+ title2 = find_round_header_title2!( line )
187
227
 
188
228
  # todo/fix: check if it is possible title2 w/ group?
189
229
  # add an example here
@@ -191,10 +231,10 @@ class GameReader
191
231
 
192
232
  pos = find_round_pos!( line )
193
233
 
194
- title = find_round_title!( line )
234
+ title = find_round_header_title!( line )
195
235
 
196
236
  ## NB: use extracted round title for knockout check
197
- @knockout_flag = is_knockout_round?( title )
237
+ knockout_flag = is_knockout_round?( title )
198
238
 
199
239
 
200
240
  if group_pos.present?
@@ -211,7 +251,7 @@ class GameReader
211
251
  round_attribs = {
212
252
  title: title,
213
253
  title2: title2,
214
- knockout: @knockout_flag
254
+ knockout: knockout_flag
215
255
  }
216
256
 
217
257
 
@@ -229,7 +269,7 @@ class GameReader
229
269
  end_at: Time.utc('1912-12-12')
230
270
  })
231
271
  end
232
-
272
+
233
273
  logger.debug round_attribs.to_json
234
274
 
235
275
  @round.update_attributes!( round_attribs )
@@ -287,10 +327,34 @@ class GameReader
287
327
  team2 = Team.find_by_key!( team2_key )
288
328
 
289
329
 
330
+ if @round.nil?
331
+ ## no round header found; calculate round from date
332
+
333
+ ###
334
+ ## todo/fix: add some unit tests for round look up
335
+ # fix: use date_v2 if present!! (old/original date; otherwise use date)
336
+
337
+ #
338
+ # fix: check - what to do with hours e.g. start_at use 00:00 and for end_at use 23.59 ??
339
+ # -- for now - remove hours (e.g. use end_of_day and beginnig_of_day)
340
+
341
+ pp Round.all
342
+
343
+ round = Round.where( 'event_id = ? AND (start_at <= ? AND end_at >= ?)',
344
+ @event.id, date.end_of_day, date.beginning_of_day).first
345
+ pp round
346
+ logger.debug( " using round #{round.pos} >#{round.title}< start_at: #{round.start_at}, end_at: #{round.end_at}" )
347
+ else
348
+ ## use round from last round header
349
+ round = @round
350
+ end
351
+
352
+
353
+
290
354
  ### check if games exists
291
355
  ## with this teams in this round if yes only update
292
356
  game = Game.find_by_round_id_and_team1_id_and_team2_id(
293
- @round.id, team1.id, team2.id
357
+ round.id, team1.id, team2.id
294
358
  )
295
359
 
296
360
  game_attribs = {
@@ -303,7 +367,7 @@ class GameReader
303
367
  play_at: date,
304
368
  play_at_v2: date_v2,
305
369
  postponed: postponed,
306
- knockout: @knockout_flag,
370
+ knockout: round.knockout, ## note: for now always use knockout flag from round - why? why not??
307
371
  ground_id: ground.present? ? ground.id : nil,
308
372
  group_id: @group.present? ? @group.id : nil
309
373
  }
@@ -323,14 +387,14 @@ class GameReader
323
387
  game = Game.new
324
388
 
325
389
  more_game_attribs = {
326
- round_id: @round.id,
390
+ round_id: round.id,
327
391
  team1_id: team1.id,
328
392
  team2_id: team2.id
329
393
  }
330
394
 
331
395
  ## NB: use round.games.count for pos
332
396
  ## lets us add games out of order if later needed
333
- more_game_attribs[ :pos ] = @round.games.count+1 if pos.nil?
397
+ more_game_attribs[ :pos ] = round.games.count+1 if pos.nil?
334
398
 
335
399
  game_attribs = game_attribs.merge( more_game_attribs )
336
400
  end
@@ -397,11 +461,14 @@ class GameReader
397
461
  elsif try_parse_date_header( line )
398
462
  # do nothing here
399
463
  else
400
- logger.info "skipping line (no match found): ><"
464
+ logger.info "skipping line (no match found): >#{line}<"
401
465
  end
402
466
  end # lines.each
403
467
 
404
468
 
469
+ ###
470
+ # fix: do NOT patch if auto flag is set to false!!!
471
+
405
472
  @patch_rounds.each do |k,v|
406
473
  logger.debug "patch start_at/end_at date for round #{k}:"
407
474
  round = Round.find( k )
@@ -181,6 +181,10 @@ create_table :rounds do |t|
181
181
  t.date :start_at, null: false # NB: only use date (w/o time)
182
182
  t.date :end_at # todo: make it required e.g. :null => false # NB: only use date (w/o time)
183
183
 
184
+ ## auto-added flag (e.g. start_at n end_at dates got calculated)
185
+ ## if auto-added flag is false - do NOT auto-update start_at, end_at etc.
186
+ t.boolean :auto, null: false, default: true
187
+
184
188
  t.timestamps
185
189
  end
186
190
 
@@ -50,7 +50,7 @@ module SportDb
50
50
  regex_de3 = /\b(\d{1,2})\.(\d{1,2})\.(\d{4})\b/
51
51
 
52
52
  # e.g. 14.09. => DD.MM. w/ implied year and implied hours (set to 12:00)
53
- regex_de4 = /\b(\d{1,2})\.(\d{1,2})\.\s+/
53
+ regex_de4 = /\b(\d{1,2})\.(\d{1,2})\.(?:\s+|$)/ ## note: allow end-of-string/line too
54
54
 
55
55
 
56
56
  # todo: make more generic for reuse
@@ -52,7 +52,7 @@ module SportDb
52
52
  logger.debug " title: >#{title}<"
53
53
  logger.debug " pos: >#{pos}<"
54
54
 
55
- line.sub!( regex, '[GROUP|TITLE+POS]' )
55
+ line.sub!( regex, '[GROUP.TITLE+POS]' )
56
56
 
57
57
  return [title,pos]
58
58
  end
@@ -32,13 +32,26 @@ module SportDb
32
32
  end
33
33
  end
34
34
 
35
- def find_round_title2!( line )
35
+
36
+ ##
37
+ ## fix/todo: check that [ROUND.TITLE2] and friends do NOT use pipes (|)
38
+ ## change all pipes (|) to dot (.)
39
+ ## - pipes get used for def markers!!!
40
+
41
+ def find_round_header_title2!( line )
42
+ ## todo/fix:
43
+ ## cleanup method
44
+ ## use buf.index( '//' ) to split string (see found_round_def)
45
+ ## why? simpler why not?
46
+ ## - do we currently allow groups if title2 present? add example if it works?
47
+
48
+
36
49
  # assume everything after // is title2 - strip off leading n trailing whitespaces
37
50
  regex = /\/{2,}\s*(.+)\s*$/
38
51
  if line =~ regex
39
52
  logger.debug " title2: >#{$1}<"
40
53
 
41
- line.sub!( regex, '[ROUND|TITLE2]' )
54
+ line.sub!( regex, '[ROUND.TITLE2]' )
42
55
  return $1
43
56
  else
44
57
  return nil # no round title2 found (title2 is optional)
@@ -46,14 +59,20 @@ module SportDb
46
59
  end
47
60
 
48
61
 
49
- def find_round_title!( line )
62
+ def find_round_header_title!( line )
50
63
  # assume everything left is the round title
51
64
  # extract all other items first (round title2, round pos, group title n pos, etc.)
52
65
 
66
+ ## todo/fix:
67
+ ## cleanup method
68
+ ## use buf.index( '//' ) to split string (see found_round_def)
69
+ ## why? simpler why not?
70
+ ## - do we currently allow groups if title2 present? add example if it works?
71
+
53
72
  buf = line.dup
54
- logger.debug " find_round_title! line-before: >>#{buf}<<"
73
+ logger.debug " find_round_header_title! line-before: >>#{buf}<<"
55
74
 
56
- buf.gsub!( /\[.+?\]/, '' ) # e.g. remove [ROUND|POS], [ROUND|TITLE2], [GROUP|TITLE+POS] etc.
75
+ buf.gsub!( /\[[^\]]+\]/, '' ) # e.g. remove [ROUND.POS], [ROUND.TITLE2], [GROUP.TITLE+POS] etc.
57
76
  buf.sub!( /\s+[\/\-]{1,}\s+$/, '' ) # remove optional trailing / or / chars (left over from group)
58
77
  buf.strip! # remove leading and trailing whitespace
59
78
 
@@ -62,7 +81,34 @@ module SportDb
62
81
  ### bingo - assume what's left is the round title
63
82
 
64
83
  logger.debug " title: >>#{buf}<<"
65
- line.sub!( buf, '[ROUND|TITLE]' )
84
+ line.sub!( buf, '[ROUND.TITLE]' )
85
+
86
+ buf
87
+ end
88
+
89
+
90
+ def find_round_def_title!( line )
91
+ # assume everything before pipe (\) is the round title
92
+ # strip [ROUND.POS], todo:?? [ROUND.TITLE2]
93
+
94
+ # todo/fix: add title2 w/ // or / why? why not?
95
+ # -- strip / or / chars
96
+
97
+ buf = line.dup
98
+ logger.debug " find_round_def_title! line-before: >>#{buf}<<"
99
+
100
+ ## cut-off everything after (including) pipe (|)
101
+ buf = buf[ 0...buf.index('|') ]
102
+
103
+ # e.g. remove [ROUND.POS], [ROUND.TITLE2], [GROUP.TITLE+POS] etc.
104
+ buf.gsub!( /\[[^\]]+\]/, '' ) ## fix: use helper for (re)use e.g. remove_match_placeholder/marker or similar?
105
+ # remove leading and trailing whitespace
106
+ buf.strip!
107
+
108
+ logger.debug " find_round_def_title! line-after: >>#{buf}<<"
109
+
110
+ logger.debug " title: >>#{buf}<<"
111
+ line.sub!( buf, '[ROUND.TITLE]' )
66
112
 
67
113
  buf
68
114
  end
@@ -82,7 +128,7 @@ module SportDb
82
128
  if line =~ regex_pos
83
129
  logger.debug " pos: >#{$1}<"
84
130
 
85
- line.sub!( regex_pos, '[ROUND|POS] ' ) ## NB: add back trailing space that got swallowed w/ regex -> [ \t]+
131
+ line.sub!( regex_pos, '[ROUND.POS] ' ) ## NB: add back trailing space that got swallowed w/ regex -> [ \t]+
86
132
  return $1.to_i
87
133
  elsif line =~ regex_num
88
134
  ## assume number in title is pos (e.g. Jornada 3, 3 Runde etc.)
@@ -1,6 +1,6 @@
1
1
 
2
2
  module SportDb
3
- VERSION = '1.8.10'
3
+ VERSION = '1.8.11'
4
4
  end
5
5
 
6
6
 
@@ -2,7 +2,15 @@
2
2
  # Österreichische Bundesliga 2013/14
3
3
 
4
4
 
5
- 1. Runde // Sa+So 20.+21. Jul 2013
5
+ 1. Runde | Sa. 20.07. - So. 21.07. ## Sa+So 20.+21. Jul 2013
6
+ 2. Runde | Sa. 27.07. - So. 28.07. ## Sa+So 27.+28. Jul 2013
7
+ 3. Runde | Sa. 03.08. - So. 04.08. ## Sa+So 3.+4. Aug 2013
8
+ 4. Runde | Sa. 10.08. - So. 11.08.
9
+ 5. Runde | Sa. 17.08. - So. 18.08.
10
+ 6. Runde | Sa. 24.08. - So. 25.08.
11
+
12
+
13
+ ## 1. Runde // Sa+So 20.+21. Jul 2013
6
14
 
7
15
  (Sa) 20.07. 16.30 Austria Wien 2:0 FC Admira Wacker
8
16
  (Sa) 20.07. 19.00 SC Wiener Neustadt 1:5 RB Salzburg
@@ -12,7 +20,7 @@
12
20
  (So) 21.07. 16.30 FC Wacker Innsbruck 2:2 Sturm Graz
13
21
 
14
22
 
15
- 2. Runde // Sa+So 27.+28. Jul 2013
23
+ ## 2. Runde // Sa+So 27.+28. Jul 2013
16
24
 
17
25
  (Sa) 27.07. 16.30 Rapid Wien 4:0 SC Wiener Neustadt
18
26
  (Sa) 27.07. 19.00 FC Admira Wacker 1:2 FC Wacker Innsbruck
@@ -22,7 +30,7 @@
22
30
  (So) 28.07. 16.30 Sturm Graz 0:2 SV Grödig
23
31
 
24
32
 
25
- 3. Runde // Sa.+So. 3.+4. Aug 2013
33
+ ## 3. Runde // Sa.+So. 3.+4. Aug 2013
26
34
 
27
35
  (Sa) 03.08. 16.30 SC Wiener Neustadt 2:1 Wolfsberger AC
28
36
  (Sa) 03.08. 19.00 SV Grödig 7:1 FC Admira Wacker
@@ -32,7 +40,7 @@
32
40
  (So) 04.08. 16.30 Sturm Graz 2:4 Rapid Wien
33
41
 
34
42
 
35
- 4. Runde // Sa.+So. 10.+11. Aug 2013
43
+ ## 4. Runde // Sa.+So. 10.+11. Aug 2013
36
44
 
37
45
  (Sa) 10.08. 16.30 Wolfsberger AC 1:1 FC Wacker Innsbruck
38
46
  (Sa) 10.08. 19.00 SV Ried 1:1 SC Wiener Neustadt
@@ -42,7 +50,7 @@
42
50
  (So) 11.08. 16.30 Rapid Wien 0:0 Austria Wien
43
51
 
44
52
 
45
- 5. Runde // Sa.+So. 17.+18. Aug 2013
53
+ ## 5. Runde // Sa.+So. 17.+18. Aug 2013
46
54
 
47
55
  (Sa) 17.08. 16.30 Sturm Graz 1:1 RB Salzburg
48
56
  (Sa) 17.08. 19.00 SV Grödig 4:3 Wolfsberger AC
@@ -52,7 +60,7 @@
52
60
  (So) 18.08. 16.30 FC Admira Wacker 2:0 Rapid Wien
53
61
 
54
62
 
55
- 6. Runde // Sa.+So.
63
+ ## 6. Runde // Sa.+So. 24.+25. Aug 2013
56
64
 
57
65
  (Sa) 24.08. 16.30 SV Ried 3:0 Sturm Graz
58
66
  (Sa) 24.08. 19.00 SC Wiener Neustadt 1:1 FC Wacker Innsbruck
@@ -23,14 +23,14 @@ class TestLang < MiniTest::Unit::TestCase
23
23
  round << '|Round of 16|Last 16'
24
24
  round << '|Quarterfinals|Quarter-finals|Quarters|Quarterfinal'
25
25
  round << '|Semifinals|Semi-finals|Semis'
26
- round << '|Third-place play-off|Third place play-off|Third place|3rd place match'
26
+ round << '|Third-place play-off|Third place play-off|Third place|3rd place match|Match for third place'
27
27
  round << '|Final|Finals'
28
28
 
29
29
  knockout_round = 'Round of 32|Last 32'
30
30
  knockout_round << '|Round of 16|Last 16'
31
31
  knockout_round << '|Quarterfinals|Quarter-finals|Quarters|Quarterfinal'
32
32
  knockout_round << '|Semifinals|Semi-finals|Semis'
33
- knockout_round << '|Third-place play-off|Third place play-off|Third place|3rd place match'
33
+ knockout_round << '|Third-place play-off|Third place play-off|Third place|3rd place match|Match for third place'
34
34
  knockout_round << '|Final|Finals'
35
35
 
36
36
 
@@ -1,5 +1,12 @@
1
1
  # encoding: utf-8
2
2
 
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_reader.rb
6
+ # or better
7
+ # rake -I ./lib test
8
+
9
+
3
10
  require 'helper'
4
11
 
5
12
  class TestReader < MiniTest::Unit::TestCase
@@ -10,6 +17,26 @@ class TestReader < MiniTest::Unit::TestCase
10
17
  SportDb.read_builtin
11
18
  end
12
19
 
20
+ def test_bl
21
+ at = Country.create!( key: 'at', name: 'Austria', code: 'AUT', pop: 1, area: 1)
22
+
23
+ teamreader = TeamReader.new( SportDb.test_data_path )
24
+ teamreader.read( 'at-austria/teams', country_id: at.id )
25
+
26
+ leaguereader = LeagueReader.new( SportDb.test_data_path )
27
+ leaguereader.read( 'at-austria/leagues', country_id: at.id )
28
+
29
+ gamereader = GameReader.new( SportDb.test_data_path )
30
+ gamereader.read( 'at-austria/2013_14/bl', country_id: at.id )
31
+
32
+ bl = Event.find_by_key!( 'at.2013/14' )
33
+
34
+ assert_equal 10, bl.teams.count
35
+ assert_equal 36, bl.rounds.count
36
+ assert_equal 180, bl.games.count # 36x5 = 180
37
+ end
38
+
39
+
13
40
  def test_game_reader
14
41
  at = Country.create!( key: 'at', name: 'Austria', code: 'AUT', pop: 1, area: 1)
15
42
 
@@ -47,8 +74,11 @@ class TestReader < MiniTest::Unit::TestCase
47
74
  bl = Event.find_by_key!( 'at.2013/14' )
48
75
  el = Event.find_by_key!( 'at.2.2013/14' )
49
76
 
50
- assert_equal 10, bl.teams.count
51
- assert_equal 10, el.teams.count
77
+ assert_equal 10, bl.teams.count
78
+ assert_equal 36, bl.rounds.count
79
+ assert_equal 180, bl.games.count # 36x5 = 180
80
+
81
+ assert_equal 10, el.teams.count
52
82
  end
53
83
 
54
84
  end # class TestReader
@@ -0,0 +1,99 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_round_def.rb
6
+ # or better
7
+ # rake -I ./lib test
8
+
9
+
10
+ require 'helper'
11
+
12
+ class TestRoundDef < MiniTest::Unit::TestCase
13
+
14
+
15
+ def test_round_en
16
+ SportDb.lang.lang = 'en'
17
+
18
+ data = [
19
+ [ 'Matchday 1 | Thu Jun/12',
20
+ { pos:1,
21
+ title: 'Matchday 1',
22
+ ko: false,
23
+ start_at: Date.new( 2014, 6, 12 ) }],
24
+ [ 'Matchday 13 | Tue Jun/24',
25
+ { pos: 13,
26
+ title: 'Matchday 13',
27
+ ko: false,
28
+ start_at: Date.new( 2014, 6, 24 ) }],
29
+ [ '(16) Round of 16 | Sat Jun/28 - Tue Jul/1',
30
+ { pos: 16,
31
+ title: 'Round of 16',
32
+ ko: true,
33
+ start_at: Date.new( 2014, 6, 28 ),
34
+ end_at: Date.new( 2014, 7, 1 ) }],
35
+ [ '(18) Semi-finals | Tue Jul/8 - Wed Jul/9',
36
+ { pos: 18,
37
+ title: 'Semi-finals',
38
+ ko: true,
39
+ start_at: Date.new( 2014, 7, 8 ),
40
+ end_at: Date.new( 2014, 7, 9 ) }],
41
+ [ '(19) Match for third place | Sat Jul/12',
42
+ { pos: 19,
43
+ title: 'Match for third place',
44
+ ko: true,
45
+ start_at: Date.new( 2014, 7, 12 ) }],
46
+ [ '(20) Final | Sun Jul/13',
47
+ { pos: 20,
48
+ title: 'Final',
49
+ ko: true,
50
+ start_at: Date.new( 2014, 7, 13 ) }] ]
51
+
52
+ assert_rounds( data, Date.new( 2014, 6, 12 )) ## starts Jun/12 2014
53
+ end
54
+
55
+
56
+ private
57
+ class Reader
58
+ include LogUtils::Logging # add logger
59
+ include SportDb::FixtureHelpers
60
+ end
61
+
62
+ def assert_rounds( data, event_start_at )
63
+ data.each do |rec|
64
+ line = rec[0]
65
+ hash = rec[1]
66
+
67
+ start_at, end_at, pos, title, ko = parse_round_def( line, event_start_at )
68
+
69
+ assert_equal hash[:pos], pos, "pos expected #{hash[:pos]} is #{pos} in line >#{line}<"
70
+ assert_equal hash[:title], title
71
+ assert_equal hash[:ko], ko
72
+
73
+ if hash[:start_at]
74
+ assert_equal hash[:start_at].year, start_at.year
75
+ assert_equal hash[:start_at].month, start_at.month
76
+ assert_equal hash[:start_at].day, start_at.day
77
+ end
78
+
79
+ if hash[:end_at]
80
+ assert_equal hash[:end_at].year, end_at.year
81
+ assert_equal hash[:end_at].month, end_at.month
82
+ assert_equal hash[:end_at].day, end_at.day
83
+ end
84
+ end
85
+ end
86
+
87
+ def parse_round_def( line, event_start_at )
88
+ reader = Reader.new
89
+
90
+ start_at = reader.find_date!( line, start_at: event_start_at )
91
+ end_at = reader.find_date!( line, start_at: event_start_at )
92
+ pos = reader.find_round_pos!( line )
93
+ title = reader.find_round_def_title!( line )
94
+ knockout = reader.is_knockout_round?( title ) # NB: use title as input NOT line
95
+
96
+ [start_at, end_at, pos, title, knockout]
97
+ end
98
+
99
+ end # class TestRoundDef
@@ -0,0 +1,155 @@
1
+ # encoding: utf-8
2
+
3
+
4
+ require 'helper'
5
+
6
+ class TestRoundHeader < MiniTest::Unit::TestCase
7
+
8
+
9
+ def test_round_en
10
+ SportDb.lang.lang = 'en'
11
+
12
+ data = [
13
+ [ "2. Round / Group B",
14
+ { pos:2,
15
+ title: '2. Round',
16
+ group_pos: 2,
17
+ group_title: 'Group B',
18
+ ko: false } ],
19
+
20
+ [ "(1) Matchday P.1 / 1st Leg // January 22-24",
21
+ { pos:1,
22
+ title: 'Matchday P.1 / 1st Leg',
23
+ title2: 'January 22-24',
24
+ ko: false } ],
25
+
26
+ [ "(4) Matchday 2 / Group 1 // February 19-21",
27
+ { pos:4,
28
+ title: 'Matchday 2',
29
+ title2: 'February 19-21',
30
+ group_pos: 1,
31
+ group_title: 'Group 1',
32
+ ko: false } ],
33
+
34
+ [ "(13) Round of 16 / 1st Leg // April 25, May 1-3",
35
+ { pos:13,
36
+ title: 'Round of 16 / 1st Leg',
37
+ title2: 'April 25, May 1-3',
38
+ ko: false } ], # NB: 1st Leg is NOT k.o. (only 2nd Leg)
39
+
40
+ [ "(14) Round of 16 / 2nd Leg // May 8-10",
41
+ { pos:14,
42
+ title: 'Round of 16 / 2nd Leg',
43
+ title2: 'May 8-10',
44
+ ko: true }] ]
45
+
46
+ assert_rounds( data )
47
+ end
48
+
49
+
50
+ def test_finals_en
51
+ SportDb.lang.lang = 'en'
52
+
53
+ data = [
54
+ [ '(4) Quarter-finals',
55
+ { pos: 4,
56
+ title: 'Quarter-finals',
57
+ ko: true } ],
58
+
59
+ [ '(5) Semi-finals',
60
+ { pos: 5,
61
+ title: 'Semi-finals',
62
+ ko: true } ],
63
+
64
+ [ '(6) Final',
65
+ { pos: 6,
66
+ title: 'Final',
67
+ ko: true } ] ]
68
+
69
+ assert_rounds( data )
70
+ end
71
+
72
+
73
+ def test_round_es
74
+ SportDb.lang.lang = 'es'
75
+
76
+ data = [
77
+ [ 'Jornada 2 // 27, 28 y 29 de julio',
78
+ { pos:2,
79
+ title: 'Jornada 2',
80
+ title2: '27, 28 y 29 de julio',
81
+ ko: false } ],
82
+
83
+ [ '(18) Cuartos de Final / Ida // 14/15 de noviembre',
84
+ { pos:18,
85
+ title: 'Cuartos de Final / Ida',
86
+ title2: '14/15 de noviembre',
87
+ ko: false } ],
88
+
89
+ [ '(19) Cuartos de Final / Vuelta // 17/18 de noviembre',
90
+ { pos:19,
91
+ title: 'Cuartos de Final / Vuelta',
92
+ title2: '17/18 de noviembre',
93
+ ko: true } ]]
94
+
95
+ assert_rounds( data )
96
+ end
97
+
98
+
99
+ def test_round_de
100
+ SportDb.lang.lang = 'de'
101
+
102
+ data = [
103
+ [ 'Spieltag 5 / Gruppe A // Di./Mi., 20.+21. Nov 2012',
104
+ { pos: 5,
105
+ title: 'Spieltag 5',
106
+ title2: 'Di./Mi., 20.+21. Nov 2012',
107
+ group_pos: 1,
108
+ group_title: 'Gruppe A',
109
+ ko: false } ],
110
+
111
+ [ '(8) Achtelfinale Rückspiele // Di./Mi., 5.+6./12.+13. Mär 2013',
112
+ { pos: 8,
113
+ title: 'Achtelfinale Rückspiele',
114
+ title2: 'Di./Mi., 5.+6./12.+13. Mär 2013',
115
+ ko: true } ]]
116
+
117
+ assert_rounds( data )
118
+ end
119
+
120
+
121
+ private
122
+ class Reader
123
+ include LogUtils::Logging # add logger
124
+ include SportDb::FixtureHelpers
125
+ end
126
+
127
+ def assert_rounds( data )
128
+ data.each do |rec|
129
+ line = rec[0]
130
+ hash = rec[1]
131
+
132
+ pos, title, title2, group_pos, group_title, ko = parse_round_header( line )
133
+
134
+ assert_equal hash[:pos], pos, "pos expected #{hash[:pos]} is #{pos} in line >#{line}<"
135
+ assert_equal hash[:title], title
136
+ assert_equal hash[:title2], title2
137
+ assert_equal hash[:ko], ko
138
+ assert_equal( hash[:group_pos], group_pos, "group_pos expected #{hash[:group_pos]} is #{group_pos} in line >#{line}<" ) if hash[:group_pos]
139
+ assert_equal( hash[:group_title], group_title) if hash[:group_title]
140
+ end
141
+ end
142
+
143
+ def parse_round_header( line )
144
+ reader = Reader.new
145
+
146
+ title2 = reader.find_round_header_title2!( line )
147
+ group_title, group_pos = reader.find_group_title_and_pos!( line )
148
+ pos = reader.find_round_pos!( line )
149
+ title = reader.find_round_header_title!( line )
150
+ knockout = reader.is_knockout_round?( title ) # NB: use title as input NOT line
151
+
152
+ [pos, title, title2, group_pos, group_title, knockout]
153
+ end
154
+
155
+ end # class TestRoundHeader
metadata CHANGED
@@ -1,133 +1,164 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sportdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.10
5
- prerelease:
4
+ version: 1.8.11
6
5
  platform: ruby
7
6
  authors:
8
7
  - Gerald Bauer
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2014-04-07 00:00:00.000000000 Z
11
+ date: 2014-04-08 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: props
16
- requirement: &70027260 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ! '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
- version_requirements: *70027260
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: logutils
27
- requirement: &70026730 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ! '>='
31
32
  - !ruby/object:Gem::Version
32
33
  version: '0'
33
34
  type: :runtime
34
35
  prerelease: false
35
- version_requirements: *70026730
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: textutils
38
- requirement: &70026040 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ! '>='
42
46
  - !ruby/object:Gem::Version
43
47
  version: '0'
44
48
  type: :runtime
45
49
  prerelease: false
46
- version_requirements: *70026040
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: worlddb
49
- requirement: &70025700 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
59
  - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: 2.0.2
55
62
  type: :runtime
56
63
  prerelease: false
57
- version_requirements: *70025700
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 2.0.2
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: tagutils
60
- requirement: &70025340 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
73
  - - ! '>='
64
74
  - !ruby/object:Gem::Version
65
75
  version: '0'
66
76
  type: :runtime
67
77
  prerelease: false
68
- version_requirements: *70025340
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: fetcher
71
- requirement: &70025010 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
87
  - - ! '>='
75
88
  - !ruby/object:Gem::Version
76
89
  version: '0.3'
77
90
  type: :runtime
78
91
  prerelease: false
79
- version_requirements: *70025010
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0.3'
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: gli
82
- requirement: &70024680 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
101
  - - ! '>='
86
102
  - !ruby/object:Gem::Version
87
103
  version: 2.5.6
88
104
  type: :runtime
89
105
  prerelease: false
90
- version_requirements: *70024680
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 2.5.6
91
111
  - !ruby/object:Gem::Dependency
92
112
  name: activerecord
93
- requirement: &70024390 !ruby/object:Gem::Requirement
94
- none: false
113
+ requirement: !ruby/object:Gem::Requirement
95
114
  requirements:
96
115
  - - ! '>='
97
116
  - !ruby/object:Gem::Version
98
117
  version: '0'
99
118
  type: :runtime
100
119
  prerelease: false
101
- version_requirements: *70024390
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
102
125
  - !ruby/object:Gem::Dependency
103
126
  name: rdoc
104
- requirement: &70024030 !ruby/object:Gem::Requirement
105
- none: false
127
+ requirement: !ruby/object:Gem::Requirement
106
128
  requirements:
107
129
  - - ~>
108
130
  - !ruby/object:Gem::Version
109
- version: '3.10'
131
+ version: '4.0'
110
132
  type: :development
111
133
  prerelease: false
112
- version_requirements: *70024030
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '4.0'
113
139
  - !ruby/object:Gem::Dependency
114
140
  name: hoe
115
- requirement: &70023610 !ruby/object:Gem::Requirement
116
- none: false
141
+ requirement: !ruby/object:Gem::Requirement
117
142
  requirements:
118
143
  - - ~>
119
144
  - !ruby/object:Gem::Version
120
- version: '3.3'
145
+ version: '3.10'
121
146
  type: :development
122
147
  prerelease: false
123
- version_requirements: *70023610
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: '3.10'
124
153
  description: sportdb - sport.db command line tool
125
154
  email: opensport@googlegroups.com
126
155
  executables:
127
156
  - sportdb
128
157
  extensions: []
129
158
  extra_rdoc_files:
159
+ - HISTORY.md
130
160
  - Manifest.txt
161
+ - README.md
131
162
  files:
132
163
  - HISTORY.md
133
164
  - Manifest.txt
@@ -247,7 +278,8 @@ files:
247
278
  - test/test_date.rb
248
279
  - test/test_lang.rb
249
280
  - test/test_reader.rb
250
- - test/test_round.rb
281
+ - test/test_round_def.rb
282
+ - test/test_round_header.rb
251
283
  - test/test_scores.rb
252
284
  - test/test_utils.rb
253
285
  - test/test_winner.rb
@@ -255,6 +287,7 @@ files:
255
287
  homepage: https://github.com/geraldb/sport.db.ruby
256
288
  licenses:
257
289
  - Public Domain
290
+ metadata: {}
258
291
  post_install_message: ! '******************************************************************************
259
292
 
260
293
 
@@ -272,30 +305,29 @@ rdoc_options:
272
305
  require_paths:
273
306
  - lib
274
307
  required_ruby_version: !ruby/object:Gem::Requirement
275
- none: false
276
308
  requirements:
277
309
  - - ! '>='
278
310
  - !ruby/object:Gem::Version
279
311
  version: 1.9.2
280
312
  required_rubygems_version: !ruby/object:Gem::Requirement
281
- none: false
282
313
  requirements:
283
314
  - - ! '>='
284
315
  - !ruby/object:Gem::Version
285
316
  version: '0'
286
317
  requirements: []
287
- rubyforge_project: sportdb
288
- rubygems_version: 1.8.17
318
+ rubyforge_project:
319
+ rubygems_version: 2.1.10
289
320
  signing_key:
290
- specification_version: 3
321
+ specification_version: 4
291
322
  summary: sportdb - sport.db command line tool
292
323
  test_files:
324
+ - test/test_changes.rb
325
+ - test/test_cursor.rb
293
326
  - test/test_date.rb
294
327
  - test/test_lang.rb
295
- - test/test_cursor.rb
296
- - test/test_round.rb
328
+ - test/test_reader.rb
329
+ - test/test_round_def.rb
330
+ - test/test_round_header.rb
297
331
  - test/test_scores.rb
298
- - test/test_winner.rb
299
332
  - test/test_utils.rb
300
- - test/test_reader.rb
301
- - test/test_changes.rb
333
+ - test/test_winner.rb
@@ -1,171 +0,0 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_lang.rb
6
- # or better
7
- # rake -I ./lib test
8
-
9
- require 'helper'
10
-
11
- class TestRound < MiniTest::Unit::TestCase
12
-
13
-
14
- def test_round_en
15
- SportDb.lang.lang = 'en'
16
-
17
- line = "2. Round / Group B"
18
-
19
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
20
-
21
- assert_equal 2, pos
22
- assert_equal '2. Round', title
23
- assert_equal nil, title2
24
- assert_equal false, ko
25
-
26
- line = "(1) Matchday P.1 / 1st Leg // January 22-24"
27
-
28
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
29
-
30
- assert_equal 1, pos
31
- assert_equal 'Matchday P.1 / 1st Leg', title
32
- assert_equal 'January 22-24', title2
33
- assert_equal false, ko
34
-
35
- line = "(4) Matchday 2 / Group 1 // February 19-21"
36
-
37
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
38
-
39
- assert_equal 4, pos
40
- assert_equal 'Matchday 2', title
41
- assert_equal 'February 19-21', title2
42
- assert_equal false, ko
43
-
44
-
45
- line = "(13) Round of 16 / 1st Leg // April 25, May 1-3"
46
-
47
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
48
-
49
- assert( pos == 13 )
50
- assert( title == "Round of 16 / 1st Leg" )
51
- assert( title2 == "April 25, May 1-3" )
52
- assert( ko == false ) # NB: 1st Leg is NOT k.o. (only 2nd Leg)
53
-
54
- line = "(14) Round of 16 / 2nd Leg // May 8-10"
55
-
56
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
57
-
58
- assert( pos == 14 )
59
- assert( title == "Round of 16 / 2nd Leg" )
60
- assert( title2 == "May 8-10" )
61
- assert( ko == true )
62
- end
63
-
64
-
65
-
66
- def test_finals_en
67
- SportDb.lang.lang = 'en'
68
-
69
- line = "(4) Quarter-finals"
70
-
71
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
72
-
73
- assert( pos == 4 )
74
- assert( title == "Quarter-finals" )
75
- assert( title2 == nil )
76
- assert( ko == true )
77
-
78
- line = "(5) Semi-finals"
79
-
80
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
81
-
82
- assert( pos == 5 )
83
- assert( title == "Semi-finals" )
84
- assert( title2 == nil )
85
- assert( ko == true )
86
-
87
- line = "(6) Final"
88
-
89
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
90
-
91
- assert( pos == 6 )
92
- assert( title == "Final" )
93
- assert( title2 == nil )
94
- assert( ko == true )
95
- end
96
-
97
-
98
- def test_round_es
99
- SportDb.lang.lang = 'es'
100
-
101
- line = "Jornada 2 // 27, 28 y 29 de julio"
102
-
103
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
104
-
105
- assert( pos == 2 )
106
- assert( title == 'Jornada 2' )
107
- assert( title2 == '27, 28 y 29 de julio' )
108
- assert( ko == false )
109
-
110
- line = "(18) Cuartos de Final / Ida // 14/15 de noviembre"
111
-
112
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
113
-
114
- assert( pos == 18 )
115
- assert( title == 'Cuartos de Final / Ida' )
116
- assert( title2 == '14/15 de noviembre' )
117
- assert( ko == false )
118
-
119
- line = "(19) Cuartos de Final / Vuelta // 17/18 de noviembre"
120
-
121
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
122
-
123
- assert( pos == 19 )
124
- assert( title == 'Cuartos de Final / Vuelta' )
125
- assert( title2 == '17/18 de noviembre' )
126
- assert( ko == true )
127
- end
128
-
129
-
130
- def test_round_de
131
- SportDb.lang.lang = 'de'
132
-
133
- line = "Spieltag 5 / Gruppe A // Di./Mi., 20.+21. Nov 2012"
134
-
135
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
136
-
137
- assert( pos == 5 )
138
- assert( title == 'Spieltag 5' )
139
- assert( title2 == 'Di./Mi., 20.+21. Nov 2012' )
140
- assert( ko == false )
141
-
142
- line = "(8) Achtelfinale Rückspiele // Di./Mi., 5.+6./12.+13. Mär 2013"
143
-
144
- pos, title, title2, group_pos, group_title, ko = parse_round( line )
145
-
146
- assert( pos == 8 )
147
- assert( title == 'Achtelfinale Rückspiele' )
148
- assert( title2 == 'Di./Mi., 5.+6./12.+13. Mär 2013' )
149
- assert( ko == true )
150
- end
151
-
152
-
153
- private
154
- class Reader
155
- include LogUtils::Logging # add logger
156
- include SportDb::FixtureHelpers
157
- end
158
-
159
- def parse_round( line )
160
- reader = Reader.new
161
-
162
- title2 = reader.find_round_title2!( line )
163
- group_title, group_pos = reader.find_group_title_and_pos!( line )
164
- pos = reader.find_round_pos!( line )
165
- title = reader.find_round_title!( line )
166
- knockout = reader.is_knockout_round?( title ) # NB: use title as input NOT line
167
-
168
- [pos, title, title2, group_pos, group_title, knockout]
169
- end
170
-
171
- end # class TestRound