recurrence 1.0.0 → 1.0.1
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/Gemfile.lock +3 -3
- data/History.txt +5 -0
- data/README.rdoc +6 -0
- data/lib/recurrence/event/base.rb +14 -4
- data/lib/recurrence/event/yearly.rb +1 -1
- data/lib/recurrence/namespace.rb +25 -16
- data/lib/recurrence/version.rb +1 -1
- data/spec/recurrence_spec.rb +63 -0
- metadata +3 -3
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
recurrence (0.
|
5
|
-
activesupport
|
4
|
+
recurrence (1.0.0)
|
5
|
+
activesupport
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
@@ -36,7 +36,7 @@ PLATFORMS
|
|
36
36
|
ruby
|
37
37
|
|
38
38
|
DEPENDENCIES
|
39
|
-
activesupport
|
39
|
+
activesupport
|
40
40
|
recurrence!
|
41
41
|
rspec (>= 2.0.0)
|
42
42
|
ruby-debug19
|
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -14,6 +14,7 @@ A simple library to handle recurring events.
|
|
14
14
|
# Daily
|
15
15
|
r = Recurrence.new(:every => :day)
|
16
16
|
r = Recurrence.new(:every => :day, :interval => 9)
|
17
|
+
r = Recurrence.new(:every => :day, :repeat => 7)
|
17
18
|
r = Recurrence.daily(options = {})
|
18
19
|
|
19
20
|
# Weekly
|
@@ -22,6 +23,7 @@ A simple library to handle recurring events.
|
|
22
23
|
r = Recurrence.new(:every => :week, :on => [:monday, :friday])
|
23
24
|
r = Recurrence.new(:every => :week, :on => [:monday, :wednesday, :friday])
|
24
25
|
r = Recurrence.new(:every => :week, :on => :friday, :interval => 2)
|
26
|
+
r = Recurrence.new(:every => :week, :on => :friday, :repeat => 4)
|
25
27
|
r = Recurrence.weekly(:on => :thursday)
|
26
28
|
|
27
29
|
# Monthly by month day
|
@@ -30,6 +32,7 @@ A simple library to handle recurring events.
|
|
30
32
|
r = Recurrence.new(:every => :month, :on => 7, :interval => 2)
|
31
33
|
r = Recurrence.new(:every => :month, :on => 7, :interval => :monthly)
|
32
34
|
r = Recurrence.new(:every => :month, :on => 7, :interval => :bimonthly)
|
35
|
+
r = Recurrence.new(:every => :month, :on => 7, :repeat => 6)
|
33
36
|
r = Recurrence.monthly(:on => 31)
|
34
37
|
|
35
38
|
# Monthly by week day
|
@@ -39,12 +42,14 @@ A simple library to handle recurring events.
|
|
39
42
|
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => 2)
|
40
43
|
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :quarterly)
|
41
44
|
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :interval => :semesterly)
|
45
|
+
r = Recurrence.new(:every => :month, :on => :last, :weekday => :friday, :repeat => 3)
|
42
46
|
|
43
47
|
# Yearly
|
44
48
|
r = Recurrence.new(:every => :year, :on => [7, 4]) # => [month, day]
|
45
49
|
r = Recurrence.new(:every => :year, :on => [10, 31], :interval => 3)
|
46
50
|
r = Recurrence.new(:every => :year, :on => [:jan, 31])
|
47
51
|
r = Recurrence.new(:every => :year, :on => [:january, 31])
|
52
|
+
r = Recurrence.new(:every => :year, :on => [10, 31], :repeat => 3)
|
48
53
|
r = Recurrence.yearly(:on => [:january, 31])
|
49
54
|
|
50
55
|
# Limit recurrence
|
@@ -99,6 +104,7 @@ If you're using Rails/Bundler or something like that, remember to override the <
|
|
99
104
|
|
100
105
|
* José Valim (http://plataformatec.com.br)
|
101
106
|
* Maxim Chernyak (http://mediumexposure.com)
|
107
|
+
* Ricardo H. (https://github.com/ricardohsd)
|
102
108
|
|
103
109
|
== License
|
104
110
|
|
@@ -3,11 +3,19 @@ module SimplesIdeias
|
|
3
3
|
module Event # :nodoc: all
|
4
4
|
class Base
|
5
5
|
CARDINALS = %w(first second third fourth fifth)
|
6
|
-
|
6
|
+
WEEKDAYS = {
|
7
|
+
"sun" => 0, "sunday" => 0,
|
8
|
+
"mon" => 1, "monday" => 1,
|
9
|
+
"tue" => 2, "tuesday" => 2,
|
10
|
+
"wed" => 3, "wednesday" => 3,
|
11
|
+
"thu" => 4, "thursday" => 4,
|
12
|
+
"fri" => 5, "friday" => 5,
|
13
|
+
"sat" => 6, "saturday" => 6
|
14
|
+
}
|
7
15
|
|
8
16
|
attr_accessor :start_date
|
9
17
|
|
10
|
-
def initialize(options={})
|
18
|
+
def initialize(options = {})
|
11
19
|
every, options = nil, every if every.kind_of?(Hash)
|
12
20
|
|
13
21
|
@options = options
|
@@ -16,6 +24,7 @@ module SimplesIdeias
|
|
16
24
|
|
17
25
|
validate
|
18
26
|
raise ArgumentError, "interval should be greater than zero" if @options[:interval] <= 0
|
27
|
+
raise ArgumentError, "repeat should be greater than zero" if !@options[:repeat].nil? && @options[:repeat] <= 0
|
19
28
|
|
20
29
|
prepare!
|
21
30
|
end
|
@@ -72,8 +81,9 @@ module SimplesIdeias
|
|
72
81
|
raise ArgumentError, "invalid day #{value}" unless (0..6).include?(value)
|
73
82
|
value
|
74
83
|
else
|
75
|
-
|
76
|
-
|
84
|
+
weekday = WEEKDAYS[value.to_s]
|
85
|
+
raise ArgumentError, "invalid weekday #{value}" unless weekday
|
86
|
+
weekday
|
77
87
|
end
|
78
88
|
end
|
79
89
|
end
|
@@ -42,7 +42,7 @@ module SimplesIdeias
|
|
42
42
|
def advance_to_year(date, interval=@options[:interval])
|
43
43
|
next_year = date.year + interval
|
44
44
|
next_month = @options[:on].first
|
45
|
-
next_day = [
|
45
|
+
next_day = [@options[:on].last, Time.days_in_month(next_month, next_year)].min
|
46
46
|
|
47
47
|
Date.new(next_year, next_month, next_day)
|
48
48
|
end
|
data/lib/recurrence/namespace.rb
CHANGED
@@ -69,6 +69,7 @@ module SimplesIdeias
|
|
69
69
|
# Recurrence.daily(:interval => 2) #=> every 2 days
|
70
70
|
# Recurrence.daily(:starts => 3.days.from_now)
|
71
71
|
# Recurrence.daily(:until => 10.days.from_now)
|
72
|
+
# Recurrence.daily(:repeat => 5)
|
72
73
|
#
|
73
74
|
def self.daily(options = {})
|
74
75
|
options[:every] = :day
|
@@ -81,6 +82,7 @@ module SimplesIdeias
|
|
81
82
|
# Recurrence.weekly(:on => :saturday)
|
82
83
|
# Recurrence.weekly(:on => [sunday, :saturday])
|
83
84
|
# Recurrence.weekly(:on => :saturday, :interval => 2)
|
85
|
+
# Recurrence.weekly(:on => :saturday, :repeat => 5)
|
84
86
|
#
|
85
87
|
def self.weekly(options = {})
|
86
88
|
options[:every] = :week
|
@@ -101,6 +103,12 @@ module SimplesIdeias
|
|
101
103
|
# Recurrence.monthly(:on => 15, :interval => :bimonthly)
|
102
104
|
# Recurrence.monthly(:on => 15, :interval => :quarterly)
|
103
105
|
# Recurrence.monthly(:on => 15, :interval => :semesterly)
|
106
|
+
# Recurrence.monthly(:on => 15, :repeat => 5)
|
107
|
+
#
|
108
|
+
# The <tt>:on</tt> option can be one of the following:
|
109
|
+
#
|
110
|
+
# * :sunday, :monday, :tuesday, :wednesday, :thursday, :friday, :saturday
|
111
|
+
# * :sun, :mon, :tue, :wed, :thu, :fri, :sat
|
104
112
|
#
|
105
113
|
def self.monthly(options = {})
|
106
114
|
options[:every] = :month
|
@@ -113,6 +121,7 @@ module SimplesIdeias
|
|
113
121
|
# Recurrence.yearly(:on => [7, 14], :interval => 2) #=> every 2 years on Jul 14
|
114
122
|
# Recurrence.yearly(:on => [:jan, 14], :interval => 2)
|
115
123
|
# Recurrence.yearly(:on => [:january, 14], :interval => 2)
|
124
|
+
# Recurrence.yearly(:on => [:january, 14], :repeat => 5)
|
116
125
|
#
|
117
126
|
def self.yearly(options = {})
|
118
127
|
options[:every] = :year
|
@@ -133,18 +142,18 @@ module SimplesIdeias
|
|
133
142
|
raise ArgumentError, "invalid :every option" unless FREQUENCY.include?(options[:every].to_s)
|
134
143
|
|
135
144
|
@options = options
|
136
|
-
@
|
137
|
-
@
|
145
|
+
@_options = initialize_dates(options.dup)
|
146
|
+
@_options[:interval] ||= 1
|
138
147
|
|
139
|
-
@event = case @
|
148
|
+
@event = case @_options[:every].to_sym
|
140
149
|
when :day
|
141
|
-
Event::Daily.new(@
|
150
|
+
Event::Daily.new(@_options)
|
142
151
|
when :week
|
143
|
-
Event::Weekly.new(@
|
152
|
+
Event::Weekly.new(@_options)
|
144
153
|
when :month
|
145
|
-
Event::Monthly.new(@
|
154
|
+
Event::Monthly.new(@_options)
|
146
155
|
when :year
|
147
|
-
Event::Yearly.new(@
|
156
|
+
Event::Yearly.new(@_options)
|
148
157
|
end
|
149
158
|
end
|
150
159
|
|
@@ -163,7 +172,7 @@ module SimplesIdeias
|
|
163
172
|
def include?(required_date)
|
164
173
|
required_date = as_date(required_date)
|
165
174
|
|
166
|
-
if required_date < @
|
175
|
+
if required_date < @_options[:starts] || required_date > @_options[:until]
|
167
176
|
false
|
168
177
|
else
|
169
178
|
each do |date|
|
@@ -213,25 +222,25 @@ module SimplesIdeias
|
|
213
222
|
def events(options={})
|
214
223
|
options[:starts] = as_date(options[:starts])
|
215
224
|
options[:until] = as_date(options[:until])
|
225
|
+
options[:repeat] ||= @options[:repeat]
|
216
226
|
|
217
227
|
reset! if options[:starts] || options[:until]
|
218
228
|
|
219
|
-
@events ||=
|
220
|
-
_events = []
|
221
|
-
|
229
|
+
@events ||= Array.new.tap do |list|
|
222
230
|
loop do
|
223
231
|
date = @event.next!
|
224
232
|
|
225
|
-
break
|
233
|
+
break unless date
|
226
234
|
|
227
235
|
valid_start = options[:starts].nil? || date >= options[:starts]
|
228
236
|
valid_until = options[:until].nil? || date <= options[:until]
|
229
|
-
|
237
|
+
list << date if valid_start && valid_until
|
230
238
|
|
231
|
-
|
232
|
-
|
239
|
+
stop_repeat = options[:repeat] && list.size == options[:repeat]
|
240
|
+
stop_until = options[:until] && options[:until] <= date
|
233
241
|
|
234
|
-
|
242
|
+
break if stop_until || stop_repeat
|
243
|
+
end
|
235
244
|
end
|
236
245
|
end
|
237
246
|
|
data/lib/recurrence/version.rb
CHANGED
data/spec/recurrence_spec.rb
CHANGED
@@ -13,6 +13,10 @@ describe Recurrence do
|
|
13
13
|
expect { recurrence(:every => :day, :interval => 0) }.to raise_error(ArgumentError)
|
14
14
|
end
|
15
15
|
|
16
|
+
it "should require :repeat to be greater than zero when provided" do
|
17
|
+
expect { recurrence(:every => :day, :repeat => 0) }.to raise_error(ArgumentError)
|
18
|
+
end
|
19
|
+
|
16
20
|
it "should return an enumerator when Recurrence#each is called without a block" do
|
17
21
|
recurrence(:every => :day).each.should be_instance_of(Enumerator)
|
18
22
|
end
|
@@ -123,6 +127,11 @@ describe Recurrence do
|
|
123
127
|
@recurrence.events[2].to_s.should == "2008-09-25"
|
124
128
|
end
|
125
129
|
|
130
|
+
it "should use repeat" do
|
131
|
+
@recurrence = recurrence(:every => :day, :starts => "2008-09-21", :repeat => 10)
|
132
|
+
@recurrence.events.size.should == 10
|
133
|
+
end
|
134
|
+
|
126
135
|
it "should have a lacking day if the interval does not match the last day" do
|
127
136
|
@recurrence = recurrence(
|
128
137
|
:every => :day,
|
@@ -192,6 +201,18 @@ describe Recurrence do
|
|
192
201
|
@recurrence.events[6].to_s.should == "2008-12-14"
|
193
202
|
end
|
194
203
|
|
204
|
+
it "should use repeat" do
|
205
|
+
starts = Date.parse("2008-09-21")
|
206
|
+
@recurrence = recurrence(
|
207
|
+
:every => :week,
|
208
|
+
:on => starts.wday,
|
209
|
+
:starts => starts,
|
210
|
+
:until => "2011-01-01",
|
211
|
+
:repeat => 5
|
212
|
+
)
|
213
|
+
@recurrence.events.size.should == 5
|
214
|
+
end
|
215
|
+
|
195
216
|
it "should occur several times per week" do
|
196
217
|
starts = Date.parse("2008-09-21") #=> sunday
|
197
218
|
@recurrence = recurrence(
|
@@ -328,6 +349,18 @@ describe Recurrence do
|
|
328
349
|
@recurrence.events[2].to_s.should == "2008-10-31"
|
329
350
|
@recurrence.events[3].to_s.should == "2009-02-28"
|
330
351
|
end
|
352
|
+
|
353
|
+
it "should use repeat" do
|
354
|
+
starts = Date.parse("2008-01-31")
|
355
|
+
@recurrence = recurrence(
|
356
|
+
:every => :month,
|
357
|
+
:on => 31,
|
358
|
+
:starts => starts,
|
359
|
+
:until => "2010-01-01",
|
360
|
+
:repeat => 5
|
361
|
+
)
|
362
|
+
@recurrence.events.size.should == 5
|
363
|
+
end
|
331
364
|
end
|
332
365
|
|
333
366
|
context "using weekday" do
|
@@ -336,6 +369,11 @@ describe Recurrence do
|
|
336
369
|
@recurrence.events[-1].should == Date.parse("2037-12-31")
|
337
370
|
end
|
338
371
|
|
372
|
+
it "should use weekday shortcut" do
|
373
|
+
@recurrence = Recurrence.daily(:on => 5, :weekday => :thu)
|
374
|
+
@recurrence.events[-1].should == Date.parse("2037-12-31")
|
375
|
+
end
|
376
|
+
|
339
377
|
it "should repeat until 8 months from now" do
|
340
378
|
date = 8.months.from_now
|
341
379
|
week = (date.day - 1) / 7 + 1
|
@@ -408,6 +446,19 @@ describe Recurrence do
|
|
408
446
|
@recurrence.events[5].to_s.should == "2009-11-15"
|
409
447
|
@recurrence.events[6].to_s.should == "2010-01-17"
|
410
448
|
end
|
449
|
+
|
450
|
+
it "should use repeat" do
|
451
|
+
starts = Date.parse("2009-01-01")
|
452
|
+
@recurrence = recurrence(
|
453
|
+
:every => :month,
|
454
|
+
:on => :third,
|
455
|
+
:weekday => :sunday,
|
456
|
+
:starts => starts,
|
457
|
+
:until => "2011-02-01",
|
458
|
+
:repeat => 5
|
459
|
+
)
|
460
|
+
@recurrence.events.size.should == 5
|
461
|
+
end
|
411
462
|
end
|
412
463
|
|
413
464
|
context "using interval" do
|
@@ -519,6 +570,18 @@ describe Recurrence do
|
|
519
570
|
@recurrence.events[3].to_s.should == "2014-09-21"
|
520
571
|
end
|
521
572
|
|
573
|
+
it "should use repeat" do
|
574
|
+
starts = Date.parse("2008-09-21")
|
575
|
+
|
576
|
+
@recurrence = recurrence(
|
577
|
+
:every => :year,
|
578
|
+
:on => [starts.month, starts.day],
|
579
|
+
:starts => starts,
|
580
|
+
:repeat => 5
|
581
|
+
)
|
582
|
+
@recurrence.events.size.should == 5
|
583
|
+
end
|
584
|
+
|
522
585
|
it "should run until next available date when chosen settings are greater than start date" do
|
523
586
|
starts = Date.parse("2008-09-03")
|
524
587
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 1.0.
|
8
|
+
- 1
|
9
|
+
version: 1.0.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nando Vieira
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-11-
|
17
|
+
date: 2010-11-19 00:00:00 -02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|