Class: Chef::Node::ImmutableArray

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

Overview

== ImmutableArray ImmutableArray is used to implement Array collections when reading node attributes.

ImmutableArray acts like an ordinary Array, except:

  • Methods that mutate the array are overridden to raise an error, making the collection more or less immutable.
  • Since this class stores values computed from a parent Chef::Node::Attribute's values, it overrides all reader methods to detect staleness and raise an error if accessed when stale.

Instance Method Summary collapse

Methods included from Immutablize

#convert_value, #immutablize

Constructor Details

#initialize(array_data = []) ⇒ ImmutableArray

Returns a new instance of ImmutableArray.


68
69
70
71
72
# File 'lib/chef/node/immutable_collections.rb', line 68

def initialize(array_data = [])
  array_data.each do |value|
    internal_push(immutablize(value))
  end
end

Instance Method Details

#dupObject


81
82
83
# File 'lib/chef/node/immutable_collections.rb', line 81

def dup
  Array.new(map { |e| safe_dup(e) })
end

#safe_dup(e) ⇒ Object

For elements like Fixnums, true, nil...


75
76
77
78
79
# File 'lib/chef/node/immutable_collections.rb', line 75

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

#to_aObject Also known as: to_array


85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/chef/node/immutable_collections.rb', line 85

def to_a
  Array.new(map do |v|
    case v
    when ImmutableArray
      v.to_a
    when ImmutableMash
      v.to_h
    else
      safe_dup(v)
    end
  end)
end

#to_yaml(*opts) ⇒ Object

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


102
103
104
# File 'lib/chef/node/immutable_collections.rb', line 102

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