better_errors 0.9.0 → 1.0.0.rc1
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.
Potentially problematic release.
This version of better_errors might be problematic. Click here for more details.
- checksums.yaml +14 -6
- data/.travis.yml +1 -0
- data/Gemfile +8 -0
- data/LICENSE.txt +2 -2
- data/README.md +7 -16
- data/better_errors.gemspec +0 -8
- data/lib/better_errors.rb +45 -31
- data/lib/better_errors/code_formatter.rb +2 -2
- data/lib/better_errors/code_formatter/html.rb +11 -4
- data/lib/better_errors/code_formatter/text.rb +2 -2
- data/lib/better_errors/error_page.rb +2 -1
- data/lib/better_errors/middleware.rb +10 -5
- data/lib/better_errors/repl.rb +2 -2
- data/lib/better_errors/repl/basic.rb +1 -1
- data/lib/better_errors/repl/pry.rb +11 -6
- data/lib/better_errors/stack_frame.rb +41 -7
- data/lib/better_errors/templates/main.erb +37 -5
- data/lib/better_errors/templates/variable_info.erb +4 -3
- data/lib/better_errors/version.rb +1 -1
- data/spec/better_errors/code_formatter_spec.rb +11 -11
- data/spec/better_errors/error_page_spec.rb +20 -13
- data/spec/better_errors/middleware_spec.rb +35 -16
- data/spec/better_errors/repl/basic_spec.rb +1 -1
- data/spec/better_errors/repl/pry_spec.rb +9 -6
- data/spec/better_errors/repl/shared_examples.rb +16 -20
- data/spec/better_errors/stack_frame_spec.rb +71 -30
- data/spec/better_errors_spec.rb +63 -3
- data/spec/spec_helper.rb +1 -0
- metadata +10 -110
- data/CONTRIBUTING.md +0 -9
- data/TIPS_AND_TRICKS.md +0 -39
@@ -3,21 +3,21 @@ require "spec_helper"
|
|
3
3
|
module BetterErrors
|
4
4
|
describe StackFrame do
|
5
5
|
context "#application?" do
|
6
|
-
it "
|
7
|
-
BetterErrors.stub
|
6
|
+
it "is true for application filenames" do
|
7
|
+
BetterErrors.stub(:application_root).and_return("/abc/xyz")
|
8
8
|
frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
|
9
9
|
|
10
10
|
frame.application?.should be_true
|
11
11
|
end
|
12
12
|
|
13
|
-
it "
|
14
|
-
BetterErrors.stub
|
13
|
+
it "is false for everything else" do
|
14
|
+
BetterErrors.stub(:application_root).and_return("/abc/xyz")
|
15
15
|
frame = StackFrame.new("/abc/nope", 123, "foo")
|
16
16
|
|
17
17
|
frame.application?.should be_false
|
18
18
|
end
|
19
19
|
|
20
|
-
it "
|
20
|
+
it "doesn't care if no application_root is set" do
|
21
21
|
frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
|
22
22
|
|
23
23
|
frame.application?.should be_false
|
@@ -25,15 +25,15 @@ module BetterErrors
|
|
25
25
|
end
|
26
26
|
|
27
27
|
context "#gem?" do
|
28
|
-
it "
|
29
|
-
Gem.stub
|
28
|
+
it "is true for gem filenames" do
|
29
|
+
Gem.stub(:path).and_return(["/abc/xyz"])
|
30
30
|
frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
|
31
31
|
|
32
32
|
frame.gem?.should be_true
|
33
33
|
end
|
34
34
|
|
35
|
-
it "
|
36
|
-
Gem.stub
|
35
|
+
it "is false for everything else" do
|
36
|
+
Gem.stub(:path).and_return(["/abc/xyz"])
|
37
37
|
frame = StackFrame.new("/abc/nope", 123, "foo")
|
38
38
|
|
39
39
|
frame.gem?.should be_false
|
@@ -41,8 +41,8 @@ module BetterErrors
|
|
41
41
|
end
|
42
42
|
|
43
43
|
context "#application_path" do
|
44
|
-
it "
|
45
|
-
BetterErrors.stub
|
44
|
+
it "chops off the application root" do
|
45
|
+
BetterErrors.stub(:application_root).and_return("/abc/xyz")
|
46
46
|
frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
|
47
47
|
|
48
48
|
frame.application_path.should == "app/controllers/crap_controller.rb"
|
@@ -50,16 +50,16 @@ module BetterErrors
|
|
50
50
|
end
|
51
51
|
|
52
52
|
context "#gem_path" do
|
53
|
-
it "
|
54
|
-
Gem.stub
|
53
|
+
it "chops of the gem path and stick (gem) there" do
|
54
|
+
Gem.stub(:path).and_return(["/abc/xyz"])
|
55
55
|
frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
|
56
56
|
|
57
57
|
frame.gem_path.should == "whatever (1.2.3) lib/whatever.rb"
|
58
58
|
end
|
59
59
|
|
60
|
-
it "
|
61
|
-
BetterErrors.stub
|
62
|
-
Gem.stub
|
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
63
|
frame = StackFrame.new("/abc/xyz/vendor/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
|
64
64
|
|
65
65
|
frame.gem_path.should == "whatever (1.2.3) lib/whatever.rb"
|
@@ -67,54 +67,95 @@ module BetterErrors
|
|
67
67
|
end
|
68
68
|
|
69
69
|
context "#pretty_path" do
|
70
|
-
it "
|
71
|
-
BetterErrors.stub
|
70
|
+
it "returns #application_path for application paths" do
|
71
|
+
BetterErrors.stub(:application_root).and_return("/abc/xyz")
|
72
72
|
frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
|
73
73
|
frame.pretty_path.should == frame.application_path
|
74
74
|
end
|
75
75
|
|
76
|
-
it "
|
77
|
-
Gem.stub
|
76
|
+
it "returns #gem_path for gem paths" do
|
77
|
+
Gem.stub(:path).and_return(["/abc/xyz"])
|
78
78
|
frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
|
79
79
|
|
80
80
|
frame.pretty_path.should == frame.gem_path
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
it "
|
85
|
-
|
86
|
-
|
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
|
87
89
|
frames = StackFrame.from_exception(syntax_error)
|
88
90
|
frames.first.filename.should == "my_file.rb"
|
89
91
|
frames.first.line.should == 123
|
90
92
|
end
|
91
93
|
|
92
|
-
it "
|
94
|
+
it "doesn't blow up if no method name is given" do
|
93
95
|
error = StandardError.allocate
|
94
96
|
|
95
|
-
error.stub
|
97
|
+
error.stub(:backtrace).and_return(["foo.rb:123"])
|
96
98
|
frames = StackFrame.from_exception(error)
|
97
99
|
frames.first.filename.should == "foo.rb"
|
98
100
|
frames.first.line.should == 123
|
99
101
|
|
100
|
-
error.stub
|
102
|
+
error.stub(:backtrace).and_return(["foo.rb:123: this is an error message"])
|
101
103
|
frames = StackFrame.from_exception(error)
|
102
104
|
frames.first.filename.should == "foo.rb"
|
103
105
|
frames.first.line.should == 123
|
104
106
|
end
|
105
107
|
|
106
|
-
it "
|
108
|
+
it "ignores a backtrace line if its format doesn't make any sense at all" do
|
107
109
|
error = StandardError.allocate
|
108
|
-
error.stub
|
110
|
+
error.stub(:backtrace).and_return(["foo.rb:123:in `foo'", "C:in `find'", "bar.rb:123:in `bar'"])
|
109
111
|
frames = StackFrame.from_exception(error)
|
110
112
|
frames.count.should == 2
|
111
113
|
end
|
112
114
|
|
113
|
-
it "
|
115
|
+
it "doesn't blow up if a filename contains a colon" do
|
114
116
|
error = StandardError.allocate
|
115
|
-
error.stub
|
117
|
+
error.stub(:backtrace).and_return(["crap:filename.rb:123"])
|
116
118
|
frames = StackFrame.from_exception(error)
|
117
119
|
frames.first.filename.should == "crap:filename.rb"
|
118
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
|
+
if RUBY_VERSION >= "2.0.0"
|
129
|
+
frame.class_name.should == 'BasicObject'
|
130
|
+
else
|
131
|
+
frame.class_name.should be_nil
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
it "sets method names properly" do
|
136
|
+
obj = "string"
|
137
|
+
def obj.my_method
|
138
|
+
begin
|
139
|
+
raise "foo"
|
140
|
+
rescue => err
|
141
|
+
err
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
frame = StackFrame.from_exception(obj.my_method).first
|
146
|
+
if RUBY_VERSION >= "2.0.0"
|
147
|
+
frame.method_name.should == "#my_method"
|
148
|
+
frame.class_name.should == "String"
|
149
|
+
else
|
150
|
+
frame.method_name.should == "my_method"
|
151
|
+
frame.class_name.should be_nil
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
if RUBY_ENGINE == "java"
|
156
|
+
it "doesn't blow up on a native Java exception" do
|
157
|
+
expect { StackFrame.from_exception(java.lang.Exception.new) }.to_not raise_error
|
158
|
+
end
|
159
|
+
end
|
119
160
|
end
|
120
161
|
end
|
data/spec/better_errors_spec.rb
CHANGED
@@ -2,12 +2,72 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe BetterErrors do
|
4
4
|
context ".editor" do
|
5
|
-
it "
|
5
|
+
it "defaults to textmate" do
|
6
6
|
subject.editor["foo.rb", 123].should == "txmt://open?url=file://foo.rb&line=123"
|
7
7
|
end
|
8
|
-
|
9
|
-
it "
|
8
|
+
|
9
|
+
it "url escapes the filename" do
|
10
10
|
subject.editor["&.rb", 0].should == "txmt://open?url=file://%26.rb&line=0"
|
11
11
|
end
|
12
|
+
|
13
|
+
[:emacs, :emacsclient].each do |editor|
|
14
|
+
it "uses emacs:// scheme when set to #{editor.inspect}" do
|
15
|
+
subject.editor = editor
|
16
|
+
subject.editor[].should start_with "emacs://"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
[:macvim, :mvim].each do |editor|
|
21
|
+
it "uses mvim:// scheme when set to #{editor.inspect}" do
|
22
|
+
subject.editor = editor
|
23
|
+
subject.editor[].should start_with "mvim://"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
[:sublime, :subl, :st].each do |editor|
|
28
|
+
it "uses subl:// scheme when set to #{editor.inspect}" do
|
29
|
+
subject.editor = editor
|
30
|
+
subject.editor[].should start_with "subl://"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
[:textmate, :txmt, :tm].each do |editor|
|
35
|
+
it "uses txmt:// scheme when set to #{editor.inspect}" do
|
36
|
+
subject.editor = editor
|
37
|
+
subject.editor[].should start_with "txmt://"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
["emacsclient", "/usr/local/bin/emacsclient"].each do |editor|
|
42
|
+
it "uses emacs:// scheme when EDITOR=#{editor}" do
|
43
|
+
ENV["EDITOR"] = editor
|
44
|
+
subject.editor = subject.default_editor
|
45
|
+
subject.editor[].should start_with "emacs://"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
["mvim -f", "/usr/local/bin/mvim -f"].each do |editor|
|
50
|
+
it "uses mvim:// scheme when EDITOR=#{editor}" do
|
51
|
+
ENV["EDITOR"] = editor
|
52
|
+
subject.editor = subject.default_editor
|
53
|
+
subject.editor[].should start_with "mvim://"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
["subl -w", "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"].each do |editor|
|
58
|
+
it "uses mvim:// scheme when EDITOR=#{editor}" do
|
59
|
+
ENV["EDITOR"] = editor
|
60
|
+
subject.editor = subject.default_editor
|
61
|
+
subject.editor[].should start_with "subl://"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
["mate -w", "/usr/bin/mate -w"].each do |editor|
|
66
|
+
it "uses txmt:// scheme when EDITOR=#{editor}" do
|
67
|
+
ENV["EDITOR"] = editor
|
68
|
+
subject.editor = subject.default_editor
|
69
|
+
subject.editor[].should start_with "txmt://"
|
70
|
+
end
|
71
|
+
end
|
12
72
|
end
|
13
73
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,139 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: better_errors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charlie Somerville
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 2.12.0
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 2.12.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: binding_of_caller
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - '>='
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - '>='
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: pry
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - '>='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: simplecov
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - '>='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - '>='
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: yard
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - '>='
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - '>='
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: redcarpet
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - '>='
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - '>='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
13
|
- !ruby/object:Gem::Dependency
|
112
14
|
name: erubis
|
113
15
|
requirement: !ruby/object:Gem::Requirement
|
114
16
|
requirements:
|
115
|
-
- - '>='
|
17
|
+
- - ! '>='
|
116
18
|
- !ruby/object:Gem::Version
|
117
19
|
version: 2.6.6
|
118
20
|
type: :runtime
|
119
21
|
prerelease: false
|
120
22
|
version_requirements: !ruby/object:Gem::Requirement
|
121
23
|
requirements:
|
122
|
-
- - '>='
|
24
|
+
- - ! '>='
|
123
25
|
- !ruby/object:Gem::Version
|
124
26
|
version: 2.6.6
|
125
27
|
- !ruby/object:Gem::Dependency
|
126
28
|
name: coderay
|
127
29
|
requirement: !ruby/object:Gem::Requirement
|
128
30
|
requirements:
|
129
|
-
- - '>='
|
31
|
+
- - ! '>='
|
130
32
|
- !ruby/object:Gem::Version
|
131
33
|
version: 1.0.0
|
132
34
|
type: :runtime
|
133
35
|
prerelease: false
|
134
36
|
version_requirements: !ruby/object:Gem::Requirement
|
135
37
|
requirements:
|
136
|
-
- - '>='
|
38
|
+
- - ! '>='
|
137
39
|
- !ruby/object:Gem::Version
|
138
40
|
version: 1.0.0
|
139
41
|
description: Provides a better error page for Rails and other Rack apps. Includes
|
@@ -148,12 +50,10 @@ files:
|
|
148
50
|
- .gitignore
|
149
51
|
- .travis.yml
|
150
52
|
- .yardopts
|
151
|
-
- CONTRIBUTING.md
|
152
53
|
- Gemfile
|
153
54
|
- LICENSE.txt
|
154
55
|
- README.md
|
155
56
|
- Rakefile
|
156
|
-
- TIPS_AND_TRICKS.md
|
157
57
|
- better_errors.gemspec
|
158
58
|
- lib/better_errors.rb
|
159
59
|
- lib/better_errors/code_formatter.rb
|
@@ -191,17 +91,17 @@ require_paths:
|
|
191
91
|
- lib
|
192
92
|
required_ruby_version: !ruby/object:Gem::Requirement
|
193
93
|
requirements:
|
194
|
-
- - '>='
|
94
|
+
- - ! '>='
|
195
95
|
- !ruby/object:Gem::Version
|
196
96
|
version: 1.9.2
|
197
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
198
98
|
requirements:
|
199
|
-
- - '
|
99
|
+
- - ! '>'
|
200
100
|
- !ruby/object:Gem::Version
|
201
|
-
version:
|
101
|
+
version: 1.3.1
|
202
102
|
requirements: []
|
203
103
|
rubyforge_project:
|
204
|
-
rubygems_version: 2.0.
|
104
|
+
rubygems_version: 2.0.6
|
205
105
|
signing_key:
|
206
106
|
specification_version: 4
|
207
107
|
summary: Better error page for Rails and other Rack apps
|