smile-identity-core 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 433c708dc96d30936d66a28a8722bb0947390d154c0d2ace346ce8381b237fe6
4
- data.tar.gz: 84f5459883048c3ee08eb9ee38d6e890d910e4d3a133b39d35eb932603140d70
3
+ metadata.gz: 242bd9cb947cb4734124d9c281ddf07911b0d8c7a2fe6fdd908546934c1a0dca
4
+ data.tar.gz: a411c7cf697a15cc5a5c4c618a50795f8c24d1057126e599e82ceb98795cbecd
5
5
  SHA512:
6
- metadata.gz: badf204f3108464b9e9eaef9884b38f446a7bb26a7f6b72e39e90b6a7a64c474bcc14f22f637cbdeecb6533c487a340ccdfe6d18558b90c10857c8cdbe90c112
7
- data.tar.gz: dc5e0266ec8007cd88b41d35164cbb3fa71fc299207779817678f8a75663ecd455ea536a6ee13a0d94cfdfc67ca93f3eaae2feed223dd4059bedcf025d8abb92
6
+ metadata.gz: aeed377d63e6655d1c4659a0b26a49c633f8ec03e8c1204fdf2553cb1618135ffa09b9ae55923bd291c2674257ec9ba85fb41f2769297ef7703bcce78b5a14a3
7
+ data.tar.gz: ff670ae6913b44a02b394c264aa5aa9a01215162da762827978774f92f10de736b424be6739145939eca26d1173fd90acd55acc67b714ab75496a23e01628a15
data/CHANGELOG.md CHANGED
@@ -13,3 +13,14 @@ Some package configurations were added.
13
13
  ### Added
14
14
  Removed two parameters: optional_callback and return_job_status in the submit_job function in favour of an options hash.
15
15
  Introduced return_history and image_links
16
+
17
+ ## [0.2.1] - 2019-09-05
18
+ ### Updated
19
+ Updates to the readme
20
+ Update some error messages
21
+ Use the signature class in the Web API class
22
+ Accept more formats as inputs
23
+ Fix the loss of optional_callback
24
+ Ensure that we allow nil inputs or empty hashes for options and id_info
25
+ Confirm the signature when querying the job status
26
+ Add a Utilities class with get_job_status that we use internally to expose a public get_job_status method on WebApi
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- smile-identity-core (0.2.0)
4
+ smile-identity-core (0.2.1)
5
5
  rubyzip (~> 1.2, >= 1.2.3)
6
6
  typhoeus (~> 1.0, >= 1.0.1)
7
7
 
data/README.md CHANGED
@@ -1,24 +1,34 @@
1
1
  # SmileIdentityCore
2
2
 
3
- The official Smile Identity gem exposes two classes namely, the Web API and AuthSmile class.
3
+ The official Smile Identity gem exposes two classes namely, the Web API and Signature class.
4
4
 
5
- The Web API allows you as the Partner to validate a user’s identity against the relevant Identity Authorities/Third Party databases that Smile Identity has access to using ID information provided by your customer/user (including photo for compare).
5
+ The **Web API Class** allows you as the Partner to validate a user’s identity against the relevant Identity Authorities/Third Party databases that Smile Identity has access to using ID information provided by your customer/user (including photo for compare). It has the following public methods:
6
+ - submit_job
7
+ - get_job_status
6
8
 
7
- The Signature class allows you as the Partner to generate a sec key to interact with our servers.
9
+ The **Signature Class** allows you as the Partner to generate a sec key to interact with our servers. It has the following public methods:
10
+ - generate_sec_key
11
+ - confirm_sec_key
12
+
13
+ <!-- The **Utilities Class** allows you as the Partner to have access to our general Utility functions to gain access to your data. It has the following public methods:
14
+ - get_job_status -->
8
15
 
9
16
  ## Documentation
10
17
 
