mauth-client 7.0.0 → 7.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: "../"