isaca 1.0.2 → 1.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
  SHA1:
3
- metadata.gz: 97fea509339683c9463f68ff393cebab556f42f2
4
- data.tar.gz: a647ea10cca6adac49c6cb48a2a4adb5c8e71efd
3
+ metadata.gz: 5731ab5c9f6520fdd6f707e6494742a012ca5cb9
4
+ data.tar.gz: 007ca4c7926f16168ce0c722e34f03e27766de90
5
5
  SHA512:
6
- metadata.gz: 8fd1bbbf340e1dac3b8a17f0e5b821b131e9e113fdb65d33019953be4fcd47bd44c63444e6c5f741c465e3b4ebcf675965aed37604c4ca69fc6c7e72b8ddabaa
7
- data.tar.gz: 4c7803105f8b2760a6777bfe3eb50b88c96516ea77b9d60c2a957169b3646eed2b41516eb077885701e2c7c09a5a1006f232c9fc90aeb79ec8b89da456e1ccb9
6
+ metadata.gz: baad6f6779e27c7452349d938023ae012a7b8015c62584866c824f42250cb81e0e45cf35f952d3ae07dbfc85e852080acf8ccd90b923cc32f076258c2a9fa424
7
+ data.tar.gz: e5a0df3b4085533b375d268cee2f8d04e99dc00fe3150a933ccfc9addcfc58c107580c70bc34c52e7e15bd2411c7e458265bb830b7b4302b4a606bb0f9e8316b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- isaca (1.0.1)
4
+ isaca (1.0.2)
5
5
  faraday (~> 0.14.0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -24,22 +24,22 @@ Refer to the full documentation on how to use this library. Consider the followi
24
24
 
25
25
  ```ruby
26
26
  # Log the user in and get back a session token
27
- session = ISACA::Request::AuthenticateUser.get('username', 'password')
27
+ session = Isaca::Request::AuthenticateUser.get('username', 'password')
28
28
 
29
29
  # Get user information of the current user
30
- user = ISACA::Request::GetUserDetailsByToken.get(session.value)
30
+ user = Isaca::Request::GetUserDetailsByToken.get(session.value)
31
31
 
32
32
  # Destroy a user session
33
- ISACA::Request::LogOut.get(session.value)
33
+ Isaca::Request::LogOut.get(session.value)
34
34
  ```
35
35
 
36
36
  ## Configuration
37
37
 
38
- Configuration of this library is fairly easy -- you just need to use the `ISACA.configure` block. Consider the following
38
+ Configuration of this library is fairly easy -- you just need to use the `Isaca.configure` block. Consider the following
39
39
  example:
40
40
 
41
41
  ```ruby
42
- ISACA.configure do |config|
42
+ Isaca.configure do |config|
43
43
  config.url = 'https://partnerapi.isaca.org:8443/ISACAServices/Service1.svc'
44
44
  config.secret_pass = '1234567890ABCDEFGHI'
45
45
  config.user_agent = 'my_application'
@@ -49,7 +49,7 @@ end
49
49
 
50
50
  ## Rails Integration
51
51
 
52
- For Ruby on Rails applications, consider the `isaca-rails` engine which utilizes this library. `ISACA::Rails` is intended
52
+ For Ruby on Rails applications, consider the `isaca-rails` engine which utilizes this library. `Isaca::Rails` is intended
53
53
  to give you a jump start on your ISACA integrated Rails applications.
54
54
 
55
55
  ## Contributing
data/isaca.gemspec CHANGED
@@ -5,7 +5,7 @@ require "isaca/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "isaca"
8
- spec.version = ISACA::VERSION
8
+ spec.version = Isaca::VERSION
9
9
  spec.authors = ["Matt Orahood"]
10
10
  spec.email = ["morahood@gmail.com"]
11
11
 
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  class AttributeError < ServiceError
3
3
  def initialize(attribute, klass, hash)
4
4
  super("Missing required attribute #{attribute.to_s} for #{klass}. Hash keys: #{hash.keys}")
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  class ConfigurationError < StandardError
3
3
  end
4
4
  end
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  class ConnectionError < ServiceError
3
3
  end
4
4
  end
data/lib/isaca/helpers.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'date'
2
2
  require 'json'
3
3
 
4
- module ISACA
4
+ module Isaca
5
5
  # A series of helper methods for parsing the way ISACA sends some data.
6
6
  module Helpers
7
7
  # ISACA seems to use the default format to pass datetimes. This method exists so you don't have to remember
@@ -1,6 +1,6 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Model
3
- # Class that is used as an object representation of the response from {ISACA::Request::AuthenticateUser}.
3
+ # Class that is used as an object representation of the response from {Isaca::Request::AuthenticateUser}.
4
4
  class AuthenticateUser
5
5
  attr_reader :error
6
6
  # @!attribute error
@@ -1,6 +1,6 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Model
3
- # Class that is used as an object representation of the response from {ISACA::Request::Countries} and {ISACA::Request::ExplicitCountries}.
3
+ # Class that is used as an object representation of the response from {Isaca::Request::Countries} and {Isaca::Request::ExplicitCountries}.
4
4
  class Countries
5
5
  attr_reader :countries
6
6
  # @!attribute countries
@@ -1,6 +1,6 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Model
3
- # Class is used as an object representation of the response from {ISACA::Request::GetUserByID}.
3
+ # Class is used as an object representation of the response from {Isaca::Request::GetUserByID}.
4
4
  class GetUserByID
5
5
  attr_reader :active_member
6
6
  # @!attribute active_member
@@ -24,9 +24,9 @@ module ISACA
24
24
  # @option params [String] :MemberType
25
25
  # @option params [String] :iMISID
26
26
  def initialize(params)
27
- @active_member = ISACA::Helpers.parse_boolean(params[:ActiveMember])
28
- @expiration_date = ISACA::Helpers.strptime(params[:ExpirationDate])
29
- @member_type = ISACA::Helpers.normalize_member_type(params[:MemberType])
27
+ @active_member = Isaca::Helpers.parse_boolean(params[:ActiveMember])
28
+ @expiration_date = Isaca::Helpers.strptime(params[:ExpirationDate])
29
+ @member_type = Isaca::Helpers.normalize_member_type(params[:MemberType])
30
30
 
31
31
  if params[:iMISID].to_s.strip.empty?
32
32
  raise ServiceError.new('User with given IMIS ID not found')
@@ -1,7 +1,7 @@
1
1
  # An object representation of the GetUserDetailsByToken endpoint
2
- module ISACA
2
+ module Isaca
3
3
  module Model
4
- # Class is used as an object representation of the response from {ISACA::Request::GetUserDetailsByToken}.
4
+ # Class is used as an object representation of the response from {Isaca::Request::GetUserDetailsByToken}.
5
5
  class GetUserDetailsByToken
6
6
  attr_reader :imis_id
7
7
  # @!attribute imis_id
@@ -50,7 +50,7 @@ module ISACA
50
50
  # @option params [String] :PRIVACY
51
51
  # @option params [String] :MARKETING
52
52
  #
53
- # @raise [ISACA::ServiceError] Raises error if IMIS ID is not present.
53
+ # @raise [Isaca::ServiceError] Raises error if IMIS ID is not present.
54
54
  def initialize(params)
55
55
  if params[:ID].to_s.strip.empty?
56
56
  raise ServiceError.new('User with given IMIS ID not found')
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  class PartnerKeyError < ServiceError
3
3
  end
4
4
  end
@@ -1,16 +1,16 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Request
3
3
  # Class used to create user sessions.
4
4
  class AuthenticateUser
5
5
  # Method used to generate a session token.
6
6
  #
7
- # @raise [ISACA::SessionError] Raised if the returned session is invalid.
7
+ # @raise [Isaca::SessionError] Raised if the returned session is invalid.
8
8
  #
9
- # @return [ISACA::Model::AuthenticateUser] An object representation of the response.
9
+ # @return [Isaca::Model::AuthenticateUser] An object representation of the response.
10
10
  def self.get(username, password)
11
11
  response = self.send_request(username, password)
12
12
 
13
- model = ISACA::Model::AuthenticateUser.new(JSON.parse(response.body, {symbolize_names: true}))
13
+ model = Isaca::Model::AuthenticateUser.new(JSON.parse(response.body, {symbolize_names: true}))
14
14
  raise SessionError.new(model.value) unless model.is_valid?
15
15
 
16
16
  model
@@ -24,7 +24,7 @@ module ISACA
24
24
  #
25
25
  # @return [Faraday::Response]
26
26
  def self.send_request(username, password)
27
- ISACA::Request.get do |request|
27
+ Isaca::Request.get do |request|
28
28
  request.path = request.path + '/AuthenticateUser'
29
29
  request.params['username'] = username
30
30
  request.params['password'] = password
@@ -1,13 +1,13 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Request
3
3
  # Class used to fetch countries recognized by ISACA.
4
4
  module Countries
5
5
  # Method used to fetch all countries.
6
6
  #
7
- # @return [ISACA::Model::Countries] An object representation of the response.
7
+ # @return [Isaca::Model::Countries] An object representation of the response.
8
8
  def self.get
9
9
  response = self.send_request
10
- ISACA::Model::Countries.new(JSON.parse(response.body, symbolize_names: true))
10
+ Isaca::Model::Countries.new(JSON.parse(response.body, symbolize_names: true))
11
11
  end
12
12
 
13
13
  private
@@ -16,8 +16,8 @@ module ISACA
16
16
  #
17
17
  # @return [Faraday::Response]
18
18
  def self.send_request
19
- ISACA::Request.get do |request|
20
- uri = URI(ISACA.configuration.url)
19
+ Isaca::Request.get do |request|
20
+ uri = URI(Isaca.configuration.url)
21
21
  request.path = "#{uri.scheme}://#{uri.hostname}:#{uri.port}/isacaservices/countries.json"
22
22
  end
23
23
  end
@@ -1,14 +1,14 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Request
3
3
  # Class used to fetch the explicit countries recognized by ISACA. Explicit countries are countries that require
4
4
  # consent for marketing.
5
5
  module ExplicitCountries
6
6
  # Method used to fetch all of the ExplicitCountries.
7
7
  #
8
- # @return [ISACA::Model::Countries] An object representation of the response.
8
+ # @return [Isaca::Model::Countries] An object representation of the response.
9
9
  def self.get
10
10
  response = self.send_request
11
- ISACA::Model::Countries.new(JSON.parse(response.body, symbolize_names: true))
11
+ Isaca::Model::Countries.new(JSON.parse(response.body, symbolize_names: true))
12
12
  end
13
13
 
14
14
  private
@@ -17,8 +17,8 @@ module ISACA
17
17
  #
18
18
  # @return [Faraday::Response]
19
19
  def self.send_request
20
- ISACA::Request.get do |request|
21
- uri = URI(ISACA.configuration.url)
20
+ Isaca::Request.get do |request|
21
+ uri = URI(Isaca.configuration.url)
22
22
  request.path = "#{uri.scheme}://#{uri.hostname}:#{uri.port}/isacaservices/explicitcountries.json"
23
23
  end
24
24
  end
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Request
3
3
  # Class used to fetch an ISACA user by their IMIS ID.
4
4
  module GetUserByID
@@ -6,10 +6,10 @@ module ISACA
6
6
  #
7
7
  # @param [String] id The IMIS ID of the requested user.
8
8
  #
9
- # @return [ISACA::Model::GetUserByID] An object representation of the response.
9
+ # @return [Isaca::Model::GetUserByID] An object representation of the response.
10
10
  def self.get(id)
11
11
  response = self.send_request(id)
12
- ISACA::Model::GetUserByID.new(JSON.parse(response.body, symbolize_names: true))
12
+ Isaca::Model::GetUserByID.new(JSON.parse(response.body, symbolize_names: true))
13
13
  end
14
14
 
15
15
  private
@@ -20,7 +20,7 @@ module ISACA
20
20
  #
21
21
  # @return [Faraday::Response]
22
22
  def self.send_request(id)
23
- ISACA::Request.get do |request|
23
+ Isaca::Request.get do |request|
24
24
  request.path = request.path + '/GetUserByID'
25
25
  request.params['ID'] = id
26
26
  end
@@ -1,18 +1,18 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Request
3
3
  class GetUserDetailsByToken
4
4
  # Method used to get user information by token
5
5
  #
6
6
  # @param token [String] The user's session token
7
7
  #
8
- # @raise [ISACA::AttributeError] Raised if the returned IMIS ID is nil or the ID key is missing
8
+ # @raise [Isaca::AttributeError] Raised if the returned IMIS ID is nil or the ID key is missing
9
9
  #
10
- # @return [ISACA::Model::GetUserDetailsByToken] An object representation of the response
10
+ # @return [Isaca::Model::GetUserDetailsByToken] An object representation of the response
11
11
  def self.get(token)
12
12
  response = self.send_request(token)
13
13
 
14
14
  data = JSON.parse(JSON.parse(response.body, quirks_mode: true), {symbolize_names: true})
15
- ISACA::Model::GetUserDetailsByToken.new(data)
15
+ Isaca::Model::GetUserDetailsByToken.new(data)
16
16
  end
17
17
 
18
18
  private
@@ -22,7 +22,7 @@ module ISACA
22
22
  #
23
23
  # @return [Faraday::Response]
24
24
  def self.send_request(token)
25
- ISACA::Request.get do |request|
25
+ Isaca::Request.get do |request|
26
26
  request.path = request.path + '/GetUserDetailsByToken'
27
27
  request.params['token'] = token
28
28
  end
@@ -1,11 +1,11 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Request
3
3
  module LogOut
4
4
  # Method used to destroy a user session
5
5
  #
6
6
  # @param token [String] Session token to be destroyed
7
7
  #
8
- # @raise [ISACA::ServiceError] An error is raised if this ever fails. See [ISACA::Request]
8
+ # @raise [Isaca::ServiceError] An error is raised if this ever fails. See [Isaca::Request]
9
9
  #
10
10
  # @return [Faraday::Response] Returns a response object
11
11
  def self.get(token)
@@ -20,7 +20,7 @@ module ISACA
20
20
  #
21
21
  # @return [Faraday::Response] Returns a response object
22
22
  def self.send_request(token)
23
- ISACA::Request.get do |request|
23
+ Isaca::Request.get do |request|
24
24
  request.path = request.path + '/LogOut'
25
25
  request.params['token'] = token
26
26
  end
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  module Request
3
3
  module ReportConsent
4
4
  # Method used to report marketing consent and acceptance of the privacy policy. ISACA assumes that when you
@@ -28,7 +28,7 @@ module ISACA
28
28
  #
29
29
  # @return [Faraday::Response] Returns a response object
30
30
  def self.send_request(imis_id, options={})
31
- ISACA::Request.get do |request|
31
+ Isaca::Request.get do |request|
32
32
  request.path = request.path + '/ReportConsent'
33
33
  request.params['MarketingConsent'] = options[:marketing]
34
34
  request.params['iMISID'] = imis_id
@@ -1,24 +1,24 @@
1
1
  require 'faraday'
2
2
 
3
- module ISACA
3
+ module Isaca
4
4
  module Request
5
5
  # Generic GET request used to build REST calls
6
6
  #
7
- # @raise [ISACA::ServiceError] Raised because server returned a 400 response code. Bad request.
8
- # @raise [ISACA::PartnerKey] The partner has provided an invalid API Key.
9
- # @raise [ISACA::ServiceError] Raised because the server returned a 500 response code. Server error.
7
+ # @raise [Isaca::ServiceError] Raised because server returned a 400 response code. Bad request.
8
+ # @raise [Isaca::PartnerKey] The partner has provided an invalid API Key.
9
+ # @raise [Isaca::ServiceError] Raised because the server returned a 500 response code. Server error.
10
10
  #
11
11
  # @return [Faraday::Response] Returns a Faraday Response object
12
12
  def self.get # :yields: [Faraday::Request] Yields a request object.
13
- conn = Faraday.new(url: ISACA.configuration.url)
14
- conn.ssl.verify_mode = OpenSSL::SSL::VERIFY_NONE unless ISACA.configuration.verify_ssl
13
+ conn = Faraday.new(url: Isaca.configuration.url)
14
+ conn.ssl.verify_mode = OpenSSL::SSL::VERIFY_NONE unless Isaca.configuration.verify_ssl
15
15
 
16
16
  response = conn.get do |request|
17
17
  set_default_request_options(request)
18
18
  yield(request) if block_given?
19
19
  end
20
20
 
21
- ISACA.logger.debug("\n" + response.inspect + "\n") if ISACA.configuration.debug
21
+ Isaca.logger.debug("\n" + response.inspect + "\n") if Isaca.configuration.debug
22
22
  response.success? ? response : raise_response_error(response)
23
23
  end
24
24
 
@@ -26,7 +26,7 @@ module ISACA
26
26
 
27
27
  # Testing Request#get is difficult so this method was created for easier testing and stubbing
28
28
  #
29
- # @raise [ISACA::ServiceError] Raises a type of service error depending on status code
29
+ # @raise [Isaca::ServiceError] Raises a type of service error depending on status code
30
30
  #
31
31
  # @param response [Faraday::Response] Accepts a response object
32
32
  def self.raise_response_error(response)
@@ -48,11 +48,11 @@ module ISACA
48
48
  #
49
49
  # @param request [Faraday::Request] The request to which the headers are applied
50
50
  def self.set_default_request_options(request)
51
- uri = URI(ISACA.configuration.url)
51
+ uri = URI(Isaca.configuration.url)
52
52
  request.path = uri.path
53
53
  request.headers['Content-Type'] = 'application/json'
54
- request.headers['User-Agent'] = ISACA.configuration.user_agent
55
- request.params['secPass'] = ISACA.configuration.secret_pass
54
+ request.headers['User-Agent'] = Isaca.configuration.user_agent
55
+ request.params['secPass'] = Isaca.configuration.secret_pass
56
56
  end
57
57
  end
58
58
  end
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  class ServiceError < StandardError
3
3
  end
4
4
  end
@@ -1,4 +1,4 @@
1
- module ISACA
1
+ module Isaca
2
2
  class SessionError < ServiceError
3
3
  end
4
4
  end
data/lib/isaca/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module ISACA
2
- VERSION = "1.0.2"
1
+ module Isaca
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/isaca.rb CHANGED
@@ -31,11 +31,11 @@ require 'openssl'
31
31
  require 'logger'
32
32
 
33
33
  # Library intended to help ease the implementation of ISACA web services.
34
- module ISACA
34
+ module Isaca
35
35
  class << self
36
36
  attr_accessor :configuration
37
37
  # @!attribute configuration
38
- # @return [ISACA::Configuration] Object used to configure the library.
38
+ # @return [Isaca::Configuration] Object used to configure the library.
39
39
 
40
40
  attr_accessor :logger
41
41
  # @!attribute logger
@@ -43,14 +43,14 @@ module ISACA
43
43
 
44
44
  # Method used to fetch the configuration object.
45
45
  #
46
- # @return [ISACA::Configuration]
46
+ # @return [Isaca::Configuration]
47
47
  def configuration
48
48
  @configuration ||= Configuration.new
49
49
  end
50
50
 
51
51
  # Method used to reset the ISACA configuration. Primarily used for testing.
52
52
  #
53
- # @return [ISACA::Configuration]
53
+ # @return [Isaca::Configuration]
54
54
  def reset
55
55
  @configuration = Configuration.new
56
56
  end
@@ -69,10 +69,10 @@ module ISACA
69
69
 
70
70
  # Configuration block used to configure the library.
71
71
  #
72
- # @yield [ISACA::Configuration]
72
+ # @yield [Isaca::Configuration]
73
73
  #
74
74
  # @example An example configuration
75
- # ISACA.configure do |config|
75
+ # Isaca.configure do |config|
76
76
  # config.url = 'https://partnerapi.isaca.org:8443/ISACAServices/Service1.svc'
77
77
  # config.secret_pass = '1234567890ABCDEFGHI'
78
78
  # config.user_agent = 'my_application'
@@ -117,7 +117,7 @@ module ISACA
117
117
 
118
118
  # Returns the secret_pass attribute value
119
119
  #
120
- # @raise [ISACA::ConfigurationError] Raises if secret pass was not configured.
120
+ # @raise [Isaca::ConfigurationError] Raises if secret pass was not configured.
121
121
  #
122
122
  # @return [String]
123
123
  def secret_pass
@@ -125,7 +125,7 @@ module ISACA
125
125
  @secret_pass
126
126
  else
127
127
  msg = 'Missing SecretPass configuration. The ISACA Partners API requires an assigned SecretPass.'
128
- msg << ' Example: ISACA.configure {|config| config.secret_pass = "MyPass"}'
128
+ msg << ' Example: Isaca.configure {|config| config.secret_pass = "MyPass"}'
129
129
 
130
130
  raise ConfigurationError.new(msg)
131
131
  end
@@ -133,7 +133,7 @@ module ISACA
133
133
 
134
134
  # Returns the url attribute value
135
135
  #
136
- # @raise [ISACA::ConfigurationError] Raises if url was not configured.
136
+ # @raise [Isaca::ConfigurationError] Raises if url was not configured.
137
137
  #
138
138
  # @return [String]
139
139
  def url
@@ -141,7 +141,7 @@ module ISACA
141
141
  @url
142
142
  else
143
143
  msg = 'Missing URL configuration. The ISACA Partners API requires an endpoint URL.'
144
- msg << ' Example: ISACA.configure {|config| config.url = "https://partnerapi.isaca.org:8443/ISACAServices/Service1.svc"}'
144
+ msg << ' Example: Isaca.configure {|config| config.url = "https://partnerapi.isaca.org:8443/ISACAServices/Service1.svc"}'
145
145
 
146
146
  raise ConfigurationError.new(msg)
147
147
  end
@@ -149,7 +149,7 @@ module ISACA
149
149
 
150
150
  # Returns the user_agent attribute value
151
151
  #
152
- # @raise [ISACA::ConfigurationError] Raises if user agent was not configured.
152
+ # @raise [Isaca::ConfigurationError] Raises if user agent was not configured.
153
153
  #
154
154
  # @return [String]
155
155
  def user_agent
@@ -157,7 +157,7 @@ module ISACA
157
157
  @user_agent
158
158
  else
159
159
  msg = 'Missing User-Agent configuration. The ISACA Partners API requires a predefined User-Agent.'
160
- msg << ' Example: ISACA.configure {|config| config.user_agent = "MyApplication"}'
160
+ msg << ' Example: Isaca.configure {|config| config.user_agent = "MyApplication"}'
161
161
 
162
162
  raise ConfigurationError.new(msg)
163
163
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isaca
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Orahood
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-19 00:00:00.000000000 Z
11
+ date: 2018-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday