Class: Chef::Node::ImmutableMash

Inherits:
Mash
  • Object
show all
Includes:
CommonAPI, Immutablize
Defined in:
lib/chef/node/immutable_collections.rb

Overview

== ImmutableMash ImmutableMash implements Hash/Dict behavior for reading values from node attributes.

ImmutableMash acts like a Mash (Hash that is indifferent to String or Symbol keys), with some important exceptions:

  • Methods that mutate state are overridden to raise an error instead.
  • Methods that read from the collection are overridden so that they check if the Chef::Node::Attribute has been modified since an instance of this class was generated. An error is raised if the object detects that it is stale.
  • Values can be accessed in attr_reader-like fashion via method_missing.

Instance Method Summary collapse

Methods included from CommonAPI

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

Methods included from Immutablize

#convert_value, #immutablize

Constructor Details

#initialize(mash_data = {}) ⇒ ImmutableMash

Returns a new instance of ImmutableMash.


138
139
140
141
142
# File 'lib/chef/node/immutable_collections.rb', line 138

def initialize(mash_data = {})
  mash_data.each do |key, value|
    internal_set(key, value)
  end
end

Instance Method Details

#dupObject

NOTE: #default and #default= are likely to be pretty confusing. For a regular ruby Hash, they control what value is returned for, e.g., hash[:no_such_key] #=> hash.default Of course, 'default' has a specific meaning in Chef-land


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

def dup
  h = Mash.new
  each_pair do |k, v|
    h[k] = safe_dup(v)
  end
  h
end

#internal_set(key, value) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

this is for deep_merge usage, chef users must never touch this API


134
135
136
# File 'lib/chef/node/immutable_collections.rb', line 134

def internal_set(key, value)
  regular_writer(key, convert_value(value))
end

#safe_dup(e) ⇒ Object

For elements like Fixnums, true, nil...


184
185
186
187
188
# File 'lib/chef/node/immutable_collections.rb', line 184

def safe_dup(e)
  e.dup
rescue TypeError
  e
end

#to_hObject Also known as: to_hash


159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/chef/node/immutable_collections.rb', line 159

def to_h
  h = {}
  each_pair do |k, v|
    h[k] =
      case v
      when ImmutableMash
        v.to_h
      when ImmutableArray
        v.to_a
      else
        safe_dup(v)
      end
  end
  h
end

#to_yaml(*opts) ⇒ Object

As Psych module, not respecting ImmutableMash object So first convert it to Hash/Array then parse it to .to_yaml


179
180
181
# File 'lib/chef/node/immutable_collections.rb', line 179

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