Skip to content

Commit

Permalink
Add the exception option to skip retry
Browse files Browse the repository at this point in the history
  • Loading branch information
y-yagi committed Jan 29, 2025
1 parent a35c15c commit d1fe512
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 3 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ Minitest::Retry.use!(
exceptions_to_retry: [], # List of exceptions that will trigger a retry (when empty, all exceptions will).
methods_to_retry: [], # List of methods that will trigger a retry (when empty, all methods will).
classes_to_retry: [], # List of classes that will trigger a retry (when empty, all classes will).
methods_to_skip: [] # List of methods that will skip a retry (when empty, all methods will retry).
methods_to_skip: [], # List of methods that will skip a retry (when empty, all methods will retry).
exceptions_to_skip: [] # List of exceptions that will skip a retry (when empty, all exceptions will retry).
)
```

Expand Down
13 changes: 11 additions & 2 deletions lib/minitest/retry.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
module Minitest
module Retry
class << self
def use!(retry_count: 3, io: $stdout, verbose: true, exceptions_to_retry: [], methods_to_retry: [], classes_to_retry: [], methods_to_skip: [])
@retry_count, @io, @verbose, @exceptions_to_retry, @methods_to_retry, @classes_to_retry, @methods_to_skip = retry_count, io, verbose, exceptions_to_retry, methods_to_retry, classes_to_retry, methods_to_skip
def use!(retry_count: 3, io: $stdout, verbose: true, exceptions_to_retry: [], methods_to_retry: [], classes_to_retry: [], methods_to_skip: [], exceptions_to_skip: [])
@retry_count, @io, @verbose, @exceptions_to_retry, @methods_to_retry, @classes_to_retry, @methods_to_skip, @exceptions_to_skip = retry_count, io, verbose, exceptions_to_retry, methods_to_retry, classes_to_retry, methods_to_skip, exceptions_to_skip
@failure_callback, @consistent_failure_callback, @retry_callback = nil, nil, nil
Minitest.prepend(self)
end
Expand Down Expand Up @@ -64,6 +64,10 @@ def methods_to_skip
@methods_to_skip
end

def exceptions_to_skip
@exceptions_to_skip
end

def failure_to_retry?(failures = [], klass_method_name, klass)
return false if failures.empty?

Expand All @@ -80,6 +84,11 @@ def failure_to_retry?(failures = [], klass_method_name, klass)
return !methods_to_skip.include?(klass_method_name)
end

if exceptions_to_skip.any?
errors = failures.map(&:error).map(&:class)
return !(errors & exceptions_to_skip).any?
end

return true if classes_to_retry.empty?
ancestors = klass.ancestors.map(&:to_s)
return classes_to_retry.any? { |class_to_retry| ancestors.include?(class_to_retry) }
Expand Down
38 changes: 38 additions & 0 deletions test/minitest/retry_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,44 @@ def fail
end
end

def test_retry_when_error_in_exceptions_to_skip
capture_stdout do
retry_test = Class.new(Minitest::Test) do
@@counter = 0
def self.counter
@@counter
end
Minitest::Retry.use! exceptions_to_skip: [TestError]
def raise_test_error
@@counter += 1
raise TestError, 'This does not trigger a retry.'
end
end
Minitest::Runnable.run_one_method(retry_test, :raise_test_error, self.reporter)

assert_equal 1, retry_test.counter
end
end

def test_retry_when_error_not_in_exceptions_to_skip
capture_stdout do
retry_test = Class.new(Minitest::Test) do
@@counter = 0
def self.counter
@@counter
end
Minitest::Retry.use! exceptions_to_skip: [TestError]
def raise_test_error
@@counter += 1
raise ArgumentError, 'This triggers a retry.'
end
end
Minitest::Runnable.run_one_method(retry_test, :raise_test_error, self.reporter)

assert_equal 4, retry_test.counter
end
end

def test_run_failure_callback_on_failure
on_failure_block_has_ran = false
test_name, test_class, retry_test, result_in_callback = nil
Expand Down

0 comments on commit d1fe512

Please sign in to comment.