ice_cube 0.9.2 → 0.9.3
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.
- data/lib/ice_cube/rule.rb +1 -1
- data/lib/ice_cube/rules/daily_rule.rb +1 -0
- data/lib/ice_cube/rules/hourly_rule.rb +1 -0
- data/lib/ice_cube/rules/minutely_rule.rb +1 -0
- data/lib/ice_cube/rules/monthly_rule.rb +1 -0
- data/lib/ice_cube/rules/secondly_rule.rb +1 -0
- data/lib/ice_cube/rules/weekly_rule.rb +1 -0
- data/lib/ice_cube/rules/yearly_rule.rb +1 -0
- data/lib/ice_cube/schedule.rb +20 -17
- data/lib/ice_cube/single_occurrence_rule.rb +1 -1
- data/lib/ice_cube/time_util.rb +34 -14
- data/lib/ice_cube/validated_rule.rb +1 -1
- data/lib/ice_cube/version.rb +1 -1
- metadata +18 -2
data/lib/ice_cube/rule.rb
CHANGED
data/lib/ice_cube/schedule.rb
CHANGED
@@ -10,9 +10,6 @@ module IceCube
|
|
10
10
|
attr_reader :start_time
|
11
11
|
deprecated_alias :start_date, :start_time
|
12
12
|
|
13
|
-
# Get the duration
|
14
|
-
attr_accessor :duration
|
15
|
-
|
16
13
|
# Get the end time
|
17
14
|
attr_reader :end_time
|
18
15
|
deprecated_alias :end_date, :end_time
|
@@ -20,8 +17,8 @@ module IceCube
|
|
20
17
|
# Create a new schedule
|
21
18
|
def initialize(start_time = nil, options = {})
|
22
19
|
self.start_time = start_time || TimeUtil.now
|
23
|
-
self.end_time = options[:
|
24
|
-
|
20
|
+
self.end_time = self.start_time + options[:duration] if options[:duration]
|
21
|
+
self.end_time = options[:end_time] if options[:end_time]
|
25
22
|
@all_recurrence_rules = []
|
26
23
|
@all_exception_rules = []
|
27
24
|
end
|
@@ -38,6 +35,14 @@ module IceCube
|
|
38
35
|
end
|
39
36
|
deprecated_alias :end_date=, :end_time=
|
40
37
|
|
38
|
+
def duration
|
39
|
+
end_time ? end_time - start_time : 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def duration=(seconds)
|
43
|
+
@end_time = start_time + seconds
|
44
|
+
end
|
45
|
+
|
41
46
|
# Add a recurrence time to the schedule
|
42
47
|
def add_recurrence_time(time)
|
43
48
|
return nil if time.nil?
|
@@ -156,19 +161,19 @@ module IceCube
|
|
156
161
|
|
157
162
|
# The next n occurrences after now
|
158
163
|
def next_occurrences(num, from = nil)
|
159
|
-
from ||= TimeUtil.now(@start_time
|
164
|
+
from ||= TimeUtil.now(@start_time)
|
160
165
|
find_occurrences(from + 1, nil, num)
|
161
166
|
end
|
162
167
|
|
163
168
|
# The next occurrence after now (overridable)
|
164
169
|
def next_occurrence(from = nil)
|
165
|
-
from ||= TimeUtil.now(@start_time
|
170
|
+
from ||= TimeUtil.now(@start_time)
|
166
171
|
find_occurrences(from + 1, nil, 1).first
|
167
172
|
end
|
168
173
|
|
169
174
|
# The remaining occurrences (same requirements as all_occurrences)
|
170
175
|
def remaining_occurrences(from = nil)
|
171
|
-
from ||= TimeUtil.now(@start_time
|
176
|
+
from ||= TimeUtil.now(@start_time)
|
172
177
|
find_occurrences(from)
|
173
178
|
end
|
174
179
|
|
@@ -186,21 +191,20 @@ module IceCube
|
|
186
191
|
# Return a boolean indicating if an occurrence is occurring between
|
187
192
|
# two times, inclusive
|
188
193
|
def occurring_between?(begin_time, closing_time)
|
189
|
-
|
190
|
-
occurs_between?(begin_time - dur + 1, closing_time + dur - 1)
|
194
|
+
occurs_between?(begin_time - duration + 1, closing_time + duration - 1)
|
191
195
|
end
|
192
196
|
|
193
197
|
# Return a boolean indicating if an occurrence falls on a certain date
|
194
198
|
def occurs_on?(date)
|
195
199
|
date = TimeUtil.ensure_date date
|
196
|
-
begin_time = TimeUtil.beginning_of_date(date)
|
197
|
-
closing_time = TimeUtil.end_of_date(date)
|
200
|
+
begin_time = TimeUtil.beginning_of_date(date, start_time)
|
201
|
+
closing_time = TimeUtil.end_of_date(date, start_time)
|
198
202
|
occurs_between?(begin_time, closing_time)
|
199
203
|
end
|
200
204
|
|
201
205
|
# Determine if the schedule is occurring at a given time
|
202
206
|
def occurring_at?(time)
|
203
|
-
if duration
|
207
|
+
if duration > 0
|
204
208
|
return false if exception_time?(time)
|
205
209
|
occurs_between?(time - duration + 1, time)
|
206
210
|
else
|
@@ -237,7 +241,7 @@ module IceCube
|
|
237
241
|
# Due to durations, we need to walk up to the end time, and verify in the
|
238
242
|
# other direction
|
239
243
|
if last_time
|
240
|
-
last_time
|
244
|
+
last_time += terminating_schedule.duration
|
241
245
|
other_schedule.each_occurrence do |time|
|
242
246
|
break if time > last_time
|
243
247
|
return true if terminating_schedule.occurring_at?(time)
|
@@ -273,7 +277,6 @@ module IceCube
|
|
273
277
|
def to_ical(force_utc = false)
|
274
278
|
pieces = []
|
275
279
|
pieces << "DTSTART#{IcalBuilder.ical_format(start_time, force_utc)}"
|
276
|
-
pieces << "DURATION:#{IcalBuilder.ical_duration(duration)}" if duration
|
277
280
|
pieces.concat recurrence_rules.map { |r| "RRULE:#{r.to_ical}" }
|
278
281
|
pieces.concat exception_rules.map { |r| "EXRULE:#{r.to_ical}" }
|
279
282
|
pieces.concat recurrence_times.map { |t| "RDATE#{IcalBuilder.ical_format(t, force_utc)}" }
|
@@ -297,7 +300,6 @@ module IceCube
|
|
297
300
|
data = {}
|
298
301
|
data[:start_date] = TimeUtil.serialize_time(start_time)
|
299
302
|
data[:end_time] = TimeUtil.serialize_time(end_time) if end_time
|
300
|
-
data[:duration] = duration if duration
|
301
303
|
data[:rrules] = recurrence_rules.map(&:to_hash)
|
302
304
|
data[:exrules] = exception_rules.map(&:to_hash)
|
303
305
|
data[:rtimes] = recurrence_times.map do |rt|
|
@@ -315,7 +317,7 @@ module IceCube
|
|
315
317
|
# And then deserialize
|
316
318
|
data = IceCube::FlexibleHash.new(original_hash)
|
317
319
|
schedule = IceCube::Schedule.new TimeUtil.deserialize_time(data[:start_date])
|
318
|
-
schedule.
|
320
|
+
schedule.end_time = schedule.start_time + data[:duration] if data[:duration]
|
319
321
|
schedule.end_time = TimeUtil.deserialize_time(data[:end_time]) if data[:end_time]
|
320
322
|
data[:rrules] && data[:rrules].each { |h| schedule.rrule(IceCube::Rule.from_hash(h)) }
|
321
323
|
data[:exrules] && data[:exrules].each { |h| schedule.exrule(IceCube::Rule.from_hash(h)) }
|
@@ -362,6 +364,7 @@ module IceCube
|
|
362
364
|
def find_occurrences(opening_time, closing_time = nil, limit = nil, &block)
|
363
365
|
opening_time = TimeUtil.ensure_time opening_time
|
364
366
|
closing_time = TimeUtil.ensure_time closing_time
|
367
|
+
opening_time += start_time.subsec - opening_time.subsec rescue 0
|
365
368
|
reset
|
366
369
|
answers = []
|
367
370
|
opening_time = start_time if opening_time < start_time
|
data/lib/ice_cube/time_util.rb
CHANGED
@@ -18,11 +18,23 @@ module IceCube
|
|
18
18
|
:november => 11, :december => 12
|
19
19
|
}
|
20
20
|
|
21
|
-
# Provides a Time.now without the usec
|
22
|
-
def self.now(
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
# Provides a Time.now without the usec, in the reference zone or utc offset
|
22
|
+
def self.now(reference=Time.now)
|
23
|
+
match_zone(Time.at(Time.now.to_i), reference)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.match_zone(time, reference)
|
27
|
+
if reference.respond_to? :time_zone
|
28
|
+
time.in_time_zone(reference.time_zone)
|
29
|
+
else
|
30
|
+
if reference.utc?
|
31
|
+
time.utc
|
32
|
+
elsif reference.zone
|
33
|
+
time.getlocal
|
34
|
+
else
|
35
|
+
time.getlocal(reference.utc_offset)
|
36
|
+
end
|
37
|
+
end
|
26
38
|
end
|
27
39
|
|
28
40
|
# Ensure that this is either nil, or a time
|
@@ -38,7 +50,9 @@ module IceCube
|
|
38
50
|
def self.ensure_date(date)
|
39
51
|
case date
|
40
52
|
when Date then date
|
41
|
-
else
|
53
|
+
else
|
54
|
+
return date.to_date if date.respond_to? :to_date
|
55
|
+
return date.to_time.to_date if date.respond_to? :to_time
|
42
56
|
end
|
43
57
|
end
|
44
58
|
|
@@ -61,17 +75,23 @@ module IceCube
|
|
61
75
|
end
|
62
76
|
|
63
77
|
# Get the beginning of a date
|
64
|
-
def self.beginning_of_date(date)
|
65
|
-
date.
|
66
|
-
|
67
|
-
|
78
|
+
def self.beginning_of_date(date, reference=Time.now)
|
79
|
+
args = [date.year, date.month, date.day, 0, 0, 0]
|
80
|
+
if reference.respond_to?(:time_zone) && reference.time_zone
|
81
|
+
reference.time_zone.local(*args)
|
82
|
+
else
|
83
|
+
match_zone(Time.new(*args << reference.utc_offset), reference)
|
84
|
+
end
|
68
85
|
end
|
69
86
|
|
70
87
|
# Get the end of a date
|
71
|
-
def self.end_of_date(date)
|
72
|
-
date.
|
73
|
-
|
74
|
-
|
88
|
+
def self.end_of_date(date, reference=Time.now)
|
89
|
+
args = [date.year, date.month, date.day, 23, 59, 59]
|
90
|
+
if reference.respond_to?(:time_zone) && reference.time_zone
|
91
|
+
reference.time_zone.local(*args)
|
92
|
+
else
|
93
|
+
match_zone(Time.new(*args << reference.utc_offset), reference)
|
94
|
+
end
|
75
95
|
end
|
76
96
|
|
77
97
|
# Convert a symbol to a numeric month
|
@@ -24,7 +24,7 @@ module IceCube
|
|
24
24
|
|
25
25
|
until finds_acceptable_time?
|
26
26
|
# Prevent a non-matching infinite loop
|
27
|
-
return nil if closing_time && @time > closing_time
|
27
|
+
return nil if closing_time && @time.to_i > closing_time.to_i
|
28
28
|
end
|
29
29
|
|
30
30
|
# NOTE Uses may be 1 higher than proper here since end_time isn't
|
data/lib/ice_cube/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ice_cube
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,24 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
14
30
|
- !ruby/object:Gem::Dependency
|
15
31
|
name: rspec
|
16
32
|
requirement: !ruby/object:Gem::Requirement
|