rrschedule 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/rrschedule.rb +97 -64
- data/test/test_rrschedule.rb +7 -7
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.3
|
data/lib/rrschedule.rb
CHANGED
@@ -89,7 +89,7 @@ module RRSchedule
|
|
89
89
|
self.gamedays.each do |gd|
|
90
90
|
res << gd.date.strftime("%Y-%m-%d") + "\n"
|
91
91
|
res << "==========\n"
|
92
|
-
gd.games.each do |g|
|
92
|
+
gd.games.sort{|g1,g2| g1.gt == g2.gt ? g1.ps <=> g2.ps : g1.gt <=> g2.gt}.each do |g|
|
93
93
|
res << "#{g.ta.to_s} VS #{g.tb.to_s} on playing surface #{g.ps} at #{g.gt.strftime("%I:%M %p")}\n"
|
94
94
|
end
|
95
95
|
res << "\n"
|
@@ -129,42 +129,19 @@ module RRSchedule
|
|
129
129
|
end
|
130
130
|
|
131
131
|
#Dispatch games according to available playing surfaces and game times
|
132
|
-
#The flat schedule contains "place holders" for the actual games. Each row contains
|
133
|
-
#a game date, a game time and a playing surface. We then process our rounds one by one
|
134
|
-
#and we put each matchup in the next available slot of the flat schedule
|
135
132
|
def dispatch_games(rounds)
|
136
|
-
teams_day = {}
|
137
|
-
flat_schedule = generate_flat_schedule
|
138
|
-
|
139
133
|
rounds_copy = Marshal.load(Marshal.dump(rounds)) #deep clone
|
140
|
-
cur_flight_index =
|
134
|
+
cur_flight_index = 0
|
141
135
|
|
142
136
|
while !rounds_copy.flatten.empty? do
|
143
137
|
cur_round = rounds_copy[cur_flight_index].shift
|
144
|
-
|
145
138
|
#process the next round in the current flight
|
146
139
|
if cur_round
|
147
|
-
cur_round.games.
|
148
|
-
unless [game.team_a,game.team_b].include?(:dummy)
|
149
|
-
if teams_day[flat_schedule[i][:gamedate]] && (teams_day[flat_schedule[i][:gamedate]].include?(game.team_a) || teams_day[flat_schedule[i][:gamedate]].include?(game.team_b))
|
150
|
-
#team is already playing this day. This can happen if we have flights with different number of teams in it.
|
151
|
-
gamedate = flat_schedule[i][:gamedate]
|
152
|
-
while flat_schedule[i] && flat_schedule[i][:gamedate] == gamedate do
|
153
|
-
i += 1
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
flat_schedule[i][:team_a] = game.team_a
|
158
|
-
flat_schedule[i][:team_b] = game.team_b
|
159
|
-
teams_day[flat_schedule[i][:gamedate]] ||= []
|
160
|
-
teams_day[flat_schedule[i][:gamedate]] << game.team_a
|
161
|
-
teams_day[flat_schedule[i][:gamedate]] << game.team_b
|
162
|
-
i += 1
|
163
|
-
end
|
140
|
+
cur_round.games.each do |game|
|
141
|
+
dispatch_game(game) unless [game.team_a,game.team_b].include?(:dummy)
|
164
142
|
end
|
165
143
|
end
|
166
144
|
|
167
|
-
|
168
145
|
if cur_flight_index == @flights.size-1
|
169
146
|
cur_flight_index = 0
|
170
147
|
else
|
@@ -172,8 +149,8 @@ module RRSchedule
|
|
172
149
|
end
|
173
150
|
end
|
174
151
|
|
175
|
-
#We group our
|
176
|
-
s
|
152
|
+
#We group our schedule by gameday
|
153
|
+
s=@schedule.group_by{|fs| fs[:gamedate]}.sort
|
177
154
|
s.each do |gamedate,gms|
|
178
155
|
games = []
|
179
156
|
gms.each do |gm|
|
@@ -186,57 +163,113 @@ module RRSchedule
|
|
186
163
|
end
|
187
164
|
self.gamedays << Gameday.new(:date => gamedate, :games => games)
|
188
165
|
end
|
189
|
-
self.gamedays.each { |gd| gd.games.reject! {|g| g.team_a.nil?}}
|
190
166
|
end
|
191
167
|
|
192
168
|
|
193
|
-
def
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
@
|
203
|
-
|
204
|
-
|
169
|
+
def dispatch_game(game)
|
170
|
+
@cur_rule ||= @rules.select{|r| r.wday >= self.start_date.wday}.first || @rules.first
|
171
|
+
@cur_rule_index ||= @rules.index(@cur_rule)
|
172
|
+
|
173
|
+
@gt_stack ||= @cur_rule.gt.clone
|
174
|
+
@ps_stack ||= @cur_rule.ps.clone.shuffle
|
175
|
+
|
176
|
+
@cur_gt ||= @gt_stack.shift
|
177
|
+
@cur_ps ||= @ps_stack.shift
|
178
|
+
@cur_date ||= next_game_date(self.start_date,@cur_rule.wday)
|
179
|
+
@schedule ||= []
|
180
|
+
|
181
|
+
#if one of the team has already plays at this gamedate, we change rule
|
182
|
+
if @schedule.size>0
|
183
|
+
games_this_date = @schedule.select{|v| v[:gamedate] == @cur_date}
|
184
|
+
if games_this_date.select{|g| [game.team_a,game.team_b].include?(g[:team_a]) || [game.team_a,game.team_b].include?(g[:team_b])}.size >0
|
185
|
+
@cur_rule_index = (@cur_rule_index < @rules.size-1) ? @cur_rule_index+1 : 0
|
186
|
+
@cur_rule = @rules[@cur_rule_index]
|
187
|
+
@gt_stack = @cur_rule.gt.clone
|
188
|
+
@ps_stack = @cur_rule.ps.clone.shuffle
|
189
|
+
@cur_gt = @gt_stack.shift
|
190
|
+
@cur_ps = @ps_stack.shift
|
191
|
+
@cur_date = next_game_date(@cur_date+=1,@cur_rule.wday)
|
192
|
+
end
|
205
193
|
end
|
206
194
|
|
195
|
+
@schedule << {:team_a => game.team_a, :team_b => game.team_b, :gamedate => @cur_date, :ps => @cur_ps, :gt => @cur_gt}
|
207
196
|
|
208
|
-
|
209
|
-
|
197
|
+
if !@ps_stack.empty?
|
198
|
+
@cur_ps = @ps_stack.shift
|
199
|
+
else
|
200
|
+
if !@gt_stack.empty?
|
201
|
+
@cur_gt = @gt_stack.shift
|
202
|
+
@ps_stack = @cur_rule.ps.clone.shuffle; @cur_ps = @ps_stack.shift
|
203
|
+
else
|
204
|
+
#PS and GT stack empty... we go to the next rule
|
205
|
+
if @cur_rule_index < @rules.size-1
|
206
|
+
@cur_rule_index += 1
|
207
|
+
#Go to the next date (except if the new rule is for the same weekday)
|
208
|
+
@cur_date = next_game_date(@cur_date+=1,@cur_rule.wday) if @cur_rule.wday != @rules[@cur_rule_index].wday
|
209
|
+
else
|
210
|
+
@cur_rule_index = 0
|
211
|
+
@cur_date = next_game_date(@cur_date+=1,@cur_rule.wday)
|
212
|
+
end
|
213
|
+
@cur_rule = @rules[@cur_rule_index]
|
214
|
+
@gt_stack = @cur_rule.gt.clone; @cur_gt = @gt_stack.shift
|
215
|
+
@ps_stack = @cur_rule.ps.clone.shuffle; @cur_ps = @ps_stack.shift
|
216
|
+
end
|
217
|
+
end
|
210
218
|
|
211
|
-
|
212
|
-
cur_rule.gt.each do |gt|
|
213
|
-
cur_rule.ps.each do |ps|
|
219
|
+
end
|
214
220
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
221
|
+
def place_game(game)
|
222
|
+
@cur_rule ||= @rules.select{|r| r.wday >= self.start_date.wday}.first || @rules.first
|
223
|
+
|
224
|
+
@cur_rule_index ||= @rules.index(@cur_rule)
|
225
|
+
@cur_gt_index ||= 0
|
226
|
+
@cur_ps_index ||= 0
|
227
|
+
|
228
|
+
@cur_gt = @cur_rule.gt[@cur_gt_index]
|
229
|
+
@cur_ps = @cur_rule.ps[@cur_ps_index]
|
230
|
+
@cur_date ||= next_game_date(self.start_date,@cur_rule.wday)
|
231
|
+
@schedule ||= []
|
232
|
+
|
233
|
+
#if one of the team has already plays at this gamedate, we change rule
|
234
|
+
if @schedule.size>0
|
235
|
+
games_this_date = @schedule.select{|v| v[:gamedate] == @cur_date}
|
236
|
+
if games_this_date.select{|g| [game.team_a,game.team_b].include?(g[:team_a]) || [game.team_a,game.team_b].include?(g[:team_b])}.size >0
|
237
|
+
@cur_rule_index = (@cur_rule_index < @rules.size-1) ? @cur_rule_index+1 : 0
|
238
|
+
@cur_rule = @rules[@cur_rule_index]
|
239
|
+
@cur_ps_index=0
|
240
|
+
@cur_gt_index=0
|
241
|
+
@cur_ps = @cur_rule.ps.first
|
242
|
+
@cur_gt = @cur_rule.gt.first
|
243
|
+
@cur_date = next_game_date(@cur_date+=1,@cur_rule.wday)
|
222
244
|
end
|
245
|
+
end
|
223
246
|
|
224
|
-
|
225
|
-
last_date = cur_date
|
247
|
+
@schedule << {:team_a => game.team_a, :team_b => game.team_b, :gamedate => @cur_date, :ps => @cur_ps, :gt => @cur_gt}
|
226
248
|
|
227
|
-
|
228
|
-
|
229
|
-
|
249
|
+
if @cur_ps_index < @cur_rule.ps.size-1
|
250
|
+
@cur_ps_index += 1
|
251
|
+
else
|
252
|
+
@cur_ps_index = 0
|
230
253
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
254
|
+
if @cur_gt_index < @cur_rule.gt.size-1
|
255
|
+
@cur_gt_index += 1
|
256
|
+
else
|
257
|
+
@cur_gt_index = 0
|
258
|
+
|
259
|
+
if @cur_rule_index < @rules.size-1
|
260
|
+
@cur_rule_index += 1
|
261
|
+
#Go to the next date (except if the new rule is for the same weekday)
|
262
|
+
@cur_date = next_game_date(@cur_date+=1,@cur_rule.wday) if @cur_rule.wday != @rules[@cur_rule_index].wday
|
263
|
+
else
|
264
|
+
@cur_rule_index = 0
|
265
|
+
@cur_date = next_game_date(@cur_date+=1,@cur_rule.wday)
|
266
|
+
end
|
267
|
+
@cur_rule = @rules[@cur_rule_index]
|
235
268
|
end
|
236
269
|
end
|
237
|
-
flat_schedule
|
238
270
|
end
|
239
271
|
|
272
|
+
|
240
273
|
#get the next gameday
|
241
274
|
def next_game_date(dt,wday)
|
242
275
|
dt += 1 until wday == dt.wday && !self.exclude_dates.include?(dt)
|
data/test/test_rrschedule.rb
CHANGED
@@ -142,8 +142,8 @@ class TestRrschedule < Test::Unit::TestCase
|
|
142
142
|
@s = Schedule.new
|
143
143
|
@s.teams = [%w(a1 a2 a3 a4 a5 a6 a7 a8), %w(b1 b2 b3 b4 b5 b6 b7 b8)]
|
144
144
|
@s.rules = [
|
145
|
-
Rule.new(:wday => 4, :gt => ["7:00PM"], :ps => %w(
|
146
|
-
Rule.new(:wday => 4, :gt => ["9:00PM"], :ps => %w(
|
145
|
+
Rule.new(:wday => 4, :gt => ["7:00PM"], :ps => %w(field1 field2)),
|
146
|
+
Rule.new(:wday => 4, :gt => ["9:00PM"], :ps => %w(field1 field2 field3))
|
147
147
|
]
|
148
148
|
@s.start_date = Date.parse("2011/01/27")
|
149
149
|
@s.generate
|
@@ -158,11 +158,11 @@ class TestRrschedule < Test::Unit::TestCase
|
|
158
158
|
#the last one because it might not be full (round-robin over)
|
159
159
|
if i<@s.gamedays.size-1
|
160
160
|
assert_equal 5, gd.games.size
|
161
|
-
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("7:00PM") && g.playing_surface == "
|
162
|
-
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("7:00PM") && g.playing_surface == "
|
163
|
-
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("9:00PM") && g.playing_surface == "
|
164
|
-
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("9:00PM") && g.playing_surface == "
|
165
|
-
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("9:00PM") && g.playing_surface == "
|
161
|
+
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("7:00PM") && g.playing_surface == "field1"}.size
|
162
|
+
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("7:00PM") && g.playing_surface == "field2"}.size
|
163
|
+
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("9:00PM") && g.playing_surface == "field1"}.size
|
164
|
+
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("9:00PM") && g.playing_surface == "field2"}.size
|
165
|
+
assert_equal 1, gd.games.select{|g| g.game_time == DateTime.parse("9:00PM") && g.playing_surface == "field3"}.size
|
166
166
|
cur_date += 7
|
167
167
|
end
|
168
168
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rrschedule
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- flamontagne
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-18 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|