finapps 1.0.8 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.rspec +1 -2
- data/.rubocop.yml +102 -0
- data/.ruby-gemset +1 -1
- data/.ruby-version +1 -1
- data/Rakefile +1 -1
- data/finapps.gemspec +10 -10
- data/lib/finapps/core_extensions/hash/compact.rb +22 -0
- data/lib/finapps/core_extensions/integerable.rb +14 -0
- data/lib/finapps/core_extensions/object/blank.rb +145 -0
- data/lib/finapps/error.rb +7 -0
- data/lib/finapps/hash_constructable.rb +9 -0
- data/lib/finapps/middleware/raise_error.rb +46 -0
- data/lib/finapps/middleware/tenant_authentication.rb +19 -0
- data/lib/finapps/rest/base_client.rb +96 -0
- data/lib/finapps/rest/client.rb +11 -199
- data/lib/finapps/rest/configuration.rb +55 -0
- data/lib/finapps/rest/connection.rb +14 -33
- data/lib/finapps/rest/defaults.rb +55 -64
- data/lib/finapps/rest/resource.rb +3 -6
- data/lib/finapps/rest/resources.rb +11 -6
- data/lib/finapps/rest/users.rb +17 -57
- data/lib/finapps/utils/loggeable.rb +13 -0
- data/lib/finapps/version.rb +1 -1
- data/lib/finapps.rb +11 -23
- data/lib/tasks/releaser.rake +2 -2
- data/spec/middleware/tenant_authentication_spec.rb +29 -0
- data/spec/rest/base_client_spec.rb +89 -0
- data/spec/rest/client_spec.rb +16 -102
- data/spec/rest/configuration_spec.rb +75 -0
- data/spec/spec_helper.rb +10 -7
- data/spec/support/fake_api.rb +9 -2
- data/spec/support/fixtures/error.json +5 -0
- data/spec/support/fixtures/relevance_ruleset_names.json +47 -0
- metadata +49 -57
- data/lib/finapps/middleware/api_token.rb +0 -26
- data/lib/finapps/middleware/raise_http_exceptions.rb +0 -92
- data/lib/finapps/middleware/response_logger.rb +0 -37
- data/lib/finapps/rest/alert.rb +0 -62
- data/lib/finapps/rest/alert_definition.rb +0 -40
- data/lib/finapps/rest/alert_preferences.rb +0 -40
- data/lib/finapps/rest/alert_settings.rb +0 -40
- data/lib/finapps/rest/budget_calculation.rb +0 -45
- data/lib/finapps/rest/budget_models.rb +0 -42
- data/lib/finapps/rest/budgets.rb +0 -103
- data/lib/finapps/rest/cashflows.rb +0 -87
- data/lib/finapps/rest/categories.rb +0 -21
- data/lib/finapps/rest/errors.rb +0 -155
- data/lib/finapps/rest/institutions.rb +0 -47
- data/lib/finapps/rest/relevance/rulesets.rb +0 -64
- data/lib/finapps/rest/transactions.rb +0 -45
- data/lib/finapps/rest/user_institutions.rb +0 -138
- data/lib/finapps/utils/logging.rb +0 -95
- data/lib/finapps/utils/utils.rb +0 -57
- data/spec/middleware/api_token_spec.rb +0 -32
- data/spec/rest/connection_spec.rb +0 -40
- data/spec/rest/users_spec.rb +0 -24
- data/spec/utils/logging_spec.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0abfe9b391e46bb0657c3b893f6f26117a20f42
|
4
|
+
data.tar.gz: 5e3764decd46daa480ce291872a10ebf7f7c8871
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6378daa1c4cd58c8017b1efd59dd6048fb4baf93ccfbacac82862ab2fcd6880e9418054a4887263ab9106640c091524483acbd2ab5e3cc20e92d761c6ebf6fd4
|
7
|
+
data.tar.gz: 8d5e4a4c45df74feab9d3dbbeeea42c32f43a40feccaf5290dd891373330a66cb9806c067c6cc7e1b09fa114b0b5ef3e1c6cd235782a0975196d6214e540ec7e
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- "bin/**/*"
|
4
|
+
|
5
|
+
Rails:
|
6
|
+
Enabled: true
|
7
|
+
|
8
|
+
##################### Metrics ##################################
|
9
|
+
|
10
|
+
Metrics/AbcSize:
|
11
|
+
# The ABC size is a calculated magnitude, so this number can be a Fixnum or
|
12
|
+
# a Float.
|
13
|
+
Max: 25
|
14
|
+
|
15
|
+
# Commonly used screens these days easily fit more than 80 characters.
|
16
|
+
Metrics/LineLength:
|
17
|
+
Max: 120
|
18
|
+
|
19
|
+
# Too short methods lead to extraction of single-use methods, which can make
|
20
|
+
# the code easier to read (by naming things), but can also clutter the class
|
21
|
+
Metrics/MethodLength:
|
22
|
+
Max: 20
|
23
|
+
|
24
|
+
# No space makes the method definition shorter and differentiates
|
25
|
+
# from a regular assignment.
|
26
|
+
Style/SpaceAroundEqualsInParameterDefault:
|
27
|
+
EnforcedStyle: no_space
|
28
|
+
|
29
|
+
# We do not need to support Ruby 1.9, so this is good to use.
|
30
|
+
Style/SymbolArray:
|
31
|
+
Enabled: true
|
32
|
+
|
33
|
+
# Most readable form.
|
34
|
+
Style/AlignHash:
|
35
|
+
EnforcedHashRocketStyle: table
|
36
|
+
EnforcedColonStyle: table
|
37
|
+
|
38
|
+
# Mixing the styles looks just silly.
|
39
|
+
Style/HashSyntax:
|
40
|
+
EnforcedStyle: ruby19_no_mixed_keys
|
41
|
+
|
42
|
+
# String#% is by far the least verbose and only object oriented variant.
|
43
|
+
Style/FormatString:
|
44
|
+
EnforcedStyle: percent
|
45
|
+
|
46
|
+
Style/CollectionMethods:
|
47
|
+
Enabled: true
|
48
|
+
PreferredMethods:
|
49
|
+
# inject seems more common in the community.
|
50
|
+
reduce: "inject"
|
51
|
+
|
52
|
+
# Either allow this style or don't. Marking it as safe with parenthesis
|
53
|
+
# is silly. Let's try to live without them for now.
|
54
|
+
Style/ParenthesesAroundCondition:
|
55
|
+
AllowSafeAssignment: false
|
56
|
+
Lint/AssignmentInCondition:
|
57
|
+
AllowSafeAssignment: false
|
58
|
+
|
59
|
+
# A specialized exception class will take one or more arguments and construct the message from it.
|
60
|
+
# So both variants make sense.
|
61
|
+
Style/RaiseArgs:
|
62
|
+
Enabled: false
|
63
|
+
|
64
|
+
# Fail is an alias of raise. Avoid aliases, it's more cognitive load for no gain.
|
65
|
+
# The argument that fail should be used to abort the program is wrong too,
|
66
|
+
# there's Kernel#abort for that.
|
67
|
+
Style/SignalException:
|
68
|
+
EnforcedStyle: only_raise
|
69
|
+
|
70
|
+
# Suppressing exceptions can be perfectly fine, and be it to avoid to
|
71
|
+
# explicitly type nil into the rescue since that's what you want to return,
|
72
|
+
# or suppressing LoadError for optional dependencies
|
73
|
+
Lint/HandleExceptions:
|
74
|
+
Enabled: false
|
75
|
+
|
76
|
+
Style/SpaceInsideBlockBraces:
|
77
|
+
# The space here provides no real gain in readability while consuming
|
78
|
+
# horizontal space that could be used for a better parameter name.
|
79
|
+
# Also {| differentiates better from a hash than { | does.
|
80
|
+
SpaceBeforeBlockParameters: false
|
81
|
+
|
82
|
+
# No trailing space differentiates better from the block:
|
83
|
+
# foo} means hash, foo } means block.
|
84
|
+
Style/SpaceInsideHashLiteralBraces:
|
85
|
+
EnforcedStyle: no_space
|
86
|
+
|
87
|
+
# Enforcing -> would be nice, but not at the cost of enforcing lambda { } for
|
88
|
+
# multiline lambdas.
|
89
|
+
Style/Lambda:
|
90
|
+
Enabled: false
|
91
|
+
|
92
|
+
# Enforcing the names of variables? To single letter ones? Just no.
|
93
|
+
Style/SingleLineBlockParams:
|
94
|
+
Enabled: false
|
95
|
+
|
96
|
+
# This is just silly. Calling the argument `other` in all cases makes no sense.
|
97
|
+
Style/OpMethod:
|
98
|
+
Enabled: false
|
99
|
+
|
100
|
+
# Reset some HoundCI changes back to Rubocop defaults
|
101
|
+
Style/DotPosition:
|
102
|
+
EnforcedStyle: leading
|
data/.ruby-gemset
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
ruby-client-v2
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.3.1
|
data/Rakefile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
import './lib/tasks/releaser.rake'
|
1
|
+
import './lib/tasks/releaser.rake'
|
data/finapps.gemspec
CHANGED
@@ -10,27 +10,27 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ['Erich Quintero']
|
11
11
|
spec.email = ['erich@financialapps.com']
|
12
12
|
|
13
|
-
spec.summary =
|
14
|
-
spec.description =
|
15
|
-
spec.homepage = '
|
13
|
+
spec.summary = 'FinApps REST API ruby client.'
|
14
|
+
spec.description = 'A simple library for communicating with the FinApps REST API.'
|
15
|
+
spec.homepage = 'https://github.com/finapps/ruby-client'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
18
18
|
spec.files = `git ls-files -z`.split("\x0")
|
19
|
-
spec.executables = spec.files.grep(%r{^bin/}) {
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) {|f| File.basename(f) }
|
20
20
|
spec.test_files = Dir['spec/**/*.rb']
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
-
spec.add_runtime_dependency 'faraday',
|
24
|
-
spec.add_runtime_dependency 'faraday_middleware',
|
25
|
-
spec.add_runtime_dependency 'typhoeus',
|
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
26
|
spec.add_runtime_dependency 'rash', '~> 0.4', '>= 0.4.0'
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler', '~> 1.11', '>= 1.11.2'
|
29
|
-
spec.add_development_dependency 'rake', '~> 11.
|
30
|
-
spec.add_development_dependency 'fuubar', '~> 2.0', '>= 2.0.0'
|
29
|
+
spec.add_development_dependency 'rake', '~> 11.2', '>= 11.2.2'
|
31
30
|
spec.add_development_dependency 'rspec', '~> 3.4', '>= 3.4.0'
|
32
|
-
spec.add_development_dependency 'webmock', '~> 1
|
31
|
+
spec.add_development_dependency 'webmock', '~> 2.1', '>= 2.1.0'
|
33
32
|
spec.add_development_dependency 'sinatra', '~> 1.4', '>= 1.4.7'
|
33
|
+
spec.add_development_dependency 'simplecov', '~> 0.11', '>= 0.11.2'
|
34
34
|
|
35
35
|
spec.extra_rdoc_files = %w(README.md LICENSE.txt)
|
36
36
|
spec.rdoc_options = %w(--line-numbers --inline-source --title finapps-ruby --main README.md)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# from rails/activesupport/lib/active_support/core_ext/hash/compact.rb
|
2
|
+
|
3
|
+
class Hash # :nodoc:
|
4
|
+
# Returns a hash with non +nil+ values.
|
5
|
+
#
|
6
|
+
# hash = { a: true, b: false, c: nil}
|
7
|
+
# hash.compact # => { a: true, b: false}
|
8
|
+
# hash # => { a: true, b: false, c: nil}
|
9
|
+
# { c: nil }.compact # => {}
|
10
|
+
def compact
|
11
|
+
select {|_, value| !value.nil? }
|
12
|
+
end
|
13
|
+
|
14
|
+
# Replaces current hash with non +nil+ values.
|
15
|
+
#
|
16
|
+
# hash = { a: true, b: false, c: nil}
|
17
|
+
# hash.compact! # => { a: true, b: false}
|
18
|
+
# hash # => { a: true, b: false}
|
19
|
+
def compact!
|
20
|
+
reject! {|_, value| value.nil? }
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# from: rails/activesupport/lib/active_support/core_ext/object/blank.rb
|
2
|
+
|
3
|
+
class Object # :nodoc:
|
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
|
+
|
48
|
+
class NilClass # :nodoc:
|
49
|
+
# +nil+ is blank:
|
50
|
+
#
|
51
|
+
# nil.blank? # => true
|
52
|
+
#
|
53
|
+
# @return [true]
|
54
|
+
def blank?
|
55
|
+
true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class FalseClass # :nodoc:
|
60
|
+
# +false+ is blank:
|
61
|
+
#
|
62
|
+
# false.blank? # => true
|
63
|
+
#
|
64
|
+
# @return [true]
|
65
|
+
def blank?
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class TrueClass # :nodoc:
|
71
|
+
# +true+ is not blank:
|
72
|
+
#
|
73
|
+
# true.blank? # => false
|
74
|
+
#
|
75
|
+
# @return [false]
|
76
|
+
def blank?
|
77
|
+
false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
class Array # :nodoc:
|
82
|
+
# An array is blank if it's empty:
|
83
|
+
#
|
84
|
+
# [].blank? # => true
|
85
|
+
# [1,2,3].blank? # => false
|
86
|
+
#
|
87
|
+
# @return [true, false]
|
88
|
+
alias blank? empty?
|
89
|
+
end
|
90
|
+
|
91
|
+
class Hash # :nodoc:
|
92
|
+
# A hash is blank if it's empty:
|
93
|
+
#
|
94
|
+
# {}.blank? # => true
|
95
|
+
# { key: 'value' }.blank? # => false
|
96
|
+
#
|
97
|
+
# @return [true, false]
|
98
|
+
alias blank? empty?
|
99
|
+
end
|
100
|
+
|
101
|
+
class String # :nodoc:
|
102
|
+
BLANK_RE = /\A[[:space:]]*\z/
|
103
|
+
|
104
|
+
# A string is blank if it's empty or contains whitespaces only:
|
105
|
+
#
|
106
|
+
# ''.blank? # => true
|
107
|
+
# ' '.blank? # => true
|
108
|
+
# "\t\n\r".blank? # => true
|
109
|
+
# ' blah '.blank? # => false
|
110
|
+
#
|
111
|
+
# Unicode whitespace is supported:
|
112
|
+
#
|
113
|
+
# "\u00a0".blank? # => true
|
114
|
+
#
|
115
|
+
# @return [true, false]
|
116
|
+
def blank?
|
117
|
+
# The regexp that matches blank strings is expensive. For the case of empty
|
118
|
+
# strings we can speed up this method (~3.5x) with an empty? call. The
|
119
|
+
# penalty for the rest of strings is marginal.
|
120
|
+
empty? || self =~ BLANK_RE
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
class Numeric #:nodoc:
|
125
|
+
# No number is blank:
|
126
|
+
#
|
127
|
+
# 1.blank? # => false
|
128
|
+
# 0.blank? # => false
|
129
|
+
#
|
130
|
+
# @return [false]
|
131
|
+
def blank?
|
132
|
+
false
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
class Time #:nodoc:
|
137
|
+
# No Time is blank:
|
138
|
+
#
|
139
|
+
# Time.now.blank? # => false
|
140
|
+
#
|
141
|
+
# @return [false]
|
142
|
+
def blank?
|
143
|
+
false
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
module FinApps # :nodoc:
|
2
|
+
class Error < StandardError; end
|
3
|
+
class InvalidArgumentsError < Error; end
|
4
|
+
class MissingArgumentsError < Error; end
|
5
|
+
|
6
|
+
%i(InvalidArgumentsError MissingArgumentsError).each {|const| Error.const_set(const, FinApps.const_get(const)) }
|
7
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
module FinApps
|
2
|
+
# when included into any object, allows to initialize public attributes from a hash
|
3
|
+
module HashConstructable
|
4
|
+
def initialize(options_hash={}, defaults=nil)
|
5
|
+
merged_hash = defaults.nil? ? options_hash : defaults.merge(options_hash.compact)
|
6
|
+
merged_hash.each {|k, v| public_send("#{k}=", v) }
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module FinApps
|
2
|
+
module Middleware
|
3
|
+
class RaiseError < Faraday::Response::Middleware # :nodoc:
|
4
|
+
include FinApps::Utils::Loggeable
|
5
|
+
|
6
|
+
CLIENT_ERROR_STATUSES = 400...600
|
7
|
+
|
8
|
+
def on_complete(env)
|
9
|
+
case env[:status]
|
10
|
+
when 407
|
11
|
+
# mimic the behavior that we get with proxy requests with HTTPS
|
12
|
+
raise Faraday::Error::ConnectionFailed, '407 "Proxy Authentication Required"'
|
13
|
+
when CLIENT_ERROR_STATUSES
|
14
|
+
raise Faraday::Error::ClientError, response_values(env)
|
15
|
+
else
|
16
|
+
# 200..206 Success codes
|
17
|
+
# all good!
|
18
|
+
logger.debug "##{__method__} => Status code: [#{env[:status]}]"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def response_values(env)
|
23
|
+
{
|
24
|
+
status: env.status,
|
25
|
+
headers: env.response_headers,
|
26
|
+
body: env.body,
|
27
|
+
error_messages: error_messages(env.body)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def error_messages(body)
|
34
|
+
return nil unless body.present?
|
35
|
+
body = parse_string(body) if body.is_a?(String)
|
36
|
+
body.is_a?(Hash) ? body['messages'].presence : nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def parse_string(body)
|
40
|
+
::JSON.parse(body)
|
41
|
+
rescue ::JSON::ParserError
|
42
|
+
logger.error "##{__method__} => Unable to parse JSON response."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module FinApps
|
2
|
+
module Middleware
|
3
|
+
# Adds a custom header for tenant level authorization.
|
4
|
+
# If the value for this header already exists, it is not overriden.
|
5
|
+
class TenantAuthentication < Faraday::Middleware
|
6
|
+
KEY = 'X-FinApps-Token'.freeze unless defined? KEY
|
7
|
+
|
8
|
+
def initialize(app, options={})
|
9
|
+
super(app)
|
10
|
+
@header_value = "#{options[:identifier].strip}=#{options[:token].strip}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
env[:request_headers][KEY] ||= @header_value
|
15
|
+
@app.call(env)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module FinApps
|
2
|
+
module REST
|
3
|
+
class BaseClient # :nodoc:
|
4
|
+
include ::FinApps::Utils::Loggeable
|
5
|
+
|
6
|
+
attr_reader :config
|
7
|
+
|
8
|
+
def initialize(options={}, logger=nil)
|
9
|
+
@config = FinApps::REST::Configuration.new options
|
10
|
+
@logger = logger
|
11
|
+
end
|
12
|
+
|
13
|
+
# Returns an initialized Faraday connection object.
|
14
|
+
#
|
15
|
+
# @return Faraday::Connection.
|
16
|
+
def connection
|
17
|
+
@connection ||= FinApps::REST::Connection.faraday(config, logger)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Performs HTTP GET, POST, UPDATE and DELETE requests.
|
21
|
+
# You shouldn't need to use this method directly, but it can be useful for debugging.
|
22
|
+
# Returns a hash obtained from parsing the JSON object in the response body.
|
23
|
+
#
|
24
|
+
# @param [String] path
|
25
|
+
# @param [String] method
|
26
|
+
# @param [Hash] params
|
27
|
+
# @return [Hash,Array<String>]
|
28
|
+
def send_request(path, method, params={})
|
29
|
+
raise FinApps::MissingArgumentsError.new 'Missing argument: path.' if path.blank?
|
30
|
+
raise FinApps::MissingArgumentsError.new 'Missing argument: method.' if method.blank?
|
31
|
+
|
32
|
+
response, error_messages = execute_request(method, params, path)
|
33
|
+
result = if response.present?
|
34
|
+
block_given? ? yield(response) : response.body
|
35
|
+
else
|
36
|
+
logger.error "##{__method__} => Null response found. Unable to process it."
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
[result, error_messages]
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def execute_request(method, params, path)
|
46
|
+
error_messages = []
|
47
|
+
|
48
|
+
begin
|
49
|
+
response = execute_method method, params, path
|
50
|
+
rescue FinApps::InvalidArgumentsError,
|
51
|
+
FinApps::MissingArgumentsError,
|
52
|
+
Faraday::Error::ConnectionFailed => error
|
53
|
+
logger.fatal "##{__method__} => #{error}"
|
54
|
+
raise error
|
55
|
+
rescue Faraday::Error::ClientError => error
|
56
|
+
error_messages = error.response[:error_messages].blank? ? [error.message] : error.response[:error_messages]
|
57
|
+
logger.error "##{__method__} => Faraday::Error::ClientError, #{error}"
|
58
|
+
rescue StandardError => error
|
59
|
+
error_messages << 'Unexpected error.'
|
60
|
+
logger.fatal "##{__method__} => StandardError, #{error}"
|
61
|
+
end
|
62
|
+
|
63
|
+
[response, error_messages]
|
64
|
+
end
|
65
|
+
|
66
|
+
def execute_method(method, params, path)
|
67
|
+
case method
|
68
|
+
when :get
|
69
|
+
get(path)
|
70
|
+
when :post
|
71
|
+
post(path, params)
|
72
|
+
when :put
|
73
|
+
put(path, params)
|
74
|
+
when :delete
|
75
|
+
delete(path, params)
|
76
|
+
else
|
77
|
+
raise FinApps::InvalidArgumentsError.new "Method not supported: #{method}."
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Defines methods to perform HTTP GET, POST, PUT and DELETE requests.
|
82
|
+
# Returns a hash obtained from parsing the JSON object in the response body.
|
83
|
+
#
|
84
|
+
def method_missing(method_id, *arguments, &block)
|
85
|
+
if %i(get post put delete).include? method_id
|
86
|
+
connection.send(method_id) do |req|
|
87
|
+
req.url arguments.first
|
88
|
+
req.body = arguments[1] unless method_id == :get
|
89
|
+
end
|
90
|
+
else
|
91
|
+
super
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|