# frozen_string_literal: true### Provides 3 methods for declaring when something is going away.## +deprecate(name, repl, year, month)+:# Indicate something may be removed on/after a certain date.## +rubygems_deprecate(name, replacement=:none)+:# Indicate something will be removed in the next major RubyGems version,# and (optionally) a replacement for it.## +rubygems_deprecate_command+:# Indicate a RubyGems command (in +lib/rubygems/commands/*.rb+) will be# removed in the next RubyGems version.## Also provides +skip_during+ for temporarily turning off deprecation warnings.# This is intended to be used in the test suite, so deprecation warnings# don't cause test failures if you need to make sure stderr is otherwise empty.### Example usage of +deprecate+ and +rubygems_deprecate+:## class Legacy# def self.some_class_method# # ...# end## def some_instance_method# # ...# end## def some_old_method# # ...# end## extend Gem::Deprecate# deprecate :some_instance_method, "X.z", 2011, 4# rubygems_deprecate :some_old_method, "Modern#some_new_method"## class << self# extend Gem::Deprecate# deprecate :some_class_method, :none, 2011, 4# end# end### Example usage of +rubygems_deprecate_command+:## class Gem::Commands::QueryCommand < Gem::Command# extend Gem::Deprecate# rubygems_deprecate_command## # ...# end### Example usage of +skip_during+:## class TestSomething < Gem::Testcase# def test_some_thing_with_deprecations# Gem::Deprecate.skip_during do# actual_stdout, actual_stderr = capture_output do# Gem.something_deprecated# end# assert_empty actual_stdout# assert_equal(expected, actual_stderr)# end# end# endmoduleGemmoduleDeprecatedefself.skip# :nodoc:@skip||=falseenddefself.skip=(v)# :nodoc:@skip=vend### Temporarily turn off warnings. Intended for tests only.defskip_duringoriginal=Gem::Deprecate.skipGem::Deprecate.skip=trueyieldensureGem::Deprecate.skip=originalenddefself.next_rubygems_major_version# :nodoc:Gem::Version.new(Gem.rubygems_version.segments.first).bumpend### Simple deprecation method that deprecates +name+ by wrapping it up# in a dummy method. It warns on each call to the dummy method# telling the user of +repl+ (unless +repl+ is :none) and the# year/month that it is planned to go away.defdeprecate(name,repl,year,month)class_evaldoold="_deprecated_#{name}"alias_methodold,namedefine_methodnamedo|*args,&block|klass=is_a?Moduletarget=klass?"#{self}.":"#{self.class}#"msg=["NOTE: #{target}#{name} is deprecated",repl==:none?" with no replacement":"; use #{repl} instead",format(". It will be removed on or after %4d-%02d.",year,month),"\n#{target}#{name} called from #{Gem.location_of_caller.join(":")}",]warn"#{msg.join}."unlessGem::Deprecate.skipsendold,*args,&blockendruby2_keywordsnameifrespond_to?(:ruby2_keywords,true)endend### Simple deprecation method that deprecates +name+ by wrapping it up# in a dummy method. It warns on each call to the dummy method# telling the user of +repl+ (unless +repl+ is :none) and the# Rubygems version that it is planned to go away.defrubygems_deprecate(name,replacement=:none)class_evaldoold="_deprecated_#{name}"alias_methodold,namedefine_methodnamedo|*args,&block|klass=is_a?Moduletarget=klass?"#{self}.":"#{self.class}#"msg=["NOTE: #{target}#{name} is deprecated",replacement==:none?" with no replacement":"; use #{replacement} instead",". It will be removed in Rubygems #{Gem::Deprecate.next_rubygems_major_version}","\n#{target}#{name} called from #{Gem.location_of_caller.join(":")}",]warn"#{msg.join}."unlessGem::Deprecate.skipsendold,*args,&blockendruby2_keywordsnameifrespond_to?(:ruby2_keywords,true)endend# Deprecation method to deprecate Rubygems commandsdefrubygems_deprecate_command(version=Gem::Deprecate.next_rubygems_major_version)class_evaldodefine_method"deprecated?"dotrueenddefine_method"deprecation_warning"domsg=["#{command} command is deprecated",". It will be removed in Rubygems #{version}.\n",]alert_warningmsg.join.to_sunlessGem::Deprecate.skipendendendmodule_function:rubygems_deprecate,:rubygems_deprecate_command,:skip_duringendend