recurrence 0.1.1 → 0.1.2
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.
- data/History.txt +28 -29
- data/README.markdown +15 -26
- data/Rakefile +23 -73
- data/init.rb +2 -1
- data/lib/recurrence.rb +138 -14
- data/lib/recurrence/event.rb +7 -76
- data/lib/recurrence/event/base.rb +80 -0
- data/lib/recurrence/event/daily.rb +10 -8
- data/lib/recurrence/event/monthly.rb +83 -82
- data/lib/recurrence/event/weekly.rb +20 -19
- data/lib/recurrence/event/yearly.rb +50 -49
- data/lib/recurrence/version.rb +8 -0
- data/recurrence.gemspec +57 -29
- data/spec/recurrence_spec.rb +523 -0
- metadata +58 -26
- data/lib/recurrence/base.rb +0 -127
- data/lib/recurrence/shortcuts.rb +0 -23
data/recurrence.gemspec
CHANGED
@@ -1,32 +1,60 @@
|
|
1
|
-
#
|
2
|
-
#
|
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 -*-
|
3
5
|
|
4
6
|
Gem::Specification.new do |s|
|
5
|
-
s.
|
6
|
-
s.
|
7
|
-
|
8
|
-
s.
|
9
|
-
s.add_dependency "activesupport", ">= 2.1.1"
|
10
|
-
s.require_paths = ["lib"]
|
11
|
-
s.files = ["init.rb",
|
12
|
-
"Rakefile",
|
13
|
-
"recurrence.gemspec",
|
14
|
-
"History.txt",
|
15
|
-
"License.txt",
|
16
|
-
"README.markdown",
|
17
|
-
"lib/recurrence",
|
18
|
-
"lib/recurrence/base.rb",
|
19
|
-
"lib/recurrence/event",
|
20
|
-
"lib/recurrence/event/daily.rb",
|
21
|
-
"lib/recurrence/event/monthly.rb",
|
22
|
-
"lib/recurrence/event/weekly.rb",
|
23
|
-
"lib/recurrence/event/yearly.rb",
|
24
|
-
"lib/recurrence/event.rb",
|
25
|
-
"lib/recurrence/shortcuts.rb",
|
26
|
-
"lib/recurrence.rb"]
|
7
|
+
s.name = %q{recurrence}
|
8
|
+
s.version = "0.1.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
27
11
|
s.authors = ["Nando Vieira"]
|
28
|
-
s.
|
29
|
-
s.
|
30
|
-
s.
|
31
|
-
s.
|
32
|
-
|
12
|
+
s.date = %q{2010-09-09}
|
13
|
+
s.description = %q{}
|
14
|
+
s.email = %q{fnando.vieira@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.markdown"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"History.txt",
|
20
|
+
"License.txt",
|
21
|
+
"README.markdown",
|
22
|
+
"Rakefile",
|
23
|
+
"init.rb",
|
24
|
+
"lib/recurrence.rb",
|
25
|
+
"lib/recurrence/event.rb",
|
26
|
+
"lib/recurrence/event/base.rb",
|
27
|
+
"lib/recurrence/event/daily.rb",
|
28
|
+
"lib/recurrence/event/monthly.rb",
|
29
|
+
"lib/recurrence/event/weekly.rb",
|
30
|
+
"lib/recurrence/event/yearly.rb",
|
31
|
+
"lib/recurrence/version.rb",
|
32
|
+
"recurrence.gemspec",
|
33
|
+
"spec/recurrence_spec.rb"
|
34
|
+
]
|
35
|
+
s.homepage = %q{http://github.com/fnando/recurrence}
|
36
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.3.7}
|
39
|
+
s.summary = %q{A simple library to handle recurring events}
|
40
|
+
s.test_files = [
|
41
|
+
"spec/recurrence_spec.rb"
|
42
|
+
]
|
43
|
+
|
44
|
+
if s.respond_to? :specification_version then
|
45
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
46
|
+
s.specification_version = 3
|
47
|
+
|
48
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
49
|
+
s.add_development_dependency(%q<rspec>, [">= 2.0.0"])
|
50
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
51
|
+
else
|
52
|
+
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
53
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
54
|
+
end
|
55
|
+
else
|
56
|
+
s.add_dependency(%q<rspec>, [">= 2.0.0"])
|
57
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,523 @@
|
|
1
|
+
require "recurrence"
|
2
|
+
|
3
|
+
Date::DATE_FORMATS[:date] = "%d/%m/%Y"
|
4
|
+
Time::DATE_FORMATS[:date] = "%d/%m/%Y"
|
5
|
+
|
6
|
+
describe "recurrence" do
|
7
|
+
it "should require :every option" do
|
8
|
+
expect { recurrence({}) }.to raise_error(ArgumentError)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should require valid :every option" do
|
12
|
+
expect { recurrence(:every => "invalid") }.to raise_error(ArgumentError)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should require :interval to be greater than zero when provided" do
|
16
|
+
expect { recurrence(:every => :day, :interval => 0) }.to raise_error(ArgumentError)
|
17
|
+
end
|
18
|
+
|
19
|
+
Recurrence::Event::Monthly::INTERVALS.each do |interval|
|
20
|
+
it "should accept valid :interval symbol for monthly recurrence (#{interval[0]})" do
|
21
|
+
expect { recurrence(:every => :month, :on => 10, :interval => interval[0]) }.to_not raise_error(ArgumentError)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Recurrence::Event::Yearly::MONTHS.each do |month_name, month_number|
|
26
|
+
it "should accept month as symbol for yearly recurrence (#{month_name})" do
|
27
|
+
expect { recurrence(:every => :year, :on => [month_name, 10]) }.to_not raise_error(ArgumentError)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should require month to be a valid symbol for yearly recurrence" do
|
32
|
+
expect { recurrence(:every => :year, :on => [:invalid, 10]) }.to raise_error(ArgumentError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should require :interval to be a valid symbol for monthly recurrence" do
|
36
|
+
expect { recurrence(:every => :month, :on => 10, :interval => :invalid) }.to raise_error(ArgumentError)
|
37
|
+
end
|
38
|
+
|
39
|
+
context "with daily recurring" do
|
40
|
+
it "should recur until limit date" do
|
41
|
+
@recurrence = Recurrence.daily
|
42
|
+
@recurrence.events[-1].should == Date.parse("2037-12-31")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should repeat until 1 month from now" do
|
46
|
+
date = 1.month.from_now
|
47
|
+
@recurrence = recurrence(:every => :day, :until => date.to_date)
|
48
|
+
@recurrence.events[-1].should == date.to_date
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should start 2 months ago (#{2.months.ago.to_s(:date)})" do
|
52
|
+
date = 2.months.ago
|
53
|
+
@recurrence = recurrence(:every => :day, :starts => date.to_date)
|
54
|
+
@recurrence.events[0].should == date.to_date
|
55
|
+
@recurrence.events[1].should == (date + 1.day).to_date
|
56
|
+
@recurrence.events[2].should == (date + 2.day).to_date
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should start at 2008-03-19 and repeat until 2008-04-24" do
|
60
|
+
@recurrence = recurrence(:every => :day, :starts => "2008-03-19", :until => "2008-04-24")
|
61
|
+
@recurrence.events[0].to_s.should == "2008-03-19"
|
62
|
+
@recurrence.events[1].to_s.should == "2008-03-20"
|
63
|
+
@recurrence.events[-1].to_s.should == "2008-04-24"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should use interval" do
|
67
|
+
@recurrence = recurrence(:every => :day, :interval => 2, :starts => "2008-09-21")
|
68
|
+
@recurrence.events[0].to_s.should == "2008-09-21"
|
69
|
+
@recurrence.events[1].to_s.should == "2008-09-23"
|
70
|
+
@recurrence.events[2].to_s.should == "2008-09-25"
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should have a lacking day if the interval does not match the last day" do
|
74
|
+
@recurrence = recurrence(:every => :day, :starts => "2008-03-19", :until => "2008-04-25", :interval => 2)
|
75
|
+
@recurrence.events[-1].to_s.should == "2008-04-24"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context "with weekly recurring" do
|
80
|
+
it "should recur until limit date" do
|
81
|
+
@recurrence = Recurrence.weekly(:on => :thursday)
|
82
|
+
@recurrence.events[-1].should == Date.parse("2037-12-31")
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should repeat 6 weeks from now" do
|
86
|
+
date = 6.weeks.from_now
|
87
|
+
@recurrence = recurrence(:every => :week, :on => date.wday, :until => date.to_date)
|
88
|
+
@recurrence.events[-1].should == date.to_date
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should start 3 months ago (#{3.months.ago.to_s(:date)})" do
|
92
|
+
date = 3.months.ago
|
93
|
+
|
94
|
+
@recurrence = recurrence(:every => :week, :on => date.wday, :starts => date.to_date)
|
95
|
+
@recurrence.events[0].should == date.to_date
|
96
|
+
@recurrence.events[1].should == (date + 1.week).to_date
|
97
|
+
@recurrence.events[2].should == (date + 2.weeks).to_date
|
98
|
+
@recurrence.events[3].should == (date + 3.weeks).to_date
|
99
|
+
@recurrence.events[4].should == (date + 4.weeks).to_date
|
100
|
+
@recurrence.events[5].should == (date + 5.weeks).to_date
|
101
|
+
@recurrence.events[6].should == (date + 6.weeks).to_date
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should start at 2008-02-29 and repeat until 2008-03-14" do
|
105
|
+
starts = Date.parse("2008-02-29")
|
106
|
+
ends = Date.parse("2008-03-14")
|
107
|
+
|
108
|
+
@recurrence = recurrence(:every => :week, :on => :friday, :starts => starts, :until => ends.to_date)
|
109
|
+
@recurrence.events[0].to_s.should == "2008-02-29"
|
110
|
+
@recurrence.events[1].to_s.should == "2008-03-07"
|
111
|
+
@recurrence.events[-1].to_s.should == ends.to_s
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should use interval" do
|
115
|
+
starts = Date.parse("2008-09-21")
|
116
|
+
@recurrence = recurrence(:every => :week, :on => starts.wday, :interval => 2, :starts => starts, :until => "2009-01-01")
|
117
|
+
@recurrence.events[0].to_s.should == "2008-09-21"
|
118
|
+
@recurrence.events[1].to_s.should == "2008-10-05"
|
119
|
+
@recurrence.events[2].to_s.should == "2008-10-19"
|
120
|
+
@recurrence.events[3].to_s.should == "2008-11-02"
|
121
|
+
@recurrence.events[4].to_s.should == "2008-11-16"
|
122
|
+
@recurrence.events[5].to_s.should == "2008-11-30"
|
123
|
+
@recurrence.events[6].to_s.should == "2008-12-14"
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should occur several times per week" do
|
127
|
+
starts = Date.parse("2008-09-21") #=> sunday
|
128
|
+
@recurrence = recurrence(:every => :week, :on => [ :saturday, :sunday ], :interval => 2, :starts => starts, :until => "2009-01-01")
|
129
|
+
@recurrence.events[0].to_s.should == "2008-09-21"
|
130
|
+
@recurrence.events[1].to_s.should == "2008-09-27"
|
131
|
+
@recurrence.events[2].to_s.should == "2008-10-05"
|
132
|
+
@recurrence.events[3].to_s.should == "2008-10-11"
|
133
|
+
@recurrence.events[4].to_s.should == "2008-10-19"
|
134
|
+
@recurrence.events[5].to_s.should == "2008-10-25"
|
135
|
+
@recurrence.events[6].to_s.should == "2008-11-02"
|
136
|
+
@recurrence.events[7].to_s.should == "2008-11-08"
|
137
|
+
|
138
|
+
starts = Date.parse("2008-09-21") #=> sunday
|
139
|
+
@recurrence = recurrence(:every => :week, :on => [ :monday, :wednesday, :friday ], :starts => starts, :until => "2009-01-01")
|
140
|
+
@recurrence.events[0].to_s.should == "2008-09-22"
|
141
|
+
@recurrence.events[1].to_s.should == "2008-09-24"
|
142
|
+
@recurrence.events[2].to_s.should == "2008-09-26"
|
143
|
+
@recurrence.events[3].to_s.should == "2008-09-29"
|
144
|
+
@recurrence.events[4].to_s.should == "2008-10-01"
|
145
|
+
@recurrence.events[5].to_s.should == "2008-10-03"
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should run until next available saturday" do
|
149
|
+
starts = Date.parse("2008-09-21") # => sunday
|
150
|
+
@recurrence = recurrence(:every => :week, :on => :saturday, :starts => starts, :until => "2009-01-01")
|
151
|
+
@recurrence.events[0].to_s.should == "2008-09-27"
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context "with monthly recurring" do
|
156
|
+
context "using day" do
|
157
|
+
it "should recur until limit date" do
|
158
|
+
@recurrence = Recurrence.monthly(:on => 31)
|
159
|
+
@recurrence.events[-1].should == Date.parse("2037-12-31")
|
160
|
+
end
|
161
|
+
|
162
|
+
it "should repeat until 8 months from now" do
|
163
|
+
date = 8.months.from_now
|
164
|
+
@recurrence = recurrence(:every => :month, :on => date.day, :until => date.to_date)
|
165
|
+
@recurrence.events[-1].should == date.to_date
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should start 9 months ago" do
|
169
|
+
date = 9.months.ago
|
170
|
+
|
171
|
+
@recurrence = recurrence(:every => :month, :on => date.day, :starts => date.to_date)
|
172
|
+
@recurrence.events[0].should == date.to_date
|
173
|
+
end
|
174
|
+
|
175
|
+
it "should start at 2008-06-07 and repeat until 2008-11-07" do
|
176
|
+
starts = Date.parse("2008-06-07")
|
177
|
+
ends = Date.parse("2008-11-07")
|
178
|
+
|
179
|
+
@recurrence = recurrence(:every => :month, :on => starts.day, :starts => starts, :until => ends)
|
180
|
+
@recurrence.events[0].to_s.should == "2008-06-07"
|
181
|
+
@recurrence.events[-1].to_s.should == "2008-11-07"
|
182
|
+
end
|
183
|
+
|
184
|
+
it "should run until next available 27th" do
|
185
|
+
starts = Date.parse("2008-09-28")
|
186
|
+
|
187
|
+
@recurrence = recurrence(:every => :month, :on => 27, :starts => starts, :until => "2009-01-01")
|
188
|
+
@recurrence.events[0].to_s.should == "2008-10-27"
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should use interval" do
|
192
|
+
starts = Date.parse("2008-01-31")
|
193
|
+
@recurrence = recurrence(:every => :month, :on => 31, :interval => 2, :starts => starts, :until => "2010-01-01")
|
194
|
+
@recurrence.events[0].to_s.should == "2008-01-31"
|
195
|
+
@recurrence.events[1].to_s.should == "2008-03-31"
|
196
|
+
@recurrence.events[2].to_s.should == "2008-05-31"
|
197
|
+
@recurrence.events[3].to_s.should == "2008-07-31"
|
198
|
+
@recurrence.events[4].to_s.should == "2008-09-30"
|
199
|
+
@recurrence.events[5].to_s.should == "2008-11-30"
|
200
|
+
@recurrence.events[6].to_s.should == "2009-01-31"
|
201
|
+
|
202
|
+
starts = Date.parse("2008-01-31")
|
203
|
+
@recurrence = recurrence(:every => :month, :on => 29, :interval => 3, :starts => starts, :until => "2010-01-01")
|
204
|
+
@recurrence.events[0].to_s.should == "2008-04-29"
|
205
|
+
@recurrence.events[1].to_s.should == "2008-07-29"
|
206
|
+
@recurrence.events[2].to_s.should == "2008-10-29"
|
207
|
+
@recurrence.events[3].to_s.should == "2009-01-29"
|
208
|
+
@recurrence.events[4].to_s.should == "2009-04-29"
|
209
|
+
@recurrence.events[5].to_s.should == "2009-07-29"
|
210
|
+
|
211
|
+
starts = Date.parse("2008-02-29")
|
212
|
+
@recurrence = recurrence(:every => :month, :on => 31, :interval => 4, :starts => starts, :until => "2010-01-01")
|
213
|
+
@recurrence.events[0].to_s.should == "2008-02-29"
|
214
|
+
@recurrence.events[1].to_s.should == "2008-06-30"
|
215
|
+
@recurrence.events[2].to_s.should == "2008-10-31"
|
216
|
+
@recurrence.events[3].to_s.should == "2009-02-28"
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
context "using weekday" do
|
221
|
+
it "should recur until limit date" do
|
222
|
+
@recurrence = Recurrence.daily(:on => 5, :weekday => :thursday)
|
223
|
+
@recurrence.events[-1].should == Date.parse("2037-12-31")
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should repeat until 8 months from now" do
|
227
|
+
date = 8.months.from_now
|
228
|
+
week = (date.day - 1) / 7 + 1
|
229
|
+
@recurrence = recurrence(:every => :month, :on => week, :weekday => date.wday, :until => date.to_date)
|
230
|
+
@recurrence.events[-1].should == date.to_date
|
231
|
+
end
|
232
|
+
|
233
|
+
it "should start 9 months ago" do
|
234
|
+
date = 9.months.ago
|
235
|
+
week = (date.day - 1) / 7 + 1
|
236
|
+
@recurrence = recurrence(:every => :month, :on => week, :weekday => date.wday, :starts => date.to_date)
|
237
|
+
@recurrence.events[0].should == date.to_date
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should start at 2008-06-07 and repeat until 2008-11-01 (first saturday)" do
|
241
|
+
starts = Date.parse("2008-06-07")
|
242
|
+
ends = Date.parse("2008-11-01")
|
243
|
+
|
244
|
+
@recurrence = recurrence(:every => :month, :on => :first, :weekday => :saturday, :starts => starts, :until => ends)
|
245
|
+
@recurrence.events[0].to_s.should == "2008-06-07"
|
246
|
+
@recurrence.events[-1].to_s.should == "2008-11-01"
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should start at 2008-06-29 and repeat until 2008-11-30 (last sunday)" do
|
250
|
+
starts = Date.parse("2008-06-29")
|
251
|
+
ends = Date.parse("2008-11-30")
|
252
|
+
|
253
|
+
@recurrence = recurrence(:every => :month, :on => :last, :weekday => :sunday, :starts => starts, :until => ends)
|
254
|
+
@recurrence.events[0].to_s.should == "2008-06-29"
|
255
|
+
@recurrence.events[-1].to_s.should == "2008-11-30"
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should use interval" do
|
259
|
+
starts = Date.parse("2009-01-01")
|
260
|
+
@recurrence = recurrence(:every => :month, :on => :third, :weekday => :sunday, :interval => 2, :starts => starts, :until => "2010-02-01")
|
261
|
+
@recurrence.events[0].to_s.should == "2009-01-18"
|
262
|
+
@recurrence.events[1].to_s.should == "2009-03-15"
|
263
|
+
@recurrence.events[2].to_s.should == "2009-05-17"
|
264
|
+
@recurrence.events[3].to_s.should == "2009-07-19"
|
265
|
+
@recurrence.events[4].to_s.should == "2009-09-20"
|
266
|
+
@recurrence.events[5].to_s.should == "2009-11-15"
|
267
|
+
@recurrence.events[6].to_s.should == "2010-01-17"
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
context "using interval" do
|
272
|
+
before(:each) do
|
273
|
+
@starts = Date.parse("2008-09-03")
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should use numeric interval" do
|
277
|
+
@recurrence = recurrence(:every => :month, :on => 21, :interval => 2, :starts => @starts)
|
278
|
+
@recurrence.events[0].to_s.should == "2008-09-21"
|
279
|
+
@recurrence.events[1].to_s.should == "2008-11-21"
|
280
|
+
@recurrence.events[2].to_s.should == "2009-01-21"
|
281
|
+
@recurrence.events[3].to_s.should == "2009-03-21"
|
282
|
+
end
|
283
|
+
|
284
|
+
it "should accept monthly symbol" do
|
285
|
+
@recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :monthly)
|
286
|
+
@recurrence.events[0].to_s.should == "2008-09-10"
|
287
|
+
@recurrence.events[1].to_s.should == "2008-10-10"
|
288
|
+
end
|
289
|
+
|
290
|
+
it "should accept bimonthly symbol" do
|
291
|
+
@recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :bimonthly)
|
292
|
+
@recurrence.events[0].to_s.should == "2008-09-10"
|
293
|
+
@recurrence.events[1].to_s.should == "2008-11-10"
|
294
|
+
end
|
295
|
+
|
296
|
+
it "should accept quarterly symbol" do
|
297
|
+
@recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :quarterly)
|
298
|
+
@recurrence.events[0].to_s.should == "2008-09-10"
|
299
|
+
@recurrence.events[1].to_s.should == "2008-12-10"
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should accept semesterly symbol" do
|
303
|
+
@recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :semesterly)
|
304
|
+
@recurrence.events[0].to_s.should == "2008-09-10"
|
305
|
+
@recurrence.events[1].to_s.should == "2009-03-10"
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
describe "with yearly recurring" do
|
311
|
+
it "should recur until limit date" do
|
312
|
+
@recurrence = Recurrence.yearly(:on => [12,31])
|
313
|
+
@recurrence.events[-1].should == Date.parse("2037-12-31")
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should repeat until 7 years from now" do
|
317
|
+
date = 7.years.from_now
|
318
|
+
@recurrence = recurrence(:every => :year, :on => [date.month, date.day], :until => date.to_date)
|
319
|
+
@recurrence.events[-1].should == date.to_date
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should start 2 years ago" do
|
323
|
+
date = 2.years.ago
|
324
|
+
@recurrence = recurrence(:every => :year, :on => [date.month, date.day], :starts => date.to_date)
|
325
|
+
@recurrence.events[0].should == date.to_date
|
326
|
+
end
|
327
|
+
|
328
|
+
it "should start at 2003-06-07 and repeat until 2018-06-07" do
|
329
|
+
starts = Date.parse("2003-06-07")
|
330
|
+
ends = Date.parse("2018-06-07")
|
331
|
+
|
332
|
+
@recurrence = recurrence(:every => :year, :on => [starts.month, starts.day], :starts => starts, :until => ends)
|
333
|
+
@recurrence.events[0].to_s.should == "2003-06-07"
|
334
|
+
@recurrence.events[-1].to_s.should == "2018-06-07"
|
335
|
+
end
|
336
|
+
|
337
|
+
it "should use interval" do
|
338
|
+
starts = Date.parse("2008-09-21")
|
339
|
+
|
340
|
+
@recurrence = recurrence(:every => :year, :on => [starts.month, starts.day], :interval => 2, :starts => starts)
|
341
|
+
@recurrence.events[0].to_s.should == "2008-09-21"
|
342
|
+
@recurrence.events[1].to_s.should == "2010-09-21"
|
343
|
+
@recurrence.events[2].to_s.should == "2012-09-21"
|
344
|
+
@recurrence.events[3].to_s.should == "2014-09-21"
|
345
|
+
end
|
346
|
+
|
347
|
+
it "should run until next available date when chosen settings are greater than start date" do
|
348
|
+
starts = Date.parse("2008-09-03")
|
349
|
+
|
350
|
+
@recurrence = recurrence(:every => :year, :on => [10, 27], :starts => starts)
|
351
|
+
@recurrence.events[0].to_s.should == "2008-10-27"
|
352
|
+
end
|
353
|
+
|
354
|
+
it "should run until next available date when chosen settings are smaller than start date" do
|
355
|
+
starts = Date.parse("2008-09-03")
|
356
|
+
@recurrence = recurrence(:every => :year, :on => [7, 1], :starts => starts)
|
357
|
+
@recurrence.events[0].to_s.should == "2009-07-01"
|
358
|
+
|
359
|
+
starts = Date.parse("2008-09-03")
|
360
|
+
@recurrence = recurrence(:every => :year, :on => [9, 1], :starts => starts)
|
361
|
+
@recurrence.events[0].to_s.should == "2009-09-01"
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
describe "#include?" do
|
366
|
+
it "should include date (day)" do
|
367
|
+
@recurrence = recurrence(:every => :day, :starts => "2008-09-30")
|
368
|
+
@recurrence.include?("2008-09-30").should be_true
|
369
|
+
@recurrence.include?("2008-10-01").should be_true
|
370
|
+
end
|
371
|
+
|
372
|
+
it "should include date (week)" do
|
373
|
+
@recurrence = recurrence(:every => :week, :on => :thursday, :starts => "2008-09-30")
|
374
|
+
@recurrence.include?("2008-09-30").should be_false
|
375
|
+
@recurrence.include?("2008-10-02").should be_true
|
376
|
+
|
377
|
+
@recurrence = recurrence(:every => :week, :on => :monday, :starts => "2008-09-29")
|
378
|
+
@recurrence.include?("2008-09-29").should be_true
|
379
|
+
@recurrence.include?("2008-10-06").should be_true
|
380
|
+
end
|
381
|
+
|
382
|
+
it "should include date (month)" do
|
383
|
+
@recurrence = recurrence(:every => :month, :on => 10, :starts => "2008-09-30")
|
384
|
+
@recurrence.include?("2008-09-30").should be_false
|
385
|
+
@recurrence.include?("2008-10-10").should be_true
|
386
|
+
|
387
|
+
@recurrence = recurrence(:every => :month, :on => 10, :starts => "2008-09-10")
|
388
|
+
@recurrence.include?("2008-09-10").should be_true
|
389
|
+
@recurrence.include?("2008-10-10").should be_true
|
390
|
+
end
|
391
|
+
|
392
|
+
it "should include date (year)" do
|
393
|
+
@recurrence = recurrence(:every => :year, :on => [6,28], :starts => "2008-09-30")
|
394
|
+
@recurrence.include?("2009-09-30").should be_false
|
395
|
+
@recurrence.include?("2009-06-28").should be_true
|
396
|
+
|
397
|
+
@recurrence = recurrence(:every => :year, :on => [6,28], :starts => "2008-06-28")
|
398
|
+
@recurrence.include?("2009-06-28").should be_true
|
399
|
+
@recurrence.include?("2009-06-28").should be_true
|
400
|
+
end
|
401
|
+
|
402
|
+
it "should not include date when is smaller than starting date (day)" do
|
403
|
+
@recurrence = recurrence(:every => :day, :starts => "2008-09-30")
|
404
|
+
@recurrence.include?("2008-09-29").should be_false
|
405
|
+
end
|
406
|
+
|
407
|
+
it "should not include date when is smaller than starting date (week)" do
|
408
|
+
@recurrence = recurrence(:every => :week, :on => :friday, :starts => "2008-09-30")
|
409
|
+
@recurrence.include?("2008-09-24").should be_false
|
410
|
+
end
|
411
|
+
|
412
|
+
it "should not include date when is smaller than starting date (month)" do
|
413
|
+
@recurrence = recurrence(:every => :month, :on => 10, :starts => "2008-09-30")
|
414
|
+
@recurrence.include?("2008-09-10").should be_false
|
415
|
+
end
|
416
|
+
|
417
|
+
it "should not include date when is smaller than starting date (year)" do
|
418
|
+
@recurrence = recurrence(:every => :year, :on => [6,28], :starts => "2008-09-30")
|
419
|
+
@recurrence.include?("2008-06-28").should be_false
|
420
|
+
end
|
421
|
+
|
422
|
+
it "should not include date when is greater than ending date (day)" do
|
423
|
+
@recurrence = recurrence(:every => :day, :until => "2008-09-30")
|
424
|
+
@recurrence.include?("2008-10-01").should be_false
|
425
|
+
end
|
426
|
+
|
427
|
+
it "should not include date when is greater than ending date (week)" do
|
428
|
+
@recurrence = recurrence(:every => :week, :on => :friday, :until => "2008-09-30")
|
429
|
+
@recurrence.include?("2008-10-03").should be_false
|
430
|
+
end
|
431
|
+
|
432
|
+
it "should not include date when is greater than ending date (year)" do
|
433
|
+
@recurrence = recurrence(:every => :year, :on => [6,28], :until => "2008-09-30")
|
434
|
+
@recurrence.include?("2009-06-28").should be_false
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
describe "#next" do
|
439
|
+
it "should return next date" do
|
440
|
+
@recurrence = recurrence(:every => :day)
|
441
|
+
|
442
|
+
@recurrence.next.to_s.should == Date.today.to_s
|
443
|
+
@recurrence.next.to_s.should == Date.today.to_s
|
444
|
+
end
|
445
|
+
|
446
|
+
it "should return next! date" do
|
447
|
+
@recurrence = recurrence(:every => :day)
|
448
|
+
|
449
|
+
@recurrence.next!.to_s.should == Date.today.to_s
|
450
|
+
@recurrence.next!.to_s.should == 1.day.from_now.to_date.to_s
|
451
|
+
@recurrence.next!.to_s.should == 2.days.from_now.to_date.to_s
|
452
|
+
@recurrence.next!.to_s.should == 3.days.from_now.to_date.to_s
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
describe "#reset!" do
|
457
|
+
it "should reset to the first available date" do
|
458
|
+
@recurrence = recurrence(:every => :year, :on => [2, 31], :starts => "2008-01-01")
|
459
|
+
@recurrence.next!.to_s.should == "2008-02-29"
|
460
|
+
@recurrence.next!.to_s.should == "2009-02-28"
|
461
|
+
@recurrence.reset!
|
462
|
+
@recurrence.next.to_s.should == "2008-02-29"
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|
466
|
+
describe "event initialization" do
|
467
|
+
it "should return the first available date" do
|
468
|
+
@recurrence = recurrence(:every => :year, :on => [2, 31], :starts => "2008-01-01")
|
469
|
+
@recurrence.next!.to_s.should == "2008-02-29"
|
470
|
+
@recurrence.next!.to_s.should == "2009-02-28"
|
471
|
+
@recurrence.next!.to_s.should == "2010-02-28"
|
472
|
+
@recurrence.next!.to_s.should == "2011-02-28"
|
473
|
+
@recurrence.next!.to_s.should == "2012-02-29"
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
context "when generating events" do
|
478
|
+
before(:each) do
|
479
|
+
@recurrence = recurrence(:every => :day, :starts => "2009-01-06", :until => "2009-01-15")
|
480
|
+
end
|
481
|
+
|
482
|
+
it "should return starting and ending recurrences" do
|
483
|
+
@recurrence.events[0].to_s.should == "2009-01-06"
|
484
|
+
@recurrence.events[-1].to_s.should == "2009-01-15"
|
485
|
+
end
|
486
|
+
|
487
|
+
it "should reset cache" do
|
488
|
+
@recurrence.event.should_receive(:reset!).exactly(3).times
|
489
|
+
@recurrence.events(:starts => "2009-01-11")
|
490
|
+
@recurrence.events(:until => "2009-01-14")
|
491
|
+
@recurrence.events(:starts => "2009-01-11", :until => "2009-01-14")
|
492
|
+
end
|
493
|
+
|
494
|
+
it "should return only events greater than starting date" do
|
495
|
+
@events = @recurrence.events(:starts => "2009-01-10")
|
496
|
+
@events[0].to_s.should == "2009-01-10"
|
497
|
+
end
|
498
|
+
|
499
|
+
it "should return only events smaller than until date" do
|
500
|
+
@events = @recurrence.events(:until => "2009-01-10")
|
501
|
+
@events[0].to_s.should == "2009-01-06"
|
502
|
+
@events[-1].to_s.should == "2009-01-10"
|
503
|
+
end
|
504
|
+
|
505
|
+
it "should return only events between starting and until date" do
|
506
|
+
@events = @recurrence.events(:starts => "2009-01-12", :until => "2009-01-14")
|
507
|
+
@events[0].to_s.should == "2009-01-12"
|
508
|
+
@events[-1].to_s.should == "2009-01-14"
|
509
|
+
end
|
510
|
+
|
511
|
+
it "should not iterate all dates when using until" do
|
512
|
+
@events = @recurrence.events(:starts => "2009-01-06", :until => "2009-01-08")
|
513
|
+
@recurrence.instance_variable_get("@events").size.should == 3
|
514
|
+
@events.size.should == 3
|
515
|
+
@events[-1].to_s.should == "2009-01-08"
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
private
|
520
|
+
def recurrence(options)
|
521
|
+
Recurrence.new(options)
|
522
|
+
end
|
523
|
+
end
|