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
# 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|
    message = options[method_name]
    if target_module.method_defined?(method_name) || target_module.private_method_defined?(method_name)
      method = target_module.instance_method(method_name)
      target_module.module_eval do
        redefine_method(method_name) do |*args, &block|
          deprecator.deprecation_warning(method_name, message)
          method.bind(self).call(*args, &block)
        end
        ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true)
      end
    else
      mod ||= Module.new
      mod.module_eval do
        define_method(method_name) do |*args, &block|
          deprecator.deprecation_warning(method_name, message)
          super(*args, &block)
        end
        ruby2_keywords(method_name) if respond_to?(:ruby2_keywords, true)
      end
    end
  end

  target_module.prepend(mod) if mod
end