frederick_api 0.4.6 → 0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +11 -0
- data/lib/frederick_api.rb +2 -0
- data/lib/frederick_api/v2/background_job.rb +36 -0
- data/lib/frederick_api/v2/errors/errors.rb +4 -0
- data/lib/frederick_api/v2/helpers/backgroundable_parser.rb +18 -0
- data/lib/frederick_api/v2/helpers/requestor.rb +13 -4
- data/lib/frederick_api/v2/resource.rb +1 -0
- data/lib/frederick_api/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7131c40a141f015fe0057617182b61268033205cf7c1e12a63e1d89466e0ea5f
|
4
|
+
data.tar.gz: 937cd61c99a614ba7425223d699583e19f24452e554f41ccbf0cd2189616685d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03f21ac6d2f71bed9bcf24e04475555bed790a421978f9ce59ebd84d9c15bfe0a509ad54f4436de1b7a8157409f0394bc39cad7f11f79486e13c4ff7bcbdcdce
|
7
|
+
data.tar.gz: 9f50eb76e2907162c452971f40c135e68bd64ebceb543cd6bef9aaf5b6a30d8dbf3fd525116051e8a93953bb5e71a72187da4be8d159078c145e0366d02a3d86
|
data/README.md
CHANGED
@@ -101,3 +101,14 @@ FrederickAPI::V2::Location.with_access_token(access_token) do
|
|
101
101
|
# => [...]
|
102
102
|
end
|
103
103
|
```
|
104
|
+
### Background Jobs
|
105
|
+
|
106
|
+
FrederickAPI Gem handles asynchronous responses as suggested in
|
107
|
+
[JSONApi Recommendations](https://jsonapi.org/recommendations/#asynchronous-processing)
|
108
|
+
[Asynchronous Processing](https://jsonapi.org/recommendations/#asynchronous-processing).
|
109
|
+
Polling until the job is complete, fetching and returning the completed resource.
|
110
|
+
|
111
|
+
* A FrederickAPI::V2::Errors::BackgroundJobFailure exception is raised if the API returns
|
112
|
+
an error on an asyncronous job.
|
113
|
+
* A BackgroundJob Resource will be returned from the client in the case that a successful
|
114
|
+
job does not return a resources.
|
data/lib/frederick_api.rb
CHANGED
@@ -12,11 +12,13 @@ require 'frederick_api/v2/helpers/has_many'
|
|
12
12
|
require 'frederick_api/v2/helpers/paginator'
|
13
13
|
require 'frederick_api/v2/helpers/query_builder'
|
14
14
|
require 'frederick_api/v2/helpers/requestor'
|
15
|
+
require 'frederick_api/v2/helpers/backgroundable_parser'
|
15
16
|
require 'frederick_api/v2/resource'
|
16
17
|
require 'frederick_api/v2/public_resource'
|
17
18
|
|
18
19
|
require 'frederick_api/v2/user'
|
19
20
|
require 'frederick_api/v2/location'
|
21
|
+
require 'frederick_api/v2/background_job'
|
20
22
|
|
21
23
|
# Public resources
|
22
24
|
require 'frederick_api/v2/business_category'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FrederickAPI
|
4
|
+
module V2
|
5
|
+
# V2 Frederick API async background job class for parsing
|
6
|
+
# background job responses coming from API.
|
7
|
+
class BackgroundJob < Resource
|
8
|
+
attr_accessor :response
|
9
|
+
|
10
|
+
def has_errors?
|
11
|
+
@attributes['status'] == 'error'
|
12
|
+
end
|
13
|
+
|
14
|
+
def retry_after
|
15
|
+
try_time = @response[:headers]['retry-after'].to_i
|
16
|
+
@retry_after ||= try_time > 1 ? try_time : 1
|
17
|
+
end
|
18
|
+
|
19
|
+
def response_code
|
20
|
+
@response_code ||= @response[:status]
|
21
|
+
end
|
22
|
+
|
23
|
+
def status
|
24
|
+
@attributes['status']
|
25
|
+
end
|
26
|
+
|
27
|
+
def errors
|
28
|
+
@attributes['messages']
|
29
|
+
end
|
30
|
+
|
31
|
+
def id
|
32
|
+
@attributes['id']
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -23,6 +23,10 @@ module FrederickAPI
|
|
23
23
|
class BadRequest < Error; end
|
24
24
|
class UnprocessableEntity < Error; end
|
25
25
|
|
26
|
+
# an exception class for when the server reports that a
|
27
|
+
# long running job has failed.
|
28
|
+
class BackgroundJobFailure < Error; end
|
29
|
+
|
26
30
|
ERROR_CODES = {
|
27
31
|
'400' => BadRequest,
|
28
32
|
'422' => UnprocessableEntity
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FrederickAPI
|
4
|
+
module V2
|
5
|
+
module Helpers
|
6
|
+
# Custom Parser for parsing BackgroundJob resources for FrederickAPI V2
|
7
|
+
class BackgroundableParser < ::JsonApiClient::Parsers::Parser
|
8
|
+
def self.parse(klass, response)
|
9
|
+
result_set = super(klass, response)
|
10
|
+
return result_set unless result_set&.first&.type == 'background_jobs'
|
11
|
+
result_set = super(::FrederickAPI::V2::BackgroundJob, response)
|
12
|
+
result_set&.first&.response = { headers: response.headers, status: response.status }
|
13
|
+
result_set
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -33,7 +33,6 @@ module FrederickAPI
|
|
33
33
|
|
34
34
|
params.delete(klass.primary_key)
|
35
35
|
return request(:post, path, params, 'X-Request-Method' => 'GET') if get_via_post_path?(path)
|
36
|
-
|
37
36
|
request(:get, path, params)
|
38
37
|
end
|
39
38
|
|
@@ -49,15 +48,23 @@ module FrederickAPI
|
|
49
48
|
# Retry once on unhandled server errors
|
50
49
|
def request(type, path, params, additional_headers = {})
|
51
50
|
headers = klass.custom_headers.merge(additional_headers)
|
51
|
+
make_request = proc { handle_background(handle_errors(make_request(type, path, params, headers))) }
|
52
52
|
begin
|
53
|
-
|
53
|
+
make_request.call
|
54
54
|
rescue JsonApiClient::Errors::ConnectionError, JsonApiClient::Errors::ServerError => ex
|
55
55
|
raise ex if ex.is_a?(JsonApiClient::Errors::NotFound) || ex.is_a?(JsonApiClient::Errors::Conflict)
|
56
|
-
|
56
|
+
make_request.call
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
private
|
61
|
+
def handle_background(response)
|
62
|
+
return response unless
|
63
|
+
(job = response&.first).is_a?(::FrederickAPI::V2::BackgroundJob) && job.status != 'complete'
|
64
|
+
raise FrederickAPI::V2::Errors::BackgroundJobFailure, job if job.has_errors?
|
65
|
+
sleep job.retry_after
|
66
|
+
linked(job.links.attributes['self'])
|
67
|
+
end
|
61
68
|
|
62
69
|
def handle_errors(result)
|
63
70
|
return result unless result.has_errors?
|
@@ -67,7 +74,9 @@ module FrederickAPI
|
|
67
74
|
end
|
68
75
|
|
69
76
|
def make_request(type, path, params, headers)
|
70
|
-
|
77
|
+
faraday_response = connection.run(type, path, params, headers)
|
78
|
+
return klass.parser.parse(klass, faraday_response) unless faraday_response.status == 303
|
79
|
+
linked(faraday_response.headers['location'])
|
71
80
|
end
|
72
81
|
|
73
82
|
def get_via_post_path?(path)
|
@@ -10,6 +10,7 @@ module FrederickAPI
|
|
10
10
|
self.query_builder = FrederickAPI::V2::Helpers::QueryBuilder
|
11
11
|
self.paginator = FrederickAPI::V2::Helpers::Paginator
|
12
12
|
self.requestor_class = FrederickAPI::V2::Helpers::Requestor
|
13
|
+
self.parser = ::FrederickAPI::V2::Helpers::BackgroundableParser
|
13
14
|
|
14
15
|
attr_accessor :custom_headers
|
15
16
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: frederick_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.5'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Frederick Engineering
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json_api_client
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- lib/frederick_api.rb
|
37
37
|
- lib/frederick_api/configuration.rb
|
38
38
|
- lib/frederick_api/v2/automation.rb
|
39
|
+
- lib/frederick_api/v2/background_job.rb
|
39
40
|
- lib/frederick_api/v2/business_category.rb
|
40
41
|
- lib/frederick_api/v2/communication_content.rb
|
41
42
|
- lib/frederick_api/v2/contact.rb
|
@@ -43,6 +44,7 @@ files:
|
|
43
44
|
- lib/frederick_api/v2/contact_property.rb
|
44
45
|
- lib/frederick_api/v2/contact_type.rb
|
45
46
|
- lib/frederick_api/v2/errors/errors.rb
|
47
|
+
- lib/frederick_api/v2/helpers/backgroundable_parser.rb
|
46
48
|
- lib/frederick_api/v2/helpers/has_many.rb
|
47
49
|
- lib/frederick_api/v2/helpers/paginator.rb
|
48
50
|
- lib/frederick_api/v2/helpers/query_builder.rb
|
@@ -74,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
76
|
version: '0'
|
75
77
|
requirements: []
|
76
78
|
rubyforge_project:
|
77
|
-
rubygems_version: 2.
|
79
|
+
rubygems_version: 2.7.9
|
78
80
|
signing_key:
|
79
81
|
specification_version: 4
|
80
82
|
summary: Frederick API Client
|