Skip to content

Commit 7d24cec

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

File tree

1 file changed

+47
-10
lines changed

1 file changed

+47
-10
lines changed

lib/rspec_api_documentation/writers/open_api_writer.rb

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -188,10 +188,45 @@ 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+
parameters.values + extract_unknown_parameters(example, query: false)
195230
end
196231

197232
def extract_request_body(example)
@@ -210,7 +245,7 @@ def extract_request_body(example)
210245

211246
schema = get_schema(body)
212247
example.extended_parameters.select { |p| p[:in].nil? }.each do |parameter|
213-
inject_body_parameter(schema, parameter)
248+
inject_schema_parameter(schema, parameter)
214249
end
215250

216251
OpenApi::RequestBody.new(
@@ -225,6 +260,7 @@ def extract_parameter(opts)
225260
OpenApi::Parameter.new(
226261
name: opts[:name],
227262
in: opts[:in],
263+
style: opts[:style],
228264
description: opts[:description],
229265
required: opts[:required],
230266
deprecated: opts[:deprecated],
@@ -233,10 +269,10 @@ def extract_parameter(opts)
233269
)
234270
end
235271

236-
def extract_unknown_parameters(example)
272+
def extract_unknown_parameters(example, query: true, headers: true)
237273
parameters = []
238274
example.requests.each do |req|
239-
req[:request_query_parameters].each do |name, value|
275+
query && req[:request_query_parameters].each do |name, value|
240276
parameters.push(OpenApi::Parameter.new(
241277
name: name,
242278
in: :query,
@@ -245,7 +281,7 @@ def extract_unknown_parameters(example)
245281
example: value
246282
))
247283
end
248-
req[:request_headers].each do |name, value|
284+
headers && req[:request_headers].each do |name, value|
249285
parameters.push(OpenApi::Parameter.new(
250286
name: name,
251287
in: :header,
@@ -262,7 +298,7 @@ def extract_known_parameters(parameters)
262298
.map { |parameter| extract_parameter(parameter) }
263299
end
264300

265-
def inject_body_parameter(schema, parameter)
301+
def inject_schema_parameter(schema, parameter)
266302
scope = schema
267303
parameter[:scope] && Array(parameter[:scope]).each do |curr|
268304
scope.properties[curr.to_s] ||= OpenApi::Schema.new(type: 'object', properties: {})
@@ -272,8 +308,9 @@ def inject_body_parameter(schema, parameter)
272308
return unless scope.properties
273309

274310
if parameter[:required]
311+
name = parameter[:name].to_s
275312
scope.required ||= []
276-
scope.required << parameter[:name].to_s
313+
scope.required << name unless scope.required.include?(name)
277314
end
278315

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

0 commit comments

Comments
 (0)