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 CHANGED
@@ -66,7 +66,7 @@ module IceCube
66
66
  end
67
67
 
68
68
  def on?(time, schedule)
69
- next_time(time, schedule, time) == time
69
+ next_time(time, schedule, time).to_i == time.to_i
70
70
  end
71
71
 
72
72
  # Whether this rule requires a full run
@@ -7,6 +7,7 @@ module IceCube
7
7
  def initialize(interval = 1)
8
8
  interval(interval)
9
9
  schedule_lock(:hour, :min, :sec)
10
+ reset
10
11
  end
11
12
 
12
13
  end
@@ -7,6 +7,7 @@ module IceCube
7
7
  def initialize(interval = 1)
8
8
  interval(interval)
9
9
  schedule_lock(:min, :sec)
10
+ reset
10
11
  end
11
12
 
12
13
  end
@@ -7,6 +7,7 @@ module IceCube
7
7
  def initialize(interval = 1)
8
8
  interval(interval)
9
9
  schedule_lock(:sec)
10
+ reset
10
11
  end
11
12
 
12
13
  end
@@ -7,6 +7,7 @@ module IceCube
7
7
  def initialize(interval = 1)
8
8
  interval(interval)
9
9
  schedule_lock(:day, :hour, :min, :sec)
10
+ reset
10
11
  end
11
12
 
12
13
  end
@@ -6,6 +6,7 @@ module IceCube
6
6
 
7
7
  def initialize(interval = 1)
8
8
  interval(interval)
9
+ reset
9
10
  end
10
11
 
11
12
  end
@@ -7,6 +7,7 @@ module IceCube
7
7
  def initialize(interval = 1, week_start = :sunday)
8
8
  interval(interval, week_start)
9
9
  schedule_lock(:wday, :hour, :min, :sec)
10
+ reset
10
11
  end
11
12
 
12
13
  end
@@ -7,6 +7,7 @@ module IceCube
7
7
  def initialize(interval = 1)
8
8
  interval(interval)
9
9
  schedule_lock(:month, :day, :hour, :min, :sec)
10
+ reset
10
11
  end
11
12
 
12
13
  end
@@ -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[:end_time]
24
- @duration = options[:duration]
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.utc?)
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.utc?)
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.utc?)
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
- dur = duration || 0
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 = terminating_schedule.duration ? last_time + terminating_schedule.duration : 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.duration = data[:duration] if data[:duration]
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
@@ -15,7 +15,7 @@ module IceCube
15
15
 
16
16
  def next_time(t, schedule, closing_time)
17
17
  unless closing_time && closing_time < t
18
- time if time >= t
18
+ time if time.to_i >= t.to_i
19
19
  end
20
20
  end
21
21
 
@@ -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(utc = false)
23
- time = Time.at(Time.now.to_i)
24
- time = time.utc if utc
25
- time
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 date.to_time
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.respond_to?(:beginning_of_day) ?
66
- date.beginning_of_day :
67
- Time.local(date.year, date.month, date.day, 0, 0, 0)
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.respond_to?(:end_of_day) ?
73
- date.end_of_day :
74
- Time.local(date.year, date.month, date.day, 23, 59, 59)
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
@@ -1,5 +1,5 @@
1
1
  module IceCube
2
2
 
3
- VERSION = '0.9.2'
3
+ VERSION = '0.9.3'
4
4
 
5
5
  end
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.2
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: 2012-12-08 00:00:00.000000000 Z
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