未验证 提交 2eb7aa11 编写于 作者: A Aaron Patterson 提交者: GitHub

Merge pull request #39304 from zenspider/zenspider/backtrace_filter_should_never_return_empty

Fixed BacktraceCleaner to never return an empty backtrace.
...@@ -503,7 +503,9 @@ def call(env) ...@@ -503,7 +503,9 @@ def call(env)
output = StringIO.new output = StringIO.new
backtrace_cleaner = ActiveSupport::BacktraceCleaner.new backtrace_cleaner = ActiveSupport::BacktraceCleaner.new
backtrace_cleaner.add_silencer { true } def backtrace_cleaner.clean(bt, _)
[]
end
env = { "action_dispatch.show_exceptions" => true, env = { "action_dispatch.show_exceptions" => true,
"action_dispatch.logger" => Logger.new(output), "action_dispatch.logger" => Logger.new(output),
......
...@@ -104,28 +104,29 @@ def add_stdlib_silencer ...@@ -104,28 +104,29 @@ def add_stdlib_silencer
add_silencer { |line| line.start_with?(RbConfig::CONFIG["rubylibdir"]) } add_silencer { |line| line.start_with?(RbConfig::CONFIG["rubylibdir"]) }
end end
def filter_backtrace(backtrace) # Process +ary+ via +filters+ using +method+, ensuring
@filters.each do |f| # _something_ gets returned.
backtrace = backtrace.map { |line| f.call(line) } def process_collection(ary, filters, method)
end filters.reduce(ary) { |bt, f| bt.send(method) { |line| f.call(line) } }
end
backtrace # Use @filters to transform the backtrace via map
def filter_backtrace(backtrace)
process_collection backtrace, @filters, :map
end end
# Use @silencers to reject parts of the backtrace. Guarantee
# something non-empty is returned.
def silence(backtrace) def silence(backtrace)
@silencers.each do |s| result = process_collection backtrace, @silencers, :reject
backtrace = backtrace.reject { |line| s.call(line) } result.first ? result : backtrace.dup
end
backtrace
end end
# Use @silencers to select parts of the backtrace. Guarantee
# something non-empty is returned.
def noise(backtrace) def noise(backtrace)
backtrace.select do |line| result = backtrace.select { |line| @silencers.any? { |s| s.call(line) } }
@silencers.any? do |s| result.first ? result : backtrace.dup
s.call(line)
end
end
end end
end end
end end
...@@ -42,6 +42,17 @@ def setup ...@@ -42,6 +42,17 @@ def setup
end end
end end
class BacktraceCleanerShouldNeverReturnEmpty < ActiveSupport::TestCase
test "backtrace should return a backtrace no matter what" do
@bc = ActiveSupport::BacktraceCleaner.new
@bc.add_silencer { |line| true }
bt = %w[ first second third ]
assert_equal bt, @bc.clean(bt.dup)
end
end
class BacktraceCleanerMultipleSilencersTest < ActiveSupport::TestCase class BacktraceCleanerMultipleSilencersTest < ActiveSupport::TestCase
def setup def setup
@bc = ActiveSupport::BacktraceCleaner.new @bc = ActiveSupport::BacktraceCleaner.new
...@@ -103,14 +114,14 @@ def setup ...@@ -103,14 +114,14 @@ def setup
end end
test "should silence gems from the backtrace" do test "should silence gems from the backtrace" do
backtrace = [ "#{Gem.path[0]}/gems/nosuchgem-1.2.3/lib/foo.rb" ] backtrace = [ "#{Gem.path[0]}/gems/nosuchgem-1.2.3/lib/foo.rb", "other/file.rb" ]
result = @bc.clean(backtrace) result = @bc.clean(backtrace)
assert_empty result assert_equal %w[other/file.rb], result
end end
test "should silence stdlib" do test "should silence stdlib" do
backtrace = ["#{RbConfig::CONFIG["rubylibdir"]}/lib/foo.rb"] backtrace = ["#{RbConfig::CONFIG["rubylibdir"]}/lib/foo.rb", "other/file.rb"]
result = @bc.clean(backtrace) result = @bc.clean(backtrace)
assert_empty result assert_equal %w[other/file.rb], result
end end
end end
...@@ -17,6 +17,8 @@ def record(result) ...@@ -17,6 +17,8 @@ def record(result)
end end
if output_inline? && result.failure && (!result.skipped? || options[:verbose]) if output_inline? && result.failure && (!result.skipped? || options[:verbose])
result.failures.each { |f| f.backtrace.clear } if result.error?
io.puts io.puts
io.puts io.puts
io.puts color_output(result, by: result) io.puts color_output(result, by: result)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册