@@ -207,11 +207,8 @@ def response_object(route, options)
207
207
208
208
next build_file_response ( memo [ value [ :code ] ] ) if file_response? ( value [ :model ] )
209
209
210
- if memo . key? ( 200 ) && route . request_method == 'DELETE' && value [ :model ] . nil?
211
- memo [ 204 ] = memo . delete ( 200 )
212
- value [ :code ] = 204
213
- next
214
- end
210
+ next build_delete_response ( memo , value ) if delete_response? ( memo , route , value )
211
+ next build_response_for_type_parameter ( memo , route , value , options ) if value [ :type ]
215
212
216
213
# Explicitly request no model with { model: '' }
217
214
next if value [ :model ] == ''
@@ -284,6 +281,15 @@ def default_code_from_route(route)
284
281
[ default_code ]
285
282
end
286
283
284
+ def build_delete_response ( memo , value )
285
+ memo [ 204 ] = memo . delete ( 200 )
286
+ value [ :code ] = 204
287
+ end
288
+
289
+ def delete_response? ( memo , route , value )
290
+ memo . key? ( 200 ) && route . request_method == 'DELETE' && value [ :model ] . nil?
291
+ end
292
+
287
293
def build_memo_schema ( memo , route , value , response_model , options )
288
294
if memo [ value [ :code ] ] [ :schema ] && value [ :as ]
289
295
memo [ value [ :code ] ] [ :schema ] [ :properties ] . merge! ( build_reference ( route , value , response_model , options ) )
@@ -304,6 +310,29 @@ def build_memo_schema(memo, route, value, response_model, options)
304
310
end
305
311
end
306
312
313
+ def build_response_for_type_parameter ( memo , _route , value , _options )
314
+ type , format = prepare_type_and_format ( value )
315
+
316
+ if memo [ value [ :code ] ] . include? ( :schema ) && value . include? ( :as )
317
+ memo [ value [ :code ] ] [ :schema ] [ :properties ] . merge! ( value [ :as ] => { type : type , format : format } . compact )
318
+ elsif value . include? ( :as )
319
+ memo [ value [ :code ] ] [ :schema ] =
320
+ { type : :object , properties : { value [ :as ] => { type : type , format : format } . compact } }
321
+ else
322
+ memo [ value [ :code ] ] [ :schema ] = { type : type }
323
+ end
324
+ end
325
+
326
+ def prepare_type_and_format ( value )
327
+ data_type = GrapeSwagger ::DocMethods ::DataType . call ( value [ :type ] )
328
+
329
+ if GrapeSwagger ::DocMethods ::DataType . primitive? ( data_type )
330
+ GrapeSwagger ::DocMethods ::DataType . mapping ( data_type )
331
+ else
332
+ data_type
333
+ end
334
+ end
335
+
307
336
def build_reference ( route , value , response_model , settings )
308
337
# TODO: proof that the definition exist, if model isn't specified
309
338
reference = if value . key? ( :as )
@@ -387,7 +416,7 @@ def get_path_params(stackable_values)
387
416
return param unless stackable_values
388
417
return params unless stackable_values . is_a? Grape ::Util ::StackableValues
389
418
390
- stackable_values &.new_values &.dig ( :namespace ) &.each do |namespace |
419
+ stackable_values &.new_values &.dig ( :namespace ) &.each do |namespace | # rubocop:disable Style/SafeNavigationChainLength
391
420
space = namespace . space . to_s . gsub ( ':' , '' )
392
421
params [ space ] = namespace . options || { }
393
422
end
@@ -464,6 +493,7 @@ def success_code_from_entity(route, entity)
464
493
default_code [ :as ] = entity [ :as ] if entity [ :as ]
465
494
default_code [ :is_array ] = entity [ :is_array ] if entity [ :is_array ]
466
495
default_code [ :required ] = entity [ :required ] if entity [ :required ]
496
+ default_code [ :type ] = entity [ :type ] if entity [ :type ]
467
497
else
468
498
default_code = GrapeSwagger ::DocMethods ::StatusCodes . get [ route . request_method . downcase . to_sym ]
469
499
default_code [ :model ] = entity if entity
0 commit comments