pactas_itero 0.6.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +15 -0
  3. data/.rubocop.yml +765 -0
  4. data/CHANGELOG.md +34 -1
  5. data/Gemfile +3 -1
  6. data/README.md +3 -1
  7. data/Rakefile +7 -4
  8. data/lib/pactas_itero/api/contracts.rb +12 -0
  9. data/lib/pactas_itero/api/customers.rb +2 -0
  10. data/lib/pactas_itero/api/invoices.rb +3 -2
  11. data/lib/pactas_itero/api/oauth.rb +3 -2
  12. data/lib/pactas_itero/api/orders.rb +2 -0
  13. data/lib/pactas_itero/api/rated_items.rb +10 -1
  14. data/lib/pactas_itero/api.rb +9 -7
  15. data/lib/pactas_itero/client.rb +32 -26
  16. data/lib/pactas_itero/configurable.rb +9 -8
  17. data/lib/pactas_itero/default.rb +17 -18
  18. data/lib/pactas_itero/error.rb +45 -44
  19. data/lib/pactas_itero/ext/hash/camelize_keys.rb +12 -10
  20. data/lib/pactas_itero/response/raise_error.rb +5 -5
  21. data/lib/pactas_itero/version.rb +3 -1
  22. data/lib/pactas_itero.rb +5 -3
  23. metadata +16 -83
  24. data/Gemfile.lock +0 -92
  25. data/pactas_itero.gemspec +0 -37
  26. data/spec/fixtures/bearer_token.json +0 -5
  27. data/spec/fixtures/commit_order_response.json +0 -50
  28. data/spec/fixtures/contract.json +0 -46
  29. data/spec/fixtures/contract_cancellation_preview_response.json +0 -73
  30. data/spec/fixtures/contract_termination_response.json +0 -79
  31. data/spec/fixtures/contracts.json +0 -48
  32. data/spec/fixtures/create_order_response.json +0 -17
  33. data/spec/fixtures/create_rated_item.json +0 -8
  34. data/spec/fixtures/customer.json +0 -23
  35. data/spec/fixtures/customers.json +0 -40
  36. data/spec/fixtures/invoice.json +0 -22
  37. data/spec/fixtures/invoice_download.pdf +0 -0
  38. data/spec/fixtures/invoices.json +0 -46
  39. data/spec/fixtures/order.json +0 -15
  40. data/spec/fixtures/payment_transaction.json +0 -37
  41. data/spec/fixtures/rated_items.json +0 -12
  42. data/spec/fixtures/self_service_token.json +0 -6
  43. data/spec/pactas_itero/api/contracts_spec.rb +0 -165
  44. data/spec/pactas_itero/api/customers_spec.rb +0 -229
  45. data/spec/pactas_itero/api/invoices_spec.rb +0 -103
  46. data/spec/pactas_itero/api/oauth_spec.rb +0 -44
  47. data/spec/pactas_itero/api/orders_spec.rb +0 -102
  48. data/spec/pactas_itero/api/payment_transactions_spec.rb +0 -66
  49. data/spec/pactas_itero/api/rated_items_spec.rb +0 -113
  50. data/spec/pactas_itero/client_spec.rb +0 -316
  51. data/spec/pactas_itero_spec.rb +0 -39
  52. data/spec/spec_helper.rb +0 -100
data/CHANGELOG.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## [UNRELEASED]
2
- ### Added
3
2
 
3
+ ### Added
4
4
  ### Changed
5
5
 
6
6
  ### Deprecated
@@ -11,6 +11,39 @@
11
11
 
12
12
  ### Security
13
13
 
