sportdb 1.8.10 → 1.8.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Manifest.txt +2 -1
- data/bin/sportdb +0 -0
- data/config/fixtures/en.yml +1 -1
- data/lib/sportdb/readers/game.rb +82 -15
- data/lib/sportdb/schema.rb +4 -0
- data/lib/sportdb/utils_date.rb +1 -1
- data/lib/sportdb/utils_group.rb +1 -1
- data/lib/sportdb/utils_round.rb +53 -7
- data/lib/sportdb/version.rb +1 -1
- data/test/data/at-austria/2013_14/bl.txt +14 -6
- data/test/test_lang.rb +2 -2
- data/test/test_reader.rb +32 -2
- data/test/test_round_def.rb +99 -0
- data/test/test_round_header.rb +155 -0
- metadata +78 -46
- data/test/test_round.rb +0 -171
checksums.yaml
ADDED
@@ -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
|
data/Manifest.txt
CHANGED
data/bin/sportdb
CHANGED
File without changes
|
data/config/fixtures/en.yml
CHANGED
@@ -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
|
data/lib/sportdb/readers/game.rb
CHANGED
@@ -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
|
-
|
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 =
|
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 =
|
234
|
+
title = find_round_header_title!( line )
|
195
235
|
|
196
236
|
## NB: use extracted round title for knockout check
|
197
|
-
|
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:
|
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
|
-
|
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:
|
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:
|
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 ] =
|
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 )
|
data/lib/sportdb/schema.rb
CHANGED
@@ -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
|
|
data/lib/sportdb/utils_date.rb
CHANGED
@@ -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})
|
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
|
data/lib/sportdb/utils_group.rb
CHANGED
data/lib/sportdb/utils_round.rb
CHANGED
@@ -32,13 +32,26 @@ module SportDb
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
|
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
|
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
|
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 "
|
73
|
+
logger.debug " find_round_header_title! line-before: >>#{buf}<<"
|
55
74
|
|
56
|
-
buf.gsub!( /\[
|
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
|
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
|
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.)
|
data/lib/sportdb/version.rb
CHANGED
@@ -2,7 +2,15 @@
|
|
2
2
|
# Österreichische Bundesliga 2013/14
|
3
3
|
|
4
4
|
|
5
|
-
1. Runde
|
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
|
data/test/test_lang.rb
CHANGED
@@ -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
|
|
data/test/test_reader.rb
CHANGED
@@ -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
|
51
|
-
assert_equal
|
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.
|
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-
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
105
|
-
none: false
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
106
128
|
requirements:
|
107
129
|
- - ~>
|
108
130
|
- !ruby/object:Gem::Version
|
109
|
-
version: '
|
131
|
+
version: '4.0'
|
110
132
|
type: :development
|
111
133
|
prerelease: false
|
112
|
-
version_requirements:
|
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:
|
116
|
-
none: false
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
117
142
|
requirements:
|
118
143
|
- - ~>
|
119
144
|
- !ruby/object:Gem::Version
|
120
|
-
version: '3.
|
145
|
+
version: '3.10'
|
121
146
|
type: :development
|
122
147
|
prerelease: false
|
123
|
-
version_requirements:
|
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/
|
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:
|
288
|
-
rubygems_version: 1.
|
318
|
+
rubyforge_project:
|
319
|
+
rubygems_version: 2.1.10
|
289
320
|
signing_key:
|
290
|
-
specification_version:
|
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/
|
296
|
-
- test/
|
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/
|
301
|
-
- test/test_changes.rb
|
333
|
+
- test/test_winner.rb
|
data/test/test_round.rb
DELETED
@@ -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
|