Class: Clearbit::Mash
- Inherits:
-
Hash
- Object
- Hash
- Clearbit::Mash
- Defined in:
- lib/clearbit/mash.rb
Class Method Summary collapse
- .new(value = nil, *args) ⇒ Object (also: [])
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.
14 15 16 17 |
# File 'lib/clearbit/mash.rb', line 14 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
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
# File 'lib/clearbit/mash.rb', line 150 def method_missing(method_name, *args, &blk) return self.[](method_name, &blk) if key?(method_name) camelized_name = camelize(method_name.to_s) if key?(camelized_name) return self.[](camelized_name, &blk) end 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
.new(value = nil, *args) ⇒ Object Also known as: []
3 4 5 6 7 8 9 10 |
# File 'lib/clearbit/mash.rb', line 3 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 |
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.
34 35 36 37 38 |
# File 'lib/clearbit/mash.rb', line 34 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.
43 44 45 |
# File 'lib/clearbit/mash.rb', line 43 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.
92 93 94 |
# File 'lib/clearbit/mash.rb', line 92 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.
99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/clearbit/mash.rb', line 99 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
73 74 75 |
# File 'lib/clearbit/mash.rb', line 73 def delete(key) super(convert_key(key)) end |
#dup ⇒ Object
Duplicates the current mash as a new mash.
79 80 81 |
# File 'lib/clearbit/mash.rb', line 79 def dup self.class.new(self, self.default) end |
#fetch(key, *args) ⇒ Object
69 70 71 |
# File 'lib/clearbit/mash.rb', line 69 def fetch(key, *args) super(convert_key(key), *args) end |
#id ⇒ Object
:nodoc:
21 22 23 |
# File 'lib/clearbit/mash.rb', line 21 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.
52 53 54 55 56 |
# File 'lib/clearbit/mash.rb', line 52 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?
83 84 85 |
# File 'lib/clearbit/mash.rb', line 83 def key?(key) super(convert_key(key)) end |
#regular_dup ⇒ Object
77 |
# File 'lib/clearbit/mash.rb', line 77 alias_method :regular_dup, :dup |
#replace(other_hash) ⇒ Object
130 131 132 133 134 |
# File 'lib/clearbit/mash.rb', line 130 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.
138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/clearbit/mash.rb', line 138 def respond_to?(method_name, include_private=false) camelized_name = camelize(method_name.to_s) if key?(method_name) || key?(camelized_name) || method_name.to_s.slice(/[=?!_]\Z/) return true end super end |
#shallow_merge(other_hash) ⇒ Object
Performs a shallow_update on a duplicate of the current mash
117 118 119 |
# File 'lib/clearbit/mash.rb', line 117 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
123 124 125 126 127 128 |
# File 'lib/clearbit/mash.rb', line 123 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:
25 26 27 |
# File 'lib/clearbit/mash.rb', line 25 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.
60 61 62 63 64 65 66 67 |
# File 'lib/clearbit/mash.rb', line 60 def underbang_reader(key) ck = convert_key(key) if key?(ck) regular_reader(ck) else self.class.new end end |