better_errors 2.2.0 → 2.3.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.

Potentially problematic release.


This version of better_errors might be problematic. Click here for more details.

Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -51
  3. data/better_errors.gemspec +5 -3
  4. data/lib/better_errors.rb +1 -1
  5. data/lib/better_errors/error_page.rb +16 -9
  6. data/lib/better_errors/middleware.rb +30 -3
  7. data/lib/better_errors/repl.rb +3 -1
  8. data/lib/better_errors/repl/basic.rb +1 -1
  9. data/lib/better_errors/repl/pry.rb +11 -1
  10. data/lib/better_errors/stack_frame.rb +7 -0
  11. data/lib/better_errors/templates/main.erb +7 -4
  12. data/lib/better_errors/version.rb +1 -1
  13. metadata +6 -40
  14. data/Rakefile +0 -13
  15. data/feature-screenshots/1-application-error.jpg +0 -0
  16. data/feature-screenshots/2-other-application-frame.jpg +0 -0
  17. data/feature-screenshots/3-live-shell.jpg +0 -0
  18. data/feature-screenshots/4-other-frames.jpg +0 -0
  19. data/feature-screenshots/5-open-editor.jpg +0 -0
  20. data/feature-screenshots/6-local-variables.jpg +0 -0
  21. data/feature-screenshots/7-non-html-requests.jpg +0 -0
  22. data/feature-screenshots/8-xhr-shows-text-error.jpg +0 -0
  23. data/feature-screenshots/9-xhr-error-in-manual-console.jpg +0 -0
  24. data/spec/better_errors/code_formatter_spec.rb +0 -92
  25. data/spec/better_errors/error_page_spec.rb +0 -92
  26. data/spec/better_errors/middleware_spec.rb +0 -188
  27. data/spec/better_errors/raised_exception_spec.rb +0 -73
  28. data/spec/better_errors/repl/basic_spec.rb +0 -18
  29. data/spec/better_errors/repl/pry_spec.rb +0 -40
  30. data/spec/better_errors/repl/shared_examples.rb +0 -18
  31. data/spec/better_errors/stack_frame_spec.rb +0 -157
  32. data/spec/better_errors/support/my_source.rb +0 -20
  33. data/spec/better_errors_spec.rb +0 -73
  34. data/spec/spec_helper.rb +0 -5
  35. data/spec/without_binding_of_caller.rb +0 -9
