Class: HashWithIndifferentAccess

Inherits:
Hash
  • Object
show all
Defined in:
lib/tpkg/metadata.rb

Overview

This class is taken from the ActiveSupport gem. With yaml, keys are stored as string. But when we convert xml to hash, we store the key as symbol. To make it more convenient, we’ll be subclassing our metadata hash with this class. That way, we can access our metadata using either string or symbol as the key.

Instance Method Summary collapse

Methods included from HashUtils

#recursively, #rekey, #stringify_keys, #symbolize_keys

Methods included from IndifferentAccess

#with_indifferent_access

Constructor Details

#initialize(constructor = {}) ⇒ HashWithIndifferentAccess

Returns a new instance of HashWithIndifferentAccess.



25
26
27
28
29
30
31
32
# File 'lib/tpkg/metadata.rb', line 25

def initialize(constructor = {})
  if constructor.is_a?(Hash)
    super()
    update(constructor)
  else
    super(constructor)
  end
end

Instance Method Details

#[]=(key, value) ⇒ Object

Assigns a new value to the hash:

hash = HashWithIndifferentAccess.new
hash[:key] = "value"


50
51
52
# File 'lib/tpkg/metadata.rb', line 50

def []=(key, value)
  regular_writer(convert_key(key), convert_value(value))
end

#default(key = nil) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/tpkg/metadata.rb', line 34

def default(key = nil)
  if key.is_a?(Symbol) && include?(key = key.to_s)
    self[key]
  else
    super
  end
end

#delete(key) ⇒ Object

Removes a specified key from the hash.



114
115
116
# File 'lib/tpkg/metadata.rb', line 114

def delete(key)
  super(convert_key(key))
end

#dupObject

Returns an exact copy of the hash.



103
104
105
# File 'lib/tpkg/metadata.rb', line 103

def dup
  HashWithIndifferentAccess.new(self)
end

#fetch(key, *extras) ⇒ Object

Fetches the value for the specified key, same as doing hash



87
88
89
# File 'lib/tpkg/metadata.rb', line 87

def fetch(key, *extras)
  super(convert_key(key), *extras)
end

#key?(key) ⇒ Boolean Also known as: include?, has_key?, member?

Checks the hash for a key matching the argument passed in:

hash = HashWithIndifferentAccess.new
hash["key"] = "value"
hash.key? :key  # => true
hash.key? "key" # => true

Returns:

  • (Boolean)


78
79
80
# File 'lib/tpkg/metadata.rb', line 78

def key?(key)
  super(convert_key(key))
end

#merge(hash) ⇒ Object

Merges the instantized and the specified hashes together, giving precedence to the values from the second hash Does not overwrite the existing hash.



109
110
111
# File 'lib/tpkg/metadata.rb', line 109

def merge(hash)
  self.dup.update(hash)
end

#regular_updateObject



43
# File 'lib/tpkg/metadata.rb', line 43

alias_method :regular_update, :update

#regular_writerObject



42
# File 'lib/tpkg/metadata.rb', line 42

alias_method :regular_writer, :[]=

#stringify_keys!Object



118
# File 'lib/tpkg/metadata.rb', line 118

def stringify_keys!; self end

#symbolize_keys!Object



119
# File 'lib/tpkg/metadata.rb', line 119

def symbolize_keys!; self end

#to_hashObject

Convert to a Hash with String keys.



123
124
125
# File 'lib/tpkg/metadata.rb', line 123

def to_hash
  Hash.new(default).merge(self)
end

#to_options!Object



120
# File 'lib/tpkg/metadata.rb', line 120

def to_options!; self end

#update(other_hash) ⇒ Object Also known as: merge!

Updates the instantized hash with values from the second:

hash_1 = HashWithIndifferentAccess.new
hash_1[:key] = "value"

hash_2 = HashWithIndifferentAccess.new
hash_2[:key] = "New Value!"

hash_1.update(hash_2) # => {"key"=>"New Value!"}


64
65
66
67
# File 'lib/tpkg/metadata.rb', line 64

def update(other_hash)
  other_hash.each_pair { |key, value| regular_writer(convert_key(key), convert_value(value)) }
  self
end

#values_at(*indices) ⇒ Object

Returns an array of the values at the specified indices:

hash = HashWithIndifferentAccess.new
hash[:a] = "x"
hash[:b] = "y"
hash.values_at("a", "b") # => ["x", "y"]


98
99
100
# File 'lib/tpkg/metadata.rb', line 98

def values_at(*indices)
  indices.collect {|key| self[convert_key(key)]}
end