diff --git a/lib/gh/retry.rb b/lib/gh/retry.rb index 34ee5f5..857cf45 100644 --- a/lib/gh/retry.rb +++ b/lib/gh/retry.rb @@ -7,29 +7,34 @@ module GH class Retry < Wrapper DEFAULTS = { retries: 5, - sleep: 1 + wait: 1 } - def [](key, opts = {}) - generate_response key, fetch_resource(key, opts) + attr_accessor :retries, :wait + + def initialize(backend = nil, options = {}) + options = DEFAULTS.merge options + super backend, options end - def fetch_resource(key, opts = {}) - opts = DEFAULTS.merge opts - retries, sleep_time = opts[:retries], opts[:sleep] + def fetch_resource(key) begin - retries -= 1 - super(key) + decrement_retries! + super key rescue GH::Error(response_status: 404) => e - raise(e) unless retries_remaining?(retries) - sleep sleep_time - fetch_resource key, retries: retries, sleep: sleep_time + retries_remaining? or raise e + sleep wait + fetch_resource key end end private - def retries_remaining?(retries) + def decrement_retries! + self.retries = self.retries - 1 + end + + def retries_remaining? retries > 0 end end diff --git a/spec/retry_spec.rb b/spec/retry_spec.rb index 4d0f6d6..0615780 100644 --- a/spec/retry_spec.rb +++ b/spec/retry_spec.rb @@ -14,10 +14,10 @@ def fetch_resource(key) end end - before { subject.backend = not_finder.new } + subject { described_class.new(not_finder.new, retries: 3, wait: 0.1) } it 'retries request specified number of times' do - expect { subject['users/not-found', retries: 3, sleep: 0.1] }.to raise_error(GH::Error) + expect { subject['users/not-found'] }.to raise_error(GH::Error) expect(subject.backend.requests.count).to eq 3 end