Class: Chef::Node::ImmutableMash

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

Constant Summary

Constants included from Mixin::ImmutablizeHash

Mixin::ImmutablizeHash::ALLOWED_METHODS, Mixin::ImmutablizeHash::DISALLOWED_MUTATOR_METHODS

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!

Methods included from Immutablize

#convert_value, #immutablize

Methods included from Mixin::StateTracking

#[], #[]=

Methods inherited from Mash

#[]=, #default, #delete, #except, #fetch, from_hash, #initialize_copy, #key?, #merge, #regular_update, #regular_writer, #stringify_keys!, #symbolize_keys, #update, #values_at

Constructor Details

#initialize(mash_data = {}) ⇒ ImmutableMash

Returns a new instance of ImmutableMash.



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

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



145
146
147
148
149
150
151
# File 'lib/chef/node/immutable_collections.rb', line 145

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



128
129
130
# File 'lib/chef/node/immutable_collections.rb', line 128

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

#safe_dup(e) ⇒ Object

For elements like Fixnums, true, nil…



172
173
174
175
176
# File 'lib/chef/node/immutable_collections.rb', line 172

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

#to_hObject Also known as: to_hash



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/chef/node/immutable_collections.rb', line 153

def to_h
  h = Hash.new
  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