Class: Nestful::Mash
- Inherits:
-
Hash
- Object
- Hash
- Nestful::Mash
- Defined in:
- lib/nestful/mash.rb
Class Method Summary collapse
- .delete(action = '', params = {}, options = {}) ⇒ Object
- .get(action = '', params = {}, options = {}) ⇒ Object
- .new(value = nil, *args) ⇒ Object (also: [])
- .post(action = '', params = {}, options = {}) ⇒ Object
- .put(action = '', params = {}, options = {}) ⇒ Object
- .request(url, options = {}) ⇒ 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.
34 35 36 37 |
# File 'lib/nestful/mash.rb', line 34 def initialize(source_hash = nil, default = nil, &blk) deep_update(source_hash.to_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
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
# File 'lib/nestful/mash.rb', line 163 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 |
Class Method Details
.delete(action = '', params = {}, options = {}) ⇒ Object
15 16 17 |
# File 'lib/nestful/mash.rb', line 15 def self.delete(action = '', params = {}, = {}) request(action, .merge(:method => :delete, :params => params)) end |
.get(action = '', params = {}, options = {}) ⇒ Object
3 4 5 |
# File 'lib/nestful/mash.rb', line 3 def self.get(action = '', params = {}, = {}) request(action, .merge(:method => :get, :params => params)) end |
.new(value = nil, *args) ⇒ Object Also known as: []
23 24 25 26 27 28 29 30 |
# File 'lib/nestful/mash.rb', line 23 def self.new(value = nil, *args) if value.respond_to?(:each) && !value.respond_to?(:each_pair) value.map {|v| super(v) } else super end end |
.post(action = '', params = {}, options = {}) ⇒ Object
11 12 13 |
# File 'lib/nestful/mash.rb', line 11 def self.post(action = '', params = {}, = {}) request(action, .merge(:method => :post, :params => params)) end |
.put(action = '', params = {}, options = {}) ⇒ Object
7 8 9 |
# File 'lib/nestful/mash.rb', line 7 def self.put(action = '', params = {}, = {}) request(action, .merge(:method => :put, :params => params)) 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.
54 55 56 57 58 |
# File 'lib/nestful/mash.rb', line 54 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.
63 64 65 |
# File 'lib/nestful/mash.rb', line 63 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.
112 113 114 |
# File 'lib/nestful/mash.rb', line 112 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.
119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/nestful/mash.rb', line 119 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
93 94 95 |
# File 'lib/nestful/mash.rb', line 93 def delete(key) super(convert_key(key)) end |
#dup ⇒ Object
Duplicates the current mash as a new mash.
99 100 101 |
# File 'lib/nestful/mash.rb', line 99 def dup self.class.new(self, self.default) end |
#fetch(key, *args) ⇒ Object
89 90 91 |
# File 'lib/nestful/mash.rb', line 89 def fetch(key, *args) super(convert_key(key), *args) end |
#id ⇒ Object
:nodoc:
41 42 43 |
# File 'lib/nestful/mash.rb', line 41 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.
72 73 74 75 76 |
# File 'lib/nestful/mash.rb', line 72 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?
103 104 105 |
# File 'lib/nestful/mash.rb', line 103 def key?(key) super(convert_key(key)) end |
#regular_dup ⇒ Object
97 |
# File 'lib/nestful/mash.rb', line 97 alias_method :regular_dup, :dup |
#replace(other_hash) ⇒ Object
150 151 152 153 154 |
# File 'lib/nestful/mash.rb', line 150 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.
158 159 160 161 |
# File 'lib/nestful/mash.rb', line 158 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
137 138 139 |
# File 'lib/nestful/mash.rb', line 137 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
143 144 145 146 147 148 |
# File 'lib/nestful/mash.rb', line 143 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:
45 46 47 |
# File 'lib/nestful/mash.rb', line 45 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.
80 81 82 83 84 85 86 87 |
# File 'lib/nestful/mash.rb', line 80 def underbang_reader(key) ck = convert_key(key) if key?(ck) regular_reader(ck) else self.class.new end end |