Class: Hashie::Mash
- Inherits:
-
Hash
- Object
- Hash
- Hash
- Hashie::Mash
- Includes:
- PrettyInspect
- Defined in:
- lib/hashie/mash.rb
Overview
Mash allows you to create pseudo-objects that have method-like accessors for hash keys. This is useful for such implementations as an API-accessing library that wants to fake robust objects without the overhead of actually doing so. Think of it as OpenStruct with some additional goodies.
A Mash will look at the methods you pass it and perform operations based on the following rules:
- No punctuation: Returns the value of the hash for that key, or nil if none exists.
- Assignment (=): Sets the attribute of the given method name.
- Existence (?): Returns true or false depending on whether that key has been set.
- Bang (!): Forces the existence of this key, used for deep Mashes. Think of it as "touch" for mashes.
- Under Bang (_): Like Bang, but returns a new Mash rather than creating a key. Used to test existance in deep Mashes.
== Basic Example
mash = Mash.new mash.name? # => false mash.name = "Bob" mash.name # => "Bob" mash.name? # => true
== Hash Conversion Example
hash = => {:b => 23, :d => {:e => "abc"}, :f => [=> 44, :h => 29, 12]} mash = Mash.new(hash) mash.a.b # => 23 mash.a.d.e # => "abc" mash.f.first.g # => 44 mash.f.last # => 12
== Bang Example
mash = Mash.new
mash.author # => nil
mash.author! # =>
mash = Mash.new
mash.author!.name = "Michael Bleigh"
mash.author # =>
== Under Bang Example
mash = Mash.new
mash.author # => nil
mash.author_ # =>
mash = Mash.new
mash.author_.name = "Michael Bleigh" (assigned to temp object)
mash.author # =>
Instance Method Summary (collapse)
-
- (Object) custom_reader(key) {|value| ... }
(also: #[])
Retrieves an attribute set in the Mash.
-
- (Object) custom_writer(key, value)
(also: #[]=)
Sets an attribute in the Mash.
-
- (Object) deep_merge(other_hash, &blk)
(also: #merge)
Performs a deep_update on a duplicate of the current mash.
-
- (Object) deep_update(other_hash, &blk)
(also: #deep_merge!, #update)
Recursively merges this mash with the passed in hash, merging each hash in the hierarchy.
- - (Object) delete(key)
-
- (Object) dup
Duplicates the current mash as a new mash.
- - (Object) fetch(key, *args)
-
- (Object) id
:nodoc:.
-
- (Mash) initialize(source_hash = nil, default = nil, &blk)
constructor
If you pass in an existing hash, it will convert it to a Mash including recursively descending into arrays and hashes, converting them as well.
-
- (Object) initializing_reader(key)
This is the bang method reader, it will return a new Mash if there isn't a value already assigned to the key requested.
- - (Boolean) key?(key) (also: #has_key?, #include?, #member?)
- - (Object) method_missing(method_name, *args, &blk)
- - (Object) regular_dup
- - (Object) replace(other_hash)
-
- (Boolean) respond_to?(method_name, include_private = false)
Will return true if the Mash has had a key set in addition to normal respond_to? functionality.
-
- (Object) shallow_merge(other_hash)
Performs a shallow_update on a duplicate of the current mash.
-
- (Object) shallow_update(other_hash)
Merges (non-recursively) the hash from the argument, changing the receiving hash.
-
- (Object) type
:nodoc:.
-
- (Object) underbang_reader(key)
This is the under bang method reader, it will return a temporary new Mash if there isn't a value already assigned to the key requested.
Methods included from PrettyInspect
Methods inherited from Hash
Methods included from HashExtensions
#hashie_stringify_keys, #hashie_stringify_keys!, included, #to_mash
Constructor Details
- (Mash) initialize(source_hash = nil, default = nil, &blk)
If you pass in an existing hash, it will convert it to a Mash including recursively descending into arrays and hashes, converting them as well.
65 66 67 68 |
# File 'lib/hashie/mash.rb', line 65 def initialize(source_hash = nil, default = nil, &blk) deep_update(source_hash) if source_hash default ? super(default) : super(&blk) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
- (Object) method_missing(method_name, *args, &blk)
194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/hashie/mash.rb', line 194 def method_missing(method_name, *args, &blk) return self.[](method_name, &blk) if key?(method_name) match = method_name.to_s.match(/(.*?)([?=!_]?)$/) case match[2] when "=" self[match[1]] = args.first when "?" !!self[match[1]] when "!" initializing_reader(match[1]) when "_" underbang_reader(match[1]) else default(method_name, *args, &blk) end end |
Instance Method Details
- (Object) custom_reader(key) {|value| ... } Also known as: []
Retrieves an attribute set in the Mash. Will convert any key passed in to a string before retrieving.
85 86 87 88 89 |
# File 'lib/hashie/mash.rb', line 85 def custom_reader(key) value = regular_reader(convert_key(key)) yield value if block_given? value end |
- (Object) custom_writer(key, value) Also known as: []=
Sets an attribute in the Mash. Key will be converted to a string before it is set, and Hashes will be converted into Mashes for nesting purposes.
94 95 96 |
# File 'lib/hashie/mash.rb', line 94 def custom_writer(key,value) #:nodoc: regular_writer(convert_key(key), convert_value(value)) end |
- (Object) deep_merge(other_hash, &blk) Also known as: merge
Performs a deep_update on a duplicate of the current mash.
143 144 145 |
# File 'lib/hashie/mash.rb', line 143 def deep_merge(other_hash, &blk) dup.deep_update(other_hash, &blk) end |
- (Object) deep_update(other_hash, &blk) Also known as: deep_merge!, update
Recursively merges this mash with the passed in hash, merging each hash in the hierarchy.
150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/hashie/mash.rb', line 150 def deep_update(other_hash, &blk) other_hash.each_pair do |k,v| key = convert_key(k) if regular_reader(key).is_a?(Mash) and v.is_a?(::Hash) custom_reader(key).deep_update(v, &blk) else value = convert_value(v, true) value = blk.call(key, self[k], value) if blk custom_writer(key, value) end end self end |
- (Object) delete(key)
124 125 126 |
# File 'lib/hashie/mash.rb', line 124 def delete(key) super(convert_key(key)) end |
- (Object) dup
Duplicates the current mash as a new mash.
130 131 132 |
# File 'lib/hashie/mash.rb', line 130 def dup self.class.new(self, self.default) end |
- (Object) fetch(key, *args)
120 121 122 |
# File 'lib/hashie/mash.rb', line 120 def fetch(key, *args) super(convert_key(key), *args) end |
- (Object) id
:nodoc:
72 73 74 |
# File 'lib/hashie/mash.rb', line 72 def id #:nodoc: self["id"] end |
- (Object) initializing_reader(key)
This is the bang method reader, it will return a new Mash if there isn't a value already assigned to the key requested.
103 104 105 106 107 |
# File 'lib/hashie/mash.rb', line 103 def initializing_reader(key) ck = convert_key(key) regular_writer(ck, self.class.new) unless key?(ck) regular_reader(ck) end |
- (Boolean) key?(key) Also known as: has_key?, include?, member?
134 135 136 |
# File 'lib/hashie/mash.rb', line 134 def key?(key) super(convert_key(key)) end |
- (Object) regular_dup
128 |
# File 'lib/hashie/mash.rb', line 128 alias_method :regular_dup, :dup |
- (Object) replace(other_hash)
181 182 183 184 185 |
# File 'lib/hashie/mash.rb', line 181 def replace(other_hash) (keys - other_hash.keys).each { |key| delete(key) } other_hash.each { |key, value| self[key] = value } self end |
- (Boolean) respond_to?(method_name, include_private = false)
Will return true if the Mash has had a key set in addition to normal respond_to? functionality.
189 190 191 192 |
# File 'lib/hashie/mash.rb', line 189 def respond_to?(method_name, include_private=false) return true if key?(method_name) || method_name.to_s.slice(/[=?!_]\Z/) super end |
- (Object) shallow_merge(other_hash)
Performs a shallow_update on a duplicate of the current mash
168 169 170 |
# File 'lib/hashie/mash.rb', line 168 def shallow_merge(other_hash) dup.shallow_update(other_hash) end |
- (Object) shallow_update(other_hash)
Merges (non-recursively) the hash from the argument, changing the receiving hash
174 175 176 177 178 179 |
# File 'lib/hashie/mash.rb', line 174 def shallow_update(other_hash) other_hash.each_pair do |k,v| regular_writer(convert_key(k), convert_value(v, true)) end self end |
- (Object) type
:nodoc:
76 77 78 |
# File 'lib/hashie/mash.rb', line 76 def type #:nodoc: self["type"] end |
- (Object) underbang_reader(key)
This is the under bang method reader, it will return a temporary new Mash if there isn't a value already assigned to the key requested.
111 112 113 114 115 116 117 118 |
# File 'lib/hashie/mash.rb', line 111 def underbang_reader(key) ck = convert_key(key) if key?(ck) regular_reader(ck) else self.class.new end end |