better_errors 0.0.7 → 0.0.8

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.

data/README.md CHANGED
@@ -21,7 +21,7 @@ group :development do
21
21
  end
22
22
  ```
23
23
 
24
- If you would like to use Better Errors' **advanced features**, you need to add the [`binding_of_caller`](https://github.com/banister/binding_of_caller) gem to your Gemfile:
24
+ If you would like to use Better Errors' **advanced features** (REPL, local/instance variable inspection, pretty stack frame names), you need to add the [`binding_of_caller`](https://github.com/banister/binding_of_caller) gem to your Gemfile:
25
25
 
26
26
  ```ruby
27
27
  gem "binding_of_caller"
@@ -8,7 +8,7 @@ require "better_errors/error_frame"
8
8
  require "better_errors/middleware"
9
9
 
10
10
  class << BetterErrors
11
- attr_accessor :application_root, :binding_of_caller_available
11
+ attr_accessor :application_root, :binding_of_caller_available, :logger
12
12
 
13
13
  alias_method :binding_of_caller_available?, :binding_of_caller_available
14
14
  end
@@ -76,11 +76,15 @@ module BetterErrors
76
76
  Hash[frame_binding.eval("instance_variables").map { |x| [x, frame_binding.eval(x.to_s)] }]
77
77
  end
78
78
 
79
+ def to_s
80
+ "#{pretty_path}:#{line}:in `#{name}'"
81
+ end
82
+
79
83
  private
80
84
  def set_pretty_method_name
81
85
  name =~ /\A(block (\([^)]+\) )?in )?/
82
86
  recv = frame_binding.eval("self")
83
- method = frame_binding.eval("__method__")
87
+ return unless method = frame_binding.eval("__method__")
84
88
  @name = if recv.is_a? Module
85
89
  "#{$1}#{recv}.#{method}"
86
90
  else
@@ -40,6 +40,10 @@ module BetterErrors
40
40
  end
41
41
  response.merge(highlighted_input: CodeRay.scan(opts["source"], :ruby).div(wrap: nil))
42
42
  end
43
+
44
+ def backtrace_frames
45
+ @backtrace_frames ||= ErrorFrame.from_exception(exception)
46
+ end
43
47
 
44
48
  private
45
49
  def real_exception(exception)
@@ -53,10 +57,6 @@ module BetterErrors
53
57
  def request_path
54
58
  env["REQUEST_PATH"]
55
59
  end
56
-
57
- def backtrace_frames
58
- @backtrace_frames ||= ErrorFrame.from_exception(exception)
59
- end
60
60
 
61
61
  def coderay_scanner_for_ext(ext)
62
62
  case ext
@@ -64,6 +64,7 @@ module BetterErrors
64
64
  when "html"; :html
65
65
  when "erb"; :erb
66
66
  when "haml"; :haml
67
+ else :text
67
68
  end
68
69
  end
69
70
 
@@ -75,6 +76,7 @@ module BetterErrors
75
76
  lines = File.readlines(frame.filename)
76
77
  min_line = [1, frame.line - lines_of_context].max - 1
77
78
  max_line = [frame.line + lines_of_context, lines.count + 1].min - 1
79
+ raise Errno::EINVAL if min_line > lines.length
78
80
  [min_line, max_line, lines[min_line..max_line].join]
79
81
  end
80
82
 
@@ -95,7 +97,7 @@ module BetterErrors
95
97
  end
96
98
  html << "</div>"
97
99
  end
98
- rescue Errno::ENOENT
100
+ rescue Errno::ENOENT, Errno::EINVAL
99
101
  "<p>Source unavailable</p>"
100
102
  end
101
103
  end
@@ -20,9 +20,21 @@ module BetterErrors
20
20
  @app.call env
21
21
  rescue Exception => ex
22
22
  @error_page = @handler.new ex, env
23
+ log_exception
23
24
  [500, { "Content-Type" => "text/html; charset=utf-8" }, [@error_page.render]]
24
25
  end
