diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2014-11-13 17:10:06 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2014-11-13 17:10:06 -0800 |
commit | 5e6c78598bc08a5d934dc4356cedabe3200652a6 (patch) | |
tree | 440186c34cd680a0d80e31d04150e04da396d871 | |
parent | 32bf6ef6d329aae0e4c8ea841e26124316186ef7 (diff) | |
download | chef-lcg/lazy-deep-merge.tar.gz |
quicksave: partial deep merge cache partially donelcg/lazy-deep-merge
-rw-r--r-- | lib/chef/node.rb | 20 | ||||
-rw-r--r-- | lib/chef/node/attribute.rb | 45 |
2 files changed, 45 insertions, 20 deletions
diff --git a/lib/chef/node.rb b/lib/chef/node.rb index dbb7852586..0e73bfeea4 100644 --- a/lib/chef/node.rb +++ b/lib/chef/node.rb @@ -169,34 +169,26 @@ class Chef attributes.override end - def override_attrs - attributes.override + alias_method :override_attrs, :override + alias_method :default_attrs, :default + alias_method :normal_attrs, :normal + + def automatic_attrs + attributes.automatic end def override_attrs=(new_values) attributes.override = new_values end - def default_attrs - attributes.default - end - def default_attrs=(new_values) attributes.default = new_values end - def normal_attrs - attributes.normal - end - def normal_attrs=(new_values) attributes.normal = new_values end - def automatic_attrs - attributes.automatic - end - def automatic_attrs=(new_values) attributes.automatic = new_values end diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb index 1d564a57e4..b2532e4504 100644 --- a/lib/chef/node/attribute.rb +++ b/lib/chef/node/attribute.rb @@ -175,6 +175,9 @@ class Chef # return the automatic level attribute component attr_reader :automatic + # cache of deep merged values by top-level key + attr_reader :deep_merge_cache + def initialize(normal, default, override, automatic) @set_unless_present = false @@ -192,9 +195,7 @@ class Chef @automatic = VividMash.new(self, automatic) - @merged_attributes = nil - @combined_override = nil - @combined_default = nil + @deep_merge_cache = {} end # Debug what's going on with an attribute. +args+ is a path spec to the @@ -230,57 +231,71 @@ class Chef @set_unless_present = setting end - def reset_cache - # FIXME: REMOVED IN CHEF-12 + def reset_cache(path = nil) + if path.nil? || path.empty? + @deep_merge_cache = {} + else + @deep_merge_cache.delete[path.first] + end end alias :reset :reset_cache # Set the cookbook level default attribute component to +new_data+. def default=(new_data) + reset @default = VividMash.new(self, new_data) end # Set the role level default attribute component to +new_data+ def role_default=(new_data) + reset @role_default = VividMash.new(self, new_data) end # Set the environment level default attribute component to +new_data+ def env_default=(new_data) + reset @env_default = VividMash.new(self, new_data) end # Set the force_default (+default!+) level attributes to +new_data+ def force_default=(new_data) + reset @force_default = VividMash.new(self, new_data) end # Set the normal level attribute component to +new_data+ def normal=(new_data) + reset @normal = VividMash.new(self, new_data) end # Set the cookbook level override attribute component to +new_data+ def override=(new_data) + reset @override = VividMash.new(self, new_data) end # Set the role level override attribute component to +new_data+ def role_override=(new_data) + reset @role_override = VividMash.new(self, new_data) end # Set the environment level override attribute component to +new_data+ def env_override=(new_data) + reset @env_override = VividMash.new(self, new_data) end def force_override=(new_data) + reset @force_override = VividMash.new(self, new_data) end def automatic=(new_data) + reset @automatic = VividMash.new(self, new_data) end @@ -290,6 +305,7 @@ class Chef # clears attributes from all precedence levels def rm(*args) + reset(args) # just easier to compute our retval, rather than collect+merge sub-retvals ret = args.inject(merged_attributes) do |attr, arg| if attr.nil? || !attr.respond_to?(:[]) @@ -320,6 +336,7 @@ class Chef # # equivalent to: force_default!['foo']['bar'].delete('baz') def rm_default(*args) + reset(args) remove_from_precedence_level(force_default!(autovivify: false), *args) end @@ -327,6 +344,7 @@ class Chef # # equivalent to: normal!['foo']['bar'].delete('baz') def rm_normal(*args) + reset(args) remove_from_precedence_level(normal!(autovivify: false), *args) end @@ -334,6 +352,7 @@ class Chef # # equivalent to: force_override!['foo']['bar'].delete('baz') def rm_override(*args) + reset(args) remove_from_precedence_level(force_override!(autovivify: false), *args) end @@ -343,26 +362,36 @@ class Chef # sets default attributes without merging def default!(opts={}) + # FIXME: do not flush whole cache + reset MultiMash.new(self, @default, [], opts) end # sets normal attributes without merging def normal!(opts={}) + # FIXME: do not flush whole cache + reset MultiMash.new(self, @normal, [], opts) end # sets override attributes without merging def override!(opts={}) + # FIXME: do not flush whole cache + reset MultiMash.new(self, @override, [], opts) end # clears from all default precedence levels and then sets force_default def force_default!(opts={}) + # FIXME: do not flush whole cache + reset MultiMash.new(self, @force_default, [@default, @env_default, @role_default], opts) end # clears from all override precedence levels and then sets force_override def force_override!(opts={}) + # FIXME: do not flush whole cache + reset MultiMash.new(self, @force_override, [@override, @env_override, @role_override], opts) end @@ -383,7 +412,11 @@ class Chef end def [](key) - merged_attributes(key) + if deep_merge_cache.has_key?(key) + deep_merge_cache[key] + else + deep_merge_cache[key] = merged_attributes(key) + end end def []=(key, value) |