@@ -207,11 +207,8 @@ def response_object(route, options)
207207
208208 next build_file_response ( memo [ value [ :code ] ] ) if file_response? ( value [ :model ] )
209209
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 ]
215212
216213 # Explicitly request no model with { model: '' }
217214 next if value [ :model ] == ''
@@ -284,6 +281,15 @@ def default_code_from_route(route)
284281 [ default_code ]
285282 end
286283
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+
287293 def build_memo_schema ( memo , route , value , response_model , options )
288294 if memo [ value [ :code ] ] [ :schema ] && value [ :as ]
289295 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)
304310 end
305311 end
306312
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+
307336 def build_reference ( route , value , response_model , settings )
308337 # TODO: proof that the definition exist, if model isn't specified
309338 reference = if value . key? ( :as )
@@ -387,7 +416,7 @@ def get_path_params(stackable_values)
387416 return param unless stackable_values
388417 return params unless stackable_values . is_a? Grape ::Util ::StackableValues
389418
390- stackable_values &.new_values &.dig ( :namespace ) &.each do |namespace |
419+ stackable_values &.new_values &.dig ( :namespace ) &.each do |namespace | # rubocop:disable Style/SafeNavigationChainLength
391420 space = namespace . space . to_s . gsub ( ':' , '' )
392421 params [ space ] = namespace . options || { }
393422 end
@@ -464,6 +493,7 @@ def success_code_from_entity(route, entity)
464493 default_code [ :as ] = entity [ :as ] if entity [ :as ]
465494 default_code [ :is_array ] = entity [ :is_array ] if entity [ :is_array ]
466495 default_code [ :required ] = entity [ :required ] if entity [ :required ]
496+ default_code [ :type ] = entity [ :type ] if entity [ :type ]
467497 else
468498 default_code = GrapeSwagger ::DocMethods ::StatusCodes . get [ route . request_method . downcase . to_sym ]
469499 default_code [ :model ] = entity if entity
0 commit comments