smile-identity-core 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bda3379b4814443893498daad4c1ebcc02f3b2163be29f442d28e318d5e394a9
4
+ data.tar.gz: '039561ebc2b625a064fa40f5907448f986df7d8055072a73dcbd54da8cba9a73'
5
+ SHA512:
6
+ metadata.gz: c105ee36a4d54af7889fd7c039d33211eaf842fe35c0effb0d32885bc00abc4c527a03742f4d999605565ad038b1a4f9dba815b9df55db3871529912151db7b7
7
+ data.tar.gz: e0a68caee85a1b89891c18816d02410349d289fb69a134272528fca30a10d1ba8c6e71ad7497d9ae39789bc136e9eee9e6ac5a6b829391b903a4ba206fc73405
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.5.1
7
+ before_install: gem install bundler -v 2.0.2
data/CHANGELOG.md ADDED
@@ -0,0 +1,6 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ ## [0.1.0] - 2019-07-19
5
+ ### Added
6
+ The first release version of Web Api.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in smile-identity-core.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,51 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ smile-identity-core (0.1.0)
5
+ rubyzip (~> 1.2, >= 1.2.3)
6
+ typhoeus (~> 1.0, >= 1.0.1)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ diff-lcs (1.3)
12
+ docile (1.1.5)
13
+ ethon (0.12.0)
14
+ ffi (>= 1.3.0)
15
+ ffi (1.11.1)
16
+ json (2.2.0)
17
+ rake (10.5.0)
18
+ rspec (3.8.0)
19
+ rspec-core (~> 3.8.0)
20
+ rspec-expectations (~> 3.8.0)
21
+ rspec-mocks (~> 3.8.0)
22
+ rspec-core (3.8.1)
23
+ rspec-support (~> 3.8.0)
24
+ rspec-expectations (3.8.4)
25
+ diff-lcs (>= 1.2.0, < 2.0)
26
+ rspec-support (~> 3.8.0)
27
+ rspec-mocks (3.8.1)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.8.0)
30
+ rspec-support (3.8.2)
31
+ rubyzip (1.2.3)
32
+ simplecov (0.12.0)
33
+ docile (~> 1.1.0)
34
+ json (>= 1.8, < 3)
35
+ simplecov-html (~> 0.10.0)
36
+ simplecov-html (0.10.2)
37
+ typhoeus (1.3.1)
38
+ ethon (>= 0.9.0)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ bundler (~> 2.0)
45
+ rake (~> 10.0)
46
+ rspec (~> 3.0)
47
+ simplecov (~> 0.12.0)
48
+ smile-identity-core!
49
+
50
+ BUNDLED WITH
51
+ 2.0.2
data/README.md ADDED
@@ -0,0 +1,107 @@
1
+ # SmileIdentityCore
2
+
3
+ The official Smile Identity gem exposes two classes namely, the Web API and AuthSmile class.
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).
6
+
7
+ The Auth Smile class allows you as the Partner to generate a sec key to interact with our servers.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'smile-identity-core'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install smile-identity-core
24
+
25
+ ## Usage
26
+
27
+
28
+ #### Calculating your Signature
29
+ ```
30
+ $ connection = SmileIdentityCore::AuthSmile.new(partner_id, api_key)
31
+
32
+ $ sec_key = connection.generate_sec_key(timestamp)
33
+ where timestamp is optional
34
+
35
+ ```
36
+
37
+ The response will be a hash:
38
+
39
+ ```
40
+ {
41
+ :sec_key=> "<the generated sec key>",
42
+ :timestamp=> 1563283420
43
+ }
44
+ ```
45
+
46
+ #### Web api
47
+ ```
48
+ $ connection = SmileIdentityCore::WebApi.new(partner_id, default_callback, api_key, sid_server)
49
+
50
+ $ response = connection.submit_job(partner_params, images, optional_callback, return_job_status)
51
+ ```
52
+
53
+ 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:
54
+
55
+ ```
56
+ {
57
+ "timestamp": "2018-03-13T21:04:11.193Z",
58
+ "signature": "<your signature>",
59
+ "job_complete": true,
60
+ "job_success": true,
61
+ "result": {
62
+ "ResultText": "Enroll User",
63
+ "ResultType": "SAIA",
64
+ "SmileJobID": "0000001897",
65
+ "JSONVersion": "1.0.0",
66
+ "IsFinalResult": "true",
67
+ "PartnerParams": {
68
+ "job_id": "52d0de86-be3b-4219-9e96-8195b0018944",
69
+ "user_id": "e54e0e98-8b8c-4215-89f5-7f9ea42bf650",
70
+ "job_type": 4
71
+ },
72
+ "ConfidenceValue": "100",
73
+ "IsMachineResult": "true",
74
+ }
75
+ "code": "2302"
76
+ }
77
+ ```
78
+ You can also view your response asynchronously at the callback that you have set, it will look as follows:
79
+ ```
80
+ {
81
+ "ResultCode": "1220",
82
+ "ResultText": "Authenticated",
83
+ "ResultType": "DIVA",
84
+ "SmileJobID": "0000000001",
85
+ "JSONVersion": "1.0.0",
86
+ "IsFinalResult": "true",
87
+ "PartnerParams": {
88
+ "job_id": "e7ca3e6c-e527-7165-b0b5-b90db1276378",
89
+ "user_id": "07a0c120-98d7-4fdc-bc62-3c6bfd16c60e",
90
+ "job_type": 2
91
+ },
92
+ "ConfidenceValue": "100.000000",
93
+ "IsMachineResult": "true"
94
+ }
95
+ ```
96
+
97
+ ## Development
98
+
99
+ 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.
100
+
101
+ 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).
102
+
103
+ Please note that you should tag the release when doing a push to rubygems.
104
+
105
+ ## Contributing
106
+
107
+ Bug reports and pull requests are welcome on GitHub at https://github.com/smileidentity/smile-identity-core
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "smile-identity-core"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,22 @@
1
+ module SmileIdentityCore
2
+ class Signature
3
+
4
+ def initialize(partner_id, api_key)
5
+ @api_key = api_key
6
+ @partner_id = partner_id.to_i
7
+ end
8
+
9
+ def generate_sec_key(timestamp=Time.now.to_i)
10
+ @timestamp = timestamp
11
+
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('|')
15
+
16
+ return {
17
+ sec_key: @sec_key,
18
+ timestamp: @timestamp
19
+ }
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,3 @@
1
+ module SmileIdentityCore
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,333 @@
1
+ require 'json'
2
+ require 'tempfile'
3
+ require 'base64'
4
+ require 'openssl'
5
+ require 'uri'
6
+
7
+ require 'typhoeus'
8
+ require 'zip'
9
+
10
+ module SmileIdentityCore
11
+ class WebApi
12
+
13
+ def initialize(partner_id, default_callback, api_key, sid_server)
14
+ @partner_id = partner_id.to_s
15
+ @callback_url = default_callback
16
+ @api_key = api_key
17
+
18
+ if !(sid_server =~ URI::regexp)
19
+ sid_server_mapping = {
20
+ 0 => 'https://3eydmgh10d.execute-api.us-west-2.amazonaws.com/test',
21
+ 1 => 'https://la7am6gdm8.execute-api.us-west-2.amazonaws.com/prod'
22
+ }
23
+ @url = sid_server_mapping[sid_server.to_i]
24
+ else
25
+ @url = sid_server
26
+ end
27
+
28
+ end
29
+
30
+ def submit_job(partner_params, images, id_info, optional_callback, return_job_status)
31
+ self.partner_params = partner_params
32
+ self.images = images
33
+ @timestamp = Time.now.to_i
34
+
35
+ self.id_info = id_info
36
+ self.return_job_status = return_job_status
37
+
38
+ if !optional_callback.empty?
39
+ @callback_url = optional_callback
40
+ end
41
+
42
+ if partner_params[:job_type].to_i == 1
43
+ validate_enroll_with_id
44
+ end
45
+
46
+ validate_return_data
47
+
48
+ return setup_requests
49
+ end
50
+
51
+ def partner_params=(partner_params)
52
+ if partner_params == nil
53
+ raise ArgumentError.new('Please ensure that you send through partner params')
54
+ end
55
+
56
+ if !partner_params.is_a?(Hash)
57
+ raise ArgumentError.new('Partner params needs to be an object')
58
+ end
59
+
60
+ [:user_id, :job_id, :job_type].each do |key|
61
+ unless partner_params[key] && !partner_params[key].nil? && !(partner_params[key].empty? if partner_params[key].is_a?(String))
62
+ raise ArgumentError.new("Please make sure that #{key.to_s} is included in the partner params")
63
+ end
64
+ end
65
+
66
+ @partner_params = partner_params
67
+ end
68
+
69
+ def images=(images)
70
+ if images == nil
71
+ raise ArgumentError.new('Please ensure that you send through image details')
72
+ end
73
+
74
+ if !images.is_a?(Array)
75
+ raise ArgumentError.new('Image details needs to be an array')
76
+ end
77
+
78
+ # all job types require atleast a selfie
79
+ if images.length == 0 || images.none? {|h| h[:image_type_id] == 0 || h[:image_type_id] == 2 }
80
+ raise ArgumentError.new('You need to send through at least one selfie image')
81
+ end
82
+
83
+ @images = images
84
+ end
85
+
86
+ def id_info=(id_info)
87
+ if id_info[:entered] == 'true'
88
+ [:first_name, :last_name, :country, :id_type, :id_number].each do |key|
89
+ unless id_info[key] && !id_info[key].nil? && !id_info[key].empty?
90
+ raise ArgumentError.new("Please make sure that #{key.to_s} is included in the id_info")
91
+ end
92
+ end
93
+ end
94
+
95
+ @id_info = id_info
96
+ end
97
+
98
+ def return_job_status=(return_job_status)
99
+ if return_job_status == nil
100
+ raise ArgumentError.new('Please ensure that you send through return_job_status')
101
+ end
102
+
103
+ if !!return_job_status != return_job_status
104
+ raise ArgumentError.new('return_job_status needs to be a boolean')
105
+ end
106
+
107
+ @return_job_status = return_job_status
108
+ end
109
+
110
+ private
111
+
112
+ def validate_return_data
113
+ if @callback_url.empty? && !@return_job_status
114
+ raise ArgumentError.new("Please choose to either get your response via the callback or job status query")
115
+ end
116
+ end
117
+
118
+ def validate_enroll_with_id
119
+ if(((@images.none? {|h| h[:image_type_id] == 1 || h[:image_type_id] == 3 }) && @id_info[:entered] != 'true'))
120
+ raise ArgumentError.new("You are attempting to complete a job type 1 without providing an id card image or id info")
121
+ end
122
+ end
123
+
124
+ def determine_sec_key
125
+ hash_signature = Digest::SHA256.hexdigest([@partner_id.to_i, @timestamp].join(":"))
126
+ public_key = OpenSSL::PKey::RSA.new(Base64.decode64(@api_key))
127
+ @sec_key = [Base64.encode64(public_key.public_encrypt(hash_signature)), hash_signature].join('|')
128
+ end
129
+
130
+ def configure_prep_upload_json
131
+ body = {
132
+ file_name: 'selfie.zip',
133
+ timestamp: @timestamp,
134
+ sec_key: determine_sec_key,
135
+ smile_client_id: @partner_id,
136
+ partner_params: @partner_params,
137
+ model_parameters: {}, # what is this for
138
+ callback_url: @callback_url
139
+ }
140
+
141
+ JSON.generate(body)
142
+ end
143
+
144
+ def setup_requests
145
+
146
+ url = "#{@url}/upload"
147
+ request = Typhoeus::Request.new(
148
+ url,
149
+ method: 'POST',
150
+ headers: {'Content-Type'=> "application/json"},
151
+ body: configure_prep_upload_json
152
+ )
153
+
154
+ request.on_complete do |response|
155
+ if response.success?
156
+
157
+ prep_upload_response = JSON.parse(response.body)
158
+ info_json = configure_info_json(prep_upload_response)
159
+
160
+ file_upload_response = upload_file(prep_upload_response['upload_url'], info_json)
161
+ return file_upload_response
162
+
163
+ elsif response.timed_out?
164
+ raise "#{response.code.to_s}: #{response.body}"
165
+ elsif response.code == 0
166
+ # Could not get an http response, something's wrong.
167
+ raise "#{response.code.to_s}: #{response.body}"
168
+ else
169
+ # Received a non-successful http response.
170
+ raise "#{response.code.to_s}: #{response.body}"
171
+ end
172
+ end
173
+ request.run
174
+
175
+ end
176
+
177
+ def configure_info_json(server_information)
178
+ info = {
179
+ "package_information": {
180
+ "apiVersion": {
181
+ "buildNumber": 0,
182
+ "majorVersion": 2,
183
+ "minorVersion": 0
184
+ }
185
+ },
186
+ "misc_information": {
187
+ "sec_key": @sec_key,
188
+ "retry": "false",
189
+ "partner_params": @partner_params,
190
+ "timestamp": @timestamp,
191
+ "file_name": "selfie.zip", # figure out what to do here
192
+ "smile_client_id": @partner_id,
193
+ "callback_url": @callback_url,
194
+ "userData": { # TO ASK what goes here
195
+ "isVerifiedProcess": false,
196
+ "name": "",
197
+ "fbUserID": "",
198
+ "firstName": "Bill",
199
+ "lastName": "",
200
+ "gender": "",
201
+ "email": "",
202
+ "phone": "",
203
+ "countryCode": "+",
204
+ "countryName": ""
205
+ }
206
+ },
207
+ "id_info": @id_info,
208
+ "images": configure_image_payload,
209
+ "server_information": server_information
210
+ }
211
+ return info
212
+ end
213
+
214
+ def configure_image_payload
215
+ @images.map { |i|
216
+ if isImageFile?i[:image_type_id]
217
+ {
218
+ image_type_id: i[:image_type_id],
219
+ image: '',
220
+ file_name: File.basename(i[:image])
221
+ }
222
+ else
223
+ {
224
+ image_type_id: i[:image_type_id],
225
+ image: i[:image],
226
+ file_name: ''
227
+ }
228
+ end
229
+ }
230
+ end
231
+
232
+ def isImageFile?type
233
+ type.to_i == 0 || type.to_i == 1
234
+ end
235
+
236
+ def zip_up_file(info_json)
237
+ # https://info.michael-simons.eu/2008/01/21/using-rubyzip-to-create-zip-files-on-the-fly/
238
+ Zip::OutputStream.write_buffer do |zos|
239
+ zos.put_next_entry('info.json')
240
+ zos.puts JSON.pretty_generate(info_json)
241
+
242
+ if @images.length > 0
243
+ @images.each do |img|
244
+ if img[:image_type_id] == 0 || img[:image_type_id] == 1
245
+ zos.put_next_entry(File.basename(img[:image]))
246
+ zos.print IO.read(img[:image])
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end
252
+
253
+ def upload_file(url, info_json)
254
+
255
+ file = zip_up_file(info_json)
256
+ file.rewind
257
+
258
+ request = Typhoeus::Request.new(
259
+ url,
260
+ method: 'PUT',
261
+ headers: {'Content-Type'=> "application/zip"},
262
+ body: file.read,
263
+ )
264
+
265
+ request.on_complete do |response|
266
+ if response.success?
267
+ if @return_job_status
268
+ return query_job_status
269
+ else
270
+ return
271
+ end
272
+ elsif response.timed_out?
273
+ raise " #{response.code.to_s}: #{response.body}"
274
+ elsif response.code == 0
275
+ # Could not get an http response, something's wrong.
276
+ raise " #{response.code.to_s}: #{response.body}"
277
+ else
278
+ # Received a non-successful http response.
279
+ raise " #{response.code.to_s}: #{response.body}"
280
+ end
281
+ end
282
+ request.run
283
+
284
+ end
285
+
286
+ def query_job_status(counter=0)
287
+ job_complete = false
288
+ counter < 4 ? (sleep 2) : (sleep 6)
289
+ counter += 1
290
+
291
+ body = {
292
+ sec_key: @sec_key,
293
+ timestamp: @timestamp,
294
+ user_id: @partner_params[:user_id],
295
+ job_id: @partner_params[:job_id],
296
+ partner_id: @partner_id,
297
+ image_links: "false", # we hardcode to false for now
298
+ }.to_json
299
+
300
+ url = "#{@url}/job_status"
301
+
302
+ request = Typhoeus::Request.new(
303
+ url,
304
+ headers: {'Content-Type': 'application/json', 'Accept': 'application/json'},
305
+ method: :post,
306
+ body: body
307
+ )
308
+
309
+ request.on_complete do |response|
310
+
311
+ if response.code == 0
312
+ return query_job_status(counter)
313
+ else
314
+ begin
315
+ status_body = JSON.load(response.body)
316
+ job_complete = status_body['job_complete'].to_s
317
+ rescue => e
318
+ puts e.message
319
+ puts e.backtrace
320
+ end
321
+
322
+ if job_complete == 'true' || counter == 20
323
+ return JSON.parse(response.body)
324
+ else
325
+ return query_job_status(counter)
326
+ end
327
+ end
328
+ end
329
+
330
+ request.run
331
+ end
332
+ end
333
+ end
@@ -0,0 +1,7 @@
1
+ require "smile-identity-core/version"
2
+ require "smile-identity-core/web_api.rb"
3
+ require "smile-identity-core/signature.rb"
4
+
5
+ module SmileIdentityCore
6
+ class Error < StandardError; end
7
+ end
@@ -0,0 +1,38 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "smile-identity-core/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "smile-identity-core"
7
+ spec.version = SmileIdentityCore::VERSION
8
+ spec.authors = ["Ridhwana"]
9
+ spec.email = ["ridhwana.khan16@gmail.com"]
10
+
11
+ spec.summary = "The Smile Identity Web API allows the user to access most of the features of the Smile Identity system through direct server to server queries."
12
+ spec.description = "The official Smile Identity gem"
13
+ spec.homepage = "https://www.smileidentity.com/"
14
+ spec.required_ruby_version = '>= 2.0'
15
+ spec.license = 'MIT'
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/smileidentity/smile-identity-core"
19
+ spec.metadata["changelog_uri"] = "https://github.com/smileidentity/smile-identity-core/blob/master/CHANGELOG.md"
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 2.0"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rspec", "~> 3.0"
33
+ spec.add_development_dependency 'simplecov', '~> 0.12.0'
34
+
35
+ spec.add_dependency 'typhoeus', '~> 1.0', '>= 1.0.1'
36
+ spec.add_dependency 'rubyzip', '~> 1.2', '>= 1.2.3'
37
+
38
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smile-identity-core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ridhwana
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-07-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.12.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.12.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: typhoeus
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 1.0.1
79
+ type: :runtime
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - "~>"
84
+ - !ruby/object:Gem::Version
85
+ version: '1.0'
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.0.1
89
+ - !ruby/object:Gem::Dependency
90
+ name: rubyzip
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.2'
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 1.2.3
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '1.2'
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: 1.2.3
109
+ description: The official Smile Identity gem
110
+ email:
111
+ - ridhwana.khan16@gmail.com
112
+ executables: []
113
+ extensions: []
114
+ extra_rdoc_files: []
115
+ files:
116
+ - ".gitignore"
117
+ - ".rspec"
118
+ - ".travis.yml"
119
+ - CHANGELOG.md
120
+ - Gemfile
121
+ - Gemfile.lock
122
+ - README.md
123
+ - Rakefile
124
+ - bin/console
125
+ - bin/setup
126
+ - lib/smile-identity-core.rb
127
+ - lib/smile-identity-core/signature.rb
128
+ - lib/smile-identity-core/version.rb
129
+ - lib/smile-identity-core/web_api.rb
130
+ - smile-identity-core.gemspec
131
+ homepage: https://www.smileidentity.com/
132
+ licenses:
133
+ - MIT
134
+ metadata:
135
+ homepage_uri: https://www.smileidentity.com/
136
+ source_code_uri: https://github.com/smileidentity/smile-identity-core
137
+ changelog_uri: https://github.com/smileidentity/smile-identity-core/blob/master/CHANGELOG.md
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '2.0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.7.6
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: The Smile Identity Web API allows the user to access most of the features
158
+ of the Smile Identity system through direct server to server queries.
159
+ test_files: []