ice_cube_ex 0.0.1 → 0.1.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 +4 -4
- data/README.md +35 -1
- data/lib/ice_cube_ex/rule.rb +12 -0
- data/lib/ice_cube_ex/{ice_cube/rules/daily_cycle_rule.rb → rules/day_cycle_rule.rb} +12 -15
- data/lib/ice_cube_ex/{ice_cube/validations/daily_cycle_interval.rb → validations/day_cycle_interval.rb} +7 -23
- data/lib/ice_cube_ex/version.rb +1 -1
- data/lib/ice_cube_ex.rb +1 -1
- data/spec/ice_cube_ex/rule_spec.rb +16 -0
- data/spec/ice_cube_ex/{ice_cube/rules/daily_cycle_spec.rb → rules/day_cycle_spec.rb} +3 -3
- data/spec/ice_cube_ex/{ice_cube/schedule_spec.rb → schedule_spec.rb} +55 -6
- metadata +11 -11
- data/lib/ice_cube_ex/ice_cube/rule.rb +0 -12
- data/spec/ice_cube_ex/ice_cube/rule_spec.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5c2110052533d6a2c202dd9b5956ab34860f27b
|
4
|
+
data.tar.gz: 4e9b6686c099e9e8c31de765379dd5bcdab0914b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 371cce05e26cb616d3b3611ef2becf34c1d47ce0ec161d9489525f3fd5a1cf13ac9f1996b29ee3cc84d788c453f26ac00b39799b9a48be1c8afd2e8a1a58961a
|
7
|
+
data.tar.gz: b10f2e2527efcf30594e5176b5b0b6a2cce0eb6fd0d09a07ca6f4a4486139d9cc0d996455d28cf1c7b9c4f64abaaa248f451686b65a87c75eebc5a793398e736
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# IceCubeEx
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/ice_cube_ex)
|
3
4
|
[](https://travis-ci.org/junhanamaki/ice_cube_ex)
|
4
5
|
[](https://codeclimate.com/github/junhanamaki/ice_cube_ex)
|
5
6
|
[](https://codeclimate.com/github/junhanamaki/ice_cube_ex)
|
@@ -26,7 +27,40 @@ Or install it yourself as:
|
|
26
27
|
|
27
28
|
## Usage
|
28
29
|
|
29
|
-
|
30
|
+
ice_cube_ex has new rules that can be used with ice_cube's schedules:
|
31
|
+
|
32
|
+
### DayCycleRule
|
33
|
+
|
34
|
+
This rule allows to specify a cycle (in number of days), and the number of
|
35
|
+
repeat counting from the start of the cycle. For example, if we want to repeat
|
36
|
+
3 days, every 5 days, starting from 2015-1-1 we would do:
|
37
|
+
|
38
|
+
schedule = IceCube::Schedule.new(Time.new(2015, 1, 1)) do |s|
|
39
|
+
s.rrule IceCubeEx::Rule.day_cycle(5, 3)
|
40
|
+
end
|
41
|
+
|
42
|
+
Now try calculating some next occurrences:
|
43
|
+
|
44
|
+
occurrence_time = schedule.next_occurrence(Time.new(2014-12-30))
|
45
|
+
# returns 2015-1-1
|
46
|
+
|
47
|
+
occurrence_time = schedule.next_occurrence(occurrence_time)
|
48
|
+
# returns 2015-1-2
|
49
|
+
|
50
|
+
occurrence_time = schedule.next_occurrence(occurrence_time)
|
51
|
+
# returns 2015-1-3
|
52
|
+
|
53
|
+
occurrence_time = schedule.next_occurrence(occurrence_time)
|
54
|
+
# returns 2015-1-6
|
55
|
+
|
56
|
+
occurrence_time = schedule.next_occurrence(occurrence_time)
|
57
|
+
# returns 2015-1-7
|
58
|
+
|
59
|
+
occurrence_time = schedule.next_occurrence(occurrence_time)
|
60
|
+
# returns 2015-1-8
|
61
|
+
|
62
|
+
You can also use count and until to limit your rule as you would normally do
|
63
|
+
with a regular ice_cube rule.
|
30
64
|
|
31
65
|
## Contributing
|
32
66
|
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'ice_cube_ex/
|
1
|
+
require 'ice_cube_ex/validations/day_cycle_interval'
|
2
2
|
|
3
|
-
module
|
4
|
-
class
|
5
|
-
include Validations::
|
3
|
+
module IceCubeEx
|
4
|
+
class DayCycleRule < IceCube::ValidatedRule
|
5
|
+
include Validations::DayCycleInterval
|
6
6
|
|
7
7
|
def initialize(cycle, repeat)
|
8
8
|
super
|
@@ -11,12 +11,9 @@ module IceCube
|
|
11
11
|
reset
|
12
12
|
end
|
13
13
|
|
14
|
-
#
|
15
|
-
# cycle_start_time and why we start from one day before:
|
16
|
-
#
|
17
14
|
# given the following case:
|
18
15
|
#
|
19
|
-
# Schedule start_time 2014-2-2,
|
16
|
+
# Schedule start_time 2014-2-2, DayCycleRule with cycle 4, repeat 2
|
20
17
|
#
|
21
18
|
# if we invoke schedule.next_occurrence(2014-2-1), first calculated
|
22
19
|
# time will be 2014-2-2, which will give a day_count of 0, thus being lower
|
@@ -27,21 +24,21 @@ module IceCube
|
|
27
24
|
#
|
28
25
|
# 2014-2-2, 2014-2-3, 2014-2-4
|
29
26
|
#
|
30
|
-
# so to avoid this we start counting from start_time - 1.day
|
27
|
+
# so to avoid this we start counting from start_time - 1.day (cycle_start_time)
|
31
28
|
def next_time(time, schedule, closing_time)
|
32
29
|
@time = time
|
33
30
|
@schedule = schedule
|
34
31
|
cycle_start_time = schedule.start_time - 24 * 60 * 60
|
35
32
|
|
36
33
|
return nil unless find_acceptable_time_before(closing_time)
|
37
|
-
|
38
|
-
acceptable_time_percentage =
|
34
|
+
number_of_days = number_of_days_between(@time, cycle_start_time)
|
35
|
+
acceptable_time_percentage = calculate_percentage(number_of_days)
|
39
36
|
|
40
|
-
until acceptable_time_percentage <= @
|
37
|
+
until acceptable_time_percentage <= @acceptable_cycle_percentage
|
41
38
|
@time += 1
|
42
39
|
return nil unless find_acceptable_time_before(closing_time)
|
43
|
-
|
44
|
-
acceptable_time_percentage =
|
40
|
+
number_of_days = number_of_days_between(@time, cycle_start_time)
|
41
|
+
acceptable_time_percentage = calculate_percentage(number_of_days)
|
45
42
|
end
|
46
43
|
|
47
44
|
@uses += 1 if @time
|
@@ -59,7 +56,7 @@ module IceCube
|
|
59
56
|
Time.new(time.year, time.month, time.day, 0, 0, 0, '+00:00')
|
60
57
|
end
|
61
58
|
|
62
|
-
def
|
59
|
+
def calculate_percentage(day_count)
|
63
60
|
value = (day_count.to_f / @cycle.to_f)
|
64
61
|
percentage = ((value - value.to_i) * 100).to_i
|
65
62
|
percentage.zero? ? 100 : percentage
|
@@ -1,6 +1,6 @@
|
|
1
|
-
module
|
1
|
+
module IceCubeEx
|
2
2
|
module Validations
|
3
|
-
module
|
3
|
+
module DayCycleInterval
|
4
4
|
attr_accessor :rule
|
5
5
|
|
6
6
|
def cycle(cycle, repeat)
|
@@ -12,38 +12,22 @@ module IceCube
|
|
12
12
|
raise ArgumentError, 'cycle has to be a value higher than repeat'
|
13
13
|
end
|
14
14
|
|
15
|
-
@
|
15
|
+
@acceptable_cycle_percentage = ((@repeat.to_f / @cycle.to_f) * 100).to_i
|
16
16
|
replace_validations_for \
|
17
17
|
:interval, [Validation.new(@interval, @cycle, @repeat)]
|
18
18
|
clobber_base_validations(:wday, :day)
|
19
19
|
self
|
20
20
|
end
|
21
21
|
|
22
|
-
class Validation
|
23
|
-
attr_reader :
|
22
|
+
class Validation < IceCube::Validations::DailyInterval::Validation
|
23
|
+
attr_reader :cycle, :repeat
|
24
24
|
|
25
25
|
def initialize(interval, cycle, repeat)
|
26
|
-
|
26
|
+
super(interval)
|
27
27
|
@cycle = cycle
|
28
28
|
@repeat = repeat
|
29
29
|
end
|
30
30
|
|
31
|
-
def type
|
32
|
-
:day
|
33
|
-
end
|
34
|
-
|
35
|
-
def dst_adjust?
|
36
|
-
true
|
37
|
-
end
|
38
|
-
|
39
|
-
def validate(step_time, schedule)
|
40
|
-
t0, t1 = schedule.start_time, step_time
|
41
|
-
days = Date.new(t1.year, t1.month, t1.day) -
|
42
|
-
Date.new(t0.year, t0.month, t0.day)
|
43
|
-
offset = (days % interval).nonzero?
|
44
|
-
interval - offset if offset
|
45
|
-
end
|
46
|
-
|
47
31
|
def build_s(builder)
|
48
32
|
builder.base = "Every #{cycle} days, repeat #{repeat} times"
|
49
33
|
end
|
@@ -55,7 +39,7 @@ module IceCube
|
|
55
39
|
end
|
56
40
|
|
57
41
|
def build_ical(builder)
|
58
|
-
builder['FREQ'] << '
|
42
|
+
builder['FREQ'] << 'DAY_CYCLE (CUSTOM RULE)'
|
59
43
|
builder['CYCLE'] << cycle
|
60
44
|
builder['REPEAT'] << repeat
|
61
45
|
end
|
data/lib/ice_cube_ex/version.rb
CHANGED
data/lib/ice_cube_ex.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe IceCubeEx::Rule do
|
4
|
+
describe '.day_cycle' do
|
5
|
+
context 'every 5 days, ' \
|
6
|
+
'repeat 3 days' do
|
7
|
+
let(:cycle) { 5 }
|
8
|
+
let(:repeat) { 3 }
|
9
|
+
before { @rule = IceCubeEx::Rule.day_cycle(cycle, repeat) }
|
10
|
+
|
11
|
+
it 'returns an instance of DayCycleRule' do
|
12
|
+
expect(@rule.class).to eq(IceCubeEx::DayCycleRule)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe IceCubeEx::DayCycleRule do
|
4
4
|
describe '.new' do
|
5
5
|
context 'given cycle argument bellow 2' do
|
6
6
|
let(:cycle) { 0 }
|
@@ -8,7 +8,7 @@ describe IceCube::DailyCycleRule do
|
|
8
8
|
|
9
9
|
it 'raises error' do
|
10
10
|
expect do
|
11
|
-
|
11
|
+
IceCubeEx::DayCycleRule.new(cycle, repeat)
|
12
12
|
end.to raise_error
|
13
13
|
end
|
14
14
|
end
|
@@ -19,7 +19,7 @@ describe IceCube::DailyCycleRule do
|
|
19
19
|
|
20
20
|
it 'raises error' do
|
21
21
|
expect do
|
22
|
-
|
22
|
+
IceCubeEx::DayCycleRule.new(cycle, repeat)
|
23
23
|
end.to raise_error
|
24
24
|
end
|
25
25
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'yaml'
|
2
3
|
|
3
4
|
describe IceCube::Schedule do
|
4
5
|
describe '.next_occurrence' do
|
@@ -12,12 +13,12 @@ describe IceCube::Schedule do
|
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
|
-
context 'given rule of type
|
16
|
+
context 'given rule of type DayCycleRule initialized to ' \
|
16
17
|
'every 4 days (cycle), ' \
|
17
18
|
'repeat 2 days (repeat)' do
|
18
19
|
let(:repeat) { 2 }
|
19
20
|
let(:cycle) { 4 }
|
20
|
-
let(:rule) {
|
21
|
+
let(:rule) { IceCubeEx::DayCycleRule.new(cycle, repeat) }
|
21
22
|
|
22
23
|
context 'calculating from 3-2-2012' do
|
23
24
|
let(:from) { Time.new(2012, 2, 3) }
|
@@ -54,14 +55,14 @@ describe IceCube::Schedule do
|
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
context 'given rule of type
|
58
|
+
context 'given rule of type DayCycleRule initialized to ' \
|
58
59
|
'every 4 days (cycle), ' \
|
59
60
|
'repeat 2 days (repeat), ' \
|
60
61
|
'which repeats 3 times (count)' do
|
61
62
|
let(:repeat) { 2 }
|
62
63
|
let(:cycle) { 4 }
|
63
64
|
let(:count) { 3 }
|
64
|
-
let(:rule) {
|
65
|
+
let(:rule) { IceCubeEx::DayCycleRule.new(cycle, repeat).count(3) }
|
65
66
|
|
66
67
|
context 'calculating from 3-2-2012' do
|
67
68
|
let(:from) { Time.new(2012, 2, 3) }
|
@@ -88,7 +89,7 @@ describe IceCube::Schedule do
|
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
91
|
-
context 'given rule of type
|
92
|
+
context 'given rule of type DayCycleRule initialized to ' \
|
92
93
|
'every 4 days (cycle), ' \
|
93
94
|
'repeat 2 days (repeat), ' \
|
94
95
|
'which repeats until 6-2-2012' do
|
@@ -96,7 +97,7 @@ describe IceCube::Schedule do
|
|
96
97
|
let(:cycle) { 4 }
|
97
98
|
let(:repeat_until) { Time.new(2012, 2, 6) }
|
98
99
|
let(:rule) do
|
99
|
-
|
100
|
+
IceCubeEx::DayCycleRule.new(cycle, repeat).until(repeat_until)
|
100
101
|
end
|
101
102
|
|
102
103
|
context 'calculating from 3-2-2012' do
|
@@ -118,6 +119,54 @@ describe IceCube::Schedule do
|
|
118
119
|
end
|
119
120
|
end
|
120
121
|
end
|
122
|
+
|
123
|
+
context 'given rule of type DayCycleRule initialized to ' \
|
124
|
+
'every 4 days (cycle), ' \
|
125
|
+
'repeat 2 days (repeat)' do
|
126
|
+
let(:repeat) { 2 }
|
127
|
+
let(:cycle) { 4 }
|
128
|
+
let(:rule) { IceCubeEx::DayCycleRule.new(cycle, repeat) }
|
129
|
+
|
130
|
+
context 'given serialized and deserialized schedule with YAML' do
|
131
|
+
before do
|
132
|
+
@schedule = YAML::load(YAML::dump(schedule))
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'calculating from 3-2-2012' do
|
136
|
+
let(:from) { Time.new(2012, 2, 3) }
|
137
|
+
let(:first_occurrence) { @schedule.next_occurrence from }
|
138
|
+
let(:second_occurrence) { @schedule.next_occurrence first_occurrence }
|
139
|
+
let(:third_occurrence) { @schedule.next_occurrence second_occurrence }
|
140
|
+
let(:fourth_occurrence) { @schedule.next_occurrence third_occurrence }
|
141
|
+
let(:fifth_occurrence) { @schedule.next_occurrence fourth_occurrence }
|
142
|
+
let(:sixth_occurrence) { @schedule.next_occurrence fifth_occurrence }
|
143
|
+
|
144
|
+
it 'returns 4-2-2012 at 12am as first occurrence' do
|
145
|
+
expect(first_occurrence).to eq(start_time)
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'returns 5-2-2012 at 12am as second occurrence' do
|
149
|
+
expect(second_occurrence).to eq(Time.new(2012, 2, 5, 12))
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'returns 8-2-2012 at 12am as third occurrence', test: true do
|
153
|
+
expect(third_occurrence).to eq(Time.new(2012, 2, 8, 12))
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'returns 9-2-2012 at 12am as fourth occurrence' do
|
157
|
+
expect(fourth_occurrence).to eq(Time.new(2012, 2, 9, 12))
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'returns 12-2-2012 at 12am as fifth occurrence', test: true do
|
161
|
+
expect(fifth_occurrence).to eq(Time.new(2012, 2, 12, 12))
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'returns 13-2-2012 at 12am as sixth occurrence' do
|
165
|
+
expect(sixth_occurrence).to eq(Time.new(2012, 2, 13, 12))
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
121
170
|
end
|
122
171
|
end
|
123
172
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ice_cube_ex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- junhanamaki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -114,13 +114,13 @@ files:
|
|
114
114
|
- Rakefile
|
115
115
|
- ice_cube_ex.gemspec
|
116
116
|
- lib/ice_cube_ex.rb
|
117
|
-
- lib/ice_cube_ex/
|
118
|
-
- lib/ice_cube_ex/
|
119
|
-
- lib/ice_cube_ex/
|
117
|
+
- lib/ice_cube_ex/rule.rb
|
118
|
+
- lib/ice_cube_ex/rules/day_cycle_rule.rb
|
119
|
+
- lib/ice_cube_ex/validations/day_cycle_interval.rb
|
120
120
|
- lib/ice_cube_ex/version.rb
|
121
|
-
- spec/ice_cube_ex/
|
122
|
-
- spec/ice_cube_ex/
|
123
|
-
- spec/ice_cube_ex/
|
121
|
+
- spec/ice_cube_ex/rule_spec.rb
|
122
|
+
- spec/ice_cube_ex/rules/day_cycle_spec.rb
|
123
|
+
- spec/ice_cube_ex/schedule_spec.rb
|
124
124
|
- spec/spec_helper.rb
|
125
125
|
homepage: https://github.com/junhanamaki/ice_cube_ex
|
126
126
|
licenses:
|
@@ -147,8 +147,8 @@ signing_key:
|
|
147
147
|
specification_version: 4
|
148
148
|
summary: extending ice_cube with new rules
|
149
149
|
test_files:
|
150
|
-
- spec/ice_cube_ex/
|
151
|
-
- spec/ice_cube_ex/
|
152
|
-
- spec/ice_cube_ex/
|
150
|
+
- spec/ice_cube_ex/rule_spec.rb
|
151
|
+
- spec/ice_cube_ex/rules/day_cycle_spec.rb
|
152
|
+
- spec/ice_cube_ex/schedule_spec.rb
|
153
153
|
- spec/spec_helper.rb
|
154
154
|
has_rdoc:
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe IceCube::Rule do
|
4
|
-
describe '.daily_cycle' do
|
5
|
-
context 'every 5 days, ' \
|
6
|
-
'repeat 3 days' do
|
7
|
-
let(:cycle) { 5 }
|
8
|
-
let(:repeat) { 3 }
|
9
|
-
before { @rule = IceCube::Rule.daily_cycle(cycle, repeat) }
|
10
|
-
|
11
|
-
it 'returns an instance of DailyCycleRule' do
|
12
|
-
expect(@rule.class).to eq(IceCube::DailyCycleRule)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|