Skip to content

Commit 4573a82

Browse files
charanpanchagnulaLeFnord
authored andcommitted
Allow multiple success responses (#747)
* Allow multiple success responses - Issue# 674 * Adding documentation in README for multiple values in success for response * Making a slight change in the documentation
1 parent 2263ece commit 4573a82

File tree

4 files changed

+96
-12
lines changed

4 files changed

+96
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#### Fixes
88

99
* Your contribution here.
10+
* [#747](https://github.com/ruby-grape/grape-swagger/pull/747): Allow multiple different success responses - [@charanftp3](https://github.com/charanpanchagnula).
1011
* [#746](https://github.com/ruby-grape/grape-swagger/pull/746): Fix path with optional format - [@fnordfish](https://github.com/fnordfish).
1112
* [#743](https://github.com/ruby-grape/grape-swagger/pull/743): CI: use 2.4.6, 2.5.5 - [@olleolleolle](https://github.com/olleolleolle).
1213
* [#737](https://github.com/ruby-grape/grape-swagger/pull/737): Add swagger endpoint guard to both doc endpoints - [@urkle](https://github.com/urkle).

README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,45 @@ end
900900
},
901901
```
902902

903+
#### Multiple status codes for response <a name="multiple-status-response"></a>
904+
905+
Multiple values can be provided for `success` and `failure` attributes in the response.
906+
907+
```ruby
908+
desc 'Attach a field to an entity through a PUT',
909+
success: [
910+
{ code: 201, model: Entities::UseResponse, message: 'Successfully created' },
911+
{ code: 204, message: 'Already exists' }
912+
],
913+
failure: [
914+
{ code: 400, message: 'Bad request' },
915+
{ code: 404, message: 'Not found' }
916+
]
917+
put do
918+
# your code comes here
919+
end
920+
```
921+
922+
```json
923+
"responses": {
924+
"201": {
925+
"description": "Successfully created",
926+
"schema": {
927+
"$ref": "#/definitions/UseResponse"
928+
}
929+
},
930+
"204": {
931+
"description": "Already exists"
932+
},
933+
"400": {
934+
"description": "Bad request"
935+
},
936+
"404": {
937+
"description": "Not found"
938+
}
939+
},
940+
```
941+
903942

904943
#### File response <a name="file-response"></a>
905944

lib/grape-swagger/endpoint.rb

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -238,20 +238,13 @@ def http_codes_from_route(route)
238238
end
239239

240240
def success_codes_from_route(route)
241-
default_code = GrapeSwagger::DocMethods::StatusCodes.get[route.request_method.downcase.to_sym]
242-
if @entity.is_a?(Hash)
243-
default_code[:code] = @entity[:code] if @entity[:code].present?
244-
default_code[:model] = @entity[:model] if @entity[:model].present?
245-
default_code[:message] = @entity[:message] || route.description || default_code[:message].sub('{item}', @item)
246-
default_code[:examples] = @entity[:examples] if @entity[:examples]
247-
default_code[:headers] = @entity[:headers] if @entity[:headers]
248-
else
249-
default_code = GrapeSwagger::DocMethods::StatusCodes.get[route.request_method.downcase.to_sym]
250-
default_code[:model] = @entity if @entity
251-
default_code[:message] = route.description || default_code[:message].sub('{item}', @item)
241+
if @entity.is_a?(Array)
242+
return @entity.map do |entity|
243+
success_code_from_entity(route, entity)
244+
end
252245
end
253246

254-
[default_code]
247+
[success_code_from_entity(route, @entity)]
255248
end
256249

257250
def tag_object(route, path)
@@ -350,5 +343,22 @@ def hidden?(route, options)
350343

351344
options[:token_owner] ? route_hidden.call(send(options[:token_owner].to_sym)) : route_hidden.call
352345
end
346+
347+
def success_code_from_entity(route, entity)
348+
default_code = GrapeSwagger::DocMethods::StatusCodes.get[route.request_method.downcase.to_sym]
349+
if entity.is_a?(Hash)
350+
default_code[:code] = entity[:code] if entity[:code].present?
351+
default_code[:model] = entity[:model] if entity[:model].present?
352+
default_code[:message] = entity[:message] || route.description || default_code[:message].sub('{item}', @item)
353+
default_code[:examples] = entity[:examples] if entity[:examples]
354+
default_code[:headers] = entity[:headers] if entity[:headers]
355+
else
356+
default_code = GrapeSwagger::DocMethods::StatusCodes.get[route.request_method.downcase.to_sym]
357+
default_code[:model] = entity if entity
358+
default_code[:message] = route.description || default_code[:message].sub('{item}', @item)
359+
end
360+
361+
default_code
362+
end
353363
end
354364
end

spec/swagger_v2/api_swagger_v2_response_spec.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ class ResponseApi < Grape::API
3131
{ 'declared_params' => declared(params) }
3232
end
3333

34+
desc 'This returns something',
35+
success: [
36+
{ code: 200, message: 'Request has succeeded' },
37+
{ code: 201, message: 'Successful Operation' },
38+
{ code: 204, message: 'Request was fulfilled' }
39+
],
40+
failure: [{ code: 400, message: 'NotFound', model: Entities::ApiError }]
41+
get '/multiple-success-responses' do
42+
{ 'declared_params' => declared(params) }
43+
end
44+
3445
add_swagger_documentation
3546
end
3647
end
@@ -106,4 +117,27 @@ def app
106117
expect(subject['definitions']).to eql(swagger_params_as_response_object)
107118
end
108119
end
120+
121+
describe 'uses params as response object when response contains multiple values for success' do
122+
subject do
123+
get '/swagger_doc/multiple-success-responses'
124+
JSON.parse(last_response.body)
125+
end
126+
127+
specify do
128+
expect(subject['paths']['/multiple-success-responses']['get']).to eql(
129+
'description' => 'This returns something',
130+
'produces' => ['application/json'],
131+
'responses' => {
132+
'200' => { 'description' => 'Request has succeeded' },
133+
'201' => { 'description' => 'Successful Operation' },
134+
'204' => { 'description' => 'Request was fulfilled' },
135+
'400' => { 'description' => 'NotFound', 'schema' => { '$ref' => '#/definitions/ApiError' } }
136+
},
137+
'tags' => ['multiple-success-responses'],
138+
'operationId' => 'getMultipleSuccessResponses'
139+
)
140+
expect(subject['definitions']).to eql(swagger_params_as_response_object)
141+
end
142+
end
109143
end

0 commit comments

Comments
 (0)