mauth-client 7.0.0 → 7.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2bba0c6eb1611b4662a09c82bb2a0493ccdf10ad18519ca6cdfec4436da12fed
4
- data.tar.gz: ea9cc4c97792777115f3e612a2baa1b7135c43f7b34302e66150a962f8dfd422
3
+ metadata.gz: 13c58b1677a77952cf139df370154dbbe079aeb4aa3be211520796edf3ff5a02
4
+ data.tar.gz: cf39996376710d65d3e6fdecda46248788641028783d98b42f02e747a1ac1e74
5
5
  SHA512:
6
- metadata.gz: 7cd8843becf3ad4eb6595fd2de37fe17d459178c0ee2648794e117fa4cb13283fa359a3d154031fc466a4448a796616d4727e3f1e4cae725f797ec33a8a540b8
7
- data.tar.gz: d43181445129e3a8fa350547d29bb10e8b02ef9762d35ff85b4fb87a6f26c47c08a2a1c227ff7618f07544dd6deebb8c6fe60ddfe2ebeda6fa12f3fd89a74807
6
+ metadata.gz: daee87957cb651a32d8a7f5b07004a90c7ac3f690fa5d59069f5b8a73ca22d5afcdb014ea8113b96661da59790e0fa190f16ef01264336c951ccdab20980f2d8
7
+ data.tar.gz: '0774058a011e491316dc0e264fd56c301028fc9f5e450499021d6a1e5736e476b49104c44b0a05d785f1b855feb88fa528b1d5fb4c03398676dc54b16da7e728'
data/.travis.yml CHANGED
@@ -12,17 +12,7 @@ env:
12
12
  global:
13
13
  - BUNDLE_JOBS=4
14
14
 
15
- jobs:
16
- exclude:
17
- - rvm: 3.0
18
- gemfile: gemfiles/faraday_0.x.gemfile # Faraday v0.x does not officially support Ruby 3 (see: https://github.com/lostisland/faraday/releases/tag/v1.3.0)
19
- - rvm: 3.1
20
- gemfile: gemfiles/faraday_0.x.gemfile # Faraday v0.x does not officially support Ruby 3 (see: https://github.com/lostisland/faraday/releases/tag/v1.3.0)
21
- - rvm: 3.2
22
- gemfile: gemfiles/faraday_0.x.gemfile # Faraday v0.x does not officially support Ruby 3 (see: https://github.com/lostisland/faraday/releases/tag/v1.3.0)
23
-
24
15
  gemfile:
25
- - gemfiles/faraday_0.x.gemfile
26
16
  - gemfiles/faraday_1.x.gemfile
27
17
  - gemfiles/faraday_2.x.gemfile
28
18
 
data/Appraisals CHANGED
@@ -1,11 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- appraise 'faraday_0.x' do
4
- gem 'faraday', '~> 0.9'
5
- end
6
-
7
3
  appraise 'faraday_1.x' do
8
- gem 'faraday', '~> 1.0'
4
+ gem 'faraday', '~> 1.9'
9
5
  end
10
6
 
11
7
  appraise 'faraday_2.x' do
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## v7.1.0
2
+ - Add MAuth::PrivateKeyHelper.load method to process RSA private keys.
3
+ - Update Faraday configuration in SecurityTokenCacher:
4
+ - Add the `MAUTH_USE_RAILS_CACHE` environment variable to make `Rails.cache` usable to cache public keys.
5
+ - Shorten timeout for connection, add retries, and use persistent HTTP connections.
6
+ - Drop support for Faraday < 1.9.
7
+
1
8
  ## v7.0.0
2
9
  - Remove dice_bag and set configuration through environment variables directly.
3
10
  - Rename the `V2_ONLY_SIGN_REQUESTS`, `V2_ONLY_AUTHENTICATE`, `DISABLE_FALLBACK_TO_V1_ON_V2_FAILURE` and `V1_ONLY_SIGN_REQUESTS` environment variables.
