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