ice_cube 0.12.0 → 0.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ice_cube.rb +0 -1
- data/lib/ice_cube/deprecated.rb +26 -28
- data/lib/ice_cube/parsers/hash_parser.rb +3 -3
- data/lib/ice_cube/parsers/yaml_parser.rb +3 -5
- data/lib/ice_cube/schedule.rb +3 -1
- data/lib/ice_cube/time_util.rb +9 -5
- data/lib/ice_cube/validated_rule.rb +5 -0
- data/lib/ice_cube/validations/daily_interval.rb +2 -2
- data/lib/ice_cube/validations/hourly_interval.rb +2 -2
- data/lib/ice_cube/validations/minutely_interval.rb +2 -2
- data/lib/ice_cube/validations/monthly_interval.rb +2 -2
- data/lib/ice_cube/validations/secondly_interval.rb +2 -2
- data/lib/ice_cube/validations/weekly_interval.rb +2 -2
- data/lib/ice_cube/validations/yearly_interval.rb +3 -2
- data/lib/ice_cube/version.rb +1 -1
- metadata +3 -9
- data/lib/ice_cube/enumerator.rb +0 -63
- data/lib/ice_cube/formatters/string.rb +0 -155
- data/lib/ice_cube/hash_input.rb +0 -71
- data/lib/ice_cube/string_helpers.rb +0 -10
- data/lib/ice_cube/time_step.rb +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ac4ca18d263a59f5e9499349ce536e63d8ec59f
|
4
|
+
data.tar.gz: 3d2d4ed0d0cf8c0632b870b19e59ac964d64f93a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6715a91023b1c7c0fa7f1bdc59776c0182b3742bd37a6fc28fd14e0bd15ee5e4d0e2c1014c03c43c04cfaaee8b73ed19d5a7557b815f949fe72d044fb9a61bb
|
7
|
+
data.tar.gz: f2941f23021a8062fc35cc3f3dd1bd2010903645d723aa9bf7ba3b50a4c240ef88757539c6317b4cab967f7d357a5ccf915d84c963659a97a54d47f5c05efc53
|
data/lib/ice_cube.rb
CHANGED
data/lib/ice_cube/deprecated.rb
CHANGED
@@ -1,38 +1,36 @@
|
|
1
1
|
module IceCube
|
2
|
-
|
2
|
+
module Deprecated
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
4
|
+
# Define a deprecated alias for a method
|
5
|
+
# @param [Symbol] name - name of method to define
|
6
|
+
# @param [Symbol] replacement - name of method to replace (alias)
|
7
|
+
def deprecated_alias(name, replacement)
|
8
|
+
# Create a wrapped version
|
9
|
+
define_method(name) do |*args, &block|
|
10
|
+
warn "IceCube: #{self.class}##{name} is deprecated, please use ##{replacement} at: #{ caller[0] }"
|
11
|
+
send replacement, *args, &block
|
12
|
+
end
|
13
|
+
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
15
|
+
# Deprecate a defined method
|
16
|
+
# @param [Symbol] name - name of deprecated method
|
17
|
+
# @param [Symbol] replacement - name of the desired replacement
|
18
|
+
def deprecated(name, replacement)
|
19
|
+
# Replace old method
|
20
|
+
old_name = :"#{name}_without_deprecation"
|
21
|
+
alias_method old_name, name
|
22
|
+
# And replace it with a wrapped version
|
23
|
+
define_method(name) do |*args, &block|
|
24
|
+
warn "IceCube: #{self.class}##{name} is deprecated, please use ##{replacement} at: #{ caller[0] }"
|
25
|
+
send old_name, *args, &block
|
26
|
+
end
|
27
|
+
end
|
28
28
|
|
29
29
|
def self.schedule_options(schedule, options)
|
30
30
|
if options[:start_date_override]
|
31
|
-
warn "IceCube: :start_date_override option deprecated. "
|
32
|
-
"(please use a block { |s| s.start_time = override })"
|
31
|
+
warn "IceCube: :start_date_override option is deprecated, please use a block {|s| s.start_time = override }. at: #{ caller[0] }"
|
33
32
|
schedule.start_time = options[:start_date_override]
|
34
33
|
end
|
35
34
|
end
|
36
|
-
|
37
|
-
end
|
35
|
+
end
|
38
36
|
end
|
@@ -26,13 +26,13 @@ module IceCube
|
|
26
26
|
data = IceCube::FlexibleHash.new(hash.dup)
|
27
27
|
|
28
28
|
if (start_date = data.delete(:start_date))
|
29
|
-
|
29
|
+
warn "IceCube: :start_date is deprecated, please use :start_time at: #{ caller[0] }"
|
30
30
|
data[:start_time] = start_date
|
31
31
|
end
|
32
32
|
|
33
33
|
{:rdates => :rtimes, :exdates => :extimes}.each do |old_key, new_key|
|
34
34
|
if (times = data.delete(old_key))
|
35
|
-
warn "IceCube: :#{old_key} deprecated
|
35
|
+
warn "IceCube: :#{old_key} is deprecated, please use :#{new_key} at: #{ caller[0] }"
|
36
36
|
(data[new_key] ||= []).concat times
|
37
37
|
end
|
38
38
|
end
|
@@ -59,7 +59,7 @@ module IceCube
|
|
59
59
|
|
60
60
|
def apply_exrules(schedule, data)
|
61
61
|
return unless data[:exrules]
|
62
|
-
warn "IceCube: :exrules deprecated
|
62
|
+
warn "IceCube: :exrules is deprecated, and will be removed in a future release. at: #{ caller[0] }"
|
63
63
|
data[:exrules].each do |h|
|
64
64
|
schedule.exrule(IceCube::Rule.from_hash(h))
|
65
65
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
1
3
|
module IceCube
|
2
4
|
class YamlParser < HashParser
|
3
5
|
|
@@ -7,15 +9,11 @@ module IceCube
|
|
7
9
|
|
8
10
|
def initialize(yaml)
|
9
11
|
@hash = YAML::load(yaml)
|
10
|
-
yaml.match
|
12
|
+
yaml.match SERIALIZED_START do |match|
|
11
13
|
start_time = hash[:start_time] || hash[:start_date]
|
12
|
-
hash = FlexibleHash.new(@hash)
|
13
14
|
TimeUtil.restore_deserialized_offset start_time, match[:tz]
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
17
|
-
private
|
18
|
-
|
19
|
-
|
20
18
|
end
|
21
19
|
end
|
data/lib/ice_cube/schedule.rb
CHANGED
@@ -380,11 +380,13 @@ module IceCube
|
|
380
380
|
end
|
381
381
|
|
382
382
|
def self.dump(schedule)
|
383
|
+
return schedule if schedule.nil? || schedule == ""
|
383
384
|
schedule.to_yaml
|
384
385
|
end
|
385
386
|
|
386
387
|
def self.load(yaml)
|
387
|
-
|
388
|
+
return yaml if yaml.nil? || yaml == ""
|
389
|
+
from_yaml(yaml)
|
388
390
|
end
|
389
391
|
|
390
392
|
private
|
data/lib/ice_cube/time_util.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'date'
|
2
|
+
require 'time'
|
2
3
|
|
3
4
|
module IceCube
|
4
5
|
module TimeUtil
|
@@ -42,7 +43,7 @@ module IceCube
|
|
42
43
|
def self.ensure_time(time, date_eod = false)
|
43
44
|
case time
|
44
45
|
when DateTime
|
45
|
-
warn "IceCube: DateTime support is deprecated (please use Time)"
|
46
|
+
warn "IceCube: DateTime support is deprecated (please use Time) at: #{ caller[2] }"
|
46
47
|
Time.local(time.year, time.month, time.day, time.hour, time.min, time.sec)
|
47
48
|
when Date
|
48
49
|
date_eod ? end_of_date(time) : time.to_time
|
@@ -69,13 +70,16 @@ module IceCube
|
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
72
|
-
# Deserialize a time serialized with serialize_time
|
73
|
+
# Deserialize a time serialized with serialize_time or in ISO8601 string format
|
73
74
|
def self.deserialize_time(time_or_hash)
|
74
|
-
|
75
|
+
case time_or_hash
|
76
|
+
when Time
|
75
77
|
time_or_hash
|
76
|
-
|
78
|
+
when Hash
|
77
79
|
hash = FlexibleHash.new(time_or_hash)
|
78
80
|
hash[:time].in_time_zone(hash[:zone])
|
81
|
+
when String
|
82
|
+
Time.parse(time_or_hash)
|
79
83
|
end
|
80
84
|
end
|
81
85
|
|
@@ -87,7 +91,7 @@ module IceCube
|
|
87
91
|
def self.restore_deserialized_offset(time, orig_offset_str)
|
88
92
|
return time if time.respond_to?(:time_zone) ||
|
89
93
|
time.getlocal(orig_offset_str).utc_offset == time.utc_offset
|
90
|
-
warn
|
94
|
+
warn "IceCube: parsed Time from nonlocal TZ. Use ActiveSupport to fix DST at: #{ caller[0] }"
|
91
95
|
time.localtime(orig_offset_str)
|
92
96
|
end
|
93
97
|
|
@@ -106,6 +106,11 @@ module IceCube
|
|
106
106
|
end
|
107
107
|
|
108
108
|
private
|
109
|
+
def normalized_interval(interval)
|
110
|
+
int = interval.to_i
|
111
|
+
raise ArgumentError, "'#{interval}' is not a valid input for interval. Please pass an integer." unless int > 0
|
112
|
+
int
|
113
|
+
end
|
109
114
|
|
110
115
|
def finds_acceptable_time?
|
111
116
|
validation_names.all? do |type|
|
@@ -4,8 +4,8 @@ module IceCube
|
|
4
4
|
|
5
5
|
# Add a new interval validation
|
6
6
|
def interval(interval)
|
7
|
-
@interval = interval
|
8
|
-
replace_validations_for(:interval, [Validation.new(interval)])
|
7
|
+
@interval = normalized_interval(interval)
|
8
|
+
replace_validations_for(:interval, [Validation.new(@interval)])
|
9
9
|
clobber_base_validations(:wday, :day)
|
10
10
|
self
|
11
11
|
end
|
@@ -3,8 +3,8 @@ module IceCube
|
|
3
3
|
module Validations::HourlyInterval
|
4
4
|
|
5
5
|
def interval(interval)
|
6
|
-
@interval = interval
|
7
|
-
replace_validations_for(:interval, [Validation.new(interval)])
|
6
|
+
@interval = normalized_interval(interval)
|
7
|
+
replace_validations_for(:interval, [Validation.new(@interval)])
|
8
8
|
clobber_base_validations(:hour)
|
9
9
|
self
|
10
10
|
end
|
@@ -3,8 +3,8 @@ module IceCube
|
|
3
3
|
module Validations::MinutelyInterval
|
4
4
|
|
5
5
|
def interval(interval)
|
6
|
-
@interval = interval
|
7
|
-
replace_validations_for(:interval, [Validation.new(interval)])
|
6
|
+
@interval = normalized_interval(interval)
|
7
|
+
replace_validations_for(:interval, [Validation.new(@interval)])
|
8
8
|
clobber_base_validations(:min)
|
9
9
|
self
|
10
10
|
end
|
@@ -3,8 +3,8 @@ module IceCube
|
|
3
3
|
module Validations::MonthlyInterval
|
4
4
|
|
5
5
|
def interval(interval)
|
6
|
-
@interval = interval
|
7
|
-
replace_validations_for(:interval, [Validation.new(interval)])
|
6
|
+
@interval = normalized_interval(interval)
|
7
|
+
replace_validations_for(:interval, [Validation.new(@interval)])
|
8
8
|
clobber_base_validations(:month)
|
9
9
|
self
|
10
10
|
end
|
@@ -3,8 +3,8 @@ module IceCube
|
|
3
3
|
module Validations::SecondlyInterval
|
4
4
|
|
5
5
|
def interval(interval)
|
6
|
-
@interval = interval
|
7
|
-
replace_validations_for(:interval, [Validation.new(interval)])
|
6
|
+
@interval = normalized_interval(interval)
|
7
|
+
replace_validations_for(:interval, [Validation.new(@interval)])
|
8
8
|
clobber_base_validations(:sec)
|
9
9
|
self
|
10
10
|
end
|
@@ -5,9 +5,9 @@ module IceCube
|
|
5
5
|
module Validations::WeeklyInterval
|
6
6
|
|
7
7
|
def interval(interval, week_start = :sunday)
|
8
|
-
@interval = interval
|
8
|
+
@interval = normalized_interval(interval)
|
9
9
|
@week_start = TimeUtil.wday_to_sym(week_start)
|
10
|
-
replace_validations_for(:interval, [Validation.new(interval, week_start)])
|
10
|
+
replace_validations_for(:interval, [Validation.new(@interval, week_start)])
|
11
11
|
clobber_base_validations(:day)
|
12
12
|
self
|
13
13
|
end
|
@@ -3,9 +3,10 @@ module IceCube
|
|
3
3
|
module Validations::YearlyInterval
|
4
4
|
|
5
5
|
def interval(interval)
|
6
|
-
@interval = interval
|
7
|
-
replace_validations_for(:interval, [Validation.new(interval)])
|
6
|
+
@interval = normalized_interval(interval)
|
7
|
+
replace_validations_for(:interval, [Validation.new(@interval)])
|
8
8
|
clobber_base_validations(:year)
|
9
|
+
self
|
9
10
|
end
|
10
11
|
|
11
12
|
class Validation
|
data/lib/ice_cube/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ice_cube
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Crepezzi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04
|
11
|
+
date: 2014-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.12.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -78,12 +78,9 @@ files:
|
|
78
78
|
- lib/ice_cube/builders/ical_builder.rb
|
79
79
|
- lib/ice_cube/builders/string_builder.rb
|
80
80
|
- lib/ice_cube/deprecated.rb
|
81
|
-
- lib/ice_cube/enumerator.rb
|
82
81
|
- lib/ice_cube/errors/count_exceeded.rb
|
83
82
|
- lib/ice_cube/errors/until_exceeded.rb
|
84
83
|
- lib/ice_cube/flexible_hash.rb
|
85
|
-
- lib/ice_cube/formatters/string.rb
|
86
|
-
- lib/ice_cube/hash_input.rb
|
87
84
|
- lib/ice_cube/occurrence.rb
|
88
85
|
- lib/ice_cube/parsers/hash_parser.rb
|
89
86
|
- lib/ice_cube/parsers/yaml_parser.rb
|
@@ -97,8 +94,6 @@ files:
|
|
97
94
|
- lib/ice_cube/rules/yearly_rule.rb
|
98
95
|
- lib/ice_cube/schedule.rb
|
99
96
|
- lib/ice_cube/single_occurrence_rule.rb
|
100
|
-
- lib/ice_cube/string_helpers.rb
|
101
|
-
- lib/ice_cube/time_step.rb
|
102
97
|
- lib/ice_cube/time_util.rb
|
103
98
|
- lib/ice_cube/validated_rule.rb
|
104
99
|
- lib/ice_cube/validations/count.rb
|
@@ -148,4 +143,3 @@ specification_version: 4
|
|
148
143
|
summary: Ruby Date Recurrence Library
|
149
144
|
test_files:
|
150
145
|
- spec/spec_helper.rb
|
151
|
-
has_rdoc: true
|
data/lib/ice_cube/enumerator.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
module IceCube
|
2
|
-
class Enumerator < ::Enumerator
|
3
|
-
|
4
|
-
def initialize(schedule, from_time, to_time)
|
5
|
-
@schedule = schedule
|
6
|
-
@from_time = TimeUtil.ensure_time(from_time)
|
7
|
-
@to_time = TimeUtil.ensure_time(to_time)
|
8
|
-
align_start_time
|
9
|
-
@cursor = @from_time
|
10
|
-
end
|
11
|
-
|
12
|
-
def each
|
13
|
-
while res = self.find_next && @to_time.nil? || res <= @to_time
|
14
|
-
yield Occurrence.new(res, res + schedule.duration)
|
15
|
-
end
|
16
|
-
raise StopIteration
|
17
|
-
end
|
18
|
-
|
19
|
-
def find_next
|
20
|
-
loop do
|
21
|
-
min_time = recurrence_rules.reduce(nil) do |min_time, rule|
|
22
|
-
catch :limit do
|
23
|
-
new_time = rule.next_time(time, schedule, min_time || @to_time)
|
24
|
-
[min_time, new_time].compact.min
|
25
|
-
end
|
26
|
-
end
|
27
|
-
break nil unless min_time
|
28
|
-
@cursor = min_time + 1
|
29
|
-
next if exception_time?(min_time)
|
30
|
-
break min_time
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def align_start_time
|
37
|
-
if @from_time <= schedule.start_time || full_required?
|
38
|
-
@from_time = schedule.start_time
|
39
|
-
else
|
40
|
-
@from_time += @schedule.start_time.subsec - @from_time.subsec rescue 0
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Return a boolean indicating if any rule needs to be run from the start of time
|
45
|
-
def full_required?
|
46
|
-
recurrence_rules.any?(&:full_required?) ||
|
47
|
-
exception_rules.any?(&:full_required?)
|
48
|
-
end
|
49
|
-
|
50
|
-
def exception_rules
|
51
|
-
schedule.instance_variable_get(:@all_exception_rules)
|
52
|
-
end
|
53
|
-
|
54
|
-
def recurrence_rules
|
55
|
-
@recurrence_rules ||= if recurrence_rules.empty?
|
56
|
-
[SingleOccurrenceRule.new(schedule.start_time)].concat schedule.instance_variable_get(:@all_recurrence_rules)
|
57
|
-
else
|
58
|
-
schedule.instance_variable_get(:@all_recurrence_rules)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
@@ -1,155 +0,0 @@
|
|
1
|
-
class IceCube::StringBuilder
|
2
|
-
|
3
|
-
format :day do |entries|
|
4
|
-
case entries = entries.sort
|
5
|
-
when [0, 6] then 'on Weekends'
|
6
|
-
when [1, 2, 3, 4, 5] then 'on Weekdays'
|
7
|
-
else
|
8
|
-
"on " << build(:sentence, build(:daynames, entries))
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
format :dayname do |number|
|
13
|
-
Date::DAYNAMES[number]
|
14
|
-
end
|
15
|
-
|
16
|
-
format :daynames do |entries|
|
17
|
-
entries.map { |wday| build(:dayname, wday) + "s" }
|
18
|
-
end
|
19
|
-
|
20
|
-
format :monthnames do |entries|
|
21
|
-
entries.map { |m| Date::MONTHNAMES[m] }
|
22
|
-
end
|
23
|
-
|
24
|
-
format :count do |number|
|
25
|
-
times = number == 1 ? "time" : "times"
|
26
|
-
"#{number} #{times}"
|
27
|
-
end
|
28
|
-
|
29
|
-
format :day_of_month do |entries|
|
30
|
-
numbered = build(:sentence, build(:ordinals, entries))
|
31
|
-
days = entries.size == 1 ? "day" : "days"
|
32
|
-
"on the #{numbered} #{days} of the month"
|
33
|
-
end
|
34
|
-
|
35
|
-
format :day_of_week do |entries|
|
36
|
-
numbered_weekdays = build(:daynames_of_week, entries).join(" and ")
|
37
|
-
"on the #{numbered_weekdays}"
|
38
|
-
end
|
39
|
-
|
40
|
-
format :daynames_of_week do |entries|
|
41
|
-
entries.map do |occurrence, wday|
|
42
|
-
numbered = build(:ordinal, occurrence)
|
43
|
-
weekday = build(:dayname, wday)
|
44
|
-
"#{numbered} #{weekday}"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
format :day_of_year do |entries|
|
49
|
-
numbered = build(:sentence, build(:ordinals, entries))
|
50
|
-
days = entries.size == 1 ? "day" : "days"
|
51
|
-
"on the #{numbered} #{days} of the year"
|
52
|
-
end
|
53
|
-
|
54
|
-
format :hour_of_day do |entries|
|
55
|
-
numbered = build(:sentence, build(:ordinals, entries))
|
56
|
-
hours = entries.size == 1 ? "hour" : "hours"
|
57
|
-
"on the #{numbered} #{hours} of the day"
|
58
|
-
end
|
59
|
-
|
60
|
-
format :minute_of_hour do |entries|
|
61
|
-
numbered = build(:sentence, build(:ordinals, entries))
|
62
|
-
minutes = entries.size == 1 ? "minute" : "minutes"
|
63
|
-
"on the #{numbered} #{minutes} of the hour"
|
64
|
-
end
|
65
|
-
|
66
|
-
format :month_of_year do |entries|
|
67
|
-
"in " << build(:sentence, build(:monthnames, entries))
|
68
|
-
end
|
69
|
-
|
70
|
-
format :second_of_minute do |entries|
|
71
|
-
numbered = build(:sentence, build(:ordinals, entries))
|
72
|
-
seconds = entries.size == 1 ? "second" : "seconds"
|
73
|
-
"on the #{numbered} #{seconds} of the minute"
|
74
|
-
end
|
75
|
-
|
76
|
-
format :time do |time|
|
77
|
-
time.strftime(IceCube.to_s_time_format)
|
78
|
-
end
|
79
|
-
|
80
|
-
format :until do |time|
|
81
|
-
"until " << build(:time, time)
|
82
|
-
end
|
83
|
-
|
84
|
-
format :sentence do |entries|
|
85
|
-
case entries.length
|
86
|
-
when 0 then ''
|
87
|
-
when 1 then entries[0].to_s
|
88
|
-
when 2 then "#{entries[0]} and #{entries[1]}"
|
89
|
-
else "#{entries[0...-1].join(', ')}, and #{entries[-1]}"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
format :ordinals do |entries|
|
94
|
-
entries = entries.sort
|
95
|
-
entries.rotate! while entries[0] < 0 if entries.last > 0
|
96
|
-
entries.map { |number| build(:ordinal, number) }
|
97
|
-
end
|
98
|
-
|
99
|
-
format :ordinal do |number|
|
100
|
-
next "last" if number == -1
|
101
|
-
suffix = SPECIAL_SUFFIX[number] || NUMBER_SUFFIX[number.abs % 10]
|
102
|
-
if number < -1
|
103
|
-
number.abs.to_s << suffix << " to last"
|
104
|
-
else
|
105
|
-
number.to_s << suffix
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
format :daily_interval do |i|
|
110
|
-
i == 1 ? "Daily" : "Every #{i} days"
|
111
|
-
end
|
112
|
-
|
113
|
-
format :hourly_interval do |i|
|
114
|
-
i == 1 ? "Hourly" : "Every #{i} hours"
|
115
|
-
end
|
116
|
-
|
117
|
-
format :minutely_interval do |i|
|
118
|
-
i == 1 ? "Minutely" : "Every #{i} minutes"
|
119
|
-
end
|
120
|
-
|
121
|
-
format :monthly_interval do |i|
|
122
|
-
i == 1 ? "Monthly" : "Every #{i} months"
|
123
|
-
end
|
124
|
-
|
125
|
-
format :secondly_interval do |i|
|
126
|
-
i == 1 ? "Secondly" : "Every #{i} seconds"
|
127
|
-
end
|
128
|
-
|
129
|
-
format :weekly_interval do |i|
|
130
|
-
i == 1 ? "Weekly" : "Every #{i} weeks"
|
131
|
-
end
|
132
|
-
|
133
|
-
format :yearly_interval do |i|
|
134
|
-
i == 1 ? "Yearly" : "Every #{i} years"
|
135
|
-
end
|
136
|
-
|
137
|
-
format :exrule do |rule|
|
138
|
-
"not #{rule}"
|
139
|
-
end
|
140
|
-
|
141
|
-
format :extime do |time|
|
142
|
-
"not on #{build(:time, time)}"
|
143
|
-
end
|
144
|
-
|
145
|
-
format :schedule do |s|
|
146
|
-
times = s.recurrence_times_with_start_time - s.extimes
|
147
|
-
pieces = []
|
148
|
-
pieces.concat times.uniq.sort.map { |t| build(:time, t) }
|
149
|
-
pieces.concat s.rrules.map { |t| t.to_s }
|
150
|
-
pieces.concat s.exrules.map { |t| build(:exrule, t) }
|
151
|
-
pieces.concat s.extimes.uniq.sort.map { |t| build(:extime, t) }
|
152
|
-
pieces.join(' / ')
|
153
|
-
end
|
154
|
-
|
155
|
-
end
|
data/lib/ice_cube/hash_input.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
module IceCube
|
2
|
-
class HashInput
|
3
|
-
|
4
|
-
class Mash
|
5
|
-
def initialize(hash)
|
6
|
-
@hash = hash
|
7
|
-
end
|
8
|
-
|
9
|
-
# Fetch values indifferently by symbol or string key without symbolizing
|
10
|
-
# arbitrary string input
|
11
|
-
#
|
12
|
-
def [](key)
|
13
|
-
@hash.fetch(key) do |key|
|
14
|
-
str_key = key.to_s
|
15
|
-
@hash.each_pair.detect do |sym_key, value|
|
16
|
-
return value if sym_key.to_s == str_key
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize(hash)
|
23
|
-
@input = Mash.new(hash)
|
24
|
-
end
|
25
|
-
|
26
|
-
def [](key)
|
27
|
-
@input[key]
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_rule
|
31
|
-
return nil unless rule_class
|
32
|
-
rule = rule_class.new(interval, week_start)
|
33
|
-
rule.until(limit_time) if limit_time
|
34
|
-
rule.count(limit_count) if limit_count
|
35
|
-
validations.each do |validation, args|
|
36
|
-
rule.send(validation, *args)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def rule_class
|
41
|
-
return @rule_class if @rule_class
|
42
|
-
match = @input[:rule_type].match(/::(\w+Rule)$/)
|
43
|
-
@rule_class = IceCube.const_get(match[1]) if match
|
44
|
-
end
|
45
|
-
|
46
|
-
def interval
|
47
|
-
@input[:interval] || 1
|
48
|
-
end
|
49
|
-
|
50
|
-
def week_start
|
51
|
-
@input[:week_start] || :sunday
|
52
|
-
end
|
53
|
-
|
54
|
-
def limit_time
|
55
|
-
@limit_time ||= TimeUtil.deserialize_time(@input[:until])
|
56
|
-
end
|
57
|
-
|
58
|
-
def limit_count
|
59
|
-
@input[:count]
|
60
|
-
end
|
61
|
-
|
62
|
-
def validations
|
63
|
-
input_validations = Mash.new(@input[:validations] || {})
|
64
|
-
ValidatedRule::VALIDATION_ORDER.each_with_object({}) do |key, output_validations|
|
65
|
-
args = input_validations[key]
|
66
|
-
output_validations[key] = Array(args) if args
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
data/lib/ice_cube/time_step.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
module IceCube
|
2
|
-
class TimeStep
|
3
|
-
SECS = 1
|
4
|
-
MINS = 60
|
5
|
-
HOURS = MINS * 60
|
6
|
-
DAYS = HOURS * 24
|
7
|
-
WEEKS = DAYS * 7
|
8
|
-
MONTHS = {
|
9
|
-
1 => [ 28, 29, 30, 31].map { |m| m * DAYS },
|
10
|
-
2 => [ 59, 60, 61, 62].map { |m| m * DAYS },
|
11
|
-
3 => [ 89, 90, 91, 92].map { |m| m * DAYS },
|
12
|
-
4 => [120, 121, 122, 123].map { |m| m * DAYS },
|
13
|
-
5 => [150, 151, 152, 153].map { |m| m * DAYS },
|
14
|
-
6 => [181, 182, 183, 184].map { |m| m * DAYS },
|
15
|
-
7 => [212, 213, 214, 215].map { |m| m * DAYS },
|
16
|
-
8 => [242, 243, 244, 245].map { |m| m * DAYS },
|
17
|
-
9 => [273, 274, 275, 276].map { |m| m * DAYS },
|
18
|
-
10 => [303, 304, 305, 306].map { |m| m * DAYS },
|
19
|
-
11 => [334, 335, 336, 337].map { |m| m * DAYS },
|
20
|
-
12 => [365, 366] .map { |m| m * DAYS }
|
21
|
-
}
|
22
|
-
YEARS = [365, 366]
|
23
|
-
|
24
|
-
def next(base, validations)
|
25
|
-
end
|
26
|
-
|
27
|
-
def prev(base, validations)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|