2009-04-18 00:29:30 -04:00
|
|
|
module ActiveSupport
|
|
|
|
module Deprecation
|
|
|
|
class << self
|
|
|
|
attr_accessor :silenced
|
2011-01-12 18:53:25 -05:00
|
|
|
|
2010-12-19 20:50:47 -05:00
|
|
|
# Outputs a deprecation warning to the output configured by <tt>ActiveSupport::Deprecation.behavior</tt>
|
|
|
|
#
|
|
|
|
# Example:
|
|
|
|
#
|
|
|
|
# ActiveSupport::Deprecation.warn("something broke!")
|
|
|
|
# #=> "DEPRECATION WARNING: something broke! (called from your_code.rb:1)"
|
2009-04-18 00:29:30 -04:00
|
|
|
def warn(message = nil, callstack = caller)
|
2010-07-01 04:26:45 -04:00
|
|
|
return if silenced
|
|
|
|
deprecation_message(callstack, message).tap do |m|
|
|
|
|
behavior.each { |b| b.call(m, callstack) }
|
2009-04-18 00:29:30 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
# Silence deprecation warnings within the block.
|
|
|
|
def silence
|
|
|
|
old_silenced, @silenced = @silenced, true
|
|
|
|
yield
|
|
|
|
ensure
|
|
|
|
@silenced = old_silenced
|
|
|
|
end
|
|
|
|
|
|
|
|
def deprecated_method_warning(method_name, message = nil)
|
|
|
|
warning = "#{method_name} is deprecated and will be removed from Rails #{deprecation_horizon}"
|
|
|
|
case message
|
|
|
|
when Symbol then "#{warning} (use #{message} instead)"
|
|
|
|
when String then "#{warning} (#{message})"
|
|
|
|
else warning
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
def deprecation_message(callstack, message = nil)
|
|
|
|
message ||= "You are using deprecated behavior which will be removed from the next major or minor release."
|
2010-03-05 15:35:42 -05:00
|
|
|
message += '.' unless message =~ /\.$/
|
|
|
|
"DEPRECATION WARNING: #{message} #{deprecation_caller_message(callstack)}"
|
2009-04-18 00:29:30 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def deprecation_caller_message(callstack)
|
|
|
|
file, line, method = extract_callstack(callstack)
|
|
|
|
if file
|
|
|
|
if line && method
|
|
|
|
"(called from #{method} at #{file}:#{line})"
|
|
|
|
else
|
|
|
|
"(called from #{file}:#{line})"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def extract_callstack(callstack)
|
2010-08-20 14:05:38 -04:00
|
|
|
rails_gem_root = File.expand_path("../../../../..", __FILE__) + "/"
|
|
|
|
offending_line = callstack.find { |line| !line.start_with?(rails_gem_root) } || callstack.first
|
|
|
|
if offending_line
|
|
|
|
if md = offending_line.match(/^(.+?):(\d+)(?::in `(.*?)')?/)
|
|
|
|
md.captures
|
|
|
|
else
|
|
|
|
offending_line
|
|
|
|
end
|
2009-04-18 00:29:30 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|