better_errors 2.0.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +5 -5
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +3 -0
  4. data/.travis.yml +96 -2
  5. data/CHANGELOG.md +1 -1
  6. data/Gemfile +2 -7
  7. data/LICENSE.txt +1 -1
  8. data/README.md +99 -39
  9. data/better_errors.gemspec +23 -4
  10. data/gemfiles/pry010.gemfile +9 -0
  11. data/gemfiles/pry011.gemfile +8 -0
  12. data/gemfiles/pry09.gemfile +8 -0
  13. data/gemfiles/rack.gemfile +7 -0
  14. data/gemfiles/rack_boc.gemfile +8 -0
  15. data/gemfiles/rails42.gemfile +9 -0
  16. data/gemfiles/rails42_boc.gemfile +10 -0
  17. data/gemfiles/rails42_haml.gemfile +10 -0
  18. data/gemfiles/rails50.gemfile +8 -0
  19. data/gemfiles/rails50_boc.gemfile +9 -0
  20. data/gemfiles/rails50_haml.gemfile +9 -0
  21. data/gemfiles/rails51.gemfile +8 -0
  22. data/gemfiles/rails51_boc.gemfile +9 -0
  23. data/gemfiles/rails51_haml.gemfile +9 -0
  24. data/gemfiles/rails52.gemfile +8 -0
  25. data/gemfiles/rails52_boc.gemfile +9 -0
  26. data/gemfiles/rails52_haml.gemfile +9 -0
  27. data/gemfiles/rails60.gemfile +7 -0
  28. data/gemfiles/rails60_boc.gemfile +8 -0
  29. data/gemfiles/rails60_haml.gemfile +8 -0
  30. data/lib/better_errors/code_formatter/html.rb +1 -1
  31. data/lib/better_errors/code_formatter.rb +7 -7
  32. data/lib/better_errors/error_page.rb +56 -15
  33. data/lib/better_errors/inspectable_value.rb +45 -0
  34. data/lib/better_errors/middleware.rb +96 -16
  35. data/lib/better_errors/raised_exception.rb +13 -3
  36. data/lib/better_errors/repl/basic.rb +3 -3
  37. data/lib/better_errors/repl/pry.rb +18 -8
  38. data/lib/better_errors/repl.rb +6 -4
  39. data/lib/better_errors/stack_frame.rb +33 -8
  40. data/lib/better_errors/templates/main.erb +71 -34
  41. data/lib/better_errors/templates/text.erb +2 -2
  42. data/lib/better_errors/templates/variable_info.erb +32 -23
  43. data/lib/better_errors/version.rb +1 -1
  44. data/lib/better_errors.rb +21 -3
  45. metadata +118 -35
  46. data/Rakefile +0 -13
  47. data/spec/better_errors/code_formatter_spec.rb +0 -92
  48. data/spec/better_errors/error_page_spec.rb +0 -76
  49. data/spec/better_errors/middleware_spec.rb +0 -154
  50. data/spec/better_errors/raised_exception_spec.rb +0 -52
  51. data/spec/better_errors/repl/basic_spec.rb +0 -18
  52. data/spec/better_errors/repl/pry_spec.rb +0 -40
  53. data/spec/better_errors/repl/shared_examples.rb +0 -18
  54. data/spec/better_errors/stack_frame_spec.rb +0 -157
  55. data/spec/better_errors/support/my_source.rb +0 -20
  56. data/spec/better_errors_spec.rb +0 -73
  57. data/spec/spec_helper.rb +0 -5
  58. data/spec/without_binding_of_caller.rb +0 -9
