summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2015-08-20 14:05:15 -0700
committerLamont Granquist <lamont@scriptkiddie.org>2015-09-08 15:31:31 -0700
commit558e0b0336fdcb2f7036eba68852b4192984d6ef (patch)
treea388c5c6cc85ef79e87fa58eec7cf10abf17f05c
parentfd26d80e4a0cb5bdb225a57b53f91c25a8d0196e (diff)
downloadchef-558e0b0336fdcb2f7036eba68852b4192984d6ef.tar.gz
working deep merge cache population
-rw-r--r--lib/chef/node.rb1
-rw-r--r--lib/chef/node/attribute.rb7
-rw-r--r--lib/chef/node/attribute_cell.rb16
-rw-r--r--lib/chef/node/attribute_trait/decorator.rb15
-rw-r--r--lib/chef/node/attribute_trait/deep_merge_cache.rb40
-rw-r--r--lib/chef/node/vivid_mash.rb1
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