Module: ActiveSupport::Deprecation::MethodWrapper

Included in:
ActiveSupport::Deprecation
Defined in:
activesupport/lib/active_support/deprecation/method_wrappers.rb

Instance Method Summary collapse

Instance Method Details

#deprecate_methods(target_module, *method_names) ⇒ Object

Declare that a method has been deprecated.

class Fred
  def aaa; end
  def bbb; end
  def ccc; end
  def ddd; end
  def eee; end
end

Using the default deprecator:

ActiveSupport::Deprecation.deprecate_methods(Fred, :aaa, bbb: :zzz, ccc: 'use Bar#ccc instead')
# => Fred

Fred.new.aaa
# DEPRECATION WARNING: aaa is deprecated and will be removed from Rails 5.1. (called from irb_binding at (irb):10)
# => nil

Fred.new.bbb
# DEPRECATION WARNING: bbb is deprecated and will be removed from Rails 5.1 (use zzz instead). (called from irb_binding at (irb):11)
# => nil

Fred.new.ccc
# DEPRECATION WARNING: ccc is deprecated and will be removed from Rails 5.1 (use Bar#ccc instead). (called from irb_binding at (irb):12)
# => nil

Passing in a custom deprecator:

custom_deprecator = ActiveSupport::Deprecation.new('next-release', 'MyGem')
ActiveSupport::Deprecation.deprecate_methods(Fred, ddd: :zzz, deprecator: custom_deprecator)
# => [:ddd]

Fred.new.ddd
DEPRECATION WARNING: ddd is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):15)
# => nil

Using a custom deprecator directly:

custom_deprecator = ActiveSupport::Deprecation.new('next-release', 'MyGem')
custom_deprecator.deprecate_methods(Fred, eee: :zzz)
# => [:eee]

Fred.new.eee
DEPRECATION WARNING: eee is deprecated and will be removed from MyGem next-release (use zzz instead). (called from irb_binding at (irb):18)
# => nil

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'activesupport/lib/active_support/deprecation/method_wrappers.rb', line 52

def deprecate_methods(target_module, *method_names)
  options = method_names.extract_options!
  deprecator = options.delete(:deprecator) || self
  method_names += options.keys
  mod = nil

  method_names.each do |method_name|
    if target_module.method_defined?(method_name) || target_module.private_method_defined?(method_name)
      method = target_module.instance_method(method_name)
      if RUBY_VERSION < "2.7"
        target_module.redefine_method(method_name) do |*args, &block|
          deprecator.deprecation_warning(method_name, options[method_name])
          method.bind(self).call(*args, &block)
        end
      else
        target_module.redefine_method(method_name) do |*args, **kwargs, &block|
          deprecator.deprecation_warning(method_name, options[method_name])
          method.bind(self).call(*args, **kwargs, &block)
        end
      end
    else
      mod ||= Module.new
      if RUBY_VERSION < "2.7"
        mod.define_method(method_name) do |*args, &block|
          deprecator.deprecation_warning(method_name, options[method_name])
          super(*args, &block)
        end
      else
        mod.define_method(method_name) do |*args, **kwargs, &block|
          deprecator.deprecation_warning(method_name, options[method_name])
          super(*args, **kwargs, &block)
        end
      end
    end
  end

  target_module.prepend(mod) if mod
end