summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/chef/node/attribute.rb35
-rw-r--r--spec/unit/node/attribute_spec.rb11
2 files changed, 31 insertions, 15 deletions
diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb
index d8302cf18e..eb6a0372d5 100644
--- a/lib/chef/node/attribute.rb
+++ b/lib/chef/node/attribute.rb
@@ -284,7 +284,7 @@ class Chef
def merged_attributes
@merged_attributes ||= begin
- components = [combined_default, @normal, combined_override, @automatic]
+ components = [merge_defaults, @normal, merge_overrides, @automatic]
resolved_attrs = components.inject(Mash.new) do |merged, component|
Chef::Mixin::DeepMerge.hash_only_merge(merged, component)
end
@@ -293,23 +293,11 @@ class Chef
end
def combined_override
- @combined_override ||= begin
- resolved_attrs = OVERRIDE_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
- component_value = instance_variable_get(component_ivar)
- Chef::Mixin::DeepMerge.merge(merged, component_value)
- end
- immutablize(resolved_attrs)
- end
+ @combined_override ||= immutablize(merge_overrides)
end
def combined_default
- @combined_default ||= begin
- resolved_attrs = DEFAULT_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
- component_value = instance_variable_get(component_ivar)
- Chef::Mixin::DeepMerge.merge(merged, component_value)
- end
- immutablize(resolved_attrs)
- end
+ @combined_default ||= immutablize(merge_defaults)
end
def [](key)
@@ -358,6 +346,23 @@ class Chef
@set_unless_present
end
+ private
+
+ def merge_defaults
+ DEFAULT_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
+ component_value = instance_variable_get(component_ivar)
+ Chef::Mixin::DeepMerge.merge(merged, component_value)
+ end
+ end
+
+ def merge_overrides
+ OVERRIDE_COMPONENTS.inject(Mash.new) do |merged, component_ivar|
+ component_value = instance_variable_get(component_ivar)
+ Chef::Mixin::DeepMerge.merge(merged, component_value)
+ end
+ end
+
+
end
end
diff --git a/spec/unit/node/attribute_spec.rb b/spec/unit/node/attribute_spec.rb
index 8c654679fe..fac898be26 100644
--- a/spec/unit/node/attribute_spec.rb
+++ b/spec/unit/node/attribute_spec.rb
@@ -307,6 +307,17 @@ describe Chef::Node::Attribute do
@attributes.role_override["array"] = %w{role}
@attributes["array"].should == %w{role}
end
+
+ it "merges nested hashes between precedence levels" do
+ @attributes = Chef::Node::Attribute.new({}, {}, {}, {})
+ @attributes.env_default = {"a" => {"b" => {"default" => "default"}}}
+ @attributes.normal = {"a" => {"b" => {"normal" => "normal"}}}
+ @attributes.override = {"a" => {"override" => "role"}}
+ @attributes.automatic = {"a" => {"automatic" => "auto"}}
+ @attributes["a"].should == {"b"=>{"default"=>"default", "normal"=>"normal"},
+ "override"=>"role",
+ "automatic"=>"auto"}
+ end
end
describe "when reading combined default or override values" do