recurrence 1.2.0 → 1.3.0
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.
- checksums.yaml +7 -0
- data/.rspec +1 -1
- data/.travis.yml +5 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +31 -17
- data/License.txt +2 -2
- data/README.md +151 -0
- data/Rakefile +0 -6
- data/lib/recurrence/event/base.rb +1 -0
- data/lib/recurrence/event/monthly.rb +3 -3
- data/lib/recurrence/namespace.rb +32 -17
- data/lib/recurrence/version.rb +1 -1
- data/recurrence.gemspec +4 -6
- data/spec/recurrence_spec.rb +444 -272
- data/spec/spec_helper.rb +1 -0
- metadata +42 -39
- data/.rvmrc +0 -1
- data/History.txt +0 -83
- data/README.rdoc +0 -136
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b5dcd970513024fef80a9774f83b32e51aad12a3
|
4
|
+
data.tar.gz: 6c4258d978897be59e86f14c40def4e838f71f3f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9ad289eaf1aa4e7e96c9699347229e2b93cff83ac561a64b1638537dfb5fdfa2a24b6e0a2e9747c65a5df1cc02f093996068c20f795a1350b3409d9c7505098c
|
7
|
+
data.tar.gz: c339f2f8e64b880483e162181101c8eedd5bf2dc36beec288138c618c90d8743b82a169e4f68a085f53a61667d5a25a6f73e49df58494b1929142df0ab535b34
|
data/.rspec
CHANGED
@@ -1 +1 @@
|
|
1
|
-
--color
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,30 +1,44 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
recurrence (1.
|
5
|
-
activesupport
|
4
|
+
recurrence (1.3.0)
|
5
|
+
activesupport
|
6
6
|
i18n
|
7
7
|
|
8
8
|
GEM
|
9
|
-
remote:
|
9
|
+
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
|
-
activesupport (
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
rspec
|
11
|
+
activesupport (4.1.0)
|
12
|
+
i18n (~> 0.6, >= 0.6.9)
|
13
|
+
json (~> 1.7, >= 1.7.7)
|
14
|
+
minitest (~> 5.1)
|
15
|
+
thread_safe (~> 0.1)
|
16
|
+
tzinfo (~> 1.1)
|
17
|
+
diff-lcs (1.2.5)
|
18
|
+
i18n (0.6.9)
|
19
|
+
json (1.8.1)
|
20
|
+
minitest (5.3.3)
|
21
|
+
rake (10.3.1)
|
22
|
+
rspec (3.0.0.beta2)
|
23
|
+
rspec-core (= 3.0.0.beta2)
|
24
|
+
rspec-expectations (= 3.0.0.beta2)
|
25
|
+
rspec-mocks (= 3.0.0.beta2)
|
26
|
+
rspec-core (3.0.0.beta2)
|
27
|
+
rspec-support (= 3.0.0.beta2)
|
28
|
+
rspec-expectations (3.0.0.beta2)
|
29
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
30
|
+
rspec-support (= 3.0.0.beta2)
|
31
|
+
rspec-mocks (3.0.0.beta2)
|
32
|
+
rspec-support (= 3.0.0.beta2)
|
33
|
+
rspec-support (3.0.0.beta2)
|
34
|
+
thread_safe (0.3.3)
|
35
|
+
tzinfo (1.1.0)
|
36
|
+
thread_safe (~> 0.1)
|
23
37
|
|
24
38
|
PLATFORMS
|
25
39
|
ruby
|
26
40
|
|
27
41
|
DEPENDENCIES
|
28
|
-
rake
|
42
|
+
rake
|
29
43
|
recurrence!
|
30
|
-
rspec (
|
44
|
+
rspec (= 3.0.0.beta2)
|
data/License.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2008 Nando Vieira
|
1
|
+
Copyright (c) 2008-2014 Nando Vieira
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
@@ -17,4 +17,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
17
17
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
18
|
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
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.
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
# Recurrence
|
2
|
+
|
3
|
+
A simple library to handle recurring events.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
gem install recurrence
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
require "rubygems"
|
13
|
+
require "recurrence"
|
14
|
+
|
15
|
+
# Daily
|
16
|
+
r = Recurrence.new(:every => :day)
|
17
|
+
r = Recurrence.new(:every => :day, :interval => 9)
|
18
|
+
r = Recurrence.new(:every => :day, :repeat => 7)
|
19
|
+
r = Recurrence.daily(options = {})
|
20
|
+
|
21
|
+
# Weekly
|
22
|
+
r = Recurrence.new(:every => :week, :on => 5)
|
23
|
+
r = Recurrence.new(:every => :week, :on => :monday)
|
24
|
+
r = Recurrence.new(:every => :week, :on => [:monday, :friday])
|
25
|
+
r = Recurrence.new(:every => :week, :on => [:monday, :wednesday, :friday])
|
26
|
+
r = Recurrence.new(:every => :week, :on => :friday, :interval => 2)
|
27
|
+
r = Recurrence.new(:every => :week, :on => :friday, :repeat => 4)
|
28
|
+
r = Recurrence.weekly(:on => :thursday)
|
29
|
+
|
30
|
+
# Monthly by month day
|
31
|
+
r = Recurrence.new(:every => :month, :on => 15)
|
32
|
+
r = Recurrence.new(:every => :month, :on => 31)
|
33
|
+
r = Recurrence.new(:every => :month, :on => 7, :interval => 2)
|
34
|
+
r = Recurrence.new(:every => :month, :on => 7, :interval => :monthly)
|
35
|
+
r = Recurrence.new(:every => :month, :on => 7, :interval => :bimonthly)
|
36
|
+
r = Recurrence.new(:every => :month, :on => 7, :repeat => 6)
|
37
|
+
r = Recurrence.monthly(:on => 31)
|
38
|
+
|
39
|
+
# Monthly by week day
|
40
|
+
r = Recurrence.new(:every => :month, :on => :first, :weekday => :sunday)
|
41
|
+
r = Recurrence.new(:every => :month, :on => :third, :weekday => :monday)
|
42
|
+
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday)
|
43
|
+
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => 2)
|
44
|
+
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :quarterly)
|
45
|
+
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :semesterly)
|
46
|
+
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :repeat => 3)
|
47
|
+
|
48
|
+
# Yearly
|
49
|
+
r = Recurrence.new(:every => :year, :on => [7, 4]) # => [month, day]
|
50
|
+
r = Recurrence.new(:every => :year, :on => [10, 31], :interval => 3)
|
51
|
+
r = Recurrence.new(:every => :year, :on => [:jan, 31])
|
52
|
+
r = Recurrence.new(:every => :year, :on => [:january, 31])
|
53
|
+
r = Recurrence.new(:every => :year, :on => [10, 31], :repeat => 3)
|
54
|
+
r = Recurrence.yearly(:on => [:january, 31])
|
55
|
+
|
56
|
+
# Limit recurrence
|
57
|
+
# :starts defaults to Date.today
|
58
|
+
# :until defaults to 2037-12-31
|
59
|
+
r = Recurrence.new(:every => :day, :starts => Date.today)
|
60
|
+
r = Recurrence.new(:every => :day, :until => '2010-01-31')
|
61
|
+
r = Recurrence.new(:every => :day, :starts => Date.today, :until => '2010-01-31')
|
62
|
+
|
63
|
+
# Generate a collection of events which always includes a final event with the given through date
|
64
|
+
# :through defaults to being unset
|
65
|
+
r = Recurrence.new(:every => :day, :through => '2010-01-31')
|
66
|
+
r = Recurrence.new(:every => :day, :starts => Date.today, :through => '2010-01-31')
|
67
|
+
|
68
|
+
# Remove a date in the series on the given except date(s)
|
69
|
+
# :except defaults to being unset
|
70
|
+
r = Recurrence.new(:every => :day, :except => '2010-01-31')
|
71
|
+
r = Recurrence.new(:every => :day, :except => [Date.today, '2010-01-31'])
|
72
|
+
|
73
|
+
# Override the next date handler
|
74
|
+
r = Recurrence.new(:every => :month, :on => 1, :handler => Proc.new { |day, month, year| raise("Date not allowed!") if year == 2011 && month == 12 && day == 31 })
|
75
|
+
|
76
|
+
# Shift the recurrences to maintain dates around boundaries (Jan 31 -> Feb 28 -> Mar 28)
|
77
|
+
r = Recurrence.new(:every => :month, :on => 31, :shift => true)
|
78
|
+
|
79
|
+
# Getting an array with all events
|
80
|
+
r.events.each {|date| puts date.to_s } # => Memoized array
|
81
|
+
r.events!.each {|date| puts date.to_s } # => reset items cache and re-execute it
|
82
|
+
r.events(:starts => '2009-01-01').each {|date| puts date.to_s }
|
83
|
+
r.events(:until => '2009-01-10').each {|date| puts date.to_s }
|
84
|
+
r.events(:through => '2009-01-10').each {|date| puts date.to_s }
|
85
|
+
r.events(:starts => '2009-01-05', :until => '2009-01-10').each {|date| puts date.to_s }
|
86
|
+
|
87
|
+
# Iterating events
|
88
|
+
r.each { |date| puts date.to_s } # => Use items method
|
89
|
+
r.each! { |date| puts date.to_s } # => Use items! method
|
90
|
+
|
91
|
+
# Check if a date is included
|
92
|
+
r.include?(Date.today) # => true or false
|
93
|
+
r.include?('2008-09-21')
|
94
|
+
|
95
|
+
# Get next available date
|
96
|
+
r.next # => Keep the original date object
|
97
|
+
r.next! # => Change the internal date object to the next available date
|
98
|
+
```
|
99
|
+
|
100
|
+
## Troubleshooting
|
101
|
+
|
102
|
+
If you're having problems because already have a class/module called Recurrence that is conflicting with this gem, you can require the namespace and create a class that inherits from `SimplesIdeias::Recurrence`.
|
103
|
+
|
104
|
+
```ruby
|
105
|
+
require "recurrence/namespace"
|
106
|
+
|
107
|
+
class RecurrentEvent < SimplesIdeias::Recurrence
|
108
|
+
end
|
109
|
+
|
110
|
+
r = RecurrentEvent.new(:every => :day)
|
111
|
+
```
|
112
|
+
|
113
|
+
If you're using Rails/Bundler or something like that, remember to override the `:require` option.
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
# Gemfile
|
117
|
+
source "https://rubygems.org"
|
118
|
+
|
119
|
+
gem "recurrence", :require => "recurrence/namespace"
|
120
|
+
```
|
121
|
+
|
122
|
+
## Maintainer
|
123
|
+
|
124
|
+
* Nando Vieira (http://nandovieira.com.br)
|
125
|
+
|
126
|
+
## Contributors
|
127
|
+
|
128
|
+
* https://github.com/fnando/recurrence/graphs/contributors
|
129
|
+
|
130
|
+
## License
|
131
|
+
|
132
|
+
(The MIT License)
|
133
|
+
|
134
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
135
|
+
a copy of this software and associated documentation files (the
|
136
|
+
'Software'), to deal in the Software without restriction, including
|
137
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
138
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
139
|
+
permit persons to whom the Software is furnished to do so, subject to
|
140
|
+
the following conditions:
|
141
|
+
|
142
|
+
The above copyright notice and this permission notice shall be
|
143
|
+
included in all copies or substantial portions of the Software.
|
144
|
+
|
145
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
146
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
147
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
148
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
149
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
150
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
151
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -3,9 +3,3 @@ Bundler::GemHelper.install_tasks
|
|
3
3
|
|
4
4
|
require "rspec/core/rake_task"
|
5
5
|
RSpec::Core::RakeTask.new
|
6
|
-
|
7
|
-
require "rdoc/task"
|
8
|
-
Rake::RDocTask.new do |rd|
|
9
|
-
rd.main = "README.rdoc"
|
10
|
-
rd.rdoc_files.include("README.rdoc", "lib/**/*.rb", "History.txt", "License.txt")
|
11
|
-
end
|
@@ -57,7 +57,7 @@ module SimplesIdeias
|
|
57
57
|
# Have a raw month from 0 to 11 interval
|
58
58
|
raw_month = date.month + interval - 1
|
59
59
|
|
60
|
-
next_year = date.year + raw_month
|
60
|
+
next_year = date.year + raw_month.div(12)
|
61
61
|
next_month = (raw_month % 12) + 1 # change back to ruby interval
|
62
62
|
|
63
63
|
@options[:handler].call(@options[:on], next_month, next_year)
|
@@ -65,7 +65,7 @@ module SimplesIdeias
|
|
65
65
|
|
66
66
|
def advance_to_month_by_weekday(date, interval=@options[:interval])
|
67
67
|
raw_month = date.month + interval - 1
|
68
|
-
next_year = date.year + raw_month
|
68
|
+
next_year = date.year + raw_month.div(12)
|
69
69
|
next_month = (raw_month % 12) + 1 # change back to ruby interval
|
70
70
|
date = Date.new(next_year, next_month, 1)
|
71
71
|
|
@@ -79,7 +79,7 @@ module SimplesIdeias
|
|
79
79
|
|
80
80
|
# Go to the previous month if we lost it
|
81
81
|
if date.month != month
|
82
|
-
weeks = (date.day - 1)
|
82
|
+
weeks = (date.day - 1).div(7) + 1
|
83
83
|
date -= weeks * 7
|
84
84
|
end
|
85
85
|
|
data/lib/recurrence/namespace.rb
CHANGED
@@ -71,6 +71,7 @@ module SimplesIdeias
|
|
71
71
|
# Recurrence.daily(:starts => 3.days.from_now)
|
72
72
|
# Recurrence.daily(:until => 10.days.from_now)
|
73
73
|
# Recurrence.daily(:repeat => 5)
|
74
|
+
# Recurrence.daily(:except => Date.tomorrow)
|
74
75
|
#
|
75
76
|
def self.daily(options = {})
|
76
77
|
options[:every] = :day
|
@@ -139,24 +140,16 @@ module SimplesIdeias
|
|
139
140
|
# Recurrence.new(:every => :year, :on => [:jan, 14])
|
140
141
|
#
|
141
142
|
def initialize(options)
|
142
|
-
|
143
|
-
|
143
|
+
validate_initialize_options(options)
|
144
|
+
|
145
|
+
options[:except] = [options[:except]].flatten.map {|d| as_date(d)} if options[:except]
|
144
146
|
|
145
147
|
@options = options
|
146
148
|
@_options = initialize_dates(options.dup)
|
147
149
|
@_options[:interval] ||= 1
|
148
150
|
@_options[:handler] ||= Handler::FallBack
|
149
151
|
|
150
|
-
@event =
|
151
|
-
when :day
|
152
|
-
Event::Daily.new(@_options)
|
153
|
-
when :week
|
154
|
-
Event::Weekly.new(@_options)
|
155
|
-
when :month
|
156
|
-
Event::Monthly.new(@_options)
|
157
|
-
when :year
|
158
|
-
Event::Yearly.new(@_options)
|
159
|
-
end
|
152
|
+
@event = initialize_event(@_options[:every])
|
160
153
|
end
|
161
154
|
|
162
155
|
# Reset the recurrence cache, returning to the first available date.
|
@@ -221,12 +214,14 @@ module SimplesIdeias
|
|
221
214
|
# [5] Sat, 20 Nov 2010
|
222
215
|
# ]
|
223
216
|
#
|
224
|
-
def events(options={})
|
217
|
+
def events(options = {})
|
225
218
|
options[:starts] = as_date(options[:starts])
|
226
219
|
options[:until] = as_date(options[:until])
|
220
|
+
options[:through] = as_date(options[:through])
|
227
221
|
options[:repeat] ||= @options[:repeat]
|
222
|
+
options[:except] ||= @options[:except]
|
228
223
|
|
229
|
-
reset! if options[:starts] || options[:until]
|
224
|
+
reset! if options[:starts] || options[:until] || options[:through]
|
230
225
|
|
231
226
|
@events ||= Array.new.tap do |list|
|
232
227
|
loop do
|
@@ -236,12 +231,14 @@ module SimplesIdeias
|
|
236
231
|
|
237
232
|
valid_start = options[:starts].nil? || date >= options[:starts]
|
238
233
|
valid_until = options[:until].nil? || date <= options[:until]
|
239
|
-
|
234
|
+
valid_except = options[:except].nil? || !options[:except].include?(date)
|
235
|
+
list << date if valid_start && valid_until && valid_except
|
240
236
|
|
241
237
|
stop_repeat = options[:repeat] && list.size == options[:repeat]
|
242
238
|
stop_until = options[:until] && options[:until] <= date
|
239
|
+
stop_through = options[:through] && options[:through] <= date
|
243
240
|
|
244
|
-
break if stop_until || stop_repeat
|
241
|
+
break if stop_until || stop_repeat || stop_through
|
245
242
|
end
|
246
243
|
end
|
247
244
|
end
|
@@ -281,8 +278,26 @@ module SimplesIdeias
|
|
281
278
|
end
|
282
279
|
|
283
280
|
private
|
281
|
+
def validate_initialize_options(options)
|
282
|
+
raise ArgumentError, ":every option is required" unless options.key?(:every)
|
283
|
+
raise ArgumentError, ":every option is invalid" unless FREQUENCY.include?(options[:every].to_s)
|
284
|
+
end
|
285
|
+
|
286
|
+
def initialize_event(type)
|
287
|
+
case type.to_sym
|
288
|
+
when :day
|
289
|
+
Event::Daily.new(@_options)
|
290
|
+
when :week
|
291
|
+
Event::Weekly.new(@_options)
|
292
|
+
when :month
|
293
|
+
Event::Monthly.new(@_options)
|
294
|
+
when :year
|
295
|
+
Event::Yearly.new(@_options)
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
284
299
|
def initialize_dates(options) # :nodoc:
|
285
|
-
[:starts, :until].each do |name|
|
300
|
+
[:starts, :until, :through].each do |name|
|
286
301
|
options[name] = as_date(options[name])
|
287
302
|
end
|
288
303
|
|
data/lib/recurrence/version.rb
CHANGED
data/recurrence.gemspec
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
|
2
|
-
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require 'recurrence/version'
|
1
|
+
require "./lib/recurrence/version"
|
4
2
|
|
5
3
|
Gem::Specification.new do |s|
|
6
4
|
s.name = "recurrence"
|
@@ -17,8 +15,8 @@ Gem::Specification.new do |s|
|
|
17
15
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
16
|
s.require_paths = ["lib"]
|
19
17
|
|
20
|
-
s.add_dependency "activesupport"
|
18
|
+
s.add_dependency "activesupport"
|
21
19
|
s.add_dependency "i18n"
|
22
|
-
s.add_development_dependency "rspec", "
|
23
|
-
s.add_development_dependency "rake"
|
20
|
+
s.add_development_dependency "rspec", "3.0.0.beta2"
|
21
|
+
s.add_development_dependency "rake"
|
24
22
|
end
|
data/spec/recurrence_spec.rb
CHANGED
@@ -3,64 +3,64 @@ require "spec_helper"
|
|
3
3
|
describe Recurrence do
|
4
4
|
let(:enumerator_constant){ RUBY_VERSION > "1.9.0" ? Enumerator : Enumerable::Enumerator }
|
5
5
|
|
6
|
-
it "
|
6
|
+
it "requires :every option" do
|
7
7
|
expect { recurrence({}) }.to raise_error(ArgumentError)
|
8
8
|
end
|
9
9
|
|
10
|
-
it "
|
10
|
+
it "requires valid :every option" do
|
11
11
|
expect { recurrence(:every => "invalid") }.to raise_error(ArgumentError)
|
12
12
|
end
|
13
13
|
|
14
|
-
it "
|
14
|
+
it "requires :interval to be greater than zero when provided" do
|
15
15
|
expect { recurrence(:every => :day, :interval => 0) }.to raise_error(ArgumentError)
|
16
16
|
end
|
17
17
|
|
18
|
-
it "
|
18
|
+
it "requires :repeat to be greater than zero when provided" do
|
19
19
|
expect { recurrence(:every => :day, :repeat => 0) }.to raise_error(ArgumentError)
|
20
20
|
end
|
21
21
|
|
22
|
-
it "
|
23
|
-
recurrence(:every => :day).each.
|
22
|
+
it "returns an enumerator when Recurrence#each is called without a block" do
|
23
|
+
expect(recurrence(:every => :day).each).to be_instance_of(enumerator_constant)
|
24
24
|
end
|
25
25
|
|
26
|
-
it "
|
27
|
-
recurrence(:every => :day).each
|
26
|
+
it "returns an enumerator when Recurrence#each! is called without a block" do
|
27
|
+
expect(recurrence(:every => :day).each!).to be_instance_of(enumerator_constant)
|
28
28
|
end
|
29
29
|
|
30
30
|
Recurrence::Event::Monthly::INTERVALS.each do |interval|
|
31
|
-
it "
|
31
|
+
it "accepts valid :interval symbol for monthly recurrence (#{interval[0]})" do
|
32
32
|
expect {
|
33
33
|
recurrence(:every => :month, :on => 10, :interval => interval[0])
|
34
|
-
}.to_not raise_error
|
34
|
+
}.to_not raise_error
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
Recurrence::Event::Yearly::MONTHS.each do |month_name, month_number|
|
39
|
-
it "
|
39
|
+
it "accepts month as symbol for yearly recurrence (#{month_name})" do
|
40
40
|
expect {
|
41
41
|
recurrence(:every => :year, :on => [month_name, 10])
|
42
|
-
}.to_not raise_error
|
42
|
+
}.to_not raise_error
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
it "
|
46
|
+
it "requires month to be a valid symbol for yearly recurrence" do
|
47
47
|
expect {
|
48
48
|
recurrence(:every => :year, :on => [:invalid, 10])
|
49
49
|
}.to raise_error(ArgumentError)
|
50
50
|
end
|
51
51
|
|
52
|
-
it "
|
52
|
+
it "requires :interval to be a valid symbol for monthly recurrence" do
|
53
53
|
expect {
|
54
54
|
recurrence(:every => :month, :on => 10, :interval => :invalid)
|
55
55
|
}.to raise_error(ArgumentError)
|
56
56
|
end
|
57
57
|
|
58
58
|
describe ".default_starts_date" do
|
59
|
-
it "
|
60
|
-
Recurrence.default_starts_date.
|
59
|
+
it "returns Date.today by default" do
|
60
|
+
expect(Recurrence.default_starts_date).to eq(Date.today)
|
61
61
|
end
|
62
62
|
|
63
|
-
it "
|
63
|
+
it "requires only strings and procs" do
|
64
64
|
expect {
|
65
65
|
Recurrence.default_starts_date = Date.tomorrow
|
66
66
|
}.to raise_error(ArgumentError)
|
@@ -70,13 +70,13 @@ describe Recurrence do
|
|
70
70
|
before { Recurrence.default_starts_date = "Date.tomorrow" }
|
71
71
|
after { Recurrence.default_starts_date = nil }
|
72
72
|
|
73
|
-
it "
|
74
|
-
Recurrence.default_starts_date.
|
73
|
+
it "returns Date.tomorrow" do
|
74
|
+
expect(Recurrence.default_starts_date).to eq(Date.tomorrow)
|
75
75
|
end
|
76
76
|
|
77
|
-
it "
|
77
|
+
it "has effect on generated events" do
|
78
78
|
r = Recurrence.new(:every => :day, :until => 3.days.from_now.to_date)
|
79
|
-
r.events.first.
|
79
|
+
expect(r.events.first).to eq(Date.tomorrow)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -84,93 +84,128 @@ describe Recurrence do
|
|
84
84
|
before { Recurrence.default_starts_date = lambda { Date.tomorrow } }
|
85
85
|
after { Recurrence.default_starts_date = nil }
|
86
86
|
|
87
|
-
it "
|
88
|
-
Recurrence.default_starts_date.
|
87
|
+
it "returns Date.tomorrow" do
|
88
|
+
expect(Recurrence.default_starts_date).to eq(Date.tomorrow)
|
89
89
|
end
|
90
90
|
|
91
|
-
it "
|
91
|
+
it "has effect on generated events" do
|
92
92
|
r = Recurrence.new(:every => :day, :until => 3.days.from_now.to_date)
|
93
|
-
r.events.first.
|
93
|
+
expect(r.events.first).to eq(Date.tomorrow)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
context "with daily recurring" do
|
99
|
-
it "
|
99
|
+
it "recurs until limit date" do
|
100
100
|
@recurrence = Recurrence.daily
|
101
|
-
@recurrence.events[-1].
|
101
|
+
expect(@recurrence.events[-1]).to eq(Date.parse("2037-12-31"))
|
102
102
|
end
|
103
103
|
|
104
|
-
it "
|
104
|
+
it "repeats until 1 month from now" do
|
105
105
|
date = 1.month.from_now
|
106
106
|
@recurrence = recurrence(:every => :day, :until => date.to_date)
|
107
|
-
@recurrence.events[-1].
|
107
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
108
108
|
end
|
109
109
|
|
110
|
-
it "
|
110
|
+
it "recurs through 1 month from now" do
|
111
|
+
date = 1.month.from_now
|
112
|
+
@recurrence = recurrence(:every => :day, :through => date.to_date)
|
113
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "starts 2 months ago (#{2.months.ago.to_s(:date)})" do
|
111
117
|
date = 2.months.ago
|
112
118
|
@recurrence = recurrence(:every => :day, :starts => date.to_date)
|
113
|
-
@recurrence.events[0].
|
114
|
-
@recurrence.events[1].
|
115
|
-
@recurrence.events[2].
|
119
|
+
expect(@recurrence.events[0]).to eq(date.to_date)
|
120
|
+
expect(@recurrence.events[1]).to eq((date + 1.day).to_date)
|
121
|
+
expect(@recurrence.events[2]).to eq((date + 2.day).to_date)
|
116
122
|
end
|
117
123
|
|
118
|
-
it "
|
124
|
+
it "starts at 2008-03-19 and repeat until 2008-04-24" do
|
119
125
|
@recurrence = recurrence(:every => :day, :starts => "2008-03-19", :until => "2008-04-24")
|
120
|
-
@recurrence.events[0].to_s.
|
121
|
-
@recurrence.events[1].to_s.
|
122
|
-
@recurrence.events[-1].to_s.
|
126
|
+
expect(@recurrence.events[0].to_s).to eq("2008-03-19")
|
127
|
+
expect(@recurrence.events[1].to_s).to eq("2008-03-20")
|
128
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-04-24")
|
123
129
|
end
|
124
130
|
|
125
|
-
it "
|
131
|
+
it "starts at 2008-03-19 and repeat through 2008-04-24" do
|
132
|
+
@recurrence = recurrence(:every => :day, :starts => "2008-03-19", :through => "2008-04-24")
|
133
|
+
expect(@recurrence.events[0].to_s).to eq("2008-03-19")
|
134
|
+
expect(@recurrence.events[1].to_s).to eq("2008-03-20")
|
135
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-04-24")
|
136
|
+
end
|
137
|
+
|
138
|
+
it "uses interval" do
|
126
139
|
@recurrence = recurrence(:every => :day, :interval => 2, :starts => "2008-09-21")
|
127
|
-
@recurrence.events[0].to_s.
|
128
|
-
@recurrence.events[1].to_s.
|
129
|
-
@recurrence.events[2].to_s.
|
140
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-21")
|
141
|
+
expect(@recurrence.events[1].to_s).to eq("2008-09-23")
|
142
|
+
expect(@recurrence.events[2].to_s).to eq("2008-09-25")
|
130
143
|
end
|
131
144
|
|
132
|
-
it "
|
145
|
+
it "uses repeat" do
|
133
146
|
@recurrence = recurrence(:every => :day, :starts => "2008-09-21", :repeat => 10)
|
134
|
-
@recurrence.events.size.
|
147
|
+
expect(@recurrence.events.size).to eq(10)
|
135
148
|
end
|
136
149
|
|
137
|
-
it "
|
150
|
+
it "has a lacking day if the interval does not match the last day" do
|
138
151
|
@recurrence = recurrence(
|
139
152
|
:every => :day,
|
140
153
|
:starts => "2008-03-19",
|
141
154
|
:until => "2008-04-25",
|
142
155
|
:interval => 2
|
143
156
|
)
|
144
|
-
@recurrence.events[-1].to_s.
|
157
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-04-24")
|
158
|
+
end
|
159
|
+
|
160
|
+
it "doesn't have a lacking day if the interval does not match the last day" do
|
161
|
+
@recurrence = recurrence(
|
162
|
+
:every => :day,
|
163
|
+
:starts => "2008-03-19",
|
164
|
+
:through => "2008-04-25",
|
165
|
+
:interval => 2
|
166
|
+
)
|
167
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-04-26")
|
168
|
+
end
|
169
|
+
|
170
|
+
it "uses except" do
|
171
|
+
@recurrence = Recurrence.daily(:except => Date.tomorrow)
|
172
|
+
expect(@recurrence.events.include?(Date.tomorrow)).to be_falsey
|
173
|
+
expect(@recurrence.events.include?(Date.tomorrow+1.day)).to be_truthy
|
145
174
|
end
|
146
175
|
end
|
147
176
|
|
148
177
|
context "with weekly recurring" do
|
149
|
-
it "
|
178
|
+
it "recurs until limit date" do
|
150
179
|
@recurrence = Recurrence.weekly(:on => :thursday)
|
151
|
-
@recurrence.events[-1].
|
180
|
+
expect(@recurrence.events[-1]).to eq(Date.parse("2037-12-31"))
|
152
181
|
end
|
153
182
|
|
154
|
-
it "
|
183
|
+
it "repeats 6 weeks from now" do
|
155
184
|
date = 6.weeks.from_now
|
156
185
|
@recurrence = recurrence(:every => :week, :on => date.wday, :until => date.to_date)
|
157
|
-
@recurrence.events[-1].
|
186
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
187
|
+
end
|
188
|
+
|
189
|
+
it "repeats through 6 weeks from now" do
|
190
|
+
date = 6.weeks.from_now
|
191
|
+
@recurrence = recurrence(:every => :week, :on => date.wday, :through => date.to_date)
|
192
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
158
193
|
end
|
159
194
|
|
160
|
-
it "
|
195
|
+
it "starts 3 months ago (#{3.months.ago.to_s(:date)})" do
|
161
196
|
date = 3.months.ago
|
162
197
|
|
163
198
|
@recurrence = recurrence(:every => :week, :on => date.wday, :starts => date.to_date)
|
164
|
-
@recurrence.events[0].
|
165
|
-
@recurrence.events[1].
|
166
|
-
@recurrence.events[2].
|
167
|
-
@recurrence.events[3].
|
168
|
-
@recurrence.events[4].
|
169
|
-
@recurrence.events[5].
|
170
|
-
@recurrence.events[6].
|
199
|
+
expect(@recurrence.events[0]).to eq(date.to_date)
|
200
|
+
expect(@recurrence.events[1]).to eq((date + 1.week).to_date)
|
201
|
+
expect(@recurrence.events[2]).to eq((date + 2.weeks).to_date)
|
202
|
+
expect(@recurrence.events[3]).to eq((date + 3.weeks).to_date)
|
203
|
+
expect(@recurrence.events[4]).to eq((date + 4.weeks).to_date)
|
204
|
+
expect(@recurrence.events[5]).to eq((date + 5.weeks).to_date)
|
205
|
+
expect(@recurrence.events[6]).to eq((date + 6.weeks).to_date)
|
171
206
|
end
|
172
207
|
|
173
|
-
it "
|
208
|
+
it "starts at 2008-02-29 and repeat until 2008-03-14" do
|
174
209
|
starts = Date.parse("2008-02-29")
|
175
210
|
ends = Date.parse("2008-03-14")
|
176
211
|
|
@@ -180,12 +215,27 @@ describe Recurrence do
|
|
180
215
|
:starts => starts,
|
181
216
|
:until => ends.to_date
|
182
217
|
)
|
183
|
-
@recurrence.events[0].to_s.
|
184
|
-
@recurrence.events[1].to_s.
|
185
|
-
@recurrence.events[-1].to_s.
|
218
|
+
expect(@recurrence.events[0].to_s).to eq("2008-02-29")
|
219
|
+
expect(@recurrence.events[1].to_s).to eq("2008-03-07")
|
220
|
+
expect(@recurrence.events[-1].to_s).to eq(ends.to_s)
|
186
221
|
end
|
187
222
|
|
188
|
-
it "
|
223
|
+
it "starts at 2008-02-29 and repeat through 2008-03-14" do
|
224
|
+
starts = Date.parse("2008-02-29")
|
225
|
+
ends = Date.parse("2008-03-14")
|
226
|
+
|
227
|
+
@recurrence = recurrence(
|
228
|
+
:every => :week,
|
229
|
+
:on => :friday,
|
230
|
+
:starts => starts,
|
231
|
+
:through=> ends.to_date
|
232
|
+
)
|
233
|
+
expect(@recurrence.events[0].to_s).to eq("2008-02-29")
|
234
|
+
expect(@recurrence.events[1].to_s).to eq("2008-03-07")
|
235
|
+
expect(@recurrence.events[-1].to_s).to eq(ends.to_s)
|
236
|
+
end
|
237
|
+
|
238
|
+
it "uses interval" do
|
189
239
|
starts = Date.parse("2008-09-21")
|
190
240
|
@recurrence = recurrence(
|
191
241
|
:every => :week,
|
@@ -194,16 +244,16 @@ describe Recurrence do
|
|
194
244
|
:starts => starts,
|
195
245
|
:until => "2009-01-01"
|
196
246
|
)
|
197
|
-
@recurrence.events[0].to_s.
|
198
|
-
@recurrence.events[1].to_s.
|
199
|
-
@recurrence.events[2].to_s.
|
200
|
-
@recurrence.events[3].to_s.
|
201
|
-
@recurrence.events[4].to_s.
|
202
|
-
@recurrence.events[5].to_s.
|
203
|
-
@recurrence.events[6].to_s.
|
247
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-21")
|
248
|
+
expect(@recurrence.events[1].to_s).to eq("2008-10-05")
|
249
|
+
expect(@recurrence.events[2].to_s).to eq("2008-10-19")
|
250
|
+
expect(@recurrence.events[3].to_s).to eq("2008-11-02")
|
251
|
+
expect(@recurrence.events[4].to_s).to eq("2008-11-16")
|
252
|
+
expect(@recurrence.events[5].to_s).to eq("2008-11-30")
|
253
|
+
expect(@recurrence.events[6].to_s).to eq("2008-12-14")
|
204
254
|
end
|
205
255
|
|
206
|
-
it "
|
256
|
+
it "uses repeat" do
|
207
257
|
starts = Date.parse("2008-09-21")
|
208
258
|
@recurrence = recurrence(
|
209
259
|
:every => :week,
|
@@ -212,10 +262,10 @@ describe Recurrence do
|
|
212
262
|
:until => "2011-01-01",
|
213
263
|
:repeat => 5
|
214
264
|
)
|
215
|
-
@recurrence.events.size.
|
265
|
+
expect(@recurrence.events.size).to eq(5)
|
216
266
|
end
|
217
267
|
|
218
|
-
it "
|
268
|
+
it "occurs several times per week" do
|
219
269
|
starts = Date.parse("2008-09-21") #=> sunday
|
220
270
|
@recurrence = recurrence(
|
221
271
|
:every => :week,
|
@@ -224,14 +274,14 @@ describe Recurrence do
|
|
224
274
|
:starts => starts,
|
225
275
|
:until => "2009-01-01"
|
226
276
|
)
|
227
|
-
@recurrence.events[0].to_s.
|
228
|
-
@recurrence.events[1].to_s.
|
229
|
-
@recurrence.events[2].to_s.
|
230
|
-
@recurrence.events[3].to_s.
|
231
|
-
@recurrence.events[4].to_s.
|
232
|
-
@recurrence.events[5].to_s.
|
233
|
-
@recurrence.events[6].to_s.
|
234
|
-
@recurrence.events[7].to_s.
|
277
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-21")
|
278
|
+
expect(@recurrence.events[1].to_s).to eq("2008-09-27")
|
279
|
+
expect(@recurrence.events[2].to_s).to eq("2008-10-05")
|
280
|
+
expect(@recurrence.events[3].to_s).to eq("2008-10-11")
|
281
|
+
expect(@recurrence.events[4].to_s).to eq("2008-10-19")
|
282
|
+
expect(@recurrence.events[5].to_s).to eq("2008-10-25")
|
283
|
+
expect(@recurrence.events[6].to_s).to eq("2008-11-02")
|
284
|
+
expect(@recurrence.events[7].to_s).to eq("2008-11-08")
|
235
285
|
|
236
286
|
starts = Date.parse("2008-09-21") #=> sunday
|
237
287
|
@recurrence = recurrence(
|
@@ -240,15 +290,15 @@ describe Recurrence do
|
|
240
290
|
:starts => starts,
|
241
291
|
:until => "2009-01-01"
|
242
292
|
)
|
243
|
-
@recurrence.events[0].to_s.
|
244
|
-
@recurrence.events[1].to_s.
|
245
|
-
@recurrence.events[2].to_s.
|
246
|
-
@recurrence.events[3].to_s.
|
247
|
-
@recurrence.events[4].to_s.
|
248
|
-
@recurrence.events[5].to_s.
|
293
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-22")
|
294
|
+
expect(@recurrence.events[1].to_s).to eq("2008-09-24")
|
295
|
+
expect(@recurrence.events[2].to_s).to eq("2008-09-26")
|
296
|
+
expect(@recurrence.events[3].to_s).to eq("2008-09-29")
|
297
|
+
expect(@recurrence.events[4].to_s).to eq("2008-10-01")
|
298
|
+
expect(@recurrence.events[5].to_s).to eq("2008-10-03")
|
249
299
|
end
|
250
300
|
|
251
|
-
it "
|
301
|
+
it "runs until next available saturday" do
|
252
302
|
starts = Date.parse("2008-09-21") # => sunday
|
253
303
|
@recurrence = recurrence(
|
254
304
|
:every => :week,
|
@@ -256,31 +306,44 @@ describe Recurrence do
|
|
256
306
|
:starts => starts,
|
257
307
|
:until => "2009-01-01"
|
258
308
|
)
|
259
|
-
@recurrence.events[0].to_s.
|
309
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-27")
|
310
|
+
end
|
311
|
+
|
312
|
+
it "uses except" do
|
313
|
+
date = 6.weeks.from_now
|
314
|
+
@recurrence = recurrence(:every => :week, :on => date.wday, :except => 2.weeks.from_now.to_date)
|
315
|
+
expect(@recurrence.events.include?(1.week.from_now.to_date)).to be_truthy
|
316
|
+
expect(@recurrence.events.include?(2.weeks.from_now.to_date)).to be_falsey
|
260
317
|
end
|
261
318
|
end
|
262
319
|
|
263
320
|
context "with monthly recurring" do
|
264
321
|
context "using day" do
|
265
|
-
it "
|
322
|
+
it "recurs until limit date" do
|
266
323
|
@recurrence = Recurrence.monthly(:on => 31)
|
267
|
-
@recurrence.events[-1].
|
324
|
+
expect(@recurrence.events[-1]).to eq(Date.parse("2037-12-31"))
|
268
325
|
end
|
269
326
|
|
270
|
-
it "
|
327
|
+
it "repeats until 8 months from now" do
|
271
328
|
date = 8.months.from_now
|
272
329
|
@recurrence = recurrence(:every => :month, :on => date.day, :until => date.to_date)
|
273
|
-
@recurrence.events[-1].
|
330
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
331
|
+
end
|
332
|
+
|
333
|
+
it "repeats through 8 months from now" do
|
334
|
+
date = 8.months.from_now
|
335
|
+
@recurrence = recurrence(:every => :month, :on => date.day, :through => date.to_date)
|
336
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
274
337
|
end
|
275
338
|
|
276
|
-
it "
|
339
|
+
it "starts 9 months ago" do
|
277
340
|
date = 9.months.ago
|
278
341
|
|
279
342
|
@recurrence = recurrence(:every => :month, :on => date.day, :starts => date.to_date)
|
280
|
-
@recurrence.events[0].
|
343
|
+
expect(@recurrence.events[0]).to eq(date.to_date)
|
281
344
|
end
|
282
345
|
|
283
|
-
it "
|
346
|
+
it "starts at 2008-06-07 and repeat until 2008-11-07" do
|
284
347
|
starts = Date.parse("2008-06-07")
|
285
348
|
ends = Date.parse("2008-11-07")
|
286
349
|
|
@@ -290,11 +353,25 @@ describe Recurrence do
|
|
290
353
|
:starts => starts,
|
291
354
|
:until => ends
|
292
355
|
)
|
293
|
-
@recurrence.events[0].to_s.
|
294
|
-
@recurrence.events[-1].to_s.
|
356
|
+
expect(@recurrence.events[0].to_s).to eq("2008-06-07")
|
357
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-11-07")
|
358
|
+
end
|
359
|
+
|
360
|
+
it "starts at 2008-06-07 and repeat through 2008-11-07" do
|
361
|
+
starts = Date.parse("2008-06-07")
|
362
|
+
ends = Date.parse("2008-11-07")
|
363
|
+
|
364
|
+
@recurrence = recurrence(
|
365
|
+
:every => :month,
|
366
|
+
:on => starts.day,
|
367
|
+
:starts => starts,
|
368
|
+
:through=> ends
|
369
|
+
)
|
370
|
+
expect(@recurrence.events[0].to_s).to eq("2008-06-07")
|
371
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-11-07")
|
295
372
|
end
|
296
373
|
|
297
|
-
it "
|
374
|
+
it "runs until next available 27th" do
|
298
375
|
starts = Date.parse("2008-09-28")
|
299
376
|
|
300
377
|
@recurrence = recurrence(
|
@@ -303,10 +380,22 @@ describe Recurrence do
|
|
303
380
|
:starts => starts,
|
304
381
|
:until => "2009-01-01"
|
305
382
|
)
|
306
|
-
@recurrence.events[0].to_s.
|
383
|
+
expect(@recurrence.events[0].to_s).to eq("2008-10-27")
|
384
|
+
end
|
385
|
+
|
386
|
+
it "runs through final available 27th" do
|
387
|
+
starts = Date.parse("2008-09-28")
|
388
|
+
|
389
|
+
@recurrence = recurrence(
|
390
|
+
:every => :month,
|
391
|
+
:on => 27,
|
392
|
+
:starts => starts,
|
393
|
+
:through=> "2009-01-01"
|
394
|
+
)
|
395
|
+
expect(@recurrence.events[-1].to_s).to eq("2009-01-27")
|
307
396
|
end
|
308
397
|
|
309
|
-
it "
|
398
|
+
it "uses interval" do
|
310
399
|
starts = Date.parse("2008-01-31")
|
311
400
|
@recurrence = recurrence(
|
312
401
|
:every => :month,
|
@@ -315,13 +404,13 @@ describe Recurrence do
|
|
315
404
|
:starts => starts,
|
316
405
|
:until => "2010-01-01"
|
317
406
|
)
|
318
|
-
@recurrence.events[0].to_s.
|
319
|
-
@recurrence.events[1].to_s.
|
320
|
-
@recurrence.events[2].to_s.
|
321
|
-
@recurrence.events[3].to_s.
|
322
|
-
@recurrence.events[4].to_s.
|
323
|
-
@recurrence.events[5].to_s.
|
324
|
-
@recurrence.events[6].to_s.
|
407
|
+
expect(@recurrence.events[0].to_s).to eq("2008-01-31")
|
408
|
+
expect(@recurrence.events[1].to_s).to eq("2008-03-31")
|
409
|
+
expect(@recurrence.events[2].to_s).to eq("2008-05-31")
|
410
|
+
expect(@recurrence.events[3].to_s).to eq("2008-07-31")
|
411
|
+
expect(@recurrence.events[4].to_s).to eq("2008-09-30")
|
412
|
+
expect(@recurrence.events[5].to_s).to eq("2008-11-30")
|
413
|
+
expect(@recurrence.events[6].to_s).to eq("2009-01-31")
|
325
414
|
|
326
415
|
starts = Date.parse("2008-01-31")
|
327
416
|
@recurrence = recurrence(
|
@@ -331,12 +420,12 @@ describe Recurrence do
|
|
331
420
|
:starts => starts,
|
332
421
|
:until => "2010-01-01"
|
333
422
|
)
|
334
|
-
@recurrence.events[0].to_s.
|
335
|
-
@recurrence.events[1].to_s.
|
336
|
-
@recurrence.events[2].to_s.
|
337
|
-
@recurrence.events[3].to_s.
|
338
|
-
@recurrence.events[4].to_s.
|
339
|
-
@recurrence.events[5].to_s.
|
423
|
+
expect(@recurrence.events[0].to_s).to eq("2008-04-29")
|
424
|
+
expect(@recurrence.events[1].to_s).to eq("2008-07-29")
|
425
|
+
expect(@recurrence.events[2].to_s).to eq("2008-10-29")
|
426
|
+
expect(@recurrence.events[3].to_s).to eq("2009-01-29")
|
427
|
+
expect(@recurrence.events[4].to_s).to eq("2009-04-29")
|
428
|
+
expect(@recurrence.events[5].to_s).to eq("2009-07-29")
|
340
429
|
|
341
430
|
starts = Date.parse("2008-02-29")
|
342
431
|
@recurrence = recurrence(
|
@@ -346,13 +435,13 @@ describe Recurrence do
|
|
346
435
|
:starts => starts,
|
347
436
|
:until => "2010-01-01"
|
348
437
|
)
|
349
|
-
@recurrence.events[0].to_s.
|
350
|
-
@recurrence.events[1].to_s.
|
351
|
-
@recurrence.events[2].to_s.
|
352
|
-
@recurrence.events[3].to_s.
|
438
|
+
expect(@recurrence.events[0].to_s).to eq("2008-02-29")
|
439
|
+
expect(@recurrence.events[1].to_s).to eq("2008-06-30")
|
440
|
+
expect(@recurrence.events[2].to_s).to eq("2008-10-31")
|
441
|
+
expect(@recurrence.events[3].to_s).to eq("2009-02-28")
|
353
442
|
end
|
354
443
|
|
355
|
-
it "
|
444
|
+
it "uses repeat" do
|
356
445
|
starts = Date.parse("2008-01-31")
|
357
446
|
@recurrence = recurrence(
|
358
447
|
:every => :month,
|
@@ -361,22 +450,28 @@ describe Recurrence do
|
|
361
450
|
:until => "2010-01-01",
|
362
451
|
:repeat => 5
|
363
452
|
)
|
364
|
-
@recurrence.events.size.
|
453
|
+
expect(@recurrence.events.size).to eq(5)
|
454
|
+
end
|
455
|
+
|
456
|
+
it "uses except" do
|
457
|
+
@recurrence = recurrence(:every => :month, :on => Date.today.day, :except => 8.months.from_now.to_date)
|
458
|
+
expect(@recurrence.events.include?(7.months.from_now.to_date)).to be_truthy
|
459
|
+
expect(@recurrence.events.include?(8.months.from_now.to_date)).to be_falsey
|
365
460
|
end
|
366
461
|
end
|
367
462
|
|
368
463
|
context "using weekday" do
|
369
|
-
it "
|
464
|
+
it "recurs until limit date" do
|
370
465
|
@recurrence = Recurrence.daily(:on => 5, :weekday => :thursday)
|
371
|
-
@recurrence.events[-1].
|
466
|
+
expect(@recurrence.events[-1]).to eq(Date.parse("2037-12-31"))
|
372
467
|
end
|
373
468
|
|
374
|
-
it "
|
469
|
+
it "uses weekday shortcut" do
|
375
470
|
@recurrence = Recurrence.daily(:on => 5, :weekday => :thu)
|
376
|
-
@recurrence.events[-1].
|
471
|
+
expect(@recurrence.events[-1]).to eq(Date.parse("2037-12-31"))
|
377
472
|
end
|
378
473
|
|
379
|
-
it "
|
474
|
+
it "repeats until 8 months from now" do
|
380
475
|
date = 8.months.from_now
|
381
476
|
week = (date.day - 1) / 7 + 1
|
382
477
|
@recurrence = recurrence(
|
@@ -385,10 +480,22 @@ describe Recurrence do
|
|
385
480
|
:weekday => date.wday,
|
386
481
|
:until => date.to_date
|
387
482
|
)
|
388
|
-
@recurrence.events[-1].
|
483
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
389
484
|
end
|
390
485
|
|
391
|
-
it "
|
486
|
+
it "repeats through 8 months from now" do
|
487
|
+
date = 8.months.from_now
|
488
|
+
week = (date.day - 1) / 7 + 1
|
489
|
+
@recurrence = recurrence(
|
490
|
+
:every => :month,
|
491
|
+
:on => week,
|
492
|
+
:weekday => date.wday,
|
493
|
+
:through => date.to_date
|
494
|
+
)
|
495
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
496
|
+
end
|
497
|
+
|
498
|
+
it "starts 9 months ago" do
|
392
499
|
date = 9.months.ago
|
393
500
|
week = (date.day - 1) / 7 + 1
|
394
501
|
@recurrence = recurrence(
|
@@ -397,10 +504,10 @@ describe Recurrence do
|
|
397
504
|
:weekday => date.wday,
|
398
505
|
:starts => date.to_date
|
399
506
|
)
|
400
|
-
@recurrence.events[0].
|
507
|
+
expect(@recurrence.events[0]).to eq(date.to_date)
|
401
508
|
end
|
402
509
|
|
403
|
-
it "
|
510
|
+
it "starts at 2008-06-07 and repeat until 2008-11-01 (first saturday)" do
|
404
511
|
starts = Date.parse("2008-06-07")
|
405
512
|
ends = Date.parse("2008-11-01")
|
406
513
|
|
@@ -411,11 +518,11 @@ describe Recurrence do
|
|
411
518
|
:starts => starts,
|
412
519
|
:until => ends
|
413
520
|
)
|
414
|
-
@recurrence.events[0].to_s.
|
415
|
-
@recurrence.events[-1].to_s.
|
521
|
+
expect(@recurrence.events[0].to_s).to eq("2008-06-07")
|
522
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-11-01")
|
416
523
|
end
|
417
524
|
|
418
|
-
it "
|
525
|
+
it "starts at 2008-06-29 and repeat until 2008-11-30 (last sunday)" do
|
419
526
|
starts = Date.parse("2008-06-29")
|
420
527
|
ends = Date.parse("2008-11-30")
|
421
528
|
|
@@ -426,11 +533,11 @@ describe Recurrence do
|
|
426
533
|
:starts => starts,
|
427
534
|
:until => ends
|
428
535
|
)
|
429
|
-
@recurrence.events[0].to_s.
|
430
|
-
@recurrence.events[-1].to_s.
|
536
|
+
expect(@recurrence.events[0].to_s).to eq("2008-06-29")
|
537
|
+
expect(@recurrence.events[-1].to_s).to eq("2008-11-30")
|
431
538
|
end
|
432
539
|
|
433
|
-
it "
|
540
|
+
it "uses interval" do
|
434
541
|
starts = Date.parse("2009-01-01")
|
435
542
|
@recurrence = recurrence(
|
436
543
|
:every => :month,
|
@@ -440,16 +547,16 @@ describe Recurrence do
|
|
440
547
|
:starts => starts,
|
441
548
|
:until => "2010-02-01"
|
442
549
|
)
|
443
|
-
@recurrence.events[0].to_s.
|
444
|
-
@recurrence.events[1].to_s.
|
445
|
-
@recurrence.events[2].to_s.
|
446
|
-
@recurrence.events[3].to_s.
|
447
|
-
@recurrence.events[4].to_s.
|
448
|
-
@recurrence.events[5].to_s.
|
449
|
-
@recurrence.events[6].to_s.
|
550
|
+
expect(@recurrence.events[0].to_s).to eq("2009-01-18")
|
551
|
+
expect(@recurrence.events[1].to_s).to eq("2009-03-15")
|
552
|
+
expect(@recurrence.events[2].to_s).to eq("2009-05-17")
|
553
|
+
expect(@recurrence.events[3].to_s).to eq("2009-07-19")
|
554
|
+
expect(@recurrence.events[4].to_s).to eq("2009-09-20")
|
555
|
+
expect(@recurrence.events[5].to_s).to eq("2009-11-15")
|
556
|
+
expect(@recurrence.events[6].to_s).to eq("2010-01-17")
|
450
557
|
end
|
451
558
|
|
452
|
-
it "
|
559
|
+
it "uses repeat" do
|
453
560
|
starts = Date.parse("2009-01-01")
|
454
561
|
@recurrence = recurrence(
|
455
562
|
:every => :month,
|
@@ -459,7 +566,7 @@ describe Recurrence do
|
|
459
566
|
:until => "2011-02-01",
|
460
567
|
:repeat => 5
|
461
568
|
)
|
462
|
-
@recurrence.events.size.
|
569
|
+
expect(@recurrence.events.size).to eq(5)
|
463
570
|
end
|
464
571
|
end
|
465
572
|
|
@@ -468,82 +575,92 @@ describe Recurrence do
|
|
468
575
|
@starts = Date.parse("2008-09-03")
|
469
576
|
end
|
470
577
|
|
471
|
-
it "
|
578
|
+
it "uses numeric interval" do
|
472
579
|
@recurrence = recurrence(:every => :month, :on => 21, :interval => 2, :starts => @starts)
|
473
|
-
@recurrence.events[0].to_s.
|
474
|
-
@recurrence.events[1].to_s.
|
475
|
-
@recurrence.events[2].to_s.
|
476
|
-
@recurrence.events[3].to_s.
|
580
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-21")
|
581
|
+
expect(@recurrence.events[1].to_s).to eq("2008-11-21")
|
582
|
+
expect(@recurrence.events[2].to_s).to eq("2009-01-21")
|
583
|
+
expect(@recurrence.events[3].to_s).to eq("2009-03-21")
|
477
584
|
end
|
478
585
|
|
479
|
-
it "
|
586
|
+
it "accepts monthly symbol" do
|
480
587
|
@recurrence = recurrence(
|
481
588
|
:every => :month,
|
482
589
|
:on => 10,
|
483
590
|
:starts => @starts,
|
484
591
|
:interval => :monthly
|
485
592
|
)
|
486
|
-
@recurrence.events[0].to_s.
|
487
|
-
@recurrence.events[1].to_s.
|
593
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-10")
|
594
|
+
expect(@recurrence.events[1].to_s).to eq("2008-10-10")
|
488
595
|
end
|
489
596
|
|
490
|
-
it "
|
597
|
+
it "accepts bimonthly symbol" do
|
491
598
|
@recurrence = recurrence(
|
492
599
|
:every => :month,
|
493
600
|
:on => 10,
|
494
601
|
:starts => @starts,
|
495
602
|
:interval => :bimonthly
|
496
603
|
)
|
497
|
-
@recurrence.events[0].to_s.
|
498
|
-
@recurrence.events[1].to_s.
|
604
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-10")
|
605
|
+
expect(@recurrence.events[1].to_s).to eq("2008-11-10")
|
499
606
|
end
|
500
607
|
|
501
|
-
it "
|
608
|
+
it "accepts quarterly symbol" do
|
502
609
|
@recurrence = recurrence(
|
503
610
|
:every => :month,
|
504
611
|
:on => 10,
|
505
612
|
:starts => @starts,
|
506
613
|
:interval => :quarterly
|
507
614
|
)
|
508
|
-
@recurrence.events[0].to_s.
|
509
|
-
@recurrence.events[1].to_s.
|
615
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-10")
|
616
|
+
expect(@recurrence.events[1].to_s).to eq("2008-12-10")
|
510
617
|
end
|
511
618
|
|
512
|
-
it "
|
619
|
+
it "accepts semesterly symbol" do
|
513
620
|
@recurrence = recurrence(:every => :month, :on => 10, :starts => @starts, :interval => :semesterly)
|
514
|
-
@recurrence.events[0].to_s.
|
515
|
-
@recurrence.events[1].to_s.
|
621
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-10")
|
622
|
+
expect(@recurrence.events[1].to_s).to eq("2009-03-10")
|
516
623
|
end
|
517
624
|
end
|
518
625
|
end
|
519
626
|
|
520
627
|
describe "with yearly recurring" do
|
521
|
-
it "
|
628
|
+
it "recurs until limit date" do
|
522
629
|
@recurrence = Recurrence.yearly(:on => [12,31])
|
523
|
-
@recurrence.events[-1].
|
630
|
+
expect(@recurrence.events[-1]).to eq(Date.parse("2037-12-31"))
|
524
631
|
end
|
525
632
|
|
526
|
-
it "
|
633
|
+
it "repeats until 7 years from now" do
|
527
634
|
date = 7.years.from_now
|
528
635
|
@recurrence = recurrence(
|
529
636
|
:every => :year,
|
530
637
|
:on => [date.month, date.day],
|
531
638
|
:until => date.to_date
|
532
639
|
)
|
533
|
-
@recurrence.events[-1].
|
640
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
641
|
+
end
|
642
|
+
|
643
|
+
it "repeats through 7 years from now" do
|
644
|
+
date = 7.years.from_now
|
645
|
+
@recurrence = recurrence(
|
646
|
+
:every => :year,
|
647
|
+
:on => [date.month, date.day],
|
648
|
+
:through => date.to_date
|
649
|
+
)
|
650
|
+
expect(@recurrence.events[-1]).to eq(date.to_date)
|
534
651
|
end
|
535
652
|
|
536
|
-
it "
|
653
|
+
it "starts 2 years ago" do
|
537
654
|
date = 2.years.ago
|
538
655
|
@recurrence = recurrence(
|
539
656
|
:every => :year,
|
540
657
|
:on => [date.month, date.day],
|
541
658
|
:starts => date.to_date
|
542
659
|
)
|
543
|
-
@recurrence.events[0].
|
660
|
+
expect(@recurrence.events[0]).to eq(date.to_date)
|
544
661
|
end
|
545
662
|
|
546
|
-
it "
|
663
|
+
it "starts at 2003-06-07 and repeat until 2018-06-07" do
|
547
664
|
starts = Date.parse("2003-06-07")
|
548
665
|
ends = Date.parse("2018-06-07")
|
549
666
|
|
@@ -553,11 +670,25 @@ describe Recurrence do
|
|
553
670
|
:starts => starts,
|
554
671
|
:until => ends
|
555
672
|
)
|
556
|
-
@recurrence.events[0].to_s.
|
557
|
-
@recurrence.events[-1].to_s.
|
673
|
+
expect(@recurrence.events[0].to_s).to eq("2003-06-07")
|
674
|
+
expect(@recurrence.events[-1].to_s).to eq("2018-06-07")
|
558
675
|
end
|
559
676
|
|
560
|
-
it "
|
677
|
+
it "starts at 2003-06-07 and repeat through 2018-06-07" do
|
678
|
+
starts = Date.parse("2003-06-07")
|
679
|
+
ends = Date.parse("2018-06-07")
|
680
|
+
|
681
|
+
@recurrence = recurrence(
|
682
|
+
:every => :year,
|
683
|
+
:on => [starts.month, starts.day],
|
684
|
+
:starts => starts,
|
685
|
+
:through=> ends
|
686
|
+
)
|
687
|
+
expect(@recurrence.events[0].to_s).to eq("2003-06-07")
|
688
|
+
expect(@recurrence.events[-1].to_s).to eq("2018-06-07")
|
689
|
+
end
|
690
|
+
|
691
|
+
it "uses interval" do
|
561
692
|
starts = Date.parse("2008-09-21")
|
562
693
|
|
563
694
|
@recurrence = recurrence(
|
@@ -566,13 +697,13 @@ describe Recurrence do
|
|
566
697
|
:interval => 2,
|
567
698
|
:starts => starts
|
568
699
|
)
|
569
|
-
@recurrence.events[0].to_s.
|
570
|
-
@recurrence.events[1].to_s.
|
571
|
-
@recurrence.events[2].to_s.
|
572
|
-
@recurrence.events[3].to_s.
|
700
|
+
expect(@recurrence.events[0].to_s).to eq("2008-09-21")
|
701
|
+
expect(@recurrence.events[1].to_s).to eq("2010-09-21")
|
702
|
+
expect(@recurrence.events[2].to_s).to eq("2012-09-21")
|
703
|
+
expect(@recurrence.events[3].to_s).to eq("2014-09-21")
|
573
704
|
end
|
574
705
|
|
575
|
-
it "
|
706
|
+
it "uses repeat" do
|
576
707
|
starts = Date.parse("2008-09-21")
|
577
708
|
|
578
709
|
@recurrence = recurrence(
|
@@ -581,143 +712,184 @@ describe Recurrence do
|
|
581
712
|
:starts => starts,
|
582
713
|
:repeat => 5
|
583
714
|
)
|
584
|
-
@recurrence.events.size.
|
715
|
+
expect(@recurrence.events.size).to eq(5)
|
716
|
+
end
|
717
|
+
|
718
|
+
it "includes the through date when less than a perfect interval" do
|
719
|
+
starts = Date.parse("2003-06-07")
|
720
|
+
ends = Date.parse("2018-07-12")
|
721
|
+
|
722
|
+
@recurrence = recurrence(
|
723
|
+
:every => :year,
|
724
|
+
:on => [starts.month, starts.day],
|
725
|
+
:starts => starts,
|
726
|
+
:through => ends
|
727
|
+
)
|
728
|
+
expect(@recurrence.events[-1].to_s).to eq('2019-06-07')
|
585
729
|
end
|
586
730
|
|
587
|
-
it "
|
731
|
+
it "runs until next available date when chosen settings are greater than start date" do
|
588
732
|
starts = Date.parse("2008-09-03")
|
589
733
|
|
590
734
|
@recurrence = recurrence(:every => :year, :on => [10, 27], :starts => starts)
|
591
|
-
@recurrence.events[0].to_s.
|
735
|
+
expect(@recurrence.events[0].to_s).to eq("2008-10-27")
|
592
736
|
end
|
593
737
|
|
594
|
-
it "
|
738
|
+
it "runs until next available date when chosen settings are smaller than start date" do
|
595
739
|
starts = Date.parse("2008-09-03")
|
596
740
|
@recurrence = recurrence(:every => :year, :on => [7, 1], :starts => starts)
|
597
|
-
@recurrence.events[0].to_s.
|
741
|
+
expect(@recurrence.events[0].to_s).to eq("2009-07-01")
|
598
742
|
|
599
743
|
starts = Date.parse("2008-09-03")
|
600
744
|
@recurrence = recurrence(:every => :year, :on => [9, 1], :starts => starts)
|
601
|
-
@recurrence.events[0].to_s.
|
745
|
+
expect(@recurrence.events[0].to_s).to eq("2009-09-01")
|
746
|
+
end
|
747
|
+
|
748
|
+
it "uses except" do
|
749
|
+
@recurrence = Recurrence.yearly(:on => [12,31], :except => "#{Time.now.year+3}-12-31")
|
750
|
+
|
751
|
+
expect(@recurrence.events.include?("#{Time.now.year+2}-12-31".to_date)).to be_truthy
|
752
|
+
expect(@recurrence.events.include?("#{Time.now.year+3}-12-31".to_date)).to be_falsey
|
753
|
+
end
|
754
|
+
end
|
755
|
+
|
756
|
+
context "with except", :focus => true do
|
757
|
+
it "accepts only valid date strings or Dates" do
|
758
|
+
expect { recurrence(:except => :symbol) }.to raise_error(ArgumentError)
|
759
|
+
expect { recurrence(:except => "invalid") }.to raise_error(ArgumentError)
|
760
|
+
end
|
761
|
+
|
762
|
+
it "skips day specified in except" do
|
763
|
+
@recurrence = recurrence(:every => :day, :except => Date.tomorrow)
|
764
|
+
expect(@recurrence.include?(Date.today)).to be_truthy
|
765
|
+
expect(@recurrence.include?(Date.tomorrow)).to be_falsey
|
766
|
+
expect(@recurrence.include?(Date.tomorrow+1.day)).to be_truthy
|
767
|
+
end
|
768
|
+
|
769
|
+
it "skips multiple days specified in except" do
|
770
|
+
@recurrence = recurrence(:every => :day, :except => [Date.tomorrow, "2012-02-29"])
|
771
|
+
expect(@recurrence.include?(Date.today)).to be_truthy
|
772
|
+
expect(@recurrence.include?(Date.tomorrow)).to be_falsey
|
773
|
+
expect(@recurrence.include?("2012-02-29")).to be_falsey
|
602
774
|
end
|
603
775
|
end
|
604
776
|
|
605
777
|
describe "#options" do
|
606
|
-
it "
|
778
|
+
it "returns passed-in options" do
|
607
779
|
@recurrence = recurrence(:every => :day)
|
608
|
-
@recurrence.options.
|
780
|
+
expect(@recurrence.options).to eq({:every => :day})
|
609
781
|
end
|
610
782
|
end
|
611
783
|
|
612
784
|
describe "#include?" do
|
613
|
-
it "
|
785
|
+
it "includes date (day)" do
|
614
786
|
@recurrence = recurrence(:every => :day, :starts => "2008-09-30")
|
615
|
-
@recurrence.include?("2008-09-30").
|
616
|
-
@recurrence.include?("2008-10-01").
|
787
|
+
expect(@recurrence.include?("2008-09-30")).to be_truthy
|
788
|
+
expect(@recurrence.include?("2008-10-01")).to be_truthy
|
617
789
|
end
|
618
790
|
|
619
|
-
it "
|
791
|
+
it "includes date (week)" do
|
620
792
|
@recurrence = recurrence(:every => :week, :on => :thursday, :starts => "2008-09-30")
|
621
|
-
@recurrence.include?("2008-09-30").
|
622
|
-
@recurrence.include?("2008-10-02").
|
793
|
+
expect(@recurrence.include?("2008-09-30")).to be_falsey
|
794
|
+
expect(@recurrence.include?("2008-10-02")).to be_truthy
|
623
795
|
|
624
796
|
@recurrence = recurrence(:every => :week, :on => :monday, :starts => "2008-09-29")
|
625
|
-
@recurrence.include?("2008-09-29").
|
626
|
-
@recurrence.include?("2008-10-06").
|
797
|
+
expect(@recurrence.include?("2008-09-29")).to be_truthy
|
798
|
+
expect(@recurrence.include?("2008-10-06")).to be_truthy
|
627
799
|
end
|
628
800
|
|
629
|
-
it "
|
801
|
+
it "includes date (month)" do
|
630
802
|
@recurrence = recurrence(:every => :month, :on => 10, :starts => "2008-09-30")
|
631
|
-
@recurrence.include?("2008-09-30").
|
632
|
-
@recurrence.include?("2008-10-10").
|
803
|
+
expect(@recurrence.include?("2008-09-30")).to be_falsey
|
804
|
+
expect(@recurrence.include?("2008-10-10")).to be_truthy
|
633
805
|
|
634
806
|
@recurrence = recurrence(:every => :month, :on => 10, :starts => "2008-09-10")
|
635
|
-
@recurrence.include?("2008-09-10").
|
636
|
-
@recurrence.include?("2008-10-10").
|
807
|
+
expect(@recurrence.include?("2008-09-10")).to be_truthy
|
808
|
+
expect(@recurrence.include?("2008-10-10")).to be_truthy
|
637
809
|
end
|
638
810
|
|
639
|
-
it "
|
811
|
+
it "includes date (year)" do
|
640
812
|
@recurrence = recurrence(:every => :year, :on => [6,28], :starts => "2008-09-30")
|
641
|
-
@recurrence.include?("2009-09-30").
|
642
|
-
@recurrence.include?("2009-06-28").
|
813
|
+
expect(@recurrence.include?("2009-09-30")).to be_falsey
|
814
|
+
expect(@recurrence.include?("2009-06-28")).to be_truthy
|
643
815
|
|
644
816
|
@recurrence = recurrence(:every => :year, :on => [6,28], :starts => "2008-06-28")
|
645
|
-
@recurrence.include?("2009-06-28").
|
646
|
-
@recurrence.include?("2009-06-28").
|
817
|
+
expect(@recurrence.include?("2009-06-28")).to be_truthy
|
818
|
+
expect(@recurrence.include?("2009-06-28")).to be_truthy
|
647
819
|
end
|
648
820
|
|
649
|
-
it "
|
821
|
+
it "doesn't include date when is smaller than starting date (day)" do
|
650
822
|
@recurrence = recurrence(:every => :day, :starts => "2008-09-30")
|
651
|
-
@recurrence.include?("2008-09-29").
|
823
|
+
expect(@recurrence.include?("2008-09-29")).to be_falsey
|
652
824
|
end
|
653
825
|
|
654
|
-
it "
|
826
|
+
it "doesn't include date when is smaller than starting date (week)" do
|
655
827
|
@recurrence = recurrence(:every => :week, :on => :friday, :starts => "2008-09-30")
|
656
|
-
@recurrence.include?("2008-09-24").
|
828
|
+
expect(@recurrence.include?("2008-09-24")).to be_falsey
|
657
829
|
end
|
658
830
|
|
659
|
-
it "
|
831
|
+
it "doesn't include date when is smaller than starting date (month)" do
|
660
832
|
@recurrence = recurrence(:every => :month, :on => 10, :starts => "2008-09-30")
|
661
|
-
@recurrence.include?("2008-09-10").
|
833
|
+
expect(@recurrence.include?("2008-09-10")).to be_falsey
|
662
834
|
end
|
663
835
|
|
664
|
-
it "
|
836
|
+
it "doesn't include date when is smaller than starting date (year)" do
|
665
837
|
@recurrence = recurrence(:every => :year, :on => [6,28], :starts => "2008-09-30")
|
666
|
-
@recurrence.include?("2008-06-28").
|
838
|
+
expect(@recurrence.include?("2008-06-28")).to be_falsey
|
667
839
|
end
|
668
840
|
|
669
|
-
it "
|
841
|
+
it "doesn't include date when is greater than ending date (day)" do
|
670
842
|
@recurrence = recurrence(:every => :day, :until => "2008-09-30")
|
671
|
-
@recurrence.include?("2008-10-01").
|
843
|
+
expect(@recurrence.include?("2008-10-01")).to be_falsey
|
672
844
|
end
|
673
845
|
|
674
|
-
it "
|
846
|
+
it "doesn't include date when is greater than ending date (week)" do
|
675
847
|
@recurrence = recurrence(:every => :week, :on => :friday, :until => "2008-09-30")
|
676
|
-
@recurrence.include?("2008-10-03").
|
848
|
+
expect(@recurrence.include?("2008-10-03")).to be_falsey
|
677
849
|
end
|
678
850
|
|
679
|
-
it "
|
851
|
+
it "doesn't include date when is greater than ending date (year)" do
|
680
852
|
@recurrence = recurrence(:every => :year, :on => [6,28], :until => "2008-09-30")
|
681
|
-
@recurrence.include?("2009-06-28").
|
853
|
+
expect(@recurrence.include?("2009-06-28")).to be_falsey
|
682
854
|
end
|
683
855
|
end
|
684
856
|
|
685
857
|
describe "#next" do
|
686
|
-
it "
|
858
|
+
it "returns next date" do
|
687
859
|
@recurrence = recurrence(:every => :day)
|
688
860
|
|
689
|
-
@recurrence.next.to_s.
|
690
|
-
@recurrence.next.to_s.
|
861
|
+
expect(@recurrence.next.to_s).to eq(Date.today.to_s)
|
862
|
+
expect(@recurrence.next.to_s).to eq(Date.today.to_s)
|
691
863
|
end
|
692
864
|
|
693
|
-
it "
|
865
|
+
it "returns next! date" do
|
694
866
|
@recurrence = recurrence(:every => :day)
|
695
867
|
|
696
|
-
@recurrence.next!.to_s.
|
697
|
-
@recurrence.next!.to_s.
|
698
|
-
@recurrence.next!.to_s.
|
699
|
-
@recurrence.next!.to_s.
|
868
|
+
expect(@recurrence.next!.to_s).to eq(Date.today.to_s)
|
869
|
+
expect(@recurrence.next!.to_s).to eq(1.day.from_now.to_date.to_s)
|
870
|
+
expect(@recurrence.next!.to_s).to eq(2.days.from_now.to_date.to_s)
|
871
|
+
expect(@recurrence.next!.to_s).to eq(3.days.from_now.to_date.to_s)
|
700
872
|
end
|
701
873
|
end
|
702
874
|
|
703
875
|
describe "#reset!" do
|
704
|
-
it "
|
876
|
+
it "resets to the first available date" do
|
705
877
|
@recurrence = recurrence(:every => :year, :on => [2, 31], :starts => "2008-01-01")
|
706
|
-
@recurrence.next!.to_s.
|
707
|
-
@recurrence.next!.to_s.
|
878
|
+
expect(@recurrence.next!.to_s).to eq("2008-02-29")
|
879
|
+
expect(@recurrence.next!.to_s).to eq("2009-02-28")
|
708
880
|
@recurrence.reset!
|
709
|
-
@recurrence.next.to_s.
|
881
|
+
expect(@recurrence.next.to_s).to eq("2008-02-29")
|
710
882
|
end
|
711
883
|
end
|
712
884
|
|
713
885
|
describe "event initialization" do
|
714
|
-
it "
|
886
|
+
it "returns the first available date" do
|
715
887
|
@recurrence = recurrence(:every => :year, :on => [2, 31], :starts => "2008-01-01")
|
716
|
-
@recurrence.next!.to_s.
|
717
|
-
@recurrence.next!.to_s.
|
718
|
-
@recurrence.next!.to_s.
|
719
|
-
@recurrence.next!.to_s.
|
720
|
-
@recurrence.next!.to_s.
|
888
|
+
expect(@recurrence.next!.to_s).to eq("2008-02-29")
|
889
|
+
expect(@recurrence.next!.to_s).to eq("2009-02-28")
|
890
|
+
expect(@recurrence.next!.to_s).to eq("2010-02-28")
|
891
|
+
expect(@recurrence.next!.to_s).to eq("2011-02-28")
|
892
|
+
expect(@recurrence.next!.to_s).to eq("2012-02-29")
|
721
893
|
end
|
722
894
|
end
|
723
895
|
|
@@ -726,44 +898,44 @@ describe Recurrence do
|
|
726
898
|
@recurrence = recurrence(:every => :day, :starts => "2009-01-06", :until => "2009-01-15")
|
727
899
|
end
|
728
900
|
|
729
|
-
it "
|
730
|
-
@recurrence.events[0].to_s.
|
731
|
-
@recurrence.events[-1].to_s.
|
901
|
+
it "returns starting and ending recurrences" do
|
902
|
+
expect(@recurrence.events[0].to_s).to eq("2009-01-06")
|
903
|
+
expect(@recurrence.events[-1].to_s).to eq("2009-01-15")
|
732
904
|
end
|
733
905
|
|
734
|
-
it "
|
735
|
-
@recurrence.event.
|
906
|
+
it "resets cache" do
|
907
|
+
expect(@recurrence.event).to receive(:reset!).exactly(3).times
|
736
908
|
@recurrence.events(:starts => "2009-01-11")
|
737
909
|
@recurrence.events(:until => "2009-01-14")
|
738
910
|
@recurrence.events(:starts => "2009-01-11", :until => "2009-01-14")
|
739
911
|
end
|
740
912
|
|
741
|
-
it "
|
913
|
+
it "returns only events greater than starting date" do
|
742
914
|
@events = @recurrence.events(:starts => "2009-01-10")
|
743
|
-
@events[0].to_s.
|
915
|
+
expect(@events[0].to_s).to eq("2009-01-10")
|
744
916
|
end
|
745
917
|
|
746
|
-
it "
|
918
|
+
it "returns only events smaller than until date" do
|
747
919
|
@events = @recurrence.events(:until => "2009-01-10")
|
748
|
-
@events[0].to_s.
|
749
|
-
@events[-1].to_s.
|
920
|
+
expect(@events[0].to_s).to eq("2009-01-06")
|
921
|
+
expect(@events[-1].to_s).to eq("2009-01-10")
|
750
922
|
end
|
751
923
|
|
752
|
-
it "
|
924
|
+
it "returns only events between starting and until date" do
|
753
925
|
@events = @recurrence.events(:starts => "2009-01-12", :until => "2009-01-14")
|
754
|
-
@events[0].to_s.
|
755
|
-
@events[-1].to_s.
|
926
|
+
expect(@events[0].to_s).to eq("2009-01-12")
|
927
|
+
expect(@events[-1].to_s).to eq("2009-01-14")
|
756
928
|
end
|
757
929
|
|
758
|
-
it "
|
930
|
+
it "doesn't iterate all dates when using until" do
|
759
931
|
@events = @recurrence.events(:starts => "2009-01-06", :until => "2009-01-08")
|
760
|
-
@recurrence.instance_variable_get("@events").size.
|
761
|
-
@events.size.
|
762
|
-
@events[-1].to_s.
|
932
|
+
expect(@recurrence.instance_variable_get("@events").size).to eq(3)
|
933
|
+
expect(@events.size).to eq(3)
|
934
|
+
expect(@events[-1].to_s).to eq("2009-01-08")
|
763
935
|
end
|
764
936
|
|
765
937
|
context "bug fixes" do
|
766
|
-
|
938
|
+
it "uses name as symbol [issue#3]" do
|
767
939
|
expect {
|
768
940
|
@recurrence = recurrence(:every => :year, :on => [:jan, 31])
|
769
941
|
}.to_not raise_error
|
@@ -777,10 +949,10 @@ describe Recurrence do
|
|
777
949
|
|
778
950
|
it "offsets every other month day" do
|
779
951
|
r = recurrence(:every => :month, :on => 1, :starts => "2011-01-01", :handler => shift_handler)
|
780
|
-
r.events[0].
|
781
|
-
r.events[1].
|
782
|
-
r.events[2].
|
783
|
-
r.events[3].
|
952
|
+
expect(r.events[0]).to eq(Date.new(2011, 1, 1))
|
953
|
+
expect(r.events[1]).to eq(Date.new(2011, 2, 2))
|
954
|
+
expect(r.events[2]).to eq(Date.new(2011, 3, 1))
|
955
|
+
expect(r.events[3]).to eq(Date.new(2011, 4, 2))
|
784
956
|
end
|
785
957
|
|
786
958
|
it "raises an exception from the handler" do
|
@@ -791,37 +963,37 @@ describe Recurrence do
|
|
791
963
|
context "with shifting enabled" do
|
792
964
|
it "shifts yearly recurrences around February 29" do
|
793
965
|
r = recurrence(:every => :year, :starts => "2012-02-29", :on => [2,29], :shift => true)
|
794
|
-
r.events[0].
|
795
|
-
r.events[1].
|
796
|
-
r.events[2].
|
797
|
-
r.events[3].
|
798
|
-
r.events[4].
|
966
|
+
expect(r.events[0]).to eq(Date.new(2012, 2, 29))
|
967
|
+
expect(r.events[1]).to eq(Date.new(2013, 2, 28))
|
968
|
+
expect(r.events[2]).to eq(Date.new(2014, 2, 28))
|
969
|
+
expect(r.events[3]).to eq(Date.new(2015, 2, 28))
|
970
|
+
expect(r.events[4]).to eq(Date.new(2016, 2, 28))
|
799
971
|
end
|
800
972
|
|
801
973
|
it "shifts monthly recurrences around the 31st" do
|
802
974
|
r = recurrence(:every => :month, :starts => "2011-01-31", :on => 31, :shift => true)
|
803
|
-
r.events[0].
|
804
|
-
r.events[1].
|
805
|
-
r.events[2].
|
975
|
+
expect(r.events[0]).to eq(Date.new(2011, 1, 31))
|
976
|
+
expect(r.events[1]).to eq(Date.new(2011, 2, 28))
|
977
|
+
expect(r.events[2]).to eq(Date.new(2011, 3, 28))
|
806
978
|
end
|
807
979
|
|
808
980
|
it "shifts monthly recurrences around the 30th" do
|
809
981
|
r = recurrence(:every => :month, :starts => "2011-01-30", :on => 30, :shift => true)
|
810
|
-
r.events[0].
|
811
|
-
r.events[1].
|
812
|
-
r.events[2].
|
982
|
+
expect(r.events[0]).to eq(Date.new(2011, 1, 30))
|
983
|
+
expect(r.events[1]).to eq(Date.new(2011, 2, 28))
|
984
|
+
expect(r.events[2]).to eq(Date.new(2011, 3, 28))
|
813
985
|
end
|
814
986
|
|
815
987
|
it "shifts monthly recurrences around the 29th" do
|
816
988
|
r = recurrence(:every => :month, :starts => "2011-01-29", :on => 29, :shift => true)
|
817
|
-
r.events[0].
|
818
|
-
r.events[1].
|
819
|
-
r.events[2].
|
989
|
+
expect(r.events[0]).to eq(Date.new(2011, 1, 29))
|
990
|
+
expect(r.events[1]).to eq(Date.new(2011, 2, 28))
|
991
|
+
expect(r.events[2]).to eq(Date.new(2011, 3, 28))
|
820
992
|
|
821
993
|
r = recurrence(:every => :month, :starts => "2012-01-29", :on => 29, :shift => true)
|
822
|
-
r.events[0].
|
823
|
-
r.events[1].
|
824
|
-
r.events[2].
|
994
|
+
expect(r.events[0]).to eq(Date.new(2012, 1, 29))
|
995
|
+
expect(r.events[1]).to eq(Date.new(2012, 2, 29))
|
996
|
+
expect(r.events[2]).to eq(Date.new(2012, 3, 29))
|
825
997
|
end
|
826
998
|
|
827
999
|
it "correctly resets to original day for monthly" do
|