class IceCube::Occurrence

Wraps #start_time and #end_time in a single concept concerning the duration. This delegates to the enclosed #start_time so it behaves like a normal Time in almost all situations, however:

Without ActiveSupport, it's necessary to cast the occurrence using #to_time before doing arithmetic, else Time will try to subtract it using #to_i and return a new time instead.

Time.now - Occurrence.new(start_time) # => 1970-01-01 01:00:00
Time.now - Occurrence.new(start_time).to_time # => 3600

When ActiveSupport::Time core extensions are loaded, it's possible to subtract an Occurrence object directly from a Time to get the difference:

Time.now - Occurrence.new(start_time) # => 3600

Attributes

end_time[R]
start_time[R]

Public Class Methods

name() click to toggle source

Report class name as 'Time' to thwart type checking.

# File lib/ice_cube/occurrence.rb, line 25
def self.name
  'Time'
end
new(start_time, end_time=nil) click to toggle source
# File lib/ice_cube/occurrence.rb, line 36
def initialize(start_time, end_time=nil)
  @start_time = start_time
  @end_time = end_time || start_time
  __setobj__ @start_time
end

Public Instance Methods

comparable_time() click to toggle source
# File lib/ice_cube/occurrence.rb, line 66
def comparable_time
  start_time
end
duration() click to toggle source
# File lib/ice_cube/occurrence.rb, line 70
def duration
  end_time - start_time
end
intersects?(other) click to toggle source
# File lib/ice_cube/occurrence.rb, line 47
def intersects? other
  if other.is_a?(Occurrence) || other.is_a?(Range)
    lower_bound_1 = first + 1
    upper_bound_1 = last # exclude end
    lower_bound_2 = other.first + 1
    upper_bound_2 = other.last + 1
    if (lower_bound_2 <=> upper_bound_2) > 0
      false
    elsif (lower_bound_1 <=> upper_bound_1) > 0
      false
    else
      (upper_bound_1 <=> lower_bound_2) >= 0 and
        (upper_bound_2 <=> lower_bound_1) >= 0
    end
  else
    cover? other
  end
end
is_a?(klass) click to toggle source
Calls superclass method
# File lib/ice_cube/occurrence.rb, line 42
def is_a?(klass)
  klass == ::Time || super
end
Also aliased as: kind_of?
kind_of?(klass)
Alias for: is_a?
overnight?() click to toggle source
# File lib/ice_cube/occurrence.rb, line 95
def overnight?
  offset = start_time + 3600 * 24
  midnight = Time.new(offset.year, offset.month, offset.day)
  midnight < end_time
end
to_range() click to toggle source
# File lib/ice_cube/occurrence.rb, line 74
def to_range
  start_time..end_time
end
to_s(format=nil) click to toggle source

Shows both the start and end time if there is a duration. Optional format argument (e.g. :long, :short) supports Rails time formats and is only used when ActiveSupport is available.

# File lib/ice_cube/occurrence.rb, line 86
def to_s(format=nil)
  if format && to_time.public_method(:to_s).arity != 0
    t0, t1 = start_time.to_s(format), end_time.to_s(format)
  else
    t0, t1 = start_time.to_s, end_time.to_s
  end
  duration > 0 ? "#{t0} - #{t1}" : t0
end
to_time() click to toggle source
# File lib/ice_cube/occurrence.rb, line 78
def to_time
  start_time
end