enhanced_errors 2.1.3 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardoc/checksums +4 -2
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/README.md +2 -2
- data/doc/Context.html +283 -0
- data/doc/Enhanced/Colors.html +1 -1
- data/doc/Enhanced.html +1 -1
- data/doc/EnhancedErrors.html +350 -382
- data/doc/EnhancedExceptionContext.html +397 -0
- data/doc/Exception.html +9 -139
- data/doc/ExceptionBindingInfos.html +255 -0
- data/doc/Minitest.html +1 -1
- data/doc/_index.html +16 -1
- data/doc/class_list.html +1 -1
- data/doc/file.README.html +3 -3
- data/doc/index.html +3 -3
- data/doc/method_list.html +87 -39
- data/doc/top-level-namespace.html +3 -3
- data/enhanced_errors.gemspec +1 -1
- data/examples/demo_rspec.rb +0 -4
- data/lib/enhanced/context.rb +7 -0
- data/lib/enhanced/enhanced_exception_context.rb +47 -0
- data/lib/enhanced/exception.rb +15 -5
- data/lib/enhanced_errors.rb +20 -44
- metadata +8 -3
data/lib/enhanced_errors.rb
CHANGED
@@ -24,7 +24,7 @@ class EnhancedErrors
|
|
24
24
|
attr_accessor :enabled, :config_block, :on_capture_hook, :eligible_for_capture, :exception_trace, :override_messages
|
25
25
|
|
26
26
|
GEMS_REGEX = %r{[\/\\]gems[\/\\]}
|
27
|
-
|
27
|
+
DEFAULT_MAX_CAPTURE_LENGTH = 2500
|
28
28
|
MAX_BINDING_INFOS = 3
|
29
29
|
|
30
30
|
RSPEC_SKIP_LIST = [
|
@@ -87,7 +87,7 @@ class EnhancedErrors
|
|
87
87
|
RSPEC_HANDLER_NAMES = ['RSpec::Expectations::PositiveExpectationHandler', 'RSpec::Expectations::NegativeExpectationHandler']
|
88
88
|
|
89
89
|
@enabled = nil
|
90
|
-
@
|
90
|
+
@max_capture_length = nil
|
91
91
|
@capture_rescue = nil
|
92
92
|
@skip_list = nil
|
93
93
|
@capture_events = nil
|
@@ -131,18 +131,21 @@ class EnhancedErrors
|
|
131
131
|
mutex.synchronize { @max_capture_events || -1 }
|
132
132
|
end
|
133
133
|
|
134
|
+
|
135
|
+
def max_capture_length
|
136
|
+
mutex.synchronize { @max_capture_length || DEFAULT_MAX_CAPTURE_LENGTH }
|
137
|
+
end
|
138
|
+
|
139
|
+
def max_capture_length=(val)
|
140
|
+
mutex.synchronize { @max_capture_length = value }
|
141
|
+
end
|
142
|
+
|
134
143
|
def max_capture_events=(value)
|
135
144
|
mutex.synchronize do
|
136
145
|
@max_capture_events = value
|
137
146
|
end
|
138
147
|
end
|
139
148
|
|
140
|
-
def enforce_capture_limit
|
141
|
-
exceeded = capture_limit_exceeded?
|
142
|
-
disable_capturing! if capture_limit_exceeded?
|
143
|
-
exceeded
|
144
|
-
end
|
145
|
-
|
146
149
|
def capture_limit_exceeded?
|
147
150
|
mutex.synchronize do
|
148
151
|
max_capture_events > 0 && capture_events_count >= max_capture_events
|
@@ -158,13 +161,6 @@ class EnhancedErrors
|
|
158
161
|
end
|
159
162
|
end
|
160
163
|
|
161
|
-
def increment_capture_events_count
|
162
|
-
mutex.synchronize do
|
163
|
-
@capture_events_count ||= 0
|
164
|
-
@max_capture_events ||= -1
|
165
|
-
@capture_events_count += 1
|
166
|
-
end
|
167
|
-
end
|
168
164
|
|
169
165
|
def reset!
|
170
166
|
mutex.synchronize do
|
@@ -179,17 +175,6 @@ class EnhancedErrors
|
|
179
175
|
end
|
180
176
|
end
|
181
177
|
|
182
|
-
def max_length(value = nil)
|
183
|
-
mutex.synchronize do
|
184
|
-
if value.nil?
|
185
|
-
@max_length ||= DEFAULT_MAX_LENGTH
|
186
|
-
else
|
187
|
-
@max_length = value
|
188
|
-
end
|
189
|
-
@max_length
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
178
|
def skip_list
|
194
179
|
mutex.synchronize do
|
195
180
|
@skip_list ||= DEFAULT_SKIP_LIST
|
@@ -202,30 +187,27 @@ class EnhancedErrors
|
|
202
187
|
when nil
|
203
188
|
return nil
|
204
189
|
when RSpec::Core::MultipleExceptionError
|
205
|
-
|
190
|
+
exception_obj.all_exceptions.each do |exception|
|
191
|
+
override_exception_message(exception, binding_or_bindings)
|
192
|
+
end
|
206
193
|
else
|
207
194
|
override_exception_message(exception_obj, binding_or_bindings)
|
208
195
|
end
|
209
|
-
|
210
196
|
end
|
211
197
|
|
212
198
|
def override_exception_message(exception, binding_or_bindings)
|
213
|
-
return nil unless exception
|
214
|
-
|
199
|
+
return nil unless exception && exception.respond_to?(:message)
|
200
|
+
test_binding = !(binding_or_bindings.nil? || binding_or_bindings.empty?)
|
215
201
|
exception_binding = (exception.binding_infos.length > 0)
|
216
202
|
has_message = !(exception.respond_to?(:unaltered_message))
|
217
|
-
return nil unless (
|
203
|
+
return nil unless (test_binding || exception_binding) && has_message
|
218
204
|
|
219
205
|
variable_str = EnhancedErrors.format(binding_or_bindings)
|
220
206
|
message_str = exception.message
|
221
|
-
if exception.respond_to?(:captured_variables) && !message_str.include?(exception.captured_variables)
|
222
|
-
message_str += exception.captured_variables
|
223
|
-
end
|
224
207
|
exception.define_singleton_method(:unaltered_message) { message_str }
|
225
208
|
exception.define_singleton_method(:message) do
|
226
209
|
"#{message_str}#{variable_str}"
|
227
210
|
end
|
228
|
-
exception
|
229
211
|
end
|
230
212
|
|
231
213
|
def add_to_skip_list(*vars)
|
@@ -304,13 +286,12 @@ class EnhancedErrors
|
|
304
286
|
end
|
305
287
|
|
306
288
|
def start_minitest_binding_capture
|
307
|
-
|
289
|
+
EnhancedExceptionContext.clear_all
|
308
290
|
@enabled = true if @enabled.nil?
|
309
291
|
mutex.synchronize do
|
310
292
|
@minitest_trace = TracePoint.new(:return) do |tp|
|
311
293
|
next unless tp.method_id.to_s.start_with?('test_') && is_a_minitest?(tp.defined_class)
|
312
294
|
@minitest_test_binding = tp.binding
|
313
|
-
increment_capture_events_count
|
314
295
|
end
|
315
296
|
@minitest_trace.enable
|
316
297
|
end
|
@@ -339,7 +320,6 @@ class EnhancedErrors
|
|
339
320
|
end
|
340
321
|
|
341
322
|
def start_rspec_binding_capture
|
342
|
-
return if enforce_capture_limit
|
343
323
|
@enabled = true if @enabled.nil?
|
344
324
|
mutex.synchronize do
|
345
325
|
@rspec_example_binding = nil
|
@@ -357,10 +337,8 @@ class EnhancedErrors
|
|
357
337
|
next
|
358
338
|
end
|
359
339
|
next unless @capture_next_binding
|
360
|
-
|
361
340
|
if @capture_next_binding == :next || @capture_next_binding == :next_matching && is_rspec_example?(tp)
|
362
341
|
@capture_next_binding = false
|
363
|
-
increment_capture_events_count
|
364
342
|
@rspec_example_binding = tp.binding
|
365
343
|
end
|
366
344
|
elsif tp.event == :raise
|
@@ -385,7 +363,7 @@ class EnhancedErrors
|
|
385
363
|
binding_info = convert_binding_to_binding_info(@rspec_example_binding) if @rspec_example_binding
|
386
364
|
@capture_next_binding = false
|
387
365
|
@rspec_example_binding = nil
|
388
|
-
binding_info
|
366
|
+
return binding_info
|
389
367
|
end
|
390
368
|
end
|
391
369
|
|
@@ -587,7 +565,7 @@ class EnhancedErrors
|
|
587
565
|
end
|
588
566
|
|
589
567
|
mutex.synchronize do
|
590
|
-
max_len = @
|
568
|
+
max_len = @max_capture_length || DEFAULT_MAX_CAPTURE_LENGTH
|
591
569
|
if result.length > max_len
|
592
570
|
result = result[0...max_len] + "... (truncated)"
|
593
571
|
end
|
@@ -605,7 +583,6 @@ class EnhancedErrors
|
|
605
583
|
def handle_tracepoint_event(tp)
|
606
584
|
# Check enabled outside the synchronized block for speed, but still safe due to re-check inside.
|
607
585
|
return unless enabled
|
608
|
-
return if enforce_capture_limit
|
609
586
|
return if Thread.current[:enhanced_errors_processing] || Thread.current[:on_capture] || ignored_exception?(tp.raised_exception)
|
610
587
|
|
611
588
|
Thread.current[:enhanced_errors_processing] = true
|
@@ -681,7 +658,6 @@ class EnhancedErrors
|
|
681
658
|
|
682
659
|
if binding_info
|
683
660
|
binding_info = validate_binding_format(binding_info)
|
684
|
-
increment_capture_events_count
|
685
661
|
if binding_info && exception.binding_infos.length >= MAX_BINDING_INFOS
|
686
662
|
exception.binding_infos.delete_at(MAX_BINDING_INFOS / 2.round)
|
687
663
|
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:
|
4
|
+
version: 3.0.0
|
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-12-
|
11
|
+
date: 2024-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_print
|
@@ -84,12 +84,15 @@ files:
|
|
84
84
|
- benchmark/benchmark.rb
|
85
85
|
- benchmark/memory_bench.rb
|
86
86
|
- benchmark/stackprofile.rb
|
87
|
+
- doc/Context.html
|
87
88
|
- doc/Enhanced.html
|
88
89
|
- doc/Enhanced/Colors.html
|
89
90
|
- doc/Enhanced/Integrations.html
|
90
91
|
- doc/Enhanced/Integrations/RSpecErrorFailureMessage.html
|
91
92
|
- doc/EnhancedErrors.html
|
93
|
+
- doc/EnhancedExceptionContext.html
|
92
94
|
- doc/Exception.html
|
95
|
+
- doc/ExceptionBindingInfos.html
|
93
96
|
- doc/Minitest.html
|
94
97
|
- doc/_index.html
|
95
98
|
- doc/class_list.html
|
@@ -113,6 +116,8 @@ files:
|
|
113
116
|
- examples/demo_minitest.rb
|
114
117
|
- examples/demo_rspec.rb
|
115
118
|
- lib/enhanced/colors.rb
|
119
|
+
- lib/enhanced/context.rb
|
120
|
+
- lib/enhanced/enhanced_exception_context.rb
|
116
121
|
- lib/enhanced/exception.rb
|
117
122
|
- lib/enhanced/minitest_patch.rb
|
118
123
|
- lib/enhanced_errors.rb
|
@@ -136,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
136
141
|
- !ruby/object:Gem::Version
|
137
142
|
version: '0'
|
138
143
|
requirements: []
|
139
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.3.26
|
140
145
|
signing_key:
|
141
146
|
specification_version: 4
|
142
147
|
summary: Automatically enhance your errors with messages containing variable values
|