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