@@ -1,92 +0,0 @@
1
- require "spec_helper"
2
-
3
- module BetterErrors
4
- describe CodeFormatter do
5
- let(:filename) { File.expand_path("../support/my_source.rb", __FILE__) }
6
-
7
- let(:formatter) { CodeFormatter.new(filename, 8) }
8
-
9
- it "picks an appropriate scanner" do
10
- formatter.coderay_scanner.should == :ruby
11
- end
12
-
13
- it "shows 5 lines of context" do
14
- formatter.line_range.should == (3..13)
15
-
16
- formatter.context_lines.should == [
17
- "three\n",
18
- "four\n",
19
- "five\n",
20
- "six\n",
21
- "seven\n",
22
- "eight\n",
23
- "nine\n",
24
- "ten\n",
25
- "eleven\n",
26
- "twelve\n",
27
- "thirteen\n"
28
- ]
29
- end
30
-
31
- it "works when the line is right on the edge" do
32
- formatter = CodeFormatter.new(filename, 20)
33
- formatter.line_range.should == (15..20)
34
- end
35
-
36
- describe CodeFormatter::HTML do
37
- it "highlights the erroring line" do
38
- formatter = CodeFormatter::HTML.new(filename, 8)
39
- formatter.output.should =~ /highlight.*eight/
40
- end
41
-
42
- it "works when the line is right on the edge" do
43
- formatter = CodeFormatter::HTML.new(filename, 20)
44
- formatter.output.should_not == formatter.source_unavailable
45
- end
46
-
47
- it "doesn't barf when the lines don't make any sense" do
48
- formatter = CodeFormatter::HTML.new(filename, 999)
49
- formatter.output.should == formatter.source_unavailable
50
- end
51
-
52
- it "doesn't barf when the file doesn't exist" do
53
- formatter = CodeFormatter::HTML.new("fkdguhskd7e l", 1)
54
- formatter.output.should == formatter.source_unavailable
55
- end
56
- end
57
-
58
- describe CodeFormatter::Text do
59
- it "highlights the erroring line" do
60
- formatter = CodeFormatter::Text.new(filename, 8)
61
- formatter.output.should == <<-TEXT.gsub(/^ /, "")
62
- 3 three
63
- 4 four
64
- 5 five
65
- 6 six
66
- 7 seven
67
- > 8 eight
68
- 9 nine
69
- 10 ten
70
- 11 eleven
71
- 12 twelve
72
- 13 thirteen
73
- TEXT
74
- end
75
-
76
- it "works when the line is right on the edge" do
77
- formatter = CodeFormatter::Text.new(filename, 20)
78
- formatter.output.should_not == formatter.source_unavailable
79
- end
80
-
81
- it "doesn't barf when the lines don't make any sense" do
82
- formatter = CodeFormatter::Text.new(filename, 999)
83
- formatter.output.should == formatter.source_unavailable
84
- end
85
-
86
- it "doesn't barf when the file doesn't exist" do
87
- formatter = CodeFormatter::Text.new("fkdguhskd7e l", 1)
88
- formatter.output.should == formatter.source_unavailable
89
- end
90
- end
91
- end
92
- end
@@ -1,76 +0,0 @@
1
- require "spec_helper"
2
-
3
- module BetterErrors
4
- describe ErrorPage do
5
- let!(:exception) { raise ZeroDivisionError, "you divided by zero you silly goose!" rescue $! }
6
-
7
- let(:error_page) { ErrorPage.new exception, { "PATH_INFO" => "/some/path" } }
8
-
9
- let(:response) { error_page.render }
10
-
11
- let(:empty_binding) {
12
- local_a = :value_for_local_a
13
- local_b = :value_for_local_b
14
-
15
- @inst_c = :value_for_inst_c
16
- @inst_d = :value_for_inst_d
17
-
18
- binding
19
- }
20
-
21
- it "includes the error message" do
22
- response.should include("you divided by zero you silly goose!")
23
- end
24
-
25
- it "includes the request path" do
26
- response.should include("/some/path")
27
- end
28
-
29
- it "includes the exception class" do
30
- response.should include("ZeroDivisionError")
31
- end
32
-
33
- context "variable inspection" do
34
- let(:exception) { empty_binding.eval("raise") rescue $! }
35
-
36
- if BetterErrors.binding_of_caller_available?
37
- it "shows local variables" do
38
- html = error_page.do_variables("index" => 0)[:html]
39
- html.should include("local_a")
40
- html.should include(":value_for_local_a")
41
- html.should include("local_b")
42
- html.should include(":value_for_local_b")
43
- end
44
- else
45
- it "tells the user to add binding_of_caller to their gemfile to get fancy features" do
46
- html = error_page.do_variables("index" => 0)[:html]
47
- html.should include(%{gem "binding_of_caller"})
48
- end
49
- end
50
-
51
- it "shows instance variables" do
52
- html = error_page.do_variables("index" => 0)[:html]
53
- html.should include("inst_c")
54
- html.should include(":value_for_inst_c")
55
- html.should include("inst_d")
56
- html.should include(":value_for_inst_d")
57
- end
58
-
59
- it "shows filter instance variables" do
60
- BetterErrors.stub(:ignored_instance_variables).and_return([ :@inst_d ])
61
- html = error_page.do_variables("index" => 0)[:html]
62
- html.should include("inst_c")
63
- html.should include(":value_for_inst_c")
64
- html.should_not include('<td class="name">@inst_d</td>')
65
- html.should_not include("<pre>:value_for_inst_d</pre>")
66
- end
67
- end
68
-
69
- it "doesn't die if the source file is not a real filename" do
70
- exception.stub(:backtrace).and_return([
71
- "<internal:prelude>:10:in `spawn_rack_application'"
72
- ])
73
- response.should include("Source unavailable")
74
- end
75
- end
76
- end
@@ -1,154 +0,0 @@
1
- require "spec_helper"
2
-
3
- module BetterErrors
4
- describe Middleware do
5
- let(:app) { Middleware.new(->env { ":)" }) }
6
- let(:exception) { RuntimeError.new("oh no :(") }
7
-
8
- it "passes non-error responses through" do
9
- app.call({}).should == ":)"
10
- end
11
-
12
- it "calls the internal methods" do
13
- app.should_receive :internal_call
14
- app.call("PATH_INFO" => "/__better_errors/1/preform_awesomness")
15
- end
16
-
17
- it "calls the internal methods on any subfolder path" do
18
- app.should_receive :internal_call
19
- app.call("PATH_INFO" => "/any_sub/folder/path/__better_errors/1/preform_awesomness")
20
- end
21
-
22
- it "shows the error page" do
23
- app.should_receive :show_error_page
24
- app.call("PATH_INFO" => "/__better_errors/")
25
- end
26
-
27
- it "shows the error page on any subfolder path" do
28
- app.should_receive :show_error_page
29
- app.call("PATH_INFO" => "/any_sub/folder/path/__better_errors/")
30
- end
31
-
32
- it "doesn't show the error page to a non-local address" do
33
- app.should_not_receive :better_errors_call
34
- app.call("REMOTE_ADDR" => "1.2.3.4")
35
- end
36
-
37
- it "shows to a whitelisted IP" do
38
- BetterErrors::Middleware.allow_ip! '77.55.33.11'
39
- app.should_receive :better_errors_call
40
- app.call("REMOTE_ADDR" => "77.55.33.11")
41
- end
42
-
43
- it "respects the X-Forwarded-For header" do
44
- app.should_not_receive :better_errors_call
45
- app.call(
46
- "REMOTE_ADDR" => "127.0.0.1",
47
- "HTTP_X_FORWARDED_FOR" => "1.2.3.4",
48
- )
49
- end
50
-
51
- it "doesn't blow up when given a blank REMOTE_ADDR" do
52
- expect { app.call("REMOTE_ADDR" => " ") }.to_not raise_error
53
- end
54
-
55
- it "doesn't blow up when given an IP address with a zone index" do
56
- expect { app.call("REMOTE_ADDR" => "0:0:0:0:0:0:0:1%0" ) }.to_not raise_error
57
- end
58
-
59
- context "when requesting the /__better_errors manually" do
60
- let(:app) { Middleware.new(->env { ":)" }) }
61
-
62
- it "shows that no errors have been recorded" do
63
- status, headers, body = app.call("PATH_INFO" => "/__better_errors")
64
- body.join.should match /No errors have been recorded yet./
65
- end
66
-
67
- it "shows that no errors have been recorded on any subfolder path" do
68
- status, headers, body = app.call("PATH_INFO" => "/any_sub/folder/path/__better_errors")
69
- body.join.should match /No errors have been recorded yet./
70
- end
71
- end
72
-
73
- context "when handling an error" do
74
- let(:app) { Middleware.new(->env { raise exception }) }
75
-
76
- it "returns status 500" do
77
- status, headers, body = app.call({})
78
-
79
- status.should == 500
80
- end
81
-
82
- context "original_exception" do
83
- class OriginalExceptionException < Exception
84
- attr_reader :original_exception
85
-
86
- def initialize(message, original_exception = nil)
87
- super(message)
88
- @original_exception = original_exception
89
- end
90
- end
91
-
92
- it "shows Original Exception if it responds_to and has an original_exception" do
93
- app = Middleware.new(->env {
94
- raise OriginalExceptionException.new("Other Exception", Exception.new("Original Exception"))
95
- })
96
-
97
- status, _, body = app.call({})
98
-
99
- status.should == 500
100
- body.join.should_not match(/Other Exception/)
101
- body.join.should match(/Original Exception/)
102
- end
103
-
104
- it "won't crash if the exception responds_to but doesn't have an original_exception" do
105
- app = Middleware.new(->env {
106
- raise OriginalExceptionException.new("Other Exception")
107
- })
108
-
109
- status, _, body = app.call({})
110
-
111
- status.should == 500
112
- body.join.should match(/Other Exception/)
113
- end
114
- end
115
-
116
- it "returns ExceptionWrapper's status_code" do
117
- ad_ew = double("ActionDispatch::ExceptionWrapper")
118
- ad_ew.stub('new').with({}, exception ){ double("ExceptionWrapper", status_code: 404) }
119
- stub_const('ActionDispatch::ExceptionWrapper', ad_ew)
120
-
121
- status, headers, body = app.call({})
122
-
123
- status.should == 404
124
- end
125
-
126
- it "returns UTF-8 error pages" do
127
- status, headers, body = app.call({})
128
-
129
- headers["Content-Type"].should match /charset=utf-8/
130
- end
131
-
132
- it "returns text pages by default" do
133
- status, headers, body = app.call({})
134
-
135
- headers["Content-Type"].should match /text\/plain/
136
- end
137
-
138
- it "returns HTML pages by default" do
139
- # Chrome's 'Accept' header looks similar this.
140
- status, headers, body = app.call("HTTP_ACCEPT" => "text/html,application/xhtml+xml;q=0.9,*/*")
141
-
142
- headers["Content-Type"].should match /text\/html/
143
- end
144
-
145
- it "logs the exception" do
146
- logger = Object.new
147
- logger.should_receive :fatal
148
- BetterErrors.stub(:logger).and_return(logger)
149
-
150
- app.call({})
151
- end
152
- end
153
- end
154
- end
@@ -1,52 +0,0 @@
1
- require "spec_helper"
2
-
3
- module BetterErrors
4
- describe RaisedException do
5
- let(:exception) { RuntimeError.new("whoops") }
6
- subject { RaisedException.new(exception) }
7
-
8
- its(:exception) { should == exception }
9
- its(:message) { should == "whoops" }
10
- its(:type) { should == RuntimeError }
11
-
12
- context "when the exception wraps another exception" do
13
- let(:original_exception) { RuntimeError.new("something went wrong!") }
14
- let(:exception) { double(:original_exception => original_exception) }
15
-
16
- its(:exception) { should == original_exception }
17
- its(:message) { should == "something went wrong!" }
18
- end
19
-
20
- context "when the exception is a syntax error" do
21
- let(:exception) { SyntaxError.new("foo.rb:123: you made a typo!") }
22
-
23
- its(:message) { should == "you made a typo!" }
24
- its(:type) { should == SyntaxError }
25
-
26
- it "has the right filename and line number in the backtrace" do
27
- subject.backtrace.first.filename.should == "foo.rb"
28
- subject.backtrace.first.line.should == 123
29
- end
30
- end
31
-
32
- context "when the exception is a HAML syntax error" do
33
- before do
34
- stub_const("Haml::SyntaxError", Class.new(SyntaxError))
35
- end
36
-
37
- let(:exception) {
38
- Haml::SyntaxError.new("you made a typo!").tap do |ex|
39
- ex.set_backtrace(["foo.rb:123", "haml/internals/blah.rb:123456"])
40
- end
41
- }
42
-
43
- its(:message) { should == "you made a typo!" }
44
- its(:type) { should == Haml::SyntaxError }
45
-
46
- it "has the right filename and line number in the backtrace" do
47
- subject.backtrace.first.filename.should == "foo.rb"
48
- subject.backtrace.first.line.should == 123
49
- end
50
- end
51
- end
52
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
- require "better_errors/repl/basic"
3
- require "better_errors/repl/shared_examples"
4
-
5
- module BetterErrors
6
- module REPL
7
- describe Basic do
8
- let(:fresh_binding) {
9
- local_a = 123
10
- binding
11
- }
12
-
13
- let(:repl) { Basic.new fresh_binding }
14
-
15
- it_behaves_like "a REPL provider"
16
- end
17
- end
18
- end
@@ -1,40 +0,0 @@
1
- require "spec_helper"
2
- require "pry"
3
- require "better_errors/repl/pry"
4
- require "better_errors/repl/shared_examples"
5
-
6
- module BetterErrors
7
- module REPL
8
- describe Pry do
9
- let(:fresh_binding) {
10
- local_a = 123
11
- binding
12
- }
13
-
14
- let(:repl) { Pry.new fresh_binding }
15
-
16
- it "does line continuation" do
17
- output, prompt, filled = repl.send_input ""
18
- output.should == "=> nil\n"
19
- prompt.should == ">>"
20
- filled.should == ""
21
-
22
- output, prompt, filled = repl.send_input "def f(x)"
23
- output.should == ""
24
- prompt.should == ".."
25
- filled.should == " "
26
-
27
- output, prompt, filled = repl.send_input "end"
28
- if RUBY_VERSION >= "2.1.0"
29
- output.should == "=> :f\n"
30
- else
31
- output.should == "=> nil\n"
32
- end
33
- prompt.should == ">>"
34
- filled.should == ""
35
- end
36
-
37
- it_behaves_like "a REPL provider"
38
- end
39
- end
40
- end
@@ -1,18 +0,0 @@
1
- shared_examples_for "a REPL provider" do
2
- it "evaluates ruby code in a given context" do
3
- repl.send_input("local_a = 456")
4
- fresh_binding.eval("local_a").should == 456
5
- end
6
-
7
- it "returns a tuple of output and the new prompt" do
8
- output, prompt = repl.send_input("1 + 2")
9
- output.should == "=> 3\n"
10
- prompt.should == ">>"
11
- end
12
-
13
- it "doesn't barf if the code throws an exception" do
14
- output, prompt = repl.send_input("raise Exception")
15
- output.should include "Exception: Exception"
16
- prompt.should == ">>"
17
- end
18
- end
@@ -1,157 +0,0 @@
1
- require "spec_helper"
2
-
3
- module BetterErrors
4
- describe StackFrame do
5
- context "#application?" do
6
- it "is true for application filenames" do
7
- BetterErrors.stub(:application_root).and_return("/abc/xyz")
8
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
9
-
10
- frame.application?.should be_true
11
- end
12
-
13
- it "is false for everything else" do
14
- BetterErrors.stub(:application_root).and_return("/abc/xyz")
15
- frame = StackFrame.new("/abc/nope", 123, "foo")
16
-
17
- frame.application?.should be_false
18
- end
19
-
20
- it "doesn't care if no application_root is set" do
21
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
22
-
23
- frame.application?.should be_false
24
- end
25
- end
26
-
27
- context "#gem?" do
28
- it "is true for gem filenames" do
29
- Gem.stub(:path).and_return(["/abc/xyz"])
30
- frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
31
-
32
- frame.gem?.should be_true
33
- end
34
-
35
- it "is false for everything else" do
36
- Gem.stub(:path).and_return(["/abc/xyz"])
37
- frame = StackFrame.new("/abc/nope", 123, "foo")
38
-
39
- frame.gem?.should be_false
40
- end
41
- end
42
-
43
- context "#application_path" do
44
- it "chops off the application root" do
45
- BetterErrors.stub(:application_root).and_return("/abc/xyz")
46
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
47
-
48
- frame.application_path.should == "app/controllers/crap_controller.rb"
49
- end
50
- end
51
-
52
- context "#gem_path" do
53
- it "chops of the gem path and stick (gem) there" do
54
- Gem.stub(:path).and_return(["/abc/xyz"])
55
- frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
56
-
57
- frame.gem_path.should == "whatever (1.2.3) lib/whatever.rb"
58
- end
59
-
60
- it "prioritizes gem path over application path" do
61
- BetterErrors.stub(:application_root).and_return("/abc/xyz")
62
- Gem.stub(:path).and_return(["/abc/xyz/vendor"])
63
- frame = StackFrame.new("/abc/xyz/vendor/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
64
-
65
- frame.gem_path.should == "whatever (1.2.3) lib/whatever.rb"
66
- end
67
- end
68
-
69
- context "#pretty_path" do
70
- it "returns #application_path for application paths" do
71
- BetterErrors.stub(:application_root).and_return("/abc/xyz")
72
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
73
- frame.pretty_path.should == frame.application_path
74
- end
75
-
76
- it "returns #gem_path for gem paths" do
77
- Gem.stub(:path).and_return(["/abc/xyz"])
78
- frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
79
-
80
- frame.pretty_path.should == frame.gem_path
81
- end
82
- end
83
-
84
- it "special cases SyntaxErrors" do
85
- begin
86
- eval(%{ raise SyntaxError, "you wrote bad ruby!" }, nil, "my_file.rb", 123)
87
- rescue SyntaxError => syntax_error
88
- end
89
- frames = StackFrame.from_exception(syntax_error)
90
- frames.first.filename.should == "my_file.rb"
91
- frames.first.line.should == 123
92
- end
93
-
94
- it "doesn't blow up if no method name is given" do
95
- error = StandardError.allocate
96
-
97
- error.stub(:backtrace).and_return(["foo.rb:123"])
98
- frames = StackFrame.from_exception(error)
99
- frames.first.filename.should == "foo.rb"
100
- frames.first.line.should == 123
101
-
102
- error.stub(:backtrace).and_return(["foo.rb:123: this is an error message"])
103
- frames = StackFrame.from_exception(error)
104
- frames.first.filename.should == "foo.rb"
105
- frames.first.line.should == 123
106
- end
107
-
108
- it "ignores a backtrace line if its format doesn't make any sense at all" do
109
- error = StandardError.allocate
110
- error.stub(:backtrace).and_return(["foo.rb:123:in `foo'", "C:in `find'", "bar.rb:123:in `bar'"])
111
- frames = StackFrame.from_exception(error)
112
- frames.count.should == 2
113
- end
114
-
115
- it "doesn't blow up if a filename contains a colon" do
116
- error = StandardError.allocate
117
- error.stub(:backtrace).and_return(["crap:filename.rb:123"])
118
- frames = StackFrame.from_exception(error)
119
- frames.first.filename.should == "crap:filename.rb"
120
- end
121
-
122
- it "doesn't blow up with a BasicObject as frame binding" do
123
- obj = BasicObject.new
124
- def obj.my_binding
125
- ::Kernel.binding
126
- end
127
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index", obj.my_binding)
128
- frame.class_name.should == 'BasicObject'
129
- end
130
-
131
- it "sets method names properly" do
132
- obj = "string"
133
- def obj.my_method
134
- begin
135
- raise "foo"
136
- rescue => err
137
- err
138
- end
139
- end
140
-
141
- frame = StackFrame.from_exception(obj.my_method).first
142
- if BetterErrors.binding_of_caller_available?
143
- frame.method_name.should == "#my_method"
144
- frame.class_name.should == "String"
145
- else
146
- frame.method_name.should == "my_method"
147
- frame.class_name.should == nil
148
- end
149
- end
150
-
151
- if RUBY_ENGINE == "java"
152
- it "doesn't blow up on a native Java exception" do
153
- expect { StackFrame.from_exception(java.lang.Exception.new) }.to_not raise_error
154
- end
155
- end
156
- end
157
- end
@@ -1,20 +0,0 @@
1
- one
2
- two
3
- three
4
- four
5
- five
6
- six
7
- seven
8
- eight
9
- nine
10
- ten
11
- eleven
12
- twelve
13
- thirteen
14
- fourteen
15
- fifteen
16
- sixteen
17
- seventeen
18
- eighteen
19
- nineteen
20
- twenty