trusona 2.3.0 → 2.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +13 -0
  6. data/.ruby-version +1 -1
  7. data/.travis.yml +19 -15
  8. data/README.md +4 -3
  9. data/integrations/buster.rb +15 -0
  10. data/integrations/spec_helper.rb +3 -0
  11. data/integrations/trusonafication_spec.rb +18 -3
  12. data/lib/trusona.rb +3 -1
  13. data/lib/trusona/api/signed_request.rb +4 -1
  14. data/lib/trusona/api/verified_response.rb +6 -1
  15. data/lib/trusona/identity_document.rb +0 -6
  16. data/lib/trusona/mappers/base_mapper.rb +5 -0
  17. data/lib/trusona/mappers/paired_tru_code_mapper.rb +1 -0
  18. data/lib/trusona/resources/base_resource.rb +1 -1
  19. data/lib/trusona/resources/device_user_binding.rb +1 -0
  20. data/lib/trusona/resources/device_user_binding_activation.rb +2 -1
  21. data/lib/trusona/resources/identity_document.rb +4 -4
  22. data/lib/trusona/resources/paired_tru_code.rb +1 -0
  23. data/lib/trusona/resources/tru_code.rb +2 -1
  24. data/lib/trusona/resources/trusonafication.rb +29 -20
  25. data/lib/trusona/resources/user_account.rb +6 -2
  26. data/lib/trusona/resources/user_identifier.rb +3 -1
  27. data/lib/trusona/resources/validators.rb +1 -0
  28. data/lib/trusona/services/base_service.rb +9 -2
  29. data/lib/trusona/services/device_user_bindings_service.rb +3 -3
  30. data/lib/trusona/services/identity_documents_service.rb +3 -3
  31. data/lib/trusona/services/paired_tru_code_service.rb +1 -0
  32. data/lib/trusona/trusonafication.rb +32 -3
  33. data/lib/trusona/version.rb +1 -1
  34. data/lib/trusona/workers/device_finder.rb +1 -0
  35. data/lib/trusona/workers/identity_document_finder.rb +1 -0
  36. data/lib/trusona/workers/paired_tru_code_finder.rb +1 -0
  37. data/lib/trusona/workers/tru_code_finder.rb +1 -0
  38. data/lib/trusona/workers/trusonafication_canceler.rb +27 -0
  39. data/lib/trusona/workers/trusonafication_creator.rb +2 -1
  40. data/lib/trusona/workers/trusonafication_finder.rb +1 -1
  41. data/lib/trusona/workers/user_account_finder.rb +1 -3
  42. data/lib/trusona/workers/user_deactivator.rb +1 -3
  43. data/lib/trusona/workers/user_identifier_finder.rb +1 -0
  44. data/trusona.cnf +14 -0
  45. data/trusona.gemspec +9 -7
  46. metadata +85 -57
  47. metadata.gz.sig +0 -0
  48. data/certs/trusona.pem +0 -34
  49. data/trusona.key.pem.enc +0 -0
@@ -38,12 +38,12 @@ module Trusona
38
38
  @emails = parse_emails(params_with_symbol_keys[:emails])
39
39
  @max_level = parse_max_level(params_with_symbol_keys[:metadata])
40
40
 
41
- @params = params_with_symbol_keys
41
+ @params = params_with_symbol_keys
42
42
  end
43
43
  # rubocop:enable Metrics/MethodLength
44
44
  # rubocop:enable Metrics/AbcSize
45
45
 
46
- def to_json
46
+ def to_json(*_args)
47
47
  JSON(to_h)
48
48
  end
49
49
 
@@ -52,20 +52,24 @@ module Trusona
52
52
  def determine_status(status)
53
53
  return Status::INACTIVE if status == 'inactive'
54
54
  return Status::ACTIVE if status == 'active'
55
+
55
56
  Status::UNKNOWN
56
57
  end
57
58
 
58
59
  def parse_emails(emails)
59
60
  return [] if emails.nil? || emails.empty?
61
+
60
62
  emails.map { |e| UserAccountEmail.new(e) }
61
63
  end
62
64
 
63
65
  def parse_max_level(metadata)
64
66
  return Level::ENTRY unless metadata
67
+
65
68
  level = metadata['max_level'] || metadata[:max_level]
66
69
 
67
70
  return Level::ESSENTIAL if level == 'essential'
68
71
  return Level::EXECUTIVE if level == 'executive'
