Class: IceCube::Occurrence

Inherits:
SimpleDelegator
  • Object
show all
Includes:
Comparable
Defined in:
lib/ice_cube/occurrence.rb

Overview

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(start_time, end_time = nil) ⇒ Occurrence

Returns a new instance of Occurrence.


33
34
35
36
37
# File 'lib/ice_cube/occurrence.rb', line 33

def initialize(start_time, end_time=nil)
  @start_time = start_time
  @end_time = end_time || start_time
  __setobj__ @start_time
end

Instance Attribute Details

#end_timeObject (readonly) Also known as: last

Returns the value of attribute end_time


29
30
31
# File 'lib/ice_cube/occurrence.rb', line 29

def end_time
  @end_time
end

#start_timeObject (readonly) Also known as: first

Returns the value of attribute start_time


29
30
31
# File 'lib/ice_cube/occurrence.rb', line 29

def start_time
  @start_time
end

Class Method Details

.nameObject

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


25
26
27
# File 'lib/ice_cube/occurrence.rb', line 25

def self.name
  'Time'
end

Instance Method Details

#<=>(other) ⇒ Object


43
44
45
# File 'lib/ice_cube/occurrence.rb', line 43

def <=>(other)
  @start_time <=> other
end

#comparable_timeObject


68
69
70
# File 'lib/ice_cube/occurrence.rb', line 68

def comparable_time
  start_time
end

#cover?(other) ⇒ Boolean Also known as: include?

Returns:

  • (Boolean)

63
64
65
# File 'lib/ice_cube/occurrence.rb', line 63

def cover?(other)
  to_range.cover?(other)
end

#durationObject


72
73
74
# File 'lib/ice_cube/occurrence.rb', line 72

def duration
  end_time - start_time
end

#intersects?(other) ⇒ Boolean

Returns:

  • (Boolean)

52
53
54
55
56
57
58
59
60
61
# File 'lib/ice_cube/occurrence.rb', line 52

def intersects?(other)
  return cover?(other) unless other.is_a?(Occurrence) || other.is_a?(Range)

  this_start  = first + 1
  this_end    = last # exclude end boundary
  other_start = other.first + 1
  other_end   = other.last + 1

  !(this_end < other_start || this_start > other_end)
end

#is_a?(klass) ⇒ Boolean Also known as: kind_of?

Returns:

  • (Boolean)

47
48
49
# File 'lib/ice_cube/occurrence.rb', line 47

def is_a?(klass)
  klass == ::Time || super
end

#overnight?Boolean

Returns:

  • (Boolean)

97
98
99
100
101
# File 'lib/ice_cube/occurrence.rb', line 97

def overnight?
  offset = start_time + 3600 * 24
  midnight = Time.new(offset.year, offset.month, offset.day)
  midnight < end_time
end

#to_iObject


39
40
41
# File 'lib/ice_cube/occurrence.rb', line 39

def to_i
  @start_time.to_i
end

#to_rangeObject


76
77
78
# File 'lib/ice_cube/occurrence.rb', line 76

def to_range
  start_time..end_time
end

#to_s(format = nil) ⇒ Object

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.


88
89
90
91
92
93
94
95
# File 'lib/ice_cube/occurrence.rb', line 88

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_timeObject


80
81
82
# File 'lib/ice_cube/occurrence.rb', line 80

def to_time
  start_time
end