block_repeater 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f94ed1fef785fdbd5a8f8f6810406a6a610be84fd551886b3e8b4784b7f47402
4
- data.tar.gz: 4bace96bec87f17aacbc235907af48e5dfd641f1ff2f0c4126b95dff79f04fd1
3
+ metadata.gz: 5e3926f813063452596a76a2849a30a37d0ca1c16e59061cf2bde4e33f930a7a
4
+ data.tar.gz: cb16a69e2a7ca8302d1d45fd2278c6dbe4d405b88efb95df3acc2806fe109287
5
5
  SHA512:
6
- metadata.gz: be8d84eacb5b9397e6c47757fb68a06bb4c039cf6632230b68e44abffbb22b6d040b45f5b238220f12d25969e028a80228479f4afb0ba2a9ddebc71bf0ccaa43
7
- data.tar.gz: 61437b317664440b00db72f3b8cb3e20d4d3da18281b9c9e6a87252a29200c622036e3bd824b3d077063208b7d6ff07ca4683498bd442fae913a36ce63530afc
6
+ metadata.gz: 46b55edc17c35928ae37d40b41d07830dcdfcaef3c42859b12ff69e7acdf5b229dd43e4c80512a0c3129b66085189139cbadf364238f176e62b0a66e3e28b7ea
7
+ data.tar.gz: c3d24fdc65de04ca0a75432dd74dfe2e6fc5cdacbd4b9e7a309b83721cce9569458114ccac7cc5f342bb456768e4734cc7c2742d554b63f42ff350e62d063a32
@@ -3,15 +3,13 @@ name: Ruby Gem
3
3
  on:
4
4
  push:
5
5
  branches: [ "master" ]
6
- pull_request:
7
- branches: [ "master" ]
8
6
 
9
7
  jobs:
10
8
  test:
11
9
  runs-on: ubuntu-latest
12
10
  strategy:
13
11
  matrix:
14
- ruby-version: [ '3.0', '3.1' ]
12
+ ruby-version: [ '3.0', '3.1', '3.2' ]
15
13
 
16
14
  steps:
17
15
  - uses: actions/checkout@v2
data/.gitignore CHANGED
@@ -9,3 +9,7 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+
13
+ # jetbrains directories
14
+ /.idea
15
+ /.DS_Store
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- block_repeater (1.0.0)
4
+ block_repeater (1.1.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -50,6 +50,22 @@ The repeater also takes two parameters:
50
50
  repeat (delay: 0.5, times: 10){ call_database_method }.until{ |result| result.count.positive? }
51
51
  ```
52
52
 
53
+ ### Backoff method
54
+ This is a slightly different take on the preferred `repeat` method. It retries a call whilst exponentially increasing the wait time between each iteration until a timeout is reached.
55
+
56
+ ```ruby
57
+ repeat do
58
+ call_method
59
+ end.until do |result|
60
+ result
61
+ end.backoff(timeout: 10, initial_wait: 0.5, multiplier: 2)
62
+ ```
63
+
64
+ `backoff` takes three paramaters:
65
+ - `timeout:` is how long you want your repeater to run
66
+ - `initial_wait:` is how long you want to pause before your first retry
67
+ - `multiplier:` is the rate at which you increase the wait time between each iteration
68
+
53
69
  ### Exception Handling
54
70
  Using the `catch` method you can define how the repeater should respond to specific exception types. To do this you need to provide a list of exceptions to catch, a block of code which will be performed, and an option for how to trigger than block of code.
55
71
 
@@ -45,8 +45,8 @@ module BlockRepeater
45
45
  deferred_exception = nil
46
46
  rescue *exception_types => e
47
47
  exceptions = if anticipated_exception_types.any? do |ex|
48
- e.class <= ex
49
- end
48
+ e.class <= ex
49
+ end
50
50
  @anticipated_exceptions
51
51
  else
52
52
  @@default_exceptions
@@ -72,6 +72,39 @@ module BlockRepeater
72
72
  result
73
73
  end
74
74
 
75
+ # Retry a call whilst exponentially increasing the wait time between each iteration until a timeout is reached
76
+ # @param [Integer] `timeout` is the max amount wait of time you wish to try the action
77
+ # @param [Integer] `initial_wait` is the initial wait time to retry the action
78
+ # @param [Integer] `multiplier` is the rate at which you increase the wait time between each iteration
79
+ def backoff(timeout: 10, initial_wait: 0.1, multiplier: 2)
80
+ raise StandardError, 'Multiplier cannot be less than 1.1' if multiplier < 1.1
81
+
82
+ condition_met = nil
83
+ result = nil
84
+
85
+ current_sleep_seconds = initial_wait
86
+ start_time = Time.now
87
+
88
+ until current_sleep_seconds >= timeout
89
+ result = @repeat_block.call
90
+ condition_met = @condition_block.call(result) if @condition_block
91
+
92
+ duration = Time.now - start_time
93
+
94
+ break if condition_met || duration > timeout
95
+
96
+ # calculating exponential increase
97
+ current_sleep_seconds *= multiplier
98
+ # how long the total duration will be after the next sleep
99
+ projected_duration = current_sleep_seconds + duration
100
+ # if projected duration exceeds the timeout, reduce time for next sleep to allow one final call
101
+ current_sleep_seconds = (timeout - duration) if projected_duration > timeout
102
+
103
+ sleep(current_sleep_seconds)
104
+ end
105
+ result
106
+ end
107
+
75
108
  ##
76
109
  # Determine how to respond to exceptions raised while repeating, must be called _before_ #until
77
110
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BlockRepeater
4
- VERSION = '1.0.0'
4
+ VERSION = '1.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: block_repeater
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Bray
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-04 00:00:00.000000000 Z
11
+ date: 2023-08-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bump
@@ -126,7 +126,7 @@ licenses:
126
126
  metadata:
127
127
  homepage_uri: https://github.com/dvla/block-repeater
128
128
  source_code_uri: https://github.com/dvla/block-repeater
129
- post_install_message:
129
+ post_install_message:
130
130
  rdoc_options: []
131
131
  require_paths:
132
132
  - lib
@@ -141,8 +141,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0'
143
143
  requirements: []
144
- rubygems_version: 3.4.10
145
- signing_key:
144
+ rubygems_version: 3.2.15
145
+ signing_key:
146
146
  specification_version: 4
147
147
  summary: Conditionally repeat a block of code
148
148
  test_files: []