72
+
69
73
  Level::ENTRY
70
74
  end
71
75
 
@@ -19,7 +19,7 @@ module Trusona
19
19
  @params
20
20
  end
21
21
 
22
- def to_json
22
+ def to_json(*_args)
23
23
  JSON(to_h)
24
24
  end
25
25
 
@@ -36,12 +36,14 @@ module Trusona
36
36
  def attributes_present
37
37
  return false unless @params.key?(:identifier)
38
38
  return false unless @params.key?(:trusona_id)
39
+
39
40
  true
40
41
  end
41
42
 
42
43
  def attributes_filled
43
44
  return false if @params.fetch(:identifier).empty?
44
45
  return false if @params.fetch(:trusona_id).empty?
46
+
45
47
  true
46
48
  end
47
49
  end
@@ -7,6 +7,7 @@ module Trusona
7
7
  module Validators
8
8
  def present?(item)
9
9
  return false if item.nil? || item.to_s.empty?
10
+
10
11
  true
11
12
  end
12
13
 
@@ -21,21 +21,25 @@ module Trusona
21
21
 
22
22
  def get(resource)
23
23
  raise Trusona::InvalidResourceError unless resource.id
24
+
24
25
  handle(@client.get(member_path(resource)), resource)
25
26
  end
26
27
 
27
28
  def create(resource)
28
29
  raise Trusona::InvalidResourceError unless resource.valid?
30
+
29
31
  handle(@client.post(collection_path, resource.to_json), resource)
30
32
  end
31
33
 
32
34
  def update(resource)
33
35
  raise Trusona::InvalidResourceError unless resource.id
36
+
34
37
  handle(@client.patch(member_path(resource), resource.to_json), resource)
35
38
  end
36
39
 
37
40
  def delete(resource)
38
41
  raise Trusona::InvalidResourceError unless resource.id
42
+
39
43
  handle(@client.delete(member_path(resource)), resource)
40
44
  end
41
45
 
@@ -53,12 +57,13 @@ module Trusona
53
57
  raise Trusona::SigningError unless response.verified?
54
58
  end
55
59
 
56
- # rubocop:disable MethodLength
60
+ # rubocop:disable Metrics/MethodLength
57
61
  # rubocop:disable Metrics/CyclomaticComplexity
58
62
  def handle(response, resource = {})
59
63
  @response = response
60
64
 
61
65
  raise if resource.nil?
66
+
62
67
  case response.code
63
68
  when 200..299
64
69
  success(response, resource)
@@ -78,7 +83,7 @@ module Trusona
78
83
  raise Trusona::RequestError, readable_error
79
84
  end
80
85
  end
81
- # rubocop:enable MethodLength
86
+ # rubocop:enable Metrics/MethodLength
82
87
  # rubocop:enable Metrics/CyclomaticComplexity
83
88
 
84
89
  def success(response, resource)
@@ -113,10 +118,12 @@ module Trusona
113
118
  def readable_error
114
119
  default = '[UNKNOWN] Error - An unknown error has occurred.'
115
120
  return default unless @response
121
+
116
122
  body = @response.to_h
117
123
  msg = []
118
124
  msg << "[#{body['error']}] #{body['message']} - #{body['description']}"
119
125
  return msg.join("\n") unless body['field_errors']
126
+
120
127
  body['field_errors'].each do |field|
121
128
  msg << "\t #{field.join(' => ')}"
122
129
  end
@@ -6,9 +6,9 @@ module Trusona
6
6
  ## Device User Bindings Service
7
7
  class DeviceUserBindingsService < BaseService
8
8
  def initialize(
9
- client: Trusona::Api::HTTPClient.new(Trusona.config.api_host),
10
- mapper: Trusona::Mappers::DeviceUserBindingMapper.new
11
- )
9
+ client: Trusona::Api::HTTPClient.new(Trusona.config.api_host),
10
+ mapper: Trusona::Mappers::DeviceUserBindingMapper.new
11
+ )
12
12
  @client = client
13
13
  @mapper = mapper
14
14
  @resource_path = '/api/v2/user_devices'
@@ -6,9 +6,9 @@ module Trusona
6
6
  ## Identity Documents Service
7
7
  class IdentityDocumentsService < BaseService
