sportdb 1.8.10 → 1.8.11

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.
@@ -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