модуль ActiveSupport::Deprecation::DeprecatedConstantAccessor
DeprecatedConstantAccessor преобразует константу в устаревшую, подключив const_missing.
Он принимает имена старой (устаревшей) константы и новой константы (оба в строковом формате) и деприкейтера.
Теперь устаревшая константа возвращает тот же объект, что и новая, а не прокси-объект, поэтому её можно использовать прозрачно в rescue блоках и т. д.
PLANETS = %w(mercury venus earth mars jupiter saturn uranus neptune pluto)
# (In a later update, the original implementation of `PLANETS` has been removed.)
PLANETS_POST_2006 = %w(mercury venus earth mars jupiter saturn uranus neptune)
include ActiveSupport::Deprecation::DeprecatedConstantAccessor
deprecate_constant 'PLANETS', 'PLANETS_POST_2006', deprecator: ActiveSupport::Deprecation.new
PLANETS.map { |planet| planet.capitalize }
# => DEPRECATION WARNING: PLANETS is deprecated! Use PLANETS_POST_2006 instead.
(Backtrace information…)
["Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"]
Публичные методы класса
# File activesupport/lib/active_support/deprecation/constant_accessor.rb, line 28
def self.included(base)
require "active_support/inflector/methods"
extension = Module.new do
def const_missing(missing_const_name)
if class_variable_defined?(:@@_deprecated_constants)
if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", caller_locations)
return ActiveSupport::Inflector.constantize(replacement[:new].to_s)
end
end
super
end
def deprecate_constant(const_name, new_constant, message: nil, deprecator: nil)
ActiveSupport.deprecator.warn("DeprecatedConstantAccessor.deprecate_constant without a deprecator is deprecated") unless deprecator
deprecator ||= ActiveSupport::Deprecation._instance
class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator }
end
end
base.singleton_class.prepend extension
end Публичные методы экземпляра
# File activesupport/lib/active_support/deprecation/constant_accessor.rb, line 32
def const_missing(missing_const_name)
if class_variable_defined?(:@@_deprecated_constants)
if (replacement = class_variable_get(:@@_deprecated_constants)[missing_const_name.to_s])
replacement[:deprecator].warn(replacement[:message] || "#{name}::#{missing_const_name} is deprecated! Use #{replacement[:new]} instead.", caller_locations)
return ActiveSupport::Inflector.constantize(replacement[:new].to_s)
end
end
super
end Вызывает метод суперкласса
# File activesupport/lib/active_support/deprecation/constant_accessor.rb, line 42
def deprecate_constant(const_name, new_constant, message: nil, deprecator: nil)
ActiveSupport.deprecator.warn("DeprecatedConstantAccessor.deprecate_constant without a deprecator is deprecated") unless deprecator
deprecator ||= ActiveSupport::Deprecation._instance
class_variable_set(:@@_deprecated_constants, {}) unless class_variable_defined?(:@@_deprecated_constants)
class_variable_get(:@@_deprecated_constants)[const_name.to_s] = { new: new_constant, message: message, deprecator: deprecator }
end
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.