finapps_core 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +21 -0
  3. data/.gitignore +53 -0
  4. data/.hound.yml +2 -0
  5. data/.rspec +4 -0
  6. data/.rubocop.yml +271 -0
  7. data/.ruby-gemset +1 -0
  8. data/.ruby-version +1 -0
  9. data/.travis.yml +14 -0
  10. data/Gemfile +3 -0
  11. data/Gemfile.lock +98 -0
  12. data/LICENSE +21 -0
  13. data/README.md +21 -0
  14. data/Rakefile +2 -0
  15. data/finapps_core.gemspec +39 -0
  16. data/lib/core_extensions/object/blank.rb +69 -0
  17. data/lib/core_extensions/object/is_integer.rb +10 -0
  18. data/lib/core_extensions/string/json_to_hash.rb +10 -0
  19. data/lib/finapps_core.rb +30 -0
  20. data/lib/finapps_core/error.rb +17 -0
  21. data/lib/finapps_core/middleware/middleware.rb +22 -0
  22. data/lib/finapps_core/middleware/request/accept_json.rb +14 -0
  23. data/lib/finapps_core/middleware/request/no_encoding_basic_authentication.rb +21 -0
  24. data/lib/finapps_core/middleware/request/tenant_authentication.rb +20 -0
  25. data/lib/finapps_core/middleware/request/user_agent.rb +15 -0
  26. data/lib/finapps_core/middleware/response/custom_logger.rb +39 -0
  27. data/lib/finapps_core/middleware/response/raise_error.rb +46 -0
  28. data/lib/finapps_core/rest/base_client.rb +118 -0
  29. data/lib/finapps_core/rest/configuration.rb +32 -0
  30. data/lib/finapps_core/rest/connection.rb +35 -0
  31. data/lib/finapps_core/rest/credentials.rb +21 -0
  32. data/lib/finapps_core/rest/defaults.rb +19 -0
  33. data/lib/finapps_core/rest/resources.rb +62 -0
  34. data/lib/finapps_core/utils/loggeable.rb +14 -0
  35. data/lib/finapps_core/utils/parameter_filter.rb +32 -0
  36. data/lib/finapps_core/version.rb +4 -0
  37. data/lib/tasks/releaser.rake +9 -0
  38. data/spec/core_extensions/object/blank_spec.rb +44 -0
  39. data/spec/core_extensions/object/is_integer_spec.rb +17 -0
  40. data/spec/middleware/request/accept_json_spec.rb +12 -0
  41. data/spec/middleware/request/no_encoding_basic_authentication_spec.rb +32 -0
  42. data/spec/middleware/request/tenant_authentication_spec.rb +34 -0
  43. data/spec/middleware/request/user_agent_spec.rb +12 -0
  44. data/spec/middleware/response/raise_error_spec.rb +24 -0
  45. data/spec/rest/base_client_spec.rb +110 -0
  46. data/spec/rest/configuration_spec.rb +43 -0
  47. data/spec/rest/credentials_spec.rb +20 -0
  48. data/spec/rest/relevance_ruleset_names.json +47 -0
  49. data/spec/rest/timeout_spec.rb +7 -0
  50. data/spec/spec_helper.rb +37 -0
  51. data/spec/spec_helpers/client.rb +8 -0
  52. data/spec/support/fake_api.rb +34 -0
  53. data/spec/support/fixtures/error.json +5 -0
  54. data/spec/support/fixtures/relevance_ruleset_names.json +47 -0
  55. data/spec/support/fixtures/resource.json +3 -0
  56. data/spec/support/fixtures/resource_not_found.json +5 -0
  57. data/spec/support/fixtures/resources.json +11 -0
  58. data/spec/support/fixtures/unauthorized.json +5 -0
  59. data/spec/utils/parameter_filter_spec.rb +23 -0
  60. metadata +353 -0
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Financial Apps
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,21 @@
1
+
2
+ FinApps Ruby-Client
3
+ ===================
4
+
5
+ [![Build Status](https://travis-ci.org/finapps/ruby-client-core.svg?branch=master)](https://travis-ci.org/finapps/ruby-client-core)
6
+ [![Code Climate](https://codeclimate.com/github/finapps/ruby-client-core/badges/gpa.svg)](https://codeclimate.com/github/finapps/ruby-client-core)
7
+ [![Test Coverage](https://codeclimate.com/github/finapps/ruby-client-core/badges/coverage.svg)](https://codeclimate.com/github/finapps/ruby-client-core/coverage)
8
+ [![Dependency Status](https://gemnasium.com/badges/github.com/finapps/ruby-client-core.svg)](https://gemnasium.com/github.com/finapps/ruby-client-core)
9
+ [![License](http://img.shields.io/:license-mit-blue.svg?style=flat-square)](http://finapps.mit-license.org)
10
+
11
+ Common library for Ruby clients.
12
+
13
+ See Financial Apps API [Ruby Client][ruby-client].
14
+
15
+
16
+ -------------------
17
+
18
+ [FinancialApps.com][financialapps]
19
+
20
+ [ruby-client]: https://github.com/finapps/ruby-client
21
+ [financialapps]: https://financialapps.com
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ import './lib/tasks/releaser.rake'
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ # frozen_string_literal: true
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'finapps_core/version'
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'finapps_core'
8
+ spec.version = FinAppsCore::VERSION
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.authors = ['Erich Quintero']
11
+ spec.email = ['erich@financialapps.com']
12
+
13
+ spec.summary = 'FinApps REST API ruby client - Core.'
14
+ spec.description = 'A simple library for communicating with the FinApps REST API. Core functionality.'
15
+ spec.homepage = 'https://github.com/finapps/ruby-client-core'
16
+ spec.licenses = ['MIT']
17
+
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f) }
20
+ spec.test_files = Dir['spec/**/*.rb']
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_runtime_dependency 'faraday', '~> 0.9', '>= 0.9.2'
24
+ spec.add_runtime_dependency 'faraday_middleware', '~> 0.10', '>= 0.10.0'
25
+ spec.add_runtime_dependency 'typhoeus', '~> 1.0', '>= 1.0.2'
26
+ spec.add_runtime_dependency 'rash', '~> 0.4', '>= 0.4.0'
27
+
28
+ spec.add_development_dependency 'bundler', '~> 1.11', '>= 1.11.2'
29
+ spec.add_development_dependency 'rake', '~> 11.2', '>= 11.2.2'
30
+ spec.add_development_dependency 'rspec', '~> 3.4', '>= 3.4.0'
31
+ spec.add_development_dependency 'webmock', '~> 2.1', '>= 2.1.0'
32
+ spec.add_development_dependency 'sinatra', '~> 1.4', '>= 1.4.7'
33
+ spec.add_development_dependency 'simplecov', '~> 0.11', '>= 0.11.2'
34
+ spec.add_development_dependency 'codeclimate-test-reporter', '~> 0.6.0'
35
+ spec.add_development_dependency 'rubocop', '0.45.0'
36
+
37
+ spec.extra_rdoc_files = %w(README.md LICENSE)
38
+ spec.rdoc_options = %w(--line-numbers --inline-source --title finapps-ruby-core --main README.md)
39
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+ module ObjectExtensions
3
+ refine Object do
4
+ # An object is blank if it's false, empty, or a whitespace string.
5
+ # For example, +false+, '', ' ', +nil+, [], and {} are all blank.
6
+ #
7
+ # This simplifies
8
+ #
9
+ # !address || address.empty?
10
+ #
11
+ # to
12
+ #
13
+ # address.blank?
14
+ #
15
+ # @return [true, false]
16
+ def blank?
17
+ respond_to?(:empty?) ? !!empty? : !self
18
+ end
19
+
20
+ # An object is present if it's not blank.
21
+ #
22
+ # @return [true, false]
23
+ def present?
24
+ !blank?
25
+ end
26
+
27
+ # Returns the receiver if it's present otherwise returns +nil+.
28
+ # <tt>object.presence</tt> is equivalent to
29
+ #
30
+ # object.present? ? object : nil
31
+ #
32
+ # For example, something like
33
+ #
34
+ # state = params[:state] if params[:state].present?
35
+ # country = params[:country] if params[:country].present?
36
+ # region = state || country || 'US'
37
+ #
38
+ # becomes
39
+ #
40
+ # region = params[:state].presence || params[:country].presence || 'US'
41
+ #
42
+ # @return [Object]
43
+ def presence
44
+ self if present?
45
+ end
46
+ end
47
+ end
48
+
49
+ module StringExtensions
50
+ refine String do
51
+ BLANK_RE = /\A[[:space:]]*\z/
52
+
53
+ # A string is blank if it's empty or contains whitespaces only:
54
+ #
55
+ # ''.blank? # => true
56
+ # ' '.blank? # => true
57
+ # "\t\n\r".blank? # => true
58
+ # ' blah '.blank? # => false
59
+ #
60
+ # Unicode whitespace is supported:
61
+ #
62
+ # "\u00a0".blank? # => true
63
+ #
64
+ # @return [true, false]
65
+ def blank?
66
+ match BLANK_RE
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,10 @@
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
@@ -0,0 +1,10 @@
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
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ require 'finapps_core/version' unless defined?(FinAppsCore::VERSION)
3
+
4
+ require 'faraday'
5
+ require 'faraday_middleware'
6
+ require 'typhoeus'
7
+ require 'typhoeus/adapters/faraday'
8
+
9
+ require 'core_extensions/object/blank'
10
+ require 'core_extensions/object/is_integer'
11
+ require 'core_extensions/string/json_to_hash'
12
+
13
+ require 'finapps_core/utils/loggeable'
14
+ require 'finapps_core/utils/parameter_filter'
15
+ require 'finapps_core/error'
16
+
17
+ require 'finapps_core/middleware/request/tenant_authentication'
18
+ require 'finapps_core/middleware/request/no_encoding_basic_authentication'
19
+ require 'finapps_core/middleware/request/accept_json'
20
+ require 'finapps_core/middleware/request/user_agent'
21
+ require 'finapps_core/middleware/response/raise_error'
22
+ require 'finapps_core/middleware/middleware'
23
+
24
+ require 'finapps_core/rest/defaults'
25
+ require 'finapps_core/rest/resources'
26
+
27
+ require 'finapps_core/rest/configuration'
28
+ require 'finapps_core/rest/credentials'
29
+ require 'finapps_core/rest/connection'
30
+ require 'finapps_core/rest/base_client'
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ # Defines some errors to identify Exceptions within this gem
3
+ module FinAppsCore # :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, FinAppsCore.const_get(const))
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ require 'faraday' unless defined? Faraday
3
+
4
+ module FinAppsCore
5
+ module Middleware
6
+ autoload :AcceptJson, 'finapps_core/middleware/request/accept_json'
7
+ autoload :UserAgent, 'finapps_core/middleware/request/user_agent'
8
+ autoload :NoEncodingBasicAuthentication, 'finapps_core/middleware/request/no_encoding_basic_authentication'
9
+ autoload :TenantAuthentication, 'finapps_core/middleware/request/tenant_authentication'
10
+ autoload :CustomLogger, 'finapps_core/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
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ module FinAppsCore
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
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ module FinAppsCore
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
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ module FinAppsCore
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
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ module FinAppsCore
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/#{FinAppsCore::VERSION} (#{RUBY})"
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ module FinAppsCore
3
+ module Middleware
4
+ class CustomLogger < Faraday::Response::Middleware
5
+ extend Forwardable
6
+ include FinAppsCore::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
+ super
25
+ end
26
+
27
+ def on_complete(env)
28
+ debug "#{self.class.name}##{__method__} => Response Headers: #{dump env.response_headers}"
29
+ debug "#{self.class.name}##{__method__} => Response Body: #{dump env.body}" if env.body
30
+ end
31
+
32
+ private
33
+
34
+ def dump(value)
35
+ skip_sensitive_data(value.is_a?(Array) ? value.to_h : value).to_json
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+ module FinAppsCore
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(FinAppsCore::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
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+ module FinAppsCore
3
+ module REST
4
+ # base client functionality
5
+ class BaseClient
6
+ include ::FinAppsCore::Utils::Loggeable
7
+ include ::FinAppsCore::REST::Connection
8
+ using ObjectExtensions
9
+ using StringExtensions
10
+
11
+ attr_reader :config
12
+
13
+ def initialize(options, logger=nil)
14
+ @config = FinAppsCore::REST::Configuration.new options
15
+ @logger = logger
16
+ end
17
+
18
+ # Returns an initialized Faraday connection object.
19
+ #
20
+ # @return Faraday::Connection.
21
+ def connection
22
+ @connection ||= faraday(config, logger)
23
+ end
24
+
25
+ # Performs HTTP GET, POST, UPDATE and DELETE requests.
26
+ # You shouldn't need to use this method directly, but it can be useful for debugging.
27
+ # Returns a hash obtained from parsing the JSON object in the response body.
28
+ #
29
+ # @param [String] path
30
+ # @param [String] method
31
+ # @param [Hash] params
32
+ # @return [Hash,Array<String>]
33
+ def send_request(path, method, params={})
34
+ raise FinAppsCore::MissingArgumentsError.new 'Missing argument: path.' if path.blank?
35
+ raise FinAppsCore::MissingArgumentsError.new 'Missing argument: method.' if method.blank?
36
+
37
+ response, error_messages = execute_request(path, method, params)
38
+ result = if empty?(response)
39
+ nil
40
+ else
41
+ block_given? ? yield(response) : response.body
42
+ end
43
+
44
+ [result, error_messages]
45
+ end
46
+
47
+ # Defines methods to perform HTTP GET, POST, PUT and DELETE requests.
48
+ # Returns a hash obtained from parsing the JSON object in the response body.
49
+ #
50
+ def method_missing(method_id, *arguments, &block)
51
+ if %i(get post put delete).include? method_id
52
+ connection.send(method_id) do |req|
53
+ req.url arguments.first
54
+ req.body = arguments[1] unless method_id == :get
55
+ end
56
+ else
57
+ super
58
+ end
59
+ end
60
+
61
+ def respond_to_missing?(method_sym, include_private=false)
62
+ [:get, :post, :put, :delete].include?(method_sym) ? true : super
63
+ end
64
+
65
+ private
66
+
67
+ def empty?(response)
68
+ response.blank? || (response.respond_to?(:body) && response.body.blank?)
69
+ end
70
+
71
+ def execute_request(path, method, params)
72
+ errors = []
73
+
74
+ begin
75
+ response = execute_method path, method, params
76
+
77
+ rescue FinAppsCore::ApiSessionTimeoutError => error
78
+ handle_error(error)
79
+ rescue FinAppsCore::InvalidArgumentsError => error
80
+ handle_error error
81
+ rescue FinAppsCore::MissingArgumentsError => error
82
+ handle_error error
83
+ rescue Faraday::Error::ConnectionFailed => error
84
+ handle_error error
85
+ rescue Faraday::Error::ClientError => error
86
+ errors = handle_client_error(error)
87
+ end
88
+
89
+ [response, errors]
90
+ end
91
+
92
+ def handle_error(error)
93
+ logger.fatal "#{self.class}##{__method__} => #{error}"
94
+ raise error
95
+ end
96
+
97
+ def handle_client_error(error)
98
+ logger.warn "#{self.class}##{__method__} => #{error.class.name}, #{error}"
99
+ error.response.present? && error.response[:error_messages] ? error.response[:error_messages] : [error.message]
100
+ end
101
+
102
+ def execute_method(path, method, params)
103
+ case method
104
+ when :get
105
+ get(path)
106
+ when :post
107
+ post(path, params)
108
+ when :put
109
+ put(path, params)
110
+ when :delete
111
+ delete(path, params)
112
+ else
113
+ raise FinAppsCore::InvalidArgumentsError.new "Method not supported: #{method}."
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end