lib/almanack/event.rb
require 'ostruct'
module Almanack
class Event < OpenStruct
def formatted_date
warn "formatted_date is deprecated, please use formatted_duration instead"
formatted_duration
end
def formatted_duration
formatted = "#{formatted_day(start_time)}"
formatted << " at #{formatted_time(start_time)}" unless start_time.is_a?(Date)
if end_time
formatted << " to " unless is_date_ending_on_same_day?
formatted << "#{formatted_day(end_time)} at " unless ends_on_same_day?
formatted << formatted_time(end_time) unless end_time.is_a?(Date)
end
formatted
end
def title
self[:title]&.force_encoding('UTF-8')
end
def location
self[:location]&.force_encoding('UTF-8')
end
def description
self[:description]&.force_encoding('UTF-8')
end
# Deprecated in favour of start_time
def start_date
deprecated :start_date, newer_method: :start_time
end
def start_time
read_attribute :start_time, fallback: :start_date
end
# Deprecated in favour of end_time
def end_date
deprecated :end_date, newer_method: :end_time
end
def end_time
read_attribute :end_time, fallback: :end_date
end
def serialized
each_pair.with_object({}) do |(attr, _), hash|
hash[attr] = serialize_attribute(attr)
end
end
private
def serialize_attribute(attribute)
value = send(attribute)
value.is_a?(Time) ? value.iso8601 : value
end
def deprecated(older_method, options = {})
newer_method = options.delete(:newer_method)
value = read_attribute(newer_method, fallback: older_method)
warn "Event method #{older_method} is deprecated; use #{newer_method} instead"
value
end
def read_attribute(newer_method, options = {})
older_method = options.delete(:fallback)
newer_value = self[newer_method]
fallback_value = self[older_method]
if fallback_value && newer_value
raise "Both #{older_method} and #{newer_method} properties are set, please use #{newer_method} only instead"
elsif newer_value
newer_value
elsif fallback_value
warn "Deprecated event property #{older_method} is set; set #{newer_method} property instead"
fallback_value
end
end
def is_date_ending_on_same_day?
end_time.is_a?(Date) && ends_on_same_day?
end
def ends_on_same_day?
[start_time.year, start_time.yday] == [end_time.year, end_time.yday]
end
def formatted_time(time)
time.strftime('%-l:%M%P')
end
def formatted_day(time)
time.strftime('%B %-d %Y')
end
end
end