Class: Chef::Node::VividMash

Inherits:
Mash
  • Object
show all
Includes:
CommonAPI, Mixin::StateTracking
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).

  • 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.

Chef::Node::Mixin::ImmutablizeHash::DISALLOWED_MUTATOR_METHODS - %i{write write! unlink unlink!}

Instance Attribute Summary

Attributes included from Mixin::StateTracking

#__node__, #__path__, #__precedence__, #__root__

Instance Method Summary collapse

Methods included from CommonAPI

#exist?, #read, #read!, #unlink, #unlink!, #write, #write!

Constructor Details

#initialize(data = {}) ⇒ VividMash

Returns a new instance of VividMash.



137
138
139
# File 'lib/chef/node/attribute_collections.rb', line 137

def initialize(data = {})
  super(data)
end

Instance Method Details

#[](key) ⇒ Object



141
142
143
144
145
146
147
148
149
# File 'lib/chef/node/attribute_collections.rb', line 141

def [](key)
  value = super
  if !key?(key)
    value = self.class.new({}, __root__)
    self[key] = value
  else
    value
  end
end

#[]=(key, value) ⇒ Object



151
152
153
154
155
# File 'lib/chef/node/attribute_collections.rb', line 151

def []=(key, value)
  ret = super
  send_reset_cache(__path__, key)
  ret # rubocop:disable Lint/Void
end

#convert_key(key) ⇒ Object



159
160
161
# File 'lib/chef/node/attribute_collections.rb', line 159

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.



167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/chef/node/attribute_collections.rb', line 167

def convert_value(value)
  case value
  when VividMash, AttrArray
    value
  when Hash
    VividMash.new(value, __root__, __node__, __precedence__)
  when Array
    AttrArray.new(value, __root__, __node__, __precedence__)
  else
    value
  end
end

#delete(key, &block) ⇒ Object



132
133
134
135
# File 'lib/chef/node/attribute_collections.rb', line 132

def delete(key, &block)
  send_reset_cache(__path__, key)
  super
end

#dupObject



180
181
182
# File 'lib/chef/node/attribute_collections.rb', line 180

def dup
  Mash.new(self)
end

#to_yaml(*opts) ⇒ Object



184
185
186
# File 'lib/chef/node/attribute_collections.rb', line 184

def to_yaml(*opts)
  to_h.to_yaml(*opts)
end