class Sleek::Timeframe
Constants
- REGEXP
Public Class Methods
parse(timeframe, timezone = nil)
click to toggle source
Internal: Process timeframe string to make up a range.
timeframe - the String matching
(this|previous)_((\d+)_)?(minute|hour|day|week|month)s?
timezone - the optional String TZ identifier. See
`ActiveSupport::TimeZone`.
# File lib/sleek/timeframe.rb, line 42 def parse(timeframe, timezone = nil) _, category, _, number, interval = *timeframe.match(REGEXP) unless category && interval raise ArgumentError, 'special timeframe string is malformed' end number ||= 1 number = number.to_i range = range_from_interval(interval, number, timezone) range = range - 1.send(interval) if category == 'previous' range end
range_from_interval(interval, number = 1, timezone = nil)
click to toggle source
Internal: Create a time range from interval type & number of intervals.
interval - the String interval type name. Valid values are
minute, hour, day, week, and month.
number - the Integer number of periods. timezone - the optional String TZ identifier. See
`ActiveSupport::TimeZone`.
Returns the range of TimeWithZone objects.
# File lib/sleek/timeframe.rb, line 67 def range_from_interval(interval, number = 1, timezone = nil) timezone ||= 'UTC' now = ActiveSupport::TimeZone.new(timezone).now end_point = now.send("end_of_#{interval}").round start_point = end_point - number.send(interval) start_point..end_point end
to_range(timeframe, timezone = nil)
click to toggle source
Internal: Transform the object passed to Timeframe
initializer into a range of Time
objects.
timeframe - either a Range
of Time
objects, a two-element array
of Time Objects, or a special string.
timezone - the optional String TZ identifier. See
`ActiveSupport::TimeZone`.
Examples
Timeframe.to_range :this_2_days Timeframe.to_range :previous_hour Timeframe.to_range :this_day, timezone: 'US/Pacific'
Raises ArgumentError if passed object can't be processed.
# File lib/sleek/timeframe.rb, line 23 def to_range(timeframe, timezone = nil) case timeframe when proc { |tf| tf.is_a?(Range) && tf.time_range? } t = timeframe when proc { |tf| tf.is_a?(Array) && tf.size == 2 && tf.count { |_tf| _tf.is_a?(Time) } == 2 } t = timeframe.first..timeframe.last when String, Symbol t = parse(timeframe.to_s, timezone) else raise ArgumentError, "wrong timeframe - #{timeframe}" end end