probatio_diabolica 0.4.0 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pr_d/version.rb +1 -1
  3. data/lib/pr_d.rb +57 -5
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37a15e717233a9bbef0f7fcd533b7984081ea3e9aaee1e4effd1ecd10bd1a7f2
4
- data.tar.gz: 026bfae9103c3a5f1747b8f0ef14a0ab859a46fda53340d7140645d71197c86e
3
+ metadata.gz: 86e99563f7268abd22cb2aefb8bf9b932ffc22b54564a99e231c1eb9d0282aee
4
+ data.tar.gz: 3a7cf8e9a34e830df9999976bfcc2c0298e76d7aef8494038bdc9ca369318761
5
5
  SHA512:
6
- metadata.gz: 96c9fa6473dc6f5b94e9474fb5d4855c38c147c8872075945231c91fdf82cadd1280718da6010a76711efb80168cfbc281c4cfa5c4158cba37e3a9da88fbee6c
7
- data.tar.gz: dc201873849d9e2e80bdff375c0e185cb1acfe8440b418170327ea8e416c29faaf9316f02f44913818ed6da8205e87aef12a0b106325be95d2e9e56bf582db06
6
+ metadata.gz: cf9e2016027998b4ae11312b17bfc94b55f540acbff985de714d5aff433855b72bbd5845c1bab2ba531dd3c661cb2656d65046dcd7d7807abb09af3b278742fc
7
+ data.tar.gz: 87be48c549b49ac867e86e90b7b38a0b83211d40359aa30c59f0eec2ea288884e4879a69346535a722d3d6671d81c15c6fbe1ba03e796951c09a4c7fed261b1b
data/lib/pr_d/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PrD
4
- VERSION = "0.4.0"
4
+ VERSION = "0.4.3"
5
5
  end
data/lib/pr_d.rb CHANGED
@@ -105,6 +105,8 @@ module PrD
105
105
  @subject_definition_stack << @subject_definition_stack.last
106
106
 
107
107
  instance_eval(&block)
108
+ rescue StandardError => e
109
+ report_context_execution_error(e, description:)
108
110
  ensure
109
111
  @subject_definition_stack.pop
110
112
  @hook_scopes.pop
@@ -119,7 +121,7 @@ module PrD
119
121
  after_hooks = collect_after_hooks
120
122
 
121
123
  begin
122
- description ||= @tests.split("\n")[block.source_location.last - 1].strip
124
+ description ||= infer_example_description(block)
123
125
  @models_stack.push(model) if model
124
126
  @formatter.it(description, &block) if @verbose
125
127
  @formatter.increment_level
@@ -155,19 +157,36 @@ module PrD
155
157
  end
156
158
 
157
159
  def let(name, &block)
158
- block_result = block.call
160
+ block_result = nil
161
+ let_error = nil
162
+
163
+ begin
164
+ block_result = block.call
165
+ rescue StandardError => e
166
+ let_error = e
167
+ end
159
168
 
160
169
  if @verbose
170
+ rendered_value =
171
+ if let_error
172
+ "Error while evaluating let(:#{name}): #{let_error.class}: #{let_error.message}"
173
+ else
174
+ block_result
175
+ end
161
176
  formatter_let_arity = @formatter.method(:let).arity
162
177
  if formatter_let_arity == 1
163
- @formatter.let(block_result)
178
+ @formatter.let(rendered_value)
164
179
  else
165
- @formatter.let(name, block_result)
180
+ @formatter.let(name, rendered_value)
166
181
  end
167
182
  end
168
183
 
169
184
  instance_variable_set("@#{name}", block_result)
170
185
  define_singleton_method(name) do
186
+ if let_error
187
+ raise let_error.class, let_error.message, let_error.backtrace
188
+ end
189
+
171
190
  record_let_access(name, block_result, callsite: caller_locations(1, 1).first)
172
191
  block_result
173
192
  end
@@ -268,7 +287,14 @@ module PrD
268
287
  raise ArgumentError, 'No tests found. Provide at least one spec content to run.' if tests.nil? || tests.empty?
269
288
 
270
289
  @tests = tests
271
- @tests.each { |test| instance_eval(test) }
290
+ @tests.each_with_index do |test_source, index|
291
+ @current_test_source = test_source
292
+ instance_eval(test_source)
293
+ rescue StandardError => e
294
+ report_spec_source_execution_error(e, source_index: index + 1)
295
+ ensure
296
+ @current_test_source = nil
297
+ end
272
298
  rescue StandardError => e
273
299
  $stderr.puts "An error occurred while running tests: #{e.message}"
274
300
  $stderr.puts e.backtrace.join("\n")
@@ -377,6 +403,18 @@ module PrD
377
403
  @hook_scopes.last
378
404
  end
379
405
 
406
+ def infer_example_description(block)
407
+ return nil if block.nil?
408
+ return nil if @current_test_source.nil?
409
+
410
+ line_number = block.source_location&.last
411
+ return nil if line_number.nil?
412
+
413
+ @current_test_source.lines[line_number - 1]&.strip
414
+ rescue StandardError
415
+ nil
416
+ end
417
+
380
418
  def collect_before_hooks
381
419
  @hook_scopes.flat_map { |scope| scope[:before] }
382
420
  end
@@ -404,6 +442,20 @@ module PrD
404
442
  @failed_count += 1
405
443
  end
406
444
 
445
+ def report_context_execution_error(error, description:)
446
+ $stderr.puts "An error occurred while executing context '#{description}': #{error.message}"
447
+ $stderr.puts error.backtrace.join("\n")
448
+ @formatter.failure_result("Context '#{description}' failed at #{formatted_time} with error message: #{error.message}")
449
+ @failed_count += 1
450
+ end
451
+
452
+ def report_spec_source_execution_error(error, source_index:)
453
+ $stderr.puts "An error occurred while loading spec source ##{source_index}: #{error.message}"
454
+ $stderr.puts error.backtrace.join("\n")
455
+ @formatter.failure_result("Spec source ##{source_index} failed at #{formatted_time} with error message: #{error.message}")
456
+ @failed_count += 1
457
+ end
458
+
407
459
  def process_test_result(result)
408
460
  unless result.respond_to?(:pass)
409
461
  raise NoMethodError, 'Test example must return a matcher result. Use expect(...).to(...) or expect(...).not_to(...).'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: probatio_diabolica
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laporte Mathieu