8
8
  def initialize(
9
- client: Trusona::Api::HTTPClient.new(Trusona.config.api_host),
10
- mapper: Trusona::Mappers::IdentityDocumentMapper.new
11
- )
9
+ client: Trusona::Api::HTTPClient.new(Trusona.config.api_host),
10
+ mapper: Trusona::Mappers::IdentityDocumentMapper.new
11
+ )
12
12
  @client = client
13
13
  @mapper = mapper
14
14
  @resource_path = '/api/v2/identity_documents'
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Trusona
4
4
  module Services
5
+ ## Paired trucode service
5
6
  class PairedTruCodeService < BaseService
6
7
  def initialize(client: Trusona::Api::HTTPClient.new)
7
8
  super(client: client, mapper: Trusona::Mappers::PairedTruCodeMapper.new)
@@ -28,6 +28,29 @@ module Trusona
28
28
  Trusona::Workers::TrusonaficationFinder.new.find(trusonafication_id)
29
29
  end
30
30
 
31
+ ##
32
+ # Cancels existing IN_PROGRESS Trusonafications using their ID. Once
33
+ # canceled the trusonafication can no longer be acted upon.
34
+ #
35
+ # @param trusonafication_id [String] the ID of an existing Trusonafication
36
+ # @raise [Trusona::InvalidRecordIdentifier] if the +trusonafication_id+ is
37
+ # empty or nil.
38
+ # @raise [Trusona::ResourceNotFoundError] if the resource does not exist
39
+ # in the Trusona API
40
+ # @raise [Trusona::UnprocessableEntityError] if the resource could not be
41
+ # cancel because it was not IN_PROGRESS
42
+ #
43
+ # @example
44
+ # Trusona::Trusonafication.cancel('756c1034-2159-4cf9-bd48-662a60a7afff')
45
+ #
46
+ def self.cancel(trusonafication_id)
47
+ if trusonafication_id.nil? || trusonafication_id.strip.empty?
48
+ raise Trusona::InvalidRecordIdentifier, 'Trusonafication ID is missing'
49
+ end
50
+
51
+ Trusona::Workers::TrusonaficationCanceler.new.cancel(trusonafication_id)
52
+ end
53
+
31
54
  ##
32
55
  # Creates a Trusonafication using the supplied options
33
56
  #
@@ -55,12 +78,18 @@ module Trusona
55
78
  # Accept or Reject this Trusonafication?
56
79
  # @option params [String] :expires_at ('90 seconds') The ISO-8601 UTC
57
80
  # timestamp of the Trusonafication's expiration.
58
- # @param timeout [Int] (30) The max amount of time, in seconds, to wait
59
- # for a response from the Trusona API when polling for a Trusonafication
60
- # result
61
81
  # @option params [Hash] :custom_fields Optional data to be associated with
62
82
  # this Trusonafication and can be used to constomize any UX elements. Total
63
83
  # size of data is limited to 1MB.
84
+ # @option params [String] :callback_url A HTTPS URL to POST to call when the
85
+ # trusonafication has been completed (accepted, rejected, or expired).
86
+ #
87
+ # NOTE: The URL should include a randomized segment so it cannot be guessed
88
+ # and abused by third-parties e.g. https://your.domain.com/completed_authentications/f8abe61d-4e51-493f-97b1-464c157624f2.
89
+ #
90
+ # @param timeout [Int] (30) The max amount of time, in seconds, to wait
91
+ # for a response from the Trusona API when polling for a Trusonafication
92
+ # result
64
93
  # @yield [Trusona::Resources::Trusonafication] Yields the completed
65
94
  # Trusonafication to the block
66
95
  # @raise [Trusona::InvalidResourceError] if the resource is not +valid?+
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Trusona
4
- VERSION = '2.3.0'
4
+ VERSION = '2.5.3'
5
5
  end
@@ -11,6 +11,7 @@ module Trusona
11
11
 
12
12
  def find(id = nil)
13
13
  raise(ArgumentError, 'A device identifier is required.') unless id
14
+
14
15
  @service.get(Trusona::Resources::Device.new(id: id))
15
16
  end
16
17
  end
@@ -18,6 +18,7 @@ module Trusona
18
18
 
19
19
  def find(id = nil)
20
20
  raise(ArgumentError, 'An Identity Document id is required.') unless id
21
+
21
22
  @service.get(Trusona::Resources::IdentityDocument.new(id: id))
22
23
  end
23
24
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Trusona
4
4
  module Workers
5
+ # A Paired Trucode Finder
5
6
  class PairedTruCodeFinder