14
+ ## [0.8.0] - 2022-02-22
15
+
16
+ # What's Changed
17
+
18
+ ## Added
19
+
20
+ - Add Metered Usage call by @3wille in https://github.com/shipcloud/billwerk/pull/146
21
+
22
+ ## Changed
23
+
24
+ - Fix current Rubocop Issues by @mortik in https://github.com/shipcloud/billwerk/pull/111
25
+ - update ruby and introduce standardrb by @3wille in https://github.com/shipcloud/billwerk/pull/147
26
+
27
+ **Diff**: https://github.com/shipcloud/billwerk/compare/v0.7.0...v0.8.0
28
+
29
+ ## [0.7.0] - 2022-02-22
30
+
31
+ ### Added
32
+
33
+ - get contract_changes
34
+
35
+ ### Changed
36
+
37
+ - Set required ruby version to >= 2.6
38
+ - Replace Travis CI with CircleCI
39
+ - `rubocop` version is specified to be `~> 1.8.1`
40
+ - `performance` version is specified to be `~> 1.7.0`
41
+
42
+ ### Removed
43
+
44
+ - Drop support for Ruby <= 2.5
45
+ - Drop support for JRuby
46
+
14
47
  ## [0.6.0] - 2021-03-03
15
48
  ### Changed
16
49
  - `faraday_middleware` version is specified to be `>= 1.0.0`
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in pactas_itero.gemspec
4
6
  gemspec
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- [![Build Status](https://travis-ci.org/shipcloud/pactas_itero.svg)](https://travis-ci.org/shipcloud/pactas_itero)
1
+ [![CircleCI](https://circleci.com/gh/shipcloud/billwerk/tree/master.svg?style=svg)](https://circleci.com/gh/shipcloud/billwerk/tree/master)
2
+ [![Maintainability](https://api.codeclimate.com/v1/badges/cfbdd07da1f178c7fa9a/maintainability)](https://codeclimate.com/github/shipcloud/billwerk/maintainability)
3
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/cfbdd07da1f178c7fa9a/test_coverage)](https://codeclimate.com/github/shipcloud/billwerk/test_coverage)
2
4
 
3
5
  # PactasItero
4
6
 
data/Rakefile CHANGED
@@ -1,14 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec) do |spec|
5
- spec.pattern = FileList['spec/**/*_spec.rb']
7
+ spec.pattern = FileList["spec/**/*_spec.rb"]
6
8
  end
7
9
 
10
+ desc "start an irb console with pactas_itero required"
8
11
  task :console do
9
- require 'irb'
10
- require 'irb/completion'
11
- require 'pactas_itero'
12
+ require "irb"
13
+ require "irb/completion"
14
+ require "pactas_itero"
12
15
  ARGV.clear
13
16
  IRB.start
14
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PactasItero
2
4
  module Api
3
5
  module Contracts
@@ -6,6 +8,11 @@ module PactasItero
6
8
  get "api/v1/customers/#{customer_id}/contracts", options
7
9
  end
8
10
 
11
+ def contract_changes(contract_id, options = {})
12
+ options = options.camelize_keys
13
+ get "api/v1/contractChanges", options.merge(contractId: contract_id)
14
+ end
15
+
9
16
  def contracts(options = {})
10
17
  options = options.camelize_keys
11
18
  get "api/v1/contracts", options
@@ -35,6 +42,11 @@ module PactasItero
35
42
  options = options.camelize_keys
36
43
  post "api/v1/contracts/#{contract_id}/end", options
37
44
  end
45
+
46
+ def contract_metered_usage(contract_id, options = {})
47
+ options = options.camelize_keys
48
+ post "api/v1/contracts/#{contract_id}/usage", options
49
+ end
38
50
  end
39
51
  end
40
52
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PactasItero
2
4
  module Api
3
5
  module Customers
@@ -1,13 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PactasItero
2
4
  module Api
3
5
  module Invoices
4
-
5
6
  def invoices(options = {})
6
7
  options = options.camelize_keys
7
8
  get "api/v1/invoices", options
8
9
  end
9
10
 
10
- def invoices_from(from_id=nil, options = {})
11
+ def invoices_from(from_id = nil, options = {})
11
12
  if from_id
12
13
  options = options.camelize_keys
13
14
  get "api/v1/invoices?from=#{from_id}", options
@@ -1,11 +1,12 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  module PactasItero
3
4
  module Api
4
5
  module OAuth
5
6
  def token(options = {})
6
7
  options[:bearer_token_request] = true
7
- options[:grant_type] ||= 'client_credentials'
8
- post '/oauth/token', options
8
+ options[:grant_type] ||= "client_credentials"
9
+ post "/oauth/token", options
9
10
  end
10
11
  end
11
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PactasItero
2
4
  module Api
3
5
  module Orders
@@ -1,7 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PactasItero
2
4
  module Api
3
5
  module RatedItems
4
- def create_rated_item(contract_id, quantity, description, price_per_unit, tax_policy_id, options = {})
6
+ def create_rated_item(
7
+ contract_id,
8
+ quantity,
9
+ description,
10
+ price_per_unit,
11
+ tax_policy_id,
12
+ options = {}
13
+ )
5
14
  options.merge!(
6
15
  quantity: quantity,
7
16
  description: description,
@@ -1,10 +1,12 @@
1
- require 'pactas_itero/ext/hash/camelize_keys'
2
- require 'pactas_itero/api/oauth'
3
- require 'pactas_itero/api/rated_items'
4
- require 'pactas_itero/api/customers'
5
- require 'pactas_itero/api/contracts'
6
- require 'pactas_itero/api/orders'
7
- require 'pactas_itero/api/invoices'
1
+ # frozen_string_literal: true
2
+
3
+ require "pactas_itero/ext/hash/camelize_keys"
4
+ require "pactas_itero/api/oauth"
5
+ require "pactas_itero/api/rated_items"
6
+ require "pactas_itero/api/customers"
7
+ require "pactas_itero/api/contracts"
8
+ require "pactas_itero/api/orders"
9
+ require "pactas_itero/api/invoices"
8
10
  require "pactas_itero/api/payment_transactions"
9
11
 
10
12
  module PactasItero
@@ -1,7 +1,9 @@
1
- require 'base64'
2
- require 'rash'
3
- require 'pactas_itero/configurable'
4
- require 'pactas_itero/api'
1
+ # frozen_string_literal: true
2
+
3
+ require "base64"
4
+ require "rash"
5
+ require "pactas_itero/configurable"
6
+ require "pactas_itero/api"
5
7
 
6
8
  module PactasItero
7
9
  class Client
@@ -12,7 +14,10 @@ module PactasItero
12
14
 
13
15
  def initialize(options = {})
14
16
  PactasItero::Configurable.keys.each do |key|
15
- instance_variable_set(:"@#{key}", options[key] || PactasItero.instance_variable_get(:"@#{key}"))
17
+ instance_variable_set(
18
+ :"@#{key}",
19
+ options[key] || PactasItero.instance_variable_get(:"@#{key}")
20
+ )
16
21
  end
17
22
  end
18
23
 
@@ -47,42 +52,42 @@ module PactasItero
47
52
  private
48
53
 
49
54
  def connection
50
- @connection ||= Faraday.new(api_endpoint, connection_options)
55
+ @_connection ||= Faraday.new(api_endpoint, connection_options)
51
56
  end
52
57
 
53
58
  def request(method, path, params = {})
54
59
  headers = params.delete(:headers) || {}
55
- if accept = params.delete(:accept)
60
+ if (accept = params.delete(:accept))
56
61
  headers[:accept] = accept
57
62
  end
58
63
 
59
64
  bearer_token_request = params.delete(:bearer_token_request)
60
65
 
61
66
  if bearer_token_request
62
- headers[:accept] = '*/*'
67
+ headers[:accept] = "*/*"
63
68
  headers[:authorization] = bearer_token_credentials_auth_header
64
- headers[:content_type] = 'application/x-www-form-urlencoded; charset=UTF-8'
69
+ headers[:content_type] = "application/x-www-form-urlencoded; charset=UTF-8"
65
70
  else
66
71
  headers[:authorization] = auth_header
67
72
  end
68
73
 
69
- response = connection.send(method.to_sym, path, params) {
70
- |request| request.headers.update(headers)
71
- }.env
74
+ response = connection.send(method.to_sym, path, params) do |request|
75
+ request.headers.update(headers)
76
+ end.env
72
77
  response.body
73
78
  end
74
79
 
75
80
  def connection_options
76
- @connection_options ||= {
77
- :builder => middleware,
78
- :headers => {
79
- :accept => default_media_type,
80
- :user_agent => user_agent,
81
- },
82
- :request => {
83
- :open_timeout => 10,
84
- :timeout => 30,
81
+ @_connection_options ||= {
82
+ builder: middleware,
83
+ headers: {
84
+ accept: default_media_type,
85
+ user_agent: user_agent
85
86
  },
87
+ request: {
88
+ open_timeout: 10,
89
+ timeout: 30
90
+ }
86
91
  }
87
92
  end
88
93
 
@@ -92,11 +97,12 @@ module PactasItero
92
97
  end
93
98
 
94
99
  def bearer_auth_header
95
- token = if bearer_token.respond_to?(:access_token)
96
- bearer_token.access_token
97
- else
98
- bearer_token
99
- end
100
+ token =
101
+ if bearer_token.respond_to?(:access_token)
102
+ bearer_token.access_token
103
+ else
104
+ bearer_token
105
+ end
100
106
  "Bearer #{token}"
101
107
  end
102
108
 
@@ -1,14 +1,15 @@
1
- module PactasItero
1
+ # frozen_string_literal: true
2
2
 
3
+ module PactasItero
3
4
  module Configurable
4
5
  attr_accessor :bearer_token, :client_id, :client_secret, :user_agent,
5
- :default_media_type, :middleware, :production
6
+ :default_media_type, :middleware, :production
6
7
  attr_writer :api_endpoint
7
- class << self
8
8
 
9
+ class << self
9
10
  # List of configurable keys for PactasItero::Client
10
11
  def keys
11
- @keys ||= [
12
+ @_keys ||= [
12
13
  :bearer_token,
13
14
  :api_endpoint,
14
15
  :client_id,
@@ -33,12 +34,12 @@ module PactasItero
33
34
  end
34
35
  self
35
36
  end
36
- alias setup reset!
37
+ alias_method :setup, :reset!
37
38
 
38
39
  def api_endpoint
39
40
  endpoint = @api_endpoint ||
40
- production && production_api_endpoint ||
41
- sandbox_api_endpoint
41
+ (production && production_api_endpoint) ||
42
+ sandbox_api_endpoint
42
43
  File.join(endpoint, "")
43
44
  end
44
45
 
@@ -53,7 +54,7 @@ module PactasItero
53
54
  private
54
55
 
55
56
  def options
56
- Hash[PactasItero::Configurable.keys.map{|key| [key, send(:"#{key}")]}]
57
+ PactasItero::Configurable.keys.to_h { |key| [key, send(:"#{key}")] }
57
58
  end
58
59
  end
59
60
  end
@@ -1,40 +1,39 @@
1
- require 'pactas_itero/response/raise_error'
2
- require 'pactas_itero/version'
3
- require 'faraday_middleware'
1
+ # frozen_string_literal: true
4
2
 
5
- module PactasItero
3
+ require "pactas_itero/response/raise_error"
4
+ require "pactas_itero/version"
5
+ require "faraday_middleware"
6
6
 
7
+ module PactasItero
7
8
  # Default configuration options for {Client}
8
9
  module Default
10
+ SANDBOX_API_ENDPOINT = "https://sandbox.billwerk.com"
9
11
 
10
- SANDBOX_API_ENDPOINT = "https://sandbox.billwerk.com".freeze
11
-
12
- PRODUCTION_API_ENDPOINT = "https://app.billwerk.com".freeze
12
+ PRODUCTION_API_ENDPOINT = "https://app.billwerk.com"
13
13
 
14
14
  PRODUCTION = false
15
15
 
16
- USER_AGENT = "Pactas.Itero Ruby Gem #{PactasItero::VERSION}".freeze
16
+ USER_AGENT = "Pactas.Itero Ruby Gem #{PactasItero::VERSION}"
17
17
 
18
- MEDIA_TYPE = "application/json"
18
+ MEDIA_TYPE = "application/json"
19
19
 
20
20
  MIDDLEWARE = Faraday::RackBuilder.new do |builder|
21
21
  builder.request :json
22
22
  builder.use PactasItero::Response::RaiseError
23
23
  builder.response :rashify
24
24
  builder.request :url_encoded
25
- builder.response :json, :content_type => /\bjson$/
25
+ builder.response :json, content_type: /\bjson$/
26
26
 
27
27
  builder.adapter Faraday.default_adapter
28
28
  end
29
29
 
30
30
  class << self
31
-
32
31
  def options
33
- Hash[PactasItero::Configurable.keys.map{|key| [key, send(key)]}]
32
+ PactasItero::Configurable.keys.to_h { |key| [key, send(key)] }
34
33
  end
35
34
 
36
35
  def api_endpoint
37
- ENV['PACTAS_ITERO_ENDPOINT']
36
+ ENV["PACTAS_ITERO_ENDPOINT"]
38
37
  end
39
38
 
40
39
  def sandbox_api_endpoint
@@ -50,19 +49,19 @@ module PactasItero
50
49
  end
51
50
 
52
51
  def client_id
53
- ENV['PACTAS_ITERO_CLIENT_ID']
52
+ ENV["PACTAS_ITERO_CLIENT_ID"]
54
53
  end
55
54
 
56
55
  def client_secret
57
- ENV['PACTAS_ITERO_CLIENT_SECRET']
56
+ ENV["PACTAS_ITERO_CLIENT_SECRET"]
58
57
  end
59
58
 
60
59
  def bearer_token
61
- ENV['PACTAS_ITERO_BEARER_TOKEN']
60
+ ENV["PACTAS_ITERO_BEARER_TOKEN"]
62
61
  end
63
62
 
64
63
  def default_media_type
65
- ENV['PACTAS_ITERO_CLIENT_DEFAULT_MEDIA_TYPE'] || MEDIA_TYPE
64
+ ENV["PACTAS_ITERO_CLIENT_DEFAULT_MEDIA_TYPE"] || MEDIA_TYPE
66
65
  end
67
66
 
68
67
  def middleware
@@ -70,7 +69,7 @@ module PactasItero
70
69
  end
71
70
 
72
71
  def user_agent
73
- ENV['PACTAS_ITERO_USER_AGENT'] || USER_AGENT
72
+ ENV["PACTAS_ITERO_USER_AGENT"] || USER_AGENT
74
73
  end
75
74
  end
76
75
  end
@@ -1,45 +1,45 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PactasItero
2
4
  # Custom error class for rescuing from all Pactas errors
3
5
  class Error < StandardError
4
-
5
6
  # Returns the appropriate PactasItero::Error sublcass based
6
7
  # on status and response message
7
8
  #
8
9
  # @param [Hash] response HTTP response
9
10
  # @return [PactasItero::Error]
10
11
  def self.from_response(response)
11
- status = response[:status].to_i
12
- body = response[:body].to_s
12
+ status = response[:status].to_i
13
+ body = response[:body].to_s
13
14
  headers = response[:response_headers]
14
15
 
15
- if klass = case status
16
- when 400 then PactasItero::BadRequest
17
- when 401 then error_for_401(headers)
18
- when 403 then error_for_403(body)
19
- when 404 then PactasItero::NotFound
20
- when 406 then PactasItero::NotAcceptable
21
- when 409 then PactasItero::Conflict
22
- when 415 then PactasItero::UnsupportedMediaType
23
- when 422 then PactasItero::UnprocessableEntity
24
- when 400..499 then PactasItero::ClientError
25
- when 500 then PactasItero::InternalServerError
26
- when 501 then PactasItero::NotImplemented
27
- when 502 then PactasItero::BadGateway
28
- when 503 then PactasItero::ServiceUnavailable
29
- when 500..599 then PactasItero::ServerError
30
- end
31
- klass.new(response)
16
+ klass = case status
17
+ when 400 then PactasItero::BadRequest
18
+ when 401 then error_for401(headers)
19
+ when 403 then error_for403(body)
20
+ when 404 then PactasItero::NotFound
21
+ when 406 then PactasItero::NotAcceptable
22
+ when 409 then PactasItero::Conflict
23
+ when 415 then PactasItero::UnsupportedMediaType
24
+ when 422 then PactasItero::UnprocessableEntity
25
+ when 400..499 then PactasItero::ClientError
26
+ when 500 then PactasItero::InternalServerError
27
+ when 501 then PactasItero::NotImplemented
28
+ when 502 then PactasItero::BadGateway
29
+ when 503 then PactasItero::ServiceUnavailable
30
+ when 500..599 then PactasItero::ServerError
32
31
  end
32
+ klass&.new(response)
33
33
  end
34
34
 
35
- def initialize(response=nil)
35
+ def initialize(response = nil)
36
36
  @response = response
37
37
  super(build_error_message)
38
38
  end
39
39
 
40
40
  # Returns most appropriate error for 401 HTTP status code
41
41
  # @private
42
- def self.error_for_401(headers)
42
+ def self.error_for401(headers)
43
43
  if PactasItero::OneTimePasswordRequired.required_header(headers)
44
44
  PactasItero::OneTimePasswordRequired
45
45
  else
@@ -49,10 +49,11 @@ module PactasItero
49
49
 
50
50
  # Returns most appropriate error for 403 HTTP status code
51
51
  # @private
52
- def self.error_for_403(body)
53
- if body =~ /rate limit exceeded/i
52
+ def self.error_for403(body)
53
+ case body
54
+ when /rate limit exceeded/i
54
55
  PactasItero::TooManyRequests
55
- elsif body =~ /login attempts exceeded/i
56
+ when /login attempts exceeded/i
56
57
  PactasItero::TooManyLoginAttempts
57
58
  else
58
59
  PactasItero::Forbidden
@@ -62,7 +63,7 @@ module PactasItero
62
63
  # Array of validation errors
63
64
  # @return [Array<Hash>] Error info
64
65
  def errors
65
- if data && data.is_a?(Hash)
66
+ if data.is_a?(Hash)
66
67
  data[:errors] || []
67
68
  else
68
69
  []
@@ -72,18 +73,16 @@ module PactasItero
72
73
  private
73
74
 
74
75
  def data
75
- @data ||=
76
+ @_data ||=
76
77
  if (body = @response[:body]) && !body.empty?
77
78
  if body.is_a?(String) &&
78
- @response[:response_headers] &&
79
- @response[:response_headers][:content_type] =~ /json/
79
+ @response[:response_headers] &&
80
+ @response[:response_headers][:content_type].include?("json")
80
81
 
81
82
  Sawyer::Agent.serializer.decode(body)
82
83
  else
83
84
  body
84
85
  end
85
- else
86
- nil
87
86
  end
88
87
  end
89
88
 
@@ -105,7 +104,7 @@ module PactasItero
105
104
 
106
105
  summary = "\nError summary:\n"
107
106
  summary << data[:errors].map do |hash|
108
- hash.map { |k,v| " #{k}: #{v}" }
107
+ hash.map { |k, v| " #{k}: #{v}" }
109
108
  end.join("\n")
110
109
 
111
110
  summary
@@ -114,19 +113,21 @@ module PactasItero
114
113
  def build_error_message
115
114
  return nil if @response.nil?
116
115
 
117
- message = "#{@response[:method].to_s.upcase} "
118
- message << redact_url(@response[:url].to_s) + ": "
119
- message << "#{@response[:status]} - "
120
- message << "#{response_message}" unless response_message.nil?
121
- message << "#{response_error}" unless response_error.nil?
122
- message << "#{response_error_summary}" unless response_error_summary.nil?
123
- message
116
+ [
117
+ "#{@response[:method].to_s.upcase} ",
118
+ "#{redact_url(@response[:url].to_s)}: ",
119
+ "#{@response[:status]} - ",
120
+ (response_message.to_s unless response_message.nil?),
121
+ (response_error.to_s unless response_error.nil?),
122
+ (response_error_summary.to_s unless response_error_summary.nil?)
123
+ ].compact.join
124
124
  end
125
125
 
126
126
  def redact_url(url_string)
127
127
  %w[client_secret access_token].each do |token|
128
128
  url_string.gsub!(/#{token}=\S+/, "#{token}=(redacted)") if url_string.include? token
129
129
  end
130
+
130
131
  url_string
131
132
  end
132
133
  end
@@ -143,25 +144,25 @@ module PactasItero
143
144
  # Raised when Pactas returns a 401 HTTP status code
144
145
  # and headers include "X-Pactas-OTP"
145
146
  class OneTimePasswordRequired < ClientError
146
- #@private
147
+ # @private
147
148
  OTP_DELIVERY_PATTERN = /required; (\w+)/i
148
149
 
149
- #@private
150
+ # @private
150
151
  def self.required_header(headers)
151
- OTP_DELIVERY_PATTERN.match headers['X-Pactas-OTP'].to_s
152
+ OTP_DELIVERY_PATTERN.match headers["X-Pactas-OTP"].to_s
152
153
  end
153
154
 
154
155
  # Delivery method for the user's OTP
155
156
  #
156
157
  # @return [String]
157
158
  def password_delivery
158
- @password_delivery ||= delivery_method_from_header
159
+ @_password_delivery ||= delivery_method_from_header
159
160
  end
160
161
 
161
162
  private
162
163
 
163
164
  def delivery_method_from_header
164
- if match = self.class.required_header(@response[:response_headers])
165
+ if (match = self.class.required_header(@response[:response_headers]))
165
166
  match[1]
166
167
  end
167
168
  end
@@ -1,22 +1,24 @@
1
- class Hash
1
+ # frozen_string_literal: true
2
2
 
3
+ class Hash
3
4
  def camelize_keys(value = self)
4
5
  case value
5
- when Array
6
- value.map { |v| camelize_keys(v) }
7
- when Hash
8
- Hash[value.map { |k, v| [camelize_key(k), camelize_keys(v)] }]
9
- else
10
- value
6
+ when Array
7
+ value.map { |v| camelize_keys(v) }
8
+ when Hash
9
+ value.to_h { |k, v| [camelize_key(k), camelize_keys(v)] }
10
+ else
11
+ value
11
12
  end
12
13
  end
13
14
 
14
15
  private
15
16
 
16
17
  def camelize_key(key)
17
- if key.is_a? Symbol
18
+ case key
19
+ when Symbol
18
20
  camelize(key.to_s).to_sym
19
- elsif key.is_a? String
21
+ when String
20
22
  camelize(key)
21
23
  else
22
24
  key
@@ -27,6 +29,6 @@ class Hash
27
29
  def camelize(term)
28
30
  string = term.to_s
29
31
  string = string.sub(/^[a-z\d]*/) { $&.capitalize }
30
- string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
32
+ string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub("/", "::")
31
33
  end
32
34
  end