diff options
Diffstat (limited to 'lib/chef/node/attribute.rb')
-rw-r--r-- | lib/chef/node/attribute.rb | 92 |
1 files changed, 35 insertions, 57 deletions
diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb index 86de146b23..868f01e08f 100644 --- a/lib/chef/node/attribute.rb +++ b/lib/chef/node/attribute.rb @@ -27,8 +27,8 @@ class Chef env_override: {}, force_override: {}, automatic: automatic || {}, - node: __node, - deep_merge_cache: __deep_merge_cache + deep_merge_cache: __deep_merge_cache, + node: __node ) end @@ -60,17 +60,17 @@ class Chef def normal_unless(*args) return UnMethodChain.new(wrapped_object: self, method_to_call: :normal_unless) unless args.length > 0 - write_value(:normal, *args) if args_to_cell(*args).nil? + write_value(:normal, *args) if safe_reader(*args[0...-1]).nil? end def default_unless(*args) return UnMethodChain.new(wrapped_object: self, method_to_call: :default_unless) unless args.length > 0 - write_value(:default, *args) if args_to_cell(*args).nil? + write_value(:default, *args) if safe_reader(*args[0...-1]).nil? end def override_unless(*args) return UnMethodChain.new(wrapped_object: self, method_to_call: :override_unless) unless args.length > 0 - write_value(:override, *args) if args_to_cell(*args).nil? + write_value(:override, *args) if safe_reader(*args[0...-1]).nil? end # should deprecate all of these, epecially #set @@ -85,16 +85,8 @@ class Chef alias_method :automatic_attrs, :automatic alias_method :automatic_attrs=, :automatic= - def has_key?(key) - self.public_send(:key?, key) - end - - alias_method :attribute?, :has_key? - alias_method :member?, :has_key? - - def include?(val) - wrapped_object.public_send(:include?, val) - end + alias_method :attribute?, :include? + alias_method :member?, :include? def each_attribute(&block) self.public_send(:each, &block) @@ -127,6 +119,8 @@ class Chef end end + # FIXME: doesn't decorator handle all this delgated crap now? + # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv def to_s wrapped_object.to_s end @@ -156,31 +150,35 @@ class Chef # - does not autovivify # - does not trainwreck if interior keys do not exist def rm(*args) - cell = args_to_cell(*args) - return nil unless cell.is_a?(Hash) - ret = cell[args.last] - rm_default(*args) - rm_normal(*args) - rm_override(*args) + with_deep_merged_return_value(self, *args) do + rm_default(*args) + rm_normal(*args) + rm_override(*args) + end + end + + def with_deep_merged_return_value(obj, *args) + hash = obj.safe_reader(*args[0...-1]) + return nil unless hash.is_a?(Hash) + ret = hash[args.last] + yield ret end + private :with_deep_merged_return_value + # clears attributes from all default precedence levels # # - similar to: force_default!['foo']['bar'].delete('baz') # - does not autovivify # - does not trainwreck if interior keys do not exist def rm_default(*args) - cell = args_to_cell(*args) - return nil unless cell.is_a?(Hash) - ret = if cell.combined_default.is_a?(Hash) - cell.combined_default[args.last] - end - cell.default.delete(args.last) if cell.default.is_a?(Hash) - cell.role_default.delete(args.last) if cell.role_default.is_a?(Hash) - cell.env_default.delete(args.last) if cell.env_default.is_a?(Hash) - cell.force_default.delete(args.last) if cell.force_default.is_a?(Hash) - ret + with_deep_merged_return_value(combined_default, *args) do + default.safe_delete(*args) + role_default.safe_delete(*args) + env_default.safe_delete(*args) + force_default.safe_delete(*args) + end end # clears attributes from normal precedence @@ -189,9 +187,7 @@ class Chef # - does not autovivify # - does not trainwreck if interior keys do not exist def rm_normal(*args) - cell = args_to_cell(*args) - return nil unless cell.is_a?(Hash) - cell.normal.delete(args.last) if cell.normal.is_a?(Hash) + normal.safe_delete(*args) end # clears attributes from all override precedence levels @@ -200,32 +196,14 @@ class Chef # - does not autovivify # - does not trainwreck if interior keys do not exist def rm_override(*args) - cell = args_to_cell(*args) - return nil unless cell.is_a?(Hash) - ret = if cell.combined_override.is_a?(Hash) - cell.combined_override[args.last] - end - cell.override.delete(args.last) if cell.override.is_a?(Hash) - cell.role_override.delete(args.last) if cell.role_override.is_a?(Hash) - cell.env_override.delete(args.last) if cell.env_override.is_a?(Hash) - cell.force_override.delete(args.last) if cell.force_override.is_a?(Hash) - ret - end - - def args_to_cell(*args) - begin - last = args.pop - cell = args.inject(self) do |memo, arg| - memo[arg] - end - cell - rescue NoMethodError - nil + with_deep_merged_return_value(combined_override, *args) do + override.safe_delete(*args) + role_override.safe_delete(*args) + env_override.safe_delete(*args) + force_override.safe_delete(*args) end end - private :args_to_cell - # FIXME: should probably be another decorator behavior that changes :[] and :[]= to wipe # out intermediate non-hash things and replace them with hashes in addition to autovivifying # and/or add #hashifying_accessor and #hashifying_writer methods directly to VividMash. |