6
7
  def initialize(service: Trusona::Services::PairedTruCodeService.new)
7
8
  @service = service
@@ -11,6 +11,7 @@ module Trusona
11
11
 
12
12
  def find(id)
13
13
  raise ArgumentError, 'Missing TruCode Id' unless id
14
+
14
15
  resource = Trusona::Resources::BaseResource.new(id: id)
15
16
  @service.get(resource)
16
17
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Trusona
4
+ module Workers
5
+ #
6
+ ## Cancel a Trusonafication
7
+ class TrusonaficationCanceler
8
+ def initialize(service: nil)
9
+ @service = service || Trusona::Services::TrusonaficationService.new
10
+ end
11
+
12
+ def cancel(trusonafication_id)
13
+ if trusonafication_id.nil? || trusonafication_id.strip.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.delete(resource)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -14,6 +14,7 @@ module Trusona
14
14
  def create(params: {}, timeout: nil, &block)
15
15
  raise ArgumentError, 'Missing or empty params hash' if
16
16
  params.nil? || params.empty?
17
+
17
18
  resource = Trusona::Resources::Trusonafication.new(params)
18
19
  trusonafication = @service.create(resource)
19
20
  return trusonafication unless block_given?
@@ -43,4 +44,4 @@ module Trusona
43
44
  # rubocop:enable Metrics/MethodLength
44
45
  end
45
46
  end
46
- end
47
+ end
@@ -24,4 +24,4 @@ module Trusona
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -18,9 +18,7 @@ module Trusona
18
18
 
19
19
  resource = build_resource(opts)
20
20
 
21
- if opts[:trusona_id] || opts['trusona_id']
22
- return @user_accounts.get(resource)
23
- end
21
+ return @user_accounts.get(resource) if opts[:trusona_id] || opts['trusona_id']
24
22
 
25
23
  @lookups.create(resource) if opts[:email] || opts['email']
26
24
  end
@@ -10,9 +10,7 @@ module Trusona
10
10
  end
11
11
 
12
12
  def deactivate(user_identifier)
13
- if user_identifier.nil? || user_identifier.empty?
14
- raise(ArgumentError, "The user's identifier is required")
15
- end
13
+ raise(ArgumentError, "The user's identifier is required") if user_identifier.nil? || user_identifier.empty?
16
14
 
17
15
  user = Trusona::Resources::User.new(user_identifier: user_identifier)
18
16
  @service.delete(user)
@@ -12,6 +12,7 @@ module Trusona
12
12
  def find(opts)
13
13
  raise ArgumentError, 'Missing user identifier' unless
14
14
  contains_required_arguments(opts)
15
+
15
16
  @service.get(build_resource(opts))
16
17
  end
17
18
 
@@ -0,0 +1,14 @@
1
+ [req]
2
+ default_bits = 4096
3
+ prompt = no
4
+ default_md = sha256
5
+ distinguished_name = dn
6
+
7
+ [dn]
8
+ C=US
9
+ ST=Arizona
10
+ L=Scottsdale
11
+ O=Trusona, Inc.
12
+ OU=Engineering
13
+ emailAddress=engineering@trusona.com
14
+ CN=trusona.com
@@ -14,8 +14,8 @@ Gem::Specification.new do |spec|
14
14
  spec.description = 'Easily interact with the Trusona REST API'
15
15
  spec.homepage = 'https://trusona.com'
16
16
  spec.license = 'Apache-2.0'
17
- spec.cert_chain = ['certs/trusona.pem']
18
- spec.signing_key = 'trusona.key.pem' if $0 =~ /gem\z/
17
+ spec.cert_chain = ['trusona.pub.pem']
18
+ spec.signing_key = 'trusona.key.pem' if $0 =~ /gem\z/
19
19
 
20
20
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
21
  f.match(%r{^(test|spec|features)/})
@@ -28,17 +28,19 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.metadata['yard.run'] = 'yri' # use "yard" to build full HTML docs.
30
30
 
31
+ spec.add_development_dependency 'activesupport', '~> 6.0'
31
32
  spec.add_development_dependency 'bump', '~> 0.5'
32
- spec.add_development_dependency 'bundler'
33
33
  spec.add_development_dependency 'dotenv', '~> 2.2'
34
34
  spec.add_development_dependency 'guard', '~> 2.14'
35
35
  spec.add_development_dependency 'guard-rspec', '~> 4.7'
