Module: RSpec::Rewind::Backoff
- Defined in:
- lib/rspec/rewind/backoff.rb
Class Method Summary collapse
- .exponential(base:, factor: 2.0, max: nil, jitter: 0.0, rng: Kernel, min_factor: 0.0) ⇒ Object
- .fixed(seconds) ⇒ Object
- .linear(step:, max: nil) ⇒ Object
Class Method Details
.exponential(base:, factor: 2.0, max: nil, jitter: 0.0, rng: Kernel, min_factor: 0.0) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/rspec/rewind/backoff.rb', line 23 def exponential(base:, factor: 2.0, max: nil, jitter: 0.0, rng: Kernel, min_factor: 0.0) base_value = normalize_numeric(base, 'base') factor_value = normalize_numeric(factor, 'factor') min_factor_value = normalize_numeric(min_factor, 'min_factor') jitter_value = normalize_numeric(jitter, 'jitter') max_value = max.nil? ? nil : normalize_numeric(max, 'max') raise ArgumentError, "factor must be >= #{min_factor_value}" if factor_value < min_factor_value lambda do |retry_number:, **_| exponent = [retry_number.to_i - 1, 0].max delay = base_value * (factor_value**exponent) delay = clamp(delay, max_value) next delay if jitter_value.zero? spread = delay * jitter_value min_delay = [delay - spread, 0.0].max max_delay = delay + spread clamp((random_value(rng) * (max_delay - min_delay)) + min_delay, max_value) end end |
.fixed(seconds) ⇒ Object
8 9 10 11 |
# File 'lib/rspec/rewind/backoff.rb', line 8 def fixed(seconds) value = normalize_numeric(seconds, 'seconds') ->(**_) { value } end |
.linear(step:, max: nil) ⇒ Object
13 14 15 16 17 18 19 20 21 |
# File 'lib/rspec/rewind/backoff.rb', line 13 def linear(step:, max: nil) step_value = normalize_numeric(step, 'step') max_value = max.nil? ? nil : normalize_numeric(max, 'max') lambda do |retry_number:, **_| delay = step_value * retry_number.to_i clamp(delay, max_value) end end |