ice_cube 0.5.9 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -25,6 +25,17 @@ module IceCube
25
25
  find_occurrences { |roc| roc > end_date }
26
26
  end
27
27
 
28
+ # Break after the first occurrence after now
29
+ def next_occurrence(from)
30
+ found_one = false
31
+ find_occurrences do |roc|
32
+ find = roc > from
33
+ success = found_one
34
+ found_one = find
35
+ success
36
+ end
37
+ end
38
+
28
39
  def first(n)
29
40
  count = 0
30
41
  find_occurrences { |roc| count += 1; count > n }
@@ -35,10 +35,10 @@ module IceCube
35
35
  # Convert the schedule to yaml, reverse of Schedule.from_yaml
36
36
  def to_yaml(options = {})
37
37
  hash = to_hash
38
- hash[:start_date] = TimeUtil.serializable_time(hash[:start_date])
39
- hash[:rdates] = hash[:rdates].map { |t| TimeUtil.serializable_time(t) }
40
- hash[:exdates] = hash[:exdates].map { |t| TimeUtil.serializable_time(t) }
41
- hash[:end_time] = TimeUtil.serializable_time(hash[:end_time])
38
+ hash[:start_date] = TimeUtil.serialize_time(hash[:start_date])
39
+ hash[:rdates] = hash[:rdates].map { |t| TimeUtil.serialize_time(t) }
40
+ hash[:exdates] = hash[:exdates].map { |t| TimeUtil.serialize_time(t) }
41
+ hash[:end_time] = TimeUtil.serialize_time(hash[:end_time])
42
42
  hash.to_yaml(options)
43
43
  end
44
44
 
@@ -46,12 +46,12 @@ module IceCube
46
46
  def self.from_hash(hash)
47
47
  options = {}
48
48
  options[:duration] = hash[:duration] if hash.has_key?(:duration)
49
- options[:end_time] = hash[:end_time] if hash.has_key?(:end_time)
50
- schedule = Schedule.new(hash[:start_date], options)
49
+ options[:end_time] = TimeUtil.deserialize_time(hash[:end_time]) if hash.has_key?(:end_time)
50
+ schedule = Schedule.new(TimeUtil.deserialize_time(hash[:start_date]), options)
51
51
  hash[:rrules].each { |rr| schedule.add_recurrence_rule Rule.from_hash(rr) }
52
52
  hash[:exrules].each { |ex| schedule.add_exception_rule Rule.from_hash(ex) }
53
- hash[:rdates].each { |rd| schedule.add_recurrence_date rd }
54
- hash[:exdates].each { |ed| schedule.add_exception_date ed }
53
+ hash[:rdates].each { |rd| schedule.add_recurrence_date TimeUtil.deserialize_time(rd) }
54
+ hash[:exdates].each { |ed| schedule.add_exception_date TimeUtil.deserialize_time(ed) }
55
55
  schedule
56
56
  end
57
57
 
@@ -132,7 +132,8 @@ module IceCube
132
132
 
133
133
  # Find next scheduled occurrence
134
134
  def next_occurrence(from = Time.now)
135
- remaining_occurrences(from).first
135
+ nexts = find_occurrences { |head| head.next_occurrence(from) }
136
+ nexts.empty? ? nil : (nexts.last if nexts.last > from)
136
137
  end
137
138
 
138
139
  # Retrieve the first (n) occurrences of the schedule. May return less than
@@ -5,19 +5,21 @@ module IceCube
5
5
  LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
6
6
  CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
7
7
 
8
- # this method exists because ActiveSupport will serialize
9
- # TimeWithZone's in collections in UTC time instead of
10
- # their local time. if +time+ is a TimeWithZone, we move
11
- # it to a DateTime
12
- # Note: When converting to datetime, you microseconds get set to 0
13
- def self.serializable_time(time)
14
- if time.respond_to?(:to_datetime)
15
- time.to_datetime
16
- else
8
+ def self.serialize_time(time)
9
+ if time.is_a?(ActiveSupport::TimeWithZone)
10
+ { :time => time, :zone => time.time_zone }
11
+ elsif time.is_a?(Time)
17
12
  time
18
13
  end
19
14
  end
20
15
 
16
+ def self.deserialize_time(time_or_hash)
17
+ return time_or_hash if time_or_hash.is_a?(Time) # for backward-compat
18
+ if time_or_hash.is_a?(Hash)
19
+ time_or_hash[:time].in_time_zone(time_or_hash[:zone])
20
+ end
21
+ end
22
+
21
23
  # TODO can we improve this more?
22
24
  def self.date_in_n_months(date, month_distance)
23
25
 
@@ -1,5 +1,5 @@
1
1
  module IceCube
2
2
 
3
- VERSION = '0.5.9'
3
+ VERSION = '0.6.0'
4
4
 
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ice_cube
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 7
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 5
9
- - 9
10
- version: 0.5.9
8
+ - 6
9
+ - 0
10
+ version: 0.6.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - John Crepezzi
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-09-27 00:00:00 -04:00
18
+ date: 2010-10-18 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency