onfido 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c107bba12384d55217719e5283953f0a0111f927
4
- data.tar.gz: 4d77e8f946b6d035e3b126b4d9b01b3807a4c295
3
+ metadata.gz: 7f348aa18fa199997614263dda1be6a615a48191
4
+ data.tar.gz: 8e8d3b9cefb576187b9c49666492958f8793a533
5
5
  SHA512:
6
- metadata.gz: cef79ba60503372169905e3abf66b2ac4d55b46141a9758abce82cf8a91ed72aa02e6635d7675d7a37280818605b5843f62d47d99a5c72164a850b15282c9559
7
- data.tar.gz: adc95bedaa0ef4e1d75e3ee87a21a765383d9e39b4f19b0f7779741c1e65c7b514934d243c7644567933bc25139b61f5eee596a29456bf8d58fcd2fef732fec3
6
+ metadata.gz: 69bda930664b166633e1454a7a48828d59a90c66ac9fc38b66bcbd0e4bfa52628660114e192cfa9b056986418fa05d191977617dc37718c7b3eb2adb8e0f84ec
7
+ data.tar.gz: 8623820a91b599ef02c7508e311275e8cd71163e2c72770811c77cb79e5aa1ae4a838cd3c900a9fcd31e6990bce58835f639d2b7a8e9f4d310b52a88d1d3d9cd
data/.gitignore CHANGED
@@ -1,161 +1,18 @@
1
- # Created by https://www.gitignore.io
2
-
3
- ### Emacs ###
4
- # -*- mode: gitignore; -*-
5
- *~
6
- \#*\#
7
- /.emacs.desktop
8
- /.emacs.desktop.lock
9
- *.elc
10
- auto-save-list
11
- tramp
12
- .\#*
13
-
14
- # Org-mode
15
- .org-id-locations
16
- *_archive
17
-
18
- # flymake-mode
19
- *_flymake.*
20
-
21
- # eshell files
22
- /eshell/history
23
- /eshell/lastdir
24
-
25
- # elpa packages
26
- /elpa/
27
-
28
- # reftex files
29
- *.rel
30
-
31
- # AUCTeX auto folder
32
- /auto/
33
-
34
- # cask packages
35
- .cask/
36
-
37
-
38
- ### OSX ###
39
- .DS_Store
40
- .AppleDouble
41
- .LSOverride
42
-
43
- # Icon must end with two \r
44
- Icon
45
-
46
-
47
- # Thumbnails
48
- ._*
49
-
50
- # Files that might appear in the root of a volume
51
- .DocumentRevisions-V100
52
- .fseventsd
53
- .Spotlight-V100
54
- .TemporaryItems
55
- .Trashes
56
- .VolumeIcon.icns
57
-
58
- # Directories potentially created on remote AFP share
59
- .AppleDB
60
- .AppleDesktop
61
- Network Trash Folder
62
- Temporary Items
63
- .apdisk
64
-
65
-
66
- ### Linux ###
67
- *~
68
-
69
- # KDE directory preferences
70
- .directory
71
-
72
- # Linux trash folder which might appear on any partition or disk
73
- .Trash-*
74
-
75
-
76
- ### RubyMine ###
77
- # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm
78
-
79
- *.iml
80
-
81
- ## Directory-based project format:
82
- .idea/
83
- # if you remove the above rule, at least ignore the following:
84
-
85
- # User-specific stuff:
86
- # .idea/workspace.xml
87
- # .idea/tasks.xml
88
- # .idea/dictionaries
89
-
90
- # Sensitive or high-churn files:
91
- # .idea/dataSources.ids
92
- # .idea/dataSources.xml
93
- # .idea/sqlDataSources.xml
94
- # .idea/dynamic.xml
95
- # .idea/uiDesigner.xml
96
-
97
- # Gradle:
98
- # .idea/gradle.xml
99
- # .idea/libraries
100
-
101
- # Mongo Explorer plugin:
102
- # .idea/mongoSettings.xml
103
-
104
- ## File-based project format:
105
- *.ipr
106
- *.iws
107
-
108
- ## Plugin-specific files:
109
-
110
- # IntelliJ
111
- /out/
112
-
113
- # mpeltonen/sbt-idea plugin
114
- .idea_modules/
115
-
116
- # JIRA plugin
117
- atlassian-ide-plugin.xml
118
-
119
- # Crashlytics plugin (for Android Studio and IntelliJ)
120
- com_crashlytics_export_strings.xml
121
- crashlytics.properties
122
- crashlytics-build.properties
123
-
124
-
125
- ### Ruby ###
126
1
  *.gem
127
2
  *.rbc
128
- /.config
129
- /coverage/
130
- /InstalledFiles
131
- /pkg/
132
- /spec/reports/
133
- /test/tmp/
134
- /test/version_tmp/
135
- /tmp/
136
-
137
- ## Specific to RubyMotion:
138
- .dat*
139
- .repl_history
140
- build/
141
-
142
- ## Documentation cache and generated files:
143
- /.yardoc/
144
- /_yardoc/
145
- /doc/
146
- /rdoc/
147
-
148
- ## Environment normalisation:
149
- /.bundle/
150
- /vendor/bundle
151
- /lib/bundler/man/
3
+ .bundle
4
+ .config
5
+ .rspec
6
+ .yardoc
152
7
  Gemfile.lock
