rrschedule 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +100 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/example.rb +56 -0
- data/lib/rrschedule.rb +176 -0
- data/rrschedule.gemspec +55 -0
- data/test/helper.rb +10 -0
- data/test/test_rrschedule.rb +7 -0
- metadata +92 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 flamontagne
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
= rrschedule
|
2
|
+
|
3
|
+
RRSchedule make it easier to generate Round-Robin sport seasons. To generate a schedule, it needs a team list, a season
|
4
|
+
start date, the day(s) of the week where the games are played and some other options.
|
5
|
+
|
6
|
+
It takes into consideration physical constraints such as the number of playing surfaces availables and game times.
|
7
|
+
Each round of the round-robin is splitted into groups that respect these constraints.
|
8
|
+
|
9
|
+
Say for example that you want to generate a round-robin schedule for your 15-teams volleyball league.
|
10
|
+
If there are only 3 volleyball fields available and that games are played each monday at 6PM and 8PM, this is technically
|
11
|
+
impossible to complete one round in a single day (only 6 games can be played). RRSchedule will put the rest of the games
|
12
|
+
for this round on the next gameday and will start a new round right after.
|
13
|
+
|
14
|
+
|
15
|
+
== Installation
|
16
|
+
gem install rrschedule (not on gemcutter yet... hold on)
|
17
|
+
require 'rrschedule.rb'
|
18
|
+
|
19
|
+
== Prepare the schedule
|
20
|
+
Time.zone = "America/New_York"
|
21
|
+
teams = ["Rockets","Jetpacks","Snakes","Cobras","Wolves","Huskies","Tigers","Lions",
|
22
|
+
"Moose","Sprinklers","Pacers","Cyclops","Munchkins","Magicians","French Fries"]
|
23
|
+
|
24
|
+
schedule=RRSchedule::Schedule.new(
|
25
|
+
#array of teams that will compete against each other in the season
|
26
|
+
:teams => teams,
|
27
|
+
|
28
|
+
#list of available playing surfaces (volleyball fields, curling sheets, tennis courts, etc)
|
29
|
+
:playing_surfaces => ["A","B","C","D"],
|
30
|
+
|
31
|
+
#day(s) of the week where games are played
|
32
|
+
:wdays => [3],
|
33
|
+
|
34
|
+
#Season will start on...
|
35
|
+
:start_date => Time.zone.parse("2010/10/13"),
|
36
|
+
|
37
|
+
#array of dates WITHOUT games
|
38
|
+
:exclude_dates => [
|
39
|
+
Time.zone.parse("2010/11/24"),
|
40
|
+
Time.zone.parse("2010/12/15"),
|
41
|
+
Time.zone.parse("2010/12/22"),
|
42
|
+
Time.zone.parse("2010/12/29")
|
43
|
+
],
|
44
|
+
|
45
|
+
#1 for Round Robin, 2 for Double Round Robin and so on
|
46
|
+
:cycles => 1,
|
47
|
+
|
48
|
+
#Shuffle team order before each cycle
|
49
|
+
:shuffle_initial_order => true,
|
50
|
+
|
51
|
+
#Times of the day where the games are played
|
52
|
+
:game_times => ["10:00 AM", "1:00 PM"]
|
53
|
+
)
|
54
|
+
|
55
|
+
== Generate the schedule
|
56
|
+
schedule.generate
|
57
|
+
|
58
|
+
== Playing with the output
|
59
|
+
|
60
|
+
=== human readable schedule
|
61
|
+
puts schedule.to_s
|
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
|
69
|
+
end
|
70
|
+
puts "\n"
|
71
|
+
end
|
72
|
+
|
73
|
+
=== Team schedule
|
74
|
+
test_team = "Sprinklers"
|
75
|
+
games=schedule.by_team(test_team)
|
76
|
+
puts "Schedule for team ##{test_team.to_s}"
|
77
|
+
games.each do |g|
|
78
|
+
puts "#{g.game_date.strftime("%Y-%m-%d")}: against #{g.team_a == test_team ? g.team_b.to_s : g.team_a.to_s} on playing surface ##{g.playing_surface} at #{g.game_time}"
|
79
|
+
end
|
80
|
+
|
81
|
+
=== Face to Face
|
82
|
+
games=schedule.face_to_face("Lions","Moose")
|
83
|
+
puts "FACE TO FACE: Lions Vs Moose"
|
84
|
+
games.each do |g|
|
85
|
+
puts g.game_date.to_s + " on playing surface " + g.playing_surface.to_s + " at " + g.game_time.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
=== Iterate the schedule
|
89
|
+
schedule.gamedays.each do |gd,games|
|
90
|
+
puts gd
|
91
|
+
puts "===================="
|
92
|
+
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}"
|
94
|
+
end
|
95
|
+
puts "\n"
|
96
|
+
end
|
97
|
+
|
98
|
+
== Copyright
|
99
|
+
|
100
|
+
Copyright (c) 2010 flamontagne. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "rrschedule"
|
8
|
+
gem.summary = %Q{Round-Robin schedule generator}
|
9
|
+
gem.description = %Q{This gem automate the process of creating a round-robin sport schedule.}
|
10
|
+
gem.email = "flamontagne@azanka.ca"
|
11
|
+
gem.homepage = "http://github.com/flamontagne/rrschedule"
|
12
|
+
gem.authors = ["flamontagne"]
|
13
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rcov/rcovtask'
|
30
|
+
Rcov::RcovTask.new do |test|
|
31
|
+
test.libs << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
task :rcov do
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :test => :check_dependencies
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "rrschedule #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/example.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'rrschedule.rb'
|
2
|
+
Time.zone = "America/New_York"
|
3
|
+
|
4
|
+
teams = ["Rockets","Jetpacks","Snakes","Cobras","Wolves","Huskies","Tigers","Lions","Moose","Sprinklers","Pacers","Cyclops","Munchkins","Magicians","French Fries"]
|
5
|
+
schedule=RRSchedule::Schedule.new(
|
6
|
+
:teams => teams, #array of teams that will compete against each other in the season (can be any kind of object)
|
7
|
+
:playing_surfaces => ["A","B","C","D"], #list of available playing surfaces (volleyball fields, curling sheets, tennis courts, etc)
|
8
|
+
:wdays => [3], #day(s) of the week where games are played
|
9
|
+
:start_date => Time.zone.parse("2010/10/13"), #Season will start on...
|
10
|
+
:exclude_dates => [ #array of dates WITHOUT games
|
11
|
+
Time.zone.parse("2010/11/24"),
|
12
|
+
Time.zone.parse("2010/12/15"),
|
13
|
+
Time.zone.parse("2010/12/22"),
|
14
|
+
Time.zone.parse("2010/12/29")
|
15
|
+
],
|
16
|
+
:cycles => 1, #1 for Round Robin, 2 for Double Round Robin and so on
|
17
|
+
:shuffle_initial_order => true, #Shuffle team order before each cycle
|
18
|
+
:game_times => ["10:00 AM", "1:00 PM"] #Times of the day where the games are played
|
19
|
+
)
|
20
|
+
res=schedule.generate
|
21
|
+
|
22
|
+
#human readable schedule
|
23
|
+
puts schedule.to_s
|
24
|
+
|
25
|
+
schedule.rounds.each do |round|
|
26
|
+
puts "Round ##{round.round}"
|
27
|
+
round.games.each do |g|
|
28
|
+
puts g.team_a.to_s + " Vs " + g.team_b.to_s
|
29
|
+
end
|
30
|
+
puts "\n"
|
31
|
+
end
|
32
|
+
|
33
|
+
#display a team schedule
|
34
|
+
#test_team = "Sprinklers"
|
35
|
+
#games=schedule.by_team(test_team)
|
36
|
+
#puts "Schedule for team ##{test_team.to_s}"
|
37
|
+
#games.each do |g|
|
38
|
+
# puts "#{g.game_date.strftime("%Y-%m-%d")}: against #{g.team_a == test_team ? g.team_b.to_s : g.team_a.to_s} on playing surface ##{g.playing_surface} at #{g.game_time}"
|
39
|
+
#end
|
40
|
+
|
41
|
+
#face_to_face
|
42
|
+
#games=schedule.face_to_face("Lions","Moose")
|
43
|
+
#puts "FACE TO FACE: Lions Vs Moose"
|
44
|
+
#games.each do |g|
|
45
|
+
# puts g.game_date.to_s + " on playing surface " + g.playing_surface.to_s + " at " + g.game_time.to_s
|
46
|
+
#end
|
47
|
+
|
48
|
+
#How to iterate the schedule
|
49
|
+
#schedule.gamedays.each do |gd,games|
|
50
|
+
# puts gd
|
51
|
+
# puts "===================="
|
52
|
+
# games.each do |g|
|
53
|
+
# puts g.team_a.to_s + " Vs " + g.team_b.to_s + " on playing surface ##{g.playing_surface} at #{g.game_time}"
|
54
|
+
# end
|
55
|
+
# puts "\n"
|
56
|
+
#end
|
data/lib/rrschedule.rb
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
# rrschedule (Round Robin Schedule generator)
|
2
|
+
# Auhtor: François Lamontagne
|
3
|
+
############################################################################################################################
|
4
|
+
require 'rubygems'
|
5
|
+
require 'active_support'
|
6
|
+
|
7
|
+
module RRSchedule
|
8
|
+
class Schedule
|
9
|
+
attr_accessor :playing_surfaces, :game_times, :cycles, :wdays, :start_date, :exclude_dates, :shuffle_initial_order
|
10
|
+
attr_reader :teams, :rounds
|
11
|
+
|
12
|
+
def initialize(params={})
|
13
|
+
store_params(params)
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
def generate(params={})
|
18
|
+
@teams = @teams.sort_by{rand} if self.shuffle_initial_order
|
19
|
+
initial_order = @teams.clone
|
20
|
+
current_cycle = 0
|
21
|
+
current_round = 0
|
22
|
+
all_games = []
|
23
|
+
|
24
|
+
#Loop start here
|
25
|
+
begin
|
26
|
+
games = []
|
27
|
+
t = @teams.clone
|
28
|
+
while !t.empty? do
|
29
|
+
team_a = t.shift
|
30
|
+
team_b = t.reverse!.shift
|
31
|
+
t.reverse!
|
32
|
+
games << {:team_a => team_a, :team_b => team_b}
|
33
|
+
all_games << {:team_a => team_a, :team_b => team_b}
|
34
|
+
end
|
35
|
+
#round completed
|
36
|
+
current_round += 1
|
37
|
+
@rounds ||= []
|
38
|
+
@rounds << Round.new(:round => current_round, :games => games.collect {|g| Game.new(:team_a => g[:team_a], :team_b => g[:team_b])})
|
39
|
+
|
40
|
+
games.reject! {|g| g[:team_a] == :dummy || g[:team_b] == :dummy}
|
41
|
+
all_games.reject! {|g| g[:team_a] == :dummy || g[:team_b] == :dummy}
|
42
|
+
|
43
|
+
@teams = @teams.insert(1,@teams.delete_at(@teams.size-1))
|
44
|
+
|
45
|
+
#If we have completed a cycle
|
46
|
+
if @teams == initial_order
|
47
|
+
current_cycle += 1
|
48
|
+
#Shuffle the teams at each cycle
|
49
|
+
if current_cycle <= self.cycles && self.shuffle_initial_order
|
50
|
+
@teams = @teams.sort_by{rand}
|
51
|
+
initial_order = @teams.clone
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end until @teams == initial_order && current_cycle==self.cycles
|
55
|
+
@teams.delete(:dummy)
|
56
|
+
slice(all_games)
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
def face_to_face(team_a,team_b)
|
61
|
+
res=[]
|
62
|
+
self.gamedays.each do |gd,games|
|
63
|
+
res << games.select{|g| (g.team_a == team_a && g.team_b == team_b) || (g.team_a == team_b && g.team_b == team_a)}
|
64
|
+
end
|
65
|
+
res.flatten
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_s
|
69
|
+
res = ""
|
70
|
+
res << "#{@schedule.keys.size.to_s} gamedays\n"
|
71
|
+
@schedule.sort.each do |gd,games|
|
72
|
+
gd_proc = lambda {gd.strftime("%Y-%m-%d")}
|
73
|
+
res << gd_proc.call + "\n"
|
74
|
+
res << "=" * gd_proc.call.length + "\n"
|
75
|
+
games.each do |g|
|
76
|
+
res << g.team_a.to_s + " VS " + g.team_b.to_s + " on playing surface #{g.playing_surface} at #{g.game_time}\n"
|
77
|
+
end
|
78
|
+
res << "\n"
|
79
|
+
end
|
80
|
+
res
|
81
|
+
end
|
82
|
+
|
83
|
+
def gamedays
|
84
|
+
@schedule.sort
|
85
|
+
end
|
86
|
+
|
87
|
+
def by_team(team)
|
88
|
+
gms=[]
|
89
|
+
self.gamedays.each do |gd,games|
|
90
|
+
#games = games.each {|g| g.game_date = gd}
|
91
|
+
gms << games.select{|g| g.team_a == team || g.team_b == team}
|
92
|
+
end
|
93
|
+
gms.flatten
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def teams=(arr)
|
99
|
+
@teams = arr.clone
|
100
|
+
@teams << :dummy if arr.size.odd?
|
101
|
+
end
|
102
|
+
|
103
|
+
#Let's slice our games according to our physical constraints
|
104
|
+
def slice(games)
|
105
|
+
res={}
|
106
|
+
slices = games.each_slice(games_per_day)
|
107
|
+
wdays_stack = self.wdays.clone
|
108
|
+
|
109
|
+
cur_date = self.start_date
|
110
|
+
slices.each_with_index do |slice,i|
|
111
|
+
gt_stack = self.game_times.clone
|
112
|
+
ps_stack = self.playing_surfaces.clone
|
113
|
+
wdays_stack=self.wdays.clone if wdays_stack.empty?
|
114
|
+
|
115
|
+
cur_wday = wdays_stack.shift
|
116
|
+
cur_date = next_game_date(cur_date,cur_wday)
|
117
|
+
cur_gt = gt_stack.shift
|
118
|
+
|
119
|
+
res[cur_date] = []
|
120
|
+
slice.each_with_index do |g,game_index|
|
121
|
+
cur_ps = ps_stack.shift
|
122
|
+
res[cur_date] << Game.new(:team_a => g[:team_a], :team_b => g[:team_b], :playing_surface => cur_ps, :game_time => cur_gt, :game_date => cur_date)
|
123
|
+
cur_gt = gt_stack.shift if ps_stack.empty?
|
124
|
+
gt_stack = self.game_times.clone if gt_stack.empty?
|
125
|
+
ps_stack = self.playing_surfaces.clone if ps_stack.empty?
|
126
|
+
end
|
127
|
+
cur_date += 1.day
|
128
|
+
end
|
129
|
+
@schedule = res
|
130
|
+
end
|
131
|
+
|
132
|
+
def next_game_date(dt,wday)
|
133
|
+
dt += 1.days until wday == dt.wday && !self.exclude_dates.include?(dt)
|
134
|
+
dt
|
135
|
+
end
|
136
|
+
|
137
|
+
def games_per_day
|
138
|
+
self.playing_surfaces.size * self.game_times.size
|
139
|
+
end
|
140
|
+
|
141
|
+
def store_params(params)
|
142
|
+
self.teams = params[:teams] if params[:teams].respond_to?(:to_ary)
|
143
|
+
self.playing_surfaces = params[:playing_surfaces] if params[:playing_surfaces].respond_to?(:to_ary)
|
144
|
+
self.cycles = params[:cycles] if params[:cycles].respond_to?(:to_int)
|
145
|
+
self.game_times = params[:game_times] if params[:game_times].respond_to?(:to_ary)
|
146
|
+
self.shuffle_initial_order = params[:shuffle_initial_order]
|
147
|
+
self.exclude_dates = params[:exclude_dates] || []
|
148
|
+
self.start_date = params[:start_date] || Time.now.beginning_of_day
|
149
|
+
self.wdays = Array(params[:wdays]) if params[:wdays].respond_to?(:to_ary) || params[:wdays].respond_to?(:to_int)
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
class Game
|
156
|
+
attr_accessor :team_a, :team_b, :playing_surface, :game_time, :game_date
|
157
|
+
|
158
|
+
def initialize(params={})
|
159
|
+
self.team_a = params[:team_a]
|
160
|
+
self.team_b = params[:team_b]
|
161
|
+
self.playing_surface = params[:playing_surface]
|
162
|
+
self.game_time = params[:game_time]
|
163
|
+
self.game_date = params[:game_date]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
class Round
|
168
|
+
attr_accessor :round, :games
|
169
|
+
|
170
|
+
def initialize(params={})
|
171
|
+
self.round = params[:round]
|
172
|
+
self.games = params[:games]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
data/rrschedule.gemspec
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rrschedule}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["flamontagne"]
|
12
|
+
s.date = %q{2010-11-07}
|
13
|
+
s.description = %q{This gem automate the process of creating a round-robin sport schedule.}
|
14
|
+
s.email = %q{flamontagne@azanka.ca}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"lib/example.rb",
|
27
|
+
"lib/rrschedule.rb",
|
28
|
+
"rrschedule.gemspec",
|
29
|
+
"test/helper.rb",
|
30
|
+
"test/test_rrschedule.rb"
|
31
|
+
]
|
32
|
+
s.homepage = %q{http://github.com/flamontagne/rrschedule}
|
33
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
s.rubygems_version = %q{1.3.7}
|
36
|
+
s.summary = %q{Round-Robin schedule generator}
|
37
|
+
s.test_files = [
|
38
|
+
"test/test_rrschedule.rb",
|
39
|
+
"test/helper.rb"
|
40
|
+
]
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
44
|
+
s.specification_version = 3
|
45
|
+
|
46
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
47
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
48
|
+
else
|
49
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
50
|
+
end
|
51
|
+
else
|
52
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
data/test/helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rrschedule
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- flamontagne
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-07 00:00:00 -04:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: thoughtbot-shoulda
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
description: This gem automate the process of creating a round-robin sport schedule.
|
36
|
+
email: flamontagne@azanka.ca
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- LICENSE
|
43
|
+
- README.rdoc
|
44
|
+
files:
|
45
|
+
- .document
|
46
|
+
- .gitignore
|
47
|
+
- LICENSE
|
48
|
+
- README.rdoc
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- lib/example.rb
|
52
|
+
- lib/rrschedule.rb
|
53
|
+
- rrschedule.gemspec
|
54
|
+
- test/helper.rb
|
55
|
+
- test/test_rrschedule.rb
|
56
|
+
has_rdoc: true
|
57
|
+
homepage: http://github.com/flamontagne/rrschedule
|
58
|
+
licenses: []
|
59
|
+
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options:
|
62
|
+
- --charset=UTF-8
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
hash: 3
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
hash: 3
|
80
|
+
segments:
|
81
|
+
- 0
|
82
|
+
version: "0"
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.3.7
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: Round-Robin schedule generator
|
90
|
+
test_files:
|
91
|
+
- test/test_rrschedule.rb
|
92
|
+
- test/helper.rb
|