grape-swagger 1.5.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +3 -3
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -4
- data/README.md +64 -0
- data/lib/grape-swagger/endpoint.rb +22 -5
- data/lib/grape-swagger/version.rb +1 -1
- data/spec/issues/677_consumes_produces_add_swagger_documentation_options_spec.rb +100 -0
- data/spec/lib/oapi_tasks_spec.rb +1 -1
- data/spec/swagger_v2/api_documentation_spec.rb +1 -15
- data/spec/swagger_v2/api_swagger_v2_response_with_models_spec.rb +4 -2
- metadata +4 -4
- data/.ruby-gemset +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cff361f819d42d8c3f847c605a31190f82764da573728d043debfe312d30069
|
4
|
+
data.tar.gz: faada4385a0db1fec73606585085deec766991007a9f050df1f2c0bbd9e9e018
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a86553f29d5b5a338a0ac21d049845ab609ee4adc2864940813f61384a8bcc19c8b0a644bb484f2b79533a111ab16a51c192236b23f540ed672e5e7a161fb23
|
7
|
+
data.tar.gz: 9b5bc29e3ead5f683781cbc0418e3d18f4b056368885e470224bb57ebe03f4232725a971e8589e109240c949aad565e80d5b4ecd31e31f6e5721f0c86c8aaf2f
|
data/.github/workflows/ci.yml
CHANGED
@@ -18,7 +18,7 @@ jobs:
|
|
18
18
|
- uses: actions/checkout@v3
|
19
19
|
- uses: ruby/setup-ruby@v1
|
20
20
|
with:
|
21
|
-
ruby-version: '3.
|
21
|
+
ruby-version: '3.2'
|
22
22
|
bundler-cache: true
|
23
23
|
- name: Run rubocop
|
24
24
|
run: bundle exec rubocop --parallel --format progress
|
@@ -28,8 +28,8 @@ jobs:
|
|
28
28
|
needs: ['rubocop']
|
29
29
|
strategy:
|
30
30
|
matrix:
|
31
|
-
ruby-version: ['
|
32
|
-
grape-version: [1.6.2, 1.
|
31
|
+
ruby-version: ['3.0', '3.1', '3.2', 'head']
|
32
|
+
grape-version: [1.6.2, 1.7.0]
|
33
33
|
model-parser: [grape-swagger-entity, grape-swagger-representable, '']
|
34
34
|
steps:
|
35
35
|
- name: Check out branch
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -9,6 +9,14 @@
|
|
9
9
|
* Your contribution here.
|
10
10
|
|
11
11
|
|
12
|
+
### 1.6.0 (March 19, 2023)
|
13
|
+
|
14
|
+
#### Features
|
15
|
+
|
16
|
+
* [#872](https://github.com/ruby-grape/grape-swagger/pull/872): Add `consumes` and `produces` options to `add_swagger_documentation` - [@spaceraccoon](https://github.com/spaceraccoon)
|
17
|
+
* [#868](https://github.com/ruby-grape/grape-swagger/pull/868): Add `default` endpoint option to specify default response - [@dhruvCW](https://github.com/dhruvCW)
|
18
|
+
|
19
|
+
|
12
20
|
### 1.5.0 (July 28, 2022)
|
13
21
|
|
14
22
|
#### Features
|
data/Gemfile
CHANGED
@@ -2,11 +2,9 @@
|
|
2
2
|
|
3
3
|
source 'http://rubygems.org'
|
4
4
|
|
5
|
-
ruby RUBY_VERSION
|
6
|
-
|
7
5
|
gemspec
|
8
6
|
|
9
|
-
gem 'grape', case version = ENV.fetch('GRAPE_VERSION', '~> 1.
|
7
|
+
gem 'grape', case version = ENV.fetch('GRAPE_VERSION', '~> 1.7')
|
10
8
|
when 'HEAD'
|
11
9
|
{ git: 'https://github.com/ruby-grape/grape' }
|
12
10
|
else
|
@@ -21,7 +19,7 @@ group :development, :test do
|
|
21
19
|
gem 'pry', platforms: [:mri]
|
22
20
|
gem 'pry-byebug', platforms: [:mri]
|
23
21
|
|
24
|
-
gem 'rack', '~>
|
22
|
+
gem 'rack', '~> 3.0'
|
25
23
|
gem 'rack-cors'
|
26
24
|
gem 'rack-test'
|
27
25
|
gem 'rake'
|
data/README.md
CHANGED
@@ -206,6 +206,8 @@ end
|
|
206
206
|
* [array_use_braces](#array_use_braces)
|
207
207
|
* [api_documentation](#api_documentation)
|
208
208
|
* [specific_api_documentation](#specific_api_documentation)
|
209
|
+
* [consumes](#consumes)
|
210
|
+
* [produces](#produces)
|
209
211
|
|
210
212
|
You can pass a hash with optional configuration settings to ```add_swagger_documentation```.
|
211
213
|
The examples show the default value.
|
@@ -432,6 +434,24 @@ add_swagger_documentation \
|
|
432
434
|
specific_api_documentation: { desc: 'Reticulated splines API swagger-compatible endpoint documentation.' }
|
433
435
|
```
|
434
436
|
|
437
|
+
#### consumes
|
438
|
+
|
439
|
+
Customize the Swagger API default global `consumes` field value.
|
440
|
+
|
441
|
+
```ruby
|
442
|
+
add_swagger_documentation \
|
443
|
+
consumes: ['application/json', 'application/x-www-form-urlencoded']
|
444
|
+
```
|
445
|
+
|
446
|
+
#### produces
|
447
|
+
|
448
|
+
Customize the Swagger API default global `produces` field value.
|
449
|
+
|
450
|
+
```ruby
|
451
|
+
add_swagger_documentation \
|
452
|
+
produces: ['text/plain']
|
453
|
+
```
|
454
|
+
|
435
455
|
## Routes Configuration <a name="routes"></a>
|
436
456
|
|
437
457
|
* [Swagger Header Parameters](#headers)
|
@@ -1022,6 +1042,50 @@ end
|
|
1022
1042
|
}
|
1023
1043
|
```
|
1024
1044
|
|
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
|
+
|
1025
1089
|
|
1026
1090
|
#### Extensions <a name="extensions"></a>
|
1027
1091
|
|
@@ -5,7 +5,7 @@ require 'active_support/core_ext/string/inflections'
|
|
5
5
|
require 'grape-swagger/endpoint/params_parser'
|
6
6
|
|
7
7
|
module Grape
|
8
|
-
class Endpoint
|
8
|
+
class Endpoint # rubocop:disable Metrics/ClassLength
|
9
9
|
def content_types_for(target_class)
|
10
10
|
content_types = (target_class.content_types || {}).values
|
11
11
|
|
@@ -27,7 +27,8 @@ module Grape
|
|
27
27
|
object = {
|
28
28
|
info: info_object(options[:info].merge(version: options[:doc_version])),
|
29
29
|
swagger: '2.0',
|
30
|
-
produces: content_types_for(target_class),
|
30
|
+
produces: options[:produces] || content_types_for(target_class),
|
31
|
+
consumes: options[:consumes],
|
31
32
|
authorizations: options[:authorizations],
|
32
33
|
securityDefinitions: options[:security_definitions],
|
33
34
|
security: options[:security],
|
@@ -117,7 +118,7 @@ module Grape
|
|
117
118
|
method[:summary] = summary_object(route)
|
118
119
|
method[:description] = description_object(route)
|
119
120
|
method[:produces] = produces_object(route, options[:produces] || options[:format])
|
120
|
-
method[:consumes] = consumes_object(route, options[:format])
|
121
|
+
method[:consumes] = consumes_object(route, options[:consumes] || options[:format])
|
121
122
|
method[:parameters] = params_object(route, options, path)
|
122
123
|
method[:security] = security_object(route)
|
123
124
|
method[:responses] = response_object(route, options)
|
@@ -240,7 +241,8 @@ module Grape
|
|
240
241
|
if route.http_codes.is_a?(Array) && route.http_codes.any? { |code| success_code?(code) }
|
241
242
|
route.http_codes.clone
|
242
243
|
else
|
243
|
-
success_codes_from_route(route) + (route
|
244
|
+
success_codes_from_route(route) + default_code_from_route(route) +
|
245
|
+
(route.http_codes || route.options[:failure] || [])
|
244
246
|
end
|
245
247
|
end
|
246
248
|
|
@@ -267,6 +269,21 @@ module Grape
|
|
267
269
|
|
268
270
|
private
|
269
271
|
|
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
|
+
|
270
287
|
def build_memo_schema(memo, route, value, response_model, options)
|
271
288
|
if memo[value[:code]][:schema] && value[:as]
|
272
289
|
memo[value[:code]][:schema][:properties].merge!(build_reference(route, value, response_model, options))
|
@@ -294,7 +311,7 @@ module Grape
|
|
294
311
|
else
|
295
312
|
build_reference_hash(response_model)
|
296
313
|
end
|
297
|
-
return reference unless value[:code] < 300
|
314
|
+
return reference unless value[:code] == 'default' || value[:code] < 300
|
298
315
|
|
299
316
|
if value.key?(:as) && value.key?(:is_array)
|
300
317
|
reference[value[:as]] = build_reference_array(reference[value[:as]])
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe '#677 consumes and produces options are included in add_swagger_documentation options' do
|
6
|
+
describe 'no override' do
|
7
|
+
let(:app) do
|
8
|
+
Class.new(Grape::API) do
|
9
|
+
resource :accounts do
|
10
|
+
route_param :account_number, type: String do
|
11
|
+
resource :records do
|
12
|
+
route_param :id do
|
13
|
+
post do
|
14
|
+
{ message: 'hello world' }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
add_swagger_documentation \
|
22
|
+
format: :json
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
subject do
|
27
|
+
get '/swagger_doc'
|
28
|
+
JSON.parse(last_response.body)
|
29
|
+
end
|
30
|
+
|
31
|
+
specify do
|
32
|
+
expect(subject['paths']['/accounts/{account_number}/records/{id}']['post']['produces']).to eq ['application/json']
|
33
|
+
expect(subject['paths']['/accounts/{account_number}/records/{id}']['post']['consumes']).to eq ['application/json']
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'override produces' do
|
38
|
+
let(:app) do
|
39
|
+
Class.new(Grape::API) do
|
40
|
+
resource :accounts do
|
41
|
+
route_param :account_number, type: String do
|
42
|
+
resource :records do
|
43
|
+
route_param :id do
|
44
|
+
post do
|
45
|
+
{ message: 'hello world' }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
add_swagger_documentation \
|
53
|
+
format: :json,
|
54
|
+
produces: ['text/plain']
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
subject do
|
59
|
+
get '/swagger_doc'
|
60
|
+
JSON.parse(last_response.body)
|
61
|
+
end
|
62
|
+
|
63
|
+
specify do
|
64
|
+
expect(subject['paths']['/accounts/{account_number}/records/{id}']['post']['produces']).to eq ['text/plain']
|
65
|
+
expect(subject['paths']['/accounts/{account_number}/records/{id}']['post']['consumes']).to eq ['application/json']
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe 'override consumes' do
|
70
|
+
let(:app) do
|
71
|
+
Class.new(Grape::API) do
|
72
|
+
resource :accounts do
|
73
|
+
route_param :account_number, type: String do
|
74
|
+
resource :records do
|
75
|
+
route_param :id do
|
76
|
+
post do
|
77
|
+
{ message: 'hello world' }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
add_swagger_documentation \
|
85
|
+
format: :json, \
|
86
|
+
consumes: ['application/json', 'application/x-www-form-urlencoded']
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
subject do
|
91
|
+
get '/swagger_doc'
|
92
|
+
JSON.parse(last_response.body)
|
93
|
+
end
|
94
|
+
|
95
|
+
specify do
|
96
|
+
expect(subject['paths']['/accounts/{account_number}/records/{id}']['post']['produces']).to eq ['application/json']
|
97
|
+
expect(subject['paths']['/accounts/{account_number}/records/{id}']['post']['consumes']).to eq ['application/json', 'application/x-www-form-urlencoded']
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/spec/lib/oapi_tasks_spec.rb
CHANGED
@@ -30,7 +30,7 @@ RSpec.describe GrapeSwagger::Rake::OapiTasks do
|
|
30
30
|
|
31
31
|
describe '.new' do
|
32
32
|
it 'accepts class name as a constant' do
|
33
|
-
expect(described_class.new(
|
33
|
+
expect(described_class.new(Api::Base).send(:api_class)).to eq(Api::Base)
|
34
34
|
end
|
35
35
|
|
36
36
|
it 'accepts class name as a string' do
|
@@ -21,21 +21,7 @@ describe 'API with additional options' do
|
|
21
21
|
expect(subject).to eq(
|
22
22
|
[
|
23
23
|
{ description: 'Swagger compatible API description' },
|
24
|
-
{
|
25
|
-
description: 'Swagger compatible API description for specific API',
|
26
|
-
params: {
|
27
|
-
'locale' => {
|
28
|
-
desc: 'Locale of API documentation',
|
29
|
-
required: false,
|
30
|
-
type: 'Symbol'
|
31
|
-
},
|
32
|
-
'name' => {
|
33
|
-
desc: 'Resource name of mounted API',
|
34
|
-
required: true,
|
35
|
-
type: 'String'
|
36
|
-
}
|
37
|
-
}
|
38
|
-
}
|
24
|
+
{ description: 'Swagger compatible API description for specific API', params: {} }
|
39
25
|
]
|
40
26
|
)
|
41
27
|
end
|
@@ -15,7 +15,8 @@ describe 'response' do
|
|
15
15
|
failure: [
|
16
16
|
{ code: 400, message: 'NotFound', model: '' },
|
17
17
|
{ code: 404, message: 'BadRequest', model: Entities::ApiError }
|
18
|
-
]
|
18
|
+
],
|
19
|
+
default_response: { message: 'Error', model: Entities::ApiError }
|
19
20
|
get '/use-response' do
|
20
21
|
{ 'declared_params' => declared(params) }
|
21
22
|
end
|
@@ -42,7 +43,8 @@ describe 'response' do
|
|
42
43
|
'responses' => {
|
43
44
|
'200' => { 'description' => 'This returns something', 'schema' => { '$ref' => '#/definitions/UseResponse' } },
|
44
45
|
'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' } }
|
46
48
|
},
|
47
49
|
'tags' => ['use-response'],
|
48
50
|
'operationId' => 'getUseResponse'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grape-swagger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LeFnord
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-03-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: grape
|
@@ -40,7 +40,6 @@ files:
|
|
40
40
|
- ".rspec"
|
41
41
|
- ".rubocop.yml"
|
42
42
|
- ".rubocop_todo.yml"
|
43
|
-
- ".ruby-gemset"
|
44
43
|
- CHANGELOG.md
|
45
44
|
- CONTRIBUTING.md
|
46
45
|
- Dangerfile
|
@@ -96,6 +95,7 @@ files:
|
|
96
95
|
- spec/issues/587_range_parameter_delimited_by_dash_spec.rb
|
97
96
|
- spec/issues/605_root_route_documentation_spec.rb
|
98
97
|
- spec/issues/650_params_array_spec.rb
|
98
|
+
- spec/issues/677_consumes_produces_add_swagger_documentation_options_spec.rb
|
99
99
|
- spec/issues/680_keep_204_error_schemas_spec.rb
|
100
100
|
- spec/issues/751_deeply_nested_objects_spec.rb
|
101
101
|
- spec/issues/776_multiple_presents_spec.rb
|
@@ -206,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
206
|
- !ruby/object:Gem::Version
|
207
207
|
version: '0'
|
208
208
|
requirements: []
|
209
|
-
rubygems_version: 3.
|
209
|
+
rubygems_version: 3.4.7
|
210
210
|
signing_key:
|
211
211
|
specification_version: 4
|
212
212
|
summary: Add auto generated documentation to your Grape API that can be displayed
|
data/.ruby-gemset
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
grape-swagger
|