@@ -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