rrschedule 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -60,12 +60,12 @@ and will start a new round right after.
60
60
  === human readable schedule
61
61
  puts schedule.to_s
62
62
 
63
- === Round by round... without the schedule info
64
- #If you have an ODD number of teams you will see a "dummy" opponent in each round
65
- schedule.rounds.each do |round|
66
- puts "Round ##{round.round}"
67
- round.games.each do |g|
68
- puts g.team_a.to_s + " Vs " + g.team_b.to_s
63
+ === Iterate through schedule
64
+ schedule.gamedays.each do |gd|
65
+ puts gd.date
66
+ puts "===================="
67
+ gd.games.each do |g|
68
+ puts g.team_a.to_s + " Vs " + g.team_b.to_s + " on playing surface ##{g.playing_surface} at #{g.game_time}"
69
69
  end
70
70
  puts "\n"
71
71
  end
@@ -85,22 +85,38 @@ and will start a new round right after.
85
85
  puts g.game_date.to_s + " on playing surface " + g.playing_surface.to_s + " at " + g.game_time.to_s
86
86
  end
87
87
 
88
- === Iterate through schedule
89
- schedule.gamedays.each do |gd|
90
- puts gd.date
91
- puts "===================="
92
- gd.games.each do |g|
93
- puts g.team_a.to_s + " Vs " + g.team_b.to_s + " on playing surface ##{g.playing_surface} at #{g.game_time}"
88
+ === Each round of the roun-robin without any date/time or playing location info
89
+ #If you have an ODD number of teams you will see a "dummy" opponent in each round
90
+ schedule.rounds.each do |round|
91
+ puts "Round ##{round.round}"
92
+ round.games.each do |g|
93
+ puts g.team_a.to_s + " Vs " + g.team_b.to_s
94
94
  end
95
95
  puts "\n"
96
96
  end
97
97
 
98
98
  == Issues / Other
99
99
 
100
- Playing surfaces and game times need to be distributed evenly among all competitors. At the moment
101
- the same teams will play on the same surfaces and at the same game times most of the time.
102
- Note that it only happens when a full round can be completed on a single gameday. Otherwise there will
103
- be a natural rotation and teams will play on different surfaces and at different times between gamedays.
100
+ Starting from version 0.1.5, calling Schedule#gamedays will returns an array of Gameday instances.
101
+ If you upgrade to this version you will need to change your code accordingly.
102
+
103
+ #this won't work anymore
104
+ schedule.gamedays.each do |gd,games|
105
+ puts gd
106
+
107
+ games.each do |g|
108
+ end
109
+ #...
110
+ end
111
+
112
+ #do this instead
113
+ schedule.gamedays.each do |gd|
114
+ puts gd.date
115
+ gd.games.each do |g|
116
+ end
117
+ #...
118
+ end
119
+
104
120
 
105
121
  Hope this gem will be useful to some people!
106
122
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.5
1
+ 0.1.6
data/lib/rrschedule.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  # rrschedule (Round Robin Schedule generator)
2
2
  # Auhtor: François Lamontagne
3
3
  ############################################################################################################################
4
- require 'active_support'
4
+ require 'active_support/all'
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
8
  attr_reader :teams, :rounds, :gamedays
9
-
9
+
10
10
  def initialize(params={})
11
11
  @gamedays = []