153
-
154
- # for a library or gem, you might want to ignore these files since the code is
155
- # intended to run in multiple environments; otherwise, check them in:
156
- # Gemfile.lock
157
- # .ruby-version
158
- # .ruby-gemset
159
-
160
- # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
161
- .rvmrc
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --color
2
2
  --require spec_helper
3
- --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,43 @@
1
+ # For all options see https://github.com/bbatsov/rubocop/tree/master/config
2
+
3
+ AllCops:
4
+ Include:
5
+ - Rakefile
6
+ - lib/tasks/*.rake
7
+ Exclude:
8
+ - vendor/**/*
9
+ - .*/**
10
+ - spec/fixtures/**/*
11
+
12
+ Style/StringLiterals:
13
+ Enabled: false
14
+
15
+ Style/Documentation:
16
+ Enabled: false
17
+
18
+ Style/SignalException:
19
+ EnforcedStyle: only_raise
20
+
21
+ Metrics/MethodLength:
22
+ CountComments: false
23
+ Max: 25
24
+
25
+ Metrics/AbcSize:
26
+ Max: 25
27
+
28
+ # Don't require utf-8 encoding comment
29
+ Style/Encoding:
30
+ Enabled: false
31
+
32
+ Metrics/LineLength:
33
+ Max: 80
34
+
35
+ Metrics/ClassLength:
36
+ Enabled: false
37
+
38
+ Style/DotPosition:
39
+ EnforcedStyle: trailing
40
+
41
+ # Allow class and message or instance raises
42
+ Style/RaiseArgs:
43
+ Enabled: false
data/.travis.yml CHANGED
@@ -13,4 +13,5 @@ rvm:
13
13
  - rbx-2
14
14
 
15
15
  script:
16
+ - bundle exec rubocop
16
17
  - bundle exec rspec spec
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## v0.1.0 11 November 2015
2
+
3
+ - BREAKING: remove `throws_exceptions` option. We now always throw exceptions
4
+ for errors. This option had become confusing since `Onfido::ConnectionError`
5
+ was added in v0.0.4, since timeout errors were raised regardless of its value.
6
+ - Add base errors class (`Onfido::OnfidoError`)
7
+ - Add rubocop, and fix style inconsistencies
8
+
1
9
  ## v0.0.4 10 November 2015
2
10
 
3
11
  - Split out connection errors so they can be automatically retried
data/Gemfile CHANGED
@@ -6,9 +6,3 @@ group :development, :test do
6
6
  gem 'pry-byebug'
7
7
  gem 'pry-stack_explorer'
8
8
  end