25
26
 
27
+ def log_exception
28
+ return unless BetterErrors.logger
29
+
30
+ message = "\n#{@error_page.exception.class} - #{@error_page.exception.message}:\n"
31
+ @error_page.backtrace_frames.each do |frame|
32
+ message << " #{frame}\n"
33
+ end
34
+
35
+ BetterErrors.logger.fatal message
36
+ end
37
+
26
38
  def internal_call(env, opts)
27
39
  if opts[:oid].to_i != @error_page.object_id
28
40
  return [200, { "Content-Type" => "text/plain; charset=utf-8" }, [JSON.dump(error: "Session expired")]]
@@ -3,6 +3,7 @@ module BetterErrors
3
3
  initializer "better_errors.configure_rails_initialization" do
4
4
  unless Rails.env.production?
5
5
  Rails.application.middleware.use BetterErrors::Middleware
6
+ BetterErrors.logger = Rails.logger
6
7
  BetterErrors.application_root = Rails.root.to_s
7
8
  end
8
9
  end
@@ -352,8 +352,6 @@
352
352
  })(i, frames[i], frameInfos[i]);
353
353
  }
354
354
 
355
- document.querySelector(".frames li:first-child").click();
356
-
357
355
  var applicationFrames = document.getElementById("application_frames");
358
356
  var allFrames = document.getElementById("all_frames");
359
357
 
@@ -380,6 +378,13 @@
380
378
  };
381
379
 
382
380
  applicationFrames.click();
381
+
382
+ for(var i = 0; i < frames.length; i++) {
383
+ if(frames[i].attributes["data-context"].value == "application") {
384
+ frames[i].click();
385
+ break;
386
+ }
387
+ }
383
388
  })();
384
389
  </script>
385
390
  </html>
@@ -1,3 +1,3 @@
1
1
  module BetterErrors
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -7,6 +7,16 @@ module BetterErrors
7
7
  let(:error_page) { ErrorPage.new exception, { "REQUEST_PATH" => "/some/path" } }
8
8
 
9
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
+ }
10
20
 
11
21
  it "should include the error message" do
12
22
  response.should include("you divided by zero you silly goose!")
@@ -42,6 +52,26 @@ module BetterErrors
42
52
  end
43
53
  end
44
54
 
55
+ context "variable inspection" do
56
+ let(:exception) { empty_binding.eval("raise") rescue $! }
57
+
58
+ it "should show local variables" do
59
+ html = error_page.do_variables("index" => 0)[:html]
60
+ html.should include("local_a")
61
+ html.should include(":value_for_local_a")
62
+ html.should include("local_b")
63
+ html.should include(":value_for_local_b")
64
+ end
65
+
66
+ it "should show instance variables" do
67
+ html = error_page.do_variables("index" => 0)[:html]
68
+ html.should include("inst_c")
69
+ html.should include(":value_for_inst_c")
70
+ html.should include("inst_d")
71
+ html.should include(":value_for_inst_d")
72
+ end
73
+ end
74
+
45
75
  it "should not die if the source file is not a real filename" do
46
76
  exception.stub!(:backtrace).and_return([
47
77
  "<internal:prelude>:10:in `spawn_rack_application'"
@@ -21,6 +21,14 @@ module BetterErrors
21
21
 
22
22
  headers["Content-Type"].should == "text/html; charset=utf-8"
23
23
  end
24
+
25
+ it "should log the exception" do
26
+ logger = Object.new
27
+ logger.should_receive :fatal
28
+ BetterErrors.stub!(:logger).and_return(logger)
29
+
30
+ app.call({})
31
+ end
24
32
  end
25
33
  end
26
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_errors
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-09 00:00:00.000000000 Z
12
+ date: 2012-12-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -119,4 +119,3 @@ test_files:
119
119
  - spec/better_errors/middleware_spec.rb
120
120
  - spec/better_errors/support/my_source.rb
121
121
  - spec/spec_helper.rb
122
- has_rdoc: