diff options
-rw-r--r-- | lib/chef/node/attribute.rb | 35 | ||||
-rw-r--r-- | spec/unit/node/attribute_spec.rb | 11 |
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 |