Skip to content

Commit b3042c6

Browse files
committed
update PR from feedback
rebased against master -- its been 4 years
1 parent 115d5a8 commit b3042c6

File tree

6 files changed

+38
-80
lines changed

6 files changed

+38
-80
lines changed

.gitignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,5 @@
88
/spec/reports/
99
/tmp/
1010

11-
# rubymine
12-
.idea
13-
1411
# rspec failure tracking
1512
.rspec_status

lib/ice_cube/time_util.rb

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -195,36 +195,6 @@ def self.which_occurrence_in_month(time, wday)
195195
[nth_occurrence_of_weekday, this_weekday_in_month_count]
196196
end
197197

198-
# Use Activesupport CoreExt functions to manipulate time
199-
def self.start_of_month time
200-
time.beginning_of_month
201-
end
202-
203-
# Use Activesupport CoreExt functions to manipulate time
204-
def self.end_of_month time
205-
time.end_of_month
206-
end
207-
208-
# Use Activesupport CoreExt functions to manipulate time
209-
def self.start_of_year time
210-
time.beginning_of_year
211-
end
212-
213-
# Use Activesupport CoreExt functions to manipulate time
214-
def self.end_of_year time
215-
time.end_of_year
216-
end
217-
218-
# Use Activesupport CoreExt functions to manipulate time
219-
def self.previous_month time
220-
time - 1.month
221-
end
222-
223-
# Use Activesupport CoreExt functions to manipulate time
224-
def self.previous_year time
225-
time - 1.year
226-
end
227-
228198
# Get the days in the month for +time
229199
def self.days_in_month(time)
230200
date = Date.new(time.year, time.month, 1)

lib/ice_cube/validations/monthly_by_set_pos.rb

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
11
module IceCube
22

33
module Validations::MonthlyBySetPos
4-
54
def by_set_pos(*by_set_pos)
6-
return by_set_pos([by_set_pos]) if by_set_pos.is_a?(Integer)
7-
8-
unless by_set_pos.nil? || by_set_pos.is_a?(Array)
9-
raise ArgumentError, "Expecting Array or nil value for count, got #{by_set_pos.inspect}"
10-
end
115
by_set_pos.flatten!
126
by_set_pos.each do |set_pos|
13-
unless (set_pos >= -366 && set_pos <= -1) ||
14-
(set_pos <= 366 && set_pos >= 1)
7+
unless (-366..366).include?(set_pos) && set_pos != 0
158
raise ArgumentError, "Expecting number in [-366, -1] or [1, 366], got #{set_pos} (#{by_set_pos})"
169
end
1710
end
1811

1912
@by_set_pos = by_set_pos
20-
replace_validations_for(:by_set_pos, by_set_pos && [Validation.new(by_set_pos, self)])
13+
replace_validations_for(:by_set_pos, [Validation.new(by_set_pos, self)])
2114
self
2215
end
2316

@@ -26,7 +19,6 @@ class Validation
2619
attr_reader :rule, :by_set_pos
2720

2821
def initialize(by_set_pos, rule)
29-
3022
@by_set_pos = by_set_pos
3123
@rule = rule
3224
end
@@ -40,12 +32,11 @@ def dst_adjust?
4032
end
4133

4234
def validate(step_time, schedule)
43-
start_of_month = TimeUtil.start_of_month step_time
44-
end_of_month = TimeUtil.end_of_month step_time
45-
35+
start_of_month = step_time.beginning_of_month
36+
end_of_month = step_time.end_of_month
4637

47-
new_schedule = IceCube::Schedule.new(TimeUtil.previous_month(step_time)) do |s|
48-
s.add_recurrence_rule IceCube::Rule.from_hash(rule.to_hash.reject{|k, v| [:by_set_pos, :count, :until].include? k})
38+
new_schedule = IceCube::Schedule.new(step_time - 1.month) do |s|
39+
s.add_recurrence_rule(IceCube::Rule.from_hash(rule.to_hash.except(:by_set_pos, :count, :util)))
4940
end
5041

5142
occurrences = new_schedule.occurrences_between(start_of_month, end_of_month)
@@ -64,7 +55,6 @@ def validate(step_time, schedule)
6455
end
6556
end
6657

67-
6858
def build_s(builder)
6959
builder.piece(:by_set_pos) << by_set_pos
7060
end

lib/ice_cube/validations/yearly_by_set_pos.rb

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,15 @@ module IceCube
33
module Validations::YearlyBySetPos
44

55
def by_set_pos(*by_set_pos)
6-
return by_set_pos([by_set_pos]) if by_set_pos.is_a?(Integer)
7-
8-
unless by_set_pos.nil? || by_set_pos.is_a?(Array)
9-
raise ArgumentError, "Expecting Array or nil value for count, got #{by_set_pos.inspect}"
10-
end
116
by_set_pos.flatten!
127
by_set_pos.each do |set_pos|
13-
unless (set_pos >= -366 && set_pos <= -1) ||
14-
(set_pos <= 366 && set_pos >= 1)
8+
unless (-366..366).include?(set_pos) && set_pos != 0
159
raise ArgumentError, "Expecting number in [-366, -1] or [1, 366], got #{set_pos} (#{by_set_pos})"
1610
end
1711
end
1812