36
36
  spec.add_development_dependency 'guard-rubocop', '~> 1.3'
37
37
  spec.add_development_dependency 'guard-yard', '~> 2.2'
38
- spec.add_development_dependency 'rake', '~> 10.0'
38
+ spec.add_development_dependency 'rake', '~> 13.0'
39
39
  spec.add_development_dependency 'rspec', '~> 3.0'
40
- spec.add_development_dependency 'rubocop', '~> 0.49'
41
- spec.add_development_dependency 'simplecov', '~> 0.14'
40
+ spec.add_development_dependency 'rspec-wait', '~> 0.0'
41
+ spec.add_development_dependency 'rubocop', '~> 0.89.1'
42
+ spec.add_development_dependency 'rubocop-performance', '~> 1.7.1'
43
+ spec.add_development_dependency 'simplecov', '0.19.0'
42
44
  spec.add_development_dependency 'yard', '~> 0.9'
43
- spec.add_development_dependency 'webmock'
45
+ spec.add_development_dependency 'webmock', '~> 3.5'
44
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trusona
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Trusona
@@ -10,40 +10,39 @@ bindir: exe
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 0J/2zIL/PvZVaq07tjieHXn2jwRB9YWCzpYK8wen10sGTbc4yDKUPLP7rgsk+Noq
26
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- IhdWADBmFVEeMXB31FqpgwOwSr8zYK7aCXFY1f+CmHDivjuJ5my33dWt2wyKTjgO
40
- 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
- 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
- 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
- ++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
44
- eNCk84I=
13
+ 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
45
44
  -----END CERTIFICATE-----
46
- date: 2019-07-31 00:00:00.000000000 Z
45
+ date: 2020-09-01 00:00:00.000000000 Z
47
46
  dependencies:
48
47
  - !ruby/object:Gem::Dependency
49
48
  name: httparty
@@ -60,33 +59,33 @@ dependencies:
60
59
  - !ruby/object:Gem::Version
61
60
  version: '0.15'
62
61
  - !ruby/object:Gem::Dependency
63
- name: bump
62
+ name: activesupport
64
63
  requirement: !ruby/object:Gem::Requirement
65
64
  requirements:
66
65
  - - "~>"
67
66
  - !ruby/object:Gem::Version
68
- version: '0.5'
67
+ version: '6.0'
69
68
  type: :development
70
69
  prerelease: false
71
70
  version_requirements: !ruby/object:Gem::Requirement
72
71
  requirements:
73
72
  - - "~>"
74
73
  - !ruby/object:Gem::Version
75
- version: '0.5'
74
+ version: '6.0'
76
75
  - !ruby/object:Gem::Dependency
77
- name: bundler
76
+ name: bump
78
77
  requirement: !ruby/object:Gem::Requirement
79
78
  requirements:
80
- - - ">="
79
+ - - "~>"
81
80
  - !ruby/object:Gem::Version
82
- version: '0'
81
+ version: '0.5'
83
82
  type: :development
84
83
  prerelease: false
85
84
  version_requirements: !ruby/object:Gem::Requirement
86
85
  requirements:
87
- - - ">="
86
+ - - "~>"
88
87
  - !ruby/object:Gem::Version
89
- version: '0'
88
+ version: '0.5'
90
89
  - !ruby/object:Gem::Dependency
91
90
  name: dotenv
92
91
  requirement: !ruby/object:Gem::Requirement
@@ -163,14 +162,14 @@ dependencies:
163
162
  requirements:
164
163
  - - "~>"
165
164
  - !ruby/object:Gem::Version
166
- version: '10.0'
165
+ version: '13.0'
167
166
  type: :development
168
167
  prerelease: false
169
168
  version_requirements: !ruby/object:Gem::Requirement
170
169
  requirements:
171
170
  - - "~>"
172
171
  - !ruby/object:Gem::Version
173
- version: '10.0'
172
+ version: '13.0'
174
173
  - !ruby/object:Gem::Dependency
175
174
  name: rspec
176
175
  requirement: !ruby/object:Gem::Requirement
@@ -185,34 +184,62 @@ dependencies:
185
184
  - - "~>"
186
185
  - !ruby/object:Gem::Version
187
186
  version: '3.0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: rspec-wait
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: '0.0'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '0.0'
188
201
  - !ruby/object:Gem::Dependency
189
202
  name: rubocop
