Class: Chef::Node::VividMash
- Defined in:
- lib/chef/node/attribute_collections.rb
Overview
VividMash
VividMash is identical to a Mash, with a few exceptions:
-
It has a reference to the root Chef::Node::Attribute to which it belongs, and will trigger cache invalidation on that object when mutated.
-
It auto-vivifies, that is a reference to a missing element will result in the creation of a new VividMash for that key. (This only works when using the element reference method, ‘[]` – other methods, such as #fetch, work as normal).
-
It supports a set_unless flag (via the root Attribute object) which allows ‘||=` style behavior (`||=` does not work with auto-vivification). This is only implemented for #[]=; methods such as #store work as normal.
-
attr_accessor style element set and get are supported via method_missing
Constant Summary collapse
- MUTATOR_METHODS =
Methods that mutate a VividMash. Each of them is overridden so that it also invalidates the cached merged_attributes on the root Attribute object.
[ :clear, :delete, :delete_if, :keep_if, :merge!, :update, :reject!, :replace, :select!, :shift, ]
Instance Attribute Summary collapse
-
#root ⇒ Object
readonly
Returns the value of attribute root.
Instance Method Summary collapse
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object
- #convert_key(key) ⇒ Object
-
#convert_value(value) ⇒ Object
Mash uses #convert_value to mashify values on input.
- #dup ⇒ Object
-
#initialize(root, data = {}) ⇒ VividMash
constructor
A new instance of VividMash.
- #method_missing(symbol, *args) ⇒ Object
- #set_unless? ⇒ Boolean
Methods inherited from Mash
#default, #delete, #except, #fetch, from_hash, #initialize_copy, #key?, #merge, #regular_update, #regular_writer, #stringify_keys!, #symbolize_keys, #to_hash, #update, #values_at
Constructor Details
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(symbol, *args) ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
# File 'lib/chef/node/attribute_collections.rb', line 161 def method_missing(symbol, *args) # Calling `puts arg` implicitly calls #to_ary on `arg`. If `arg` does # not implement #to_ary, ruby recognizes it as a single argument, and # if it returns an Array, then ruby prints each element. If we don't # account for that here, we'll auto-vivify a VividMash for the key # :to_ary which creates an unwanted key and raises a TypeError. if symbol == :to_ary super elsif args.empty? self[symbol] elsif symbol.to_s =~ /=$/ key_to_set = symbol.to_s[/^(.+)=$/, 1] self[key_to_set] = (args.length == 1 ? args[0] : args) else raise NoMethodError, "Undefined node attribute or method `#{symbol}' on `node'. To set an attribute, use `#{symbol}=value' instead." end end |
Instance Attribute Details
#root ⇒ Object (readonly)
Returns the value of attribute root.
105 106 107 |
# File 'lib/chef/node/attribute_collections.rb', line 105 def root @root end |
Instance Method Details
#[](key) ⇒ Object
138 139 140 141 142 143 144 145 146 147 |
# File 'lib/chef/node/attribute_collections.rb', line 138 def [](key) root. ||= key value = super if !key?(key) value = self.class.new(root) self[key] = value else value end end |
#[]=(key, value) ⇒ Object
149 150 151 152 153 154 155 156 157 |
# File 'lib/chef/node/attribute_collections.rb', line 149 def []=(key, value) root. ||= key if set_unless? && key?(key) && !self[key].nil? self[key] else root.reset_cache(root.) super end end |
#convert_key(key) ⇒ Object
183 184 185 |
# File 'lib/chef/node/attribute_collections.rb', line 183 def convert_key(key) super end |
#convert_value(value) ⇒ Object
Mash uses #convert_value to mashify values on input. We override it here to convert hash or array values to VividMash or AttrArray for consistency and to ensure that the added parts of the attribute tree will have the correct cache invalidation behavior.
191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/chef/node/attribute_collections.rb', line 191 def convert_value(value) case value when VividMash value when Hash VividMash.new(root, value) when Array AttrArray.new(root, value) else value end end |
#dup ⇒ Object
204 205 206 |
# File 'lib/chef/node/attribute_collections.rb', line 204 def dup Mash.new(self) end |
#set_unless? ⇒ Boolean
179 180 181 |
# File 'lib/chef/node/attribute_collections.rb', line 179 def set_unless? @root.set_unless? end |