better_errors 2.9.1 → 2.10.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +12 -0
- data/gemfiles/rails61.gemfile +8 -0
- data/gemfiles/rails61_boc.gemfile +9 -0
- data/gemfiles/rails61_haml.gemfile +9 -0
- data/lib/better_errors/editor.rb +4 -0
- data/lib/better_errors/error_page.rb +25 -13
- data/lib/better_errors/middleware.rb +19 -3
- data/lib/better_errors/templates/main.erb +74 -13
- data/lib/better_errors/templates/text.erb +1 -1
- data/lib/better_errors/templates/variable_info.erb +17 -14
- data/lib/better_errors/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ae6237f9bcc8bc7bea85082f32a5dff2dfd4ad519f9b5cb23602801c27f3a10
|
4
|
+
data.tar.gz: e74a98ed16de6ce6d2862fe55f7094b1608250bbf51ac98b52e4f558f328dfab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53944fa785d9f6dd22bc07db577f6b3a4bfd3b30f4ea87eabcd492358545c629eefb401b0b86936ab87da2b39587f26e85ef99232e18fd6df54d5c6ea8e0f489
|
7
|
+
data.tar.gz: 186f51a6e6146153fbd8a9ebaa419be6db36dce42b52ecaa50ecd48525b2a4181ab0aed0f87b6608d2b9ca67d3f736c44857c6ba8c4a142ca7be022da762531e
|
data/.github/workflows/ci.yml
CHANGED
@@ -31,16 +31,19 @@ jobs:
|
|
31
31
|
- rails51
|
32
32
|
- rails52
|
33
33
|
- rails60
|
34
|
+
- rails61
|
34
35
|
- rails42_haml
|
35
36
|
- rails50_haml
|
36
37
|
- rails51_haml
|
37
38
|
- rails52_haml
|
38
39
|
- rails60_haml
|
40
|
+
- rails61_haml
|
39
41
|
- rails42_boc
|
40
42
|
- rails50_boc
|
41
43
|
- rails51_boc
|
42
44
|
- rails52_boc
|
43
45
|
- rails60_boc
|
46
|
+
- rails61_boc
|
44
47
|
- rack
|
45
48
|
- rack_boc
|
46
49
|
# - pry09
|
@@ -50,18 +53,27 @@ jobs:
|
|
50
53
|
- { ruby: 2.2, gemfile: rails60 }
|
51
54
|
- { ruby: 2.2, gemfile: rails60_boc }
|
52
55
|
- { ruby: 2.2, gemfile: rails60_haml }
|
56
|
+
- { ruby: 2.2, gemfile: rails61 }
|
57
|
+
- { ruby: 2.2, gemfile: rails61_boc }
|
58
|
+
- { ruby: 2.2, gemfile: rails61_haml }
|
53
59
|
- { ruby: 2.3, gemfile: rails42 }
|
54
60
|
- { ruby: 2.3, gemfile: rails42_boc }
|
55
61
|
- { ruby: 2.3, gemfile: rails42_haml }
|
56
62
|
- { ruby: 2.3, gemfile: rails60 }
|
57
63
|
- { ruby: 2.3, gemfile: rails60_boc }
|
58
64
|
- { ruby: 2.3, gemfile: rails60_haml }
|
65
|
+
- { ruby: 2.3, gemfile: rails61 }
|
66
|
+
- { ruby: 2.3, gemfile: rails61_boc }
|
67
|
+
- { ruby: 2.3, gemfile: rails61_haml }
|
59
68
|
- { ruby: 2.4, gemfile: rails42 }
|
60
69
|
- { ruby: 2.4, gemfile: rails42_boc }
|
61
70
|
- { ruby: 2.4, gemfile: rails42_haml }
|
62
71
|
- { ruby: 2.4, gemfile: rails60 }
|
63
72
|
- { ruby: 2.4, gemfile: rails60_boc }
|
64
73
|
- { ruby: 2.4, gemfile: rails60_haml }
|
74
|
+
- { ruby: 2.4, gemfile: rails61 }
|
75
|
+
- { ruby: 2.4, gemfile: rails61_boc }
|
76
|
+
- { ruby: 2.4, gemfile: rails61_haml }
|
65
77
|
- { ruby: 2.5, gemfile: rails42 }
|
66
78
|
- { ruby: 2.5, gemfile: rails42_boc }
|
67
79
|
- { ruby: 2.5, gemfile: rails42_haml }
|
data/lib/better_errors/editor.rb
CHANGED
@@ -5,6 +5,8 @@ require "securerandom"
|
|
5
5
|
module BetterErrors
|
6
6
|
# @private
|
7
7
|
class ErrorPage
|
8
|
+
VariableInfo = Struct.new(:frame, :editor_url, :rails_params, :rack_session, :start_time)
|
9
|
+
|
8
10
|
def self.template_path(template_name)
|
9
11
|
File.expand_path("../templates/#{template_name}.erb", __FILE__)
|
10
12
|
end
|
@@ -13,6 +15,15 @@ module BetterErrors
|
|
13
15
|
Erubi::Engine.new(File.read(template_path(template_name)), escape: true)
|
14
16
|
end
|
15
17
|
|
18
|
+
def self.render_template(template_name, locals)
|
19
|
+
locals.send(:eval, self.template(template_name).src)
|
20
|
+
rescue => e
|
21
|
+
# Fix the backtrace, which doesn't identify the template that failed (within Better Errors).
|
22
|
+
# We don't know the line number, so just injecting the template path has to be enough.
|
23
|
+
e.backtrace.unshift "#{self.template_path(template_name)}:0"
|
24
|
+
raise
|
25
|
+
end
|
26
|
+
|
16
27
|
attr_reader :exception, :env, :repls
|
17
28
|
|
18
29
|
def initialize(exception, env)
|
@@ -26,20 +37,21 @@ module BetterErrors
|
|
26
37
|
@id ||= SecureRandom.hex(8)
|
27
38
|
end
|
28
39
|
|
29
|
-
def
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
40
|
+
def render_main(csrf_token, csp_nonce)
|
41
|
+
frame = backtrace_frames[0]
|
42
|
+
first_frame_variable_info = VariableInfo.new(frame, editor_url(frame), rails_params, rack_session, Time.now.to_f)
|
43
|
+
self.class.render_template('main', binding)
|
44
|
+
end
|
45
|
+
|
46
|
+
def render_text
|
47
|
+
self.class.render_template('text', binding)
|
36
48
|
end
|
37
49
|
|
38
50
|
def do_variables(opts)
|
39
51
|
index = opts["index"].to_i
|
40
|
-
|
41
|
-
|
42
|
-
{ html:
|
52
|
+
frame = backtrace_frames[index]
|
53
|
+
variable_info = VariableInfo.new(frame, editor_url(frame), rails_params, rack_session, Time.now.to_f)
|
54
|
+
{ html: self.class.render_template("variable_info", variable_info) }
|
43
55
|
end
|
44
56
|
|
45
57
|
def do_eval(opts)
|
@@ -113,11 +125,11 @@ module BetterErrors
|
|
113
125
|
env["PATH_INFO"]
|
114
126
|
end
|
115
127
|
|
116
|
-
def html_formatted_code_block(frame)
|
128
|
+
def self.html_formatted_code_block(frame)
|
117
129
|
CodeFormatter::HTML.new(frame.filename, frame.line).output
|
118
130
|
end
|
119
131
|
|
120
|
-
def text_formatted_code_block(frame)
|
132
|
+
def self.text_formatted_code_block(frame)
|
121
133
|
CodeFormatter::Text.new(frame.filename, frame.line).output
|
122
134
|
end
|
123
135
|
|
@@ -125,7 +137,7 @@ module BetterErrors
|
|
125
137
|
str + "\n" + char*str.size
|
126
138
|
end
|
127
139
|
|
128
|
-
def inspect_value(obj)
|
140
|
+
def self.inspect_value(obj)
|
129
141
|
if BetterErrors.ignored_classes.include? obj.class.name
|
130
142
|
"<span class='unsupported'>(Instance of ignored class. "\
|
131
143
|
"#{obj.class.name ? "Remove #{CGI.escapeHTML(obj.class.name)} from" : "Modify"}"\
|
@@ -94,12 +94,13 @@ module BetterErrors
|
|
94
94
|
def show_error_page(env, exception=nil)
|
95
95
|
request = Rack::Request.new(env)
|
96
96
|
csrf_token = request.cookies[CSRF_TOKEN_COOKIE_NAME] || SecureRandom.uuid
|
97
|
+
csp_nonce = SecureRandom.base64(12)
|
97
98
|
|
98
99
|
type, content = if @error_page
|
99
100
|
if text?(env)
|
100
|
-
[ 'plain', @error_page.
|
101
|
+
[ 'plain', @error_page.render_text ]
|
101
102
|
else
|
102
|
-
[ 'html', @error_page.
|
103
|
+
[ 'html', @error_page.render_main(csrf_token, csp_nonce) ]
|
103
104
|
end
|
104
105
|
else
|
105
106
|
[ 'html', no_errors_page ]
|
@@ -110,7 +111,22 @@ module BetterErrors
|
|
110
111
|
status_code = ActionDispatch::ExceptionWrapper.new(env, exception).status_code
|
111
112
|
end
|
112
113
|
|
113
|
-
|
114
|
+
headers = {
|
115
|
+
"Content-Type" => "text/#{type}; charset=utf-8",
|
116
|
+
"Content-Security-Policy" => [
|
117
|
+
"default-src 'none'",
|
118
|
+
# Specifying nonce makes a modern browser ignore 'unsafe-inline' which could still be set
|
119
|
+
# for older browsers without nonce support.
|
120
|
+
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
|
121
|
+
"script-src 'self' 'nonce-#{csp_nonce}' 'unsafe-inline'",
|
122
|
+
# Inline style is required by the syntax highlighter.
|
123
|
+
"style-src 'self' 'unsafe-inline'",
|
124
|
+
"connect-src 'self'",
|
125
|
+
"navigate-to 'self' #{BetterErrors.editor.scheme}",
|
126
|
+
].join('; '),
|
127
|
+
}
|
128
|
+
|
129
|
+
response = Rack::Response.new(content, status_code, headers)
|
114
130
|
|
115
131
|
unless request.cookies[CSRF_TOKEN_COOKIE_NAME]
|
116
132
|
response.set_cookie(CSRF_TOKEN_COOKIE_NAME, value: csrf_token, path: "/", httponly: true, same_site: :strict)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
<head>
|
4
4
|
<title><%= exception_type %> at <%= request_path %></title>
|
5
5
|
</head>
|
6
|
-
<body>
|
6
|
+
<body class="better-errors-javascript-not-loaded">
|
7
7
|
<%# Stylesheets are placed in the <body> for Turbolinks compatibility. %>
|
8
8
|
<style>
|
9
9
|
/* Basic reset */
|
@@ -107,6 +107,8 @@
|
|
107
107
|
}
|
108
108
|
|
109
109
|
.frame_info {
|
110
|
+
display: none;
|
111
|
+
|
110
112
|
right: 0;
|
111
113
|
left: 40%;
|
112
114
|
|
@@ -114,6 +116,9 @@
|
|
114
116
|
padding-left: 10px;
|
115
117
|
margin-left: 30px;
|
116
118
|
}
|
119
|
+
.frame_info.current {
|
120
|
+
display: block;
|
121
|
+
}
|
117
122
|
}
|
118
123
|
|
119
124
|
nav.sidebar {
|
@@ -227,6 +232,10 @@
|
|
227
232
|
* Navigation
|
228
233
|
* --------------------------------------------------------------------- */
|
229
234
|
|
235
|
+
.better-errors-javascript-not-loaded .backtrace .tabs {
|
236
|
+
display: none;
|
237
|
+
}
|
238
|
+
|
230
239
|
nav.tabs {
|
231
240
|
border-bottom: solid 1px #ddd;
|
232
241
|
|
@@ -411,6 +420,18 @@
|
|
411
420
|
* Display area
|
412
421
|
* --------------------------------------------------------------------- */
|
413
422
|
|
423
|
+
p.no-javascript-notice {
|
424
|
+
margin-bottom: 1em;
|
425
|
+
padding: 1em;
|
426
|
+
border: 2px solid #e00;
|
427
|
+
}
|
428
|
+
.better-errors-javascript-loaded .no-javascript-notice {
|
429
|
+
display: none;
|
430
|
+
}
|
431
|
+
.no-inline-style-notice {
|
432
|
+
display: none;
|
433
|
+
}
|
434
|
+
|
414
435
|
.trace_info {
|
415
436
|
background: #fff;
|
416
437
|
padding: 6px;
|
@@ -468,6 +489,10 @@
|
|
468
489
|
font-weight: 200;
|
469
490
|
}
|
470
491
|
|
492
|
+
.better-errors-javascript-not-loaded .be-repl {
|
493
|
+
display: none;
|
494
|
+
}
|
495
|
+
|
471
496
|
.code, .be-console, .unavailable {
|
472
497
|
background: #fff;
|
473
498
|
padding: 5px;
|
@@ -598,6 +623,9 @@
|
|
598
623
|
.console-has-been-used .live-console-hint {
|
599
624
|
display: none;
|
600
625
|
}
|
626
|
+
.better-errors-javascript-not-loaded .live-console-hint {
|
627
|
+
display: none;
|
628
|
+
}
|
601
629
|
|
602
630
|
.hint:before {
|
603
631
|
content: '\25b2';
|
@@ -701,7 +729,7 @@
|
|
701
729
|
</style>
|
702
730
|
|
703
731
|
<%# IE8 compatibility crap %>
|
704
|
-
<script>
|
732
|
+
<script nonce="<%= csp_nonce %>">
|
705
733
|
(function() {
|
706
734
|
var elements = ["section", "nav", "header", "footer", "audio"];
|
707
735
|
for (var i = 0; i < elements.length; i++) {
|
@@ -715,7 +743,7 @@
|
|
715
743
|
rendered in the host app's layout. Let's empty out the styles of the
|
716
744
|
host app.
|
717
745
|
%>
|
718
|
-
<script>
|
746
|
+
<script nonce="<%= csp_nonce %>">
|
719
747
|
if (window.Turbolinks) {
|
720
748
|
for(var i=0; i < document.styleSheets.length; i++) {
|
721
749
|
if(document.styleSheets[i].href)
|
@@ -740,6 +768,15 @@
|
|
740
768
|
}
|
741
769
|
</script>
|
742
770
|
|
771
|
+
<p class='no-inline-style-notice'>
|
772
|
+
<strong>
|
773
|
+
Better Errors can't apply inline style<span class='no-javascript-notice'> (or run Javascript)</span>,
|
774
|
+
possibly because you have a Content Security Policy along with Turbolinks.
|
775
|
+
But you can
|
776
|
+
<a href='/__better_errors' target="_blank">open the interactive console in a new tab/window</a>.
|
777
|
+
</strong>
|
778
|
+
</p>
|
779
|
+
|
743
780
|
<div class='top'>
|
744
781
|
<header class="exception">
|
745
782
|
<h2><strong><%= exception_type %></strong> <span>at <%= request_path %></span></h2>
|
@@ -786,21 +823,37 @@
|
|
786
823
|
</ul>
|
787
824
|
</nav>
|
788
825
|
|
789
|
-
|
790
|
-
<div class="frame_info
|
791
|
-
|
826
|
+
<div class="frameInfos">
|
827
|
+
<div class="frame_info current" data-frame-idx="0">
|
828
|
+
<p class='no-javascript-notice'>
|
829
|
+
Better Errors can't run Javascript here<span class='no-inline-style-notice'> (or apply inline style)</span>,
|
830
|
+
possibly because you have a Content Security Policy along with Turbolinks.
|
831
|
+
But you can
|
832
|
+
<a href='/__better_errors' target="_blank">open the interactive console in a new tab/window</a>.
|
833
|
+
</p>
|
834
|
+
<!-- this is enough information to show something in case JS doesn't get to load -->
|
835
|
+
<%== ErrorPage.render_template('variable_info', first_frame_variable_info) %>
|
836
|
+
</div>
|
837
|
+
</div>
|
792
838
|
</section>
|
793
839
|
</body>
|
794
|
-
<script>
|
840
|
+
<script nonce="<%= csp_nonce %>">
|
795
841
|
(function() {
|
796
842
|
|
797
843
|
var OID = "<%= id %>";
|
798
844
|
var csrfToken = "<%= csrf_token %>";
|
799
845
|
|
800
846
|
var previousFrame = null;
|
801
|
-
var previousFrameInfo = null;
|
802
847
|
var allFrames = document.querySelectorAll("ul.frames li");
|
803
|
-
var
|
848
|
+
var frameInfos = document.querySelector(".frameInfos");
|
849
|
+
|
850
|
+
document.querySelector('body').classList.remove("better-errors-javascript-not-loaded");
|
851
|
+
document.querySelector('body').classList.add("better-errors-javascript-loaded");
|
852
|
+
|
853
|
+
var noJSNotices = document.querySelectorAll('.no-javascript-notice');
|
854
|
+
for(var i = 0; i < noJSNotices.length; i++) {
|
855
|
+
noJSNotices[i].remove();
|
856
|
+
}
|
804
857
|
|
805
858
|
function apiCall(method, opts, cb) {
|
806
859
|
var req = new XMLHttpRequest();
|
@@ -974,17 +1027,25 @@
|
|
974
1027
|
};
|
975
1028
|
|
976
1029
|
function switchTo(el) {
|
977
|
-
|
978
|
-
|
1030
|
+
var currentFrameInfo = document.querySelectorAll('.frame_info.current');
|
1031
|
+
for(var i = 0; i < currentFrameInfo.length; i++) {
|
1032
|
+
currentFrameInfo[i].className = "frame_info";
|
1033
|
+
}
|
979
1034
|
|
980
|
-
el.
|
1035
|
+
el.className = "frame_info current";
|
981
1036
|
|
982
1037
|
var replInput = el.querySelector('.be-console input');
|
983
1038
|
if (replInput) replInput.focus();
|
984
1039
|
}
|
985
1040
|
|
986
1041
|
function selectFrameInfo(index) {
|
987
|
-
var el =
|
1042
|
+
var el = document.querySelector(".frame_info[data-frame-idx='" + index + "']")
|
1043
|
+
if (!el) {
|
1044
|
+
el = document.createElement("div");
|
1045
|
+
el.className = "frame_info";
|
1046
|
+
el.setAttribute('data-frame-idx', index);
|
1047
|
+
frameInfos.appendChild(el);
|
1048
|
+
}
|
988
1049
|
if(el) {
|
989
1050
|
if (el.loaded) {
|
990
1051
|
return switchTo(el);
|
@@ -1,20 +1,20 @@
|
|
1
1
|
<header class="trace_info clearfix">
|
2
2
|
<div class="title">
|
3
|
-
<h2 class="name"><%=
|
3
|
+
<h2 class="name"><%= frame.name %></h2>
|
4
4
|
<div class="location">
|
5
5
|
<span class="filename">
|
6
6
|
<a
|
7
|
-
href="<%= editor_url
|
7
|
+
href="<%= editor_url %>"
|
8
8
|
<%= ENV.key?('BETTER_ERRORS_INSIDE_FRAME') ? "target=_blank" : '' %>
|
9
|
-
><%=
|
9
|
+
><%= frame.pretty_path %></a>
|
10
10
|
</span>
|
11
11
|
</div>
|
12
12
|
</div>
|
13
13
|
<div class="code_block clearfix">
|
14
|
-
<%== html_formatted_code_block
|
14
|
+
<%== ErrorPage.html_formatted_code_block frame %>
|
15
15
|
</div>
|
16
16
|
|
17
|
-
<% if BetterErrors.binding_of_caller_available? &&
|
17
|
+
<% if BetterErrors.binding_of_caller_available? && frame.frame_binding %>
|
18
18
|
<div class="be-repl">
|
19
19
|
<div class="be-console">
|
20
20
|
<pre></pre>
|
@@ -24,7 +24,7 @@
|
|
24
24
|
<% end %>
|
25
25
|
</header>
|
26
26
|
|
27
|
-
<% if BetterErrors.binding_of_caller_available? &&
|
27
|
+
<% if BetterErrors.binding_of_caller_available? && frame.frame_binding %>
|
28
28
|
<div class="hint live-console-hint">
|
29
29
|
This is a live shell. Type in here.
|
30
30
|
</div>
|
@@ -38,27 +38,28 @@
|
|
38
38
|
</div>
|
39
39
|
<% end %>
|
40
40
|
|
41
|
+
<%# TODO: move this outside of the frame info. It's not part of the frame. %>
|
41
42
|
<div class="sub">
|
42
43
|
<h3>Request info</h3>
|
43
44
|
<div class='inset variables'>
|
44
45
|
<table class="var_table">
|
45
46
|
<% if rails_params %>
|
46
|
-
<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>
|
47
48
|
<% end %>
|
48
49
|
<% if rack_session %>
|
49
|
-
<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>
|
50
51
|
<% end %>
|
51
52
|
</table>
|
52
53
|
</div>
|
53
54
|
</div>
|
54
55
|
|
55
|
-
<% if BetterErrors.binding_of_caller_available? &&
|
56
|
+
<% if BetterErrors.binding_of_caller_available? && frame.frame_binding %>
|
56
57
|
<div class="sub">
|
57
58
|
<h3>Local Variables</h3>
|
58
59
|
<div class='inset variables'>
|
59
60
|
<table class="var_table">
|
60
|
-
<%
|
61
|
-
<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>
|
62
63
|
<% end %>
|
63
64
|
</table>
|
64
65
|
</div>
|
@@ -68,12 +69,14 @@
|
|
68
69
|
<h3>Instance Variables</h3>
|
69
70
|
<div class="inset variables">
|
70
71
|
<table class="var_table">
|
71
|
-
<%
|
72
|
-
<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>
|
73
74
|
<% end %>
|
74
75
|
</table>
|
75
76
|
</div>
|
76
77
|
</div>
|
78
|
+
<% end %>
|
77
79
|
|
78
|
-
|
80
|
+
<% if start_time %>
|
81
|
+
<!-- variable_info took <%= Time.now.to_f - start_time %> seconds -->
|
79
82
|
<% end %>
|
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.
|
4
|
+
version: 2.10.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Charlie Somerville
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-11
|
11
|
+
date: 2020-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -176,6 +176,9 @@ files:
|
|
176
176
|
- gemfiles/rails60.gemfile
|
177
177
|
- gemfiles/rails60_boc.gemfile
|
178
178
|
- gemfiles/rails60_haml.gemfile
|
179
|
+
- gemfiles/rails61.gemfile
|
180
|
+
- gemfiles/rails61_boc.gemfile
|
181
|
+
- gemfiles/rails61_haml.gemfile
|
179
182
|
- lib/better_errors.rb
|
180
183
|
- lib/better_errors/code_formatter.rb
|
181
184
|
- lib/better_errors/code_formatter/html.rb
|
@@ -214,9 +217,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
214
217
|
version: 2.0.0
|
215
218
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
216
219
|
requirements:
|
217
|
-
- - "
|
220
|
+
- - ">"
|
218
221
|
- !ruby/object:Gem::Version
|
219
|
-
version:
|
222
|
+
version: 1.3.1
|
220
223
|
requirements: []
|
221
224
|
rubygems_version: 3.1.4
|
222
225
|
signing_key:
|