9
-
10
- group :test do
11
- gem 'rspec', '~> 3.1.0'
12
- gem 'webmock', '~> 1.20.4'
13
- gem 'sinatra', '~> 1.4.6'
14
- end
data/README.md CHANGED
@@ -2,10 +2,8 @@
2
2
 
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
- [![Build Status](https://snap-ci.com/hvssle/onfido/branch/master/build_image)](https://snap-ci.com/hvssle/onfido/branch/master)
6
5
  [![Gem Version](https://badge.fury.io/rb/onfido.svg)](http://badge.fury.io/rb/onfido)
7
6
  [![Build Status](https://travis-ci.org/hvssle/onfido.svg?branch=master)](https://travis-ci.org/hvssle/onfido)
8
- [!['gitter room'][2]][1]
9
7
 
10
8
 
11
9
  [1]: https://gitter.im/hvssle/onfido
@@ -30,13 +28,12 @@ Or install it yourself as:
30
28
 
31
29
  ## Usage
32
30
 
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
+ There are 4 configuration options for Onfido, including your `api_key`, timeout details and logging.
34
32
 
35
33
  ```ruby
36
34
  Onfido.configure do |config|
37
35
  config.api_key = 'MY_API_KEY'
38
36
  config.logger = Logger.new(STDOUT)
39
- config.throws_exceptions = false
40
37
  config.open_timeout = 30
41
38
  config.read_timeout = 80
42
39
  end
@@ -52,7 +49,7 @@ Assuming you have a valid key, you can conveniently make API calls by using an i
52
49
 
53
50
  All resources share the same interface when making API calls. For creating a resource you can use `.create`, for finding one `.find` and for fetching all records for a resource `.all`.
54
51
 
55
- **Note:** *All param keys should be a symbol e.g. `{type: 'express', reports: [{name: 'identity'}]}`*
52
+ **Note:** *All param keys should be a symbol e.g. `{ type: 'express', reports: [{ name: 'identity' }] }`*
56
53
 
57
54
 
58
55
  ### Applicant
@@ -80,7 +77,7 @@ To get all applicants
80
77
  To upload a document for an applicant, you can simply use
81
78
 
82
79
  ```ruby
83
- api.document.create('applicant_id', {file: 'http://example.com', type: 'passport')
80
+ api.document.create('applicant_id', file: 'http://example.com', type: 'passport')
84
81
  ```
85
82
 
86
83
  The file can both be a `File` object or a link to an image.
@@ -90,7 +87,7 @@ The file can both be a `File` object or a link to an image.
90
87
  To create a check for an applicant, you can simply use
91
88
 
92
89
  ```ruby
93
- api.check.create('applicant_id', {type: 'express', reports: [{name: 'identity'}]})
90
+ api.check.create('applicant_id', type: 'express', reports: [{ name: 'identity' }])
94
91
  ```
95
92
 
96
93
  To find an existing check for an applicant
@@ -147,23 +144,19 @@ api.check.all('applicant_id', page: 2, per_page: 10)
147
144
 
148
145
  ## Error Handling
149
146
 
150
- By default, Onfido will attempt to raise errors returned by the API automatically.
151
-
152
- If you set the `throws_exceptions` to false, it will simply return the response body. This allows you to handle errors manually.
153
-
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:
147
+ If you rescue `Onfido::RequestError`, you are provided with the response code, response body and parsed JSON body, the type of error the the fields that have errored.
155
148
 
156
149
  ```ruby
157
150
  def create_applicant
158
151
  api.applicant.create(params)
159
152
  rescue Onfido::RequestError => e
160
- e.type # returns 'validation_error'
161
- e.fields # returns {"email": {"messages": ["invalid format"]}
162
- e.response_code # returns '401'
153
+ e.type # => 'validation_error'
154
+ e.fields # => { "email": { "messages": ["invalid format"] } }
155
+ e.response_code # => '422'
163
156
  end
164
157
  ```
165
158
 
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.
159
+ You can also rescue `Onfido::ConnectionError`, which is raised when something goes wrong with the connection to Onfido. This is useful for adding automatic retries to your background jobs.
167
160
 
168
161
  ### Roadmap
169
162
 
data/Rakefile CHANGED
@@ -1,2 +1 @@
1
1
  require 'bundler/gem_tasks'
2
-
data/lib/onfido.rb CHANGED
@@ -5,6 +5,7 @@ require 'open-uri'
5
5
 
6
6
  require 'onfido/version'
7
7
  require 'onfido/configuration'
8
+ require 'onfido/errors/onfido_error'
8
9
  require 'onfido/errors/request_error'
9
10
  require 'onfido/errors/connection_error'
10
11
  require 'onfido/null_logger'
@@ -16,7 +17,6 @@ require 'onfido/check'
16
17
  require 'onfido/report'
17
18
  require 'onfido/api'
18
19
 
19
-
20
20
  module Onfido
21
21
  extend Configuration
22
22
  end
@@ -3,7 +3,7 @@ module Onfido
3
3
  def all(postcode)
4
4
  get(
5
5
  url: url_for('addresses/pick'),
6
- payload: {postcode: postcode.delete(' ')}
6
+ payload: { postcode: postcode.delete(' ') }
7
7
  )
8
8
  end
9
9
  end
@@ -12,7 +12,10 @@ module Onfido
12
12
  end
13
13
 
14
14
  def all(page: 1, per_page: 20)
15
- get(url: url_for("applicants?page=#{page}&per_page=#{per_page}"), payload: {})
15
+ get(
16
+ url: url_for("applicants?page=#{page}&per_page=#{per_page}"),
17
+ payload: {}
18
+ )
16
19
  end
17
20
  end
18
21
  end
data/lib/onfido/check.rb CHANGED
@@ -2,8 +2,8 @@ module Onfido
2
2
  class Check < Resource
3
3
  def create(applicant_id, payload)
4
4
  post(
5
- url: url_for("applicants/#{applicant_id}/checks"),
6
- payload: payload
5
+ url: url_for("applicants/#{applicant_id}/checks"),
6
+ payload: payload
7
7
  )
8
8
  end
9
9
 
@@ -15,8 +15,9 @@ module Onfido
15
15
  end
16
16
 
17
17
  def all(applicant_id, page: 1, per_page: 20)
18
+ querystring = "page=#{page}&per_page=#{per_page}"
18
19
  get(
19
- url: url_for("applicants/#{applicant_id}/checks?page=#{page}&per_page=#{per_page}"),
20
+ url: url_for("applicants/#{applicant_id}/checks?#{querystring}"),
20
21
  payload: {}
21
22
  )
22
23
  end
@@ -1,6 +1,6 @@
1
1
  module Onfido
2
2
  module Configuration
3
- attr_accessor :api_key, :throws_exceptions, :open_timeout, :read_timeout
3
+ attr_accessor :api_key, :open_timeout, :read_timeout
4
4
 
5
5
  def self.extended(base)
6
6
  base.reset
@@ -12,7 +12,6 @@ module Onfido
12
12
 
13
13
  def reset
14
14
  self.api_key = nil
15
- self.throws_exceptions = true
16
15
  self.open_timeout = 30
17
16
  self.read_timeout = 80
18
17
  RestClient.log = nil
@@ -1,4 +1,4 @@
1
1
  module Onfido
2
- class ConnectionError < StandardError
2
+ class ConnectionError < OnfidoError
3
3
  end
4
4
  end
@@ -0,0 +1,28 @@
1
+ module Onfido
2
+ class OnfidoError < StandardError
3
+ attr_accessor :response_code, :response_body
4
+
5
+ def initialize(message = nil,
6
+ response_code: nil,
7
+ response_body: nil)
8
+ @response_code = response_code
9
+ @response_body = response_body
10
+
11
+ super(message)
12
+ end
13
+
14
+ def json_body
15
+ JSON.parse(response_body.to_s)
16
+ rescue JSON::ParserError
17
+ nil
18
+ end
19
+
20
+ def type
21
+ json_body && json_body['error'] && json_body['error']['type']
22
+ end
23
+
24
+ def fields
25
+ json_body && json_body['error'] && json_body['error']['fields']
26
+ end
27
+ end
28
+ end
@@ -1,31 +1,4 @@
1
- =begin
2
- The class will handle response failures coming from Onfido
3
- It's main purpose is to produce meaningful error messages to the user e.g.
4
-
5
- RequestError: Authorization error: please re-check your credentials
6
-
7
- Users can also rescue the error and insect its type and affected fields as
8
- specified in the Onfido documentation e.g.
9
-
10
- begin
11
- # error being raised
12
- rescue Onfido::RequestError => e
13
- e.type
14
- e.fields
15
- end
16
-
17
- =end
18
-
19
1
  module Onfido
20
- class RequestError < StandardError
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
2
+ class RequestError < OnfidoError
30
3
  end
31
4
  end
@@ -46,7 +46,7 @@ module Onfido
46
46
  end
47
47
 
48
48
  def parse(response)
49
- JSON.parse(response.body)
49
+ JSON.parse(response.body.to_s)
50
50
  rescue JSON::ParserError
51
51
  general_api_error(response.code, response.body)
52
52
  end
@@ -77,22 +77,19 @@ module Onfido
77
77
  general_api_error(response.code, response.body)
78
78
  end
79
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
80
+ raise RequestError.new(
81
+ parsed_response["error"]['message'],
82
+ response_code: response.code,
83
+ response_body: response.body
84
+ )
89
85
  end
90
86
 
91
87
  def general_api_error(response_code, response_body)
92
88
  raise RequestError.new(
93
89
  "Invalid response object from API: #{response_body} " \
94
90
  "(HTTP response code was #{response_code})",
95
- response_code: response_code
91
+ response_code: response_code,
92
+ response_body: response_body
96
93
  )
97
94
  end
98
95
 
@@ -111,15 +108,15 @@ module Onfido
111
108
  "request completed. #{connection_message}"
112
109
 
113
110
  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."
111
+ "Could not verify Onfido's SSL certificate. Please make sure " \
112
+ "that your network is not intercepting certificates. " \
113
+ "(Try going to #{Onfido.endpoint} in your browser.) " \
114
+ "If this problem persists, let us know at info@onfido.com."
118
115
 
119
116
  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."
117
+ "Unexpected error when trying to connect to Onfido. " \
118
+ "You may be seeing this message because your DNS is not working. " \
119
+ "To check, try running 'host onfido.com' from the command line."
123
120
 
124
121
  else
125
122
  "Unexpected error communicating with Onfido. " \
@@ -1,3 +1,3 @@
1
1
  module Onfido
2
- VERSION = '0.0.4'
2
+ VERSION = '0.1.0'
3
3
  end
data/onfido.gemspec CHANGED
@@ -6,10 +6,10 @@ require 'onfido/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'onfido'
8
8
  spec.version = Onfido::VERSION
9
- spec.authors = ['Pericles Theodorou']
10
- spec.email = ['periclestheo@gmail.com']
11
- spec.summary = %q{A wrapper for Onfido API 1.0}
12
- spec.description = %q{A wrapper for Onfido API 1.0}
9
+ spec.authors = ['Pericles Theodorou', 'Grey Baker']
10
+ spec.email = ['periclestheo@gmail.com', 'grey@gocardless.com']
11
+ spec.summary = %q{A wrapper for Onfido API}
12
+ spec.description = %q{A wrapper for Onfido API}
13
13
  spec.homepage = 'http://github.com/hvssle/onfido'
14
14
  spec.license = 'MIT'
15
15
 
@@ -21,6 +21,10 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'bundler', '~> 1.7'
22
22
  spec.add_development_dependency 'rake', '~> 10.0'
23
23
  spec.add_development_dependency 'webmock', '~> 1.22'
24
+ spec.add_development_dependency 'rubocop', '~> 0.35.1'
25
+ spec.add_development_dependency 'rspec', '~> 3.1'
26
+ spec.add_development_dependency 'rspec-its', '~> 1.2'
27
+ spec.add_development_dependency 'sinatra', '~> 1.4'
24
28
 
25
29
  spec.add_dependency 'rest-client', '~> 1.8.0'
26
30
  end
@@ -13,24 +13,24 @@ describe Onfido::Applicant do
13
13
  'email' => 'chandler_bing_6@friends.com',
14
14
  'addresses' => [
15
15
  {
16
- 'flat_number' => '4',
17
- 'building_number' => '100',
18
- 'building_name' => 'Awesome Building',
19
- 'street' => 'Main Street',
20
- 'sub_street' => 'A sub street',
21
- 'town' => 'London',
22
- 'postcode' => 'SW4 6EH',
23
- 'country' => 'GBR'
16
+ 'flat_number' => '4',
17
+ 'building_number' => '100',
18
+ 'building_name' => 'Awesome Building',
19
+ 'street' => 'Main Street',
20
+ 'sub_street' => 'A sub street',
21
+ 'town' => 'London',
22
+ 'postcode' => 'SW4 6EH',
23
+ 'country' => 'GBR'
24
24
  },
25
25
  {
26
- 'flat_number' => '1',
27
- 'building_number' => '10',
28
- 'building_name' => 'Great Building',
29
- 'street' => 'Old Street',
30
- 'sub_street' => 'Sub Street',
31
- 'town' => 'London',
32
- 'postcode' => 'SW1 4NG',
33
- 'country' => 'GBR'
26
+ 'flat_number' => '1',
27
+ 'building_number' => '10',
28
+ 'building_name' => 'Great Building',
29
+ 'street' => 'Old Street',
30
+ 'sub_street' => 'Sub Street',
31
+ 'town' => 'London',
32
+ 'postcode' => 'SW1 4NG',
33
+ 'country' => 'GBR'
34
34
  }
35
35
  ]
36
36
  }
@@ -42,9 +42,10 @@ describe Onfido::Applicant do
42
42
  # is only for semantic reasons
43
43
 
44
44
  it 'serializes the payload correctly' do
45
- WebMock.after_request do |request_signature, response|
45
+ WebMock.after_request do |request_signature, _response|
46
46
  if request_signature.uri.path == 'v1/applicants'
47
- expect(Rack::Utils.parse_nested_query(request_signature.body)).to eq(params)
47
+ expect(Rack::Utils.parse_nested_query(request_signature.body)).
48
+ to eq(params)
48
49
  end
49
50
  end
50
51
  end
@@ -3,12 +3,7 @@ describe Onfido::Check do
3
3
  let(:applicant_id) { '61f659cb-c90b-4067-808a-6136b5c01351' }
4
4
 
5
5
  describe '#create' do
6
- let(:params) do
7
- {
8
- type: 'express',
9
- reports: [{name: 'identity'}]
10
- }
11
- end
6
+ let(:params) { { type: 'express', reports: [{ name: 'identity' }] } }
12
7
 
13
8
  it 'creates a new check for an applicant' do
14
9
  response = check.create(applicant_id, params)
@@ -10,18 +10,19 @@ describe Onfido::Document do
10
10
  end
11
11
 
12
12
  let(:file) { Tempfile.new(['passport', '.jpg']) }
13
+ before { allow(document).to receive(:open).and_return(:file) }
13
14
  let(:params) do
14
15
  {
15
16
  type: 'passport',
16
17
  side: 'back',
17
18
  file: file
18
19
  }
19
- let(:applicant_id) { '1030303-123123-123123' }
20
+ end
21
+ let(:applicant_id) { '1030303-123123-123123' }
20
22
 
21
- it 'creates a new document' do
22
- response = document.create('foobar', params)
23
- expect(response['id']).not_to be_nil
24
- end
23
+ it 'creates a new document' do
24
+ response = document.create('foobar', params)
25
+ expect(response['id']).not_to be_nil
25
26
  end
26
27
  end
27
28
  end
@@ -4,74 +4,32 @@ describe Onfido::Resource do
4
4
  let(:api_key) { 'some_key' }
5
5
  let(:payload) { { postcode: 'SE1 4NG' } }
6
6
 
7
-
8
- before do
9
- allow(Onfido).to receive(:api_key).and_return(api_key)
10
- end
7
+ before { allow(Onfido).to receive(:api_key).and_return(api_key) }
11
8
 
12
9
  context '4xx response' do
13
10
  let(:path) { '4xx_response' }
14
11
 
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
12
+ it 'raises a custom error' do
13
+ expect { resource.get(url: url, payload: payload) }.
14
+ to raise_error(Onfido::RequestError, 'Something went wrong')
31
15
  end
32
16
  end
33
17
 
34
18
  context 'unexpected error format' do
35
19
  let(:path) { 'unexpected_error_format' }
36
20
 
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
21
+ it 'raises a custom error' do
22
+ expect { resource.get(url: url, payload: payload) }.
23
+ to raise_error(Onfido::RequestError, /response code was 400/)
53
24
  end
54
25
  end
55
26
 
56
27
  context 'unparseable JSON' do
57
28
  let(:path) { 'unparseable_response' }
58
29
 
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
30
+ it 'raises a custom error' do
31
+ expect { resource.get(url: url, payload: payload) }.
32
+ to raise_error(Onfido::RequestError, /response code was 504/)
75
33
  end
76
34
  end
77
35
 
@@ -83,7 +41,7 @@ describe Onfido::Resource do
83
41
  end
84
42
 
85
43
  it 'raises a ConnectionError' do
86
- expect { resource.get({ url: Onfido.endpoint, payload: payload }) }.
44
+ expect { resource.get(url: Onfido.endpoint, payload: payload) }.
87
45
  to raise_error(Onfido::ConnectionError, /Could not connect/)
88
46
  end
89
47
  end
@@ -96,7 +54,7 @@ describe Onfido::Resource do
96
54
  end
97
55
 
98
56
  it 'raises a ConnectionError' do
99
- expect { resource.get({ url: Onfido.endpoint, payload: payload }) }.
57
+ expect { resource.get(url: Onfido.endpoint, payload: payload) }.
100
58
  to raise_error(Onfido::ConnectionError, /connection to the server/)
101
59
  end
102
60
  end
@@ -109,7 +67,7 @@ describe Onfido::Resource do
109
67
  end
110
68
 
111
69
  it 'raises a ConnectionError' do
112
- expect { resource.get({ url: Onfido.endpoint, payload: payload }) }.
70
+ expect { resource.get(url: Onfido.endpoint, payload: payload) }.
113
71
  to raise_error(Onfido::ConnectionError, /SSL certificate/)
114
72
  end
115
73
  end
@@ -3,7 +3,7 @@ describe Onfido::Report do
3
3
  let(:check_id) { '8546921-123123-123123' }
4
4
 
5
5
  describe '#find' do
6
- let(:report_id) {'6951786-123123-422221' }
6
+ let(:report_id) { '6951786-123123-422221' }
7
7
 
8
8
  it 'returns a report for an existing check' do
9
9
  response = report.find(check_id, report_id)
@@ -0,0 +1,18 @@
1
+ describe Onfido::ConnectionError do
2
+ subject(:error) do
3
+ described_class.new(
4
+ "Invalid response object from API",
5
+ response_code: response_code,
6
+ response_body: response_body
7
+ )
8
+ end
9
+
10
+ let(:response_code) { nil }
11
+ let(:response_body) { nil }
12
+
13
+ context "without a response_body" do
14
+ its(:json_body) { is_expected.to be_nil }
15
+ its(:type) { is_expected.to be_nil }
16
+ its(:fields) { is_expected.to be_nil }
17
+ end
18
+ end
@@ -1,10 +1,10 @@
1
1
  describe Onfido::RequestError do
2
2
  subject(:error) do
3
- described_class.new(failed_response['error']['message']).tap do |e|
4
- e.type = failed_response['error']['type']
5
- e.fields = failed_response['error']['fields']
6
- e.response_code = 401
7
- end
3
+ described_class.new(
4
+ failed_response['error']['message'],
5
+ response_code: 401,
6
+ response_body: failed_response.to_json
7
+ )
8
8
  end
9
9
 
10
10
  let(:failed_response) do
@@ -14,26 +14,21 @@ describe Onfido::RequestError do
14
14
  'id' => '551722cc964860653c00c202',
15
15
  'type' => 'authorization_error',
16
16
  'message' => 'Authorization error: please re-check your credentials',
17
- 'fields' => {'name' => {'messages' => ['cannot be blank']} }
17
+ 'fields' => { 'name' => { 'messages' => ['cannot be blank'] } }
18
18
  }
19
19
  }
20
20
  end
21
21
 
22
- context 'when there is a request error' do
23
- it 'returns the right message' do
24
- expect { raise error }.to raise_error('Authorization error: please re-check your credentials')
25
- end
26
-
27
- it 'has the right error type' do
28
- expect(error.type).to eq('authorization_error')
29
- end
30
-
31
- it 'has the right affected fields' do
32
- expect(error.fields).to eq({'name' => {'messages' => ['cannot be blank']} })
33
- end
22
+ it 'returns the right message' do
23
+ expect { raise error }.
24
+ to raise_error('Authorization error: please re-check your credentials')
25
+ end
34
26
 
35
- it 'has the right response code' do
36
- expect(error.response_code).to eq(401)
37
- end
27
+ its(:type) { is_expected.to eq('authorization_error') }
28
+ its(:response_code) { is_expected.to eq(401) }
29
+ its(:response_body) { is_expected.to eq(failed_response.to_json) }
30
+ its(:json_body) { is_expected.to eq(failed_response) }
31
+ its(:fields) do
32
+ is_expected.to eq('name' => { 'messages' => ['cannot be blank'] })
38
33
  end
39
34
  end
@@ -4,10 +4,8 @@ describe Onfido::Resource do
4
4
  let(:path) { 'addresses/pick' }
5
5
  let(:api_key) { 'some_key' }
6
6
 
7
- before do
8
- allow(Onfido).to receive(:endpoint).and_return(endpoint)
9
- allow(Onfido).to receive(:api_key).and_return(api_key)
10
- end
7
+ before { allow(Onfido).to receive(:endpoint).and_return(endpoint) }
8
+ before { allow(Onfido).to receive(:api_key).and_return(api_key) }
11
9
 
12
10
  describe '#url_for' do
13
11
  it 'composes the full api url' do
@@ -19,9 +17,9 @@ describe Onfido::Resource do
19
17
  %i(put delete patch).each do |method|
20
18
  context "for unsupported HTTP method: #{method}" do
21
19
  it 'raises an error' do
22
- expect {
20
+ expect do
23
21
  resource.public_send(method)
24
- }.to raise_error(NoMethodError)
22
+ end.to raise_error(NoMethodError)
25
23
  end
26
24
  end
27
25
  end
@@ -31,7 +29,7 @@ describe Onfido::Resource do
31
29
  %i(get post).each do |method|
32
30
  context "for supported HTTP method: #{method}" do
33
31
  let(:url) { endpoint + path }
34
- let(:payload) { {postcode: 'SE1 4NG'} }
32
+ let(:payload) { { postcode: 'SE1 4NG' } }
35
33
  let(:response) do
36
34
  {
37
35
  'addresses' => [
@@ -46,8 +44,8 @@ describe Onfido::Resource do
46
44
  end
47
45
 
48
46
  before do
49
- expect(RestClient::Request).to receive(:execute)
50
- .with(
47
+ expect(RestClient::Request).to receive(:execute).
48
+ with(
51
49
  url: url,
52
50
  payload: Rack::Utils.build_query(payload),
53
51
  method: method,
@@ -61,7 +59,7 @@ describe Onfido::Resource do
61
59
  end
62
60
 
63
61
  it 'makes a request to an endpoint' do
64
- expect(resource.public_send(method, {url: url, payload: payload})).
62
+ expect(resource.public_send(method, url: url, payload: payload)).
65
63
  to eq(response)
66
64
  end
67
65
  end
data/spec/onfido_spec.rb CHANGED
@@ -2,34 +2,33 @@ describe Onfido do
2
2
  subject(:onfido) { described_class }
3
3
 
4
4
  context 'configuration' do
5
- before do
6
- onfido.reset
7
- end
5
+ before { onfido.reset }
8
6
 
9
- {api_key: nil, endpoint: 'https://api.onfido.com/v1/', throws_exceptions: true}.each do |config_key, value|
10
- describe ".#{config_key}" do
11
- it 'returns the default value' do
12
- expect(onfido.public_send(config_key)).to eq(value)
13
- end
7
+ describe "default values" do
8
+ describe ".api_key" do
9
+ subject { onfido.api_key }
10
+ it { is_expected.to be_nil }
14
11
  end
15
- end
16
12
 
17
- {api_key: 'some_key', throws_exceptions: false}.each do |config_key, new_value|
18
- describe ".#{config_key}=" do
19
- it 'changes the configuration to the new value' do
20
- onfido.public_send("#{config_key}=", new_value)
21
- expect(onfido.public_send(config_key)).to eq(new_value)
22
- end
13
+ describe ".endpoint" do
14
+ subject { onfido.endpoint }
15
+ it { is_expected.to eq('https://api.onfido.com/v1/') }
16
+ end
17
+
18
+ describe ".logger" do
19
+ subject { onfido.logger }
20
+ it { is_expected.to be_an_instance_of(Onfido::NullLogger) }
23
21
  end
24
22
  end
25
23
 
26
- describe '.logger' do
27
- context 'when no option is passed' do
28
- it 'returns the default value' do
29
- expect(onfido.logger).to be_an_instance_of(Onfido::NullLogger)
30
- end
24
+ describe "setting an API key" do
25
+ it 'changes the configuration to the new value' do
26
+ onfido.api_key = 'some_key'
27
+ expect(onfido.api_key).to eq('some_key')
31
28
  end
29
+ end
32
30
 
31
+ describe '.logger' do
33
32
  context 'when an option is passed' do
34
33
  context 'when the option passed behaves like a logger' do
35
34
  let(:logger_like) { double('LoggerLike', :<< => nil) }
@@ -44,9 +43,10 @@ describe Onfido do
44
43
  let(:non_logger) { double('NotLogger') }
45
44
 
46
45
  it 'raises an error' do
47
- expect {
48
- onfido.logger = non_logger
49
- }.to raise_error("#{non_logger.class} doesn't seem to behave like a logger!")
46
+ expect { onfido.logger = non_logger }.
47
+ to raise_error(
48
+ "#{non_logger.class} doesn't seem to behave like a logger!"
49
+ )
50
50
  end
51
51
  end
52
52
  end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
2
  $LOAD_PATH.unshift(File.dirname(__FILE__))
3
- Dir[File.dirname(__FILE__).concat("/support/**/*.rb")].each {|f| require f}
3
+ Dir[File.dirname(__FILE__).concat("/support/**/*.rb")].each { |f| require f }
4
4
 
5
5
  require 'onfido'
6
6
  require 'webmock/rspec'
7
+ require 'rspec/its'
7
8
 
8
9
  WebMock.disable_net_connect!(allow_localhost: true)
9
10
 
@@ -30,6 +31,7 @@ RSpec.configure do |config|
30
31
  config.filter_run :focus
31
32
  config.run_all_when_everything_filtered = true
32
33
  config.disable_monkey_patching!
34
+ config.raise_errors_for_deprecations!
33
35
  config.warnings = false
34
36
  config.expose_dsl_globally = true
35
37
 
@@ -15,7 +15,7 @@ class FakeOnfidoAPI < Sinatra::Base
15
15
 
16
16
  get '/v1/applicants' do
17
17
  response = json_response(200, 'applicants.json')
18
- {applicants: JSON.parse(response)['applicants'][pagination_range]}.to_json
18
+ { applicants: JSON.parse(response)['applicants'][pagination_range] }.to_json
19
19
  end
20
20
 
21
21
  post '/v1/applicants/:id/documents' do
@@ -32,7 +32,7 @@ class FakeOnfidoAPI < Sinatra::Base
32
32
 
33
33
  get '/v1/applicants/:id/checks' do
34
34
  response = json_response(200, 'checks.json')
35
- {checks: JSON.parse(response)['checks'][pagination_range]}.to_json
35
+ { checks: JSON.parse(response)['checks'][pagination_range] }.to_json
36
36
  end
37
37
 
38
38
  get '/v1/checks/:id/reports' do
@@ -6,5 +6,5 @@
6
6
  "file_type": "png",
7
7
  "file_size": 282870,
8
8
  "type": "passport",
9
- "side": 'back'
9
+ "side": "back"
10
10
  }
metadata CHANGED
@@ -1,10 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onfido
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pericles Theodorou
8
+ - Grey Baker
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
@@ -52,6 +53,62 @@ dependencies:
52
53
  - - ~>
53
54
  - !ruby/object:Gem::Version
54
55
  version: '1.22'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rubocop
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 0.35.1
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 0.35.1
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '3.1'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ~>
82
+ - !ruby/object:Gem::Version
83
+ version: '3.1'
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec-its
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ version: '1.2'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: '1.2'
98
+ - !ruby/object:Gem::Dependency
99
+ name: sinatra
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ~>
103
+ - !ruby/object:Gem::Version
104
+ version: '1.4'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ version: '1.4'
55
112
  - !ruby/object:Gem::Dependency
56
113
  name: rest-client
57
114
  requirement: !ruby/object:Gem::Requirement
@@ -66,20 +123,21 @@ dependencies:
66
123
  - - ~>
67
124
  - !ruby/object:Gem::Version
68
125
  version: 1.8.0
69
- description: A wrapper for Onfido API 1.0
126
+ description: A wrapper for Onfido API
70
127
  email:
71
128
  - periclestheo@gmail.com
129
+ - grey@gocardless.com
72
130
  executables: []
73
131
  extensions: []
74
132
  extra_rdoc_files: []
75
133
  files:
76
134
  - .gitignore
77
135
  - .rspec
136
+ - .rubocop.yml
78
137
  - .travis.yml
79
138
  - CHANGELOG.md
80
139
  - Gemfile
81
140
  - LICENSE
82
- - LICENSE.txt
83
141
  - README.md
84
142
  - Rakefile
85
143
  - lib/onfido.rb
@@ -90,6 +148,7 @@ files:
90
148
  - lib/onfido/configuration.rb
91
149
  - lib/onfido/document.rb
92
150
  - lib/onfido/errors/connection_error.rb
151
+ - lib/onfido/errors/onfido_error.rb
93
152
  - lib/onfido/errors/request_error.rb
94
153
  - lib/onfido/null_logger.rb
95
154
  - lib/onfido/report.rb
@@ -102,6 +161,7 @@ files:
102
161
  - spec/integrations/document_spec.rb
103
162
  - spec/integrations/exceptions_spec.rb
104
163
  - spec/integrations/report_spec.rb
164
+ - spec/onfido/connection_error_spec.rb
105
165
  - spec/onfido/request_error_spec.rb
106
166
  - spec/onfido/resource_spec.rb
107
167
  - spec/onfido_spec.rb
@@ -140,7 +200,7 @@ rubyforge_project:
140
200
  rubygems_version: 2.2.2
141
201
  signing_key:
142
202
  specification_version: 4
143
- summary: A wrapper for Onfido API 1.0
203
+ summary: A wrapper for Onfido API
144
204
  test_files:
145
205
  - spec/integrations/address_spec.rb
146
206
  - spec/integrations/applicant_spec.rb
@@ -148,6 +208,7 @@ test_files:
148
208
  - spec/integrations/document_spec.rb
149
209
  - spec/integrations/exceptions_spec.rb
150
210
  - spec/integrations/report_spec.rb
211
+ - spec/onfido/connection_error_spec.rb
151
212
  - spec/onfido/request_error_spec.rb
152
213
  - spec/onfido/resource_spec.rb
153
214
  - spec/onfido_spec.rb
data/LICENSE.txt DELETED
@@ -1,22 +0,0 @@
1
- Copyright (c) 2015 Pericles Theodorou
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.