diff options
-rw-r--r-- | lib/chef/decorator/unchain.rb | 16 | ||||
-rw-r--r-- | lib/chef/node/attribute.rb | 4 | ||||
-rw-r--r-- | spec/unit/node_spec.rb | 6 |
3 files changed, 24 insertions, 2 deletions
diff --git a/lib/chef/decorator/unchain.rb b/lib/chef/decorator/unchain.rb index 30179d4e63..8093c70f4c 100644 --- a/lib/chef/decorator/unchain.rb +++ b/lib/chef/decorator/unchain.rb @@ -38,6 +38,22 @@ class Chef __path__.push(key) @delegate_sd_obj.public_send(__method__, *__path__, value) end + + # unfortunately we have to support method_missing for node.set_unless.foo.bar = 'baz' notation + def method_missing(symbol, *args) + if symbol == :to_ary + merged_attributes.send(symbol, *args) + elsif args.empty? + Chef.log_deprecation %q{method access to node attributes (node.foo.bar) is deprecated and will be removed in Chef 13, please use bracket syntax (node["foo"]["bar"])} + self[symbol] + elsif symbol.to_s =~ /=$/ + Chef.log_deprecation %q{method setting of node attributes (node.foo="bar") is deprecated and will be removed in Chef 13, please use bracket syntax (node["foo"]="bar")} + key_to_set = symbol.to_s[/^(.+)=$/, 1] + self[key_to_set] = (args.length == 1 ? args[0] : args) + else + raise NoMethodError, "Undefined node attribute or method `#{symbol}' on `node'" + end + end end end end diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb index 09c78c6de6..f5fe89251d 100644 --- a/lib/chef/node/attribute.rb +++ b/lib/chef/node/attribute.rb @@ -517,14 +517,14 @@ class Chef if symbol == :to_ary merged_attributes.send(symbol, *args) elsif args.empty? - Chef.log_deprecation %q{"method access to node attributes (node.foo.bar) is deprecated and will be removed in Chef 13, please use bracket syntax (node["foo"]["bar"])} + Chef.log_deprecation %q{method access to node attributes (node.foo.bar) is deprecated and will be removed in Chef 13, please use bracket syntax (node["foo"]["bar"])} if key?(symbol) self[symbol] else raise NoMethodError, "Undefined method or attribute `#{symbol}' on `node'" end elsif symbol.to_s =~ /=$/ - Chef.log_deprecation %q{"method setting of node attributes (node.foo="bar") is deprecated and will be removed in Chef 13, please use bracket syntax (node["foo"]="bar")} + Chef.log_deprecation %q{method setting of node attributes (node.foo="bar") is deprecated and will be removed in Chef 13, please use bracket syntax (node["foo"]="bar")} key_to_set = symbol.to_s[/^(.+)=$/, 1] self[key_to_set] = (args.length == 1 ? args[0] : args) else diff --git a/spec/unit/node_spec.rb b/spec/unit/node_spec.rb index 4af5b11174..72731c927f 100644 --- a/spec/unit/node_spec.rb +++ b/spec/unit/node_spec.rb @@ -255,6 +255,12 @@ describe Chef::Node do expect(node[:snoopy][:is_a_puppy]).to eq(true) end + it "should allow you to set an attribute with set_unless with method_missing but emit a deprecation warning" do + Chef::Config[:treat_deprecation_warnings_as_errors] = false + node.normal_unless.snoopy.is_a_puppy = false + expect(node[:snoopy][:is_a_puppy]).to eq(false) + end + it "should allow you to set an attribute with set_unless" do node.normal_unless[:snoopy][:is_a_puppy] = false expect(node[:snoopy][:is_a_puppy]).to eq(false) |