diff options
author | Thom May <thom@chef.io> | 2016-10-14 16:46:51 +0100 |
---|---|---|
committer | Thom May <thom@chef.io> | 2016-11-16 16:28:15 +0000 |
commit | 64b8b0efd90e59ad609ba30fe4bc7ff19e70e940 (patch) | |
tree | 779c33247a0617eed1db6b6a662635a0f91d37d3 /lib/chef | |
parent | bedcbd5f52448d24fdd7ab26ab79185c011beee3 (diff) | |
download | chef-64b8b0efd90e59ad609ba30fe4bc7ff19e70e940.tar.gz |
Structure deprecations with additional metadatatm/deprecation_with_url
This adds URLs to each class of deprecation, and correctly prints and
formats them for maximum user efficiency. We also provide the URL to the
data collector for Visibility to ingest.
Signed-off-by: Thom May <thom@chef.io>
Diffstat (limited to 'lib/chef')
44 files changed, 304 insertions, 96 deletions
diff --git a/lib/chef/api_client.rb b/lib/chef/api_client.rb index 3c1ef7a2b6..80e55c11a7 100644 --- a/lib/chef/api_client.rb +++ b/lib/chef/api_client.rb @@ -141,7 +141,7 @@ class Chef end def self.json_create(data) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::ApiClient#from_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::ApiClient#from_hash") from_hash(data) end diff --git a/lib/chef/application.rb b/lib/chef/application.rb index 7f15859c8f..e917a4eaf7 100644 --- a/lib/chef/application.rb +++ b/lib/chef/application.rb @@ -333,7 +333,7 @@ class Chef def emit_warnings if Chef::Config[:chef_gem_compile_time] - Chef.log_deprecation "setting chef_gem_compile_time to true is deprecated" + Chef.deprecated :chef_gem_compile_time, "setting chef_gem_compile_time to true is deprecated" end end diff --git a/lib/chef/application/exit_code.rb b/lib/chef/application/exit_code.rb index 6fec2524dd..b33085c95d 100644 --- a/lib/chef/application/exit_code.rb +++ b/lib/chef/application/exit_code.rb @@ -199,7 +199,7 @@ class Chef def notify_on_deprecation(message) begin - Chef.log_deprecation(message) + Chef.deprecated(:exit_code, message) rescue Chef::Exceptions::DeprecatedFeatureError # Have to rescue this, otherwise this unhandled error preempts # the current exit code assignment. @@ -207,7 +207,7 @@ class Chef end def deprecation_warning - "Chef RFC 062 (https://github.com/chef/chef-rfc/master/rfc062-exit-status.md) defines the" \ + "Chef RFC 062 (https://github.com/chef/chef-rfc/blob/master/rfc062-exit-status.md) defines the" \ " exit codes that should be used with Chef. Chef::Application::ExitCode defines valid exit codes" \ " In a future release, non-standard exit codes will be redefined as" \ " GENERIC_FAILURE unless `exit_status` is set to `:disabled` in your client.rb." diff --git a/lib/chef/chef_class.rb b/lib/chef/chef_class.rb index 0bb15c03ca..8c766699fc 100644 --- a/lib/chef/chef_class.rb +++ b/lib/chef/chef_class.rb @@ -198,26 +198,35 @@ class Chef # # Emit a deprecation message. # - # @param message The message to send. + # @param type The message to send. This should be a symbol, referring to + # a class defined in Chef::Deprecated + # @param message An explicit message to display, rather than the generic one + # associated with the deprecation. # @param location The location. Defaults to the caller who called you (since # generally the person who triggered the check is the one that needs to be # fixed). # # @example - # Chef.deprecation("Deprecated!") + # Chef.deprecated(:my_deprecation, message: "This is deprecated!") # # @api private this will likely be removed in favor of an as-yet unwritten # `Chef.log` - def log_deprecation(message, location = nil) + def deprecated(type, message, location = nil) location ||= Chef::Log.caller_location + deprecation = Chef::Deprecated.create(type, message, location) # `run_context.events` is the primary deprecation target if we're in a # run. If we are not yet in a run, print to `Chef::Log`. if run_context && run_context.events - run_context.events.deprecation(message, location) + run_context.events.deprecation(deprecation, location) else - Chef::Log.deprecation(message, location) + Chef::Log.deprecation(deprecation, location) end end + + def log_deprecation(message, location = nil) + location ||= Chef::Log.caller_location + Chef.deprecated(:generic, message, location) + end end # @api private Only for test dependency injection; not evenly implemented as yet. diff --git a/lib/chef/client.rb b/lib/chef/client.rb index c857da1b93..c064d33209 100644 --- a/lib/chef/client.rb +++ b/lib/chef/client.rb @@ -22,6 +22,7 @@ require "chef/config" require "chef/mixin/params_validate" require "chef/mixin/path_sanity" require "chef/log" +require "chef/deprecated" require "chef/server_api" require "chef/api_client" require "chef/api_client/registration" diff --git a/lib/chef/cookbook_version.rb b/lib/chef/cookbook_version.rb index 8de9cb26dd..33226a7de5 100644 --- a/lib/chef/cookbook_version.rb +++ b/lib/chef/cookbook_version.rb @@ -54,12 +54,12 @@ class Chef attr_accessor :metadata_filenames def status=(new_status) - Chef.log_deprecation("Deprecated method `status' called. This method will be removed.") + Chef.deprecated(:internal_api, "Deprecated method `status' called. This method will be removed.") @status = new_status end def status - Chef.log_deprecation("Deprecated method `status' called. This method will be removed.") + Chef.deprecated(:internal_api, "Deprecated method `status' called. This method will be removed.") @status end @@ -485,7 +485,7 @@ class Chef end def self.json_create(o) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::CookbookVersion#from_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::CookbookVersion#from_hash") from_hash(o) end @@ -496,7 +496,7 @@ class Chef # @deprecated This method was used by the Ruby Chef Server and is no longer # needed. There is no replacement. def generate_manifest_with_urls - Chef.log_deprecation("Deprecated method #generate_manifest_with_urls.") + Chef.deprecated(:internal_api, "Deprecated method #generate_manifest_with_urls.") rendered_manifest = manifest.dup COOKBOOK_SEGMENTS.each do |segment| diff --git a/lib/chef/data_bag.rb b/lib/chef/data_bag.rb index f107f98f28..7b32340f6a 100644 --- a/lib/chef/data_bag.rb +++ b/lib/chef/data_bag.rb @@ -80,7 +80,7 @@ class Chef # Create a Chef::Role from JSON def self.json_create(o) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::DataBag#from_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::DataBag#from_hash") from_hash(o) end diff --git a/lib/chef/data_bag_item.rb b/lib/chef/data_bag_item.rb index 568c511c44..83c568e6f3 100644 --- a/lib/chef/data_bag_item.rb +++ b/lib/chef/data_bag_item.rb @@ -141,7 +141,7 @@ class Chef # Create a Chef::DataBagItem from JSON def self.json_create(o) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::DataBagItem#from_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::DataBagItem#from_hash") from_hash(o) end diff --git a/lib/chef/data_collector.rb b/lib/chef/data_collector.rb index da7aeee3b8..82c41edfdc 100644 --- a/lib/chef/data_collector.rb +++ b/lib/chef/data_collector.rb @@ -274,7 +274,7 @@ class Chef # see EventDispatch::Base#deprecation # Append a received deprecation to the list of deprecations def deprecation(message, location = caller(2..2)[0]) - add_deprecation(message, location) + add_deprecation(message.message, message.url, location) end private @@ -410,8 +410,8 @@ class Chef @error_descriptions = discription_hash end - def add_deprecation(message, location) - @deprecations << { message: message, location: location } + def add_deprecation(message, url, location) + @deprecations << { message: message, url: url, location: location } end def create_resource_report(new_resource, action, current_resource = nil) diff --git a/lib/chef/decorator/unchain.rb b/lib/chef/decorator/unchain.rb index 8093c70f4c..b1e1f9fce1 100644 --- a/lib/chef/decorator/unchain.rb +++ b/lib/chef/decorator/unchain.rb @@ -44,10 +44,10 @@ 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.deprecated :attributes, %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")} + Chef.deprecated :attributes, %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/lib/chef/deprecated.rb b/lib/chef/deprecated.rb new file mode 100644 index 0000000000..de5090a48b --- /dev/null +++ b/lib/chef/deprecated.rb @@ -0,0 +1,190 @@ +#-- +# Copyright:: Copyright 2016 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require "chef/mixin/convert_to_class_name" + +# Structured deprecations have a unique URL associated with them, which must exist before the deprecation is merged. +class Chef + class Deprecated + + class << self + include Chef::Mixin::ConvertToClassName + + def create(type, message = nil, location = nil) + Chef::Deprecated.const_get(convert_to_class_name(type.to_s)).send(:new, message, location) + end + end + + class Base + BASE_URL = "https://docs.chef.io/deprecations_" + + attr_accessor :message, :location + + def initialize(msg = nil, location = nil) + @message = msg if msg + @location = location if location + end + + def link + "Please see #{url} for further details and information on how to correct this problem." + end + + def url + "#{BASE_URL}#{target}" + end + + # We know that the only time this gets called is by Chef::Log.deprecation, + # so special case + def <<(location) + @location = location + end + + def inspect + "#{message} (CHEF-#{id})#{location}.\n#{link}" + end + + def id + raise NotImplementedError, "subclasses of Chef::Deprecated::Base should define #id with a unique number" + end + + def target + raise NotImplementedError, "subclasses of Chef::Deprecated::Base should define #target" + end + end + + class JsonAutoInflate < Base + def id + 1 + end + + def target + "json_auto_inflate.html" + end + end + + class ExitCode < Base + def id + 2 + end + + def target + "exit_code.html" + end + end + + class ChefGemCompileTime < Base + def id + 3 + end + + def target + "chef_gem_compile_time.html" + end + end + + class Attributes < Base + def id + 4 + end + + def target + "attributes.html" + end + end + + class CustomResource < Base + def id + 5 + end + + def target + "custom_resource_cleanups.html" + end + end + + class EasyInstall < Base + def id + 6 + end + + def target + "easy_install.html" + end + end + + class VerifyFile < Base + def id + 7 + end + + def target + "verify_file.html" + end + end + + class SupportsProperty < Base + def id + 8 + end + + def target + "supports_property.html" + end + end + + class ChefRest < Base + def id + 9 + end + + def target + "chef_rest.html" + end + end + + class ResourceCloning < Base + def id + 3694 + end + + def target + "resource_cloning.html" + end + end + + class InternalApi < Base + def id + 0 + end + + def target + "internal_api.html" + end + end + + class Generic < Base + def url + "https://docs.chef.io/chef_deprecations_client.html" + end + + def inspect + "#{message}\nThis is a generic error message and should be updated to have a proper deprecation class. #{location}\nPlease see #{url} for an overview of Chef deprecations." + end + end + + end +end diff --git a/lib/chef/deprecation/provider/remote_directory.rb b/lib/chef/deprecation/provider/remote_directory.rb index 5e5188f28b..9b442651d7 100644 --- a/lib/chef/deprecation/provider/remote_directory.rb +++ b/lib/chef/deprecation/provider/remote_directory.rb @@ -22,7 +22,7 @@ class Chef module RemoteDirectory def directory_root_in_cookbook_cache - Chef.log_deprecation "the Chef::Provider::RemoteDirectory#directory_root_in_cookbook_cache method is deprecated" + Chef.deprecated :internal_api, "the Chef::Provider::RemoteDirectory#directory_root_in_cookbook_cache method is deprecated" @directory_root_in_cookbook_cache ||= begin diff --git a/lib/chef/deprecation/warnings.rb b/lib/chef/deprecation/warnings.rb index 411e95ea39..f5feb91063 100644 --- a/lib/chef/deprecation/warnings.rb +++ b/lib/chef/deprecation/warnings.rb @@ -23,10 +23,9 @@ class Chef def add_deprecation_warnings_for(method_names) method_names.each do |name| define_method(name) do |*args| - message = [] - message << "Method '#{name}' of '#{self.class}' is deprecated. It will be removed in Chef 13." - message << "Please update your cookbooks accordingly." - Chef.log_deprecation(message) + message = "Method '#{name}' of '#{self.class}' is deprecated. It will be removed in Chef 13." + message << " Please update your cookbooks accordingly." + Chef.deprecated(:internal_api, message) super(*args) end end diff --git a/lib/chef/dsl/method_missing.rb b/lib/chef/dsl/method_missing.rb index 51c3eac606..2917a54ee8 100644 --- a/lib/chef/dsl/method_missing.rb +++ b/lib/chef/dsl/method_missing.rb @@ -37,7 +37,7 @@ class Chef # method_missing manually. Not a fan. Not. A. Fan. # if respond_to?(method_symbol) - Chef.log_deprecation("Calling method_missing(#{method_symbol.inspect}) directly is deprecated in Chef 12 and will be removed in Chef 13. Use public_send() or send() instead.") + Chef.deprecated(:internal_api, "Calling method_missing(#{method_symbol.inspect}) directly is deprecated in Chef 12 and will be removed in Chef 13. Use public_send() or send() instead.") return send(method_symbol, *args, &block) end @@ -46,7 +46,7 @@ class Chef # never called. DEPRECATED. # if run_context.definitions.has_key?(method_symbol.to_sym) - Chef.log_deprecation("Definition #{method_symbol} (#{run_context.definitions[method_symbol.to_sym]}) was added to the run_context without calling Chef::DSL::Definitions.add_definition(#{method_symbol.to_sym.inspect}). This will become required in Chef 13.") + Chef.deprecated(:internal_api, "Definition #{method_symbol} (#{run_context.definitions[method_symbol.to_sym]}) was added to the run_context without calling Chef::DSL::Definitions.add_definition(#{method_symbol.to_sym.inspect}). This will become required in Chef 13.") Chef::DSL::Definitions.add_definition(method_symbol) return send(method_symbol, *args, &block) end diff --git a/lib/chef/dsl/resources.rb b/lib/chef/dsl/resources.rb index 7bbfeb2914..0d654316d8 100644 --- a/lib/chef/dsl/resources.rb +++ b/lib/chef/dsl/resources.rb @@ -36,14 +36,14 @@ class Chef begin module_eval(<<-EOM, __FILE__, __LINE__ + 1) def #{dsl_name}(*args, &block) - Chef.log_deprecation("Cannot create resource #{dsl_name} with more than one argument. All arguments except the name (\#{args[0].inspect}) will be ignored. This will cause an error in Chef 13. Arguments: \#{args}") if args.size > 1 + Chef.deprecated(:internal_api, "Cannot create resource #{dsl_name} with more than one argument. All arguments except the name (\#{args[0].inspect}) will be ignored. This will cause an error in Chef 13. Arguments: \#{args}") if args.size > 1 declare_resource(#{dsl_name.inspect}, args[0], caller[0], &block) end EOM rescue SyntaxError # Handle the case where dsl_name has spaces, etc. define_method(dsl_name.to_sym) do |*args, &block| - Chef.log_deprecation("Cannot create resource #{dsl_name} with more than one argument. All arguments except the name (#{args[0].inspect}) will be ignored. This will cause an error in Chef 13. Arguments: #{args}") if args.size > 1 + Chef.deprecated(:internal_api, "Cannot create resource #{dsl_name} with more than one argument. All arguments except the name (#{args[0].inspect}) will be ignored. This will cause an error in Chef 13. Arguments: #{args}") if args.size > 1 declare_resource(dsl_name, args[0], caller[0], &block) end end diff --git a/lib/chef/environment.rb b/lib/chef/environment.rb index 32ebde6f4f..c41df768b9 100644 --- a/lib/chef/environment.rb +++ b/lib/chef/environment.rb @@ -217,7 +217,7 @@ class Chef end def self.json_create(o) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::Environment#from_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::Environment#from_hash") from_hash(o) end diff --git a/lib/chef/formatters/base.rb b/lib/chef/formatters/base.rb index 536bf72e02..2fbe00862c 100644 --- a/lib/chef/formatters/base.rb +++ b/lib/chef/formatters/base.rb @@ -213,7 +213,17 @@ class Chef end def deprecation(message, location = caller(2..2)[0]) - Chef::Log.deprecation("#{message} at #{location}") + out = if is_structured_deprecation?(message) + message.inspect + else + "#{message} at #{location}" + end + + Chef::Log.deprecation(out) + end + + def is_structured_deprecation?(deprecation) + deprecation.kind_of?(Chef::Deprecated::Base) end def is_formatter? diff --git a/lib/chef/formatters/doc.rb b/lib/chef/formatters/doc.rb index 7dbbf1d948..0c51cc2cfb 100644 --- a/lib/chef/formatters/doc.rb +++ b/lib/chef/formatters/doc.rb @@ -61,9 +61,10 @@ class Chef if !deprecations.empty? puts_line "" puts_line "Deprecated features used!" - deprecations.each do |message, locations| + deprecations.each do |message, details| + locations = details[:locations] if locations.size == 1 - puts_line " #{message} at #{locations.size} location:" + puts_line " #{message} at 1 location:" else puts_line " #{message} at #{locations.size} locations:" end @@ -74,6 +75,9 @@ class Chef prefix = " " end end + unless details[:url].nil? + puts_line " See #{details[:url]} for further details." + end end puts_line "" end @@ -416,8 +420,13 @@ class Chef end # Save deprecations to the screen until the end - deprecations[message] ||= Set.new - deprecations[message] << location + if is_structured_deprecation?(message) + url = message.url + message = message.message + end + + deprecations[message] ||= { url: url, locations: Set.new } + deprecations[message][:locations] << location end def indent diff --git a/lib/chef/key.rb b/lib/chef/key.rb index 38822e8b26..d19ff433a3 100644 --- a/lib/chef/key.rb +++ b/lib/chef/key.rb @@ -223,7 +223,7 @@ class Chef end def json_create(json) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::Key#from_json or one of the load_by methods.") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::Key#from_json or one of the load_by methods.") Chef::Key.from_json(json) end diff --git a/lib/chef/knife/core/subcommand_loader.rb b/lib/chef/knife/core/subcommand_loader.rb index e617b39ded..30a438b780 100644 --- a/lib/chef/knife/core/subcommand_loader.rb +++ b/lib/chef/knife/core/subcommand_loader.rb @@ -51,7 +51,7 @@ class Chef Chef::Log.debug("Using autogenerated hashed command manifest #{plugin_manifest_path}") Knife::SubcommandLoader::HashedCommandLoader.new(chef_config_dir, plugin_manifest) elsif custom_manifest? - Chef.log_deprecation("Using custom manifest #{plugin_manifest_path} is deprecated. Please use a `knife rehash` autogenerated manifest instead.") + Chef.deprecated(:internal_api, "Using custom manifest #{plugin_manifest_path} is deprecated. Please use a `knife rehash` autogenerated manifest instead.") Knife::SubcommandLoader::CustomManifestLoader.new(chef_config_dir, plugin_manifest) else Knife::SubcommandLoader::GemGlobLoader.new(chef_config_dir) @@ -90,7 +90,7 @@ class Chef # Deprecated and un-used instance variable. @env = env unless env.nil? - Chef.log_deprecation("The env argument to Chef::Knife::SubcommandLoader is deprecated. If you are using env to inject/mock HOME, consider mocking Chef::Util::PathHelper.home instead.") + Chef.deprecated(:internal_api, "The env argument to Chef::Knife::SubcommandLoader is deprecated. If you are using env to inject/mock HOME, consider mocking Chef::Util::PathHelper.home instead.") end end @@ -154,7 +154,7 @@ class Chef # to get in the past. # def subcommand_files - Chef.log_deprecation "Using Chef::Knife::SubcommandLoader directly is deprecated. + Chef.deprecated :internal_api, "Using Chef::Knife::SubcommandLoader directly is deprecated. Please use Chef::Knife::SubcommandLoader.for_config(chef_config_dir, env)" @subcommand_files ||= if Chef::Knife::SubcommandLoader.plugin_manifest? Chef::Knife::SubcommandLoader::CustomManifestLoader.new(chef_config_dir, env).subcommand_files diff --git a/lib/chef/knife/core/ui.rb b/lib/chef/knife/core/ui.rb index 67e431f1a7..0e07dd704f 100644 --- a/lib/chef/knife/core/ui.rb +++ b/lib/chef/knife/core/ui.rb @@ -186,7 +186,7 @@ class Chef if parse_output if object_class.nil? - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please pass in the class to inflate or use #edit_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please pass in the class to inflate or use #edit_hash") Chef::JSONCompat.from_json(output) else object_class.from_hash(Chef::JSONCompat.parse(output)) diff --git a/lib/chef/log.rb b/lib/chef/log.rb index ac2baeb9d1..10c9f0f20d 100644 --- a/lib/chef/log.rb +++ b/lib/chef/log.rb @@ -58,7 +58,7 @@ class Chef end if Chef::Config[:treat_deprecation_warnings_as_errors] error(msg, &block) - raise Chef::Exceptions::DeprecatedFeatureError.new(msg) + raise Chef::Exceptions::DeprecatedFeatureError.new(msg.inspect) else warn(msg, &block) end diff --git a/lib/chef/mixin/deprecation.rb b/lib/chef/mixin/deprecation.rb index 0f059a215f..14414036e7 100644 --- a/lib/chef/mixin/deprecation.rb +++ b/lib/chef/mixin/deprecation.rb @@ -65,7 +65,7 @@ class Chef end def method_missing(method_name, *args, &block) - log_deprecation_msg(caller[0..3]) + deprecated_msg(caller[0..3]) @target.send(method_name, *args, &block) end @@ -75,7 +75,7 @@ class Chef private - def log_deprecation_msg(*called_from) + def deprecated_msg(*called_from) called_from = called_from.flatten log("Accessing #{@ivar_name} by the variable @#{@ivar_name} is deprecated. Support will be removed in a future release.") log("Please update your cookbooks to use #{@ivar_name} in place of @#{@ivar_name}. Accessed from:") @@ -101,20 +101,14 @@ class Chef def deprecated_attr_reader(name, alternative, level = :warn) define_method(name) do - Chef.log_deprecation("#{self.class}.#{name} is deprecated. Support will be removed in a future release.") - Chef.log_deprecation(alternative) - Chef.log_deprecation("Called from:") - caller[0..3].each { |c| Chef.log_deprecation(c) } + Chef.deprecated(:internal_api, "#{self.class}.#{name} is deprecated. Support will be removed in a future release. #{alternative}") instance_variable_get("@#{name}") end end def deprecated_attr_writer(name, alternative, level = :warn) define_method("#{name}=") do |value| - Chef.log_deprecation("Writing to #{self.class}.#{name} with #{name}= is deprecated. Support will be removed in a future release.") - Chef.log_deprecation(alternative) - Chef.log_deprecation("Called from:") - caller[0..3].each { |c| Chef.log_deprecation(c) } + Chef.deprecated(:internal_api, "Writing to #{self.class}.#{name} with #{name}= is deprecated. Support will be removed in a future release. #{alternative}") instance_variable_set("@#{name}", value) end end diff --git a/lib/chef/mixin/shell_out.rb b/lib/chef/mixin/shell_out.rb index d8607c8de7..cc2bf085e9 100644 --- a/lib/chef/mixin/shell_out.rb +++ b/lib/chef/mixin/shell_out.rb @@ -118,7 +118,7 @@ class Chef end def deprecate_option(old_option, new_option) - Chef.log_deprecation "DEPRECATION: Chef::Mixin::ShellOut option :#{old_option} is deprecated. Use :#{new_option}" + Chef.deprecated :internal_api, "Chef::Mixin::ShellOut option :#{old_option} is deprecated. Use :#{new_option}" end def io_for_live_stream diff --git a/lib/chef/node.rb b/lib/chef/node.rb index 7351a7bfa5..f2a5cab1f5 100644 --- a/lib/chef/node.rb +++ b/lib/chef/node.rb @@ -201,7 +201,7 @@ class Chef end def set - Chef.log_deprecation("node.set is deprecated and will be removed in Chef 14, please use node.default/node.override (or node.normal only if you really need persistence)") + Chef.deprecated(:attributes, "node.set is deprecated and will be removed in Chef 14, please use node.default/node.override (or node.normal only if you really need persistence)") normal end @@ -509,7 +509,7 @@ class Chef # Create a Chef::Node from JSON def self.json_create(o) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::Node#from_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::Node#from_hash") from_hash(o) end diff --git a/lib/chef/node/attribute.rb b/lib/chef/node/attribute.rb index 2ed32d50ad..d2816d4824 100644 --- a/lib/chef/node/attribute.rb +++ b/lib/chef/node/attribute.rb @@ -430,7 +430,7 @@ class Chef end def set_unless(*args) - Chef.log_deprecation("node.set_unless is deprecated and will be removed in Chef 14, please use node.default_unless/node.override_unless (or node.normal_unless if you really need persistence)") + Chef.deprecated(:attributes, "node.set_unless is deprecated and will be removed in Chef 14, please use node.default_unless/node.override_unless (or node.normal_unless if you really need persistence)") return Decorator::Unchain.new(self, :default_unless) unless args.length > 0 write(:normal, *args) if read(*args[0...-1]).nil? end @@ -481,14 +481,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.deprecated(:attributes, %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.deprecated(:attributes, %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/lib/chef/node_map.rb b/lib/chef/node_map.rb index 5eac63d380..9e64ccadc0 100644 --- a/lib/chef/node_map.rb +++ b/lib/chef/node_map.rb @@ -32,8 +32,8 @@ class Chef # @return [NodeMap] Returns self for possible chaining # def set(key, value, platform: nil, platform_version: nil, platform_family: nil, os: nil, on_platform: nil, on_platforms: nil, canonical: nil, override: nil, &block) - Chef.log_deprecation("The on_platform option to node_map has been deprecated") if on_platform - Chef.log_deprecation("The on_platforms option to node_map has been deprecated") if on_platforms + Chef.deprecated(:internal_api, "The on_platform option to node_map has been deprecated") if on_platform + Chef.deprecated(:internal_api, "The on_platforms option to node_map has been deprecated") if on_platforms platform ||= on_platform || on_platforms filters = {} filters[:platform] = platform if platform diff --git a/lib/chef/org.rb b/lib/chef/org.rb index a148e37aea..cf6f605370 100644 --- a/lib/chef/org.rb +++ b/lib/chef/org.rb @@ -125,7 +125,7 @@ class Chef end def self.json_create(json) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::Org#from_json or Chef::Org#load.") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::Org#from_json or Chef::Org#load.") Chef::Org.from_json(json) end diff --git a/lib/chef/policy_builder/expand_node_object.rb b/lib/chef/policy_builder/expand_node_object.rb index df6956cc77..d8f4f752de 100644 --- a/lib/chef/policy_builder/expand_node_object.rb +++ b/lib/chef/policy_builder/expand_node_object.rb @@ -112,7 +112,7 @@ class Chef # to create a PolicyBuilder::Dynamc policy builder and allow it to select # the proper implementation. def load_node - Chef.log_deprecation("ExpandNodeObject#load_node is deprecated. Please use Chef::PolicyBuilder::Dynamic instead of using ExpandNodeObject directly") + Chef.deprecated(:internal_api, "ExpandNodeObject#load_node is deprecated. Please use Chef::PolicyBuilder::Dynamic instead of using ExpandNodeObject directly") events.node_load_start(node_name, config) Chef::Log.debug("Building node object for #{node_name}") diff --git a/lib/chef/property.rb b/lib/chef/property.rb index 9433326b5b..8d8ed352b3 100644 --- a/lib/chef/property.rb +++ b/lib/chef/property.rb @@ -116,7 +116,7 @@ class Chef options.delete(:name_property) preferred_default = :default end - Chef.log_deprecation("Cannot specify both default and name_property together on property #{self}. Only one (#{preferred_default}) will be obeyed. In Chef 13, this will become an error. Please remove one or the other from the property.") + Chef.deprecated(:custom_resource, "Cannot specify both default and name_property together on property #{self}. Only one (#{preferred_default}) will be obeyed. In Chef 13, this will become an error. Please remove one or the other from the property.") end # Validate the default early, so the user gets a good error message, and @@ -287,13 +287,13 @@ class Chef input_to_stored_value(resource, value) # If nil is valid, and it would change the value, warn that this will change to a set. if !result.nil? - Chef.log_deprecation("An attempt was made to change #{name} from #{result.inspect} to nil by calling #{name}(nil). In Chef 12, this does a get rather than a set. In Chef 13, this will change to set the value to nil.") + Chef.deprecated(:custom_resource, "An attempt was made to change #{name} from #{result.inspect} to nil by calling #{name}(nil). In Chef 12, this does a get rather than a set. In Chef 13, this will change to set the value to nil.") end rescue Chef::Exceptions::DeprecatedFeatureError raise rescue # If nil is invalid, warn that this will become an error. - Chef.log_deprecation("nil is an invalid value for #{self}. In Chef 13, this warning will change to an error. Error: #{$!}") + Chef.deprecated(:custom_resource, "nil is an invalid value for #{self}. In Chef 13, this warning will change to an error. Error: #{$!}") end result @@ -677,9 +677,9 @@ class Chef # warn and return the (possibly coerced) value to the user. if is_default if value.nil? - Chef.log_deprecation("Default value nil is invalid for property #{self}. Possible fixes: 1. Remove 'default: nil' if nil means 'undefined'. 2. Set a valid default value if there is a reasonable one. 3. Allow nil as a valid value of your property (for example, 'property #{name.inspect}, [ String, nil ], default: nil'). Error: #{$!}") + Chef.deprecated(:custom_resource, "Default value nil is invalid for property #{self}. Possible fixes: 1. Remove 'default: nil' if nil means 'undefined'. 2. Set a valid default value if there is a reasonable one. 3. Allow nil as a valid value of your property (for example, 'property #{name.inspect}, [ String, nil ], default: nil'). Error: #{$!}") else - Chef.log_deprecation("Default value #{value.inspect} is invalid for property #{self}. In Chef 13 this will become an error: #{$!}.") + Chef.deprecated(:custom_resource, "Default value #{value.inspect} is invalid for property #{self}. In Chef 13 this will become an error: #{$!}.") end else raise diff --git a/lib/chef/provider.rb b/lib/chef/provider.rb index 399a26aca0..40c31e4371 100644 --- a/lib/chef/provider.rb +++ b/lib/chef/provider.rb @@ -424,7 +424,7 @@ class Chef module DeprecatedLWRPClass def const_missing(class_name) if Chef::Provider.deprecated_constants[class_name.to_sym] - Chef.log_deprecation("Using an LWRP provider by its name (#{class_name}) directly is no longer supported in Chef 12 and will be removed. Use Chef::ProviderResolver.new(node, resource, action) instead.") + Chef.deprecated(:custom_resource, "Using an LWRP provider by its name (#{class_name}) directly is no longer supported in Chef 12 and will be removed. Use Chef::ProviderResolver.new(node, resource, action) instead.") Chef::Provider.deprecated_constants[class_name.to_sym] else raise NameError, "uninitialized constant Chef::Provider::#{class_name}" diff --git a/lib/chef/provider/package/easy_install.rb b/lib/chef/provider/package/easy_install.rb index 989f2ab9d2..926f609092 100644 --- a/lib/chef/provider/package/easy_install.rb +++ b/lib/chef/provider/package/easy_install.rb @@ -112,7 +112,7 @@ class Chef end def install_package(name, version) - Chef.log_deprecation("The easy_install package provider is deprecated and will be removed in Chef 13.") + Chef.deprecated(:easy_install, "The easy_install package provider is deprecated and will be removed in Chef 13.") run_command(:command => "#{easy_install_binary_path}#{expand_options(@new_resource.options)} \"#{name}==#{version}\"") end @@ -121,7 +121,7 @@ class Chef end def remove_package(name, version) - Chef.log_deprecation("The easy_install package provider is deprecated and will be removed in Chef 13.") + Chef.deprecated(:easy_install, "The easy_install package provider is deprecated and will be removed in Chef 13.") run_command(:command => "#{easy_install_binary_path }#{expand_options(@new_resource.options)} -m #{name}") end diff --git a/lib/chef/provider_resolver.rb b/lib/chef/provider_resolver.rb index 1df473abbd..8903f65d26 100644 --- a/lib/chef/provider_resolver.rb +++ b/lib/chef/provider_resolver.rb @@ -157,8 +157,8 @@ class Chef # perf concern otherwise.) handlers = providers.select { |handler| overrode_provides?(handler) && handler.provides?(node, resource) } handlers.each do |handler| - Chef.log_deprecation("#{handler}.provides? returned true when asked if it provides DSL #{resource.resource_name}, but provides #{resource.resource_name.inspect} was never called!") - Chef.log_deprecation("In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself.") + message = "#{handler}.provides? returned true when asked if it provides DSL #{resource.resource_name}, but provides #{resource.resource_name.inspect} was never called! In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself." + Chef.deprecated(:custom_resource, message) end end handlers diff --git a/lib/chef/resource.rb b/lib/chef/resource.rb index 074ab772a1..cde202dcf2 100644 --- a/lib/chef/resource.rb +++ b/lib/chef/resource.rb @@ -925,9 +925,7 @@ class Chef # @deprecated Multiple actions are supported by resources. Please call {}#updated_by_last_action} instead. # def updated=(true_or_false) - Chef::Log.warn("Chef::Resource#updated=(true|false) is deprecated. Please call #updated_by_last_action(true|false) instead.") - Chef::Log.warn("Called from:") - caller[0..3].each { |line| Chef::Log.warn(line) } + Chef.deprecated(:custom_resource, "Chef::Resource#updated=(true|false) is deprecated. Please call #updated_by_last_action(true|false) instead.") updated_by_last_action(true_or_false) @updated = true_or_false end @@ -982,7 +980,7 @@ class Chef # @deprecated Use resource_name instead. # def self.dsl_name - Chef.log_deprecation "Resource.dsl_name is deprecated and will be removed in Chef 13. Use resource_name instead." + Chef.deprecated(:custom_resource, "Resource.dsl_name is deprecated and will be removed in Chef 13. Use resource_name instead.") if name name = self.name.split("::")[-1] convert_to_snake_case(name) @@ -1060,7 +1058,7 @@ class Chef # def self.provider_base(arg = nil) if arg - Chef.log_deprecation("Resource.provider_base is deprecated and will be removed in Chef 13. Use provides on the provider, or provider on the resource, instead.") + Chef.deprecated(:custom_resource, "Resource.provider_base is deprecated and will be removed in Chef 13. Use provides on the provider, or provider on the resource, instead.") end @provider_base ||= arg || Chef::Provider end diff --git a/lib/chef/resource/chef_gem.rb b/lib/chef/resource/chef_gem.rb index 4445bf0f89..c7c6d91752 100644 --- a/lib/chef/resource/chef_gem.rb +++ b/lib/chef/resource/chef_gem.rb @@ -34,9 +34,8 @@ class Chef # Chef::Resource.run_action: Caveat: this skips Chef::Runner.run_action, where notifications are handled # Action could be an array of symbols, but probably won't (think install + enable for a package) if compile_time.nil? - Chef.log_deprecation "#{self} chef_gem compile_time installation is deprecated" - Chef.log_deprecation "#{self} Please set `compile_time false` on the resource to use the new behavior." - Chef.log_deprecation "#{self} or set `compile_time true` on the resource if compile_time behavior is required." + message = "#{self} chef_gem compile_time installation is deprecated. Please set `compile_time false` on the resource to use the new behavior, or set `compile_time true` on the resource if compile_time behavior is required." + Chef.deprecated :chef_gem_compile_time, message end if compile_time || compile_time.nil? diff --git a/lib/chef/resource/file/verification.rb b/lib/chef/resource/file/verification.rb index e11035d33f..cf5585e5cf 100644 --- a/lib/chef/resource/file/verification.rb +++ b/lib/chef/resource/file/verification.rb @@ -108,7 +108,7 @@ class Chef def verify_command(path, opts) # First implementation interpolated `file`; docs & RFC claim `path` # is interpolated. Until `file` can be deprecated, interpolate both. - Chef.log_deprecation( + Chef.deprecated(:verify_file, "%{file} is deprecated in verify command and will not be "\ "supported in Chef 13. Please use %{path} instead." ) if @command.include?("%{file}") diff --git a/lib/chef/resource/user.rb b/lib/chef/resource/user.rb index 06dfe95bd4..19a4e2faf5 100644 --- a/lib/chef/resource/user.rb +++ b/lib/chef/resource/user.rb @@ -158,10 +158,10 @@ class Chef def supports(args = {}) if args.key?(:manage_home) - Chef.log_deprecation "supports { manage_home: #{args[:manage_home]} } on the user resource is deprecated and will be removed in Chef 13, set manage_home: #{args[:manage_home]} instead" + Chef.deprecated(:supports_property, "supports { manage_home: #{args[:manage_home]} } on the user resource is deprecated and will be removed in Chef 13, set manage_home: #{args[:manage_home]} instead") end if args.key?(:non_unique) - Chef.log_deprecation "supports { non_unique: #{args[:non_unique]} } on the user resource is deprecated and will be removed in Chef 13, set non_unique: #{args[:non_unique]} instead" + Chef.deprecated(:supports_property, "supports { non_unique: #{args[:non_unique]} } on the user resource is deprecated and will be removed in Chef 13, set non_unique: #{args[:non_unique]} instead") end super end diff --git a/lib/chef/resource_builder.rb b/lib/chef/resource_builder.rb index 57c57dd8c3..78b2fcd4d1 100644 --- a/lib/chef/resource_builder.rb +++ b/lib/chef/resource_builder.rb @@ -128,10 +128,10 @@ class Chef end def emit_cloned_resource_warning - message = "Cloning resource attributes for #{resource} from prior resource (CHEF-3694)" + message = "Cloning resource attributes for #{resource} from prior resource" message << "\nPrevious #{prior_resource}: #{prior_resource.source_line}" if prior_resource.source_line message << "\nCurrent #{resource}: #{resource.source_line}" if resource.source_line - Chef.log_deprecation(message) + Chef.deprecated(:resource_cloning, message) end def emit_harmless_cloning_debug diff --git a/lib/chef/resource_resolver.rb b/lib/chef/resource_resolver.rb index 769272d637..fca6c6db81 100644 --- a/lib/chef/resource_resolver.rb +++ b/lib/chef/resource_resolver.rb @@ -55,7 +55,7 @@ class Chef attr_reader :resource_name # @api private def resource - Chef.log_deprecation("Chef::ResourceResolver.resource deprecated. Use resource_name instead.") + Chef.deprecated(:custom_resource, "Chef::ResourceResolver.resource deprecated. Use resource_name instead.") resource_name end # @api private @@ -173,8 +173,7 @@ class Chef if handlers.empty? handlers = resources.select { |handler| overrode_provides?(handler) && handler.provides?(node, resource_name) } handlers.each do |handler| - Chef.log_deprecation("#{handler}.provides? returned true when asked if it provides DSL #{resource_name}, but provides #{resource_name.inspect} was never called!") - Chef.log_deprecation("In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself.") + Chef.deprecated(:custom_resource, "#{handler}.provides? returned true when asked if it provides DSL #{resource_name}, but provides #{resource_name.inspect} was never called! In Chef 13, this will break: you must call provides to mark the names you provide, even if you also override provides? yourself.") end end handlers diff --git a/lib/chef/rest.rb b/lib/chef/rest.rb index b3793418ce..0705ca9f5a 100644 --- a/lib/chef/rest.rb +++ b/lib/chef/rest.rb @@ -59,7 +59,7 @@ class Chef # http://localhost:4000, a call to +get_rest+ with 'nodes' will make an # HTTP GET request to http://localhost:4000/nodes def initialize(url, client_name = Chef::Config[:node_name], signing_key_filename = Chef::Config[:client_key], options = {}) - Chef.log_deprecation("Chef::REST is deprecated. Please use Chef::ServerAPI, or investigate Ridley or ChefAPI.") + Chef.deprecated(:chef_rest, "Chef::REST is deprecated. Please use Chef::ServerAPI, or investigate Ridley or ChefAPI.") signing_key_filename = nil if chef_zero_uri?(url) diff --git a/lib/chef/role.rb b/lib/chef/role.rb index 331fa614f1..218894ef03 100644 --- a/lib/chef/role.rb +++ b/lib/chef/role.rb @@ -170,7 +170,7 @@ class Chef # Create a Chef::Role from JSON def self.json_create(o) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::Role#from_hash") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::Role#from_hash") from_hash(o) end diff --git a/lib/chef/run_context.rb b/lib/chef/run_context.rb index 626977b09f..aa6280e5be 100644 --- a/lib/chef/run_context.rb +++ b/lib/chef/run_context.rb @@ -581,17 +581,17 @@ ERROR_MESSAGE # These need to be settable so deploy can run a resource_collection # independent of any cookbooks via +recipe_eval+ def audits=(value) - Chef.log_deprecation("Setting run_context.audits will be removed in a future Chef. Use run_context.create_child to create a new RunContext instead.") + Chef.deprecated(:internal_api, "Setting run_context.audits will be removed in a future Chef. Use run_context.create_child to create a new RunContext instead.") @audits = value end def immediate_notification_collection=(value) - Chef.log_deprecation("Setting run_context.immediate_notification_collection will be removed in a future Chef. Use run_context.create_child to create a new RunContext instead.") + Chef.deprecated(:internal_api, "Setting run_context.immediate_notification_collection will be removed in a future Chef. Use run_context.create_child to create a new RunContext instead.") @immediate_notification_collection = value end def delayed_notification_collection=(value) - Chef.log_deprecation("Setting run_context.delayed_notification_collection will be removed in a future Chef. Use run_context.create_child to create a new RunContext instead.") + Chef.deprecated(:internal_api, "Setting run_context.delayed_notification_collection will be removed in a future Chef. Use run_context.create_child to create a new RunContext instead.") @delayed_notification_collection = value end end diff --git a/lib/chef/user.rb b/lib/chef/user.rb index a6fc21646d..261ce43ef2 100644 --- a/lib/chef/user.rb +++ b/lib/chef/user.rb @@ -26,13 +26,13 @@ require "chef/server_api" # TODO # DEPRECATION NOTE # This class will be replaced by Chef::UserV1 in Chef 13. It is the code to support the User object -# corrosponding to the Open Source Chef Server 11 and only still exists to support +# corresponding to the Open Source Chef Server 11 and only still exists to support # users still on OSC 11. # # Chef::UserV1 now supports Chef Server 12 and will be moved to this namespace in Chef 13. # # New development should occur in Chef::UserV1. -# This file and corrosponding osc_user knife files +# This file and corresponding osc_user knife files # should be removed once client support for Open Source Chef Server 11 expires. class Chef class User @@ -155,7 +155,7 @@ class Chef end def self.json_create(json) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::User#from_json or Chef::User#load.") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::User#from_json or Chef::User#load.") Chef::User.from_json(json) end diff --git a/lib/chef/user_v1.rb b/lib/chef/user_v1.rb index db44ced9d4..fc01057888 100644 --- a/lib/chef/user_v1.rb +++ b/lib/chef/user_v1.rb @@ -277,7 +277,7 @@ class Chef end def self.json_create(json) - Chef.log_deprecation("Auto inflation of JSON data is deprecated. Please use Chef::UserV1#from_json or Chef::UserV1#load.") + Chef.deprecated(:json_auto_inflate, "Auto inflation of JSON data is deprecated. Please use Chef::UserV1#from_json or Chef::UserV1#load.") Chef::UserV1.from_json(json) end |