Skip to content

Commit 23df3e4

Browse files
committed
[P4M-734] Tweaks to API docs generation and upload
1 parent 5e17852 commit 23df3e4

File tree

1 file changed

+48
-10
lines changed

1 file changed

+48
-10
lines changed

lib/rspec_api_documentation/writers/open_api_writer.rb

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,46 @@ def get_schema(field)
188188
end
189189

190190
def extract_parameters(example)
191-
known_parameters = extract_known_parameters(example.extended_parameters.reject { |p| p[:in].nil? })
192-
known_param_names = known_parameters.map { |p| p.name }
193-
unknown_parameters = extract_unknown_parameters(example).reject { |p| known_param_names.include?(p.name) }
194-
known_parameters + unknown_parameters
191+
if example.http_method != :get
192+
known_parameters = extract_known_parameters(example.extended_parameters.reject { |p| p[:in].nil? })
193+
known_param_names = known_parameters.map { |p| p.name }
194+
unknown_parameters = extract_unknown_parameters(example).reject { |p| known_param_names.include?(p.name) }
195+
return known_parameters + unknown_parameters
196+
end
197+
198+
parameters = example.extended_parameters.map.to_h do |parameter|
199+
opts = if parameter[:scope] && !parameter[:in]
200+
{
201+
**parameter,
202+
name: Array(parameter[:scope]).first,
203+
description: nil,
204+
value: {},
205+
style: :deepObject,
206+
in: :query,
207+
}
208+
else
209+
{
210+
in: :query,
211+
**parameter,
212+
}
213+
end
214+
215+
[opts[:name].to_sym, extract_parameter(opts)]
216+
end
217+
218+
example.extended_parameters.each do |parameter|
219+
next unless parameter[:scope]
220+
221+
scope = Array(parameter[:scope])
222+
schema = parameters[scope.shift.to_sym].schema
223+
inject_schema_parameter(schema, {
224+
**parameter,
225+
scope: scope,
226+
})
227+
end
228+
229+
binding.pry
230+
parameters.values + extract_unknown_parameters(example, query: false)
195231
end
196232

197233
def extract_request_body(example)
@@ -210,7 +246,7 @@ def extract_request_body(example)
210246

211247
schema = get_schema(body)
212248
example.extended_parameters.select { |p| p[:in].nil? }.each do |parameter|
213-
inject_body_parameter(schema, parameter)
249+
inject_schema_parameter(schema, parameter)
214250
end
215251

216252
OpenApi::RequestBody.new(
@@ -225,6 +261,7 @@ def extract_parameter(opts)
225261
OpenApi::Parameter.new(
226262
name: opts[:name],
227263
in: opts[:in],
264+
style: opts[:style],
228265
description: opts[:description],
229266
required: opts[:required],
230267
deprecated: opts[:deprecated],
@@ -233,10 +270,10 @@ def extract_parameter(opts)
233270
)
234271
end
235272

236-
def extract_unknown_parameters(example)
273+
def extract_unknown_parameters(example, query: true, headers: true)
237274
parameters = []
238275
example.requests.each do |req|
239-
req[:request_query_parameters].each do |name, value|
276+
query && req[:request_query_parameters].each do |name, value|
240277
parameters.push(OpenApi::Parameter.new(
241278
name: name,
242279
in: :query,
@@ -245,7 +282,7 @@ def extract_unknown_parameters(example)
245282
example: value
246283
))
247284
end
248-
req[:request_headers].each do |name, value|
285+
headers && req[:request_headers].each do |name, value|
249286
parameters.push(OpenApi::Parameter.new(
250287
name: name,
251288
in: :header,
@@ -262,7 +299,7 @@ def extract_known_parameters(parameters)
262299
.map { |parameter| extract_parameter(parameter) }
263300
end
264301

265-
def inject_body_parameter(schema, parameter)
302+
def inject_schema_parameter(schema, parameter)
266303
scope = schema
267304
parameter[:scope] && Array(parameter[:scope]).each do |curr|
268305
scope.properties[curr.to_s] ||= OpenApi::Schema.new(type: 'object', properties: {})
@@ -272,8 +309,9 @@ def inject_body_parameter(schema, parameter)
272309
return unless scope.properties
273310

274311
if parameter[:required]
312+
name = parameter[:name].to_s
275313
scope.required ||= []
276-
scope.required << parameter[:name].to_s
314+
scope.required << name unless scope.required.include?(name)
277315
end
278316

279317
scope.properties[parameter[:name].to_s] ||= get_schema(parameter[:value])

0 commit comments

Comments
 (0)