data/README.md CHANGED
@@ -30,7 +30,7 @@ $ gem install mauth-client
30
30
  Configuration is set through environment variables:
31
31
 
32
32
  - `MAUTH_PRIVATE_KEY`
33
- - Required for signing and for authenticating responses.
33
+ - Required for signing and for authentication.
34
34
 
35
35
  - `MAUTH_PRIVATE_KEY_FILE`
36
36
  - May be used instead of `MAUTH_PRIVATE_KEY`, mauth-client will load the file instead.
@@ -56,6 +56,8 @@ Configuration is set through environment variables:
56
56
  - `MAUTH_V1_ONLY_SIGN_REQUESTS`
57
57
  - If true, all outgoing requests will be signed with only the V1 protocol. Defaults to true. Note, cannot be `true` if `MAUTH_V2_ONLY_SIGN_REQUESTS` is also `true`.
58
58
 
59
+ - `MAUTH_USE_RAILS_CACHE`
60
+ - If true, `Rails.cache` is used to cache public keys for authentication.
59
61
 
60
62
  This is simply loaded and passed to either middleware or directly to a MAuth::Client instance.
61
63
  See the documentation for [MAuth::Client#initialize](lib/mauth/client.rb) for more details of what it accepts. Usually you will want:
@@ -67,10 +69,10 @@ MAUTH_CONF = MAuth::Client.default_config
67
69
  The `.default_config` method takes a number of options to tweak its expectations regarding defaults. See the
68
70
  documentation for [MAuth::Client.default_config](lib/mauth/client.rb) for details.
69
71
 
70
- The `private_key` and `app_uuid` enable local authentication (see section [Local Authentication](#local-authentication) below).
72
+ The `private_key` and `app_uuid` are required for signing and for authentication.
71
73
  They’ll only work if the `app_uuid` has been stored in MAuth with a public key corresponding to the `private_key`.
72
74
 
73
- The `mauth_baseurl` and `mauth_api_version` are required.
75
+ The `mauth_baseurl` and `mauth_api_version` are required for authentication.
74
76
  These tell the MAuth-Client where and how to communicate with the MAuth service.
75
77
 
76
78
  The `v2_only_sign_requests` and `v2_only_authenticate` flags were added to facilitate conversion from the MAuth V1 protocol to the MAuth
@@ -248,9 +250,7 @@ Only use the `MAuth::Faraday::ResponseAuthenticator` middleware if you are expec
248
250
  `MAUTH_CONF` is the same as in Rack middleware, and as with the Rack middleware is used to initialize a `MAuth::Client` instance.
249
251
  Also as with the Rack middleware, you can pass in a `MAuth::Client` instance you are using yourself on the `:mauth_client` key, and omit any other configuration.
250
252
 
251
- Behavior is likewise similar to rack: if a `private_key` and `app_uuid` are specified, then ResponseAuthenticator will authenticate locally (see [Local Authentication](#local-authentication) below); if not, then it will go to the
252
- mauth service to authenticate.
253
- `MAuth::Faraday::RequestSigner` cannot be used without a `private_key` and `app_uuid`.
253
+ Both `MAuth::Faraday::ResponseAuthenticator` and `MAuth::Faraday::RequestSigner` cannot be used without a `private_key` and `app_uuid`.
254
254
 
255
255
  If a response which does not appear to be authentic is received by the `MAuth::Faraday::ResponseAuthenticator` middleware, a `MAuth::InauthenticError` will be raised.
256
256
 
@@ -272,18 +272,6 @@ request = MAuth::Request.new(verb: my_verb, request_url: my_request_url, body: m
272
272
  ```
273
273
  `mauth_client.signed_headers(request)` will then return mauth headers which you can apply to your request.
274
274
 
275
- ## Local Authentication
276
-
277
- When doing local authentication, the MAuth-Client will periodically fetch and cache public keys from MAuth.
278
- Each public key will be cached locally for 60 seconds.
279
- Applications which connect frequently to the app will benefit most from this caching strategy.
280
- When fetching public keys from MAuth, the following rules apply:
281
-
282
- 1. If MAuth returns the public key for a given `app_uuid`, MAuth-Client will refresh its local cache with this new public key.
283
- 2. If MAuth cannot find the public key for a given `app_uuid` (i.e. returns a 404 status code), MAuth-Client will remove the corresponding public key from its local cache and authentication of any message from the application with this public key will fail as a consequence.
284
- 3. If the request to MAuth times out or MAuth returns a 500 status code, the requested public key will not be removed from local MAuth-Client cache (if it exists there in the first place).
285
- The cached version will continue to be used for local authentication until MAuth::Client is able to again communicate with MAuth.
286
-
287
275
  ## Warning
288
276
 
289
277
  During development classes are typically not cached in Rails applications.
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
- gem "faraday", "~> 1.0"
5
+ gem "faraday", "~> 1.9"
6
6
 
7
7
  group :development do
8
8
  gem "appraisal", "~> 2.4"
@@ -1,16 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'faraday-http-cache'
4
+ require 'faraday/retry'
5
+ if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.0')
6
+ require 'faraday/net_http_persistent'
7
+ else
8
+ require 'net/http/persistent'
9
+ end
4
10
  require 'mauth/faraday'
5
11
 
6
12
  module MAuth
7
13
  class Client
8
14
  module Authenticator
9
15
  class SecurityTokenCacher
16
+ attr_reader :mauth_client
17
+
10
18
  def initialize(mauth_client)
11
19
  @mauth_client = mauth_client
12
20
  # TODO: should this be UnableToSignError?
13
- @mauth_client.assert_private_key(
21
+ mauth_client.assert_private_key(
14
22
  UnableToAuthenticateError.new('Cannot fetch public keys from mAuth service without a private key!')
15
23
  )
16
24
  end
@@ -19,7 +27,7 @@ module MAuth
19
27
  # url-encode the app_uuid to prevent trickery like escaping upward with ../../ in a malicious
20
28
  # app_uuid - probably not exploitable, but this is the right way to do it anyway.
21
29
  url_encoded_app_uuid = CGI.escape(app_uuid)
22
- path = "/mauth/#{@mauth_client.mauth_api_version}/security_tokens/#{url_encoded_app_uuid}.json"
30
+ path = "/mauth/#{mauth_client.mauth_api_version}/security_tokens/#{url_encoded_app_uuid}.json"
23
31
  response = signed_mauth_connection.get(path)
24
32
 
25
33
  case response.status
@@ -29,11 +37,11 @@ module MAuth
29
37
  # signing with a key mAuth doesn't know about is considered inauthentic
30
38
  raise InauthenticError, "mAuth service responded with 404 looking up public key for #{app_uuid}"
31
39
  else
32
- @mauth_client.send(:mauth_service_response_error, response)
40
+ mauth_client.send(:mauth_service_response_error, response)
33
41
  end
34
42
  rescue ::Faraday::ConnectionFailed, ::Faraday::TimeoutError => e
35
43
  msg = "mAuth service did not respond; received #{e.class}: #{e.message}"
36
- @mauth_client.logger.error("Unable to authenticate with MAuth. Exception #{msg}")
44
+ mauth_client.logger.error("Unable to authenticate with MAuth. Exception #{msg}")
37
45
  raise UnableToAuthenticateError, msg
38
46
  end
39
47
 
@@ -43,21 +51,20 @@ module MAuth
43
51
  JSON.parse response_body
44
52
  rescue JSON::ParserError => e
45
53
  msg = "mAuth service responded with unparseable json: #{response_body}\n#{e.class}: #{e.message}"
46
- @mauth_client.logger.error("Unable to authenticate with MAuth. Exception #{msg}")
54
+ mauth_client.logger.error("Unable to authenticate with MAuth. Exception #{msg}")
47
55
  raise UnableToAuthenticateError, msg
48
56
  end
49
57
 
50
58
  def signed_mauth_connection
51
59
  @signed_mauth_connection ||= begin
52
- if @mauth_client.ssl_certs_path
53
- @mauth_client.faraday_options[:ssl] = { ca_path: @mauth_client.ssl_certs_path }
54
- end
60
+ mauth_client.faraday_options[:ssl] = { ca_path: mauth_client.ssl_certs_path } if mauth_client.ssl_certs_path
55
61
 
56
- ::Faraday.new(@mauth_client.mauth_baseurl, @mauth_client.faraday_options) do |builder|
62
+ ::Faraday.new(mauth_client.mauth_baseurl, mauth_client.faraday_options) do |builder|
57
63
  builder.use MAuth::Faraday::MAuthClientUserAgent
58
- builder.use MAuth::Faraday::RequestSigner, 'mauth_client' => @mauth_client
59
- builder.use :http_cache, logger: MAuth::Client.new.logger, shared_cache: false
60
- builder.adapter ::Faraday.default_adapter
64
+ builder.use MAuth::Faraday::RequestSigner, 'mauth_client' => mauth_client
65
+ builder.use :http_cache, store: mauth_client.cache_store, logger: mauth_client.logger, shared_cache: false
66
+ builder.request :retry, max: 2
67
+ builder.adapter :net_http_persistent
61
68
  end
62
69
  end
63
70
  end
data/lib/mauth/client.rb CHANGED
@@ -12,6 +12,7 @@ require 'mauth/client/authenticator'
12
12
  require 'mauth/client/signer'
13
13
  require 'mauth/config_env'
14
14
  require 'mauth/errors'
15
+ require 'mauth/private_key_helper'
15
16
 
16
17
  module MAuth
17
18
  # does operations which require a private key and corresponding app uuid. this is primarily:
@@ -60,7 +61,7 @@ module MAuth
60
61
 
61
62
  # new client with the given App UUID and public key. config may include the following (all
62
63
  # config keys may be strings or symbols):
63
- # - private_key - required for signing and for authenticating responses.
64
+ # - private_key - required for signing and for authentication.
64
65
  # may be given as a string or a OpenSSL::PKey::RSA instance.
65
66
  # - app_uuid - required in the same circumstances where a private_key is required
66
67
  # - mauth_baseurl - required. needed to retrieve public keys.
@@ -80,7 +81,7 @@ module MAuth
80
81
  when nil
81
82
  nil
82
83
  when String
83
- OpenSSL::PKey::RSA.new(given_config['private_key'])
84
+ PrivateKeyHelper.load(given_config['private_key'])
84
85
  when OpenSSL::PKey::RSA
85
86
  given_config['private_key']
86
87
  else
@@ -102,7 +103,7 @@ module MAuth
102
103
  end
103
104
  end
104
105
 
105
- request_config = { timeout: 10, open_timeout: 10 }
106
+ request_config = { timeout: 10, open_timeout: 3 }
106
107
  request_config.merge!(symbolize_keys(given_config['faraday_options'])) if given_config['faraday_options']
107
108
  @config['faraday_options'] = { request: request_config } || {}
108
109
  @config['ssl_certs_path'] = given_config['ssl_certs_path'] if given_config['ssl_certs_path']
@@ -115,6 +116,7 @@ module MAuth
115
116
 
116
117
  @config['disable_fallback_to_v1_on_v2_failure'] =
117
118
  given_config['disable_fallback_to_v1_on_v2_failure'].to_s.casecmp('true').zero?
119
+ @config['use_rails_cache'] = given_config['use_rails_cache']
118
120
  end
119
121
 
120
122
  def logger
@@ -165,6 +167,10 @@ module MAuth
165
167
  raise err unless private_key
166
168
  end
167
169
 
170
+ def cache_store
171
+ Rails.cache if @config['use_rails_cache'] && Object.const_defined?(:Rails) && ::Rails.respond_to?(:cache)
172
+ end
173
+
168
174
  private
169
175
 
170
176
  def mauth_service_response_error(response)
@@ -13,7 +13,8 @@ module MAuth
13
13
  'MAUTH_V2_ONLY_AUTHENTICATE' => false,
14
14
  'MAUTH_V2_ONLY_SIGN_REQUESTS' => false,
15
15
  'MAUTH_DISABLE_FALLBACK_TO_V1_ON_V2_FAILURE' => false,
16
- 'MAUTH_V1_ONLY_SIGN_REQUESTS' => true
16
+ 'MAUTH_V1_ONLY_SIGN_REQUESTS' => true,
17
+ 'MAUTH_USE_RAILS_CACHE' => false
17
18
  }.freeze
18
19
 
19
20
  class << self
@@ -24,11 +25,12 @@ module MAuth
24
25
  'mauth_baseurl' => env[:mauth_url] || 'http://localhost:7000',
25
26
  'mauth_api_version' => env[:mauth_api_version],
26
27
  'app_uuid' => env[:mauth_app_uuid] || 'fb17460e-9868-11e1-8399-0090f5ccb4d3',
27
- 'private_key' => private_key || generate_private_key,
28
+ 'private_key' => private_key || PrivateKeyHelper.generate.to_s,
28
29
  'v2_only_authenticate' => env[:mauth_v2_only_authenticate],
29
30
  'v2_only_sign_requests' => env[:mauth_v2_only_sign_requests],
30
31
  'disable_fallback_to_v1_on_v2_failure' => env[:mauth_disable_fallback_to_v1_on_v2_failure],
31
- 'v1_only_sign_requests' => env[:mauth_v1_only_sign_requests]
32
+ 'v1_only_sign_requests' => env[:mauth_v1_only_sign_requests],
33
+ 'use_rails_cache' => env[:mauth_use_rails_cache]
32
34
  }
33
35
  end
34
36
 
@@ -74,11 +76,6 @@ module MAuth
74
76
 
75
77
  File.read(env[:mauth_private_key_file])
76
78
  end
77
-
78
- def generate_private_key
79
- require 'openssl'
80
- OpenSSL::PKey::RSA.generate(2048).to_s
81
- end
82
79
  end
83
80
  end
84
81
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'openssl'
4
+
5
+ module MAuth
6
+ module PrivateKeyHelper
7
+ HEADER = '-----BEGIN RSA PRIVATE KEY-----'
8
+ FOOTER = '-----END RSA PRIVATE KEY-----'
9
+
10
+ module_function
11
+
12
+ def generate
13
+ OpenSSL::PKey::RSA.generate(2048)
14
+ end
15
+
16
+ def load(key)
17
+ OpenSSL::PKey::RSA.new(to_rsa_format(key))
18
+ rescue OpenSSL::PKey::RSAError
19
+ raise 'The private key provided is invalid'
20
+ end
21
+
22
+ def to_rsa_format(key)
23
+ return key if key.include?("\n")
24
+
25
+ body = key.strip.delete_prefix(HEADER).delete_suffix(FOOTER).strip
26
+ body = body.include?("\s") ? body.tr("\s", "\n") : body.scan(/.{1,64}/).join("\n")
27
+ "#{HEADER}\n#{body}\n#{FOOTER}"
28
+ end
29
+ end
30
+ end
data/lib/mauth/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MAuth
4
- VERSION = '7.0.0'
4
+ VERSION = '7.1.0'
5
5
  end
data/mauth-client.gemspec CHANGED
@@ -23,8 +23,11 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_dependency 'addressable', '~> 2.0'
25
25
  spec.add_dependency 'coderay', '~> 1.0'
26
- spec.add_dependency 'faraday', '>= 0.9', '< 3.0'
26
+ spec.add_dependency 'faraday', '>= 1.9', '< 3.0'
27
27
  spec.add_dependency 'faraday-http-cache', '>= 2.0', '< 3.0'
28
+ spec.add_dependency 'faraday-net_http_persistent'
29
+ spec.add_dependency 'faraday-retry'
30
+ spec.add_dependency 'net-http-persistent', '>= 3.1'
28
31
  spec.add_dependency 'rack', '> 2.2.3'
29
32
  spec.add_dependency 'term-ansicolor', '~> 1.0'
30
33
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mauth-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.0
4
+ version: 7.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Szenher
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: exe
13
13
  cert_chain: []
14
- date: 2023-05-24 00:00:00.000000000 Z
14
+ date: 2023-06-01 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: addressable
@@ -47,7 +47,7 @@ dependencies:
47
47
  requirements:
48
48
  - - ">="
49
49
  - !ruby/object:Gem::Version
50
- version: '0.9'
50
+ version: '1.9'
51
51
  - - "<"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '3.0'
@@ -57,7 +57,7 @@ dependencies:
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: '0.9'
60
+ version: '1.9'
61
61
  - - "<"
62
62
  - !ruby/object:Gem::Version
63
63
  version: '3.0'
@@ -81,6 +81,48 @@ dependencies:
81
81
  - - "<"
82
82
  - !ruby/object:Gem::Version
83
83
  version: '3.0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: faraday-net_http_persistent
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: faraday-retry
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: net-http-persistent
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '3.1'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '3.1'
84
126
  - !ruby/object:Gem::Dependency
85
127
  name: rack
86
128
  requirement: !ruby/object:Gem::Requirement
@@ -120,7 +162,6 @@ executables:
120
162
  extensions: []
121
163
  extra_rdoc_files: []
122
164
  files:
123
- - ".fossa.yml"
124
165
  - ".gitignore"
125
166
  - ".gitmodules"
126
167
  - ".rspec"
@@ -145,7 +186,6 @@ files:
145
186
  - examples/mauth_key
146
187
  - exe/mauth-client
147
188
  - exe/mauth-proxy
148
- - gemfiles/faraday_0.x.gemfile
149
189
  - gemfiles/faraday_1.x.gemfile
150
190
  - gemfiles/faraday_2.x.gemfile
151
191
  - lib/mauth-client.rb
@@ -160,6 +200,7 @@ files:
160
200
  - lib/mauth/fake/rack.rb
161
201
  - lib/mauth/faraday.rb
162
202
  - lib/mauth/middleware.rb
203
+ - lib/mauth/private_key_helper.rb
163
204
  - lib/mauth/proxy.rb
164
205
  - lib/mauth/rack.rb
165
206
  - lib/mauth/request_and_response.rb
data/.fossa.yml DELETED
@@ -1,14 +0,0 @@
1
- # Generated by FOSSA CLI (https://github.com/fossas/fossa-cli)
2
- # Visit https://fossa.io to learn more
3
-
4
- version: 1
5
- cli:
6
- server: https://app.fossa.io
7
- fetcher: custom
8
- project: mauth-client-ruby
9
- analyze:
10
- modules:
11
- - name: Gemfile
12
- type: gem
13
- target: .
14
- path: .
@@ -1,23 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "faraday", "~> 0.9"
6
-
7
- group :development do
8
- gem "appraisal", "~> 2.4"
9
- gem "benchmark-ips", "~> 2.7"
10
- gem "bundler", ">= 1.17"
11
- gem "byebug", "~> 11.1"
12
- gem "rack-test", "~> 1.1"
13
- gem "rake", "~> 12.0"
14
- gem "rspec", "~> 3.8"
15
- gem "rubocop", "~> 1.25"
16
- gem "rubocop-mdsol", "~> 0.1"
17
- gem "rubocop-performance", "~> 1.13"
18
- gem "simplecov", "~> 0.16"
19
- gem "timecop", "~> 0.9"
20
- gem "webmock", "~> 3.0"
21
- end
22
-
23
- gemspec path: "../"