ice_cube 0.9.2 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|