trusona 0.16.0

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.
Files changed (84) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.env.example +4 -0
  5. data/.gitignore +20 -0
  6. data/.rspec +3 -0
  7. data/.ruby-version +1 -0
  8. data/.travis.yml +24 -0
  9. data/Gemfile +8 -0
  10. data/Guardfile +54 -0
  11. data/LICENSE +201 -0
  12. data/README.md +234 -0
  13. data/Rakefile +8 -0
  14. data/bin/console +21 -0
  15. data/bin/setup +8 -0
  16. data/certs/trusona.pem +26 -0
  17. data/checksum/trusona-0.16.0.gem.sha512 +1 -0
  18. data/integrations/device_user_binding_integration_spec.rb +6 -0
  19. data/integrations/identity_documents_spec.rb +28 -0
  20. data/integrations/spec_helper.rb +23 -0
  21. data/integrations/tru_code_spec.rb +80 -0
  22. data/integrations/trusonafication_spec.rb +61 -0
  23. data/integrations/user_accounts_spec.rb +39 -0
  24. data/integrations/user_identifiers_spec.rb +32 -0
  25. data/lib/trusona.rb +157 -0
  26. data/lib/trusona/api/client.rb +60 -0
  27. data/lib/trusona/api/hashed_message.rb +71 -0
  28. data/lib/trusona/api/signed_request.rb +96 -0
  29. data/lib/trusona/api/verified_response.rb +85 -0
  30. data/lib/trusona/device.rb +31 -0
  31. data/lib/trusona/device_user_binding.rb +56 -0
  32. data/lib/trusona/errors.rb +51 -0
  33. data/lib/trusona/helpers/key_normalizer.rb +15 -0
  34. data/lib/trusona/helpers/time_normalizer.rb +17 -0
  35. data/lib/trusona/identity_document.rb +64 -0
  36. data/lib/trusona/mappers/base_mapper.rb +69 -0
  37. data/lib/trusona/mappers/device_mapper.rb +13 -0
  38. data/lib/trusona/mappers/device_user_binding_mapper.rb +13 -0
  39. data/lib/trusona/mappers/identity_document_mapper.rb +17 -0
  40. data/lib/trusona/mappers/nil_mapper.rb +11 -0
  41. data/lib/trusona/mappers/tru_code_mapper.rb +13 -0
  42. data/lib/trusona/mappers/trusonafication_mapper.rb +19 -0
  43. data/lib/trusona/mappers/user_account_mapper.rb +13 -0
  44. data/lib/trusona/mappers/user_identifier_mapper.rb +13 -0
  45. data/lib/trusona/resources/base_resource.rb +29 -0
  46. data/lib/trusona/resources/device.rb +22 -0
  47. data/lib/trusona/resources/device_user_binding.rb +30 -0
  48. data/lib/trusona/resources/device_user_binding_activation.rb +27 -0
  49. data/lib/trusona/resources/identity_document.rb +36 -0
  50. data/lib/trusona/resources/tru_code.rb +42 -0
  51. data/lib/trusona/resources/trusonafication.rb +137 -0
  52. data/lib/trusona/resources/user_account.rb +84 -0
  53. data/lib/trusona/resources/user_identifier.rb +49 -0
  54. data/lib/trusona/resources/validators.rb +22 -0
  55. data/lib/trusona/services/account_lookups_service.rb +17 -0
  56. data/lib/trusona/services/base_service.rb +117 -0
  57. data/lib/trusona/services/device_user_bindings_service.rb +22 -0
  58. data/lib/trusona/services/devices_service.rb +15 -0
  59. data/lib/trusona/services/identity_documents_service.rb +31 -0
  60. data/lib/trusona/services/tru_codes_service.rb +26 -0
  61. data/lib/trusona/services/trusonafication_service.rb +16 -0
  62. data/lib/trusona/services/user_accounts_service.rb +17 -0
  63. data/lib/trusona/services/user_identifiers_service.rb +16 -0
  64. data/lib/trusona/tru_code.rb +38 -0
  65. data/lib/trusona/tru_code_config.rb +45 -0
  66. data/lib/trusona/trusonafication.rb +133 -0
  67. data/lib/trusona/user_account.rb +17 -0
  68. data/lib/trusona/user_identifier.rb +15 -0
  69. data/lib/trusona/version.rb +5 -0
  70. data/lib/trusona/workers/device_finder.rb +18 -0
  71. data/lib/trusona/workers/device_user_binding_activator.rb +25 -0
  72. data/lib/trusona/workers/device_user_binding_creator.rb +26 -0
  73. data/lib/trusona/workers/identity_document_finder.rb +25 -0
  74. data/lib/trusona/workers/tru_code_creator.rb +17 -0
  75. data/lib/trusona/workers/tru_code_finder.rb +19 -0
  76. data/lib/trusona/workers/trusonafication_creator.rb +46 -0
  77. data/lib/trusona/workers/trusonafication_finder.rb +27 -0
  78. data/lib/trusona/workers/user_account_finder.rb +39 -0
  79. data/lib/trusona/workers/user_identifier_creator.rb +17 -0
  80. data/lib/trusona/workers/user_identifier_finder.rb +29 -0
  81. data/release-gem +17 -0
  82. data/trusona.gemspec +43 -0
  83. metadata +333 -0
  84. metadata.gz.sig +1 -0
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Handles creating device and user bindings
7
+ class DeviceUserBindingCreator
8
+ def initialize(service: nil)
9
+ @service = service || Trusona::Services::DeviceUserBindingsService.new
10
+ end
11
+
12
+ def create(user: nil, device: nil)
13
+ raise ArgumentError, 'Missing user identifier' if
14
+ user.nil? || user.empty?
15
+ raise ArgumentError, 'Missing device identifier' if
16
+ device.nil? || device.empty?
17
+
18
+ resource = Trusona::Resources::DeviceUserBinding.new(
19
+ user_identifier: user,
20
+ device_identifier: device
21
+ )
22
+ @service.create(resource)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Handles finding Identity Documents
7
+ class IdentityDocumentFinder
8
+ def initialize(service: nil)
9
+ @service = service || Trusona::Services::IdentityDocumentsService.new
10
+ end
11
+
12
+ def find_all(user_identifier = nil)
13
+ raise(ArgumentError, 'A user identifier is required.') unless
14
+ user_identifier
15
+
16
+ @service.index(user_identifier)
17
+ end
18
+
19
+ def find(id = nil)
20
+ raise(ArgumentError, 'An Identity Document id is required.') unless id
21
+ @service.get(Trusona::Resources::IdentityDocument.new(id: id))
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## A worker that creates TruCodes
7
+ class TruCodeCreator
8
+ def initialize(service = nil)
9
+ @service = service || Trusona::Services::TruCodesService.new
10
+ end
11
+
12
+ def create(code)
13
+ @service.create(code)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Finds TruCodes
7
+ class TruCodeFinder
8
+ def initialize(service: Trusona::Services::TruCodesService.new)
9
+ @service = service
10
+ end
11
+
12
+ def find(id)
13
+ raise ArgumentError, 'Missing TruCode Id' unless id
14
+ resource = Trusona::Resources::BaseResource.new(id: id)
15
+ @service.get(resource)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Creates Trusonafications
7
+ class TrusonaficationCreator
8
+ DEFAULT_TIMEOUT = 30
9
+
10
+ def initialize(service: nil)
11
+ @service = service || Trusona::Services::TrusonaficationService.new
12
+ end
13
+
14
+ def create(params: {}, timeout: nil, &block)
15
+ raise ArgumentError, 'Missing or empty params hash' if
16
+ params.nil? || params.empty?
17
+ resource = Trusona::Resources::Trusonafication.new(params)
18
+ trusonafication = @service.create(resource)
19
+ return trusonafication unless block_given?
20
+
21
+ handle_block(trusonafication, @service, timeout, block)
22
+ end
23
+
24
+ private
25
+
26
+ # rubocop:disable Metrics/MethodLength
27
+
28
+ def handle_block(trusonafication, service, timeout, block)
29
+ timeout ||= DEFAULT_TIMEOUT
30
+
31
+ future = Time.now.to_i + timeout
32
+ while Time.now.to_i < future
33
+ t = service.get(trusonafication)
34
+ if t.status == trusonafication.status
35
+ sleep(1)
36
+ else
37
+ block.yield(t)
38
+ break
39
+ end
40
+ end
41
+ end
42
+
43
+ # rubocop:enable Metrics/MethodLength
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Finds Trusonafications
7
+ class TrusonaficationFinder
8
+ def initialize(service: nil)
9
+ @service = service || Trusona::Services::TrusonaficationService.new
10
+ end
11
+
12
+ def find(trusonafication_id)
13
+ if trusonafication_id.nil? || trusonafication_id.empty?
14
+ raise(
15
+ Trusona::InvalidResourceError,
16
+ 'Trusonafication Id cannot be empty or nil'
17
+ )
18
+ end
19
+
20
+ resource = Trusona::Resources::Trusonafication.new(
21
+ id: trusonafication_id
22
+ )
23
+ @service.get(resource)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Finds user accounts
7
+ class UserAccountFinder
8
+ def initialize(user_accounts_service: nil, account_lookups_service: nil)
9
+ @lookups = account_lookups_service ||
10
+ Trusona::Services::AccountLookupsService.new
11
+ @user_accounts = user_accounts_service ||
12
+ Trusona::Services::UserAccountsService.new
13
+ end
14
+
15
+ def find(opts)
16
+ raise ArgumentError, 'Missing email or trusona id' unless
17
+ contains_required_arguments(opts)
18
+
19
+ resource = build_resource(opts)
20
+
21
+ if opts[:trusona_id] || opts['trusona_id']
22
+ return @user_accounts.get(resource)
23
+ end
24
+
25
+ @lookups.create(resource) if opts[:email] || opts['email']
26
+ end
27
+
28
+ private
29
+
30
+ def contains_required_arguments(opts)
31
+ opts[:email] || opts['email'] || opts[:trusona_id] || opts['trusona_id']
32
+ end
33
+
34
+ def build_resource(options)
35
+ Trusona::Resources::UserAccount.new(options)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Creates user identifers
7
+ class UserIdentifierCreator
8
+ def initialize(service: nil)
9
+ @service = service || Trusona::Services::UserIdentifiersService.new
10
+ end
11
+
12
+ def create(identifier)
13
+ @service.create(identifier)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Finds user identifers
7
+ class UserIdentifierFinder
8
+ def initialize(service: nil)
9
+ @service = service || Trusona::Services::UserIdentifiersService.new
10
+ end
11
+
12
+ def find(opts)
13
+ raise ArgumentError, 'Missing user identifier' unless
14
+ contains_required_arguments(opts)
15
+ @service.get(build_resource(opts))
16
+ end
17
+
18
+ private
19
+
20
+ def contains_required_arguments(opts)
21
+ opts[:identifier] || opts['identifier']
22
+ end
23
+
24
+ def build_resource(options)
25
+ Trusona::Resources::UserIdentifier.new(options)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+
3
+ # Add the artifactory gem source
4
+ gem source -a https://$ARTIFACTORY_USERNAME:$ARTIFACTORY_PASSWORD@trusona.jfrog.io/trusona/api/gems/trusona-rubygems/
5
+
6
+ # fetch the gem credentials file from artifactory
7
+ curl -u$ARTIFACTORY_USERNAME:$ARTIFACTORY_PASSWORD https://trusona.jfrog.io/trusona/api/gems/trusona-rubygems/api/v1/api_key.yaml > ~/.gem/credentials
8
+
9
+ # change permissions on the fetched credentials file
10
+ chmod 600 ~/.gem/credentials
11
+
12
+ # build the gem
13
+ gem build trusona.gemspec
14
+
15
+ # push the gem to artifactory
16
+ gem push trusona-*.gem --host https://trusona.jfrog.io/trusona/api/gems/trusona-rubygems
17
+ gem push trusona-*.gem
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'trusona/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'trusona'
9
+ spec.version = Trusona::VERSION
10
+ spec.authors = ['Trusona']
11
+ spec.email = ['engineering@trusona.com']
12
+
13
+ spec.summary = 'Trusona REST API wrapper'
14
+ spec.description = 'Easily interact with the Trusona REST API'
15
+ spec.homepage = 'https://trusona.com'
16
+ spec.license = 'MIT'
17
+ spec.cert_chain = ['certs/trusona.pem']
18
+ spec.signing_key = 'trusona-gem-private_key.pem' if $0 =~ /gem\z/
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.match(%r{^(test|spec|features)/})
22
+ end
23
+ spec.bindir = 'exe'
24
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
+ spec.require_paths = ['lib']
26
+
27
+ spec.add_dependency 'httparty', '~> 0.15'
28
+
29
+ spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
30
+
31
+ spec.add_development_dependency 'bump', '~> 0.5'
32
+ spec.add_development_dependency 'bundler', '~> 1.15'
33
+ spec.add_development_dependency 'dotenv', '~> 2.2'
34
+ spec.add_development_dependency 'guard', '~> 2.14'
35
+ spec.add_development_dependency 'guard-rspec', '~> 4.7'
36
+ spec.add_development_dependency 'guard-rubocop', '~> 1.3'
37
+ spec.add_development_dependency 'guard-yard', '~> 2.2'
38
+ spec.add_development_dependency 'rake', '~> 10.0'
39
+ spec.add_development_dependency 'rspec', '~> 3.0'
40
+ spec.add_development_dependency 'rubocop', '~> 0.49'
41
+ spec.add_development_dependency 'simplecov', '~> 0.14'
42
+ spec.add_development_dependency 'yard', '~> 0.9'
43
+ end
metadata ADDED
@@ -0,0 +1,333 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: trusona
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.16.0
5
+ platform: ruby
6
+ authors:
7
+ - Trusona
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIETTCCArWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAoMSYwJAYDVQQDDB1lbmdp
14
+ bmVlcmluZy9EQz10cnVzb25hL0RDPWNvbTAeFw0xODA3MDUxNjQyNTVaFw0xOTA3
15
+ MDUxNjQyNTVaMCgxJjAkBgNVBAMMHWVuZ2luZWVyaW5nL0RDPXRydXNvbmEvREM9
16
+ Y29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAtZt82g/ZeiJshGdi
17
+ twfXgueVDyMEsV+h7mRwDqOhwwwJ9/EBwu2Ma56LQHKMqDsVaSljTUo4WNSm9M7r
18
+ H6c/IW6O07X/2YA29jwUveauKjkBmmEpECr7hTe0UHoOm9jV5DHeoBsgpMSFqC3C
19
+ myBP8ik/A+xEQPo8F43TMX2YP3EFQw8ievUdCvwgjapFoyFoBlmrbfHMyYH1XTfF
20
+ hth9YAZoYYSaVHKYleEWz73ZPZyYqXUm2G56eAOAu6+Ghi3G9F2FtxwGVpjAnKc6
21
+ r37RRWG5b6Sfuj9ojds9sn8EExUTroti5Jb6RpJI54+IKuarfEe7ygn6PBsianbF
22
+ b9FJ/PQgUNOrCkEum8iBrJW2eBgNKsC39kX7luUeot6aBpO16E8exrNwia7aWVn1
23
+ lOW2DpjLWpyQDC3iCmV5JZD3Ffg1uGaMg1ln1BAtLH9StDqi8EPL3lmXQM2uvi9f
24
+ KXCrw0eSiDGD1PUdKJ0RE/hByKLtGn7UygIKsV8v7R/L+PwNAgMBAAGjgYEwfzAJ
25
+ BgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU82ZI29Yn4SX0EuOrfvkc
26
+ Fs2cy2wwIgYDVR0RBBswGYEXZW5naW5lZXJpbmdAdHJ1c29uYS5jb20wIgYDVR0S
27
+ BBswGYEXZW5naW5lZXJpbmdAdHJ1c29uYS5jb20wDQYJKoZIhvcNAQELBQADggGB
28
+ AC3rcLcSs4JCMfVNJxx2ugAqxagKV9Hbpl9hLMDCv2M4rc4kWKwuSyihhaetq+2U
29
+ hzWaqX0yUzBC1KCOxuZOxpC0KscsYGeLiGRILZetUl6Kj/4H/Xjaj1gkW4mtCfeh
30
+ 5QC/1FM/C3AExN5oWNQUTBQ2XFain5RxR/SJVidJt+6DOePhqY2zAp7lweIIcjit
31
+ bJNU+hSx7iO750Wnn969yQDRNKnNIULAmpvgGpErv8kx5FELDypEZtRWK4wmPkyz
32
+ vDcXXHq4276Zr5idZbx/uxeRuS05rL+o/LmN1KNvxxJCoqAv+meGhMQ645WKs5La
33
+ oeFOElmMyJfOJcYAp5KP5Rvn/llhVYYaGtOsoY7+6U0fN0DzucZmtfwtp4r9foVY
34
+ 5dMuMQ9V7c0EWtZm8J+tcQh9dPPC4Va/FnYWw+x6CDmVU/nijUAI1UOxSSuekJXb
35
+ vbhUT8kOS+bZTalorEol37DD/P4Bbv0fMpw+ozetR2RmwhwTKPKJ5r0oQP6tiqHn
36
+ hQ==
37
+ -----END CERTIFICATE-----
38
+ date: 2018-07-06 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: httparty
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.15'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.15'
54
+ - !ruby/object:Gem::Dependency
55
+ name: bump
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.5'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.5'
68
+ - !ruby/object:Gem::Dependency
69
+ name: bundler
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '1.15'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.15'
82
+ - !ruby/object:Gem::Dependency
83
+ name: dotenv
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.2'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.2'
96
+ - !ruby/object:Gem::Dependency
97
+ name: guard
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '2.14'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.14'
110
+ - !ruby/object:Gem::Dependency
111
+ name: guard-rspec
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '4.7'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '4.7'
124
+ - !ruby/object:Gem::Dependency
125
+ name: guard-rubocop
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.3'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.3'
138
+ - !ruby/object:Gem::Dependency
139
+ name: guard-yard
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '2.2'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '2.2'
152
+ - !ruby/object:Gem::Dependency
153
+ name: rake
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '10.0'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '10.0'
166
+ - !ruby/object:Gem::Dependency
167
+ name: rspec
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '3.0'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.0'
180
+ - !ruby/object:Gem::Dependency
181
+ name: rubocop
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: '0.49'
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '0.49'
194
+ - !ruby/object:Gem::Dependency
195
+ name: simplecov
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '0.14'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '0.14'
208
+ - !ruby/object:Gem::Dependency
209
+ name: yard
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0.9'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '0.9'
222
+ description: Easily interact with the Trusona REST API
223
+ email:
224
+ - engineering@trusona.com
225
+ executables: []
226
+ extensions: []
227
+ extra_rdoc_files: []
228
+ files:
229
+ - ".env.example"
230
+ - ".gitignore"
231
+ - ".rspec"
232
+ - ".ruby-version"
233
+ - ".travis.yml"
234
+ - Gemfile
235
+ - Guardfile
236
+ - LICENSE
237
+ - README.md
238
+ - Rakefile
239
+ - bin/console
240
+ - bin/setup
241
+ - certs/trusona.pem
242
+ - checksum/trusona-0.16.0.gem.sha512
243
+ - integrations/device_user_binding_integration_spec.rb
244
+ - integrations/identity_documents_spec.rb
245
+ - integrations/spec_helper.rb
246
+ - integrations/tru_code_spec.rb
247
+ - integrations/trusonafication_spec.rb
248
+ - integrations/user_accounts_spec.rb
249
+ - integrations/user_identifiers_spec.rb
250
+ - lib/trusona.rb
251
+ - lib/trusona/api/client.rb
252
+ - lib/trusona/api/hashed_message.rb
253
+ - lib/trusona/api/signed_request.rb
254
+ - lib/trusona/api/verified_response.rb
255
+ - lib/trusona/device.rb
256
+ - lib/trusona/device_user_binding.rb
257
+ - lib/trusona/errors.rb
258
+ - lib/trusona/helpers/key_normalizer.rb
259
+ - lib/trusona/helpers/time_normalizer.rb
260
+ - lib/trusona/identity_document.rb
261
+ - lib/trusona/mappers/base_mapper.rb
262
+ - lib/trusona/mappers/device_mapper.rb
263
+ - lib/trusona/mappers/device_user_binding_mapper.rb
264
+ - lib/trusona/mappers/identity_document_mapper.rb
265
+ - lib/trusona/mappers/nil_mapper.rb
266
+ - lib/trusona/mappers/tru_code_mapper.rb
267
+ - lib/trusona/mappers/trusonafication_mapper.rb
268
+ - lib/trusona/mappers/user_account_mapper.rb
269
+ - lib/trusona/mappers/user_identifier_mapper.rb
270
+ - lib/trusona/resources/base_resource.rb
271
+ - lib/trusona/resources/device.rb
272
+ - lib/trusona/resources/device_user_binding.rb
273
+ - lib/trusona/resources/device_user_binding_activation.rb
274
+ - lib/trusona/resources/identity_document.rb
275
+ - lib/trusona/resources/tru_code.rb
276
+ - lib/trusona/resources/trusonafication.rb
277
+ - lib/trusona/resources/user_account.rb
278
+ - lib/trusona/resources/user_identifier.rb
279
+ - lib/trusona/resources/validators.rb
280
+ - lib/trusona/services/account_lookups_service.rb
281
+ - lib/trusona/services/base_service.rb
282
+ - lib/trusona/services/device_user_bindings_service.rb
283
+ - lib/trusona/services/devices_service.rb
284
+ - lib/trusona/services/identity_documents_service.rb
285
+ - lib/trusona/services/tru_codes_service.rb
286
+ - lib/trusona/services/trusonafication_service.rb
287
+ - lib/trusona/services/user_accounts_service.rb
288
+ - lib/trusona/services/user_identifiers_service.rb
289
+ - lib/trusona/tru_code.rb
290
+ - lib/trusona/tru_code_config.rb
291
+ - lib/trusona/trusonafication.rb
292
+ - lib/trusona/user_account.rb
293
+ - lib/trusona/user_identifier.rb
294
+ - lib/trusona/version.rb
295
+ - lib/trusona/workers/device_finder.rb
296
+ - lib/trusona/workers/device_user_binding_activator.rb
297
+ - lib/trusona/workers/device_user_binding_creator.rb
298
+ - lib/trusona/workers/identity_document_finder.rb
299
+ - lib/trusona/workers/tru_code_creator.rb
300
+ - lib/trusona/workers/tru_code_finder.rb
301
+ - lib/trusona/workers/trusonafication_creator.rb
302
+ - lib/trusona/workers/trusonafication_finder.rb
303
+ - lib/trusona/workers/user_account_finder.rb
304
+ - lib/trusona/workers/user_identifier_creator.rb
305
+ - lib/trusona/workers/user_identifier_finder.rb
306
+ - release-gem
307
+ - trusona.gemspec
308
+ homepage: https://trusona.com
309
+ licenses:
310
+ - MIT
311
+ metadata:
312
+ yard.run: yri
313
+ post_install_message:
314
+ rdoc_options: []
315
+ require_paths:
316
+ - lib
317
+ required_ruby_version: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - ">="
320
+ - !ruby/object:Gem::Version
321
+ version: '0'
322
+ required_rubygems_version: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ">="
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
327
+ requirements: []
328
+ rubyforge_project:
329
+ rubygems_version: 2.7.6
330
+ signing_key:
331
+ specification_version: 4
332
+ summary: Trusona REST API wrapper
333
+ test_files: []