class ReportsKits::RelativeTime

Constants

LETTERS
LETTERS_DURATION_METHODS

Public Class Methods

parse(string, prevent_exceptions: false) click to toggle source
# File lib/reports_kits/relative_time.rb, line 14
def self.parse(string, prevent_exceptions: false)
  return Time.zone.now if string == 'now'
  original_string = string
  string = string.to_s.strip
  is_negative = string[0, 1] == '-'
  string = string[1..-1] if is_negative

  result_string = is_negative ? '-' : ''
  result_durations = []

  string.scan(/(\d+)([#{LETTERS}]?)/) do |number, letter|
    result_string += "#{number}#{letter}"
    duration_method = LETTERS_DURATION_METHODS[letter]
    unless duration_method
      return if prevent_exceptions
      raise ArgumentError.new("Invalid duration letter: #{letter.inspect}")
    end
    result_durations << number.to_i.public_send(duration_method)
  end

  if result_string == '-' || result_string != original_string.to_s.strip
    return if prevent_exceptions
    raise ArgumentError.new("Invalid time duration: #{original_string.inspect}")
  end
  duration = result_durations.reduce(&:+)
  is_negative ? duration.ago : duration.from_now
end