retryable 3.0.0 → 3.0.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d2cf59f84731d2def08398714a4366b4b92d15eb
4
- data.tar.gz: 391c2797ed522cc3a95c2d767335eb3bbb50a105
2
+ SHA256:
3
+ metadata.gz: 441e4e21d1cbf851bc4ce28f99774b1b0e0058920f401926259b08d311fc6f4d
4
+ data.tar.gz: 0c7b6ec7ac61587f68c4186405e00b4f2021558520b692ebe6b013503bccf97d
5
5
  SHA512:
6
- metadata.gz: 7c5df44eb01cc472a8e4f1dc41469b02af8f062fa11290f4cf00481621cdd0e66e5caf93eeef46a2504d9e9fe858c3905d4d1ca479676785b99590668c4dc848
7
- data.tar.gz: 3c60ad3b26e1af54e5c411d525d3edc271cfb2bf5302f67d2bdc043af649f519cc31d97c1374cdee188d1db7b83eef3db85a4e4b76bafe383b53c3d667240990
6
+ metadata.gz: 9ff21470b65d4037e2cc88b00f8404d72327cb3891fde218794242b76b7e7d90de8c1e6cb88756effe70886a84d515efb0c08ac4f491962b85f2689423e44d87
7
+ data.tar.gz: bcc68f82b11fae2876ae81730c5d953291428b8524dc68e221961666375216004ed447af9ad3eac1b1f7342eb110ab1597320c3a0469afcad4e276383262958d
@@ -1,3 +1,7 @@
1
+ ## Retryable 3.0.1 ##
2
+
3
+ * :matching param from now on could be called in form of array with multiple matching conditions. This version is backwards compatible with 3.0.0
4
+
1
5
  ## Retryable 3.0.0 ##
2
6
  NOTE: this version is backwards compatible with 2.0.4 version unless you're running it against Ruby 1.8 version.
3
7
 
data/README.md CHANGED
@@ -91,7 +91,7 @@ end
91
91
  exception_cb: proc { },
92
92
  not: [],
93
93
  sleep_method: lambda { |n| Kernel.sleep(n) },
94
- contexts = {}
94
+ contexts: {}
95
95
 
96
96
  Retryable also could be configured globally to change those defaults:
97
97
 
@@ -128,6 +128,11 @@ You can also retry based on the exception message:
128
128
  Retryable.retryable(matching: /IO timeout/) do |retries, exception|
129
129
  raise "oops IO timeout!" if retries == 0
130
130
  end
131
+
132
+ #matching param supports array format as well:
133
+ Retryable.retryable(matching: [/IO timeout/, "IO tymeout"]) do |retries, exception|
134
+ raise "oops IO timeout!" if retries == 0
135
+ end
131
136
  ```
132
137
 
133
138
  Block Parameters
@@ -60,8 +60,10 @@ module Retryable
60
60
 
61
61
  return if opts[:tries] == 0
62
62
 
63
- on_exception = [opts[:on]].flatten
64
- not_exception = [opts[:not]].flatten
63
+ on_exception = opts[:on].is_a?(Array) ? opts[:on] : [opts[:on]]
64
+ not_exception = opts[:not].is_a?(Array) ? opts[:not] : [opts[:not]]
65
+
66
+ matching = [opts[:matching]].flatten
65
67
  tries = opts[:tries]
66
68
  retries = 0
67
69
  retry_exception = nil
@@ -72,7 +74,7 @@ module Retryable
72
74
  raise
73
75
  rescue *on_exception => exception
74
76
  raise unless configuration.enabled?
75
- raise unless exception.message =~ opts[:matching]
77
+ raise unless matches?(exception.message, matching)
76
78
  raise if tries != :infinite && retries + 1 >= tries
77
79
 
78
80
  # Interrupt Exception could be raised while sleeping
@@ -100,5 +102,18 @@ module Retryable
100
102
  return if invalid_options.empty?
101
103
  raise ArgumentError, "[Retryable] Invalid options: #{invalid_options.join(', ')}"
102
104
  end
105
+
106
+ def matches?(message, candidates)
107
+ candidates.any? do |candidate|
108
+ case candidate
109
+ when String
110
+ message.include?(candidate)
111
+ when Regexp
112
+ message =~ candidate
113
+ else
114
+ raise ArgumentError, ":matches must be a string or regex"
115
+ end
116
+ end
117
+ end
103
118
  end
104
119
  end
@@ -15,7 +15,7 @@ module Retryable
15
15
 
16
16
  # @return [Integer]
17
17
  def patch
18
- 0
18
+ 1
19
19
  end
20
20
 
21
21
  # @return [Hash]
@@ -57,6 +57,13 @@ RSpec.describe Retryable do
57
57
  expect(counter.count).to eq(2)
58
58
  end
59
59
 
60
+ it 'does not retry on :not exception which is covered by Array' do
61
+ expect do
62
+ counter(not: [RuntimeError, IndexError]) { |tries| raise RuntimeError if tries < 1 }
63
+ end.to raise_error RuntimeError
64
+ expect(counter.count).to eq(1)
65
+ end
66
+
60
67
  it 'does not try on unexpected exception' do
61
68
  allow(Kernel).to receive(:sleep)
62
69
  expect do
@@ -117,6 +124,16 @@ RSpec.describe Retryable do
117
124
  expect(counter.count).to eq(1)
118
125
  end
119
126
 
127
+ it 'catches an exception in the list of matches' do
128
+ expect(Kernel).to receive(:sleep).once.with(1)
129
+ counter(matching: [/IO timeout/, "IO tymeout"]) { |c, _e| raise 'yo, IO timeout!' if c == 0 }
130
+ expect(counter.count).to eq(2)
131
+
132
+ expect(Kernel).to receive(:sleep).once.with(1)
133
+ counter(matching: [/IO timeout/, "IO tymeout"]) { |c, _e| raise 'yo, IO tymeout!' if c == 0 }
134
+ expect(counter.count).to eq(4)
135
+ end
136
+
120
137
  it 'does not allow invalid options' do
121
138
  expect do
122
139
  described_class.retryable(bad_option: 2) { raise 'this is bad' }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: retryable
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Fedyashev
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-01-09 00:00:00.000000000 Z
13
+ date: 2018-04-11 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -68,7 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
68
  version: 1.3.6
69
69
  requirements: []
70
70
  rubyforge_project:
71
- rubygems_version: 2.4.5.2
71
+ rubygems_version: 2.7.3
72
72
  signing_key:
73
73
  specification_version: 4
74
74
  summary: Retrying code blocks in Ruby