setsuzoku 0.15.6 → 0.15.7
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/Gemfile.lock +12 -1
- data/lib/setsuzoku/service/web_service/api_strategies/rest_strategy.rb +82 -52
- data/lib/setsuzoku/version.rb +2 -2
- data/setsuzoku.gemspec +2 -1
- metadata +25 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2845af66689814f88f37e06cd20516904d7000d8eb5e7b65893db42f93e47e18
|
4
|
+
data.tar.gz: d85e64ea68bf642ce3ac6dda479575d8a34b9896b15e14332072cb35692d65d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8409e05401d6ce653ae9704058a6a5874ffb63687d467514cb7fc69fd3c37dfd7c9a1931d843e558f4726f6a5a5355edb6a841dd888384a52959925e570575aa
|
7
|
+
data.tar.gz: d2829f923f90faccaf2afdc7449af20948fc85234a0eb257e6b3d7aece01db815c24e9360cc168c4af45b6bb84cb16e3ba43c972982c8827f02731532ed7cc1e
|
data/Gemfile.lock
CHANGED
@@ -2,8 +2,9 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
setsuzoku (0.15.6)
|
5
|
-
activesupport (>= 5.0, <
|
5
|
+
activesupport (>= 5.0, < 8)
|
6
6
|
faraday (>= 2.7.10, < 3.0)
|
7
|
+
faraday-multipart (>= 1.0.4, < 2.0)
|
7
8
|
nokogiri (>= 1.10, < 2.0)
|
8
9
|
sorbet-runtime (>= 0.5, < 1.0)
|
9
10
|
|
@@ -25,13 +26,22 @@ GEM
|
|
25
26
|
faraday (2.7.10)
|
26
27
|
faraday-net_http (>= 2.0, < 3.1)
|
27
28
|
ruby2_keywords (>= 0.0.4)
|
29
|
+
faraday-multipart (1.0.4)
|
30
|
+
multipart-post (~> 2)
|
28
31
|
faraday-net_http (3.0.2)
|
29
32
|
hashdiff (1.0.1)
|
30
33
|
i18n (1.14.1)
|
31
34
|
concurrent-ruby (~> 1.0)
|
35
|
+
mini_portile2 (2.8.5)
|
32
36
|
minitest (5.19.0)
|
37
|
+
multipart-post (2.4.0)
|
38
|
+
nokogiri (1.15.4)
|
39
|
+
mini_portile2 (~> 2.8.2)
|
40
|
+
racc (~> 1.4)
|
33
41
|
nokogiri (1.15.4-arm64-darwin)
|
34
42
|
racc (~> 1.4)
|
43
|
+
nokogiri (1.15.4-x86_64-linux)
|
44
|
+
racc (~> 1.4)
|
35
45
|
public_suffix (5.0.4)
|
36
46
|
racc (1.7.1)
|
37
47
|
rake (13.1.0)
|
@@ -54,6 +64,7 @@ GEM
|
|
54
64
|
sorbet-static (= 0.5.11151)
|
55
65
|
sorbet-runtime (0.5.10972)
|
56
66
|
sorbet-static (0.5.11151-universal-darwin)
|
67
|
+
sorbet-static (0.5.11151-x86_64-linux)
|
57
68
|
tzinfo (2.0.6)
|
58
69
|
concurrent-ruby (~> 1.0)
|
59
70
|
webmock (3.19.1)
|
@@ -4,6 +4,8 @@
|
|
4
4
|
require 'active_support/json'
|
5
5
|
require 'active_support/core_ext/hash/indifferent_access'
|
6
6
|
require 'active_support/core_ext/string/access'
|
7
|
+
require 'faraday'
|
8
|
+
require 'faraday/multipart'
|
7
9
|
|
8
10
|
module Setsuzoku
|
9
11
|
module Service
|
@@ -35,32 +37,49 @@ module Setsuzoku
|
|
35
37
|
# attachment_urls - 'Array<String>' List of attachment urls to be attached as form files.
|
36
38
|
#
|
37
39
|
# @return [Hash] the parsed response object.
|
38
|
-
sig
|
40
|
+
sig do
|
41
|
+
override.params(request: RestAPIRequest, action_details: T::Hash[T.untyped, T.untyped],
|
42
|
+
options: T.untyped).returns(Faraday::Response)
|
43
|
+
end
|
39
44
|
def perform_external_call(request:, action_details:, **options)
|
40
|
-
request_properties =
|
41
|
-
|
45
|
+
request_properties = get_request_properties(action_name: request.action,
|
46
|
+
action_details: action_details, req_params: request.body)
|
47
|
+
request_options = self.request_options(request_properties[:request_format],
|
48
|
+
action_details[:actions][request.action])
|
42
49
|
authorization = request_options.delete(:authorization)
|
43
|
-
full_request =
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
50
|
+
full_request = formulate_request(request_properties, request_options)
|
51
|
+
|
52
|
+
connection = Faraday.new(url: request_properties[:formatted_full_url],
|
53
|
+
request: { params_encoder: Faraday::FlatParamsEncoder }) do |faraday|
|
54
|
+
# Request type middle-ware
|
55
|
+
if options[:attachment_urls].present? || request_options.dig(:headers,
|
56
|
+
:'Content-Type')&.include?('multipart')
|
57
|
+
faraday.request(:multipart)
|
58
|
+
else
|
59
|
+
faraday.request(:url_encoded)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Logging
|
63
|
+
faraday.response :logger, Logger.new($stdout), bodies: true if Rails.env.development?
|
64
|
+
|
65
|
+
if !request.without_headers && authorization
|
66
|
+
# updated authorization with updated faraday
|
67
|
+
# https://lostisland.github.io/faraday/#/middleware/included/authentication
|
68
|
+
if authorization.key?(:token)
|
69
|
+
faraday.request(:authorization, 'Bearer', authorization[:token])
|
70
|
+
elsif authorization.key?(:basic_auth)
|
71
|
+
faraday.request(:authorization, :basic, authorization[:basic_auth][:username],
|
72
|
+
authorization[:basic_auth][:password])
|
57
73
|
end
|
58
74
|
end
|
75
|
+
|
59
76
|
faraday.adapter Faraday.default_adapter
|
60
77
|
end
|
78
|
+
|
79
|
+
# Attachments URLs
|
61
80
|
attachment_urls = options[:attachment_url] || options[:attachment_urls]
|
62
81
|
if attachment_urls.present?
|
63
|
-
resp =
|
82
|
+
resp = connection.post do |req|
|
64
83
|
payload = {}
|
65
84
|
# create an array to just iterate over for 1 or many urls
|
66
85
|
attachment_urls = [attachment_urls] if options[:attachment_url]
|
@@ -79,24 +98,36 @@ module Setsuzoku
|
|
79
98
|
end
|
80
99
|
else
|
81
100
|
if request.without_headers
|
82
|
-
|
101
|
+
connection.headers = {}
|
83
102
|
elsif request_options[:headers]
|
84
|
-
|
103
|
+
connection.headers = (connection.headers || {}).merge(request_options[:headers])
|
104
|
+
end
|
105
|
+
|
106
|
+
# TODO: !!!! this is wrong here because multipart is used for images as well not only text/plain
|
107
|
+
# TODO: What if the request params are empty?
|
108
|
+
if connection.builder.app.class <= Faraday::Multipart::Middleware
|
109
|
+
full_request = request_properties[:req_params].transform_values do |v|
|
110
|
+
Faraday::Multipart::ParamPart.new(v, 'text/plain')
|
111
|
+
end
|
85
112
|
end
|
86
|
-
|
113
|
+
|
114
|
+
resp = connection.send(request_properties[:request_method], request_properties[:formatted_full_url],
|
115
|
+
full_request)
|
87
116
|
end
|
117
|
+
|
88
118
|
resp
|
89
119
|
end
|
90
120
|
|
91
121
|
sig do
|
92
122
|
params(
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
123
|
+
action_name: Symbol,
|
124
|
+
for_stub: T::Boolean,
|
125
|
+
req_params: T::Hash[T.untyped, T.untyped],
|
126
|
+
action_details: T::Hash[Symbol, T.untyped]
|
97
127
|
).returns(T::Hash[Symbol, T.untyped])
|
98
128
|
end
|
99
|
-
def get_request_properties(action_name:, for_stub: false, req_params: {},
|
129
|
+
def get_request_properties(action_name:, for_stub: false, req_params: {},
|
130
|
+
action_details: { actions: plugin.api_actions, url: plugin.api_base_url })
|
100
131
|
action = action_details[:actions][action_name]
|
101
132
|
url = action.has_key?(:request_url) ? action[:request_url] : action_details[:url]
|
102
133
|
request_method, endpoint = action.first
|
@@ -105,15 +136,15 @@ module Setsuzoku
|
|
105
136
|
response_format = action[:response_type]
|
106
137
|
stub_data = action[:stub_data] if for_stub
|
107
138
|
full_url = url + endpoint
|
108
|
-
formatted_full_url, req_params =
|
139
|
+
formatted_full_url, req_params = replace_dynamic_vars(full_url: full_url, req_params: req_params)
|
109
140
|
{
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
141
|
+
request_method: request_method,
|
142
|
+
endpoint: endpoint,
|
143
|
+
request_format: request_format,
|
144
|
+
response_format: response_format,
|
145
|
+
formatted_full_url: formatted_full_url,
|
146
|
+
req_params: req_params,
|
147
|
+
stub_data: stub_data
|
117
148
|
}
|
118
149
|
end
|
119
150
|
|
@@ -138,29 +169,27 @@ module Setsuzoku
|
|
138
169
|
else
|
139
170
|
params # Faraday supports empty hashes for other request types...
|
140
171
|
end
|
141
|
-
|
172
|
+
elsif request_format.include?('urlencoded')
|
142
173
|
# if the header or request format include urlencoded return the body as a hash
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
else
|
150
|
-
params.to_json
|
151
|
-
end
|
152
|
-
end
|
174
|
+
params
|
175
|
+
elsif request_properties[:request_format] == :xml
|
176
|
+
# return either xml or json
|
177
|
+
convert_hash_to_xml(params)
|
178
|
+
else
|
179
|
+
params.to_json
|
153
180
|
end
|
154
181
|
end
|
155
182
|
|
156
183
|
def request_options(request_format = nil, action_details = {})
|
157
|
-
request_options = {
|
158
|
-
|
184
|
+
request_options = {
|
185
|
+
headers: {}
|
186
|
+
}
|
159
187
|
request_options[:headers]
|
160
|
-
.merge!(
|
161
|
-
.merge!(
|
188
|
+
.merge!(auth_strategy.get_from_context(:auth_headers).except(:authorization))
|
189
|
+
.merge!(get_from_context(:api_headers))
|
162
190
|
.merge!(action_details[:request_options] || {})
|
163
|
-
request_options[:authorization] =
|
191
|
+
request_options[:authorization] =
|
192
|
+
action_details[:authorization] || auth_strategy.get_from_context(:auth_headers)[:authorization]
|
164
193
|
|
165
194
|
content_type = case request_format
|
166
195
|
when :json
|
@@ -174,7 +203,8 @@ module Setsuzoku
|
|
174
203
|
when :'x-www-form-urlencoded;charset=UTF-8'
|
175
204
|
'application/x-www-form-urlencoded;charset=UTF-8'
|
176
205
|
else
|
177
|
-
|
206
|
+
# allow any format to be passed otherwise default to application/json
|
207
|
+
request_format || 'application/json'
|
178
208
|
end
|
179
209
|
(request_options[:headers] ||= {})[:'Content-Type'] = content_type
|
180
210
|
request_options
|
@@ -187,7 +217,7 @@ module Setsuzoku
|
|
187
217
|
# it in the body and the url, then you should put it in params twice with different names.
|
188
218
|
req_params = req_params.dup
|
189
219
|
full_url = full_url.dup
|
190
|
-
dynamic_vars =
|
220
|
+
dynamic_vars = plugin.dynamic_url_params.merge(req_params).with_indifferent_access
|
191
221
|
full_url.scan(/({{.*?}})/).flatten.each do |var|
|
192
222
|
var_name = var.tr('{{ }}', '')
|
193
223
|
next unless dynamic_vars[var_name]
|
data/lib/setsuzoku/version.rb
CHANGED
data/setsuzoku.gemspec
CHANGED
@@ -40,9 +40,10 @@ Gem::Specification.new do |spec|
|
|
40
40
|
spec.add_development_dependency "rake", "~> 13.0"
|
41
41
|
spec.add_development_dependency "rspec", "3.8"
|
42
42
|
spec.add_development_dependency "webmock", "3.19.1"
|
43
|
-
spec.add_runtime_dependency "activesupport", ">= 5.0", '<
|
43
|
+
spec.add_runtime_dependency "activesupport", ">= 5.0", '< 8'
|
44
44
|
spec.add_development_dependency "sorbet", ">= 0.5", '< 1.0'
|
45
45
|
spec.add_runtime_dependency "sorbet-runtime", ">= 0.5", '< 1.0'
|
46
46
|
spec.add_runtime_dependency "faraday", ">= 2.7.10", "< 3.0"
|
47
|
+
spec.add_runtime_dependency "faraday-multipart", ">= 1.0.4", "< 2.0"
|
47
48
|
spec.add_runtime_dependency "nokogiri", ">= 1.10", "< 2.0"
|
48
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: setsuzoku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.
|
4
|
+
version: 0.15.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luke Stadtler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -75,7 +75,7 @@ dependencies:
|
|
75
75
|
version: '5.0'
|
76
76
|
- - "<"
|
77
77
|
- !ruby/object:Gem::Version
|
78
|
-
version: '
|
78
|
+
version: '8'
|
79
79
|
type: :runtime
|
80
80
|
prerelease: false
|
81
81
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -85,7 +85,7 @@ dependencies:
|
|
85
85
|
version: '5.0'
|
86
86
|
- - "<"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
88
|
+
version: '8'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: sorbet
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,6 +146,26 @@ dependencies:
|
|
146
146
|
- - "<"
|
147
147
|
- !ruby/object:Gem::Version
|
148
148
|
version: '3.0'
|
149
|
+
- !ruby/object:Gem::Dependency
|
150
|
+
name: faraday-multipart
|
151
|
+
requirement: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: 1.0.4
|
156
|
+
- - "<"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '2.0'
|
159
|
+
type: :runtime
|
160
|
+
prerelease: false
|
161
|
+
version_requirements: !ruby/object:Gem::Requirement
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 1.0.4
|
166
|
+
- - "<"
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '2.0'
|
149
169
|
- !ruby/object:Gem::Dependency
|
150
170
|
name: nokogiri
|
151
171
|
requirement: !ruby/object:Gem::Requirement
|
@@ -267,7 +287,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
267
287
|
- !ruby/object:Gem::Version
|
268
288
|
version: '0'
|
269
289
|
requirements: []
|
270
|
-
rubygems_version: 3.
|
290
|
+
rubygems_version: 3.2.33
|
271
291
|
signing_key:
|
272
292
|
specification_version: 4
|
273
293
|
summary: Extensible 3rd-party interface and functionality plugins
|