better_errors 2.6.0 → 2.10.1

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/.github/release-drafter.yml +46 -0
  3. data/.github/workflows/ci.yml +123 -0
  4. data/.github/workflows/draft_release_update.yml +22 -0
  5. data/.github/workflows/pull_request.yml +20 -0
  6. data/.github/workflows/release.yml +68 -0
  7. data/.gitignore +4 -0
  8. data/.ruby-version +1 -0
  9. data/Gemfile +6 -1
  10. data/{LICENSE.txt → LICENSE} +1 -1
  11. data/README.md +34 -2
  12. data/better_errors.gemspec +8 -6
  13. data/gemfiles/pry010.gemfile +2 -1
  14. data/gemfiles/pry011.gemfile +2 -1
  15. data/gemfiles/pry09.gemfile +2 -1
  16. data/gemfiles/rack.gemfile +2 -1
  17. data/gemfiles/rack_boc.gemfile +2 -1
  18. data/gemfiles/rails42.gemfile +2 -1
  19. data/gemfiles/rails42_boc.gemfile +2 -1
  20. data/gemfiles/rails42_haml.gemfile +2 -1
  21. data/gemfiles/rails50.gemfile +2 -1
  22. data/gemfiles/rails50_boc.gemfile +2 -1
  23. data/gemfiles/rails50_haml.gemfile +2 -1
  24. data/gemfiles/rails51.gemfile +2 -1
  25. data/gemfiles/rails51_boc.gemfile +2 -1
  26. data/gemfiles/rails51_haml.gemfile +2 -1
  27. data/gemfiles/rails52.gemfile +2 -1
  28. data/gemfiles/rails52_boc.gemfile +2 -1
  29. data/gemfiles/rails52_haml.gemfile +2 -1
  30. data/gemfiles/rails60.gemfile +8 -0
  31. data/gemfiles/rails60_boc.gemfile +9 -0
  32. data/gemfiles/rails60_haml.gemfile +9 -0
  33. data/gemfiles/rails61.gemfile +8 -0
  34. data/gemfiles/rails61_boc.gemfile +9 -0
  35. data/gemfiles/rails61_haml.gemfile +9 -0
  36. data/lib/better_errors/code_formatter/html.rb +15 -1
  37. data/lib/better_errors/code_formatter.rb +16 -27
  38. data/lib/better_errors/editor.rb +103 -0
  39. data/lib/better_errors/error_page.rb +53 -12
  40. data/lib/better_errors/error_page_style.rb +43 -0
  41. data/lib/better_errors/exception_hint.rb +29 -0
  42. data/lib/better_errors/middleware.rb +75 -12
  43. data/lib/better_errors/raised_exception.rb +25 -4
  44. data/lib/better_errors/templates/main.css +1 -0
  45. data/lib/better_errors/templates/main.erb +94 -709
  46. data/lib/better_errors/templates/text.erb +6 -3
  47. data/lib/better_errors/templates/variable_info.erb +24 -14
  48. data/lib/better_errors/version.rb +2 -1
  49. data/lib/better_errors.rb +20 -34
  50. metadata +51 -8
  51. data/.travis.yml +0 -58
@@ -1,12 +1,15 @@
1
1
  <%== text_heading("=", "%s at %s" % [exception_type, request_path]) %>
2
2
 
3
- > <%== exception_message %>
4
- <% if backtrace_frames.any? %>
3
+ <%== exception_message %>
4
+
5
+ > To access an interactive console with this error, point your browser to: /__better_errors
6
+
7
+ <% if backtrace_frames.any? -%>
5
8
 
6
9
  <%== text_heading("-", "%s, line %i" % [first_frame.pretty_path, first_frame.line]) %>
7
10
 
