ice_cube 0.11.0 → 0.11.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.
- checksums.yaml +7 -0
- data/lib/ice_cube.rb +0 -11
- data/lib/ice_cube/builders/string_builder.rb +15 -23
- data/lib/ice_cube/deprecated.rb +26 -24
- data/lib/ice_cube/enumerator.rb +1 -3
- data/lib/ice_cube/hash_input.rb +71 -0
- data/lib/ice_cube/rule.rb +4 -6
- data/lib/ice_cube/rules/daily_rule.rb +1 -1
- data/lib/ice_cube/rules/hourly_rule.rb +1 -1
- data/lib/ice_cube/rules/minutely_rule.rb +1 -1
- data/lib/ice_cube/rules/monthly_rule.rb +1 -1
- data/lib/ice_cube/rules/secondly_rule.rb +1 -1
- data/lib/ice_cube/rules/yearly_rule.rb +1 -1
- data/lib/ice_cube/schedule.rb +4 -4
- data/lib/ice_cube/string_helpers.rb +10 -0
- data/lib/ice_cube/time_util.rb +14 -5
- data/lib/ice_cube/validations/count.rb +4 -6
- data/lib/ice_cube/validations/daily_interval.rb +13 -18
- data/lib/ice_cube/validations/day.rb +4 -4
- data/lib/ice_cube/validations/day_of_month.rb +8 -10
- data/lib/ice_cube/validations/day_of_week.rb +24 -26
- data/lib/ice_cube/validations/day_of_year.rb +11 -12
- data/lib/ice_cube/validations/hour_of_day.rb +9 -11
- data/lib/ice_cube/validations/hourly_interval.rb +18 -21
- data/lib/ice_cube/validations/lock.rb +35 -14
- data/lib/ice_cube/validations/minute_of_hour.rb +9 -11
- data/lib/ice_cube/validations/minutely_interval.rb +16 -19
- data/lib/ice_cube/validations/month_of_year.rb +4 -4
- data/lib/ice_cube/validations/monthly_interval.rb +15 -17
- data/lib/ice_cube/validations/schedule_lock.rb +12 -11
- data/lib/ice_cube/validations/second_of_minute.rb +5 -5
- data/lib/ice_cube/validations/secondly_interval.rb +13 -16
- data/lib/ice_cube/validations/until.rb +12 -12
- data/lib/ice_cube/validations/weekly_interval.rb +20 -23
- data/lib/ice_cube/validations/yearly_interval.rb +10 -11
- data/lib/ice_cube/version.rb +1 -1
- metadata +20 -33
@@ -13,6 +13,10 @@ module IceCube
|
|
13
13
|
|
14
14
|
attr_reader :interval
|
15
15
|
|
16
|
+
def initialize(interval)
|
17
|
+
@interval = interval
|
18
|
+
end
|
19
|
+
|
16
20
|
def type
|
17
21
|
:min
|
18
22
|
end
|
@@ -21,33 +25,26 @@ module IceCube
|
|
21
25
|
false
|
22
26
|
end
|
23
27
|
|
24
|
-
def
|
25
|
-
|
28
|
+
def validate(step_time, schedule)
|
29
|
+
t0, t1 = schedule.start_time.to_i, step_time.to_i
|
30
|
+
sec = (t1 - t1 % ONE_MINUTE) -
|
31
|
+
(t0 - t0 % ONE_MINUTE)
|
32
|
+
minutes = sec / ONE_MINUTE
|
33
|
+
offset = (minutes % interval).nonzero?
|
34
|
+
interval - offset if offset
|
26
35
|
end
|
27
36
|
|
28
|
-
def
|
29
|
-
builder
|
30
|
-
unless interval == 1
|
31
|
-
builder['INTERVAL'] << interval
|
32
|
-
end
|
37
|
+
def build_s(builder)
|
38
|
+
builder.base = interval == 1 ? 'Minutely' : "Every #{interval} minutes"
|
33
39
|
end
|
34
40
|
|
35
41
|
def build_hash(builder)
|
36
42
|
builder[:interval] = interval
|
37
43
|
end
|
38
44
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
def validate(time, schedule)
|
44
|
-
start_time = schedule.start_time
|
45
|
-
sec = (time.to_i - time.to_i % ONE_MINUTE) -
|
46
|
-
(start_time.to_i - start_time.to_i % ONE_MINUTE)
|
47
|
-
minutes = sec / ONE_MINUTE
|
48
|
-
unless minutes % interval == 0
|
49
|
-
interval - (minutes % interval)
|
50
|
-
end
|
45
|
+
def build_ical(builder)
|
46
|
+
builder['FREQ'] << 'MINUTELY'
|
47
|
+
builder['INTERVAL'] << interval unless interval == 1
|
51
48
|
end
|
52
49
|
|
53
50
|
end
|
@@ -25,6 +25,10 @@ module IceCube
|
|
25
25
|
@month = month
|
26
26
|
end
|
27
27
|
|
28
|
+
def type
|
29
|
+
:month
|
30
|
+
end
|
31
|
+
|
28
32
|
def build_s(builder)
|
29
33
|
builder.piece(:month_of_year) << Date::MONTHNAMES[month]
|
30
34
|
end
|
@@ -37,10 +41,6 @@ module IceCube
|
|
37
41
|
builder['BYMONTH'] << month
|
38
42
|
end
|
39
43
|
|
40
|
-
def type
|
41
|
-
:month
|
42
|
-
end
|
43
|
-
|
44
44
|
StringBuilder.register_formatter(:month_of_year) do |segments|
|
45
45
|
"in #{StringBuilder.sentence(segments)}"
|
46
46
|
end
|
@@ -13,35 +13,33 @@ module IceCube
|
|
13
13
|
|
14
14
|
attr_reader :interval
|
15
15
|
|
16
|
+
def initialize(interval)
|
17
|
+
@interval = interval
|
18
|
+
end
|
19
|
+
|
16
20
|
def type
|
17
21
|
:month
|
18
22
|
end
|
19
23
|
|
20
|
-
def
|
21
|
-
|
24
|
+
def validate(step_time, schedule)
|
25
|
+
t0, t1 = schedule.start_time, step_time
|
26
|
+
months = (t1.month - t0.month) +
|
27
|
+
(t1.year - t0.year) * 12
|
28
|
+
offset = (months % interval).nonzero?
|
29
|
+
interval - offset if offset
|
22
30
|
end
|
23
31
|
|
24
|
-
def
|
25
|
-
builder
|
26
|
-
unless interval == 1
|
27
|
-
builder['INTERVAL'] << interval
|
28
|
-
end
|
32
|
+
def build_s(builder)
|
33
|
+
builder.base = interval == 1 ? 'Monthly' : "Every #{interval} months"
|
29
34
|
end
|
30
35
|
|
31
36
|
def build_hash(builder)
|
32
37
|
builder[:interval] = interval
|
33
38
|
end
|
34
39
|
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
def validate(time, schedule)
|
40
|
-
start_time = schedule.start_time
|
41
|
-
months_to_start = (time.month - start_time.month) + (time.year - start_time.year) * 12
|
42
|
-
unless months_to_start % interval == 0
|
43
|
-
interval - (months_to_start % interval)
|
44
|
-
end
|
40
|
+
def build_ical(builder)
|
41
|
+
builder['FREQ'] << 'MONTHLY'
|
42
|
+
builder['INTERVAL'] << interval unless interval == 1
|
45
43
|
end
|
46
44
|
|
47
45
|
end
|
@@ -2,16 +2,16 @@ module IceCube
|
|
2
2
|
|
3
3
|
module Validations::ScheduleLock
|
4
4
|
|
5
|
-
# Lock the given
|
5
|
+
# Lock the given time units to the units from schedule's +start_time+
|
6
6
|
# These locks are all clobberable by other rules of the same #type
|
7
|
-
# using clobber_base_validation
|
7
|
+
# using +clobber_base_validation+
|
8
|
+
#
|
8
9
|
def schedule_lock(*types)
|
9
10
|
types.each do |type|
|
10
11
|
validations_for(:"base_#{type}") << Validation.new(type)
|
11
12
|
end
|
12
13
|
end
|
13
14
|
|
14
|
-
# A validation used for locking time into a certain value
|
15
15
|
class Validation
|
16
16
|
|
17
17
|
include Validations::Lock
|
@@ -22,24 +22,25 @@ module IceCube
|
|
22
22
|
@type = type
|
23
23
|
end
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
def dst_adjust?
|
26
|
+
case @type
|
27
|
+
when :sec, :min then false
|
28
|
+
else true
|
29
|
+
end
|
27
30
|
end
|
28
31
|
|
29
32
|
# no -op
|
30
|
-
def
|
33
|
+
def build_s(builder)
|
31
34
|
end
|
32
35
|
|
33
36
|
# no -op
|
34
37
|
def build_hash(builder)
|
35
38
|
end
|
36
39
|
|
37
|
-
|
38
|
-
|
39
|
-
when :sec, :min then false
|
40
|
-
else true
|
41
|
-
end
|
40
|
+
# no -op
|
41
|
+
def build_ical(builder)
|
42
42
|
end
|
43
|
+
|
43
44
|
end
|
44
45
|
|
45
46
|
end
|
@@ -17,11 +17,6 @@ module IceCube
|
|
17
17
|
|
18
18
|
include Validations::Lock
|
19
19
|
|
20
|
-
StringBuilder.register_formatter(:second_of_minute) do |segments|
|
21
|
-
str = "on the #{StringBuilder.sentence(segments)} "
|
22
|
-
str << (segments.size == 1 ? 'second of the minute' : 'seconds of the minute')
|
23
|
-
end
|
24
|
-
|
25
20
|
attr_reader :second
|
26
21
|
alias :value :second
|
27
22
|
|
@@ -45,6 +40,11 @@ module IceCube
|
|
45
40
|
builder['BYSECOND'] << second
|
46
41
|
end
|
47
42
|
|
43
|
+
StringBuilder.register_formatter(:second_of_minute) do |segments|
|
44
|
+
str = "on the #{StringBuilder.sentence(segments)} "
|
45
|
+
str << (segments.size == 1 ? 'second of the minute' : 'seconds of the minute')
|
46
|
+
end
|
47
|
+
|
48
48
|
end
|
49
49
|
|
50
50
|
end
|
@@ -13,6 +13,10 @@ module IceCube
|
|
13
13
|
|
14
14
|
attr_reader :interval
|
15
15
|
|
16
|
+
def initialize(interval)
|
17
|
+
@interval = interval
|
18
|
+
end
|
19
|
+
|
16
20
|
def type
|
17
21
|
:sec
|
18
22
|
end
|
@@ -21,30 +25,23 @@ module IceCube
|
|
21
25
|
false
|
22
26
|
end
|
23
27
|
|
24
|
-
def
|
25
|
-
|
28
|
+
def validate(step_time, schedule)
|
29
|
+
seconds = step_time.to_i - schedule.start_time.to_i
|
30
|
+
offset = (seconds % interval).nonzero?
|
31
|
+
interval - offset if offset
|
26
32
|
end
|
27
33
|
|
28
|
-
def
|
29
|
-
builder
|
30
|
-
unless interval == 1
|
31
|
-
builder['INTERVAL'] << interval
|
32
|
-
end
|
34
|
+
def build_s(builder)
|
35
|
+
builder.base = interval == 1 ? 'Secondly' : "Every #{interval} seconds"
|
33
36
|
end
|
34
37
|
|
35
38
|
def build_hash(builder)
|
36
39
|
builder[:interval] = interval
|
37
40
|
end
|
38
41
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
def validate(time, schedule)
|
44
|
-
seconds = time.to_i - schedule.start_time.to_i
|
45
|
-
unless seconds % interval == 0
|
46
|
-
interval - (seconds % interval)
|
47
|
-
end
|
42
|
+
def build_ical(builder)
|
43
|
+
builder['FREQ'] << 'SECONDLY'
|
44
|
+
builder['INTERVAL'] << interval unless interval == 1
|
48
45
|
end
|
49
46
|
|
50
47
|
end
|
@@ -2,9 +2,9 @@ module IceCube
|
|
2
2
|
|
3
3
|
module Validations::Until
|
4
4
|
|
5
|
-
extend
|
5
|
+
extend Deprecated
|
6
6
|
|
7
|
-
#
|
7
|
+
# Value reader for limit
|
8
8
|
def until_time
|
9
9
|
@until
|
10
10
|
end
|
@@ -21,28 +21,28 @@ module IceCube
|
|
21
21
|
|
22
22
|
attr_reader :time
|
23
23
|
|
24
|
-
def type
|
25
|
-
:dealbreaker
|
26
|
-
end
|
27
|
-
|
28
24
|
def initialize(time)
|
29
25
|
@time = time
|
30
26
|
end
|
31
27
|
|
32
|
-
def
|
33
|
-
|
28
|
+
def type
|
29
|
+
:limit
|
34
30
|
end
|
35
31
|
|
36
|
-
def
|
37
|
-
|
32
|
+
def validate(step_time, schedule)
|
33
|
+
raise UntilExceeded if step_time > time
|
38
34
|
end
|
39
35
|
|
40
36
|
def build_s(builder)
|
41
37
|
builder.piece(:until) << "until #{time.strftime(IceCube.to_s_time_format)}"
|
42
38
|
end
|
43
39
|
|
44
|
-
def
|
45
|
-
|
40
|
+
def build_hash(builder)
|
41
|
+
builder[:until] = TimeUtil.serialize_time(time)
|
42
|
+
end
|
43
|
+
|
44
|
+
def build_ical(builder)
|
45
|
+
builder['UNTIL'] << IcalBuilder.ical_utc_format(time)
|
46
46
|
end
|
47
47
|
|
48
48
|
end
|
@@ -20,20 +20,27 @@ module IceCube
|
|
20
20
|
|
21
21
|
attr_reader :interval, :week_start
|
22
22
|
|
23
|
+
def initialize(interval, week_start)
|
24
|
+
@interval = interval
|
25
|
+
@week_start = week_start
|
26
|
+
end
|
27
|
+
|
23
28
|
def type
|
24
29
|
:day
|
25
30
|
end
|
26
31
|
|
27
|
-
def
|
28
|
-
|
32
|
+
def validate(step_time, schedule)
|
33
|
+
t0, t1 = schedule.start_time, step_time
|
34
|
+
d0 = Date.new(t0.year, t0.month, t0.day)
|
35
|
+
d1 = Date.new(t1.year, t1.month, t1.day)
|
36
|
+
days = (d1 - TimeUtil.normalize_wday(d1.wday, week_start)) -
|
37
|
+
(d0 - TimeUtil.normalize_wday(d0.wday, week_start))
|
38
|
+
offset = ((days / 7) % interval).nonzero?
|
39
|
+
(interval - offset) * 7 if offset
|
29
40
|
end
|
30
41
|
|
31
|
-
def
|
32
|
-
builder
|
33
|
-
unless interval == 1
|
34
|
-
builder['INTERVAL'] << interval
|
35
|
-
builder['WKST'] << week_start.to_s.upcase[0..1]
|
36
|
-
end
|
42
|
+
def build_s(builder)
|
43
|
+
builder.base = interval == 1 ? 'Weekly' : "Every #{interval} weeks"
|
37
44
|
end
|
38
45
|
|
39
46
|
def build_hash(builder)
|
@@ -41,21 +48,11 @@ module IceCube
|
|
41
48
|
builder[:week_start] = TimeUtil.sym_to_wday(week_start)
|
42
49
|
end
|
43
50
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
def validate(time, schedule)
|
50
|
-
date = Date.new(time.year, time.month, time.day)
|
51
|
-
st = schedule.start_time
|
52
|
-
start_date = Date.new(st.year, st.month, st.day)
|
53
|
-
weeks = (
|
54
|
-
(date - TimeUtil.normalize_wday(date.wday, week_start)) -
|
55
|
-
(start_date - TimeUtil.normalize_wday(start_date.wday, week_start))
|
56
|
-
) / 7
|
57
|
-
unless weeks % interval == 0
|
58
|
-
(interval - (weeks % interval)) * 7
|
51
|
+
def build_ical(builder)
|
52
|
+
builder['FREQ'] << 'WEEKLY'
|
53
|
+
unless interval == 1
|
54
|
+
builder['INTERVAL'] << interval
|
55
|
+
builder['WKST'] << week_start.to_s.upcase[0..1]
|
59
56
|
end
|
60
57
|
end
|
61
58
|
|
@@ -12,10 +12,20 @@ module IceCube
|
|
12
12
|
|
13
13
|
attr_reader :interval
|
14
14
|
|
15
|
+
def initialize(interval)
|
16
|
+
@interval = interval
|
17
|
+
end
|
18
|
+
|
15
19
|
def type
|
16
20
|
:year
|
17
21
|
end
|
18
22
|
|
23
|
+
def validate(step_time, schedule)
|
24
|
+
years = step_time.year - schedule.start_time.year
|
25
|
+
offset = (years % interval).nonzero?
|
26
|
+
interval - offset if offset
|
27
|
+
end
|
28
|
+
|
19
29
|
def build_s(builder)
|
20
30
|
builder.base = interval == 1 ? 'Yearly' : "Every #{interval} years"
|
21
31
|
end
|
@@ -31,17 +41,6 @@ module IceCube
|
|
31
41
|
end
|
32
42
|
end
|
33
43
|
|
34
|
-
def initialize(interval)
|
35
|
-
@interval = interval
|
36
|
-
end
|
37
|
-
|
38
|
-
def validate(time, schedule)
|
39
|
-
years_to_start = time.year - schedule.start_time.year
|
40
|
-
unless years_to_start % interval == 0
|
41
|
-
interval - (years_to_start % interval)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
44
|
end
|
46
45
|
|
47
46
|
end
|
data/lib/ice_cube/version.rb
CHANGED
metadata
CHANGED
@@ -1,78 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ice_cube
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
5
|
-
prerelease:
|
4
|
+
version: 0.11.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- John Crepezzi
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-10-28 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: 2.12.0
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: 2.12.0
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: active_support
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: 3.0.0
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: 3.0.0
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: tzinfo
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
description: ice_cube is a recurring date library for Ruby. It allows for quick,
|
@@ -90,6 +81,7 @@ files:
|
|
90
81
|
- lib/ice_cube/errors/count_exceeded.rb
|
91
82
|
- lib/ice_cube/errors/until_exceeded.rb
|
92
83
|
- lib/ice_cube/flexible_hash.rb
|
84
|
+
- lib/ice_cube/hash_input.rb
|
93
85
|
- lib/ice_cube/occurrence.rb
|
94
86
|
- lib/ice_cube/rule.rb
|
95
87
|
- lib/ice_cube/rules/daily_rule.rb
|
@@ -101,6 +93,7 @@ files:
|
|
101
93
|
- lib/ice_cube/rules/yearly_rule.rb
|
102
94
|
- lib/ice_cube/schedule.rb
|
103
95
|
- lib/ice_cube/single_occurrence_rule.rb
|
96
|
+
- lib/ice_cube/string_helpers.rb
|
104
97
|
- lib/ice_cube/time_step.rb
|
105
98
|
- lib/ice_cube/time_util.rb
|
106
99
|
- lib/ice_cube/validated_rule.rb
|
@@ -129,33 +122,27 @@ files:
|
|
129
122
|
homepage: http://seejohnrun.github.com/ice_cube/
|
130
123
|
licenses:
|
131
124
|
- MIT
|
125
|
+
metadata: {}
|
132
126
|
post_install_message:
|
133
127
|
rdoc_options: []
|
134
128
|
require_paths:
|
135
129
|
- lib
|
136
130
|
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
131
|
requirements:
|
139
|
-
- -
|
132
|
+
- - '>='
|
140
133
|
- !ruby/object:Gem::Version
|
141
134
|
version: '0'
|
142
|
-
segments:
|
143
|
-
- 0
|
144
|
-
hash: 3343770401458335569
|
145
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
146
|
-
none: false
|
147
136
|
requirements:
|
148
|
-
- -
|
137
|
+
- - '>='
|
149
138
|
- !ruby/object:Gem::Version
|
150
139
|
version: '0'
|
151
|
-
segments:
|
152
|
-
- 0
|
153
|
-
hash: 3343770401458335569
|
154
140
|
requirements: []
|
155
141
|
rubyforge_project: ice-cube
|
156
|
-
rubygems_version:
|
142
|
+
rubygems_version: 2.0.6
|
157
143
|
signing_key:
|
158
|
-
specification_version:
|
144
|
+
specification_version: 4
|
159
145
|
summary: Ruby Date Recurrence Library
|
160
146
|
test_files:
|
161
147
|
- spec/spec_helper.rb
|
148
|
+
has_rdoc: true
|