rrschedule 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +3 -3
- data/VERSION +1 -1
- data/lib/rrschedule.rb +40 -33
- data/test/test_rrschedule.rb +28 -9
- metadata +5 -5
data/README.rdoc
CHANGED
@@ -86,10 +86,10 @@ and will start a new round right after.
|
|
86
86
|
end
|
87
87
|
|
88
88
|
=== Iterate through schedule
|
89
|
-
schedule.gamedays.each do |gd
|
90
|
-
puts gd
|
89
|
+
schedule.gamedays.each do |gd|
|
90
|
+
puts gd.date
|
91
91
|
puts "===================="
|
92
|
-
games.each do |g|
|
92
|
+
gd.games.each do |g|
|
93
93
|
puts g.team_a.to_s + " Vs " + g.team_b.to_s + " on playing surface ##{g.playing_surface} at #{g.game_time}"
|
94
94
|
end
|
95
95
|
puts "\n"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
data/lib/rrschedule.rb
CHANGED
@@ -5,15 +5,16 @@ require 'active_support'
|
|
5
5
|
module RRSchedule
|
6
6
|
class Schedule
|
7
7
|
attr_accessor :playing_surfaces, :game_times, :cycles, :wdays, :start_date, :exclude_dates, :shuffle_initial_order
|
8
|
-
attr_reader :teams, :rounds
|
8
|
+
attr_reader :teams, :rounds, :gamedays
|
9
9
|
|
10
10
|
def initialize(params={})
|
11
|
+
@gamedays = []
|
11
12
|
self.teams = params[:teams] || [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
|
12
13
|
self.playing_surfaces = Array(params[:playing_surfaces]).empty? ? ["Surface A", "Surface B"] : Array(params[:playing_surfaces])
|
13
14
|
self.cycles = params[:cycles] || 1
|
14
15
|
|
15
16
|
self.game_times = Array(params[:game_times]).empty? ? ["7:00 PM", "9:00 PM"] : Array(params[:game_times])
|
16
|
-
self.game_times.collect! do |gt|
|
17
|
+
self.game_times.collect! do |gt|
|
17
18
|
begin
|
18
19
|
DateTime.parse(gt)
|
19
20
|
rescue
|
@@ -21,7 +22,7 @@ module RRSchedule
|
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
|
-
self.shuffle_initial_order = params[:shuffle_initial_order]
|
25
|
+
self.shuffle_initial_order = params[:shuffle_initial_order].nil? ? true : params[:shuffle_initial_order]
|
25
26
|
self.exclude_dates = params[:exclude_dates] || []
|
26
27
|
self.start_date = params[:start_date] || Time.now.beginning_of_day
|
27
28
|
self.wdays = Array(params[:wdays]).empty? ? [1] : Array(params[:wdays])
|
@@ -83,41 +84,37 @@ module RRSchedule
|
|
83
84
|
|
84
85
|
def face_to_face(team_a,team_b)
|
85
86
|
res=[]
|
86
|
-
self.gamedays.each do |gd
|
87
|
-
res << games.select {|g| (g.team_a == team_a && g.team_b == team_b) || (g.team_a == team_b && g.team_b == team_a)}
|
87
|
+
self.gamedays.each do |gd|
|
88
|
+
res << gd.games.select {|g| (g.team_a == team_a && g.team_b == team_b) || (g.team_a == team_b && g.team_b == team_a)}
|
88
89
|
end
|
89
90
|
res.flatten
|
90
91
|
end
|
91
92
|
|
92
93
|
def to_s
|
93
94
|
res = ""
|
94
|
-
res << "#{
|
95
|
-
|
96
|
-
res << gd.strftime("%Y-%m-%d") + "\n"
|
95
|
+
res << "#{self.gamedays.size.to_s} gamedays\n"
|
96
|
+
self.gamedays.each do |gd|
|
97
|
+
res << gd.date.strftime("%Y-%m-%d") + "\n"
|
97
98
|
res << "==========\n"
|
98
|
-
games.each do |g|
|
99
|
+
gd.games.each do |g|
|
99
100
|
res << "#{g.team_a.to_s} VS #{g.team_b.to_s} on playing surface #{g.playing_surface} at #{g.game_time.strftime("%I:%M %p")}\n"
|
100
101
|
end
|
101
102
|
res << "\n"
|
102
103
|
end
|
103
104
|
res
|
104
105
|
end
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
end
|
109
|
-
|
110
|
-
def by_team(team)
|
106
|
+
|
107
|
+
#TODO: should return either a Schedule instance or a TeamSchedule instance (this class doesn't exist yet)
|
108
|
+
def by_team(team)
|
111
109
|
gms=[]
|
112
|
-
self.gamedays.each do |gd
|
113
|
-
gms << games.select{|g| g.team_a == team || g.team_b == team}
|
110
|
+
self.gamedays.each do |gd|
|
111
|
+
gms << gd.games.select{|g| g.team_a == team || g.team_b == team}
|
114
112
|
end
|
115
113
|
gms.flatten
|
116
114
|
end
|
117
115
|
|
118
|
-
#
|
119
|
-
def round_robin?
|
120
|
-
|
116
|
+
#returns true if the generated schedule is a valid round-robin (for testing purpose)
|
117
|
+
def round_robin?
|
121
118
|
#each round-robin round should contains n-1 games where n is the nbr of teams (:dummy included if odd)
|
122
119
|
return false if self.rounds.size != (@teams.size*self.cycles)-self.cycles
|
123
120
|
|
@@ -130,48 +127,48 @@ module RRSchedule
|
|
130
127
|
return true
|
131
128
|
end
|
132
129
|
|
133
|
-
private
|
134
|
-
|
135
130
|
def teams=(arr)
|
136
131
|
@teams = arr.clone
|
137
132
|
raise ":dummy is a reserved team name. Please use something else" if @teams.member?(:dummy)
|
138
133
|
raise "at least 2 teams are required" if @teams.size == 1
|
139
134
|
@teams << :dummy if @teams.size.odd?
|
140
135
|
end
|
141
|
-
|
142
|
-
|
136
|
+
|
137
|
+
private
|
138
|
+
#Slice games according to playing surfaces and game times
|
143
139
|
def slice(games)
|
144
|
-
res={}
|
145
140
|
slices = games.each_slice(games_per_day)
|
146
141
|
wdays_stack = self.wdays.clone
|
147
142
|
cur_date = self.start_date
|
148
143
|
slices.each_with_index do |slice,i|
|
149
|
-
gt_stack = self.game_times.clone
|
150
|
-
ps_stack = self.playing_surfaces.clone
|
144
|
+
gt_stack = self.game_times.clone.sort_by{rand}
|
145
|
+
ps_stack = self.playing_surfaces.clone.sort_by{rand}
|
151
146
|
wdays_stack = self.wdays.clone if wdays_stack.empty?
|
152
147
|
|
153
148
|
cur_wday = wdays_stack.shift
|
154
149
|
cur_date = next_game_date(cur_date,cur_wday)
|
155
150
|
cur_gt = gt_stack.shift
|
156
151
|
|
157
|
-
|
152
|
+
gameday = Gameday.new(:date => cur_date)
|
153
|
+
|
158
154
|
slice.each_with_index do |g,game_index|
|
159
155
|
cur_ps = ps_stack.shift
|
160
|
-
|
156
|
+
gameday.games << Game.new(
|
161
157
|
:team_a => g[:team_a],
|
162
158
|
:team_b => g[:team_b],
|
163
159
|
:playing_surface => cur_ps,
|
164
160
|
:game_time => cur_gt,
|
165
161
|
:game_date => cur_date)
|
162
|
+
|
166
163
|
cur_gt = gt_stack.shift if ps_stack.empty?
|
167
164
|
gt_stack = self.game_times.clone if gt_stack.empty?
|
168
165
|
ps_stack = self.playing_surfaces.clone if ps_stack.empty?
|
169
166
|
end
|
170
167
|
|
171
|
-
|
168
|
+
gameday.games = gameday.games.sort_by {|g| [g.game_time,g.playing_surface]}
|
169
|
+
self.gamedays << gameday
|
172
170
|
cur_date += 1.day
|
173
171
|
end
|
174
|
-
@schedule = res
|
175
172
|
end
|
176
173
|
|
177
174
|
def next_game_date(dt,wday)
|
@@ -183,7 +180,17 @@ module RRSchedule
|
|
183
180
|
self.playing_surfaces.size * self.game_times.size
|
184
181
|
end
|
185
182
|
end
|
186
|
-
|
183
|
+
|
184
|
+
class Gameday
|
185
|
+
attr_accessor :date, :games
|
186
|
+
|
187
|
+
def initialize(params)
|
188
|
+
self.date = params[:date]
|
189
|
+
self.games = params[:games] || []
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
|
187
194
|
class Game
|
188
195
|
attr_accessor :team_a, :team_b, :playing_surface, :game_time, :game_date
|
189
196
|
|
@@ -201,7 +208,7 @@ module RRSchedule
|
|
201
208
|
|
202
209
|
def initialize(params={})
|
203
210
|
self.round = params[:round]
|
204
|
-
self.games = params[:games]
|
211
|
+
self.games = params[:games] || []
|
205
212
|
end
|
206
213
|
end
|
207
214
|
end
|
data/test/test_rrschedule.rb
CHANGED
@@ -15,7 +15,7 @@ class TestRrschedule < Test::Unit::TestCase
|
|
15
15
|
assert schedule.exclude_dates.empty?
|
16
16
|
end
|
17
17
|
|
18
|
-
should "have a dummy team when
|
18
|
+
should "have a dummy team when number of teams is odd" do
|
19
19
|
schedule = RRSchedule::Schedule.new(
|
20
20
|
:teams => Array(1..9)
|
21
21
|
)
|
@@ -24,7 +24,7 @@ class TestRrschedule < Test::Unit::TestCase
|
|
24
24
|
assert schedule.teams.member?(:dummy), "There should always be a :dummy team when the nbr of teams is odd"
|
25
25
|
end
|
26
26
|
|
27
|
-
should "not have a dummy team when
|
27
|
+
should "not have a dummy team when number of teams is even" do
|
28
28
|
schedule = RRSchedule::Schedule.new(
|
29
29
|
:teams => Array(1..6)
|
30
30
|
)
|
@@ -69,7 +69,7 @@ class TestRrschedule < Test::Unit::TestCase
|
|
69
69
|
assert_equal ["the only one"], schedule.playing_surfaces
|
70
70
|
end
|
71
71
|
|
72
|
-
should "have at least
|
72
|
+
should "have at least two teams" do
|
73
73
|
assert_raise RuntimeError do
|
74
74
|
schedule = RRSchedule::Schedule.new(:teams => [1])
|
75
75
|
end
|
@@ -81,6 +81,25 @@ class TestRrschedule < Test::Unit::TestCase
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
context "Any valid schedule" do
|
85
|
+
setup do
|
86
|
+
@s = RRSchedule::Schedule.new(
|
87
|
+
:teams => %w(a b c d e f g h i j l m),
|
88
|
+
:playing_surfaces => %w(one two),
|
89
|
+
:game_times => ["10:00 AM", "13:00 PM"]
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
should "have gamedays that respect the wdays attribute" do
|
94
|
+
@s.wdays = [3,5]
|
95
|
+
@s.generate
|
96
|
+
|
97
|
+
@s.gamedays.each do |gd|
|
98
|
+
assert [3,5].include?(gd.date.wday), "wday is #{gd.date.wday.to_s} but should be 3 or 5"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
84
103
|
context "A generated schedule with an odd number of teams" do
|
85
104
|
setup do
|
86
105
|
@s = RRSchedule::Schedule.new(
|
@@ -94,8 +113,8 @@ class TestRrschedule < Test::Unit::TestCase
|
|
94
113
|
assert @s.round_robin?
|
95
114
|
end
|
96
115
|
|
97
|
-
should "not have any :dummy teams in the schedule" do
|
98
|
-
assert @s.gamedays.collect{|gd
|
116
|
+
should "not have any :dummy teams in the final schedule" do
|
117
|
+
assert @s.gamedays.collect{|gd| gd.games}.flatten.select{
|
99
118
|
|g| [g.team_a,g.team_b].include?(:dummy)
|
100
119
|
}.size == 0
|
101
120
|
end
|
@@ -114,10 +133,10 @@ class TestRrschedule < Test::Unit::TestCase
|
|
114
133
|
assert @s.round_robin?
|
115
134
|
end
|
116
135
|
|
117
|
-
should "not have any :dummy teams in the schedule" do
|
118
|
-
assert @s.gamedays.collect{|gd
|
136
|
+
should "not have any :dummy teams in the final schedule" do
|
137
|
+
assert @s.gamedays.collect{|gd| gd.games}.flatten.select{
|
119
138
|
|g| [g.team_a,g.team_b].include?(:dummy)
|
120
139
|
}.size == 0
|
121
|
-
end
|
122
|
-
end
|
140
|
+
end
|
141
|
+
end
|
123
142
|
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
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 5
|
10
|
+
version: 0.1.5
|
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: 2010-11-
|
18
|
+
date: 2010-11-10 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -100,5 +100,5 @@ signing_key:
|
|
100
100
|
specification_version: 3
|
101
101
|
summary: Round-Robin schedule generator
|
102
102
|
test_files:
|
103
|
-
- test/helper.rb
|
104
103
|
- test/test_rrschedule.rb
|
104
|
+
- test/helper.rb
|