提交 6d85804b 编写于 作者: A Aaron Patterson

ExceptionWrapper doesn't need to know about `env`

ExceptionWrapper only cares about the backtrace cleaner, so lets just
pass the cleaner to the wrapper.  It does not need to know that env
exists or what key the backtrace cleaner is stored in
上级 38251d2e
......@@ -60,7 +60,8 @@ def call(env)
private
def render_exception(env, exception)
wrapper = ExceptionWrapper.new(env, exception)
backtrace_cleaner = env['action_dispatch.backtrace_cleaner']
wrapper = ExceptionWrapper.new(backtrace_cleaner, exception)
log_error(env, wrapper)
if env['action_dispatch.show_detailed_exceptions']
......
......@@ -31,10 +31,10 @@ class ExceptionWrapper
'ActionView::Template::Error' => 'template_error'
)
attr_reader :env, :exception, :line_number, :file
attr_reader :backtrace_cleaner, :exception, :line_number, :file
def initialize(env, exception)
@env = env
def initialize(backtrace_cleaner, exception)
@backtrace_cleaner = backtrace_cleaner
@exception = original_exception(exception)
expand_backtrace if exception.is_a?(SyntaxError) || exception.try(:original_exception).try(:is_a?, SyntaxError)
......@@ -125,10 +125,6 @@ def clean_backtrace(*args)
end
end
def backtrace_cleaner
@backtrace_cleaner ||= @env['action_dispatch.backtrace_cleaner']
end
def source_fragment(path, line)
return unless Rails.respond_to?(:root) && Rails.root
full_path = Rails.root.join(path)
......
......@@ -39,7 +39,8 @@ def call(env)
private
def render_exception(env, exception)
wrapper = ExceptionWrapper.new(env, exception)
backtrace_cleaner = env['action_dispatch.backtrace_cleaner']
wrapper = ExceptionWrapper.new(backtrace_cleaner, exception)
status = wrapper.status_code
env["action_dispatch.exception"] = wrapper.exception
env["action_dispatch.original_path"] = env["PATH_INFO"]
......
......@@ -19,15 +19,13 @@ def backtrace
setup do
Rails.stubs(:root).returns(Pathname.new('.'))
cleaner = ActiveSupport::BacktraceCleaner.new
cleaner.add_silencer { |line| line !~ /^lib/ }
@environment = { 'action_dispatch.backtrace_cleaner' => cleaner }
@cleaner = ActiveSupport::BacktraceCleaner.new
@cleaner.add_silencer { |line| line !~ /^lib/ }
end
test '#source_extracts fetches source fragments for every backtrace entry' do
exception = TestError.new("lib/file.rb:42:in `index'")
wrapper = ExceptionWrapper.new({}, exception)
wrapper = ExceptionWrapper.new(nil, exception)
wrapper.expects(:source_fragment).with('lib/file.rb', 42).returns('foo')
......@@ -37,7 +35,7 @@ def backtrace
test '#source_extracts works with Windows paths' do
exc = TestError.new("c:/path/to/rails/app/controller.rb:27:in 'index':")
wrapper = ExceptionWrapper.new({}, exc)
wrapper = ExceptionWrapper.new(nil, exc)
wrapper.expects(:source_fragment).with('c:/path/to/rails/app/controller.rb', 27).returns('nothing')
assert_equal [ code: 'nothing', line_number: 27 ], wrapper.source_extracts
......@@ -46,7 +44,7 @@ def backtrace
test '#source_extracts works with non standard backtrace' do
exc = TestError.new('invalid')
wrapper = ExceptionWrapper.new({}, exc)
wrapper = ExceptionWrapper.new(nil, exc)
wrapper.expects(:source_fragment).with('invalid', 0).returns('nothing')
assert_equal [ code: 'nothing', line_number: 0 ], wrapper.source_extracts
......@@ -54,14 +52,14 @@ def backtrace
test '#application_trace returns traces only from the application' do
exception = TestError.new(caller.prepend("lib/file.rb:42:in `index'"))
wrapper = ExceptionWrapper.new(@environment, exception)
wrapper = ExceptionWrapper.new(@cleaner, exception)
assert_equal [ "lib/file.rb:42:in `index'" ], wrapper.application_trace
end
test '#application_trace cannot be nil' do
nil_backtrace_wrapper = ExceptionWrapper.new(@environment, BadlyDefinedError.new)
nil_cleaner_wrapper = ExceptionWrapper.new({}, BadlyDefinedError.new)
nil_backtrace_wrapper = ExceptionWrapper.new(@cleaner, BadlyDefinedError.new)
nil_cleaner_wrapper = ExceptionWrapper.new(nil, BadlyDefinedError.new)
assert_equal [], nil_backtrace_wrapper.application_trace
assert_equal [], nil_cleaner_wrapper.application_trace
......@@ -69,14 +67,14 @@ def backtrace
test '#framework_trace returns traces outside the application' do
exception = TestError.new(caller.prepend("lib/file.rb:42:in `index'"))
wrapper = ExceptionWrapper.new(@environment, exception)
wrapper = ExceptionWrapper.new(@cleaner, exception)
assert_equal caller, wrapper.framework_trace
end
test '#framework_trace cannot be nil' do
nil_backtrace_wrapper = ExceptionWrapper.new(@environment, BadlyDefinedError.new)
nil_cleaner_wrapper = ExceptionWrapper.new({}, BadlyDefinedError.new)
nil_backtrace_wrapper = ExceptionWrapper.new(@cleaner, BadlyDefinedError.new)
nil_cleaner_wrapper = ExceptionWrapper.new(nil, BadlyDefinedError.new)
assert_equal [], nil_backtrace_wrapper.framework_trace
assert_equal [], nil_cleaner_wrapper.framework_trace
......@@ -84,14 +82,14 @@ def backtrace
test '#full_trace returns application and framework traces' do
exception = TestError.new(caller.prepend("lib/file.rb:42:in `index'"))
wrapper = ExceptionWrapper.new(@environment, exception)
wrapper = ExceptionWrapper.new(@cleaner, exception)
assert_equal exception.backtrace, wrapper.full_trace
end
test '#full_trace cannot be nil' do
nil_backtrace_wrapper = ExceptionWrapper.new(@environment, BadlyDefinedError.new)
nil_cleaner_wrapper = ExceptionWrapper.new({}, BadlyDefinedError.new)
nil_backtrace_wrapper = ExceptionWrapper.new(@cleaner, BadlyDefinedError.new)
nil_cleaner_wrapper = ExceptionWrapper.new(nil, BadlyDefinedError.new)
assert_equal [], nil_backtrace_wrapper.full_trace
assert_equal [], nil_cleaner_wrapper.full_trace
......@@ -99,7 +97,7 @@ def backtrace
test '#traces returns every trace by category enumerated with an index' do
exception = TestError.new("lib/file.rb:42:in `index'", "/gems/rack.rb:43:in `index'")
wrapper = ExceptionWrapper.new(@environment, exception)
wrapper = ExceptionWrapper.new(@cleaner, exception)
assert_equal({
'Application Trace' => [ id: 0, trace: "lib/file.rb:42:in `index'" ],
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册