diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2016-09-23 16:47:45 -0700 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2016-10-25 09:29:29 -0700 |
commit | 69e92b100f4eccea6bf6f0953ffbc2e7f8b93b19 (patch) | |
tree | 95d04f36737b1075115b31ccb153a340b6a76928 /lib/chef/node | |
parent | f1ee3c3ad99a39bcecc631ce411378b60ec878f8 (diff) | |
download | chef-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>
Diffstat (limited to 'lib/chef/node')
-rw-r--r-- | lib/chef/node/attribute.rb | 8 | ||||
-rw-r--r-- | lib/chef/node/attribute_collections.rb | 8 | ||||
-rw-r--r-- | lib/chef/node/immutable_collections.rb | 87 | ||||
-rw-r--r-- | lib/chef/node/mixin/immutablize_array.rb | 67 | ||||
-rw-r--r-- | lib/chef/node/mixin/immutablize_hash.rb | 54 | ||||
-rw-r--r-- | lib/chef/node/mixin/path_tracking.rb | 49 |
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 |