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 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