module NxtSupport::DurationAttributeAccessor

Public Instance Methods

define_duration_attribute_reader(attr_name) click to toggle source
# File lib/nxt_support/models/duration_attribute_accessor.rb, line 25
def define_duration_attribute_reader(attr_name)
  define_method(attr_name) do
    duration_string = read_attribute(attr_name)
    return if duration_string.nil?

    ActiveSupport::Duration.parse(duration_string)
  end
end
define_duration_attribute_writer(attr_name) click to toggle source
# File lib/nxt_support/models/duration_attribute_accessor.rb, line 34
def define_duration_attribute_writer(attr_name)
  define_method("#{attr_name}=") do |value|
    case value
    when ActiveSupport::Duration
      write_attribute(attr_name, value.iso8601)
    when String
      if is_valid_iso8601_duration?(value)
        write_attribute(attr_name, value)
      else
        raise ArgumentError, "'#{value}' is not a valid iso8601 string"
      end
    when NilClass
      write_attribute(attr_name, value)
    else
      raise ArgumentError, 'Please provide an ActiveSupport::Duration object or an iso8601 formatted string'
    end
  end
end
duration_attribute_accessor(*attrs) click to toggle source
# File lib/nxt_support/models/duration_attribute_accessor.rb, line 6
def duration_attribute_accessor(*attrs)
  duration_attribute_reader(*attrs)
  duration_attribute_writer(*attrs)
end
duration_attribute_reader(*attrs) click to toggle source
# File lib/nxt_support/models/duration_attribute_accessor.rb, line 11
def duration_attribute_reader(*attrs)
  attrs.each do |attr_name|
    define_duration_attribute_reader(attr_name)
  end
end
duration_attribute_writer(*attrs) click to toggle source
# File lib/nxt_support/models/duration_attribute_accessor.rb, line 17
def duration_attribute_writer(*attrs)
  attrs.each do |attr_name|
    define_duration_attribute_writer(attr_name)
  end
end
is_valid_iso8601_duration?(string) click to toggle source
# File lib/nxt_support/models/duration_attribute_accessor.rb, line 55
def is_valid_iso8601_duration?(string)
  ActiveSupport::Duration.parse(string)
  true
rescue ActiveSupport::Duration::ISO8601Parser::ParsingError
  false
end