diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2015-08-20 14:05:15 -0700 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2015-09-08 15:31:31 -0700 |
commit | 558e0b0336fdcb2f7036eba68852b4192984d6ef (patch) | |
tree | a388c5c6cc85ef79e87fa58eec7cf10abf17f05c | |
parent | fd26d80e4a0cb5bdb225a57b53f91c25a8d0196e (diff) | |
download | chef-558e0b0336fdcb2f7036eba68852b4192984d6ef.tar.gz |
working deep merge cache population
-rw-r--r-- | lib/chef/node.rb | 1 | ||||
-rw-r--r-- | lib/chef/node/attribute.rb | 7 | ||||
-rw-r--r-- | lib/chef/node/attribute_cell.rb | 16 | ||||
-rw-r--r-- | lib/chef/node/attribute_trait/decorator.rb | 15 | ||||
-rw-r--r-- | lib/chef/node/attribute_trait/deep_merge_cache.rb | 40 | ||||
-rw-r--r-- | lib/chef/node/vivid_mash.rb | 1 |
6 files changed, 50 insertions, 30 deletions
diff --git a/lib/chef/node.rb b/lib/chef/node.rb index 2096c7aaa9..1a7fb23840 100644 --- a/lib/chef/node.rb +++ b/lib/chef/node.rb @@ -31,7 +31,6 @@ require 'chef/environment' require 'chef/rest' require 'chef/run_list' require 'chef/node/attribute' -require 'chef/mash' require 'chef/json_compat' require 'chef/search/query' require 'chef/whitelist' diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb index a3a52a0ece..2cbfc62fd8 100644 --- a/lib/chef/node/attribute.rb +++ b/lib/chef/node/attribute.rb @@ -10,12 +10,10 @@ class Chef include AttributeTrait::SymbolConvert include AttributeTrait::MethodMissing include AttributeTrait::Immutable - #include AttributeTrait::DeepMergeCache + include AttributeTrait::DeepMergeCache include AttributeTrait::PathTracking include AttributeConstants - #deep_merge_cache_populator - def initialize(normal: nil, default: nil, override: nil, automatic: nil, **args) super(**args) @wrapped_object ||= AttributeCell.new( @@ -29,7 +27,8 @@ class Chef env_override: {}, force_override: {}, automatic: automatic || {}, - node: __node + node: __node, + deep_merge_cache: __deep_merge_cache ) end diff --git a/lib/chef/node/attribute_cell.rb b/lib/chef/node/attribute_cell.rb index 1b9c9df234..99e207cdf0 100644 --- a/lib/chef/node/attribute_cell.rb +++ b/lib/chef/node/attribute_cell.rb @@ -25,17 +25,17 @@ class Chef attr_accessor :env_override attr_accessor :force_override attr_accessor :automatic -# attr_accessor :deep_merge_cache attr_accessor :__node + attr_accessor :__deep_merge_cache def initialize(default: nil, env_default: nil, role_default: nil, force_default: nil, normal: nil, override: nil, role_override: nil, env_override: nil, force_override: nil, automatic: nil, - node: nil -# deep_merge_cache: nil) - ) + node: nil, + deep_merge_cache: nil) @__node = node + @__deep_merge_cache = deep_merge_cache self.default = default self.env_default = env_default self.role_default = role_default @@ -46,7 +46,6 @@ class Chef self.env_override = env_override self.force_override = force_override self.automatic = automatic -# @deep_merge_cache = deep_merge_cache end COMPONENTS_AS_SYMBOLS.each do |component| @@ -54,7 +53,12 @@ class Chef instance_variable_set( :"@#{component}", if value.is_a?(Hash) || value.is_a?(Array) - Chef::Node::VividMash.new(wrapped_object: value, precedence: component, node: __node) + Chef::Node::VividMash.new( + wrapped_object: value, + precedence: component, + node: __node, + deep_merge_cache: __deep_merge_cache + ) else value end diff --git a/lib/chef/node/attribute_trait/decorator.rb b/lib/chef/node/attribute_trait/decorator.rb index 41edbd0ce3..4bbbe3f4c7 100644 --- a/lib/chef/node/attribute_trait/decorator.rb +++ b/lib/chef/node/attribute_trait/decorator.rb @@ -40,15 +40,20 @@ class Chef end def regular_reader(*path) - path.inject(wrapped_object) { |memo, key| memo[key] } + maybe_decorated_value( + path.inject(wrapped_object) { |memo, key| memo[key] } + ) end def [](key) - ret = wrapped_object[key] - if ret.is_a?(Hash) || ret.is_a?(Array) - new_decorator(wrapped_object: ret) + maybe_decorated_value(wrapped_object[key]) + end + + def maybe_decorated_value(val) + if val.is_a?(Hash) || val.is_a?(Array) + new_decorator(wrapped_object: val) else - ret + val end end diff --git a/lib/chef/node/attribute_trait/deep_merge_cache.rb b/lib/chef/node/attribute_trait/deep_merge_cache.rb index 6b05d006cb..ad18f6f30a 100644 --- a/lib/chef/node/attribute_trait/deep_merge_cache.rb +++ b/lib/chef/node/attribute_trait/deep_merge_cache.rb @@ -1,29 +1,39 @@ +require 'chef/node/attribute_trait/path_tracking' + class Chef class Node class AttributeTrait module DeepMergeCache + include PathTracking + attr_accessor :__deep_merge_cache - def initialize(deep_merge_cache: Chef::Node::Mash.new(wrapped_object: {}), **args) + def initialize(deep_merge_cache: nil, **args) super(**args) @__deep_merge_cache = deep_merge_cache end + def __deep_merge_cache + @__deep_merge_cache ||= + begin + require 'chef/node/mash' + Chef::Node::Mash.new(wrapped_object: {}) + end + end + def [](key) - if __deep_merge_cache.key?(key) && __deep_merge_cache[key][:__deep_merge_cache] - return __deep_merge_cache[key].regular_reader(:__deep_merge_cache) - end + #if __deep_merge_cache.regular_reader(__path) && __deep_merge_cache[key][:__deep_merge_cache] + # return __deep_merge_cache[key].regular_reader(:__deep_merge_cache) + #end - if is_a?(Hash) && self.class.deep_merge_cache_population + if is_a?(Chef::Node::Attribute) val = super - __deep_merge_cache[key] = Chef::Node::Mash.new(wrapped_object: {}) unless __deep_merge_cache.key?(key) - __deep_merge_cache[key].regular_writer(:__deep_merge_cache, val) - val.__deep_merge_cache = __deep_merge_cache[key] if val.is_a?(DeepMergeCache) + cache = __deep_merge_cache.regular_reader(*__path) + cache[key] = Chef::Node::Mash.new(wrapped_object: {}) unless cache.include?(key) + cache[key].regular_writer(:__deep_merge_cache, val) return val else - val = super - val.__deep_merge_cache = __deep_merge_cache[key] if val.is_a?(DeepMergeCache) - return val + super end end @@ -35,10 +45,12 @@ class Chef # end # end end + + def new_decorator(**args) + args[:deep_merge_cache] = __deep_merge_cache + super(**args) + end end end end end - -# FIXME: dep inject the mash -#require 'chef/node/mash' diff --git a/lib/chef/node/vivid_mash.rb b/lib/chef/node/vivid_mash.rb index 73abaa394c..eeefb5dabe 100644 --- a/lib/chef/node/vivid_mash.rb +++ b/lib/chef/node/vivid_mash.rb @@ -7,6 +7,7 @@ class Chef include AttributeTrait::Autovivify include AttributeTrait::SymbolConvert include AttributeTrait::MethodMissing + include AttributeTrait::DeepMergeCache include AttributeTrait::PathTracking end end |