lib/timerange.rb in timerange-0.0.2 vs lib/timerange.rb in timerange-0.0.3

- old
+ new

@@ -1,43 +1,44 @@ require "time" require "active_support/time" -require "active_support/core_ext/module/attribute_accessors" +require "timerange/version" class TimeRange < Range - VERSION = "0.0.2" + class << self + attr_accessor :time_zone + end - mattr_accessor :time_zone - def initialize(b = nil, e = Time.now, exclude_end = false, options = {}) if b.is_a?(Range) b, e, exclude_end = b.begin, b.end, b.exclude_end? end if b.is_a?(Hash) options, b, e, exclude_end = b, nil, nil, false elsif e.is_a?(Hash) - options, e, exclude_end = e, nil, false + options, e, exclude_end = e, Time.now, false end - time_zone = options[:time_zone] || self.class.time_zone || Time.zone || "Etc/UTC" + time_zone = options[:time_zone] || TimeRange.time_zone || Time.zone || "Etc/UTC" if time_zone.is_a?(ActiveSupport::TimeZone) or (time_zone = ActiveSupport::TimeZone[time_zone]) # do nothing else raise "Unrecognized time zone" end + b = time_zone.parse(b) if b.is_a?(String) e = time_zone.parse(e) if e.is_a?(String) - if options[:time_zone] - b = b.in_time_zone(b) - e = e.in_time_zone(e) - end + b = b.in_time_zone(time_zone) if options[:duration] e = b + options[:duration] exclude_end = true end + e = e.in_time_zone(time_zone) + @options = options.merge(time_zone: time_zone) + super(b, e, exclude_end) end # should step expand by default? # TODO return enum @@ -57,37 +58,36 @@ if exclude_end? and self.end == bucket(period, self.end, options) self.end else bucket(period, self.end + 1.send(period), options) end - self.class.new(bucket(period, self.begin, options), e, true) + self.class.new(bucket(period, self.begin, options), e, true, @options.merge(options)) end def expand_start(period, options = {}) e = self.end e = e.in_time_zone(options[:time_zone]) if options[:time_zone] - self.class.new(bucket(period, self.begin, options), e, exclude_end?) + self.class.new(bucket(period, self.begin, options), e, exclude_end?, @options.merge(options)) end def bucket(period, time, options = {}) - self.class.bucket(period, time, options) + self.class.bucket(period, time, @options.merge(options)) end def self.bucket(period, time, options = {}) - time_zone = options[:time_zone] || Time.zone + time_zone = options[:time_zone] || TimeRange.time_zone || Time.zone || "Etc/UTC" day_start = options[:day_start] || 0 week_start = options[:week_start] || 6 week_start = [:mon, :tue, :wed, :thu, :fri, :sat, :sun].index((options[:week_start] || :sun).to_sym) if !week_start raise "Unrecognized :week_start option" end time = time.to_time.in_time_zone(time_zone) - day_start.hours - period = period.to_sym time = - case period + case period.to_sym when :second time.change(usec: 0) when :minute time.change(sec: 0) when :hour