-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
retry on retryable errors (500s and ConnectionError)
* retry on retryable errors (500s and ConnectionError) * remove Gemfile.lock
- Loading branch information
1 parent
1fcaddf
commit 4bab854
Showing
13 changed files
with
190 additions
and
169 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
# frozen_string_literal: true | ||
|
||
module FrederickAPI | ||
module V2 | ||
module Helpers | ||
# Custom paginator for json api client | ||
# Fixes param names for pagination | ||
# Also adds ability to get all records from a paginated API | ||
class Paginator < JsonApiClient::Paginating::Paginator | ||
self.page_param = 'page.number' | ||
self.per_page_param = 'page.size' | ||
|
||
def all_records | ||
current_result_set = nil | ||
results = self.result_set.to_a | ||
first_resource = self.result_set.first | ||
|
||
(total_pages - current_page).times do | ||
first_resource.class.with_headers(first_resource.custom_headers) do | ||
current_result_set = current_result_set ? current_result_set.pages.next : self.result_set.pages.next | ||
raise 'next link not found' unless current_result_set | ||
results.push(*current_result_set.to_a) | ||
end | ||
end | ||
|
||
results | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'active_support/core_ext/module' | ||
|
||
module FrederickAPI | ||
module V2 | ||
module Helpers | ||
# Used to convert nested params to dot notation for Frederick API | ||
class QueryBuilder < JsonApiClient::Query::Builder | ||
def params | ||
to_dot_params( | ||
filter_params.merge(pagination_params.merge(includes_params).merge(select_params)) | ||
).merge(order_params) | ||
.merge(primary_key_params) | ||
.merge(path_params) | ||
.merge(additional_params) | ||
end | ||
|
||
def to_dot_params(object, prefix = nil) | ||
return {} if object == {} | ||
|
||
if object.is_a? Hash | ||
object.map do |key, value| | ||
if prefix | ||
to_dot_params value, "#{prefix}.#{key}" | ||
else | ||
to_dot_params value, key.to_s | ||
end | ||
end.reduce(&:merge) | ||
else | ||
{ prefix => object } | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# frozen_string_literal: true | ||
|
||
module FrederickAPI | ||
module V2 | ||
module Helpers | ||
# Requestor for v2 client to use built on top of JsonApiClient::Query::Requestor | ||
class Requestor < JsonApiClient::Query::Requestor | ||
# Retry once on unhandled server errors | ||
def request(type, path, params) | ||
super | ||
rescue JsonApiClient::Errors::ConnectionError, JsonApiClient::Errors::ServerError => ex | ||
raise ex if ex.is_a?(JsonApiClient::Errors::NotFound) || ex.is_a?(JsonApiClient::Errors::Conflict) | ||
super | ||
end | ||
end | ||
end | ||
end | ||
end |
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,5 +2,5 @@ | |
|
||
module FrederickAPI | ||
# Current gem version | ||
VERSION = '0.1.4' | ||
VERSION = '0.1.5' | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper' | ||
|
||
describe FrederickAPI::V2::Helpers::Requestor do | ||
let(:superklass) { JsonApiClient::Query::Requestor } | ||
let(:requestor) { described_class.new(String) } | ||
|
||
it 'has right superclass' do | ||
expect(described_class.superclass).to eq superklass | ||
end | ||
|
||
describe '#request' do | ||
let(:error) {} | ||
let(:type) { 'type' } | ||
let(:path) { 'path' } | ||
let(:param) { 'param' } | ||
let(:request_args) { [type, path, param] } | ||
let(:super_instance) { superklass.new(String) } | ||
let(:super_request_call_args) { [] } | ||
let(:request_return) { 'request_return' } | ||
|
||
before do | ||
allow_any_instance_of(superklass).to receive(:request) do |*args| | ||
super_request_call_args << args[1..-1] | ||
raise(error) if super_request_call_args.length == 1 && error | ||
request_return | ||
end | ||
end | ||
|
||
it 'calls request only once if there is no error' do | ||
expect(requestor.send(:request, *request_args)).to eq request_return | ||
expect(super_request_call_args).to eq [request_args] | ||
end | ||
|
||
context 'JsonApiClient::Errors::ServerError' do | ||
let(:error) { JsonApiClient::Errors::ServerError.new('foo') } | ||
|
||
it 'calls request twice' do | ||
expect(requestor.send(:request, *request_args)).to eq request_return | ||
expect(super_request_call_args).to eq [request_args, request_args] | ||
end | ||
end | ||
|
||
context 'JsonApiClient::Errors::ConnectionError' do | ||
let(:error) { JsonApiClient::Errors::ConnectionError.new('foo') } | ||
|
||
it 'calls request twice' do | ||
expect(requestor.send(:request, *request_args)).to eq request_return | ||
expect(super_request_call_args).to eq [request_args, request_args] | ||
end | ||
end | ||
|
||
context 'JsonApiClient::Errors::NotFound' do | ||
let(:error) { JsonApiClient::Errors::NotFound.new('foo') } | ||
|
||
it 'calls request only once, and does not rescue error' do | ||
expect { requestor.send(:request, *request_args) }.to raise_error error | ||
expect(super_request_call_args).to eq [request_args] | ||
end | ||
end | ||
|
||
context 'JsonApiClient::Errors::Conflict' do | ||
let(:error) { JsonApiClient::Errors::Conflict.new('foo') } | ||
|
||
it 'calls request only once, and does not rescue error' do | ||
expect { requestor.send(:request, *request_args) }.to raise_error error | ||
expect(super_request_call_args).to eq [request_args] | ||
end | ||
end | ||
|
||
context 'other error raised' do | ||
let(:error) { StandardError.new('foo') } | ||
|
||
it 'calls request only once, and does not rescue error' do | ||
expect { requestor.send(:request, *request_args) }.to raise_error error | ||
expect(super_request_call_args).to eq [request_args] | ||
end | ||
end | ||
end | ||
end |
Oops, something went wrong.