katinguele 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3a7b498b556a8424590d12b89c02c985ac20036b58fcc0d8ddc47e7fd1f92695
4
+ data.tar.gz: e948c99ede332cb2b4a87869a3b0206ff660b3038d3d7c1d3d250dadf1c91f08
5
+ SHA512:
6
+ metadata.gz: 063c0c04b98717d45b2dd7ac324942f215458638a99da5fc5e17b85869da8c51cc6ffc642635d8b8b4399f81f0908cf6d2367a5b53e91d69f7153875c850e872
7
+ data.tar.gz: '0686ee7f583eaba9f5f5cb4a848cf13faabaeb113a585b0edb542e584606d0caad750d8ba35b1b6ac8ee170be01f58883daa46d3cf0592bb674fae1c16973df7'
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2019 Linqueta
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # [Katinguele][gem_page]
2
+
3
+ [![Gem Version][gem_version_image]][gem_version_page]
4
+ [![Build Status][travis_status_image]][travis_page]
5
+ [![Maintainability][code_climate_maintainability_image]][code_climate_maintainability_page]
6
+ [![Test Coverage][code_climate_test_coverage_image]][code_climate_test_coverage_page]
7
+
8
+ The easiest HTTP client for Ruby
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'katinguele'
16
+ ```
17
+
18
+ ## Contributing
19
+
20
+ 1. Fork it
21
+ 2. Create your feature branch (git checkout -b my-new-feature)
22
+ 3. Commit your changes (git commit -am 'Add some feature')
23
+ 4. Push to the branch (git push origin my-new-feature)
24
+ 5. Create new Pull Request
25
+
26
+ ## License
27
+
28
+ The gem is available as open source under the terms of the [MIT License][mit_license_page].
29
+
30
+ [gem_page]: https://github.com/linqueta/katinguele
31
+ [code_of_conduct_page]: https://github.com/linqueta/katinguele/blob/master/CODE_OF_CONDUCT.md
32
+ [mit_license_page]: https://opensource.org/licenses/MIT
33
+ [contributor_convenant_page]: http://contributor-covenant.org
34
+ [travis_status_image]: https://travis-ci.org/linqueta/katinguele.svg?branch=master
35
+ [travis_page]: https://travis-ci.org/linqueta/katinguele
36
+ [code_climate_maintainability_image]: https://api.codeclimate.com/v1/badges/2b9a2174ac460c3f44ad/maintainability
37
+ [code_climate_maintainability_page]: https://codeclimate.com/github/linqueta/katinguele/maintainability
38
+ [code_climate_test_coverage_image]: https://api.codeclimate.com/v1/badges/2b9a2174ac460c3f44ad/test_coverage
39
+ [code_climate_test_coverage_page]: https://codeclimate.com/github/linqueta/katinguele/test_coverage
40
+ [gem_version_image]: https://badge.fury.io/rb/katinguele.svg
41
+ [gem_version_page]: https://rubygems.org/gems/katinguele
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/base'
4
+
5
+ module Katinguele
6
+ class InstallGenerator < Rails::Generators::Base
7
+ def create_initializer_file
8
+ create_file(
9
+ 'config/initializers/katinguele.rb',
10
+ <<~KATINGUELE_INITIALIZER_TEXT
11
+ # frozen_string_literal: true
12
+
13
+ Katinguele.configure do |config|
14
+ # You can add your service's configuration, like:
15
+
16
+ # config.add_service :external_service_1,
17
+ # raise_error: true,
18
+ # url: ENV['EXTERNAL_SERVICE_URL_1'],
19
+ # headers: { 'Content-Type' => 'application/json' }
20
+
21
+ # config.add_service :external_service_2,
22
+ # raise_error: false,
23
+ # url: ENV['EXTERNAL_SERVICE_URL_2'],
24
+ # headers: { 'Token' => "#Token {ENV['EXTERNAL_SERVICE_TOKEN']}"}
25
+
26
+ # All available options is on README
27
+ end
28
+ KATINGUELE_INITIALIZER_TEXT
29
+ )
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ module Client
5
+ class UnknwonService < StandardError; end
6
+
7
+ module Builder
8
+ def self.extended(base)
9
+ base.send(:build_katinguele_options)
10
+ base.katinguele_options
11
+ end
12
+
13
+ def katinguele_request_options(options)
14
+ build_katinguele_request_options(options)
15
+ end
16
+
17
+ def katinguele_service(name)
18
+ build_katinguele_service(name)
19
+ end
20
+
21
+ private
22
+
23
+ def build_katinguele_options
24
+ define_singleton_method(:katinguele_options) { @katinguele_options ||= {} }
25
+ end
26
+
27
+ def build_katinguele_request_options(options = {})
28
+ katinguele_options[:request_options] ||= options
29
+ build_katinguele_request
30
+ end
31
+
32
+ def build_katinguele_service(name = nil)
33
+ katinguele_options[:service_name] ||= name
34
+ build_katinguele_request
35
+ end
36
+
37
+ def build_katinguele_request
38
+ Katinguele.configuration
39
+ .find_service(katinguele_options[:service_name])
40
+ .then { |service| handle_unknown_service!(service) }
41
+ .then { |service| create_request(service) }
42
+ .then { |request| katinguele_options[:request] = request }
43
+ end
44
+
45
+ def handle_unknown_service!(service)
46
+ raise UnknwonService if !service && katinguele_options[:service_name]
47
+
48
+ service
49
+ end
50
+
51
+ def create_request(service)
52
+ Katinguele.configuration.request_by(service, katinguele_options[:request_options])
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'json'
5
+
6
+ module Katinguele
7
+ module Client
8
+ module Requester
9
+ METHODS = %i[get post patch put delete].freeze
10
+
11
+ def self.extended(base)
12
+ METHODS.each do |method|
13
+ base.send(
14
+ :define_singleton_method,
15
+ method,
16
+ ->(options = {}) { katinguele_client_request(options, method) }
17
+ )
18
+ end
19
+ end
20
+
21
+ def katinguele_client_request(options, method)
22
+ request = build_final_request(options, method)
23
+
24
+ build_faraday_client(request)
25
+ .then { |client| build_faraday_request(request, client, method) }
26
+ .then { |response| Katinguele::Response.new(response) }
27
+ .tap { |response| response.log if request.logger }
28
+ .tap { |response| request.after!(request, response, nil) }
29
+ rescue Faraday::Error => e
30
+ response = Katinguele::Response.new(e)
31
+ error = Katinguele::RequestErrorFactory.build(response)
32
+ error.log if request.logger
33
+ return response if rescue_faraday_error?(request, response, error)
34
+
35
+ raise error
36
+ end
37
+
38
+ def build_final_request(options, method)
39
+ Katinguele.configuration
40
+ .request_by(katinguele_options[:request], options)
41
+ .tap do |request|
42
+ request.before!(request)
43
+ request.method = method
44
+ request.log if request.logger
45
+ end
46
+ end
47
+
48
+ def rescue_faraday_error?(req, res, err)
49
+ req.after!(req, res, err) || (err.is_a?(Katinguele::TimeoutError) && !req.raise_error)
50
+ end
51
+
52
+ def build_faraday_request(req, client, method)
53
+ client.send(method) do |faraday_req|
54
+ faraday_req.body = req.payload.to_json if req.payload
55
+ end
56
+ end
57
+
58
+ def build_faraday_client(request)
59
+ Faraday.new(request.uri) do |config|
60
+ config.use(Faraday::Response::RaiseError) if request.raise_error
61
+ config.headers = request.headers if request.headers
62
+ config.options[:open_timeout] = request.open_timeout if request.open_timeout
63
+ config.options[:timeout] = request.timeout if request.timeout
64
+ config.adapter(Faraday.default_adapter)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'client/builder'
4
+ require_relative 'client/requester'
5
+
6
+ module Katinguele
7
+ module Client
8
+ def self.extended(base)
9
+ base.send(:extend, Builder)
10
+ base.send(:extend, Requester)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ class Configuration
5
+ attr_reader :services
6
+
7
+ def initialize
8
+ @services = {}
9
+ end
10
+
11
+ def add_service(name, options)
12
+ return unless name && options
13
+
14
+ @services[name] = Request.new(options)
15
+ end
16
+
17
+ def find_service(name)
18
+ @services[name]
19
+ end
20
+
21
+ def request_by(request, options)
22
+ return request.tap { request.setup!(options) } if request
23
+
24
+ Request.new(options) if options&.any?
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ class Error < StandardError
5
+ end
6
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ class RequestError < Error
5
+ attr_reader :response
6
+
7
+ def initialize(response)
8
+ @response = response
9
+ super(build_message)
10
+ end
11
+
12
+ def log
13
+ Katinguele::Logger.error(self)
14
+ end
15
+
16
+ private
17
+
18
+ def build_message
19
+ "CODE: #{@response.code} - BODY: #{@response.body.to_json}"
20
+ end
21
+ end
22
+
23
+ class BadRequestError < RequestError; end
24
+ class UnauthorizedError < RequestError; end
25
+ class ForbiddenError < RequestError; end
26
+ class ResourceNotFoundError < RequestError; end
27
+ class UnprocessableEntityError < RequestError; end
28
+ class ClientError < RequestError; end
29
+ class InternalServerError < RequestError; end
30
+ class ServiceUnavailableError < RequestError; end
31
+ class ServerError < RequestError; end
32
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ class RequiredFieldError < StandardError
5
+ attr_reader :origin, :field
6
+
7
+ def initialize(origin, field)
8
+ @origin = origin
9
+ @field = field
10
+ super(build_message)
11
+ end
12
+
13
+ private
14
+
15
+ def build_message
16
+ "The field #{@field} is required for #{@origin}"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ class TimeoutError < Error
5
+ attr_reader :response
6
+
7
+ def initialize(response)
8
+ @response = response
9
+ super(response.original)
10
+ end
11
+
12
+ def log
13
+ Katinguele::Logger.error(self)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'errors/error'
4
+ require_relative 'errors/timeout_error'
5
+ require_relative 'errors/required_field_error'
6
+ require_relative 'errors/request_error'
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ module Logger
5
+ module_function
6
+
7
+ def request(req, method)
8
+ p log("request: #{method} #{req.uri}")
9
+ p log("request: HEADERS: #{req.headers&.to_json}") if req.headers
10
+ p log("request: PAYLOAD: #{req.payload&.to_json}") if req.payload
11
+ nil
12
+ end
13
+
14
+ def response(res)
15
+ p log("response: SUCCESS: #{res.success?}")
16
+ p log("response: TIMEOUT: #{res.timeout?}")
17
+ p log("response: CODE: #{res.code}")
18
+ p log("response: BODY: #{res.body&.to_json}")
19
+ end
20
+
21
+ def error(err)
22
+ p log("error: #{err.class}")
23
+ p log("error: SUCCESS: #{err.response.success?}")
24
+ p log("error: TIMEOUT: #{err.response.timeout?}")
25
+ p log("error: CODE: #{err.response.code}")
26
+ p log("error: BODY: #{err.response.body&.to_json}")
27
+ end
28
+
29
+ def log(message)
30
+ "INFO -- #{message}"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ class Request
5
+ ACCESSORS = %i[
6
+ after
7
+ before
8
+ headers
9
+ logger
10
+ open_timeout
11
+ params
12
+ path
13
+ payload
14
+ protocol
15
+ raise_error
16
+ timeout
17
+ url
18
+ ].freeze
19
+
20
+ attr_accessor(*(ACCESSORS | %i[uri method]))
21
+
22
+ def initialize(options = {})
23
+ setup!(options)
24
+ end
25
+
26
+ def log
27
+ Katinguele::Logger.request(self, @method.to_s.upcase)
28
+ end
29
+
30
+ def setup!(options = {})
31
+ accessors!(options || {})
32
+ validate!
33
+ build_urn!
34
+ handle_query_params!
35
+ handle_urn_params!
36
+ end
37
+
38
+ def before!(*params)
39
+ hook!(:before, params)
40
+ end
41
+
42
+ def after!(*params)
43
+ hook!(:after, params)
44
+ end
45
+
46
+ private
47
+
48
+ def hook!(hook, params)
49
+ return unless send(hook)&.is_a?(Proc)
50
+
51
+ send(hook).call(*params[0..(send(hook).parameters.length - 1)])
52
+ end
53
+
54
+ def validate!
55
+ raise Katinguele::RequiredFieldError.new(self.class, :url) unless @url
56
+ end
57
+
58
+ def accessors!(params)
59
+ params.slice(*ACCESSORS)
60
+ .each { |k, v| instance_variable_set("@#{k}", v) }
61
+ end
62
+
63
+ def build_urn!
64
+ @uri = [@protocol, [@url, @path].compact.join('/')].compact.join('://')
65
+ end
66
+
67
+ def handle_urn_params!
68
+ return unless @params.is_a?(Hash)
69
+
70
+ @params.filter { |k, _v| @uri.include?(":#{k}") }
71
+ .each { |k, v| @uri.gsub!(":#{k}", v.to_s) }
72
+ .then { @uri.gsub!(/:[a-z_-]+/, '') }
73
+ end
74
+
75
+ def handle_query_params!
76
+ return unless @params.is_a?(Hash)
77
+
78
+ @params.reject { |k, _v| @uri.include?(":#{k}") }
79
+ .map { |k, v| "#{k}=#{v}" }
80
+ .then { |array| array.join('&') }
81
+ .then { |query| query unless query.empty? }
82
+ .then { |query| @uri = [@uri, query].compact.join('?') }
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ class RequestErrorFactory
5
+ class << self
6
+ def build(response)
7
+ return TimeoutError.new(response) if response.timeout?
8
+
9
+ find_by_code(response.code).new(response)
10
+ end
11
+
12
+ private
13
+
14
+ def find_by_code(code)
15
+ case code
16
+ when 400 then BadRequestError
17
+ when 401 then UnauthorizedError
18
+ when 403 then ForbiddenError
19
+ when 404 then ResourceNotFoundError
20
+ when 422 then UnprocessableEntityError
21
+ when 400..499 then ClientError
22
+ when 500 then InternalServerError
23
+ when 503 then ServiceUnavailableError
24
+ when 500..599 then ServerError
25
+ else
26
+ RequestError
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'faraday'
5
+
6
+ module Katinguele
7
+ class Response
8
+ attr_reader :original
9
+
10
+ def initialize(original)
11
+ @original = original
12
+ end
13
+
14
+ def body
15
+ return {} if timeout?
16
+
17
+ @body ||= parsed_body
18
+ end
19
+
20
+ def success?
21
+ return false if timeout?
22
+
23
+ @success ||= faraday_response? && @original&.success?
24
+ end
25
+
26
+ def code
27
+ return if timeout?
28
+
29
+ @code ||= faraday_response? ? @original.status : @original.response[:status]
30
+ end
31
+
32
+ def timeout?
33
+ @original.is_a?(Faraday::TimeoutError) ||
34
+ @original.is_a?(Net::ReadTimeout) ||
35
+ @original.is_a?(Faraday::ConnectionFailed)
36
+ end
37
+
38
+ def log
39
+ Katinguele::Logger.response(self)
40
+ end
41
+
42
+ private
43
+
44
+ def parsed_body
45
+ JSON.parse(faraday_response? ? @original.body : @original.response[:body], symbolize_names: true)
46
+ end
47
+
48
+ def faraday_response?
49
+ @original.is_a?(Faraday::Response)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katinguele
4
+ VERSION = '1.0.0'
5
+ end
data/lib/katinguele.rb ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'katinguele/version'
4
+ require 'katinguele/errors'
5
+ require 'katinguele/request'
6
+ require 'katinguele/response'
7
+ require 'katinguele/request_error_factory'
8
+ require 'katinguele/logger'
9
+ require 'katinguele/configuration'
10
+ require 'katinguele/client'
11
+
12
+ module Katinguele
13
+ class << self
14
+ def configure
15
+ yield(configuration)
16
+ end
17
+
18
+ def configuration
19
+ @configuration ||= Configuration.new
20
+ end
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,229 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: katinguele
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - linqueta
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.17.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.17.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: factory_bot
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 5.1.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 5.1.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 3.7.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 3.7.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 0.74.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 0.74.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop-performance
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 1.4.1
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: 1.4.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 0.17.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 0.17.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: simplecov-console
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 0.5.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.5.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: vcr
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: 5.0.0
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: 5.0.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: webmock
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: 3.7.6
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: 3.7.6
181
+ description: katinguele
182
+ email:
183
+ - lincolnrodrs@gmail.com
184
+ executables: []
185
+ extensions: []
186
+ extra_rdoc_files: []
187
+ files:
188
+ - MIT-LICENSE
189
+ - README.md
190
+ - lib/generators/katinguele/install_generator.rb
191
+ - lib/katinguele.rb
192
+ - lib/katinguele/client.rb
193
+ - lib/katinguele/client/builder.rb
194
+ - lib/katinguele/client/requester.rb
195
+ - lib/katinguele/configuration.rb
196
+ - lib/katinguele/errors.rb
197
+ - lib/katinguele/errors/error.rb
198
+ - lib/katinguele/errors/request_error.rb
199
+ - lib/katinguele/errors/required_field_error.rb
200
+ - lib/katinguele/errors/timeout_error.rb
201
+ - lib/katinguele/logger.rb
202
+ - lib/katinguele/request.rb
203
+ - lib/katinguele/request_error_factory.rb
204
+ - lib/katinguele/response.rb
205
+ - lib/katinguele/version.rb
206
+ homepage: https://github.com/linqueta/katinguele
207
+ licenses:
208
+ - MIT
209
+ metadata: {}
210
+ post_install_message:
211
+ rdoc_options: []
212
+ require_paths:
213
+ - lib
214
+ required_ruby_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '0'
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ requirements: []
225
+ rubygems_version: 3.0.3
226
+ signing_key:
227
+ specification_version: 4
228
+ summary: katinguele
229
+ test_files: []