1# frozen_string_literal: true 2## 3# Provides a single method +deprecate+ to be used to declare when 4# something is going away. 5# 6# class Legacy 7# def self.klass_method 8# # ... 9# end 10# 11# def instance_method 12# # ... 13# end 14# 15# extend Gem::Deprecate 16# deprecate :instance_method, "X.z", 2011, 4 17# 18# class << self 19# extend Gem::Deprecate 20# deprecate :klass_method, :none, 2011, 4 21# end 22# end 23 24module Gem::Deprecate 25 26 def self.skip # :nodoc: 27 @skip ||= false 28 end 29 30 def self.skip=(v) # :nodoc: 31 @skip = v 32 end 33 34 ## 35 # Temporarily turn off warnings. Intended for tests only. 36 37 def skip_during 38 Gem::Deprecate.skip, original = true, Gem::Deprecate.skip 39 yield 40 ensure 41 Gem::Deprecate.skip = original 42 end 43 44 ## 45 # Simple deprecation method that deprecates +name+ by wrapping it up 46 # in a dummy method. It warns on each call to the dummy method 47 # telling the user of +repl+ (unless +repl+ is :none) and the 48 # year/month that it is planned to go away. 49 50 def deprecate(name, repl, year, month) 51 class_eval { 52 old = "_deprecated_#{name}" 53 alias_method old, name 54 define_method name do |*args, &block| 55 klass = self.kind_of? Module 56 target = klass ? "#{self}." : "#{self.class}#" 57 msg = [ "NOTE: #{target}#{name} is deprecated", 58 repl == :none ? " with no replacement" : "; use #{repl} instead", 59 ". It will be removed on or after %4d-%02d-01." % [year, month], 60 "\n#{target}#{name} called from #{Gem.location_of_caller.join(":")}", 61 ] 62 warn "#{msg.join}." unless Gem::Deprecate.skip 63 send old, *args, &block 64 end 65 } 66 end 67 68 module_function :deprecate, :skip_during 69 70end 71