Module: RSpec::Rewind::Backoff

Defined in:
lib/rspec/rewind/backoff.rb

Class Method Summary collapse

Class Method Details

.exponential(base:, factor: 2.0, max: nil, jitter: 0.0, rng: Kernel, min_factor: 0.0) ⇒ Object

Raises:

  • (ArgumentError)


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