Class: Nestful::Mash
- Inherits:
-
Hash
- Object
- Hash
- Nestful::Mash
- Defined in:
- lib/nestful/mash.rb
Instance Attribute Summary collapse
-
#response ⇒ Object
readonly
Returns the value of attribute response.
Class Method Summary collapse
- .delete(*args) ⇒ Object
- .from_response(response) ⇒ Object
- .get(*args) ⇒ Object
- .post(*args) ⇒ Object
- .put(*args) ⇒ Object
- .request(*args) ⇒ Object
Instance Method Summary collapse
-
#custom_reader(key) {|value| ... } ⇒ Object
(also: #[])
Retrieves an attribute set in the Mash.
-
#custom_writer(key, value) ⇒ Object
(also: #[]=)
Sets an attribute in the Mash.
-
#deep_merge(other_hash, &blk) ⇒ Object
(also: #merge)
Performs a deep_update on a duplicate of the current mash.
-
#deep_update(other_hash, &blk) ⇒ Object
(also: #deep_merge!, #update)
Recursively merges this mash with the passed in hash, merging each hash in the hierarchy.
- #delete(key) ⇒ Object
-
#dup ⇒ Object
Duplicates the current mash as a new mash.
- #fetch(key, *args) ⇒ Object
-
#id ⇒ Object
:nodoc:.
-
#initialize(source_hash = nil, default = nil, &blk) ⇒ Mash
constructor
A new instance of Mash.
-
#initializing_reader(key) ⇒ Object
This is the bang method reader, it will return a new Mash if there isn’t a value already assigned to the key requested.
- #key?(key) ⇒ Boolean (also: #has_key?, #include?, #member?)
- #method_missing(method_name, *args, &blk) ⇒ Object
- #regular_dup ⇒ Object
- #replace(other_hash) ⇒ Object
-
#respond_to?(method_name, include_private = false) ⇒ Boolean
Will return true if the Mash has had a key set in addition to normal respond_to? functionality.
-
#shallow_merge(other_hash) ⇒ Object
Performs a shallow_update on a duplicate of the current mash.
-
#shallow_update(other_hash) ⇒ Object
Merges (non-recursively) the hash from the argument, changing the receiving hash.
-
#type ⇒ Object
:nodoc:.
-
#underbang_reader(key) ⇒ Object
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.
Constructor Details
#initialize(source_hash = nil, default = nil, &blk) ⇒ Mash
Returns a new instance of Mash.
38 39 40 41 |
# File 'lib/nestful/mash.rb', line 38 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
#method_missing(method_name, *args, &blk) ⇒ Object
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
# File 'lib/nestful/mash.rb', line 167 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 Attribute Details
#response ⇒ Object (readonly)
Returns the value of attribute response.
36 37 38 |
# File 'lib/nestful/mash.rb', line 36 def response @response end |
Class Method Details
.delete(*args) ⇒ Object
15 16 17 |
# File 'lib/nestful/mash.rb', line 15 def self.delete(*args) from_response(Nestful.delete(*args)) end |
.from_response(response) ⇒ Object
23 24 25 26 27 28 29 30 31 32 |
# File 'lib/nestful/mash.rb', line 23 def self.from_response(response) case response.decoded when Hash self.new(response.decoded) when Array response.decoded.map {|v| self.new(v) } else response end end |
.get(*args) ⇒ Object
3 4 5 |
# File 'lib/nestful/mash.rb', line 3 def self.get(*args) from_response(Nestful.get(*args)) end |
.post(*args) ⇒ Object
7 8 9 |
# File 'lib/nestful/mash.rb', line 7 def self.post(*args) from_response(Nestful.post(*args)) end |
Instance Method Details
#custom_reader(key) {|value| ... } ⇒ Object Also known as: []
Retrieves an attribute set in the Mash. Will convert any key passed in to a string before retrieving.
58 59 60 61 62 |
# File 'lib/nestful/mash.rb', line 58 def custom_reader(key) value = regular_reader(convert_key(key)) yield value if block_given? value end |
#custom_writer(key, value) ⇒ Object 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.
67 68 69 |
# File 'lib/nestful/mash.rb', line 67 def custom_writer(key,value) #:nodoc: regular_writer(convert_key(key), convert_value(value)) end |
#deep_merge(other_hash, &blk) ⇒ Object Also known as: merge
Performs a deep_update on a duplicate of the current mash.
116 117 118 |
# File 'lib/nestful/mash.rb', line 116 def deep_merge(other_hash, &blk) dup.deep_update(other_hash, &blk) end |
#deep_update(other_hash, &blk) ⇒ Object Also known as: deep_merge!, update
Recursively merges this mash with the passed in hash, merging each hash in the hierarchy.
123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/nestful/mash.rb', line 123 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 |
#delete(key) ⇒ Object
97 98 99 |
# File 'lib/nestful/mash.rb', line 97 def delete(key) super(convert_key(key)) end |
#dup ⇒ Object
Duplicates the current mash as a new mash.
103 104 105 |
# File 'lib/nestful/mash.rb', line 103 def dup self.class.new(self, self.default) end |
#fetch(key, *args) ⇒ Object
93 94 95 |
# File 'lib/nestful/mash.rb', line 93 def fetch(key, *args) super(convert_key(key), *args) end |
#id ⇒ Object
:nodoc:
45 46 47 |
# File 'lib/nestful/mash.rb', line 45 def id #:nodoc: self['id'] end |
#initializing_reader(key) ⇒ Object
This is the bang method reader, it will return a new Mash if there isn’t a value already assigned to the key requested.
76 77 78 79 80 |
# File 'lib/nestful/mash.rb', line 76 def initializing_reader(key) ck = convert_key(key) regular_writer(ck, self.class.new) unless key?(ck) regular_reader(ck) end |
#key?(key) ⇒ Boolean Also known as: has_key?, include?, member?
107 108 109 |
# File 'lib/nestful/mash.rb', line 107 def key?(key) super(convert_key(key)) end |
#regular_dup ⇒ Object
101 |
# File 'lib/nestful/mash.rb', line 101 alias_method :regular_dup, :dup |
#replace(other_hash) ⇒ Object
154 155 156 157 158 |
# File 'lib/nestful/mash.rb', line 154 def replace(other_hash) (keys - other_hash.keys).each { |key| delete(key) } other_hash.each { |key, value| self[key] = value } self end |
#respond_to?(method_name, include_private = false) ⇒ Boolean
Will return true if the Mash has had a key set in addition to normal respond_to? functionality.
162 163 164 165 |
# File 'lib/nestful/mash.rb', line 162 def respond_to?(method_name, include_private=false) return true if key?(method_name) || method_name.to_s.slice(/[=?!_]\Z/) super end |
#shallow_merge(other_hash) ⇒ Object
Performs a shallow_update on a duplicate of the current mash
141 142 143 |
# File 'lib/nestful/mash.rb', line 141 def shallow_merge(other_hash) dup.shallow_update(other_hash) end |
#shallow_update(other_hash) ⇒ Object
Merges (non-recursively) the hash from the argument, changing the receiving hash
147 148 149 150 151 152 |
# File 'lib/nestful/mash.rb', line 147 def shallow_update(other_hash) other_hash.each_pair do |k,v| regular_writer(convert_key(k), convert_value(v, true)) end self end |
#type ⇒ Object
:nodoc:
49 50 51 |
# File 'lib/nestful/mash.rb', line 49 def type #:nodoc: self['type'] end |
#underbang_reader(key) ⇒ Object
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.
84 85 86 87 88 89 90 91 |
# File 'lib/nestful/mash.rb', line 84 def underbang_reader(key) ck = convert_key(key) if key?(ck) regular_reader(ck) else self.class.new end end |