11
18
  This gem requires specific input parameters, for more detail on these parameters please refer to our [documentation for Web API](https://docs-smileid.herokuapp.com/docs#web-api-introduction).
12
19
 
13
- Please note that you will have to be a Smile Identity Partner to be able to query our services.
14
- ## Usage
20
+ Please note that you will have to be a Smile Identity Partner to be able to query our services. You can sign up on the [Portal](https://test-smileid.herokuapp.com/signup?products[]=1-IDVALIDATION&products[]=2-AUTHENTICATION).
21
+
22
+ ## Installation
23
+
24
+ View the package on [Rubygems](https://rubygems.org/gems/smile-identity-core).
15
25
 
16
26
  Add this line to your application's Gemfile:
17
27
 
18
28
  ```ruby
19
29
  gem 'smile-identity-core'
20
30
  ```
21
- and
31
+ and require the package:
22
32
 
23
33
  ```ruby
24
34
  require 'smile-identity-core'
@@ -30,30 +40,20 @@ Or install it to your system as:
30
40
  $ gem install smile-identity-core
31
41
  ```
32
42
 
33
- #### Calculating your Signature
34
-
35
- ```
36
- $ connection = SmileIdentityCore::AuthSmile.new(partner_id, api_key)
43
+ You now may use the classes as follows:
37
44
 
38
- $ sec_key = connection.generate_sec_key(timestamp)
39
- where timestamp is optional
45
+ #### Web Api Class
40
46
 
47
+ ##### submit_job method
41
48
  ```
49
+ $ connection = SmileIdentityCore::WebApi.new(partner_id, default_callback, api_key, sid_server)
42
50
 
43
- The response will be a hash:
44
-
45
- ```
46
- {
47
- :sec_key=> "<the generated sec key>",
48
- :timestamp=> 1563283420
49
- }
51
+ $ response = connection.submit_job(partner_params, images, id_info, options)
50
52
  ```
51
53
 
52
- #### Web api
54
+ Please note that if you do not need to pass through id_info or options, you may omit calling those class and send through nil in submit_job, as follows:
53
55
  ```
54
- $ connection = SmileIdentityCore::WebApi.new(partner_id, default_callback, api_key, sid_server)
55
-
56
- $ response = connection.submit_job(partner_params, images, optional_callback, return_job_status)
56
+ String response = connection.submit_job(partner_params, images, nil, nil);
57
57
  ```
58
58
 
59
59
  The response will be nil if you chose to set return_job_status to false, however if you have set return_job_status to true then you will receive a response like below:
@@ -100,13 +100,81 @@ You can also view your response asynchronously at the callback that you have set
100
100
  }
101
101
  ```
102
102
 
103
+ ##### get_job_status method
104
+ Sometimes, you may want to get a particular job status at a later time. You may use the get_job_status function to do this:
105
+
106
+ You will already have your Web Api class initialised as follows:
107
+ ```ruby
108
+ connection = SmileIdentityCore::WebApi.new(partner_id, default_callback, api_key, sid_server)
109
+ ```
110
+
111
+ Thereafter, simply call get_job_status with the correct parameters:
112
+ ```ruby
113
+ response = connection.get_job_status(partner_params, options)
114
+
115
+ where options is {return_history: true | false, return_image_links: true | false}
116
+ ```
117
+
118
+ Please note that if you do not need to pass through options if you will not be using them, you may omit pass through an empty hash or nil instead:
119
+ ```ruby
120
+ response = connection.get_job_status(partner_params, nil);
121
+ ```
122
+
123
+ #### Signature Class
124
+
125
+ ##### generate_sec_key method
126
+
127
+ ```
128
+ $ connection = SmileIdentityCore::Signature.new(partner_id, api_key)
129
+
130
+ $ sec_key = connection.generate_sec_key(timestamp)
131
+ where timestamp is optional
132
+
133
+ ```
134
+
135
+ The response will be a hash:
136
+
137
+ ```
138
+ {
139
+ :sec_key=> "<the generated sec key>",
140
+ :timestamp=> 1563283420
141
+ }
142
+ ```
143
+
144
+ ##### confirm_sec_key method
145
+
146
+ You can also confirm the signature that you receive when you interacting with our servers, simply use the confirm_sec_key method which returns a boolean:
147
+
148
+ ```ruby
149
+ $ connection = SmileIdentityCore::Signature.new(partner_id, api_key)
150
+ $ sec_key = connection.confirm_sec_key(sec_key, timestamp)
151
+ ```
152
+
153
+ <!-- #### Utilities Class
154
+
155
+ You may want to receive more information about a job. This is built into Web Api if you choose to set return_job_status as true in the options hash. However, you also have the option to build the functionality yourself by using the Utilities class. Please note that if you are querying a job immediately after submitting it, you will need to poll it for the duration of the job.
156
+
157
+ ```java
158
+
159
+
160
+ utilities_connection = SmileIdentityCore::Utilities.new('partner_id', 'api_key' , sid_server)
161
+
162
+ utilities_connection.get_job_status('user_id', 'job_id', options)
163
+ where options is {return_history: true | false, return_image_links: true | false}
164
+ ``` -->
165
+
103
166
  ## Development
104
167
 
105
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
168
+ After checking out the repo, run `bundle install` to install dependencies. Then, run `bundle exec rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
169
+
170
+ To install this gem onto your local machine, run `bundle exec rake install`.
106
171
 
107
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
172
+ To release a new version:
173
+ - Update the version number in `version.rb`
174
+ - Run `gem build smile-identity-core.gemspec`
175
+ - Thereafter `gem push smile-identity-core-version.gem`.
108
176
 
109
- Please note that you should tag the release when doing a push to rubygems.
177
+ Make sure to git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
110
178
 
111
179
  ## Contributing
112
180
 
@@ -7,16 +7,34 @@ module SmileIdentityCore
7
7
  end
8
8
 
9
9
  def generate_sec_key(timestamp=Time.now.to_i)
10
- @timestamp = timestamp
10
+ begin
11
+ @timestamp = timestamp
11
12
 
12
- hash_signature = Digest::SHA256.hexdigest([@partner_id, @timestamp].join(":"))
13
- public_key = OpenSSL::PKey::RSA.new(Base64.strict_decode64(@api_key))
14
- @sec_key = [Base64.strict_encode64(public_key.public_encrypt(hash_signature)), hash_signature].join('|')
13
+ hash_signature = Digest::SHA256.hexdigest([@partner_id, @timestamp].join(":"))
14
+ public_key = OpenSSL::PKey::RSA.new(Base64.strict_decode64(@api_key))
15
+ @sec_key = [Base64.strict_encode64(public_key.public_encrypt(hash_signature)), hash_signature].join('|')
15
16
 
16
- return {
17
- sec_key: @sec_key,
18
- timestamp: @timestamp
19
- }
20
- end
17
+ return {
18
+ sec_key: @sec_key,
19
+ timestamp: @timestamp
20
+ }
21
+ rescue => e
22
+ raise e
23
+ end
24
+ end
25
+
26
+ def confirm_sec_key(timestamp, sec_key)
27
+ begin
28
+ hash_signature = Digest::SHA256.hexdigest([@partner_id, timestamp].join(":"))
29
+ encrypted = sec_key.split('|')[0]
30
+
31
+ public_key = OpenSSL::PKey::RSA.new(Base64.strict_decode64(@api_key))
32
+ decrypted = public_key.public_decrypt(Base64.strict_decode64(encrypted))
33
+
34
+ return decrypted == hash_signature
35
+ rescue => e
36
+ raise e
37
+ end
38
+ end
21
39
  end
22
40
  end
@@ -0,0 +1,83 @@
1
+ module SmileIdentityCore
2
+ class Utilities
3
+
4
+ def initialize(partner_id, api_key, sid_server)
5
+ @partner_id = partner_id.to_s
6
+ @api_key = api_key
7
+
8
+ if !(sid_server =~ URI::regexp)
9
+ sid_server_mapping = {
10
+ 0 => 'https://3eydmgh10d.execute-api.us-west-2.amazonaws.com/test',
11
+ 1 => 'https://la7am6gdm8.execute-api.us-west-2.amazonaws.com/prod'
12
+ }
13
+ @url = sid_server_mapping[sid_server.to_i]
14
+ else
15
+ @url = sid_server
16
+ end
17
+
18
+ @signature_connection = SmileIdentityCore::Signature.new(@partner_id, @api_key)
19
+
20
+ end
21
+
22
+ def get_job_status(user_id, job_id, options = {})
23
+
24
+ if(options.nil? || options.empty?)
25
+ options = {
26
+ return_history: false,
27
+ return_job_status: false
28
+ }
29
+ end
30
+
31
+ @timestamp = Time.now.to_i
32
+ return query_job_status(user_id, job_id, symbolize_keys(options))
33
+ end
34
+
35
+ private
36
+
37
+ def symbolize_keys params
38
+ (params.is_a?(Hash)) ? Hash[params.map{ |k, v| [k.to_sym, v] }] : params
39
+ end
40
+
41
+ def query_job_status(user_id, job_id, options)
42
+ url = "#{@url}/job_status"
43
+
44
+ request = Typhoeus::Request.new(
45
+ url,
46
+ headers: {'Content-Type': 'application/json', 'Accept': 'application/json'},
47
+ method: :post,
48
+ body: configure_job_query(user_id, job_id, options)
49
+ )
50
+
51
+ request.on_complete do |response|
52
+ begin
53
+ body = JSON.parse(response.body)
54
+
55
+ valid = @signature_connection.confirm_sec_key(body['timestamp'], body['signature'])
56
+
57
+ if(!valid)
58
+ raise "Unable to confirm validity of the job_status response"
59
+ end
60
+
61
+ return body
62
+ rescue => e
63
+ raise e
64
+ end
65
+ end
66
+
67
+ request.run
68
+ end
69
+
70
+ def configure_job_query(user_id, job_id, options)
71
+ return {
72
+ sec_key: @signature_connection.generate_sec_key(@timestamp)[:sec_key],
73
+ timestamp: @timestamp,
74
+ user_id: user_id,
75
+ job_id: job_id,
76
+ partner_id: @partner_id,
77
+ image_links: options[:return_image_links] || false,
78
+ history: options[:return_history] || false
79
+ }.to_json
80
+ end
81
+
82
+ end
83
+ end
@@ -1,3 +1,3 @@
1
1
  module SmileIdentityCore
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -15,6 +15,7 @@ module SmileIdentityCore
15
15
  @callback_url = default_callback
16
16
  @api_key = api_key
17
17
 
18
+ @sid_server = sid_server
18
19
  if !(sid_server =~ URI::regexp)
19
20
  sid_server_mapping = {
20
21
  0 => 'https://3eydmgh10d.execute-api.us-west-2.amazonaws.com/test',
@@ -24,22 +25,21 @@ module SmileIdentityCore
24
25
  else
25
26
  @url = sid_server
26
27
  end
27
-
28
28
  end
29
29
 
30
30
  def submit_job(partner_params, images, id_info, options)
31
- self.partner_params = partner_params
31
+ self.partner_params = symbolize_keys partner_params
32
32
  self.images = images
33
33
  @timestamp = Time.now.to_i
34
34
 
35
- self.id_info = id_info
36
- self.options = options
35
+ self.id_info = symbolize_keys id_info
36
+ self.options = symbolize_keys options
37
37
 
38
- if options[:optional_callback] && options[:optional_callback].length > 0
39
- @callback_url = options[:optional_callback]
38
+ if @options[:optional_callback] && @options[:optional_callback].length > 0
39
+ @callback_url = @options[:optional_callback]
40
40
  end
41
41
 
42
- if partner_params[:job_type].to_i == 1
42
+ if @partner_params[:job_type].to_i == 1
43
43
  validate_enroll_with_id
44
44
  end
45
45
 
@@ -48,13 +48,24 @@ module SmileIdentityCore
48
48
  return setup_requests
49
49
  end
50
50
 
51
+ def get_job_status(partner_params, options)
52
+ partner_params = symbolize_keys partner_params
53
+ @timestamp = Time.now.to_i
54
+
55
+ user_id = partner_params[:user_id]
56
+ job_id = partner_params[:job_id]
57
+
58
+ utilities = SmileIdentityCore::Utilities.new(@partner_id, @api_key, @sid_server)
59
+ return utilities.get_job_status(user_id, job_id, options);
60
+ end
61
+
51
62
  def partner_params=(partner_params)
52
63
  if partner_params == nil
53
64
  raise ArgumentError.new('Please ensure that you send through partner params')
54
65
  end
55
66
 
56
67
  if !partner_params.is_a?(Hash)
57
- raise ArgumentError.new('Partner params needs to be an object')
68
+ raise ArgumentError.new('Partner params needs to be a hash')
58
69
  end
59
70
 
60
71
  [:user_id, :job_id, :job_type].each do |key|
@@ -80,11 +91,28 @@ module SmileIdentityCore
80
91
  raise ArgumentError.new('You need to send through at least one selfie image')
81
92
  end
82
93
 
83
- @images = images
94
+ @images = images.map { |image| symbolize_keys image }
84
95
  end
85
96
 
86
97
  def id_info=(id_info)
87
- if id_info[:entered] == 'true'
98
+
99
+ updated_id_info = id_info
100
+
101
+ if updated_id_info.nil?
102
+ updated_id_info = {}
103
+ end
104
+
105
+ # if it doesnt exist, set it false
106
+ if(!updated_id_info.key?(:entered) || id_info[:entered].empty?)
107
+ updated_id_info[:entered] = "false"
108
+ end
109
+
110
+ # if it's a boolean
111
+ if(!!updated_id_info[:entered] == updated_id_info[:entered])
112
+ updated_id_info[:entered] = id_info[:entered].to_s
113
+ end
114
+
115
+ if updated_id_info[:entered] && updated_id_info[:entered] == 'true'
88
116
  [:first_name, :last_name, :country, :id_type, :id_number].each do |key|
89
117
  unless id_info[key] && !id_info[key].nil? && !id_info[key].empty?
90
118
  raise ArgumentError.new("Please make sure that #{key.to_s} is included in the id_info")
@@ -92,14 +120,25 @@ module SmileIdentityCore
92
120
  end
93
121
  end
94
122
 
95
- @id_info = id_info
123
+ if updated_id_info[:country] && updated_id_info[:country].upcase == 'NG' && ['PASSPORT', 'VOTER_ID', 'DRIVERS_LICENSE', 'NATIONAL_ID', 'TIN', 'CAC'].include?(updated_id_info[:id_type].upcase) && (!updated_id_info[:dob] || updated_id_info[:dob].empty? || updated_id_info[:dob].nil?)
124
+ raise ArgumentError.new("The ID type #{updated_id_info[:id_type]} for #{updated_id_info[:country]} requires a valid dob paramater.")
125
+ end
126
+
127
+ @id_info = updated_id_info
96
128
  end
97
129
 
98
130
  def options=(options)
99
- updated_options = {}
131
+ updated_options = options
132
+
133
+ if updated_options.nil?
134
+ updated_options = {}
135
+ end
136
+
100
137
  [:optional_callback, :return_job_status, :return_image_links, :return_history].map do |key|
101
138
  if key != :optional_callback
102
- updated_options[key] = check_boolean(key, options[key])
139
+ updated_options[key] = check_boolean(key, options)
140
+ else
141
+ updated_options[key] = check_string(key, options)
103
142
  end
104
143
  end
105
144
 
@@ -108,6 +147,10 @@ module SmileIdentityCore
108
147
 
109
148
  private
110
149
 
150
+ def symbolize_keys params
151
+ (params.is_a?(Hash)) ? Hash[params.map{ |k, v| [k.to_sym, v] }] : params
152
+ end
153
+
111
154
  def validate_return_data
112
155
  if (!@callback_url || @callback_url.empty?) && !@options[:return_job_status]
113
156
  raise ArgumentError.new("Please choose to either get your response via the callback or job status query")
@@ -120,26 +163,33 @@ module SmileIdentityCore
120
163
  end
121
164
  end
122
165
 
123
- def check_boolean(key, bool)
124
- if (!bool)
125
- bool = false;
166
+ def check_boolean(key, obj)
167
+ if (!obj || !obj[key])
168
+ return false
126
169
  end
127
170
 
128
- if !!bool != bool
171
+ if !!obj[key] != obj[key]
129
172
  raise ArgumentError.new("#{key} needs to be a boolean")
130
173
  end
131
174
 
132
- return bool
175
+ return obj[key]
176
+ end
177
+
178
+ def check_string(key, obj)
179
+ if (!obj || !obj[key])
180
+ return ''
181
+ else
182
+ return obj[key]
183
+ end
133
184
  end
134
185
 
135
186
  def determine_sec_key
136
- hash_signature = Digest::SHA256.hexdigest([@partner_id.to_i, @timestamp].join(":"))
137
- public_key = OpenSSL::PKey::RSA.new(Base64.decode64(@api_key))
138
- @sec_key = [Base64.encode64(public_key.public_encrypt(hash_signature)), hash_signature].join('|')
187
+ @sec_key = SmileIdentityCore::Signature.new(@partner_id, @api_key).generate_sec_key(@timestamp)[:sec_key]
139
188
  end
140
189
 
141
190
  def configure_prep_upload_json
142
- body = {
191
+
192
+ body = {
143
193
  file_name: 'selfie.zip',
144
194
  timestamp: @timestamp,
145
195
  sec_key: determine_sec_key,
@@ -182,7 +232,6 @@ module SmileIdentityCore
182
232
  end
183
233
  end
184
234
  request.run
185
-
186
235
  end
187
236
 
188
237
  def configure_info_json(server_information)
@@ -276,6 +325,7 @@ module SmileIdentityCore
276
325
  request.on_complete do |response|
277
326
  if response.success?
278
327
  if @options[:return_job_status]
328
+ @utilies_connection = SmileIdentityCore::Utilities.new(@partner_id, @api_key, @sid_server)
279
329
  return query_job_status
280
330
  else
281
331
  return
@@ -295,51 +345,17 @@ module SmileIdentityCore
295
345
  end
296
346
 
297
347
  def query_job_status(counter=0)
298
- job_complete = false
299
348
  counter < 4 ? (sleep 2) : (sleep 6)
300
349
  counter += 1
301
350
 
302
- body = {
303
- sec_key: @sec_key,
304
- timestamp: @timestamp,
305
- user_id: @partner_params[:user_id],
306
- job_id: @partner_params[:job_id],
307
- partner_id: @partner_id,
308
- image_links: @options[:return_image_links],
309
- history: @options[:return_history]
310
- }.to_json
311
-
312
- url = "#{@url}/job_status"
351
+ response = @utilies_connection.get_job_status(@partner_params[:user_id], @partner_params[:job_id], @options)
313
352
 
314
- request = Typhoeus::Request.new(
315
- url,
316
- headers: {'Content-Type': 'application/json', 'Accept': 'application/json'},
317
- method: :post,
318
- body: body
319
- )
320
-
321
- request.on_complete do |response|
322
-
323
- if response.code == 0
324
- return query_job_status(counter)
325
- else
326
- begin
327
- status_body = JSON.load(response.body)
328
- job_complete = status_body['job_complete'].to_s
329
- rescue => e
330
- puts e.message
331
- puts e.backtrace
332
- end
333
-
334
- if job_complete == 'true' || counter == 20
335
- return JSON.parse(response.body)
336
- else
337
- return query_job_status(counter)
338
- end
339
- end
353
+ if response && (response['job_complete'] == true || counter == 20)
354
+ return response
355
+ else
356
+ return query_job_status(counter)
340
357
  end
341
358
 
342
- request.run
343
359
  end
344
360
  end
345
361
  end
@@ -1,6 +1,7 @@
1
1
  require "smile-identity-core/version"
2
2
  require "smile-identity-core/web_api.rb"
3
3
  require "smile-identity-core/signature.rb"
4
+ require "smile-identity-core/utilities.rb"
4
5
 
5
6
  module SmileIdentityCore
6
7
  class Error < StandardError; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smile-identity-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ridhwana
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-14 00:00:00.000000000 Z
11
+ date: 2019-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -125,9 +125,9 @@ files:
125
125
  - bin/setup
126
126
  - lib/smile-identity-core.rb
127
127
  - lib/smile-identity-core/signature.rb
128
+ - lib/smile-identity-core/utilities.rb
128
129
  - lib/smile-identity-core/version.rb
129
130
  - lib/smile-identity-core/web_api.rb
130
- - smile-identity-core-0.1.0.gem
131
131
  - smile-identity-core.gemspec
132
132
  - travis.yml
133
133
  homepage: https://www.smileidentity.com/
Binary file