190
203
  requirement: !ruby/object:Gem::Requirement
191
204
  requirements:
192
205
  - - "~>"
193
206
  - !ruby/object:Gem::Version
194
- version: '0.49'
207
+ version: 0.89.1
195
208
  type: :development
196
209
  prerelease: false
197
210
  version_requirements: !ruby/object:Gem::Requirement
198
211
  requirements:
199
212
  - - "~>"
200
213
  - !ruby/object:Gem::Version
201
- version: '0.49'
214
+ version: 0.89.1
202
215
  - !ruby/object:Gem::Dependency
203
- name: simplecov
216
+ name: rubocop-performance
204
217
  requirement: !ruby/object:Gem::Requirement
205
218
  requirements:
206
219
  - - "~>"
207
220
  - !ruby/object:Gem::Version
208
- version: '0.14'
221
+ version: 1.7.1
209
222
  type: :development
210
223
  prerelease: false
211
224
  version_requirements: !ruby/object:Gem::Requirement
212
225
  requirements:
213
226
  - - "~>"
214
227
  - !ruby/object:Gem::Version
215
- version: '0.14'
228
+ version: 1.7.1
229
+ - !ruby/object:Gem::Dependency
230
+ name: simplecov
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - '='
234
+ - !ruby/object:Gem::Version
235
+ version: 0.19.0
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - '='
241
+ - !ruby/object:Gem::Version
242
+ version: 0.19.0
216
243
  - !ruby/object:Gem::Dependency
217
244
  name: yard
218
245
  requirement: !ruby/object:Gem::Requirement
@@ -231,16 +258,16 @@ dependencies:
231
258
  name: webmock
232
259
  requirement: !ruby/object:Gem::Requirement
233
260
  requirements:
234
- - - ">="
261
+ - - "~>"
235
262
  - !ruby/object:Gem::Version
236
- version: '0'
263
+ version: '3.5'
237
264
  type: :development
238
265
  prerelease: false
239
266
  version_requirements: !ruby/object:Gem::Requirement
240
267
  requirements:
241
- - - ">="
268
+ - - "~>"
242
269
  - !ruby/object:Gem::Version
243
- version: '0'
270
+ version: '3.5'
244
271
  description: Easily interact with the Trusona REST API
245
272
  email:
246
273
  - engineering@trusona.com
@@ -251,6 +278,7 @@ files:
251
278
  - ".env.example"
252
279
  - ".gitignore"
253
280
  - ".rspec"
281
+ - ".rubocop.yml"
254
282
  - ".ruby-version"
255
283
  - ".travis.yml"
256
284
  - DEVELOP.md
@@ -261,8 +289,8 @@ files:
261
289
  - Rakefile
262
290
  - bin/console
263
291
  - bin/setup
264
- - certs/trusona.pem
265
292
  - checksum/trusona-0.16.0.gem.sha512
293
+ - integrations/buster.rb
266
294
  - integrations/device_user_binding_integration_spec.rb
267
295
  - integrations/identity_documents_spec.rb
268
296
  - integrations/paired_tru_code_spec.rb
@@ -331,14 +359,15 @@ files:
331
359
  - lib/trusona/workers/paired_tru_code_finder.rb
332
360
  - lib/trusona/workers/tru_code_creator.rb
333
361
  - lib/trusona/workers/tru_code_finder.rb
362
+ - lib/trusona/workers/trusonafication_canceler.rb
334
363
  - lib/trusona/workers/trusonafication_creator.rb
335
364
  - lib/trusona/workers/trusonafication_finder.rb
336
365
  - lib/trusona/workers/user_account_finder.rb
337
366
  - lib/trusona/workers/user_deactivator.rb
338
367
  - lib/trusona/workers/user_identifier_creator.rb
339
368
  - lib/trusona/workers/user_identifier_finder.rb
369
+ - trusona.cnf
340
370
  - trusona.gemspec
341
- - trusona.key.pem.enc
342
371
  homepage: https://trusona.com
343
372
  licenses:
344
373
  - Apache-2.0
@@ -359,8 +388,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
359
388
  - !ruby/object:Gem::Version
360
389
  version: '0'
361
390
  requirements: []
362
- rubyforge_project:
363
- rubygems_version: 2.6.14
391
+ rubygems_version: 3.0.8
364
392
  signing_key:
365
393
  specification_version: 4
366
394
  summary: Trusona REST API wrapper