12
12
  self.teams = params[:teams] || [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
@@ -31,18 +31,17 @@ module RRSchedule
31
31
  self
32
32
  end
33
33
 
34
-
34
+ #TODO: consider refactoring with a recursive algorithm
35
35
  def generate(params={})
36
36
  @teams = @teams.sort_by{rand} if self.shuffle_initial_order
37
37
  initial_order = @teams.clone
38
- current_cycle = 0
39
- current_round = 0
38
+ current_cycle = current_round = 0
40
39
  all_games = []
41
-
40
+
42
41
  #Loop start here
43
42
  begin
44
43
  games = []
45
- t = @teams.clone
44
+ t = @teams.clone
46
45
  while !t.empty? do
47
46
  team_a = t.shift
48
47
  team_b = t.reverse!.shift
@@ -50,8 +49,9 @@ module RRSchedule
50
49
  games << {:team_a => team_a, :team_b => team_b}
51
50
  all_games << {:team_a => team_a, :team_b => team_b}
52
51
  end
53
- #round completed
54
- current_round += 1
52
+
53
+ current_round += 1 #round completed
54
+
55
55
  @rounds ||= []
56
56
  @rounds << Round.new(
57
57
  :round => current_round,
@@ -76,12 +76,12 @@ module RRSchedule
76
76
  end
77
77
  end
78
78
  end until @teams == initial_order && current_cycle==self.cycles
79
- #@teams.delete(:dummy)
79
+
80
80
  slice(all_games)
81
81
  self
82
82
  end
83
83
 
84
-
84
+ #returns an array of Game instances where team_a and team_b are facing each other
85
85
  def face_to_face(team_a,team_b)
86
86
  res=[]
87
87
  self.gamedays.each do |gd|
@@ -90,6 +90,7 @@ module RRSchedule
90
90
  res.flatten
91
91
  end
92
92
 
93
+ #human readable schedule
93
94
  def to_s
94
95
  res = ""
95
96
  res << "#{self.gamedays.size.to_s} gamedays\n"
@@ -97,14 +98,14 @@ module RRSchedule
97
98
  res << gd.date.strftime("%Y-%m-%d") + "\n"
98
99
  res << "==========\n"
99
100
  gd.games.each do |g|
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"
101
+ res << "#{g.ta.to_s} VS #{g.tb.to_s} on playing surface #{g.ps} at #{g.gt.strftime("%I:%M %p")}\n"
101
102
  end
102
103
  res << "\n"
103
104
  end
104
105
  res
105
106
  end
106
-
107
- #TODO: should return either a Schedule instance or a TeamSchedule instance (this class doesn't exist yet)
107
+
108
+ #return an array of Game instances where 'team' is playing
108
109
  def by_team(team)
109
110
  gms=[]
110
111
  self.gamedays.each do |gd|
@@ -130,7 +131,8 @@ module RRSchedule
130
131
  def teams=(arr)
131
132
  @teams = arr.clone
132
133
  raise ":dummy is a reserved team name. Please use something else" if @teams.member?(:dummy)
133
- raise "at least 2 teams are required" if @teams.size == 1
134
+ raise "at least 2 teams are required" if @teams.size == 1
135
+ raise "teams have to be unique" if @teams.uniq.size < @teams.size
134
136
  @teams << :dummy if @teams.size.odd?
135
137
  end
136
138
 
@@ -193,6 +195,11 @@ module RRSchedule
193
195
 
194
196
  class Game
195
197
  attr_accessor :team_a, :team_b, :playing_surface, :game_time, :game_date
198
+ alias :ta :team_a
199
+ alias :tb :team_b
200
+ alias :ps :playing_surface
201
+ alias :gt :game_time
202
+ alias :gd :game_date
196
203
 
197
204
  def initialize(params={})
198
205
  self.team_a = params[:team_a]
@@ -79,6 +79,13 @@ class TestRrschedule < Test::Unit::TestCase
79
79
  schedule = RRSchedule::Schedule.new
80
80
  assert schedule.teams.size > 1
81
81
  end
82
+
83
+ should "not have a team that is specified twice" do
84
+ assert_raise RuntimeError do
85
+ schedule = RRSchedule::Schedule.new(:teams => %w(a a b c d e f g h i))
86
+ end
87
+
88
+ end
82
89
  end
83
90
 
84
91
  context "Any valid schedule" do
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: 17
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 5
10
- version: 0.1.5
9
+ - 6
10
+ version: 0.1.6
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-10 00:00:00 -05:00
18
+ date: 2010-11-11 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/test_rrschedule.rb
104
103
  - test/helper.rb
104
+ - test/test_rrschedule.rb