Sha256: 95398cea7bf68426ccd7e151a7c9656beaaea81178078ec9104a60a8dc90c73e

Contents?: true

Size: 879 Bytes

Versions: 4

Compression:

Stored size: 879 Bytes

Contents

# frozen_string_literal: true

module FidoMetadata
  module Attributes
    def underscore_name(name)
      name
        .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
        .gsub(/([a-z\d])([A-Z])/, '\1_\2')
        .downcase
        .to_sym
    end

    private :underscore_name

    def json_accessor(name, coercer = nil)
      underscored_name = underscore_name(name)
      attr_accessor underscored_name

      if coercer
        define_method(:"#{underscored_name}=") do |value|
          coerced_value = coercer.coerce(value)
          instance_variable_set(:"@#{underscored_name}", coerced_value)
        end
      end
    end

    def from_json(hash = {})
      instance = new
      hash.each do |k, v|
        method_name = :"#{underscore_name(k)}="
        instance.public_send(method_name, v) if instance.respond_to?(method_name)
      end

      instance
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
fido_metadata-0.4.0 lib/fido_metadata/attributes.rb
fido_metadata-0.3.0 lib/fido_metadata/attributes.rb
fido_metadata-0.2.0 lib/fido_metadata/attributes.rb
fido_metadata-0.1.0 lib/fido_metadata/attributes.rb