Module: Hashie::Extensions::Coercion::ClassMethods

Defined in:
lib/hashie/extensions/coercion.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#key_coercionsObject

Returns a hash of any existing key coercions.



114
115
116
# File 'lib/hashie/extensions/coercion.rb', line 114

def key_coercions
  @key_coercions ||= {}
end

Instance Method Details

#coerce_key(*attrs) ⇒ Object Also known as: coerce_keys

Set up a coercion rule such that any time the specified key is set it will be coerced into the specified class. Coercion will occur by first attempting to call Class.coerce and then by calling Class.new with the value as an argument in either case.

Examples:

Coerce a "user" subhash into a User object

class Tweet < Hash
  include Hashie::Extensions::Coercion
  coerce_key :user, User
end

Parameters:

  • key (Object)

    the key or array of keys you would like to be coerced.

  • into (Class)

    the class into which you want the key(s) coerced.



106
107
108
109
# File 'lib/hashie/extensions/coercion.rb', line 106

def coerce_key(*attrs)
  into = attrs.pop
  attrs.each { |key| key_coercions[key] = into }
end

#coerce_value(from, into, options = {}) ⇒ Object

Set up a coercion rule such that any time a value of the specified type is set it will be coerced into the specified class.

Examples:

Coerce all hashes into this special type of hash

class SpecialHash < Hash
  include Hashie::Extensions::Coercion
  coerce_value Hash, SpecialHash

  def initialize(hash = {})
    super
    hash.each_pair do |k,v|
      self[k] = v
    end
  end
end

Parameters:

  • from (Class)

    the type you would like coerced.

  • into (Class)

    the class into which you would like the value coerced.

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :strict (Boolean) — default: true

    whether use exact source class only or include ancestors



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/hashie/extensions/coercion.rb', line 144

def coerce_value(from, into, options = {})
  options = { strict: true }.merge(options)

  if ABSTRACT_CORE_TYPES.key? from
    ABSTRACT_CORE_TYPES[from].each do | type |
      coerce_value type, into, options
    end
  end

  if options[:strict]
    strict_value_coercions[from] = into
  else
    while from.superclass && from.superclass != Object
      lenient_value_coercions[from] = into
      from = from.superclass
    end
  end
end

#inherited(klass) ⇒ Object



178
179
180
181
182
# File 'lib/hashie/extensions/coercion.rb', line 178

def inherited(klass)
  super

  klass.key_coercions = key_coercions.dup
end

#key_coercion(key) ⇒ Object

Returns the specific key coercion for the specified key, if one exists.



120
121
122
# File 'lib/hashie/extensions/coercion.rb', line 120

def key_coercion(key)
  key_coercions[key.to_sym]
end

#lenient_value_coercionsObject

Return all value coercions that have the :strict rule as false.



168
169
170
# File 'lib/hashie/extensions/coercion.rb', line 168

def lenient_value_coercions
  @lenient_value_coercions ||= {}
end

#strict_value_coercionsObject

Return all value coercions that have the :strict rule as true.



164
165
166
# File 'lib/hashie/extensions/coercion.rb', line 164

def strict_value_coercions
  @strict_value_coercions ||= {}
end

#value_coercion(value) ⇒ Object

Fetch the value coercion, if any, for the specified object.



173
174
175
176
# File 'lib/hashie/extensions/coercion.rb', line 173

def value_coercion(value)
  from = value.class
  strict_value_coercions[from] || lenient_value_coercions[from]
end