onfido 0.0.3 → 0.0.4
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 +4 -4
- data/.travis.yml +16 -0
- data/CHANGELOG.md +3 -0
- data/README.md +28 -3
- data/lib/onfido.rb +2 -3
- data/lib/onfido/configuration.rb +3 -1
- data/lib/onfido/errors/connection_error.rb +4 -0
- data/lib/onfido/{request_error.rb → errors/request_error.rb} +8 -0
- data/lib/onfido/resource.rb +97 -11
- data/lib/onfido/version.rb +1 -1
- data/onfido.gemspec +1 -0
- data/spec/integrations/exceptions_spec.rb +116 -0
- data/spec/onfido/resource_spec.rb +11 -4
- data/spec/support/fake_onfido_api.rb +10 -0
- data/spec/support/fixtures/unexpected_error_format.json +3 -0
- metadata +34 -20
- data/.ruby-version +0 -1
- data/lib/onfido/requestable.rb +0 -12
- data/lib/onfido/response_handler.rb +0 -38
- data/spec/integrations/4xx_response_spec.rb +0 -35
- data/spec/onfido/response_handler_spec.rb +0 -79
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c107bba12384d55217719e5283953f0a0111f927
|
4
|
+
data.tar.gz: 4d77e8f946b6d035e3b126b4d9b01b3807a4c295
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cef79ba60503372169905e3abf66b2ac4d55b46141a9758abce82cf8a91ed72aa02e6635d7675d7a37280818605b5843f62d47d99a5c72164a850b15282c9559
|
7
|
+
data.tar.gz: adc95bedaa0ef4e1d75e3ee87a21a765383d9e39b4f19b0f7779741c1e65c7b514934d243c7644567933bc25139b61f5eee596a29456bf8d58fcd2fef732fec3
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -3,7 +3,10 @@
|
|
3
3
|
A wrapper for Onfido's [API](https://onfido.com/documentation#introduction). You should always refer to the documentation for valid API calls.
|
4
4
|
|
5
5
|
[](https://snap-ci.com/hvssle/onfido/branch/master)
|
6
|
-
[](http://badge.fury.io/rb/onfido)
|
6
|
+
[](http://badge.fury.io/rb/onfido)
|
7
|
+
[](https://travis-ci.org/hvssle/onfido)
|
8
|
+
[!['gitter room'][2]][1]
|
9
|
+
|
7
10
|
|
8
11
|
[1]: https://gitter.im/hvssle/onfido
|
9
12
|
[2]: https://badges.gitter.im/gitterHQ/developers.png
|
@@ -27,13 +30,15 @@ Or install it yourself as:
|
|
27
30
|
|
28
31
|
## Usage
|
29
32
|
|
30
|
-
There are
|
33
|
+
There are 5 configuration options for Onfido, including your `api_key`, throwing exceptions for failed responses and logging the requests. By default, `throws_exceptions` is set to `true`. If set to `false` and Onfido responds with a valid JSON body the response body will be returned instead.
|
31
34
|
|
32
35
|
```ruby
|
33
36
|
Onfido.configure do |config|
|
34
37
|
config.api_key = 'MY_API_KEY'
|
35
38
|
config.logger = Logger.new(STDOUT)
|
36
39
|
config.throws_exceptions = false
|
40
|
+
config.open_timeout = 30
|
41
|
+
config.read_timeout = 80
|
37
42
|
end
|
38
43
|
```
|
39
44
|
|
@@ -122,13 +127,31 @@ To search for addresses by postcode
|
|
122
127
|
api.address.all('SE1 4NG')
|
123
128
|
```
|
124
129
|
|
130
|
+
### Pagination
|
131
|
+
|
132
|
+
Currently, you can paginate over the *applicant* and *check* resources. However, since you can only create 1 check per applicant therefore paginating on the check resource might prove impractical.
|
133
|
+
|
134
|
+
By default, both endpoints are fetching records the first 20 records. That is the maximum amount of records you can request per page.
|
135
|
+
|
136
|
+
To paginate over *applicants*:
|
137
|
+
```ruby
|
138
|
+
api = Onfido::API.new
|
139
|
+
api.applicant.all(page: 2, per_page: 10)
|
140
|
+
```
|
141
|
+
|
142
|
+
To paginate over *checks*:
|
143
|
+
```
|
144
|
+
api = Onfido::API.new
|
145
|
+
api.check.all('applicant_id', page: 2, per_page: 10)
|
146
|
+
```
|
147
|
+
|
125
148
|
## Error Handling
|
126
149
|
|
127
150
|
By default, Onfido will attempt to raise errors returned by the API automatically.
|
128
151
|
|
129
152
|
If you set the `throws_exceptions` to false, it will simply return the response body. This allows you to handle errors manually.
|
130
153
|
|
131
|
-
If you rescue Onfido::RequestError
|
154
|
+
If you rescue `Onfido::RequestError`, you are provided with the error message itself as well as the type of error, response code and fields that have errored. Here's how you might do that:
|
132
155
|
|
133
156
|
```ruby
|
134
157
|
def create_applicant
|
@@ -140,6 +163,8 @@ If you rescue Onfido::RequestError, you are provided with the error message itse
|
|
140
163
|
end
|
141
164
|
```
|
142
165
|
|
166
|
+
You can also rescue `Onfido::ConnectionError`, which is raised whenever something goes wrong with the connection to Onfido - you may wish to automatically retry these requests.
|
167
|
+
|
143
168
|
### Roadmap
|
144
169
|
|
145
170
|
- Improve test coverage with more scenarios
|
data/lib/onfido.rb
CHANGED
@@ -5,10 +5,9 @@ require 'open-uri'
|
|
5
5
|
|
6
6
|
require 'onfido/version'
|
7
7
|
require 'onfido/configuration'
|
8
|
-
require 'onfido/request_error'
|
9
|
-
require 'onfido/
|
8
|
+
require 'onfido/errors/request_error'
|
9
|
+
require 'onfido/errors/connection_error'
|
10
10
|
require 'onfido/null_logger'
|
11
|
-
require 'onfido/requestable'
|
12
11
|
require 'onfido/resource'
|
13
12
|
require 'onfido/address'
|
14
13
|
require 'onfido/applicant'
|
data/lib/onfido/configuration.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Onfido
|
2
2
|
module Configuration
|
3
|
-
attr_accessor :api_key, :throws_exceptions
|
3
|
+
attr_accessor :api_key, :throws_exceptions, :open_timeout, :read_timeout
|
4
4
|
|
5
5
|
def self.extended(base)
|
6
6
|
base.reset
|
@@ -13,6 +13,8 @@ module Onfido
|
|
13
13
|
def reset
|
14
14
|
self.api_key = nil
|
15
15
|
self.throws_exceptions = true
|
16
|
+
self.open_timeout = 30
|
17
|
+
self.read_timeout = 80
|
16
18
|
RestClient.log = nil
|
17
19
|
end
|
18
20
|
|
@@ -19,5 +19,13 @@ specified in the Onfido documentation e.g.
|
|
19
19
|
module Onfido
|
20
20
|
class RequestError < StandardError
|
21
21
|
attr_accessor :type, :fields, :response_code
|
22
|
+
|
23
|
+
def initialize(message=nil, type: nil, fields: nil, response_code: nil)
|
24
|
+
@type = type
|
25
|
+
@fields = fields
|
26
|
+
@response_code = response_code
|
27
|
+
|
28
|
+
super(message)
|
29
|
+
end
|
22
30
|
end
|
23
31
|
end
|
data/lib/onfido/resource.rb
CHANGED
@@ -2,26 +2,53 @@ module Onfido
|
|
2
2
|
class Resource
|
3
3
|
VALID_HTTP_METHODS = %i(get post)
|
4
4
|
|
5
|
-
include Requestable
|
6
|
-
|
7
5
|
def url_for(path)
|
8
6
|
Onfido.endpoint + path
|
9
7
|
end
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
VALID_HTTP_METHODS.each do |method|
|
10
|
+
define_method method do |*args|
|
13
11
|
make_request(
|
12
|
+
method: method.to_sym,
|
14
13
|
url: args.first.fetch(:url),
|
15
|
-
payload: build_query(args.first.fetch(:payload))
|
16
|
-
method: method.to_sym
|
14
|
+
payload: build_query(args.first.fetch(:payload))
|
17
15
|
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def make_request(options)
|
22
|
+
url = options.fetch(:url)
|
23
|
+
payload = options.fetch(:payload)
|
24
|
+
method = options.fetch(:method)
|
25
|
+
|
26
|
+
request_options = {
|
27
|
+
url: url,
|
28
|
+
payload: payload,
|
29
|
+
method: method,
|
30
|
+
headers: headers,
|
31
|
+
open_timeout: Onfido.open_timeout,
|
32
|
+
timeout: Onfido.read_timeout
|
33
|
+
}
|
34
|
+
|
35
|
+
response = RestClient::Request.execute(request_options)
|
36
|
+
|
37
|
+
parse(response)
|
38
|
+
rescue RestClient::ExceptionWithResponse => e
|
39
|
+
if e.response
|
40
|
+
handle_api_error(e.response)
|
18
41
|
else
|
19
|
-
|
42
|
+
handle_restclient_error(e, url)
|
20
43
|
end
|
44
|
+
rescue RestClient::Exception, Errno::ECONNREFUSED => e
|
45
|
+
handle_restclient_error(e, url)
|
21
46
|
end
|
22
47
|
|
23
|
-
def
|
24
|
-
|
48
|
+
def parse(response)
|
49
|
+
JSON.parse(response.body)
|
50
|
+
rescue JSON::ParserError
|
51
|
+
general_api_error(response.code, response.body)
|
25
52
|
end
|
26
53
|
|
27
54
|
def headers
|
@@ -31,8 +58,6 @@ module Onfido
|
|
31
58
|
}
|
32
59
|
end
|
33
60
|
|
34
|
-
private
|
35
|
-
|
36
61
|
# There seems to be a serialization issue with the HTTP client
|
37
62
|
# which does not serialize the payload properly.
|
38
63
|
# Have a look here https://gist.github.com/PericlesTheo/cb35139c57107ab3c84a
|
@@ -44,5 +69,66 @@ module Onfido
|
|
44
69
|
Rack::Utils.build_nested_query(payload)
|
45
70
|
end
|
46
71
|
end
|
72
|
+
|
73
|
+
def handle_api_error(response)
|
74
|
+
parsed_response = parse(response)
|
75
|
+
|
76
|
+
unless parsed_response["error"]
|
77
|
+
general_api_error(response.code, response.body)
|
78
|
+
end
|
79
|
+
|
80
|
+
if Onfido.throws_exceptions
|
81
|
+
raise RequestError.new(
|
82
|
+
parsed_response["error"]['message'],
|
83
|
+
type: parsed_response["error"]["type"],
|
84
|
+
fields: parsed_response["error"]["fields"],
|
85
|
+
response_code: response.code)
|
86
|
+
else
|
87
|
+
parsed_response
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def general_api_error(response_code, response_body)
|
92
|
+
raise RequestError.new(
|
93
|
+
"Invalid response object from API: #{response_body} " \
|
94
|
+
"(HTTP response code was #{response_code})",
|
95
|
+
response_code: response_code
|
96
|
+
)
|
97
|
+
end
|
98
|
+
|
99
|
+
def handle_restclient_error(e, url)
|
100
|
+
connection_message =
|
101
|
+
"Please check your internet connection and try again. " \
|
102
|
+
"If this problem persists, you should let us know at info@onfido.com."
|
103
|
+
|
104
|
+
message =
|
105
|
+
case e
|
106
|
+
when RestClient::RequestTimeout
|
107
|
+
"Could not connect to Onfido (#{url}). #{connection_message}"
|
108
|
+
|
109
|
+
when RestClient::ServerBrokeConnection
|
110
|
+
"The connection to the server (#{url}) broke before the " \
|
111
|
+
"request completed. #{connection_message}"
|
112
|
+
|
113
|
+
when RestClient::SSLCertificateNotVerified
|
114
|
+
"Could not verify Onfido's SSL certificate. Please make sure " \
|
115
|
+
"that your network is not intercepting certificates. " \
|
116
|
+
"(Try going to #{Onfido.endpoint} in your browser.) " \
|
117
|
+
"If this problem persists, let us know at info@onfido.com."
|
118
|
+
|
119
|
+
when SocketError
|
120
|
+
"Unexpected error when trying to connect to Onfido. " \
|
121
|
+
"You may be seeing this message because your DNS is not working. " \
|
122
|
+
"To check, try running 'host onfido.com' from the command line."
|
123
|
+
|
124
|
+
else
|
125
|
+
"Unexpected error communicating with Onfido. " \
|
126
|
+
"If this problem persists, let us know at info@onfido.com."
|
127
|
+
end
|
128
|
+
|
129
|
+
full_message = message + "\n\n(Network error: #{e.message})"
|
130
|
+
|
131
|
+
raise ConnectionError.new(full_message)
|
132
|
+
end
|
47
133
|
end
|
48
134
|
end
|
data/lib/onfido/version.rb
CHANGED
data/onfido.gemspec
CHANGED
@@ -0,0 +1,116 @@
|
|
1
|
+
describe Onfido::Resource do
|
2
|
+
let(:resource) { described_class.new }
|
3
|
+
let(:url) { Onfido.endpoint + path }
|
4
|
+
let(:api_key) { 'some_key' }
|
5
|
+
let(:payload) { { postcode: 'SE1 4NG' } }
|
6
|
+
|
7
|
+
|
8
|
+
before do
|
9
|
+
allow(Onfido).to receive(:api_key).and_return(api_key)
|
10
|
+
end
|
11
|
+
|
12
|
+
context '4xx response' do
|
13
|
+
let(:path) { '4xx_response' }
|
14
|
+
|
15
|
+
context "when 'throws_exceptions' is true" do
|
16
|
+
before { allow(Onfido).to receive(:throws_exceptions).and_return(true) }
|
17
|
+
|
18
|
+
it 'raises a custom error' do
|
19
|
+
expect { resource.get({ url: url, payload: payload }) }.
|
20
|
+
to raise_error(Onfido::RequestError, 'Something went wrong')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when 'throws_exceptions' is false" do
|
25
|
+
before { allow(Onfido).to receive(:throws_exceptions).and_return(false) }
|
26
|
+
|
27
|
+
it 'returns the body as a hash' do
|
28
|
+
response = resource.get({ url: url, payload: payload })
|
29
|
+
expect(response['error']).not_to be_nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'unexpected error format' do
|
35
|
+
let(:path) { 'unexpected_error_format' }
|
36
|
+
|
37
|
+
context "when 'throws_exceptions' is true" do
|
38
|
+
before { allow(Onfido).to receive(:throws_exceptions).and_return(true) }
|
39
|
+
|
40
|
+
it 'raises a custom error' do
|
41
|
+
expect { resource.get({ url: url, payload: payload }) }.
|
42
|
+
to raise_error(Onfido::RequestError, /response code was 400/)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when 'throws_exceptions' is false" do
|
47
|
+
before { allow(Onfido).to receive(:throws_exceptions).and_return(false) }
|
48
|
+
|
49
|
+
it 'still raises a custom error' do
|
50
|
+
expect { resource.get({ url: url, payload: payload }) }.
|
51
|
+
to raise_error(Onfido::RequestError, /response code was 400/)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'unparseable JSON' do
|
57
|
+
let(:path) { 'unparseable_response' }
|
58
|
+
|
59
|
+
context "when 'throws_exceptions' is true" do
|
60
|
+
before { allow(Onfido).to receive(:throws_exceptions).and_return(true) }
|
61
|
+
|
62
|
+
it 'raises a custom error' do
|
63
|
+
expect { resource.get({ url: url, payload: payload }) }.
|
64
|
+
to raise_error(Onfido::RequestError, /response code was 504/)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "when 'throws_exceptions' is false" do
|
69
|
+
before { allow(Onfido).to receive(:throws_exceptions).and_return(false) }
|
70
|
+
|
71
|
+
it 'still raises a custom error' do
|
72
|
+
expect { resource.get({ url: url, payload: payload }) }.
|
73
|
+
to raise_error(Onfido::RequestError, /response code was 504/)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'timeout' do
|
79
|
+
before do
|
80
|
+
allow(RestClient::Request).
|
81
|
+
to receive(:execute).
|
82
|
+
and_raise(RestClient::RequestTimeout)
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'raises a ConnectionError' do
|
86
|
+
expect { resource.get({ url: Onfido.endpoint, payload: payload }) }.
|
87
|
+
to raise_error(Onfido::ConnectionError, /Could not connect/)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'broken connection' do
|
92
|
+
before do
|
93
|
+
allow(RestClient::Request).
|
94
|
+
to receive(:execute).
|
95
|
+
and_raise(RestClient::ServerBrokeConnection)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'raises a ConnectionError' do
|
99
|
+
expect { resource.get({ url: Onfido.endpoint, payload: payload }) }.
|
100
|
+
to raise_error(Onfido::ConnectionError, /connection to the server/)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "bad SSL certificate" do
|
105
|
+
before do
|
106
|
+
allow(RestClient::Request).
|
107
|
+
to receive(:execute).
|
108
|
+
and_raise(RestClient::SSLCertificateNotVerified.new(nil))
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'raises a ConnectionError' do
|
112
|
+
expect { resource.get({ url: Onfido.endpoint, payload: payload }) }.
|
113
|
+
to raise_error(Onfido::ConnectionError, /SSL certificate/)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -25,7 +25,9 @@ describe Onfido::Resource do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
|
+
end
|
28
29
|
|
30
|
+
describe "valid http methods" do
|
29
31
|
%i(get post).each do |method|
|
30
32
|
context "for supported HTTP method: #{method}" do
|
31
33
|
let(:url) { endpoint + path }
|
@@ -49,13 +51,18 @@ describe Onfido::Resource do
|
|
49
51
|
url: url,
|
50
52
|
payload: Rack::Utils.build_query(payload),
|
51
53
|
method: method,
|
52
|
-
headers: resource.headers
|
53
|
-
|
54
|
-
|
54
|
+
headers: resource.send(:headers),
|
55
|
+
open_timeout: 30,
|
56
|
+
timeout: 80
|
57
|
+
).and_call_original
|
58
|
+
|
59
|
+
WebMock.stub_request(method, url).
|
60
|
+
to_return(body: response.to_json, status: 200)
|
55
61
|
end
|
56
62
|
|
57
63
|
it 'makes a request to an endpoint' do
|
58
|
-
expect(resource.public_send(method, {url: url, payload: payload})).
|
64
|
+
expect(resource.public_send(method, {url: url, payload: payload})).
|
65
|
+
to eq(response)
|
59
66
|
end
|
60
67
|
end
|
61
68
|
end
|
@@ -47,6 +47,16 @@ class FakeOnfidoAPI < Sinatra::Base
|
|
47
47
|
json_response(422, '4xx_response.json')
|
48
48
|
end
|
49
49
|
|
50
|
+
get '/v1/unexpected_error_format' do
|
51
|
+
json_response(400, 'unexpected_error_format.json')
|
52
|
+
end
|
53
|
+
|
54
|
+
get '/v1/unparseable_response' do
|
55
|
+
content_type :json
|
56
|
+
status 504
|
57
|
+
''
|
58
|
+
end
|
59
|
+
|
50
60
|
private
|
51
61
|
|
52
62
|
def json_response(response_code, file_name)
|
metadata
CHANGED
@@ -1,55 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onfido
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pericles Theodorou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.7'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.7'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '10.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: webmock
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.22'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.22'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rest-client
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - ~>
|
46
60
|
- !ruby/object:Gem::Version
|
47
61
|
version: 1.8.0
|
48
62
|
type: :runtime
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - ~>
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: 1.8.0
|
55
69
|
description: A wrapper for Onfido API 1.0
|
@@ -59,9 +73,10 @@ executables: []
|
|
59
73
|
extensions: []
|
60
74
|
extra_rdoc_files: []
|
61
75
|
files:
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
76
|
+
- .gitignore
|
77
|
+
- .rspec
|
78
|
+
- .travis.yml
|
79
|
+
- CHANGELOG.md
|
65
80
|
- Gemfile
|
66
81
|
- LICENSE
|
67
82
|
- LICENSE.txt
|
@@ -74,23 +89,21 @@ files:
|
|
74
89
|
- lib/onfido/check.rb
|
75
90
|
- lib/onfido/configuration.rb
|
76
91
|
- lib/onfido/document.rb
|
92
|
+
- lib/onfido/errors/connection_error.rb
|
93
|
+
- lib/onfido/errors/request_error.rb
|
77
94
|
- lib/onfido/null_logger.rb
|
78
95
|
- lib/onfido/report.rb
|
79
|
-
- lib/onfido/request_error.rb
|
80
|
-
- lib/onfido/requestable.rb
|
81
96
|
- lib/onfido/resource.rb
|
82
|
-
- lib/onfido/response_handler.rb
|
83
97
|
- lib/onfido/version.rb
|
84
98
|
- onfido.gemspec
|
85
|
-
- spec/integrations/4xx_response_spec.rb
|
86
99
|
- spec/integrations/address_spec.rb
|
87
100
|
- spec/integrations/applicant_spec.rb
|
88
101
|
- spec/integrations/check_spec.rb
|
89
102
|
- spec/integrations/document_spec.rb
|
103
|
+
- spec/integrations/exceptions_spec.rb
|
90
104
|
- spec/integrations/report_spec.rb
|
91
105
|
- spec/onfido/request_error_spec.rb
|
92
106
|
- spec/onfido/resource_spec.rb
|
93
|
-
- spec/onfido/response_handler_spec.rb
|
94
107
|
- spec/onfido_spec.rb
|
95
108
|
- spec/spec_helper.rb
|
96
109
|
- spec/support/fake_onfido_api.rb
|
@@ -103,6 +116,7 @@ files:
|
|
103
116
|
- spec/support/fixtures/document.json
|
104
117
|
- spec/support/fixtures/report.json
|
105
118
|
- spec/support/fixtures/reports.json
|
119
|
+
- spec/support/fixtures/unexpected_error_format.json
|
106
120
|
homepage: http://github.com/hvssle/onfido
|
107
121
|
licenses:
|
108
122
|
- MIT
|
@@ -113,12 +127,12 @@ require_paths:
|
|
113
127
|
- lib
|
114
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
115
129
|
requirements:
|
116
|
-
- -
|
130
|
+
- - '>='
|
117
131
|
- !ruby/object:Gem::Version
|
118
132
|
version: '0'
|
119
133
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
134
|
requirements:
|
121
|
-
- -
|
135
|
+
- - '>='
|
122
136
|
- !ruby/object:Gem::Version
|
123
137
|
version: '0'
|
124
138
|
requirements: []
|
@@ -128,15 +142,14 @@ signing_key:
|
|
128
142
|
specification_version: 4
|
129
143
|
summary: A wrapper for Onfido API 1.0
|
130
144
|
test_files:
|
131
|
-
- spec/integrations/4xx_response_spec.rb
|
132
145
|
- spec/integrations/address_spec.rb
|
133
146
|
- spec/integrations/applicant_spec.rb
|
134
147
|
- spec/integrations/check_spec.rb
|
135
148
|
- spec/integrations/document_spec.rb
|
149
|
+
- spec/integrations/exceptions_spec.rb
|
136
150
|
- spec/integrations/report_spec.rb
|
137
151
|
- spec/onfido/request_error_spec.rb
|
138
152
|
- spec/onfido/resource_spec.rb
|
139
|
-
- spec/onfido/response_handler_spec.rb
|
140
153
|
- spec/onfido_spec.rb
|
141
154
|
- spec/spec_helper.rb
|
142
155
|
- spec/support/fake_onfido_api.rb
|
@@ -149,3 +162,4 @@ test_files:
|
|
149
162
|
- spec/support/fixtures/document.json
|
150
163
|
- spec/support/fixtures/report.json
|
151
164
|
- spec/support/fixtures/reports.json
|
165
|
+
- spec/support/fixtures/unexpected_error_format.json
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.1.3
|
data/lib/onfido/requestable.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
module Onfido
|
2
|
-
module Requestable
|
3
|
-
def make_request(options)
|
4
|
-
url = options.fetch(:url)
|
5
|
-
payload = options.fetch(:payload)
|
6
|
-
method = options.fetch(:method)
|
7
|
-
RestClient::Request.execute(url: url, payload: payload, method: method, headers: headers) do |response, *|
|
8
|
-
ResponseHandler.new(response).parse!
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Onfido
|
2
|
-
class ResponseHandler
|
3
|
-
attr_reader :response
|
4
|
-
|
5
|
-
def initialize(response)
|
6
|
-
@response = response
|
7
|
-
end
|
8
|
-
|
9
|
-
def parse!
|
10
|
-
if Onfido.throws_exceptions && parsed_response["error"]
|
11
|
-
raise request_error
|
12
|
-
else
|
13
|
-
parsed_response
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def parsed_response
|
20
|
-
@parsed_response ||=
|
21
|
-
begin
|
22
|
-
JSON.parse(response)
|
23
|
-
rescue JSON::ParserError
|
24
|
-
{
|
25
|
-
'error' => {"message" => "Unparseable response: #{response}"}
|
26
|
-
}
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def request_error
|
31
|
-
RequestError.new(parsed_response['error']['message']).tap do |error|
|
32
|
-
error.type = parsed_response['error']["type"]
|
33
|
-
error.fields = parsed_response['error']["fields"]
|
34
|
-
error.response_code = response.code if response.respond_to?(:code)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
describe Onfido::Resource do
|
2
|
-
let(:resource) { described_class.new }
|
3
|
-
let(:url) { Onfido.endpoint + path }
|
4
|
-
let(:api_key) { 'some_key' }
|
5
|
-
let(:payload) { {postcode: 'SE1 4NG'} }
|
6
|
-
|
7
|
-
|
8
|
-
before do
|
9
|
-
allow(Onfido).to receive(:api_key).and_return(api_key)
|
10
|
-
end
|
11
|
-
|
12
|
-
context 'when a response is a 4xx' do
|
13
|
-
let(:path) { '4xx_response' }
|
14
|
-
|
15
|
-
context "when 'throws_exceptions' is true" do
|
16
|
-
it 'raises a custom error' do
|
17
|
-
expect {
|
18
|
-
resource.get({url: url, payload: payload})
|
19
|
-
}.to raise_error(
|
20
|
-
Onfido::RequestError, 'Something went wrong')
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context "when 'throws_exceptions' is false" do
|
25
|
-
before do
|
26
|
-
allow(Onfido).to receive(:throws_exceptions).and_return(false)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'returns the body as a hash' do
|
30
|
-
response = resource.get({url: url, payload: payload})
|
31
|
-
expect(response['error']).not_to be_nil
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,79 +0,0 @@
|
|
1
|
-
describe Onfido::ResponseHandler do
|
2
|
-
subject(:handler) { described_class.new(response) }
|
3
|
-
|
4
|
-
describe '#parse!' do
|
5
|
-
before do
|
6
|
-
allow(Onfido).to receive(:throws_exceptions).and_return(throws_exceptions)
|
7
|
-
end
|
8
|
-
|
9
|
-
let(:throws_exceptions) { true }
|
10
|
-
|
11
|
-
context 'when the response is successful' do
|
12
|
-
let(:response) { hashified_response.to_json }
|
13
|
-
let(:hashified_response) do
|
14
|
-
{'success' => 'applicant was successfully created'}
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'parses the body and returns it' do
|
18
|
-
expect(handler.parse!).to eq(hashified_response)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'when the response has gracefully errored' do
|
23
|
-
let(:response) { hashified_response.to_json }
|
24
|
-
let(:hashified_response) do
|
25
|
-
{
|
26
|
-
'error' => {
|
27
|
-
'message' => 'Authorization error: please re-check your credentials'
|
28
|
-
}
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'when throw_exceptions configuration is set to true' do
|
33
|
-
it 'raises an error' do
|
34
|
-
expect { handler.parse! }.to raise_error(
|
35
|
-
Onfido::RequestError,
|
36
|
-
'Authorization error: please re-check your credentials'
|
37
|
-
)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'when throw_exceptions configuration is set to false' do
|
42
|
-
let(:throws_exceptions) { false }
|
43
|
-
|
44
|
-
|
45
|
-
it 'parses the body and returns it' do
|
46
|
-
expect(handler.parse!).to eq(hashified_response)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'when the response is unparseable' do
|
52
|
-
let(:response) { 'something : wrong' }
|
53
|
-
|
54
|
-
context 'when throw_exceptions configuration is set to true' do
|
55
|
-
it 'raises an error' do
|
56
|
-
expect { handler.parse! }.to raise_error(
|
57
|
-
Onfido::RequestError,
|
58
|
-
'Unparseable response: something : wrong'
|
59
|
-
)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'when throw_exceptions configuration is set to false' do
|
64
|
-
let(:throws_exceptions) { false }
|
65
|
-
|
66
|
-
|
67
|
-
it 'parses the body and returns it' do
|
68
|
-
expect(handler.parse!).to eq(
|
69
|
-
{
|
70
|
-
'error' => {
|
71
|
-
'message' => 'Unparseable response: something : wrong'
|
72
|
-
}
|
73
|
-
}
|
74
|
-
)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|