dgp-schedule_attributes 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +4 -0
- data/.rspec +1 -0
- data/.travis.yml +28 -0
- data/Appraisals +21 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +63 -0
- data/README.markdown +78 -0
- data/Rakefile +7 -0
- data/gemfiles/rails_3.2.gemfile +8 -0
- data/gemfiles/rails_3.2.gemfile.lock +112 -0
- data/gemfiles/rails_4.0.gemfile +7 -0
- data/gemfiles/rails_4.0.gemfile.lock +76 -0
- data/gemfiles/rails_4.1.gemfile +7 -0
- data/gemfiles/rails_4.1.gemfile.lock +75 -0
- data/gemfiles/rails_4.2.gemfile +7 -0
- data/gemfiles/rails_4.2.gemfile.lock +75 -0
- data/gemfiles/rails_edge.gemfile +8 -0
- data/gemfiles/rails_edge.gemfile.lock +83 -0
- data/lib/schedule_attributes.rb +18 -0
- data/lib/schedule_attributes/active_record.rb +50 -0
- data/lib/schedule_attributes/configuration.rb +22 -0
- data/lib/schedule_attributes/core.rb +146 -0
- data/lib/schedule_attributes/extensions/ice_cube.rb +11 -0
- data/lib/schedule_attributes/form_builder.rb +42 -0
- data/lib/schedule_attributes/input.rb +159 -0
- data/lib/schedule_attributes/model.rb +24 -0
- data/lib/schedule_attributes/railtie.rb +13 -0
- data/lib/schedule_attributes/rule_parser.rb +25 -0
- data/lib/schedule_attributes/rule_parser/base.rb +96 -0
- data/lib/schedule_attributes/rule_parser/day.rb +13 -0
- data/lib/schedule_attributes/rule_parser/month.rb +40 -0
- data/lib/schedule_attributes/rule_parser/week.rb +18 -0
- data/lib/schedule_attributes/rule_parser/year.rb +21 -0
- data/lib/schedule_attributes/serializer.rb +30 -0
- data/lib/schedule_attributes/time_helpers.rb +36 -0
- data/lib/schedule_attributes/version.rb +3 -0
- data/schedule_attributes.gemspec +32 -0
- data/spec/active_record_integration_spec.rb +57 -0
- data/spec/schedule_attributes/configuration_spec.rb +29 -0
- data/spec/schedule_attributes/input_spec.rb +182 -0
- data/spec/schedule_attributes/rule_parser/day_spec.rb +113 -0
- data/spec/schedule_attributes/rule_parser/month_spec.rb +47 -0
- data/spec/schedule_attributes/rule_parser/week_spec.rb +36 -0
- data/spec/schedule_attributes/rule_parser/year_spec.rb +53 -0
- data/spec/schedule_attributes/rule_parser_spec.rb +18 -0
- data/spec/schedule_attributes/time_helpers_spec.rb +39 -0
- data/spec/schedule_attributes_spec.rb +226 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/parser_macros.rb +31 -0
- data/spec/support/scheduled_active_record_model.rb +39 -0
- data/spec/support/scheduled_model.rb +16 -0
- metadata +234 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
module ScheduleAttributes
|
2
|
+
module TimeHelpers
|
3
|
+
def self.parse_in_zone(str)
|
4
|
+
if Time.respond_to?(:zone) && Time.zone
|
5
|
+
# Rails 4.1 removes Date.to_time_in_current_zone in favour of Date.in_time_zone
|
6
|
+
if str.respond_to?(:in_time_zone)
|
7
|
+
str.in_time_zone
|
8
|
+
else
|
9
|
+
str.is_a?(Date) ? str.to_time_in_current_zone : Time.zone.parse(str)
|
10
|
+
end
|
11
|
+
else
|
12
|
+
str.is_a?(Time) ? str : Time.parse(str)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.today
|
17
|
+
if Time.respond_to?(:zone) && Time.zone
|
18
|
+
# Rails 4.1 removes Date.to_time_in_current_zone in favour of Date.in_time_zone
|
19
|
+
current_date = Date.current
|
20
|
+
current_date.respond_to?(:in_time_zone) ? current_date.in_time_zone : current_date.to_time_in_current_zone
|
21
|
+
else
|
22
|
+
Date.today.to_time
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module DateHelpers
|
28
|
+
def self.today
|
29
|
+
if Time.respond_to?(:zone) && Time.zone
|
30
|
+
Date.current
|
31
|
+
else
|
32
|
+
Date.today
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "schedule_attributes/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "dgp-schedule_attributes"
|
7
|
+
s.version = ScheduleAttributes::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["David Gil"]
|
10
|
+
s.email = ["dgilperez@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/dgilperez/schedule_attributes"
|
12
|
+
s.summary = %q{Handle form inputs for IceCube schedules}
|
13
|
+
s.description = %q{Converts to/from date & time inputs for managing scheduled models.}
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_dependency 'ice_cube', '~> 0.13'
|
21
|
+
s.add_dependency 'activesupport', '>= 3.2'
|
22
|
+
s.add_dependency 'tzinfo' # this should be an activesupport dependency!
|
23
|
+
|
24
|
+
# s.add_runtime_dependency 'railties', '>= 3.2'
|
25
|
+
|
26
|
+
s.add_development_dependency 'rake'
|
27
|
+
s.add_development_dependency 'rspec', '~> 2.99'
|
28
|
+
s.add_development_dependency 'pry'
|
29
|
+
s.add_development_dependency 'activerecord', '>= 3.2'
|
30
|
+
s.add_development_dependency 'sqlite3'
|
31
|
+
s.add_development_dependency 'appraisal'
|
32
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'support/scheduled_active_record_model'
|
3
|
+
|
4
|
+
describe CustomScheduledActiveRecordModel do
|
5
|
+
it "should have a default schedule" do
|
6
|
+
subject.my_schedule.should == hourly
|
7
|
+
end
|
8
|
+
|
9
|
+
def hourly
|
10
|
+
IceCube::Schedule.new(Date.today.to_time).tap { |s|
|
11
|
+
s.add_recurrence_rule IceCube::Rule.hourly
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe DefaultScheduledActiveRecordModel do
|
17
|
+
alias :model :subject
|
18
|
+
|
19
|
+
it "should have a default schedule" do
|
20
|
+
subject.schedule.should be_a IceCube::Schedule
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
describe "schedule_attributes" do
|
25
|
+
it "round-trips a schedule from the database" do
|
26
|
+
model.schedule_attributes = {
|
27
|
+
"repeat"=>"1", "date"=>"",
|
28
|
+
"start_date"=>"2013-02-26", "start_time"=>"",
|
29
|
+
"end_date"=>"2016-07-07", "end_time"=>"",
|
30
|
+
"ordinal_day"=>"1", "interval"=>"3",
|
31
|
+
"ordinal_week"=>"1", "interval_unit"=>"day",
|
32
|
+
"sunday"=>"0", "monday"=>"0", "tuesday"=>"0", "wednesday"=>"0",
|
33
|
+
"thursday"=>"0", "friday"=>"0", "saturday"=>"0"
|
34
|
+
}
|
35
|
+
expected = IceCube::Schedule.new(Time.local(2013, 2, 26)) do |s|
|
36
|
+
s.rrule IceCube::Rule.daily(3).until(Time.local(2016, 7, 7))
|
37
|
+
end
|
38
|
+
model.schedule.should == expected
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should deal with all_occurrences with no infinite loops" do
|
42
|
+
model.schedule_attributes = {
|
43
|
+
repeat: 1, interval: 7, interval_unit: "day",
|
44
|
+
start_date: "11/03/2000", end_date: "11/04/2000",
|
45
|
+
all_day: true
|
46
|
+
}
|
47
|
+
schedule = model.schedule
|
48
|
+
|
49
|
+
# Calling schedule_attributes should not change Schedule::Rule.
|
50
|
+
model.schedule_attributes
|
51
|
+
|
52
|
+
model.schedule.should == schedule
|
53
|
+
model.schedule.all_occurrences.size.should == 5
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'schedule_attributes/configuration'
|
3
|
+
|
4
|
+
describe "ScheduleAttributes" do
|
5
|
+
describe ".configure" do
|
6
|
+
it "yields a configuration instance" do
|
7
|
+
ScheduleAttributes.configure do |config|
|
8
|
+
config.should be_a ScheduleAttributes::Configuration
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns a configuration instance" do
|
13
|
+
ScheduleAttributes.configure.should be_a ScheduleAttributes::Configuration
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe ScheduleAttributes::Configuration do
|
19
|
+
describe ".time_format" do
|
20
|
+
it "has a default" do
|
21
|
+
subject.time_format.should == '%H:%M'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "is settable" do
|
25
|
+
subject.time_format = '%l:%M %P'
|
26
|
+
subject.time_format.should == '%l:%M %P'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'schedule_attributes/input'
|
3
|
+
|
4
|
+
describe ScheduleAttributes::Input do
|
5
|
+
let(:input) { described_class.new(RSpec.current_example.metadata[:args]) }
|
6
|
+
|
7
|
+
describe "#repeat?" do
|
8
|
+
subject(:repeat) { input.repeat? }
|
9
|
+
|
10
|
+
context 'no arguments', args: {} do
|
11
|
+
it { should be true }
|
12
|
+
end
|
13
|
+
|
14
|
+
[0, '0', 'false', 'f', 'F', 'no', 'none'].each do |cond|
|
15
|
+
context 'false', args: {repeat: cond} do
|
16
|
+
it { should be false }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
[1, '1', 'true', 't', 'T', 'yes', 'whatever'].each do |cond|
|
21
|
+
context 'true', args: {repeat: cond} do
|
22
|
+
it { should be true }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "#start_time" do
|
28
|
+
subject(:start_time) { input.start_time }
|
29
|
+
|
30
|
+
context 'no arguments', args: {} do
|
31
|
+
it { should be nil }
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'date argument', args: {date: '2000-12-31'} do
|
35
|
+
it { should == Time.new(2000,12,31,0,0,0) }
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'start_date argument', args: {start_date: '2000-12-31'} do
|
39
|
+
it { should == Time.new(2000,12,31,0,0,0) }
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'date and start_date arguments', args: {date: '2000-06-06', start_date: '2000-12-31'} do
|
43
|
+
it { should == Time.new(2000,12,31,0,0,0) }
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'both dates and repeat arguments', args: {repeat: '0', date: '2000-06-06', start_date: '2000-12-31'} do
|
47
|
+
it "uses date instead of start_date when not repeating" do
|
48
|
+
should == Time.new(2000,6,6,0,0,0)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'start_date and start_time arguments', args: {start_date: '2000-12-31', start_time: '14:30'} do
|
53
|
+
it "combines start_date and start_time" do
|
54
|
+
should == Time.new(2000,12,31,14,30,0)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'start_time argument', args: {start_time: '14:00'} do
|
59
|
+
it { should == Date.today.to_time + 14.hours }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#end_time" do
|
64
|
+
subject(:end_time) { input.end_time }
|
65
|
+
|
66
|
+
context 'no arguments', args: {} do
|
67
|
+
it { should be nil }
|
68
|
+
end
|
69
|
+
|
70
|
+
context 'end_time argument', args: {end_time: '14:00'} do
|
71
|
+
it { should == Date.today.to_time + 14.hours }
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'start_date and end_time arguments', args: {start_date: '2000-12-31', end_time: '14:00'} do
|
75
|
+
it { should == Time.new(2000,12,31,14,0,0) }
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'start_date, end_date and end_time arguments', args: {start_date: '2000-06-06', end_date: '2000-12-31', end_time: '14:00'} do
|
79
|
+
it { should == Time.new(2000,6,6,14,0,0) }
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'date and end_time arguments', args: {date: '2000-12-31', end_time: '14:00'} do
|
83
|
+
it { should == Time.new(2000,12,31,14,0,0) }
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'start_date and _time and end_date and _time arguments', args: {start_date: '2000-06-06', end_date: '2000-12-31', start_time: '06:00', end_time: '14:00'} do
|
87
|
+
it { should == Time.new(2000,6,6,14,0,0) }
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'start_date and _time and end_date and _time arguments, 24h format', args: {start_date: '2000-06-06', end_date: '2000-12-31', start_time: '20:00', end_time: '14:00'} do
|
91
|
+
it { should == Time.new(2000,6,7,14,0,0) }
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "#duration" do
|
96
|
+
subject(:duration) { input.duration }
|
97
|
+
|
98
|
+
context 'no arguments', args: {} do
|
99
|
+
it { should be nil }
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'start_time argument', args: {start_time: '8:00'} do
|
103
|
+
it { should be nil }
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'start_time and end_time arguments', args: {start_time: '8:00', end_time: '14:00'} do
|
107
|
+
it { should == 6.hours }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "#dates" do
|
112
|
+
subject(:dates) { input.dates }
|
113
|
+
|
114
|
+
context 'no arguments', args: {} do
|
115
|
+
it { should == [] }
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'repeat argument', args: {repeat: '0'} do
|
119
|
+
it { should == [] }
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'start_date argument', args: {start_date: '2000-06-06'} do
|
123
|
+
it { should == [] }
|
124
|
+
end
|
125
|
+
|
126
|
+
context 'repeat, date and start_date arguments', args: {repeat: '0', date: '2000-06-06', start_date: '2000-02-03'} do
|
127
|
+
it { should == [Time.new(2000,6,6)] }
|
128
|
+
end
|
129
|
+
|
130
|
+
context 'dates array argument', args: {dates: ['2000-01-02','2000-02-03']} do
|
131
|
+
it { should == [Time.new(2000,1,2), Time.new(2000,2,3)] }
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'repeat, date, start_date and start_time arguments', args: {repeat: '0', date: '2000-06-06', start_date: '2000-06-06', start_time: '12:00'} do
|
135
|
+
it { should == [Time.new(2000,6,6,12,0)] }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe "#ends?" do
|
140
|
+
subject(:ends) { input.ends? }
|
141
|
+
|
142
|
+
context 'repeat and end_date arguments', args: {repeat: '1', end_date: ''} do
|
143
|
+
it { should be_falsey }
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe "#yearly_start_month_day?" do
|
148
|
+
subject(:yearly_start_month_day) { input.yearly_start_month_day? }
|
149
|
+
|
150
|
+
context 'repeat and yearly_start_month_day arguments', args: {repeat: '1', yearly_start_month_day: '2'} do
|
151
|
+
it { should be_falsey }
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'repeat, yearly_start_month and yearly_start_month_day arguments', args: {repeat: '1', yearly_start_month: '12', yearly_start_month_day: '2'} do
|
155
|
+
it { should be_truthy }
|
156
|
+
end
|
157
|
+
|
158
|
+
context 'repeat, yearly_start_month and yearly_start_month_day arguments', args: {repeat: '1', yearly_start_month: '12', yearly_start_month_day: '1'} do
|
159
|
+
it { should be_falsey }
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "#yearly_end_month_day?" do
|
164
|
+
subject(:yearly_end_month_day) { input.yearly_end_month_day? }
|
165
|
+
|
166
|
+
context 'repeat and yearly_end_month_day arguments', args: {repeat: '1', yearly_end_month_day: '27'} do
|
167
|
+
it { should be_falsey }
|
168
|
+
end
|
169
|
+
|
170
|
+
context 'repeat, yearly_end_month and yearly_end_month_day arguments', args: {repeat: '1', yearly_end_month: '12', yearly_end_month_day: '27'} do
|
171
|
+
it { should be_truthy }
|
172
|
+
end
|
173
|
+
|
174
|
+
context 'repeat, yearly_end_month and yearly_end_month_day arguments', args: {repeat: '1', yearly_end_month: '12', yearly_end_month_day: '31'} do
|
175
|
+
it { should be_falsey }
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'repeat, yearly_end_month and yearly_end_month_day arguments', args: {repeat: '1', yearly_end_month: '11', yearly_end_month_day: '30'} do
|
179
|
+
it { should be_falsey }
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ice_cube'
|
3
|
+
require 'schedule_attributes/rule_parser'
|
4
|
+
require 'schedule_attributes/input'
|
5
|
+
|
6
|
+
describe ScheduleAttributes::RuleParser::Day do
|
7
|
+
let(:input) { ScheduleAttributes::Input.new(RSpec.current_example.metadata[:args]) }
|
8
|
+
let(:parser) { described_class.new(input) }
|
9
|
+
let(:t) { Date.current.to_time }
|
10
|
+
|
11
|
+
describe "#rule" do
|
12
|
+
subject { parser.rule }
|
13
|
+
|
14
|
+
context 'no arguments', args: {} do
|
15
|
+
let(:every_day) { [t, t+1.day, t+2.days, t+3.days, t+4.days, t+5.days, t+6.days, t+7.days, t+8.days] }
|
16
|
+
|
17
|
+
it { should == IceCube::Rule.daily }
|
18
|
+
its_occurrences_until(8.days.from_now) { should == every_day }
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'interval argument', args: {interval: 2} do
|
22
|
+
let(:every_other_day) { [t, t+2.days, t+4.days, t+6.days, t+8.days] }
|
23
|
+
|
24
|
+
it { should == IceCube::Rule.daily(2) }
|
25
|
+
its_occurrences_until(8.days.from_now) { should == every_other_day }
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'end_date argument', args: {end_date: '2014-01-30'} do
|
29
|
+
let(:t) { Time.new(2014,01,30) }
|
30
|
+
let(:last_5_days) { [t-4.days, t-3.days, t-2.days, t-1.day, t] }
|
31
|
+
|
32
|
+
it { should == IceCube::Rule.daily.until(t) }
|
33
|
+
its_occurrences_until(Time.new(2014,02,01)) { subject[-5..-1].should == last_5_days }
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'yearly_start_month and yearly_end_month arguments, whole year', args: {yearly_start_month: 1, yearly_end_month: 12} do
|
37
|
+
it { should == IceCube::Rule.daily }
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'yearly_start_month and yearly_end_month arguments, less than a year', args: {yearly_start_month: 6, yearly_end_month: 8} do
|
41
|
+
it { should == IceCube::Rule.daily.month_of_year(6,7,8) }
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'yearly_start_month and yearly_end_month arguments, jump year', args: {yearly_start_month: 11, yearly_end_month: 1} do
|
45
|
+
it { should == IceCube::Rule.daily.month_of_year(11,12,1) }
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'yearly_start_month and yearly_end_month arguments, jump year alt', args: {yearly_start_month: 12, yearly_end_month: 2} do
|
49
|
+
it { should == IceCube::Rule.daily.month_of_year(12,1,2) }
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'yearly_start_month, yearly_start_month_day, yearly_end_month and yearly_end_month_day arguments', args: {
|
53
|
+
yearly_start_month: 3, yearly_start_month_day: 14,
|
54
|
+
yearly_end_month: 3, yearly_end_month_day: 17
|
55
|
+
} do
|
56
|
+
it { should == IceCube::Rule.daily.month_of_year(3) }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#exceptions" do
|
61
|
+
subject { parser.exceptions }
|
62
|
+
|
63
|
+
context 'yearly_start_month, yearly_start_month_day, yearly_end_month and yearly_end_month_day arguments', args: {
|
64
|
+
yearly_start_month: 3, yearly_start_month_day: 4,
|
65
|
+
yearly_end_month: 3, yearly_end_month_day: 26
|
66
|
+
} do
|
67
|
+
it "returns exceptions for the leading & trailing days" do
|
68
|
+
should == [
|
69
|
+
IceCube::Rule.daily.month_of_year(3).day_of_month(*1..3),
|
70
|
+
IceCube::Rule.daily.month_of_year(3).day_of_month(*27..31)
|
71
|
+
]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'yearly_start_month and yearly_end_month arguments', args: {yearly_start_month: 3, yearly_end_month: 3} do
|
76
|
+
it "has no trailing exceptions" do
|
77
|
+
should == []
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'yearly_start_month, yearly_end_month and yearly_end_month_day arguments', args: {yearly_start_month: 3, yearly_end_month: 4, yearly_end_month_day: 25} do
|
82
|
+
it "returns exceptions for the trailing days of the last month only" do
|
83
|
+
should == [IceCube::Rule.daily.month_of_year(4).day_of_month(*26..31)]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'yearly_start_month, yearly_start_month_day and yearly_end_month arguments', args: {yearly_start_month: 3, yearly_start_month_day: 3, yearly_end_month: 4} do
|
88
|
+
it "returns exceptions for the leading days of the first month" do
|
89
|
+
should == [
|
90
|
+
IceCube::Rule.daily.month_of_year(3).day_of_month(*1..2)
|
91
|
+
]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'yearly_start_month, yearly_end_month, yearly_start_month_day and yearly_end_month_day arguments', args: {yearly_start_month: 3, yearly_end_month: 4, yearly_start_month_day: 31, yearly_end_month_day: 1} do
|
96
|
+
it "excepts the first 30 days of first month and last 30 days of last month" do
|
97
|
+
should == [
|
98
|
+
IceCube::Rule.daily.month_of_year(3).day_of_month(*1..30),
|
99
|
+
IceCube::Rule.daily.month_of_year(4).day_of_month(*2..31)
|
100
|
+
]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'yearly_start_month, yearly_end_month, yearly_start_month_day and yearly_end_month_day arguments', args: {yearly_start_month: 12, yearly_end_month: 1, yearly_start_month_day: 31, yearly_end_month_day: 1} do
|
105
|
+
it "excepts the first 30 days of first month and last 30 days of last month" do
|
106
|
+
should == [
|
107
|
+
IceCube::Rule.daily.month_of_year(12).day_of_month(*1..30),
|
108
|
+
IceCube::Rule.daily.month_of_year(1).day_of_month(*2..31)
|
109
|
+
]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|