ice_cube_ex 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Gem Version](https://badge.fury.io/rb/ice_cube_ex.svg)](http://badge.fury.io/rb/ice_cube_ex)
|
3
4
|
[![build](https://travis-ci.org/junhanamaki/ice_cube_ex.svg?branch=master)](https://travis-ci.org/junhanamaki/ice_cube_ex)
|
4
5
|
[![Code Climate](https://codeclimate.com/github/junhanamaki/ice_cube_ex.png)](https://codeclimate.com/github/junhanamaki/ice_cube_ex)
|
5
6
|
[![Test Coverage](https://codeclimate.com/github/junhanamaki/ice_cube_ex/coverage.png)](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
|