1913
@by_set_pos = by_set_pos
20-
replace_validations_for(:by_set_pos, by_set_pos && [Validation.new(by_set_pos, self)])
14+
replace_validations_for(:by_set_pos, [Validation.new(by_set_pos, self)])
2115
self
2216
end
2317

@@ -40,12 +34,11 @@ def dst_adjust?
4034
end
4135

4236
def validate(step_time, schedule)
43-
start_of_year = TimeUtil.start_of_year step_time
44-
end_of_year = TimeUtil.end_of_year step_time
45-
37+
start_of_year = step_time.beginning_of_year
38+
end_of_year = step_time.end_of_year
4639

47-
new_schedule = IceCube::Schedule.new(TimeUtil.previous_year(step_time)) do |s|
48-
s.add_recurrence_rule IceCube::Rule.from_hash(rule.to_hash.reject{|k, v| [:by_set_pos, :count, :until].include? k})
40+
new_schedule = IceCube::Schedule.new(step_time - 1.year) do |s|
41+
s.add_recurrence_rule(IceCube::Rule.from_hash(rule.to_hash.except(:by_set_pos, :count, :util)))
4942
end
5043

5144
occurrences = new_schedule.occurrences_between(start_of_year, end_of_year)
@@ -63,12 +56,8 @@ def validate(step_time, schedule)
6356
1
6457
end
6558
end
66-
67-
68-
6959
end
7060

71-
7261
def build_s(builder)
7362
builder.piece(:by_set_pos) << by_set_pos
7463
end
@@ -83,7 +72,5 @@ def build_ical(builder)
8372

8473
nil
8574
end
86-
8775
end
88-
8976
end

spec/examples/by_set_pos_spec.rb

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
require File.dirname(__FILE__) + '/../spec_helper'
22

33
module IceCube
4-
54
describe MonthlyRule, 'BYSETPOS' do
65
it 'should behave correctly' do
76
schedule = IceCube::Schedule.from_ical "RRULE:FREQ=MONTHLY;COUNT=4;BYDAY=WE;BYSETPOS=4"
87
schedule.start_time = Time.new(2015, 5, 28, 12, 0, 0)
9-
expect(schedule.occurrences_between(Time.new(2015, 01, 01), Time.new(2017, 01, 01))).to eq([
10-
Time.new(2015,6,24,12,0,0),
11-
Time.new(2015,7,22,12,0,0),
12-
Time.new(2015,8,26,12,0,0),
13-
Time.new(2015,9,23,12,0,0)
14-
])
8+
expect(schedule.occurrences_between(Time.new(2015, 01, 01), Time.new(2017, 01, 01))).
9+
to eq([
10+
Time.new(2015,6,24,12,0,0),
11+
Time.new(2015,7,22,12,0,0),
12+
Time.new(2015,8,26,12,0,0),
13+
Time.new(2015,9,23,12,0,0)
14+
])
1515
end
16-
1716
end
1817

1918
describe YearlyRule, 'BYSETPOS' do
2019
it 'should behave correctly' do
2120
schedule = IceCube::Schedule.from_ical "RRULE:FREQ=YEARLY;BYMONTH=7;BYDAY=SU,MO,TU,WE,TH,FR,SA;BYSETPOS=-1"
2221
schedule.start_time = Time.new(1966,7,5)
23-
expect(schedule.occurrences_between(Time.new(2015, 01, 01), Time.new(2017, 01, 01))).to eq([
24-
Time.new(2015, 7, 31),
25-
Time.new(2016, 7, 31)
26-
])
22+
expect(schedule.occurrences_between(Time.new(2015, 01, 01), Time.new(2017, 01, 01))).
23+
to eq([
24+
Time.new(2015, 7, 31),
25+
Time.new(2016, 7, 31)
26+
])
2727
end
2828
end
2929
end

spec/examples/from_ical_spec.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,20 @@ module IceCube
8989
expect(rule).to eq(IceCube::Rule.monthly.day(:monday, :wednesday).by_set_pos([-1, 1]))
9090
end
9191

92+
it 'should raise when by_set_pos is out of range (BYSETPOS)' do
93+
expect {
94+
IceCube::Rule.from_ical("FREQ=MONTHLY;BYDAY=MO,WE;BYSETPOS=-367")
95+
}.to raise_error(/Expecting number in \[-366, -1\] or \[1, 366\]/)
96+
97+
expect {
98+
IceCube::Rule.from_ical("FREQ=MONTHLY;BYDAY=MO,WE;BYSETPOS=367")
99+
}.to raise_error(/Expecting number in \[-366, -1\] or \[1, 366\]/)
100+
101+
expect {
102+
IceCube::Rule.from_ical("FREQ=MONTHLY;BYDAY=MO,WE;BYSETPOS=0")
103+
}.to raise_error(/Expecting number in \[-366, -1\] or \[1, 366\]/)
104+
end
105+
92106
it 'should return no occurrences after daily interval with count is over' do
93107
schedule = IceCube::Schedule.new(Time.now)
94108
schedule.add_recurrence_rule(IceCube::Rule.from_ical("FREQ=DAILY;COUNT=5"))

0 commit comments

Comments
 (0)