module ActiveSupport::Deprecation::Reporting

def _extract_callstack(callstack)

def _extract_callstack(callstack)
  warn "Please pass `caller_locations` to the deprecation API" if $VERBOSE
  offending_line = callstack.find { |line| !ignored_callstack(line) } || callstack.first
  if offending_line
    if md = offending_line.match(/^(.+?):(\d+)(?::in `(.*?)')?/)
      md.captures
    else
      offending_line
    end
  end
end

def allow(allowed_warnings = :all, if: true, &block)

# => ActiveSupport::DeprecationException for dev/test, nil for production
end
ActiveSupport::Deprecation.warn('something broke!')
ActiveSupport::Deprecation.allow ['something broke'], if: Rails.env.production? do

# => nil
end
ActiveSupport::Deprecation.warn('something broke!')
ActiveSupport::Deprecation.allow ['something broke'] do

# => ActiveSupport::DeprecationException
ActiveSupport::Deprecation.warn('something broke!')

]
"something broke"
ActiveSupport::Deprecation.disallowed_warnings = [
ActiveSupport::Deprecation.disallowed_behavior = :raise

If falsey then the method yields to the block without allowing the warning.
responds to .call. If truthy, then matching warnings will be allowed.
The optional if: argument accepts a truthy/falsy value or an object that

+ActiveSupport::Deprecation.disallowed_warnings+
Matching warnings will be exempt from the rules set by
the text of deprecation warning messages generated within the block.
expressions. (Symbols are treated as strings). These are compared against
allowed_warnings can be an array containing strings, symbols, or regular
Allow previously disallowed deprecation warnings within the block.
def allow(allowed_warnings = :all, if: true, &block)
  conditional = binding.local_variable_get(:if)
  conditional = conditional.call if conditional.respond_to?(:call)
  if conditional
    @explicitly_allowed_warnings.bind(allowed_warnings, &block)
  else
    yield
  end
end

def deprecated_method_warning(method_name, message = nil)

# => "method_name is deprecated and will be removed from Rails #{deprecation_horizon} (Optional message)"
deprecated_method_warning(:method_name, "Optional message")
# => "method_name is deprecated and will be removed from Rails #{deprecation_horizon} (use another_method instead)"
deprecated_method_warning(:method_name, :another_method)
# => "method_name is deprecated and will be removed from Rails #{deprecation_horizon}"
deprecated_method_warning(:method_name)

Outputs a deprecation warning message
def deprecated_method_warning(method_name, message = nil)
  warning = "#{method_name} is deprecated and will be removed from #{gem_name} #{deprecation_horizon}"
  case message
  when Symbol then "#{warning} (use #{message} instead)"
  when String then "#{warning} (#{message})"
  else warning
  end
end

def deprecation_caller_message(callstack)

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 deprecation_message(callstack, message = nil)

def deprecation_message(callstack, message = nil)
  message ||= "You are using deprecated behavior which will be removed from the next major or minor release."
  "DEPRECATION WARNING: #{message} #{deprecation_caller_message(callstack)}"
end

def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)

def deprecation_warning(deprecated_method_name, message = nil, caller_backtrace = nil)
  caller_backtrace ||= caller_locations(2)
  deprecated_method_warning(deprecated_method_name, message).tap do |msg|
    warn(msg, caller_backtrace)
  end
end

def extract_callstack(callstack)

def extract_callstack(callstack)
  return _extract_callstack(callstack) if callstack.first.is_a? String
  offending_line = callstack.find { |frame|
    frame.absolute_path && !ignored_callstack(frame.absolute_path)
  } || callstack.first
  [offending_line.path, offending_line.lineno, offending_line.label]
end

def ignored_callstack(path)

def ignored_callstack(path)
  path.start_with?(RAILS_GEM_ROOT) || path.start_with?(RbConfig::CONFIG["rubylibdir"])
end

def silence(&block)

# => nil
end
ActiveSupport::Deprecation.warn('something broke!')
ActiveSupport::Deprecation.silence do

# => "DEPRECATION WARNING: something broke! (called from your_code.rb:1)"
ActiveSupport::Deprecation.warn('something broke!')

Silence deprecation warnings within the block.
def silence(&block)
  @silenced_thread.bind(true, &block)
end

def silenced

def silenced
  @silenced || @silenced_thread.value
end

def warn(message = nil, callstack = nil)

# => "DEPRECATION WARNING: something broke! (called from your_code.rb:1)"
ActiveSupport::Deprecation.warn('something broke!')

ActiveSupport::Deprecation.behavior.
Outputs a deprecation warning to the output configured by
def warn(message = nil, callstack = nil)
  return if silenced
  callstack ||= caller_locations(2)
  deprecation_message(callstack, message).tap do |m|
    if deprecation_disallowed?(message)
      disallowed_behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) }
    else
      behavior.each { |b| b.call(m, callstack, deprecation_horizon, gem_name) }
    end
  end
end