8
11
  ``` ruby
9
- <%== text_formatted_code_block(first_frame) %>```
12
+ <%== ErrorPage.text_formatted_code_block(first_frame) %>```
10
13
 
11
14
  App backtrace
12
15
  -------------
@@ -1,13 +1,20 @@
1
1
  <header class="trace_info clearfix">
2
2
  <div class="title">
3
- <h2 class="name"><%= @frame.name %></h2>
4
- <div class="location"><span class="filename"><a href="<%= editor_url(@frame) %>"><%= @frame.pretty_path %></a></span></div>
3
+ <h2 class="name"><%= frame.name %></h2>
4
+ <div class="location">
5
+ <span class="filename">
6
+ <a
7
+ href="<%= editor_url %>"
8
+ <%= ENV.key?('BETTER_ERRORS_INSIDE_FRAME') ? "target=_blank" : '' %>
9
+ ><%= frame.pretty_path %></a>
10
+ </span>
11
+ </div>
5
12
  </div>
6
13
  <div class="code_block clearfix">
7
- <%== html_formatted_code_block @frame %>
14
+ <%== ErrorPage.html_formatted_code_block frame %>
8
15
  </div>
9
16
 
10
- <% if BetterErrors.binding_of_caller_available? && @frame.frame_binding %>
17
+ <% if BetterErrors.binding_of_caller_available? && frame.frame_binding %>
11
18
  <div class="be-repl">
12
19
  <div class="be-console">
13
20
  <pre></pre>
@@ -17,8 +24,8 @@
17
24
  <% end %>
18
25
  </header>
19
26
 
20
- <% if BetterErrors.binding_of_caller_available? && @frame.frame_binding %>
21
- <div class="hint">
27
+ <% if BetterErrors.binding_of_caller_available? && frame.frame_binding %>
28
+ <div class="hint live-console-hint">
22
29
  This is a live shell. Type in here.
23
30
  </div>
24
31
 
@@ -31,27 +38,28 @@
31
38
  </div>
32
39
  <% end %>
33
40
 
41
+ <%# TODO: move this outside of the frame info. It's not part of the frame. %>
34
42
  <div class="sub">
35
43
  <h3>Request info</h3>
36
44
  <div class='inset variables'>
37
45
  <table class="var_table">
38
46
  <% if rails_params %>
39
- <tr><td class="name">Request parameters</td><td><pre><%== inspect_value rails_params %></pre></td></tr>
47
+ <tr><td class="name">Request parameters</td><td><pre><%== ErrorPage.inspect_value rails_params %></pre></td></tr>
40
48
  <% end %>
41
49
  <% if rack_session %>
42
- <tr><td class="name">Rack session</td><td><pre><%== inspect_value rack_session %></pre></td></tr>
50
+ <tr><td class="name">Rack session</td><td><pre><%== ErrorPage.inspect_value rack_session %></pre></td></tr>
43
51
  <% end %>
44
52
  </table>
45
53
  </div>
46
54
  </div>
47
55
 
48
- <% if BetterErrors.binding_of_caller_available? && @frame.frame_binding %>
56
+ <% if BetterErrors.binding_of_caller_available? && frame.frame_binding %>
49
57
  <div class="sub">
50
58
  <h3>Local Variables</h3>
51
59
  <div class='inset variables'>
52
60
  <table class="var_table">
53
- <% @frame.local_variables.each do |name, value| %>
54
- <tr><td class="name"><%= name %></td><td><pre><%== inspect_value value %></pre></td></tr>
61
+ <% frame.local_variables.each do |name, value| %>
62
+ <tr><td class="name"><%= name %></td><td><pre><%== ErrorPage.inspect_value value %></pre></td></tr>
55
63
  <% end %>
56
64
  </table>
57
65
  </div>
@@ -61,12 +69,14 @@
61
69
  <h3>Instance Variables</h3>
62
70
  <div class="inset variables">
63
71
  <table class="var_table">
64
- <% @frame.instance_variables.each do |name, value| %>
65
- <tr><td class="name"><%= name %></td><td><pre><%== inspect_value value %></pre></td></tr>
72
+ <% frame.instance_variables.each do |name, value| %>
73
+ <tr><td class="name"><%= name %></td><td><pre><%== ErrorPage.inspect_value value %></pre></td></tr>
66
74
  <% end %>
67
75
  </table>
68
76
  </div>
69
77
  </div>
78
+ <% end %>
70
79
 
71
- <!-- <%= Time.now.to_f - @var_start_time %> seconds -->
80
+ <% if start_time %>
81
+ <!-- variable_info took <%= Time.now.to_f - start_time %> seconds -->
72
82
  <% end %>
@@ -1,3 +1,4 @@
1
1
  module BetterErrors
2
- VERSION = "2.6.0"
2
+ # This is changed by CI before building a gem for release, but is not committed.
3
+ VERSION = "2.10.1"
3
4
  end
data/lib/better_errors.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require "pp"
2
2
  require "erubi"
3
- require "coderay"
4
3
  require "uri"
5
4
 
5
+ require "better_errors/version"
6
6
  require "better_errors/code_formatter"
7
7
  require "better_errors/inspectable_value"
8
8
  require "better_errors/error_page"
@@ -10,20 +10,9 @@ require "better_errors/middleware"
10
10
  require "better_errors/raised_exception"
11
11
  require "better_errors/repl"
12
12
  require "better_errors/stack_frame"
13
- require "better_errors/version"
13
+ require "better_errors/editor"
14
14
 
15
15
  module BetterErrors
16
- POSSIBLE_EDITOR_PRESETS = [
17
- { symbols: [:emacs, :emacsclient], sniff: /emacs/i, url: "emacs://open?url=file://%{file}&line=%{line}" },
18
- { symbols: [:macvim, :mvim], sniff: /vim/i, url: proc { |file, line| "mvim://open?url=file://#{file}&line=#{line}" } },
19
- { symbols: [:sublime, :subl, :st], sniff: /subl/i, url: "subl://open?url=file://%{file}&line=%{line}" },
20
- { symbols: [:textmate, :txmt, :tm], sniff: /mate/i, url: "txmt://open?url=file://%{file}&line=%{line}" },
21
- { symbols: [:idea], sniff: /idea/i, url: "idea://open?file=%{file}&line=%{line}" },
22
- { symbols: [:rubymine], sniff: /mine/i, url: "x-mine://open?file=%{file}&line=%{line}" },
23
- { symbols: [:vscode, :code], sniff: /code/i, url: "vscode://file/%{file}:%{line}" },
24
- { symbols: [:atom], sniff: /atom/i, url: "atom://core/open/file?filename=%{file}&line=%{line}" },
25
- ]
26
-
27
16
  class << self
28
17
  # The path to the root of the application. Better Errors uses this property
29
18
  # to determine if a file in a backtrace should be considered an application
@@ -54,21 +43,27 @@ module BetterErrors
54
43
  # the variable won't be returned.
55
44
  # @return int
56
45
  attr_accessor :maximum_variable_inspect_size
46
+
47
+ # List of classes that are excluded from inspection.
48
+ # @return [Array]
49
+ attr_accessor :ignored_classes
57
50
  end
58
51
  @ignored_instance_variables = []
59
52
  @maximum_variable_inspect_size = 100_000
53
+ @ignored_classes = ['ActionDispatch::Request', 'ActionDispatch::Response']
60
54
 
61
- # Returns a proc, which when called with a filename and line number argument,
55
+ # Returns an object which responds to #url, which when called with
56
+ # a filename and line number argument,
62
57
  # returns a URL to open the filename and line in the selected editor.
63
58
  #
64
59
  # Generates TextMate URLs by default.
65
60
  #
66
- # BetterErrors.editor["/some/file", 123]
61
+ # BetterErrors.editor.url("/some/file", 123)
67
62
  # # => txmt://open?url=file:///some/file&line=123
68
63
  #
69
64
  # @return [Proc]
70
65
  def self.editor
71
- @editor
66
+ @editor ||= default_editor
72
67
  end
73
68
 
74
69
  # Configures how Better Errors generates open-in-editor URLs.
@@ -109,20 +104,15 @@ module BetterErrors
109
104
  # @param [Proc] proc
110
105
  #
111
106
  def self.editor=(editor)
112
- POSSIBLE_EDITOR_PRESETS.each do |config|
113
- if config[:symbols].include?(editor)
114
- return self.editor = config[:url]
115
- end
116
- end
117
-
118
- if editor.is_a? String
119
- self.editor = proc { |file, line| editor % { file: URI.encode_www_form_component(file), line: line } }
107
+ if editor.is_a? Symbol
108
+ @editor = Editor.editor_from_symbol(editor)
109
+ raise(ArgumentError, "Symbol #{editor} is not a symbol in the list of supported errors.") unless editor
110
+ elsif editor.is_a? String
111
+ @editor = Editor.for_formatting_string(editor)
112
+ elsif editor.respond_to? :call
113
+ @editor = Editor.for_proc(editor)
120
114
  else
121
- if editor.respond_to? :call
122
- @editor = editor
123
- else
124
- raise TypeError, "Expected editor to be a valid editor key, a format string or a callable."
125
- end
115
+ raise ArgumentError, "Expected editor to be a valid editor key, a format string or a callable."
126
116
  end
127
117
  end
128
118
 
@@ -139,12 +129,8 @@ module BetterErrors
139
129
  #
140
130
  # @return [Symbol]
141
131
  def self.default_editor
142
- POSSIBLE_EDITOR_PRESETS.detect(-> { {} }) { |config|
143
- ENV["EDITOR"] =~ config[:sniff]
144
- }[:url] || :textmate
132
+ Editor.default_editor
145
133
  end
146
-
147
- BetterErrors.editor = default_editor
148
134
  end
149
135
 
150
136
  begin
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_errors
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.10.1
5
5
  platform: ruby
6
6
  authors:
7
- - Charlie Somerville
7
+ - Hailey Somerville
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-25 00:00:00.000000000 Z
11
+ date: 2023-06-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-html-matchers
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'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rspec-its
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sassc
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'
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: kramdown
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -95,7 +123,7 @@ dependencies:
95
123
  - !ruby/object:Gem::Version
96
124
  version: 1.0.0
97
125
  - !ruby/object:Gem::Dependency
98
- name: coderay
126
+ name: rouge
99
127
  requirement: !ruby/object:Gem::Requirement
100
128
  requirements:
101
129
  - - ">="
@@ -126,18 +154,23 @@ description: Provides a better error page for Rails and other Rack apps. Include
126
154
  source code inspection, a live REPL and local/instance variable inspection for all
127
155
  stack frames.
128
156
  email:
129
- - charlie@charliesomerville.com
157
+ - hailey@hailey.lol
130
158
  executables: []
131
159
  extensions: []
132
160
  extra_rdoc_files: []
133
161
  files:
134
162
  - ".coveralls.yml"
163
+ - ".github/release-drafter.yml"
164
+ - ".github/workflows/ci.yml"
165
+ - ".github/workflows/draft_release_update.yml"
166
+ - ".github/workflows/pull_request.yml"
167
+ - ".github/workflows/release.yml"
135
168
  - ".gitignore"
136
- - ".travis.yml"
169
+ - ".ruby-version"
137
170
  - ".yardopts"
138
171
  - CHANGELOG.md
139
172
  - Gemfile
140
- - LICENSE.txt
173
+ - LICENSE
141
174
  - README.md
142
175
  - better_errors.gemspec
143
176
  - gemfiles/pry010.gemfile
@@ -157,12 +190,21 @@ files:
157
190
  - gemfiles/rails52.gemfile
158
191
  - gemfiles/rails52_boc.gemfile
159
192
  - gemfiles/rails52_haml.gemfile
193
+ - gemfiles/rails60.gemfile
194
+ - gemfiles/rails60_boc.gemfile
195
+ - gemfiles/rails60_haml.gemfile
196
+ - gemfiles/rails61.gemfile
197
+ - gemfiles/rails61_boc.gemfile
198
+ - gemfiles/rails61_haml.gemfile
160
199
  - lib/better_errors.rb
161
200
  - lib/better_errors/code_formatter.rb
162
201
  - lib/better_errors/code_formatter/html.rb
163
202
  - lib/better_errors/code_formatter/text.rb
203
+ - lib/better_errors/editor.rb
164
204
  - lib/better_errors/error_page.rb
205
+ - lib/better_errors/error_page_style.rb
165
206
  - lib/better_errors/exception_extension.rb
207
+ - lib/better_errors/exception_hint.rb
166
208
  - lib/better_errors/inspectable_value.rb
167
209
  - lib/better_errors/middleware.rb
168
210
  - lib/better_errors/rails.rb
@@ -171,6 +213,7 @@ files:
171
213
  - lib/better_errors/repl/basic.rb
172
214
  - lib/better_errors/repl/pry.rb
173
215
  - lib/better_errors/stack_frame.rb
216
+ - lib/better_errors/templates/main.css
174
217
  - lib/better_errors/templates/main.erb
175
218
  - lib/better_errors/templates/text.erb
176
219
  - lib/better_errors/templates/variable_info.erb
@@ -197,7 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
240
  - !ruby/object:Gem::Version
198
241
  version: '0'
199
242
  requirements: []
200
- rubygems_version: 3.0.3
243
+ rubygems_version: 3.1.6
201
244
  signing_key:
202
245
  specification_version: 4
203
246
  summary: Better error page for Rails and other Rack apps
data/.travis.yml DELETED
@@ -1,58 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- cache: bundler
4
- notifications:
5
- webhooks:
6
- # With COVERALLS_PARALLEL, coverage information sent to coveralls will not be processed until
7
- # this webhook is sent.
8
- # https://coveralls.zendesk.com/hc/en-us/articles/203484329-Parallel-Build-Webhook
9
- - secure: "YnHYbTq51ySistjvOxsuNhyg4GLuUffEJstTYeGYXiBF7HG5h43IVYo8KNuLzwkgsOYBcNo+YMdQX7qCqJffSbhsr1FZRSzBmjFFxcyD4hu+ukM2theZ4mePVAZiePscYvQPRNY4hIb4d3egStJEytkalDhB3sOebF57tIaCssg="
10
- rvm:
11
- - 2.2.10
12
- - 2.3.8
13
- - 2.4.9
14
- - 2.5.7
15
- - ruby-head
16
- gemfile:
17
- - gemfiles/rails42.gemfile
18
- - gemfiles/rails50.gemfile
19
- - gemfiles/rails51.gemfile
20
- - gemfiles/rails52.gemfile
21
- - gemfiles/rails42_haml.gemfile
22
- - gemfiles/rails50_haml.gemfile
23
- - gemfiles/rails51_haml.gemfile
24
- - gemfiles/rails52_haml.gemfile
25
- - gemfiles/rails42_boc.gemfile
26
- - gemfiles/rails50_boc.gemfile
27
- - gemfiles/rails51_boc.gemfile
28
- - gemfiles/rails52_boc.gemfile
29
- - gemfiles/rack.gemfile
30
- - gemfiles/rack_boc.gemfile
31
- - gemfiles/pry09.gemfile
32
- - gemfiles/pry010.gemfile
33
- - gemfiles/pry011.gemfile
34
- matrix:
35
- fast_finish: true
36
- allow_failures:
37
- - rvm: ruby-head
38
- - gemfile: gemfiles/pry010.gemfile
39
- - gemfile: gemfiles/pry011.gemfile
40
- exclude:
41
- - rvm: 2.3.8
42
- gemfile: gemfiles/rails42.gemfile
43
- - rvm: 2.3.8
44
- gemfile: gemfiles/rails42_boc.gemfile
45
- - rvm: 2.3.8
46
- gemfile: gemfiles/rails42_haml.gemfile
47
- - rvm: 2.4.9
48
- gemfile: gemfiles/rails42.gemfile
49
- - rvm: 2.4.9
50
- gemfile: gemfiles/rails42_boc.gemfile
51
- - rvm: 2.4.9
52
- gemfile: gemfiles/rails42_haml.gemfile
53
- - rvm: 2.5.7
54
- gemfile: gemfiles/rails42.gemfile
55
- - rvm: 2.5.7
56
- gemfile: gemfiles/rails42_boc.gemfile
57
- - rvm: 2.5.7
58
- gemfile: gemfiles/rails42_haml.gemfile