finapps 2.1.4 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -18
  3. data/.ruby-gemset +1 -1
  4. data/.travis.yml +5 -2
  5. data/README.md +1 -1
  6. data/finapps.gemspec +10 -12
  7. data/lib/finapps.rb +5 -21
  8. data/lib/finapps/rest/client.rb +42 -53
  9. data/lib/finapps/rest/institutions.rb +2 -2
  10. data/lib/finapps/rest/institutions_forms.rb +2 -2
  11. data/lib/finapps/rest/order_reports.rb +4 -4
  12. data/lib/finapps/rest/order_statuses.rb +2 -2
  13. data/lib/finapps/rest/order_tokens.rb +2 -3
  14. data/lib/finapps/rest/orders.rb +6 -6
  15. data/lib/finapps/rest/password_resets.rb +4 -4
  16. data/lib/finapps/rest/sessions.rb +2 -2
  17. data/lib/finapps/rest/user_institutions.rb +21 -26
  18. data/lib/finapps/rest/user_institutions_forms.rb +2 -2
  19. data/lib/finapps/rest/user_institutions_statuses.rb +2 -2
  20. data/lib/finapps/rest/users.rb +5 -5
  21. data/lib/finapps/rest/version.rb +1 -1
  22. data/lib/finapps/version.rb +1 -1
  23. data/spec/rest/client_spec.rb +4 -13
  24. data/spec/rest/institutions_forms_spec.rb +5 -2
  25. data/spec/rest/institutions_spec.rb +4 -2
  26. data/spec/rest/order_reports_spec.rb +4 -4
  27. data/spec/rest/order_statuses_spec.rb +3 -2
  28. data/spec/rest/order_tokens_spec.rb +3 -2
  29. data/spec/rest/orders_spec.rb +6 -5
  30. data/spec/rest/password_resets_spec.rb +4 -4
  31. data/spec/rest/sessions_spec.rb +2 -2
  32. data/spec/rest/user_institutions_forms_spec.rb +5 -2
  33. data/spec/rest/user_institutions_spec.rb +10 -9
  34. data/spec/rest/user_institutions_statuses_spec.rb +3 -2
  35. data/spec/rest/users_spec.rb +4 -4
  36. data/spec/rest/version_spec.rb +1 -1
  37. data/spec/spec_helper.rb +5 -3
  38. data/spec/spec_helpers/client.rb +1 -1
  39. metadata +49 -124
  40. data/lib/core_extensions/hash/compact.rb +0 -23
  41. data/lib/core_extensions/object/blank.rb +0 -69
  42. data/lib/core_extensions/object/is_integer.rb +0 -10
  43. data/lib/core_extensions/string/json_to_hash.rb +0 -10
  44. data/lib/finapps/error.rb +0 -17
  45. data/lib/finapps/middleware/middleware.rb +0 -22
  46. data/lib/finapps/middleware/request/accept_json.rb +0 -14
  47. data/lib/finapps/middleware/request/no_encoding_basic_authentication.rb +0 -21
  48. data/lib/finapps/middleware/request/tenant_authentication.rb +0 -20
  49. data/lib/finapps/middleware/request/user_agent.rb +0 -15
  50. data/lib/finapps/middleware/response/custom_logger.rb +0 -41
  51. data/lib/finapps/middleware/response/raise_error.rb +0 -46
  52. data/lib/finapps/rest/base_client.rb +0 -122
  53. data/lib/finapps/rest/configuration.rb +0 -31
  54. data/lib/finapps/rest/connection.rb +0 -35
  55. data/lib/finapps/rest/credentials.rb +0 -21
  56. data/lib/finapps/rest/defaults.rb +0 -80
  57. data/lib/finapps/rest/resources.rb +0 -64
  58. data/lib/finapps/utils/loggeable.rb +0 -14
  59. data/lib/finapps/utils/parameter_filter.rb +0 -32
  60. data/spec/core_extensions/hash/compact_spec.rb +0 -21
  61. data/spec/core_extensions/object/is_integer_spec.rb +0 -17
  62. data/spec/middleware/request/accept_json_spec.rb +0 -12
  63. data/spec/middleware/request/no_encoding_basic_authentication_spec.rb +0 -32
  64. data/spec/middleware/request/tenant_authentication_spec.rb +0 -34
  65. data/spec/middleware/request/user_agent_spec.rb +0 -12
  66. data/spec/middleware/response/raise_error_spec.rb +0 -24
  67. data/spec/rest/base_client_spec.rb +0 -120
  68. data/spec/rest/configuration_spec.rb +0 -39
  69. data/spec/rest/credentials_spec.rb +0 -20
  70. data/spec/rest/resources_spec.rb +0 -76
  71. data/spec/rest/timeout_spec.rb +0 -9
  72. data/spec/support/fixtures/relevance_ruleset_names.json +0 -47
  73. data/spec/utils/parameter_filter_spec.rb +0 -23
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- module ObjectExtensions
3
- refine Object do
4
- def integer?
5
- Integer(self)
6
- rescue
7
- false
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- module StringExtensions
3
- refine String do
4
- def json_to_hash
5
- ::JSON.parse(self)
6
- rescue ::JSON::ParserError
7
- # logger.error "##{__method__} => Unable to parse JSON response."
8
- end
9
- end
10
- end
data/lib/finapps/error.rb DELETED
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
- # Defines some errors to identify Exceptions within this gem
3
- module FinApps # :nodoc:
4
- # Base error class.
5
- class Error < StandardError; end
6
- # Raised for existing but invalid arguments.
7
- class InvalidArgumentsError < Error; end
8
- # Raised whenever a required argument is missing.
9
- class MissingArgumentsError < Error; end
10
-
11
- # Raised whenever there is a session timeout at the API.
12
- class ApiSessionTimeoutError < Error; end
13
-
14
- %i(InvalidArgumentsError MissingArgumentsError ApiSessionTimeoutError).each do |const|
15
- Error.const_set(const, FinApps.const_get(const))
16
- end
17
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'faraday' unless defined? Faraday
3
-
4
- module FinApps
5
- module Middleware
6
- autoload :AcceptJson, 'finapps/middleware/request/accept_json'
7
- autoload :UserAgent, 'finapps/middleware/request/user_agent'
8
- autoload :NoEncodingBasicAuthentication, 'finapps/middleware/request/no_encoding_basic_authentication'
9
- autoload :TenantAuthentication, 'finapps/middleware/request/tenant_authentication'
10
- autoload :CustomLogger, 'finapps/middleware/response/custom_logger'
11
-
12
- if Faraday::Middleware.respond_to? :register_middleware
13
- Faraday::Request.register_middleware \
14
- accept_json: -> { AcceptJson },
15
- user_agent: -> { UserAgent },
16
- no_encoding_basic_authentication: -> { NoEncodingBasicAuthentication },
17
- tenant_authentication: -> { TenantAuthentication }
18
- Faraday::Response.register_middleware \
19
- custom_logger: -> { CustomLogger }
20
- end
21
- end
22
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module Middleware
4
- # This middleware sets the Accept request-header field to specify JSON as acceptable media type for the response.
5
- class AcceptJson < Faraday::Middleware
6
- KEY = 'Accept' unless defined? KEY
7
-
8
- def call(env)
9
- env[:request_headers][KEY] = 'application/json'
10
- @app.call(env)
11
- end
12
- end
13
- end
14
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module Middleware
4
- # Adds a custom header for basic authorization.
5
- # If the value for this header already exists, it is not overriden.
6
- class NoEncodingBasicAuthentication < Faraday::Middleware
7
- KEY = 'Authorization' unless defined? KEY
8
-
9
- def initialize(app, token)
10
- super(app)
11
- sanitized = token.to_s.strip.delete("\n")
12
- @header_value = "Basic #{sanitized}"
13
- end
14
-
15
- def call(env)
16
- env[:request_headers][KEY] ||= @header_value
17
- @app.call(env)
18
- end
19
- end
20
- end
21
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module Middleware
4
- # Adds a custom header for tenant level authorization.
5
- # If the value for this header already exists, it is not overriden.
6
- class TenantAuthentication < Faraday::Middleware
7
- KEY = 'X-FinApps-Token' unless defined? KEY
8
-
9
- def initialize(app, identifier, token)
10
- super(app)
11
- @header_value = "#{identifier.to_s.strip}=#{token.to_s.strip}"
12
- end
13
-
14
- def call(env)
15
- env[:request_headers][KEY] ||= @header_value
16
- @app.call(env)
17
- end
18
- end
19
- end
20
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module Middleware
4
- # This middleware sets the User-Agent request-header field to identify thei client.
5
- class UserAgent < Faraday::Middleware
6
- KEY = 'User-Agent' unless defined? KEY
7
- RUBY = "#{RUBY_ENGINE}/#{RUBY_PLATFORM} #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
8
-
9
- def call(env)
10
- env[:request_headers][KEY] = "finapps-ruby/#{FinApps::VERSION} (#{RUBY})"
11
- @app.call(env)
12
- end
13
- end
14
- end
15
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module Middleware
4
- class CustomLogger < Faraday::Response::Middleware
5
- extend Forwardable
6
- include FinApps::Utils::ParameterFilter
7
-
8
- DEFAULT_OPTIONS = {bodies: false}.freeze
9
-
10
- def initialize(app, logger=nil, options={})
11
- super(app)
12
- @logger = logger || begin
13
- require 'logger'
14
- ::Logger.new(STDOUT)
15
- end
16
- @options = DEFAULT_OPTIONS.merge(options)
17
- end
18
-
19
- def_delegators :@logger, :debug, :info, :warn, :error, :fatal
20
-
21
- def call(env)
22
- debug "#{self.class.name}##{__method__} => URL: #{env.method.upcase} #{env.url}"
23
- debug "#{self.class.name}##{__method__} => Request Headers: #{dump env.request_headers}"
24
-
25
- super
26
- end
27
-
28
- def on_complete(env)
29
- debug "#{self.class.name}##{__method__} => URL: #{env.method.upcase} #{env.url}"
30
- debug "#{self.class.name}##{__method__} => Response Headers: #{dump env.response_headers}"
31
- debug "#{self.class.name}##{__method__} => Response Body: #{dump env.body}" if env.body
32
- end
33
-
34
- private
35
-
36
- def dump(value)
37
- skip_sensitive_data(value.is_a?(Array) ? value.to_h : value).to_json
38
- end
39
- end
40
- end
41
- end
@@ -1,46 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module Middleware
4
- class RaiseError < Faraday::Response::Middleware # :nodoc:
5
- using ObjectExtensions
6
- using StringExtensions
7
-
8
- SUCCESS_STATUSES = 200..299
9
- CONNECTION_FAILED_STATUS = 407
10
- API_SESSION_TIMEOUT = 419
11
-
12
- def on_complete(env)
13
- return if SUCCESS_STATUSES.include?(env[:status])
14
-
15
- if env[:status] == API_SESSION_TIMEOUT
16
- raise(FinApps::Error::ApiSessionTimeoutError, 'Api Session Timed out')
17
- elsif env[:status] == CONNECTION_FAILED_STATUS
18
- raise(Faraday::Error::ConnectionFailed, '407 "Proxy Authentication Required"')
19
- else
20
- raise(Faraday::Error::ClientError, response_values(env))
21
- end
22
- end
23
-
24
- def response_values(env)
25
- {
26
- status: env.status,
27
- headers: env.response_headers,
28
- body: env.body,
29
- error_messages: error_messages(env.body)
30
- }
31
- end
32
-
33
- private
34
-
35
- def error_messages(body)
36
- return nil if body.blank?
37
- body = body.json_to_hash if body.is_a?(String)
38
- has_message_key?(body) ? body['messages'] : nil
39
- end
40
-
41
- def has_message_key?(body)
42
- body.respond_to?(:key?) && body.key?('messages')
43
- end
44
- end
45
- end
46
- end
@@ -1,122 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module REST
4
- # base client functionality
5
- class BaseClient
6
- include ::FinApps::Utils::Loggeable
7
- include ::FinApps::REST::Connection
8
- using ObjectExtensions
9
- using StringExtensions
10
-
11
- attr_reader :config
12
-
13
- def initialize(options, logger=nil)
14
- @config = FinApps::REST::Configuration.new options
15
- @logger = logger
16
- end
17
-
18
- def user_credentials?
19
- config.valid_user_credentials?
20
- end
21
-
22
- # Returns an initialized Faraday connection object.
23
- #
24
- # @return Faraday::Connection.
25
- def connection
26
- @connection ||= faraday(config, logger)
27
- end
28
-
29
- # Performs HTTP GET, POST, UPDATE and DELETE requests.
30
- # You shouldn't need to use this method directly, but it can be useful for debugging.
31
- # Returns a hash obtained from parsing the JSON object in the response body.
32
- #
33
- # @param [String] path
34
- # @param [String] method
35
- # @param [Hash] params
36
- # @return [Hash,Array<String>]
37
- def send_request(path, method, params={})
38
- raise FinApps::MissingArgumentsError.new 'Missing argument: path.' if path.blank?
39
- raise FinApps::MissingArgumentsError.new 'Missing argument: method.' if method.blank?
40
-
41
- response, error_messages = execute_request(path, method, params)
42
- result = if empty?(response)
43
- nil
44
- else
45
- block_given? ? yield(response) : response.body
46
- end
47
-
48
- [result, error_messages]
49
- end
50
-
51
- # Defines methods to perform HTTP GET, POST, PUT and DELETE requests.
52
- # Returns a hash obtained from parsing the JSON object in the response body.
53
- #
54
- def method_missing(method_id, *arguments, &block)
55
- if %i(get post put delete).include? method_id
56
- connection.send(method_id) do |req|
57
- req.url arguments.first
58
- req.body = arguments[1] unless method_id == :get
59
- end
60
- else
61
- super
62
- end
63
- end
64
-
65
- def respond_to_missing?(method_sym, include_private=false)
66
- [:get, :post, :put, :delete].include?(method_sym) ? true : super
67
- end
68
-
69
- private
70
-
71
- def empty?(response)
72
- response.blank? || (response.respond_to?(:body) && response.body.blank?)
73
- end
74
-
75
- def execute_request(path, method, params)
76
- errors = []
77
-
78
- begin
79
- response = execute_method path, method, params
80
-
81
- rescue FinApps::ApiSessionTimeoutError => error
82
- handle_error(error)
83
- rescue FinApps::InvalidArgumentsError => error
84
- handle_error error
85
- rescue FinApps::MissingArgumentsError => error
86
- handle_error error
87
- rescue Faraday::Error::ConnectionFailed => error
88
- handle_error error
89
- rescue Faraday::Error::ClientError => error
90
- errors = handle_client_error(error)
91
- end
92
-
93
- [response, errors]
94
- end
95
-
96
- def handle_error(error)
97
- logger.fatal "#{self.class}##{__method__} => #{error}"
98
- raise error
99
- end
100
-
101
- def handle_client_error(error)
102
- logger.warn "#{self.class}##{__method__} => #{error.class.name}, #{error}"
103
- error.response.present? && error.response[:error_messages] ? error.response[:error_messages] : [error.message]
104
- end
105
-
106
- def execute_method(path, method, params)
107
- case method
108
- when :get
109
- get(path)
110
- when :post
111
- post(path, params)
112
- when :put
113
- put(path, params)
114
- when :delete
115
- delete(path, params)
116
- else
117
- raise FinApps::InvalidArgumentsError.new "Method not supported: #{method}."
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module REST
4
- # Represents the client configuration options
5
- class Configuration # :nodoc:
6
- using ObjectExtensions
7
- using HashExtensions
8
-
9
- attr_accessor :host,
10
- :tenant_identifier, :tenant_token,
11
- :user_identifier, :user_token,
12
- :proxy, :timeout, :retry_limit, :log_level
13
-
14
- def initialize(options={})
15
- FinApps::REST::Defaults::DEFAULTS.merge(options.compact).each {|key, value| public_send("#{key}=", value) }
16
- raise FinApps::InvalidArgumentsError.new "Invalid argument. {host: #{host}}" unless valid_host?
17
- raise FinApps::InvalidArgumentsError.new "Invalid argument. {timeout: #{timeout}}" unless timeout.integer?
18
- end
19
-
20
- def valid_user_credentials?
21
- FinApps::REST::Credentials.new(user_identifier, user_token).valid?
22
- end
23
-
24
- private
25
-
26
- def valid_host?
27
- host.start_with?('http://', 'https://')
28
- end
29
- end
30
- end
31
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module REST
4
- module Connection # :nodoc:
5
- # @return [Faraday::Connection]
6
- def faraday(config, logger)
7
- options = {
8
- url: "#{config.host}/v#{Defaults::API_VERSION}/",
9
- request: {open_timeout: config.timeout,
10
- timeout: config.timeout}
11
- }
12
-
13
- Faraday.new(options) do |conn|
14
- conn.request :accept_json
15
- conn.request :user_agent
16
- conn.request :tenant_authentication, config.tenant_identifier, config.tenant_token
17
- conn.request :json
18
- conn.request :retry
19
- conn.request :multipart
20
- conn.request :url_encoded
21
- conn.request :no_encoding_basic_authentication, config.user_token if config.valid_user_credentials?
22
-
23
- conn.use FinApps::Middleware::RaiseError
24
- conn.response :rashify
25
- conn.response :json, content_type: /\bjson$/
26
- conn.response :custom_logger, logger, bodies: (ENV['SILENT_LOG_BODIES'] != 'true')
27
-
28
- # Adapter (ensure that the adapter is always last.)
29
- conn.adapter :typhoeus
30
- end
31
- end
32
- module_function :faraday # becomes available as a *private instance method* to classes that mix in the module
33
- end
34
- end
35
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
- module FinApps
3
- module REST
4
- # represents both tenant and user credentials
5
- class Credentials
6
- using ObjectExtensions
7
- using StringExtensions
8
-
9
- attr_reader :identifier, :token
10
-
11
- def initialize(identifier, token)
12
- @identifier = identifier
13
- @token = token
14
- end
15
-
16
- def valid?
17
- identifier.present? && token.present?
18
- end
19
- end
20
- end
21
- end