Skip to content

Commit 957a3e5

Browse files
committed
Add BACKTRACE env variable to turn off backtrace for normal running, not just tests
1 parent 0d940e3 commit 957a3e5

File tree

5 files changed

+75
-11
lines changed

5 files changed

+75
-11
lines changed

railties/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
* Support `BACKTRACE` ENV variable to turn off backtrace cleaning.
2+
3+
Useful for debugging framework code:
4+
5+
```sh
6+
BACKTRACE=1 ./bin/rails server
7+
```
8+
9+
*Alex Ghiculescu*
10+
111
* Raise `ArgumentError` when reading `config.x.something` with arguments
212

313
```ruby

railties/lib/minitest/rails_plugin.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def self.plugin_rails_options(opts, options)
109109
# Owes great inspiration to test runner trailblazers like RSpec,
110110
# minitest-reporters, maxitest, and others.
111111
def self.plugin_rails_init(options)
112-
unless options[:full_backtrace] || ENV["BACKTRACE"]
112+
unless options[:full_backtrace]
113113
# Plugin can run without Rails loaded, check before filtering.
114114
if ::Rails.respond_to?(:backtrace_cleaner)
115115
Minitest.backtrace_filter = BacktraceFilterWithFallback.new(::Rails.backtrace_cleaner, Minitest.backtrace_filter)

railties/lib/rails/application/bootstrap.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ module Bootstrap
7171
end
7272
end
7373

74+
initializer :configure_backtrace_cleaner, group: :all do
75+
Rails.backtrace_cleaner.remove_silencers! if ENV["BACKTRACE"]
76+
end
77+
7478
# Initialize cache early in the stack so railties can make use of it.
7579
initializer :initialize_cache, group: :all do
7680
cache_format_version = config.active_support.delete(:cache_format_version)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# frozen_string_literal: true
2+
3+
require "isolation/abstract_unit"
4+
require "rack/test"
5+
require "env_helpers"
6+
7+
module ApplicationTests
8+
class RoutingTest < ActiveSupport::TestCase
9+
include ActiveSupport::Testing::Isolation
10+
include Rack::Test::Methods
11+
include EnvHelpers
12+
13+
def teardown
14+
teardown_app
15+
end
16+
17+
test "backtrace is cleaned" do
18+
setup_app
19+
20+
app("development")
21+
get "/"
22+
assert_includes last_response.body, "app/app/controllers/foo_controller.rb:4:in `index'"
23+
assert_not_includes last_response.body, "rails/railties/test/env_helpers.rb"
24+
end
25+
26+
test "backtrace is not cleaned" do
27+
switch_env("BACKTRACE", "1") do
28+
setup_app
29+
30+
app("development")
31+
get "/"
32+
assert_includes last_response.body, "app/app/controllers/foo_controller.rb:4:in `index'"
33+
assert_includes last_response.body, "rails/railties/test/env_helpers.rb"
34+
end
35+
end
36+
37+
private
38+
def setup_app
39+
build_app
40+
41+
controller :foo, <<-RUBY
42+
class FooController < ApplicationController
43+
def index
44+
begin
45+
raise "ERROR"
46+
rescue StandardError => e
47+
render plain: e.backtrace.join("\n")
48+
end
49+
end
50+
end
51+
RUBY
52+
53+
app_file "config/routes.rb", <<-RUBY
54+
Rails.application.routes.draw do
55+
root to: "foo#index"
56+
end
57+
RUBY
58+
end
59+
end
60+
end

railties/test/minitest/rails_plugin_test.rb

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,6 @@ class Minitest::RailsPluginTest < ActiveSupport::TestCase
4646
end
4747
end
4848

49-
test "does not replace backtrace filter when BACKTRACE environment variable is set" do
50-
backtrace_filter = baseline_backtrace_filter
51-
52-
switch_env "BACKTRACE", "true" do
53-
with_plugin(initial_backtrace_filter: backtrace_filter) do
54-
assert_same backtrace_filter, Minitest.backtrace_filter
55-
end
56-
end
57-
end
58-
5949
test "replaces Minitest::SummaryReporter reporter" do
6050
with_plugin do
6151
assert_empty Minitest.reporter.reporters.select { |reporter| reporter.instance_of? Minitest::SummaryReporter }

0 commit comments

Comments
 (0)