Sha256: d5ac885b20c77b9dea3a7db392eba35a58a95585a3dca2a530f10fbb90811cd2

Contents?: true

Size: 1.69 KB

Versions: 11

Compression:

Stored size: 1.69 KB

Contents

module NxtSupport
  module DurationAttributeAccessor
    extend ActiveSupport::Concern

    class_methods do
      def duration_attribute_accessor(*attrs)
        duration_attribute_reader(*attrs)
        duration_attribute_writer(*attrs)
      end

      def duration_attribute_reader(*attrs)
        attrs.each do |attr_name|
          define_duration_attribute_reader(attr_name)
        end
      end

      def duration_attribute_writer(*attrs)
        attrs.each do |attr_name|
          define_duration_attribute_writer(attr_name)
        end
      end

      private

      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

      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
    end


    def is_valid_iso8601_duration?(string)
      ActiveSupport::Duration.parse(string)
      true
    rescue ActiveSupport::Duration::ISO8601Parser::ParsingError
      false
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
nxt_support-0.6.0 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.5.0 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.4.3 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.4.2 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.4.1 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.4.0 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.3.0 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.2.1 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.2.0 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.1.16 lib/nxt_support/models/duration_attribute_accessor.rb
nxt_support-0.1.15 lib/nxt_support/models/duration_attribute_accessor.rb