summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2016-09-23 16:47:45 -0700
committerLamont Granquist <lamont@scriptkiddie.org>2016-10-25 09:29:29 -0700
commit69e92b100f4eccea6bf6f0953ffbc2e7f8b93b19 (patch)
tree95d04f36737b1075115b31ccb153a340b6a76928
parentf1ee3c3ad99a39bcecc631ce411378b60ec878f8 (diff)
downloadchef-69e92b100f4eccea6bf6f0953ffbc2e7f8b93b19.tar.gz
add code to implement node path tracking
via node.__path variable using __underscore format because node["path"] could very well be used and we still have to deal with node.path method_missing horribleness. Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
-rw-r--r--lib/chef/node/attribute.rb8
-rw-r--r--lib/chef/node/attribute_collections.rb8
-rw-r--r--lib/chef/node/immutable_collections.rb87
-rw-r--r--lib/chef/node/mixin/immutablize_array.rb67
-rw-r--r--lib/chef/node/mixin/immutablize_hash.rb54
-rw-r--r--lib/chef/node/mixin/path_tracking.rb49
6 files changed, 198 insertions, 75 deletions
diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb
index a4a07275c0..438a21b964 100644
--- a/lib/chef/node/attribute.rb
+++ b/lib/chef/node/attribute.rb
@@ -17,6 +17,8 @@
# limitations under the License.
#
+require "chef/node/mixin/immutablize_hash"
+require "chef/node/mixin/path_tracking"
require "chef/node/immutable_collections"
require "chef/node/attribute_collections"
require "chef/decorator/unchain"
@@ -630,8 +632,14 @@ class Chef
Chef::Mixin::DeepMerge.deep_merge(component_value, merged)
end
end
+ end
+ # needed for PathTracking
+ def convert_key(key)
+ key.kind_of?(Symbol) ? key.to_s : key
end
+ prepend Chef::Node::Mixin::PathTracking
+ prepend Chef::Node::Mixin::ImmutablizeHash
end
end
diff --git a/lib/chef/node/attribute_collections.rb b/lib/chef/node/attribute_collections.rb
index 1bd31bceb0..2f146a9528 100644
--- a/lib/chef/node/attribute_collections.rb
+++ b/lib/chef/node/attribute_collections.rb
@@ -17,6 +17,7 @@
#
require "chef/node/common_api"
+require "chef/node/mixin/path_tracking"
class Chef
class Node
@@ -104,6 +105,12 @@ class Chef
end
end
+ # needed for PathTracking
+ def convert_key(key)
+ key
+ end
+
+ prepend Chef::Node::Mixin::PathTracking
end
# == VividMash
@@ -217,6 +224,7 @@ class Chef
Mash.new(self)
end
+ prepend Chef::Node::Mixin::PathTracking
end
end
end
diff --git a/lib/chef/node/immutable_collections.rb b/lib/chef/node/immutable_collections.rb
index d4623ace2a..6fdd886754 100644
--- a/lib/chef/node/immutable_collections.rb
+++ b/lib/chef/node/immutable_collections.rb
@@ -16,6 +16,9 @@
#
require "chef/node/common_api"
+require "chef/node/mixin/path_tracking"
+require "chef/node/mixin/immutablize_array"
+require "chef/node/mixin/immutablize_hash"
class Chef
class Node
@@ -49,55 +52,12 @@ class Chef
alias :internal_push :<<
private :internal_push
- # A list of methods that mutate Array. Each of these is overridden to
- # raise an error, making this instances of this class more or less
- # immutable.
- DISALLOWED_MUTATOR_METHODS = [
- :<<,
- :[]=,
- :clear,
- :collect!,
- :compact!,
- :default=,
- :default_proc=,
- :delete,
- :delete_at,
- :delete_if,
- :fill,
- :flatten!,
- :insert,
- :keep_if,
- :map!,
- :merge!,
- :pop,
- :push,
- :update,
- :reject!,
- :reverse!,
- :replace,
- :select!,
- :shift,
- :slice!,
- :sort!,
- :sort_by!,
- :uniq!,
- :unshift,
- ]
-
def initialize(array_data)
array_data.each do |value|
internal_push(immutablize(value))
end
end
- # Redefine all of the methods that mutate a Hash to raise an error when called.
- # This is the magic that makes this object "Immutable"
- DISALLOWED_MUTATOR_METHODS.each do |mutator_method_name|
- define_method(mutator_method_name) do |*args, &block|
- raise Exceptions::ImmutableAttributeModification
- end
- end
-
# For elements like Fixnums, true, nil...
def safe_dup(e)
e.dup
@@ -125,6 +85,13 @@ class Chef
a
end
+ # for consistency's sake -- integers 'converted' to integers
+ def convert_key(key)
+ key
+ end
+
+ prepend Chef::Node::Mixin::PathTracking
+ prepend Chef::Node::Mixin::ImmutablizeArray
end
# == ImmutableMash
@@ -140,35 +107,12 @@ class Chef
# it is stale.
# * Values can be accessed in attr_reader-like fashion via method_missing.
class ImmutableMash < Mash
-
include Immutablize
include CommonAPI
alias :internal_set :[]=
private :internal_set
- DISALLOWED_MUTATOR_METHODS = [
- :[]=,
- :clear,
- :collect!,
- :default=,
- :default_proc=,
- :delete,
- :delete_if,
- :keep_if,
- :map!,
- :merge!,
- :update,
- :reject!,
- :replace,
- :select!,
- :shift,
- :write,
- :write!,
- :unlink,
- :unlink!,
- ]
-
def initialize(mash_data)
mash_data.each do |key, value|
internal_set(key, immutablize(value))
@@ -181,14 +125,6 @@ class Chef
alias :attribute? :has_key?
- # Redefine all of the methods that mutate a Hash to raise an error when called.
- # This is the magic that makes this object "Immutable"
- DISALLOWED_MUTATOR_METHODS.each do |mutator_method_name|
- define_method(mutator_method_name) do |*args, &block|
- raise Exceptions::ImmutableAttributeModification
- end
- end
-
def method_missing(symbol, *args)
if symbol == :to_ary
super
@@ -238,7 +174,8 @@ class Chef
h
end
+ prepend Chef::Node::Mixin::PathTracking
+ prepend Chef::Node::Mixin::ImmutablizeHash
end
-
end
end
diff --git a/lib/chef/node/mixin/immutablize_array.rb b/lib/chef/node/mixin/immutablize_array.rb
new file mode 100644
index 0000000000..cfa7266b9a
--- /dev/null
+++ b/lib/chef/node/mixin/immutablize_array.rb
@@ -0,0 +1,67 @@
+#--
+# Copyright:: Copyright 2016, Chef Software, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class Chef
+ class Node
+ module Mixin
+ module ImmutablizeArray
+ # A list of methods that mutate Array. Each of these is overridden to
+ # raise an error, making this instances of this class more or less
+ # immutable.
+ DISALLOWED_MUTATOR_METHODS = [
+ :<<,
+ :[]=,
+ :clear,
+ :collect!,
+ :compact!,
+ :default=,
+ :default_proc=,
+ :delete,
+ :delete_at,
+ :delete_if,
+ :fill,
+ :flatten!,
+ :insert,
+ :keep_if,
+ :map!,
+ :merge!,
+ :pop,
+ :push,
+ :update,
+ :reject!,
+ :reverse!,
+ :replace,
+ :select!,
+ :shift,
+ :slice!,
+ :sort!,
+ :sort_by!,
+ :uniq!,
+ :unshift,
+ ]
+
+ # Redefine all of the methods that mutate a Hash to raise an error when called.
+ # This is the magic that makes this object "Immutable"
+ DISALLOWED_MUTATOR_METHODS.each do |mutator_method_name|
+ define_method(mutator_method_name) do |*args, &block|
+ raise Exceptions::ImmutableAttributeModification
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/chef/node/mixin/immutablize_hash.rb b/lib/chef/node/mixin/immutablize_hash.rb
new file mode 100644
index 0000000000..f09e6944fc
--- /dev/null
+++ b/lib/chef/node/mixin/immutablize_hash.rb
@@ -0,0 +1,54 @@
+#--
+# Copyright:: Copyright 2016, Chef Software, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class Chef
+ class Node
+ module Mixin
+ module ImmutablizeHash
+ DISALLOWED_MUTATOR_METHODS = [
+ :[]=,
+ :clear,
+ :collect!,
+ :default=,
+ :default_proc=,
+ :delete,
+ :delete_if,
+ :keep_if,
+ :map!,
+ :merge!,
+ :update,
+ :reject!,
+ :replace,
+ :select!,
+ :shift,
+ :write,
+ :write!,
+ :unlink,
+ :unlink!,
+ ]
+
+ # Redefine all of the methods that mutate a Hash to raise an error when called.
+ # This is the magic that makes this object "Immutable"
+ DISALLOWED_MUTATOR_METHODS.each do |mutator_method_name|
+ define_method(mutator_method_name) do |*args, &block|
+ raise Exceptions::ImmutableAttributeModification
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/chef/node/mixin/path_tracking.rb b/lib/chef/node/mixin/path_tracking.rb
new file mode 100644
index 0000000000..58df812dd1
--- /dev/null
+++ b/lib/chef/node/mixin/path_tracking.rb
@@ -0,0 +1,49 @@
+#--
+# Copyright:: Copyright 2016, Chef Software, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+class Chef
+ class Node
+ module Mixin
+ module PathTracking
+ attr_reader :__path
+
+ def initialize(*args)
+ super
+ @__path = []
+ end
+
+ def [](key)
+ ret = super
+ ret.__path = __path + [ convert_key(key) ] if ret.is_a?(PathTracking)
+ ret
+ end
+
+ def []=(key, value)
+ ret = super
+ ret.__path = __path + [ convert_key(key) ] if ret.is_a?(PathTracking)
+ ret
+ end
+
+ protected
+
+ def __path=(path)
+ @__path = path
+ end
+ end
+ end
+ end
+end