@@ -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
- expect(output).to eq("=> nil\n")
19
- expect(prompt).to eq(">>")
20
- expect(filled).to eq("")
21
-
22
- output, prompt, filled = repl.send_input "def f(x)"
23
- expect(output).to eq("")
24
- expect(prompt).to eq("..")
25
- expect(filled).to eq(" ")
26
-
27
- output, prompt, filled = repl.send_input "end"
28
- if RUBY_VERSION >= "2.1.0"
29
- expect(output).to eq("=> :f\n")
30
- else
31
- expect(output).to eq("=> nil\n")
32
- end
33
- expect(prompt).to eq(">>")
34
- expect(filled).to eq("")
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
- expect(fresh_binding.eval("local_a")).to eq(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
- expect(output).to eq("=> 3\n")
10
- expect(prompt).to eq(">>")
11
- end
12
-
13
- it "doesn't barf if the code throws an exception" do
14
- output, prompt = repl.send_input("raise Exception")
15
- expect(output).to include "Exception: Exception"
16
- expect(prompt).to eq(">>")
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
- allow(BetterErrors).to receive(:application_root).and_return("/abc/xyz")
8
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
9
-
10
- expect(frame).to be_application
11
- end
12
-
13
- it "is false for everything else" do
14
- allow(BetterErrors).to receive(:application_root).and_return("/abc/xyz")
15
- frame = StackFrame.new("/abc/nope", 123, "foo")
16
-
17
- expect(frame).not_to be_application
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
- expect(frame).not_to be_application
24
- end
25
- end
26
-
27
- context "#gem?" do
28
- it "is true for gem filenames" do
29
- allow(Gem).to receive(:path).and_return(["/abc/xyz"])
30
- frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
31
-
32
- expect(frame).to be_gem
33
- end
34
-
35
- it "is false for everything else" do
36
- allow(Gem).to receive(:path).and_return(["/abc/xyz"])
37
- frame = StackFrame.new("/abc/nope", 123, "foo")
38
-
39
- expect(frame).not_to be_gem
40
- end
41
- end
42
-
43
- context "#application_path" do
44
- it "chops off the application root" do
45
- allow(BetterErrors).to receive(:application_root).and_return("/abc/xyz")
46
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
47
-
48
- expect(frame.application_path).to eq("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
- allow(Gem).to receive(:path).and_return(["/abc/xyz"])
55
- frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
56
-
57
- expect(frame.gem_path).to eq("whatever (1.2.3) lib/whatever.rb")
58
- end
59
-
60
- it "prioritizes gem path over application path" do
61
- allow(BetterErrors).to receive(:application_root).and_return("/abc/xyz")
62
- allow(Gem).to receive(: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
- expect(frame.gem_path).to eq("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
- allow(BetterErrors).to receive(:application_root).and_return("/abc/xyz")
72
- frame = StackFrame.new("/abc/xyz/app/controllers/crap_controller.rb", 123, "index")
73
- expect(frame.pretty_path).to eq(frame.application_path)
74
- end
75
-
76
- it "returns #gem_path for gem paths" do
77
- allow(Gem).to receive(:path).and_return(["/abc/xyz"])
78
- frame = StackFrame.new("/abc/xyz/gems/whatever-1.2.3/lib/whatever.rb", 123, "foo")
79
-
80
- expect(frame.pretty_path).to eq(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
- expect(frames.first.filename).to eq("my_file.rb")
91
- expect(frames.first.line).to eq(123)
92
- end
93
-
94
- it "doesn't blow up if no method name is given" do
95
- error = StandardError.allocate
96
-
97
- allow(error).to receive(:backtrace).and_return(["foo.rb:123"])
98
- frames = StackFrame.from_exception(error)
99
- expect(frames.first.filename).to eq("foo.rb")
100
- expect(frames.first.line).to eq(123)
101
-
102
- allow(error).to receive(:backtrace).and_return(["foo.rb:123: this is an error message"])
103
- frames = StackFrame.from_exception(error)
104
- expect(frames.first.filename).to eq("foo.rb")
105
- expect(frames.first.line).to eq(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
- allow(error).to receive(:backtrace).and_return(["foo.rb:123:in `foo'", "C:in `find'", "bar.rb:123:in `bar'"])
111
- frames = StackFrame.from_exception(error)
112
- expect(frames.count).to eq(2)
113
- end
114
-
115
- it "doesn't blow up if a filename contains a colon" do
116
- error = StandardError.allocate
117
- allow(error).to receive(:backtrace).and_return(["crap:filename.rb:123"])
118
- frames = StackFrame.from_exception(error)
119
- expect(frames.first.filename).to eq("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
- expect(frame.class_name).to eq('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
- expect(frame.method_name).to eq("#my_method")
144
- expect(frame.class_name).to eq("String")
145
- else
146
- expect(frame.method_name).to eq("my_method")
147
- expect(frame.class_name).to eq(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
@@ -1,73 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe BetterErrors do
4
- context ".editor" do
5
- it "defaults to textmate" do
6
- expect(subject.editor["foo.rb", 123]).to eq("txmt://open?url=file://foo.rb&line=123")
7
- end
8
-
9
- it "url escapes the filename" do
10
- expect(subject.editor["&.rb", 0]).to eq("txmt://open?url=file://%26.rb&line=0")
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
- expect(subject.editor[]).to 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
- expect(subject.editor[]).to 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
- expect(subject.editor[]).to 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
- expect(subject.editor[]).to 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
- expect(subject.editor[]).to 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
- expect(subject.editor[]).to 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 subl:// scheme when EDITOR=#{editor}" do
59
- ENV["EDITOR"] = editor
60
- subject.editor = subject.default_editor
61
- expect(subject.editor[]).to 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
- expect(subject.editor[]).to start_with "txmt://"
70
- end
71
- end
72
- end
73
- end
@@ -1,5 +0,0 @@
1
- $: << File.expand_path("../../lib", __FILE__)
2
-
3
- ENV["EDITOR"] = nil
4
-
5
- require "better_errors"
@@ -1,9 +0,0 @@
1
- module Kernel
2
- alias_method :require_with_binding_of_caller, :require
3
-
4
- def require(feature)
5
- raise LoadError if feature == "binding_of_caller"
6
-
7
- require_with_binding_of_caller(feature)
8
- end
9
- end