enhanced_errors 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardoc/checksums +2 -2
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/README.md +3 -3
- data/doc/Binding.html +1 -1
- data/doc/Colors.html +1 -1
- data/doc/Debugging.html +1 -1
- data/doc/EnhancedErrors.html +58 -52
- data/doc/ErrorEnhancements.html +2 -2
- data/doc/_index.html +1 -1
- data/doc/file.README.html +23 -53
- data/doc/index.html +23 -53
- data/doc/top-level-namespace.html +1 -1
- data/enhanced_errors.gemspec +1 -1
- data/examples/division_by_zero_example.rb +18 -0
- data/lib/enhanced_errors.rb +48 -11
- data/lib/error_enhancements.rb +4 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62b2a3fc44ab649a8a20dafe2f144b73047a1d1cd63f9ed539d79b3ce912cf93
|
4
|
+
data.tar.gz: 7b1af394f468c3ab240f20b61b4275384b2e1b16ffdd9296d7f0480cefcd17d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a290300d7c90b09b6551daff97c945ba6b5f523760fee3950c6e7cf45665ba61665619156a32a5841861f1405a1454dbf1bcae8e07de7bc0a26b71d3b7f3a7bf
|
7
|
+
data.tar.gz: 4e3156d2e01bef30ce0a4c467382625eae7a93b4cb3b4ed8cfc103c7dd112514eb0865ad42bead9b068248682e19d5c7c43143e5495036937824860d9a004a7f
|
data/.yardoc/checksums
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
lib/colors.rb a4314ef9531d4713907c3fea22955c943fdb8cf3
|
2
2
|
lib/binding.rb fdd7d5a2dd2edde22e3b10773510738dcdce4aeb
|
3
|
-
lib/enhanced_errors.rb
|
4
|
-
lib/error_enhancements.rb
|
3
|
+
lib/enhanced_errors.rb 5c7cd4a2a693b60bd34a0952e411db3578a1e72f
|
4
|
+
lib/error_enhancements.rb d173fd391911b83485277f5c4a8b80c4e1178d36
|
data/.yardoc/object_types
CHANGED
Binary file
|
data/.yardoc/objects/root.dat
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -202,7 +202,7 @@ it yields out a hash with the structure below. Modify it as needed and return th
|
|
202
202
|
globals: globals
|
203
203
|
},
|
204
204
|
exception: exception.class.name,
|
205
|
-
|
205
|
+
capture_event: capture_event # 'raise' or 'rescue'
|
206
206
|
}
|
207
207
|
```
|
208
208
|
|
@@ -316,7 +316,7 @@ When an exception is raised or rescued, it captures:
|
|
316
316
|
- **Let Variables**: RSpec let variables, if applicable. Only memoized (evaluated) let variables are captured.
|
317
317
|
- **Global Variables**: Global variables, in debug mode.
|
318
318
|
|
319
|
-
The captured data includes a `
|
319
|
+
The captured data includes a `capture_event` field indicating whether the data was captured during a `raise` or `rescue` event. By default, EnhancedErrors returns the first `raise` and the last `rescue` event for each exception, providing a clear trace of the exception lifecycle.
|
320
320
|
|
321
321
|
The captured data is then appended to the exception's message, providing rich context for debugging.
|
322
322
|
|
@@ -337,7 +337,7 @@ gem 'awesome_print'
|
|
337
337
|
## Performance Considerations
|
338
338
|
|
339
339
|
- **Minimal Overhead**: Since TracePoint is only activated during exception raising and rescuing, the performance impact is negligible during normal operation.
|
340
|
-
- **Production Safe**: The gem is designed to be safe for production use, giving you valuable insights without compromising performance.
|
340
|
+
- **Production Safe**: The gem is designed to be safe for production use, giving you valuable insights without compromising performance. Although this is the case, I'd still suggest letting it get well-vetted before making the leap.
|
341
341
|
|
342
342
|
## Contributing
|
343
343
|
|
data/doc/Binding.html
CHANGED
@@ -127,7 +127,7 @@
|
|
127
127
|
</div>
|
128
128
|
|
129
129
|
<div id="footer">
|
130
|
-
Generated on
|
130
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
131
131
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
132
132
|
0.9.37 (ruby-3.1.3).
|
133
133
|
</div>
|
data/doc/Colors.html
CHANGED
@@ -374,7 +374,7 @@
|
|
374
374
|
</div>
|
375
375
|
|
376
376
|
<div id="footer">
|
377
|
-
Generated on
|
377
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
378
378
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
379
379
|
0.9.37 (ruby-3.1.3).
|
380
380
|
</div>
|
data/doc/Debugging.html
CHANGED
@@ -171,7 +171,7 @@
|
|
171
171
|
</div>
|
172
172
|
|
173
173
|
<div id="footer">
|
174
|
-
Generated on
|
174
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
175
175
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
176
176
|
0.9.37 (ruby-3.1.3).
|
177
177
|
</div>
|
data/doc/EnhancedErrors.html
CHANGED
@@ -618,7 +618,7 @@
|
|
618
618
|
<li class="public ">
|
619
619
|
<span class="summary_signature">
|
620
620
|
|
621
|
-
<a href="#enhance!-class_method" title="enhance! (class method)">.<strong>enhance!</strong>(enabled: true, debug: false, **options) {|void| ... } ⇒ void </a>
|
621
|
+
<a href="#enhance!-class_method" title="enhance! (class method)">.<strong>enhance!</strong>(enabled: true, debug: false, capture_events: default_capture_events, **options) {|void| ... } ⇒ void </a>
|
622
622
|
|
623
623
|
|
624
624
|
|
@@ -1520,18 +1520,18 @@
|
|
1520
1520
|
<pre class="lines">
|
1521
1521
|
|
1522
1522
|
|
1523
|
-
311
|
1524
|
-
312
|
1525
1523
|
313
|
1526
1524
|
314
|
1527
1525
|
315
|
1528
1526
|
316
|
1529
1527
|
317
|
1530
1528
|
318
|
1531
|
-
319
|
1529
|
+
319
|
1530
|
+
320
|
1531
|
+
321</pre>
|
1532
1532
|
</td>
|
1533
1533
|
<td>
|
1534
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
1534
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 313</span>
|
1535
1535
|
|
1536
1536
|
<span class='kw'>def</span> <span class='id identifier rubyid_apply_skip_list'>apply_skip_list</span><span class='lparen'>(</span><span class='id identifier rubyid_binding_info'>binding_info</span><span class='rparen'>)</span>
|
1537
1537
|
<span class='kw'>unless</span> <span class='ivar'>@debug</span>
|
@@ -1611,8 +1611,6 @@
|
|
1611
1611
|
<pre class="lines">
|
1612
1612
|
|
1613
1613
|
|
1614
|
-
337
|
1615
|
-
338
|
1616
1614
|
339
|
1617
1615
|
340
|
1618
1616
|
341
|
@@ -1641,13 +1639,17 @@
|
|
1641
1639
|
364
|
1642
1640
|
365
|
1643
1641
|
366
|
1644
|
-
367
|
1642
|
+
367
|
1643
|
+
368
|
1644
|
+
369
|
1645
|
+
370</pre>
|
1645
1646
|
</td>
|
1646
1647
|
<td>
|
1647
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
1648
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 339</span>
|
1648
1649
|
|
1649
1650
|
<span class='kw'>def</span> <span class='id identifier rubyid_binding_info_string'>binding_info_string</span><span class='lparen'>(</span><span class='id identifier rubyid_binding_info'>binding_info</span><span class='rparen'>)</span>
|
1650
|
-
<span class='id identifier
|
1651
|
+
<span class='id identifier rubyid_capture_event'>capture_event</span> <span class='op'>=</span> <span class='id identifier rubyid_binding_info'>binding_info</span><span class='lbracket'>[</span><span class='symbol'>:capture_event</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_capitalize'>capitalize</span>
|
1652
|
+
<span class='id identifier rubyid_result'>result</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="Colors.html" title="Colors (class)">Colors</a></span></span><span class='period'>.</span><span class='id identifier rubyid_red'>red</span><span class='lparen'>(</span><span class='id identifier rubyid_capture_event'>capture_event</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>: </span><span class='embexpr_beg'>#{</span><span class='const'><span class='object_link'><a href="Colors.html" title="Colors (class)">Colors</a></span></span><span class='period'>.</span><span class='id identifier rubyid_blue'>blue</span><span class='lparen'>(</span><span class='id identifier rubyid_binding_info'>binding_info</span><span class='lbracket'>[</span><span class='symbol'>:source</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span>
|
1651
1653
|
|
1652
1654
|
<span class='id identifier rubyid_result'>result</span> <span class='op'>+=</span> <span class='id identifier rubyid_method_and_args_desc'>method_and_args_desc</span><span class='lparen'>(</span><span class='id identifier rubyid_binding_info'>binding_info</span><span class='lbracket'>[</span><span class='symbol'>:method_and_args</span><span class='rbracket'>]</span><span class='rparen'>)</span>
|
1653
1655
|
|
@@ -1675,7 +1677,7 @@
|
|
1675
1677
|
<span class='kw'>if</span> <span class='id identifier rubyid_result'>result</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>></span> <span class='id identifier rubyid_max_length'>max_length</span>
|
1676
1678
|
<span class='id identifier rubyid_result'>result</span> <span class='op'>=</span> <span class='id identifier rubyid_result'>result</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>...</span><span class='id identifier rubyid_max_length'>max_length</span><span class='rbracket'>]</span> <span class='op'>+</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>... (truncated)</span><span class='tstring_end'>"</span></span>
|
1677
1679
|
<span class='kw'>end</span>
|
1678
|
-
<span class='id identifier rubyid_result'>result</span> <span class='op'>+</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>\n
|
1680
|
+
<span class='id identifier rubyid_result'>result</span> <span class='op'>+</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>\n</span><span class='tstring_end'>"</span></span>
|
1679
1681
|
<span class='kw'>end</span></pre>
|
1680
1682
|
</td>
|
1681
1683
|
</tr>
|
@@ -1764,8 +1766,6 @@
|
|
1764
1766
|
<pre class="lines">
|
1765
1767
|
|
1766
1768
|
|
1767
|
-
253
|
1768
|
-
254
|
1769
1769
|
255
|
1770
1770
|
256
|
1771
1771
|
257
|
@@ -1779,10 +1779,12 @@
|
|
1779
1779
|
265
|
1780
1780
|
266
|
1781
1781
|
267
|
1782
|
-
268
|
1782
|
+
268
|
1783
|
+
269
|
1784
|
+
270</pre>
|
1783
1785
|
</td>
|
1784
1786
|
<td>
|
1785
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
1787
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 255</span>
|
1786
1788
|
|
1787
1789
|
<span class='kw'>def</span> <span class='id identifier rubyid_binding_infos_array_to_string'>binding_infos_array_to_string</span><span class='lparen'>(</span><span class='id identifier rubyid_captured_bindings'>captured_bindings</span><span class='comma'>,</span> <span class='id identifier rubyid_format'>format</span> <span class='op'>=</span> <span class='symbol'>:terminal</span><span class='rparen'>)</span>
|
1788
1790
|
<span class='kw'>case</span> <span class='id identifier rubyid_format'>format</span>
|
@@ -1867,7 +1869,7 @@
|
|
1867
1869
|
<div class="method_details ">
|
1868
1870
|
<h3 class="signature " id="enhance!-class_method">
|
1869
1871
|
|
1870
|
-
.<strong>enhance!</strong>(enabled: true, debug: false, **options) {|void| ... } ⇒ <tt>void</tt>
|
1872
|
+
.<strong>enhance!</strong>(enabled: true, debug: false, capture_events: default_capture_events, **options) {|void| ... } ⇒ <tt>void</tt>
|
1871
1873
|
|
1872
1874
|
|
1873
1875
|
|
@@ -1993,12 +1995,15 @@
|
|
1993
1995
|
176
|
1994
1996
|
177
|
1995
1997
|
178
|
1996
|
-
179
|
1998
|
+
179
|
1999
|
+
180
|
2000
|
+
181</pre>
|
1997
2001
|
</td>
|
1998
2002
|
<td>
|
1999
2003
|
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 150</span>
|
2000
2004
|
|
2001
|
-
<span class='kw'>def</span> <span class='id identifier rubyid_enhance!'>enhance!</span><span class='lparen'>(</span><span class='label'>enabled:</span> <span class='kw'>true</span><span class='comma'>,</span> <span class='label'>debug:</span> <span class='kw'>false</span><span class='comma'>,</span> <span class='op'>**</span><span class='id identifier rubyid_options'>options</span><span class='comma'>,</span> <span class='op'>&</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
|
2005
|
+
<span class='kw'>def</span> <span class='id identifier rubyid_enhance!'>enhance!</span><span class='lparen'>(</span><span class='label'>enabled:</span> <span class='kw'>true</span><span class='comma'>,</span> <span class='label'>debug:</span> <span class='kw'>false</span><span class='comma'>,</span> <span class='label'>capture_events:</span> <span class='id identifier rubyid_default_capture_events'>default_capture_events</span><span class='comma'>,</span> <span class='op'>**</span><span class='id identifier rubyid_options'>options</span><span class='comma'>,</span> <span class='op'>&</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
|
2006
|
+
<span class='id identifier rubyid_capture_events'>capture_events</span> <span class='op'>=</span> <span class='const'>Array</span><span class='lparen'>(</span><span class='id identifier rubyid_capture_events'>capture_events</span><span class='rparen'>)</span>
|
2002
2007
|
<span class='ivar'>@output_format</span> <span class='op'>=</span> <span class='kw'>nil</span>
|
2003
2008
|
<span class='ivar'>@eligible_for_capture</span> <span class='op'>=</span> <span class='kw'>nil</span>
|
2004
2009
|
<span class='ivar'>@original_global_variables</span> <span class='op'>=</span> <span class='kw'>nil</span>
|
@@ -2011,6 +2016,7 @@
|
|
2011
2016
|
<span class='ivar'>@debug</span> <span class='op'>=</span> <span class='id identifier rubyid_debug'>debug</span>
|
2012
2017
|
<span class='ivar'>@original_global_variables</span> <span class='op'>=</span> <span class='id identifier rubyid_global_variables'>global_variables</span>
|
2013
2018
|
|
2019
|
+
<span class='id identifier rubyid_validate_and_set_capture_events'>validate_and_set_capture_events</span><span class='lparen'>(</span><span class='id identifier rubyid_capture_events'>capture_events</span><span class='rparen'>)</span>
|
2014
2020
|
<span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='op'>|</span>
|
2015
2021
|
<span class='id identifier rubyid_setter_method'>setter_method</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='embexpr_end'>}</span><span class='tstring_content'>=</span><span class='tstring_end'>"</span></span>
|
2016
2022
|
<span class='kw'>if</span> <span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='id identifier rubyid_setter_method'>setter_method</span><span class='rparen'>)</span>
|
@@ -2117,18 +2123,18 @@
|
|
2117
2123
|
<pre class="lines">
|
2118
2124
|
|
2119
2125
|
|
2120
|
-
238
|
2121
|
-
239
|
2122
2126
|
240
|
2123
2127
|
241
|
2124
2128
|
242
|
2125
2129
|
243
|
2126
2130
|
244
|
2127
2131
|
245
|
2128
|
-
246
|
2132
|
+
246
|
2133
|
+
247
|
2134
|
+
248</pre>
|
2129
2135
|
</td>
|
2130
2136
|
<td>
|
2131
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2137
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 240</span>
|
2132
2138
|
|
2133
2139
|
<span class='kw'>def</span> <span class='id identifier rubyid_format'>format</span><span class='lparen'>(</span><span class='id identifier rubyid_captured_bindings'>captured_bindings</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_output_format'>output_format</span> <span class='op'>=</span> <span class='id identifier rubyid_get_default_format_for_environment'>get_default_format_for_environment</span><span class='rparen'>)</span>
|
2134
2140
|
<span class='id identifier rubyid_result'>result</span> <span class='op'>=</span> <span class='id identifier rubyid_binding_infos_array_to_string'>binding_infos_array_to_string</span><span class='lparen'>(</span><span class='id identifier rubyid_captured_bindings'>captured_bindings</span><span class='comma'>,</span> <span class='id identifier rubyid_output_format'>output_format</span><span class='rparen'>)</span>
|
@@ -2188,8 +2194,6 @@
|
|
2188
2194
|
<pre class="lines">
|
2189
2195
|
|
2190
2196
|
|
2191
|
-
273
|
2192
|
-
274
|
2193
2197
|
275
|
2194
2198
|
276
|
2195
2199
|
277
|
@@ -2203,10 +2207,12 @@
|
|
2203
2207
|
285
|
2204
2208
|
286
|
2205
2209
|
287
|
2206
|
-
288
|
2210
|
+
288
|
2211
|
+
289
|
2212
|
+
290</pre>
|
2207
2213
|
</td>
|
2208
2214
|
<td>
|
2209
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2215
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 275</span>
|
2210
2216
|
|
2211
2217
|
<span class='kw'>def</span> <span class='id identifier rubyid_get_default_format_for_environment'>get_default_format_for_environment</span>
|
2212
2218
|
<span class='kw'>return</span> <span class='ivar'>@output_format</span> <span class='kw'>unless</span> <span class='ivar'>@output_format</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
|
@@ -2293,16 +2299,16 @@
|
|
2293
2299
|
<pre class="lines">
|
2294
2300
|
|
2295
2301
|
|
2296
|
-
197
|
2297
|
-
198
|
2298
2302
|
199
|
2299
2303
|
200
|
2300
2304
|
201
|
2301
2305
|
202
|
2302
|
-
203
|
2306
|
+
203
|
2307
|
+
204
|
2308
|
+
205</pre>
|
2303
2309
|
</td>
|
2304
2310
|
<td>
|
2305
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2311
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 199</span>
|
2306
2312
|
|
2307
2313
|
<span class='kw'>def</span> <span class='id identifier rubyid_on_capture'>on_capture</span><span class='lparen'>(</span><span class='op'>&</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
|
2308
2314
|
<span class='kw'>if</span> <span class='id identifier rubyid_block_given?'>block_given?</span>
|
@@ -2380,12 +2386,12 @@
|
|
2380
2386
|
<pre class="lines">
|
2381
2387
|
|
2382
2388
|
|
2383
|
-
|
2384
|
-
|
2385
|
-
|
2389
|
+
211
|
2390
|
+
212
|
2391
|
+
213</pre>
|
2386
2392
|
</td>
|
2387
2393
|
<td>
|
2388
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2394
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 211</span>
|
2389
2395
|
|
2390
2396
|
<span class='kw'>def</span> <span class='id identifier rubyid_on_capture='>on_capture=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
|
2391
2397
|
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_on_capture_hook'>on_capture_hook</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
|
@@ -2459,16 +2465,16 @@
|
|
2459
2465
|
<pre class="lines">
|
2460
2466
|
|
2461
2467
|
|
2462
|
-
217
|
2463
|
-
218
|
2464
2468
|
219
|
2465
2469
|
220
|
2466
2470
|
221
|
2467
2471
|
222
|
2468
|
-
223
|
2472
|
+
223
|
2473
|
+
224
|
2474
|
+
225</pre>
|
2469
2475
|
</td>
|
2470
2476
|
<td>
|
2471
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2477
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 219</span>
|
2472
2478
|
|
2473
2479
|
<span class='kw'>def</span> <span class='id identifier rubyid_on_format'>on_format</span><span class='lparen'>(</span><span class='op'>&</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
|
2474
2480
|
<span class='kw'>if</span> <span class='id identifier rubyid_block_given?'>block_given?</span>
|
@@ -2546,12 +2552,12 @@
|
|
2546
2552
|
<pre class="lines">
|
2547
2553
|
|
2548
2554
|
|
2549
|
-
|
2550
|
-
|
2551
|
-
|
2555
|
+
231
|
2556
|
+
232
|
2557
|
+
233</pre>
|
2552
2558
|
</td>
|
2553
2559
|
<td>
|
2554
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2560
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 231</span>
|
2555
2561
|
|
2556
2562
|
<span class='kw'>def</span> <span class='id identifier rubyid_on_format='>on_format=</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span>
|
2557
2563
|
<span class='ivar'>@on_format_hook</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
|
@@ -2605,8 +2611,6 @@
|
|
2605
2611
|
<pre class="lines">
|
2606
2612
|
|
2607
2613
|
|
2608
|
-
293
|
2609
|
-
294
|
2610
2614
|
295
|
2611
2615
|
296
|
2612
2616
|
297
|
@@ -2617,10 +2621,12 @@
|
|
2617
2621
|
302
|
2618
2622
|
303
|
2619
2623
|
304
|
2620
|
-
305
|
2624
|
+
305
|
2625
|
+
306
|
2626
|
+
307</pre>
|
2621
2627
|
</td>
|
2622
2628
|
<td>
|
2623
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2629
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 295</span>
|
2624
2630
|
|
2625
2631
|
<span class='kw'>def</span> <span class='id identifier rubyid_running_in_ci?'>running_in_ci?</span>
|
2626
2632
|
<span class='kw'>return</span> <span class='ivar'>@running_in_ci</span> <span class='kw'>if</span> <span class='kw'>defined?</span><span class='lparen'>(</span><span class='ivar'>@running_in_ci</span><span class='rparen'>)</span>
|
@@ -2704,19 +2710,19 @@
|
|
2704
2710
|
<pre class="lines">
|
2705
2711
|
|
2706
2712
|
|
2707
|
-
325
|
2708
|
-
326
|
2709
2713
|
327
|
2710
2714
|
328
|
2711
2715
|
329
|
2712
2716
|
330
|
2713
|
-
331
|
2717
|
+
331
|
2718
|
+
332
|
2719
|
+
333</pre>
|
2714
2720
|
</td>
|
2715
2721
|
<td>
|
2716
|
-
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line
|
2722
|
+
<pre class="code"><span class="info file"># File 'lib/enhanced_errors.rb', line 327</span>
|
2717
2723
|
|
2718
2724
|
<span class='kw'>def</span> <span class='id identifier rubyid_validate_binding_format'>validate_binding_format</span><span class='lparen'>(</span><span class='id identifier rubyid_binding_info'>binding_info</span><span class='rparen'>)</span>
|
2719
|
-
<span class='kw'>unless</span> <span class='id identifier rubyid_binding_info'>binding_info</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='symbol'>:
|
2725
|
+
<span class='kw'>unless</span> <span class='id identifier rubyid_binding_info'>binding_info</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='symbol'>:capture_event</span><span class='rparen'>)</span> <span class='op'>&&</span> <span class='id identifier rubyid_binding_info'>binding_info</span><span class='lbracket'>[</span><span class='symbol'>:variables</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Hash</span><span class='rparen'>)</span>
|
2720
2726
|
<span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Invalid binding_info format.</span><span class='tstring_end'>"</span></span>
|
2721
2727
|
<span class='kw'>return</span> <span class='kw'>nil</span>
|
2722
2728
|
<span class='kw'>end</span>
|
@@ -2732,7 +2738,7 @@
|
|
2732
2738
|
</div>
|
2733
2739
|
|
2734
2740
|
<div id="footer">
|
2735
|
-
Generated on
|
2741
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
2736
2742
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
2737
2743
|
0.9.37 (ruby-3.1.3).
|
2738
2744
|
</div>
|
data/doc/ErrorEnhancements.html
CHANGED
@@ -179,7 +179,7 @@
|
|
179
179
|
|
180
180
|
<span class='kw'>def</span> <span class='id identifier rubyid_message'>message</span>
|
181
181
|
<span class='id identifier rubyid_original_message'>original_message</span> <span class='op'>=</span> <span class='kw'>super</span><span class='lparen'>(</span><span class='rparen'>)</span>
|
182
|
-
<span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_original_message'>original_message</span><span class='embexpr_end'>}</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_variables_message'>variables_message</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span>
|
182
|
+
<span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_original_message'>original_message</span><span class='embexpr_end'>}</span><span class='tstring_content'>\n</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_variables_message'>variables_message</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span>
|
183
183
|
<span class='kw'>rescue</span> <span class='op'>=></span> <span class='id identifier rubyid_e'>e</span>
|
184
184
|
<span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Error in message method: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span>
|
185
185
|
<span class='id identifier rubyid_original_message'>original_message</span>
|
@@ -242,7 +242,7 @@
|
|
242
242
|
</div>
|
243
243
|
|
244
244
|
<div id="footer">
|
245
|
-
Generated on
|
245
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
246
246
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
247
247
|
0.9.37 (ruby-3.1.3).
|
248
248
|
</div>
|
data/doc/_index.html
CHANGED
@@ -141,7 +141,7 @@
|
|
141
141
|
</div>
|
142
142
|
|
143
143
|
<div id="footer">
|
144
|
-
Generated on
|
144
|
+
Generated on Fri Oct 25 11:07:01 2024 by
|
145
145
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
146
146
|
0.9.37 (ruby-3.1.3).
|
147
147
|
</div>
|
data/doc/file.README.html
CHANGED
@@ -91,37 +91,34 @@
|
|
91
91
|
|
92
92
|
<h5 id="label-Output-3A">Output:</h5>
|
93
93
|
|
94
|
-
<p><img src=“./doc/images/enhanced-error.png” style=“height:
|
95
|
-
|
96
|
-
<p><br></p>
|
94
|
+
<p><img src=“./doc/images/enhanced-error.png” style=“height: 215px; width: 429px;”></img> <br></p>
|
97
95
|
|
98
96
|
<h4 id="label-Enhanced+Exception+In+Specs-3A">Enhanced Exception In Specs:</h4>
|
99
97
|
|
100
|
-
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_describe'>describe</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>
|
101
|
-
<span class='id identifier rubyid_let'>let</span><span class='lparen'>(</span><span class='symbol'>:the_matrix</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>code rains, dramatically</span><span class='tstring_end'>'</span></span> <span class='rbrace'>}</span>
|
98
|
+
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_describe'>describe</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>sees through</span><span class='tstring_end'>'</span></span> <span class='kw'>do</span>
|
102
99
|
|
103
|
-
|
104
|
-
<span class='ivar'>@spoon</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>there is no spoon</span><span class='tstring_end'>'</span></span>
|
105
|
-
<span class='kw'>end</span>
|
100
|
+
<span class='id identifier rubyid_let'>let</span><span class='lparen'>(</span><span class='symbol'>:the_matrix</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>code rains, dramatically</span><span class='tstring_end'>'</span></span> <span class='rbrace'>}</span>
|
106
101
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
<span class='
|
102
|
+
<span class='id identifier rubyid_before'>before</span><span class='lparen'>(</span><span class='symbol'>:each</span><span class='rparen'>)</span> <span class='kw'>do</span>
|
103
|
+
<span class='ivar'>@spoon</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>there is no spoon</span><span class='tstring_end'>'</span></span>
|
104
|
+
<span class='kw'>end</span>
|
105
|
+
|
106
|
+
<span class='id identifier rubyid_it'>it</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>the matrix</span><span class='tstring_end'>'</span></span> <span class='kw'>do</span>
|
107
|
+
<span class='comment'>#activate memoized item
|
108
|
+
</span> <span class='id identifier rubyid_the_matrix'>the_matrix</span>
|
109
|
+
<span class='id identifier rubyid_stop'>stop</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>bullets</span><span class='tstring_end'>'</span></span>
|
110
|
+
<span class='id identifier rubyid_raise'>raise</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>No!</span><span class='tstring_end'>'</span></span>
|
113
111
|
<span class='kw'>end</span>
|
112
|
+
<span class='kw'>end</span>
|
114
113
|
</code></pre>
|
115
114
|
|
116
115
|
<h4 id="label-Output-3A">Output:</h4>
|
117
116
|
|
118
|
-
<p><img src=“./doc/images/enhanced-spec.png” style=“height:
|
117
|
+
<p><img src=“./doc/images/enhanced-spec.png” style=“height: 369px; width: 712px;”></img></p>
|
119
118
|
|
120
119
|
<h2 id="label-Features">Features</h2>
|
121
120
|
<ul><li>
|
122
|
-
<p><strong>Pure Ruby</strong>: No external dependencies or C
|
123
|
-
</li><li>
|
124
|
-
<p><strong>Standalone</strong>: Does not rely on any external libraries.</p>
|
121
|
+
<p><strong>Pure Ruby</strong>: No external dependencies, C extensions, or C API calls.</p>
|
125
122
|
</li><li>
|
126
123
|
<p><strong>Lightweight</strong>: Minimal performance impact, as tracing is only active during exception raising.</p>
|
127
124
|
</li><li>
|
@@ -208,6 +205,8 @@
|
|
208
205
|
<p><code>max_length</code>: Sets the maximum length of the enhanced message (default: <code>2500</code>).</p>
|
209
206
|
</li></ul>
|
210
207
|
|
208
|
+
<p>Currently, the first <code>raise</code> exception binding is presented. This may be changed in the future to allow more binding data to be presented.</p>
|
209
|
+
|
211
210
|
<h3 id="label-Environment-Based+Defaults">Environment-Based Defaults</h3>
|
212
211
|
|
213
212
|
<p>EnhancedErrors adjusts its default settings based on the environment:</p>
|
@@ -270,7 +269,7 @@
|
|
270
269
|
globals: globals
|
271
270
|
},
|
272
271
|
exception: exception.class.name,
|
273
|
-
|
272
|
+
capture_event: capture_event # 'raise' or 'rescue'
|
274
273
|
}
|
275
274
|
</code></pre>
|
276
275
|
|
@@ -321,7 +320,7 @@
|
|
321
320
|
<ul><li>
|
322
321
|
<p><strong>Info Level</strong>: Respects the skip list, excluding predefined sensitive or irrelevant variables. Global variables are ignored.</p>
|
323
322
|
</li><li>
|
324
|
-
<p><strong>Debug Level</strong>: Ignores the skip lists, capturing all variables including those typically excluded and global variables. Global variables
|
323
|
+
<p><strong>Debug Level</strong>: Ignores the skip lists, capturing all variables including those typically excluded and global variables. Global variables are only captured in debug mode, and they exclude the default Ruby global variables.</p>
|
325
324
|
</li></ul>
|
326
325
|
|
327
326
|
<p><strong>Default Behavior</strong>: By default, <code>info</code> level is used, which excludes variables in the skip list to protect sensitive information. In <code>debug</code> mode, the skip lists are ignored to provide more comprehensive data, which is useful during development but should be used cautiously to avoid exposing sensitive data. The info mode is recommended.</p>
|
@@ -335,7 +334,7 @@
|
|
335
334
|
<p><strong><code>rescue</code></strong>: Captures the context when an exception is last rescued.</p>
|
336
335
|
</li></ul>
|
337
336
|
|
338
|
-
<p><strong>Default Behavior</strong>: By default, EnhancedErrors returns the first <code>raise</code> and the last <code>rescue</code> event for each exception.
|
337
|
+
<p><strong>Default Behavior</strong>: By default, EnhancedErrors returns the first <code>raise</code> and the last <code>rescue</code> event for each exception. The <code>rescue</code> exception is only available in Ruby 3.2+ as it was added to TracePoint events in Ruby 3.2.</p>
|
339
338
|
|
340
339
|
<h3 id="label-Example-3A+Redacting+Sensitive+Information">Example: Redacting Sensitive Information</h3>
|
341
340
|
|
@@ -350,35 +349,6 @@
|
|
350
349
|
<span class='kw'>end</span>
|
351
350
|
</code></pre>
|
352
351
|
|
353
|
-
<h3 id="label-Example-3A+Encrypting+Data+in+Custom+Format">Example: Encrypting Data in Custom Format</h3>
|
354
|
-
|
355
|
-
<pre class="code ruby"><code class="ruby"><span class='comment'># config/initializers/encryption.rb
|
356
|
-
</span>
|
357
|
-
<span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>active_support</span><span class='tstring_end'>'</span></span>
|
358
|
-
|
359
|
-
<span class='comment'># Retrieve the encryption key from Rails credentials or environment variables
|
360
|
-
</span><span class='const'>ENCRYPTION_KEY</span> <span class='op'>=</span> <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_application'>application</span><span class='period'>.</span><span class='id identifier rubyid_credentials'>credentials</span><span class='period'>.</span><span class='id identifier rubyid_encryption_key'>encryption_key</span> <span class='op'>||</span> <span class='const'>ENV</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>ENCRYPTION_KEY</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span>
|
361
|
-
|
362
|
-
<span class='comment'># It's recommended to use a 256-bit key (32 bytes)
|
363
|
-
</span><span class='comment'># If your key is in hex or another format, ensure it's properly decoded
|
364
|
-
</span><span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='const'>ActiveSupport</span><span class='op'>::</span><span class='const'>KeyGenerator</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>ENCRYPTION_KEY</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_generate_key'>generate_key</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>enhanced_errors</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>32</span><span class='rparen'>)</span>
|
365
|
-
<span class='const'>ENCRYPTOR</span> <span class='op'>=</span> <span class='const'>ActiveSupport</span><span class='op'>::</span><span class='const'>MessageEncryptor</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
|
366
|
-
</code></pre>
|
367
|
-
|
368
|
-
<pre class="code ruby"><code class="ruby">
|
369
|
-
<span class='id identifier rubyid_require_relative'>require_relative</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>path_to/enhanced_errors</span><span class='tstring_end'>'</span></span> <span class='comment'># Adjust the path accordingly
|
370
|
-
</span><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>active_support/message_encryptor</span><span class='tstring_end'>'</span></span>
|
371
|
-
|
372
|
-
<span class='comment'># Ensure the encryptor is initialized
|
373
|
-
</span><span class='id identifier rubyid_encryptor'>encryptor</span> <span class='op'>=</span> <span class='const'>ENCRYPTOR</span>
|
374
|
-
|
375
|
-
<span class='const'><span class='object_link'><a href="EnhancedErrors.html" title="EnhancedErrors (class)">EnhancedErrors</a></span></span><span class='period'>.</span><span class='id identifier rubyid_on_format'><span class='object_link'><a href="EnhancedErrors.html#on_format-class_method" title="EnhancedErrors.on_format (method)">on_format</a></span></span> <span class='op'>=</span> <span class='id identifier rubyid_lambda'>lambda</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_formatted_string'>formatted_string</span><span class='op'>|</span>
|
376
|
-
<span class='id identifier rubyid_encrypted_data'>encrypted_data</span> <span class='op'>=</span> <span class='id identifier rubyid_encryptor'>encryptor</span><span class='period'>.</span><span class='id identifier rubyid_encrypt_and_sign'>encrypt_and_sign</span><span class='lparen'>(</span><span class='id identifier rubyid_formatted_string'>formatted_string</span><span class='rparen'>)</span>
|
377
|
-
<span class='id identifier rubyid_encrypted_base64'>encrypted_base64</span> <span class='op'>=</span> <span class='const'>Base64</span><span class='period'>.</span><span class='id identifier rubyid_strict_encode64'>strict_encode64</span><span class='lparen'>(</span><span class='id identifier rubyid_encrypted_data'>encrypted_data</span><span class='rparen'>)</span>
|
378
|
-
<span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>ENCRYPTED[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_encrypted_base64'>encrypted_base64</span><span class='embexpr_end'>}</span><span class='tstring_content'>]</span><span class='tstring_end'>"</span></span>
|
379
|
-
<span class='kw'>end</span>
|
380
|
-
</code></pre>
|
381
|
-
|
382
352
|
<h2 id="label-How+It+Works">How It Works</h2>
|
383
353
|
|
384
354
|
<p>EnhancedErrors uses Ruby’s <code>TracePoint</code> to listen for <code>:raise</code> and <code>:rescue</code> events. When an exception is raised or rescued, it captures:</p>
|
@@ -394,7 +364,7 @@
|
|
394
364
|
<p><strong>Global Variables</strong>: Global variables, in debug mode.</p>
|
395
365
|
</li></ul>
|
396
366
|
|
397
|
-
<p>The captured data includes a <code>
|
367
|
+
<p>The captured data includes a <code>capture_event</code> field indicating whether the data was captured during a <code>raise</code> or <code>rescue</code> event. By default, EnhancedErrors returns the first <code>raise</code> and the last <code>rescue</code> event for each exception, providing a clear trace of the exception lifecycle.</p>
|
398
368
|
|
399
369
|
<p>The captured data is then appended to the exception’s message, providing rich context for debugging.</p>
|
400
370
|
|
@@ -409,7 +379,7 @@
|
|
409
379
|
<ul><li>
|
410
380
|
<p><strong>Minimal Overhead</strong>: Since TracePoint is only activated during exception raising and rescuing, the performance impact is negligible during normal operation.</p>
|
411
381
|
</li><li>
|
412
|
-
<p><strong>Production Safe</strong>: The gem is designed to be safe for production use, giving you valuable insights without compromising performance.</p>
|
382
|
+
<p><strong>Production Safe</strong>: The gem is designed to be safe for production use, giving you valuable insights without compromising performance. Although this is the case, I’d still suggest letting it get well-vetted before making the leap.</p>
|
413
383
|
</li></ul>
|
414
384
|
|
415
385
|
<h2 id="label-Contributing">Contributing</h2>
|
@@ -422,7 +392,7 @@
|
|
422
392
|
</div></div>
|
423
393
|
|
424
394
|
<div id="footer">
|
425
|
-
Generated on
|
395
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
426
396
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
427
397
|
0.9.37 (ruby-3.1.3).
|
428
398
|
</div>
|
data/doc/index.html
CHANGED
@@ -91,37 +91,34 @@
|
|
91
91
|
|
92
92
|
<h5 id="label-Output-3A">Output:</h5>
|
93
93
|
|
94
|
-
<p><img src=“./doc/images/enhanced-error.png” style=“height:
|
95
|
-
|
96
|
-
<p><br></p>
|
94
|
+
<p><img src=“./doc/images/enhanced-error.png” style=“height: 215px; width: 429px;”></img> <br></p>
|
97
95
|
|
98
96
|
<h4 id="label-Enhanced+Exception+In+Specs-3A">Enhanced Exception In Specs:</h4>
|
99
97
|
|
100
|
-
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_describe'>describe</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>
|
101
|
-
<span class='id identifier rubyid_let'>let</span><span class='lparen'>(</span><span class='symbol'>:the_matrix</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>code rains, dramatically</span><span class='tstring_end'>'</span></span> <span class='rbrace'>}</span>
|
98
|
+
<pre class="code ruby"><code class="ruby"><span class='id identifier rubyid_describe'>describe</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>sees through</span><span class='tstring_end'>'</span></span> <span class='kw'>do</span>
|
102
99
|
|
103
|
-
|
104
|
-
<span class='ivar'>@spoon</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>there is no spoon</span><span class='tstring_end'>'</span></span>
|
105
|
-
<span class='kw'>end</span>
|
100
|
+
<span class='id identifier rubyid_let'>let</span><span class='lparen'>(</span><span class='symbol'>:the_matrix</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>code rains, dramatically</span><span class='tstring_end'>'</span></span> <span class='rbrace'>}</span>
|
106
101
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
<span class='
|
102
|
+
<span class='id identifier rubyid_before'>before</span><span class='lparen'>(</span><span class='symbol'>:each</span><span class='rparen'>)</span> <span class='kw'>do</span>
|
103
|
+
<span class='ivar'>@spoon</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>there is no spoon</span><span class='tstring_end'>'</span></span>
|
104
|
+
<span class='kw'>end</span>
|
105
|
+
|
106
|
+
<span class='id identifier rubyid_it'>it</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>the matrix</span><span class='tstring_end'>'</span></span> <span class='kw'>do</span>
|
107
|
+
<span class='comment'>#activate memoized item
|
108
|
+
</span> <span class='id identifier rubyid_the_matrix'>the_matrix</span>
|
109
|
+
<span class='id identifier rubyid_stop'>stop</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>bullets</span><span class='tstring_end'>'</span></span>
|
110
|
+
<span class='id identifier rubyid_raise'>raise</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>No!</span><span class='tstring_end'>'</span></span>
|
113
111
|
<span class='kw'>end</span>
|
112
|
+
<span class='kw'>end</span>
|
114
113
|
</code></pre>
|
115
114
|
|
116
115
|
<h4 id="label-Output-3A">Output:</h4>
|
117
116
|
|
118
|
-
<p><img src=“./doc/images/enhanced-spec.png” style=“height:
|
117
|
+
<p><img src=“./doc/images/enhanced-spec.png” style=“height: 369px; width: 712px;”></img></p>
|
119
118
|
|
120
119
|
<h2 id="label-Features">Features</h2>
|
121
120
|
<ul><li>
|
122
|
-
<p><strong>Pure Ruby</strong>: No external dependencies or C
|
123
|
-
</li><li>
|
124
|
-
<p><strong>Standalone</strong>: Does not rely on any external libraries.</p>
|
121
|
+
<p><strong>Pure Ruby</strong>: No external dependencies, C extensions, or C API calls.</p>
|
125
122
|
</li><li>
|
126
123
|
<p><strong>Lightweight</strong>: Minimal performance impact, as tracing is only active during exception raising.</p>
|
127
124
|
</li><li>
|
@@ -208,6 +205,8 @@
|
|
208
205
|
<p><code>max_length</code>: Sets the maximum length of the enhanced message (default: <code>2500</code>).</p>
|
209
206
|
</li></ul>
|
210
207
|
|
208
|
+
<p>Currently, the first <code>raise</code> exception binding is presented. This may be changed in the future to allow more binding data to be presented.</p>
|
209
|
+
|
211
210
|
<h3 id="label-Environment-Based+Defaults">Environment-Based Defaults</h3>
|
212
211
|
|
213
212
|
<p>EnhancedErrors adjusts its default settings based on the environment:</p>
|
@@ -270,7 +269,7 @@
|
|
270
269
|
globals: globals
|
271
270
|
},
|
272
271
|
exception: exception.class.name,
|
273
|
-
|
272
|
+
capture_event: capture_event # 'raise' or 'rescue'
|
274
273
|
}
|
275
274
|
</code></pre>
|
276
275
|
|
@@ -321,7 +320,7 @@
|
|
321
320
|
<ul><li>
|
322
321
|
<p><strong>Info Level</strong>: Respects the skip list, excluding predefined sensitive or irrelevant variables. Global variables are ignored.</p>
|
323
322
|
</li><li>
|
324
|
-
<p><strong>Debug Level</strong>: Ignores the skip lists, capturing all variables including those typically excluded and global variables. Global variables
|
323
|
+
<p><strong>Debug Level</strong>: Ignores the skip lists, capturing all variables including those typically excluded and global variables. Global variables are only captured in debug mode, and they exclude the default Ruby global variables.</p>
|
325
324
|
</li></ul>
|
326
325
|
|
327
326
|
<p><strong>Default Behavior</strong>: By default, <code>info</code> level is used, which excludes variables in the skip list to protect sensitive information. In <code>debug</code> mode, the skip lists are ignored to provide more comprehensive data, which is useful during development but should be used cautiously to avoid exposing sensitive data. The info mode is recommended.</p>
|
@@ -335,7 +334,7 @@
|
|
335
334
|
<p><strong><code>rescue</code></strong>: Captures the context when an exception is last rescued.</p>
|
336
335
|
</li></ul>
|
337
336
|
|
338
|
-
<p><strong>Default Behavior</strong>: By default, EnhancedErrors returns the first <code>raise</code> and the last <code>rescue</code> event for each exception.
|
337
|
+
<p><strong>Default Behavior</strong>: By default, EnhancedErrors returns the first <code>raise</code> and the last <code>rescue</code> event for each exception. The <code>rescue</code> exception is only available in Ruby 3.2+ as it was added to TracePoint events in Ruby 3.2.</p>
|
339
338
|
|
340
339
|
<h3 id="label-Example-3A+Redacting+Sensitive+Information">Example: Redacting Sensitive Information</h3>
|
341
340
|
|
@@ -350,35 +349,6 @@
|
|
350
349
|
<span class='kw'>end</span>
|
351
350
|
</code></pre>
|
352
351
|
|
353
|
-
<h3 id="label-Example-3A+Encrypting+Data+in+Custom+Format">Example: Encrypting Data in Custom Format</h3>
|
354
|
-
|
355
|
-
<pre class="code ruby"><code class="ruby"><span class='comment'># config/initializers/encryption.rb
|
356
|
-
</span>
|
357
|
-
<span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>active_support</span><span class='tstring_end'>'</span></span>
|
358
|
-
|
359
|
-
<span class='comment'># Retrieve the encryption key from Rails credentials or environment variables
|
360
|
-
</span><span class='const'>ENCRYPTION_KEY</span> <span class='op'>=</span> <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_application'>application</span><span class='period'>.</span><span class='id identifier rubyid_credentials'>credentials</span><span class='period'>.</span><span class='id identifier rubyid_encryption_key'>encryption_key</span> <span class='op'>||</span> <span class='const'>ENV</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>ENCRYPTION_KEY</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span>
|
361
|
-
|
362
|
-
<span class='comment'># It's recommended to use a 256-bit key (32 bytes)
|
363
|
-
</span><span class='comment'># If your key is in hex or another format, ensure it's properly decoded
|
364
|
-
</span><span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='const'>ActiveSupport</span><span class='op'>::</span><span class='const'>KeyGenerator</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='const'>ENCRYPTION_KEY</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_generate_key'>generate_key</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>enhanced_errors</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>32</span><span class='rparen'>)</span>
|
365
|
-
<span class='const'>ENCRYPTOR</span> <span class='op'>=</span> <span class='const'>ActiveSupport</span><span class='op'>::</span><span class='const'>MessageEncryptor</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
|
366
|
-
</code></pre>
|
367
|
-
|
368
|
-
<pre class="code ruby"><code class="ruby">
|
369
|
-
<span class='id identifier rubyid_require_relative'>require_relative</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>path_to/enhanced_errors</span><span class='tstring_end'>'</span></span> <span class='comment'># Adjust the path accordingly
|
370
|
-
</span><span class='id identifier rubyid_require'>require</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>active_support/message_encryptor</span><span class='tstring_end'>'</span></span>
|
371
|
-
|
372
|
-
<span class='comment'># Ensure the encryptor is initialized
|
373
|
-
</span><span class='id identifier rubyid_encryptor'>encryptor</span> <span class='op'>=</span> <span class='const'>ENCRYPTOR</span>
|
374
|
-
|
375
|
-
<span class='const'><span class='object_link'><a href="EnhancedErrors.html" title="EnhancedErrors (class)">EnhancedErrors</a></span></span><span class='period'>.</span><span class='id identifier rubyid_on_format'><span class='object_link'><a href="EnhancedErrors.html#on_format-class_method" title="EnhancedErrors.on_format (method)">on_format</a></span></span> <span class='op'>=</span> <span class='id identifier rubyid_lambda'>lambda</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_formatted_string'>formatted_string</span><span class='op'>|</span>
|
376
|
-
<span class='id identifier rubyid_encrypted_data'>encrypted_data</span> <span class='op'>=</span> <span class='id identifier rubyid_encryptor'>encryptor</span><span class='period'>.</span><span class='id identifier rubyid_encrypt_and_sign'>encrypt_and_sign</span><span class='lparen'>(</span><span class='id identifier rubyid_formatted_string'>formatted_string</span><span class='rparen'>)</span>
|
377
|
-
<span class='id identifier rubyid_encrypted_base64'>encrypted_base64</span> <span class='op'>=</span> <span class='const'>Base64</span><span class='period'>.</span><span class='id identifier rubyid_strict_encode64'>strict_encode64</span><span class='lparen'>(</span><span class='id identifier rubyid_encrypted_data'>encrypted_data</span><span class='rparen'>)</span>
|
378
|
-
<span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>ENCRYPTED[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_encrypted_base64'>encrypted_base64</span><span class='embexpr_end'>}</span><span class='tstring_content'>]</span><span class='tstring_end'>"</span></span>
|
379
|
-
<span class='kw'>end</span>
|
380
|
-
</code></pre>
|
381
|
-
|
382
352
|
<h2 id="label-How+It+Works">How It Works</h2>
|
383
353
|
|
384
354
|
<p>EnhancedErrors uses Ruby’s <code>TracePoint</code> to listen for <code>:raise</code> and <code>:rescue</code> events. When an exception is raised or rescued, it captures:</p>
|
@@ -394,7 +364,7 @@
|
|
394
364
|
<p><strong>Global Variables</strong>: Global variables, in debug mode.</p>
|
395
365
|
</li></ul>
|
396
366
|
|
397
|
-
<p>The captured data includes a <code>
|
367
|
+
<p>The captured data includes a <code>capture_event</code> field indicating whether the data was captured during a <code>raise</code> or <code>rescue</code> event. By default, EnhancedErrors returns the first <code>raise</code> and the last <code>rescue</code> event for each exception, providing a clear trace of the exception lifecycle.</p>
|
398
368
|
|
399
369
|
<p>The captured data is then appended to the exception’s message, providing rich context for debugging.</p>
|
400
370
|
|
@@ -409,7 +379,7 @@
|
|
409
379
|
<ul><li>
|
410
380
|
<p><strong>Minimal Overhead</strong>: Since TracePoint is only activated during exception raising and rescuing, the performance impact is negligible during normal operation.</p>
|
411
381
|
</li><li>
|
412
|
-
<p><strong>Production Safe</strong>: The gem is designed to be safe for production use, giving you valuable insights without compromising performance.</p>
|
382
|
+
<p><strong>Production Safe</strong>: The gem is designed to be safe for production use, giving you valuable insights without compromising performance. Although this is the case, I’d still suggest letting it get well-vetted before making the leap.</p>
|
413
383
|
</li></ul>
|
414
384
|
|
415
385
|
<h2 id="label-Contributing">Contributing</h2>
|
@@ -422,7 +392,7 @@
|
|
422
392
|
</div></div>
|
423
393
|
|
424
394
|
<div id="footer">
|
425
|
-
Generated on
|
395
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
426
396
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
427
397
|
0.9.37 (ruby-3.1.3).
|
428
398
|
</div>
|
@@ -102,7 +102,7 @@
|
|
102
102
|
</div>
|
103
103
|
|
104
104
|
<div id="footer">
|
105
|
-
Generated on
|
105
|
+
Generated on Fri Oct 25 11:07:02 2024 by
|
106
106
|
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
107
107
|
0.9.37 (ruby-3.1.3).
|
108
108
|
</div>
|
data/enhanced_errors.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "enhanced_errors"
|
3
|
-
spec.version = "0.1.
|
3
|
+
spec.version = "0.1.5"
|
4
4
|
spec.authors = ["Eric Beland"]
|
5
5
|
|
6
6
|
spec.summary = "Automatically enhance your errors with messages containing variable values from the moment they were raised."
|
@@ -13,4 +13,22 @@ def foo
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def baz
|
17
|
+
i.dontexist
|
18
|
+
end
|
19
|
+
|
20
|
+
def boo
|
21
|
+
seeme = 'youshould'
|
22
|
+
baz
|
23
|
+
rescue => e
|
24
|
+
puts e.message
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
puts "\n--- Example with raise ---\n\n\n"
|
29
|
+
|
16
30
|
foo
|
31
|
+
|
32
|
+
puts "\n--- Example with raise and rescue (requires ruby 3.2 or greater to see rescue) ---\n\n\n"
|
33
|
+
|
34
|
+
boo
|
data/lib/enhanced_errors.rb
CHANGED
@@ -147,7 +147,8 @@ class EnhancedErrors
|
|
147
147
|
# @param options [Hash] Additional configuration options.
|
148
148
|
# @yield [void] A block for additional configuration.
|
149
149
|
# @return [void]
|
150
|
-
def enhance!(enabled: true, debug: false, **options, &block)
|
150
|
+
def enhance!(enabled: true, debug: false, capture_events: default_capture_events, **options, &block)
|
151
|
+
capture_events = Array(capture_events)
|
151
152
|
@output_format = nil
|
152
153
|
@eligible_for_capture = nil
|
153
154
|
@original_global_variables = nil
|
@@ -160,6 +161,7 @@ class EnhancedErrors
|
|
160
161
|
@debug = debug
|
161
162
|
@original_global_variables = global_variables
|
162
163
|
|
164
|
+
validate_and_set_capture_events(capture_events)
|
163
165
|
options.each do |key, value|
|
164
166
|
setter_method = "#{key}="
|
165
167
|
if respond_to?(setter_method)
|
@@ -323,7 +325,7 @@ class EnhancedErrors
|
|
323
325
|
# @param binding_info [Hash] The binding information to validate.
|
324
326
|
# @return [Hash, nil] The validated binding information or `nil` if invalid.
|
325
327
|
def validate_binding_format(binding_info)
|
326
|
-
unless binding_info.keys.include?(:
|
328
|
+
unless binding_info.keys.include?(:capture_event) && binding_info[:variables].is_a?(Hash)
|
327
329
|
puts "Invalid binding_info format."
|
328
330
|
return nil
|
329
331
|
end
|
@@ -335,7 +337,8 @@ class EnhancedErrors
|
|
335
337
|
# @param binding_info [Hash] The binding information to format.
|
336
338
|
# @return [String] The formatted string.
|
337
339
|
def binding_info_string(binding_info)
|
338
|
-
|
340
|
+
capture_event = binding_info[:capture_event].to_s.capitalize
|
341
|
+
result = "#{Colors.red(capture_event)}: #{Colors.blue(binding_info[:source])}"
|
339
342
|
|
340
343
|
result += method_and_args_desc(binding_info[:method_and_args])
|
341
344
|
|
@@ -363,7 +366,7 @@ class EnhancedErrors
|
|
363
366
|
if result.length > max_length
|
364
367
|
result = result[0...max_length] + "... (truncated)"
|
365
368
|
end
|
366
|
-
result + "\n
|
369
|
+
result + "\n"
|
367
370
|
end
|
368
371
|
|
369
372
|
private
|
@@ -374,17 +377,15 @@ class EnhancedErrors
|
|
374
377
|
def start_tracing
|
375
378
|
return if @trace && @trace.enabled?
|
376
379
|
|
377
|
-
events = [:raise]
|
378
|
-
events << :rescue if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.3.0')
|
380
|
+
events = @capture_events ? @capture_events.to_a : [:raise]
|
379
381
|
|
380
382
|
@trace = TracePoint.new(*events) do |tp|
|
381
|
-
next if Thread.current[:enhanced_errors_processing]
|
383
|
+
next if Thread.current[:enhanced_errors_processing] || tp.raised_exception.is_a?(NoMemoryError)
|
382
384
|
Thread.current[:enhanced_errors_processing] = true
|
383
385
|
exception = tp.raised_exception
|
384
386
|
capture_me = EnhancedErrors.eligible_for_capture.call(exception)
|
385
387
|
next unless capture_me
|
386
388
|
|
387
|
-
|
388
389
|
exception = tp.raised_exception
|
389
390
|
binding_context = tp.binding
|
390
391
|
|
@@ -425,10 +426,9 @@ class EnhancedErrors
|
|
425
426
|
globals = (global_variables - @original_global_variables).map { |var|
|
426
427
|
[var, get_global_variable_value(var)]
|
427
428
|
}.to_h
|
428
|
-
puts "Global Variables: #{globals.inspect}"
|
429
429
|
end
|
430
430
|
|
431
|
-
|
431
|
+
capture_event = tp.event.to_s # 'raise' or 'rescue'
|
432
432
|
location = "#{tp.path}:#{tp.lineno}"
|
433
433
|
|
434
434
|
binding_info = {
|
@@ -444,7 +444,7 @@ class EnhancedErrors
|
|
444
444
|
globals: globals
|
445
445
|
},
|
446
446
|
exception: exception.class.name,
|
447
|
-
|
447
|
+
capture_event: capture_event.to_s
|
448
448
|
}
|
449
449
|
|
450
450
|
if on_capture_hook
|
@@ -469,6 +469,7 @@ class EnhancedErrors
|
|
469
469
|
@trace.enable
|
470
470
|
end
|
471
471
|
|
472
|
+
|
472
473
|
# Retrieves the current test name from RSpec, if available.
|
473
474
|
#
|
474
475
|
# @return [String, nil] The current test name or `nil` if not in a test context.
|
@@ -480,6 +481,42 @@ class EnhancedErrors
|
|
480
481
|
nil
|
481
482
|
end
|
482
483
|
|
484
|
+
# Helper method to determine the default capture types based on Ruby version
|
485
|
+
#
|
486
|
+
# @return [Set<Symbol>] The default set of capture types
|
487
|
+
def default_capture_events
|
488
|
+
default_events = [:raise]
|
489
|
+
default_events << :rescue if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.3.0')
|
490
|
+
Set.new(default_events)
|
491
|
+
end
|
492
|
+
|
493
|
+
def validate_and_set_capture_events(capture_events)
|
494
|
+
if capture_events.nil? || !valid_capture_events?(capture_events)
|
495
|
+
puts "EnhancedErrors: Invalid capture_events provided. Falling back to defaults."
|
496
|
+
capture_events = default_capture_events
|
497
|
+
end
|
498
|
+
|
499
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3.0') && capture_events.include?(:rescue)
|
500
|
+
puts "EnhancedErrors: Warning: :rescue capture_event is not supported in Ruby versions below 3.3.0 and will be ignored."
|
501
|
+
capture_events.delete(:rescue)
|
502
|
+
end
|
503
|
+
|
504
|
+
if capture_events.empty?
|
505
|
+
puts "No valid capture_events provided to EnhancedErrors.enhance! Falling back to defaults."
|
506
|
+
capture_events = default_capture_events
|
507
|
+
end
|
508
|
+
|
509
|
+
@capture_events = capture_events.to_a
|
510
|
+
end
|
511
|
+
|
512
|
+
|
513
|
+
# Validate capture_events: must be an Array or Set containing only :raise and/or :rescue.
|
514
|
+
def valid_capture_events?(capture_events)
|
515
|
+
return false unless capture_events.is_a?(Array) || capture_events.is_a?(Set)
|
516
|
+
valid_types = [:raise, :rescue].to_set
|
517
|
+
capture_events.to_set.subset?(valid_types)
|
518
|
+
end
|
519
|
+
|
483
520
|
# Extracts method arguments from the TracePoint binding.
|
484
521
|
#
|
485
522
|
# @param tp [TracePoint] The current TracePoint.
|
data/lib/error_enhancements.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module ErrorEnhancements
|
2
2
|
def message
|
3
3
|
original_message = super()
|
4
|
-
"#{original_message}#{variables_message}"
|
4
|
+
"#{original_message}\n#{variables_message}"
|
5
5
|
rescue => e
|
6
6
|
puts "Error in message method: #{e.message}"
|
7
7
|
original_message
|
@@ -29,8 +29,9 @@ module ErrorEnhancements
|
|
29
29
|
# Grab the last rescue binding if we have one
|
30
30
|
|
31
31
|
bindings_of_interest = []
|
32
|
+
|
32
33
|
binding_infos.each do |info|
|
33
|
-
if info[:
|
34
|
+
if info[:capture_event] == 'raise' && !info[:library]
|
34
35
|
bindings_of_interest << info
|
35
36
|
break
|
36
37
|
end
|
@@ -42,7 +43,7 @@ module ErrorEnhancements
|
|
42
43
|
|
43
44
|
# find the last rescue binding if there is one
|
44
45
|
binding_infos.reverse.each do |info|
|
45
|
-
if info[:
|
46
|
+
if info[:capture_event] == 'rescue'
|
46
47
|
bindings_of_interest << info
|
47
48
|
break
|
48
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: enhanced_errors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Beland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|