Skip to content

Commit 49fed72

Browse files
authored
Add Support for default response. (#868)
* Add Support for default response. support default as a response code as specified in https://swagger.io/docs/specification/2-0/describing-responses/ Default Response section. * add docs
1 parent 3f309db commit 49fed72

File tree

4 files changed

+68
-5
lines changed

4 files changed

+68
-5
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#### Features
44

55
* [#872](https://github.com/ruby-grape/grape-swagger/pull/872): Add `consumes` and `produces` options to `add_swagger_documentation` - [@spaceraccoon](https://github.com/spaceraccoon)
6+
* [#868](https://github.com/ruby-grape/grape-swagger/pull/868): Add `default` endpoint option to specify default response - [@dhruvCW](https://github.com/dhruvCW)
67
* Your contribution here.
78

89
#### Fixes

README.md

+44
Original file line numberDiff line numberDiff line change
@@ -1042,6 +1042,50 @@ end
10421042
}
10431043
```
10441044

1045+
#### Default response <a name="default-response"></a>
1046+
1047+
By setting the `default` option you can also define a default response that is the result returned for all unspecified status codes.
1048+
The definition supports the same syntax as `success` or `failure`.
1049+
1050+
In the following cases, the schema ref would be taken from route.
1051+
1052+
```ruby
1053+
desc 'thing', default: { message: 'the default response' }
1054+
get '/thing' do
1055+
# ...
1056+
end
1057+
```
1058+
The generated swagger section will be something like
1059+
1060+
```json
1061+
"responses": {
1062+
"default": {
1063+
"description": "the default response"
1064+
}
1065+
},
1066+
```
1067+
Just like with `success` or `failure` you can also provide a `model` parameter.
1068+
1069+
```ruby
1070+
desc 'Get a list of stuff',
1071+
default: { model: Entities::UseResponse, message: 'the default response' }
1072+
get do
1073+
# your code comes here
1074+
end
1075+
```
1076+
The generated swagger document will then correctly reference the model schema.
1077+
1078+
```json
1079+
"responses": {
1080+
"default": {
1081+
"description": "the default response",
1082+
"schema": {
1083+
"$ref": "#/definitions/UseResponse"
1084+
}
1085+
}
1086+
},
1087+
```
1088+
10451089

10461090
#### Extensions <a name="extensions"></a>
10471091

lib/grape-swagger/endpoint.rb

+19-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
require 'grape-swagger/endpoint/params_parser'
66

77
module Grape
8-
class Endpoint
8+
class Endpoint # rubocop:disable Metrics/ClassLength
99
def content_types_for(target_class)
1010
content_types = (target_class.content_types || {}).values
1111

@@ -241,7 +241,8 @@ def http_codes_from_route(route)
241241
if route.http_codes.is_a?(Array) && route.http_codes.any? { |code| success_code?(code) }
242242
route.http_codes.clone
243243
else
244-
success_codes_from_route(route) + (route.http_codes || route.options[:failure] || [])
244+
success_codes_from_route(route) + default_code_from_route(route) +
245+
(route.http_codes || route.options[:failure] || [])
245246
end
246247
end
247248

@@ -268,6 +269,21 @@ def tag_object(route, path)
268269

269270
private
270271

272+
def default_code_from_route(route)
273+
entity = route.options[:default_response]
274+
return [] if entity.nil?
275+
276+
default_code = { code: 'default', message: 'Default Response' }
277+
if entity.is_a?(Hash)
278+
default_code[:message] = entity[:message] || default_code[:message]
279+
default_code[:model] = entity[:model] if entity[:model].present?
280+
else
281+
default_code[:model] = entity
282+
end
283+
284+
[default_code]
285+
end
286+
271287
def build_memo_schema(memo, route, value, response_model, options)
272288
if memo[value[:code]][:schema] && value[:as]
273289
memo[value[:code]][:schema][:properties].merge!(build_reference(route, value, response_model, options))
@@ -295,7 +311,7 @@ def build_reference(route, value, response_model, settings)
295311
else
296312
build_reference_hash(response_model)
297313
end
298-
return reference unless value[:code] < 300
314+
return reference unless value[:code] == 'default' || value[:code] < 300
299315

300316
if value.key?(:as) && value.key?(:is_array)
301317
reference[value[:as]] = build_reference_array(reference[value[:as]])

spec/swagger_v2/api_swagger_v2_response_with_models_spec.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ class ResponseApiModels < Grape::API
1515
failure: [
1616
{ code: 400, message: 'NotFound', model: '' },
1717
{ code: 404, message: 'BadRequest', model: Entities::ApiError }
18-
]
18+
],
19+
default_response: { message: 'Error', model: Entities::ApiError }
1920
get '/use-response' do
2021
{ 'declared_params' => declared(params) }
2122
end
@@ -42,7 +43,8 @@ def app
4243
'responses' => {
4344
'200' => { 'description' => 'This returns something', 'schema' => { '$ref' => '#/definitions/UseResponse' } },
4445
'400' => { 'description' => 'NotFound' },
45-
'404' => { 'description' => 'BadRequest', 'schema' => { '$ref' => '#/definitions/ApiError' } }
46+
'404' => { 'description' => 'BadRequest', 'schema' => { '$ref' => '#/definitions/ApiError' } },
47+
'default' => { 'description' => 'Error', 'schema' => { '$ref' => '#/definitions/ApiError' } }
4648
},
4749
'tags' => ['use-response'],
4850
'operationId' => 'getUseResponse'

0 commit comments

Comments
 (0)