grape-swagger 0.22.0 → 0.23.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 96f5daf8e980cca96f1dc18f0a7dad2faf86b1f3
4
- data.tar.gz: 665c50fb9409756ff95f526b2a13600a37db8a40
3
+ metadata.gz: 1c9531be292e7a5a8d3ee086291e248f42f13457
4
+ data.tar.gz: 8f7cea40f42d1bb5a474f3468000c837eb540699
5
5
  SHA512:
6
- metadata.gz: f4e73ba96c6060cd24e22733de9160f267d72fdd9bc73f8baf76ecb6fe31ac908dab1506171ea6a9384631140ea338768fe7452513c6fbc9eb4a81ae70bc4819
7
- data.tar.gz: 6d1a9f3df56f08ade9c36f43573a669b9a3a3c1172218cd02dc885dcee3e99897500249bcc5340b6cb4bb3dabafd098a1c529bd1ebf9e07eb50a212630409bb0
6
+ metadata.gz: 133c28324c1637b9117e06e33e4585df7b3c072dba7432784550b1c309b24b1635abd18f97a06ce43b9c9650176a7df7bccb0a4d7ddb4cc80d61ac7ddbd067a1
7
+ data.tar.gz: 238698df89fbb172922f2224652eddff2fc26d89c593fb90f787bab4293def4d32bcdfd929200c7ef1770b6c33a486feb7435763bae9eb8708e83992c927cd2f
@@ -28,7 +28,7 @@ Metrics/AbcSize:
28
28
  # Offense count: 3
29
29
  # Configuration parameters: CountComments.
30
30
  Metrics/ClassLength:
31
- Max: 220
31
+ Max: 226
32
32
 
33
33
  # Offense count: 10
34
34
  Metrics/CyclomaticComplexity:
@@ -4,32 +4,32 @@ sudo: false
4
4
 
5
5
  matrix:
6
6
  include:
7
+ - rvm: 2.3.1
8
+ script:
9
+ - bundle exec danger
7
10
  - rvm: 2.3.1
8
11
  env: MODEL_PARSER=grape-swagger-entity
9
12
  - rvm: 2.3.1
10
13
  env: MODEL_PARSER=grape-swagger-representable
11
- - rvm: 2.3.1
12
- env: GRAPE_VERSION=0.12.0
13
- - rvm: 2.3.1
14
- env: GRAPE_VERSION=0.13.0
15
14
  - rvm: 2.3.1
16
15
  env: GRAPE_VERSION=0.14.0
17
16
  - rvm: 2.3.1
18
17
  env: GRAPE_VERSION=0.15.0
19
18
  - rvm: 2.3.1
20
19
  env: GRAPE_VERSION=0.16.2
20
+ - rvm: 2.3.1
21
+ env: GRAPE_VERSION=0.17.0
21
22
  - rvm: 2.3.1
22
23
  env: GRAPE_VERSION=HEAD
23
24
  - rvm: 2.3.0
24
25
  - rvm: 2.2
25
26
  - rvm: 2.1
26
27
  - rvm: ruby-head
27
- - rvm: rbx-2
28
- - rvm: jruby-9.0.5.0
29
- - rvm: jruby-19mode
28
+ - rvm: jruby-9.1.2.0
30
29
  - rvm: jruby-head
30
+ - rvm: rbx-2
31
31
  allow_failures:
32
32
  - rvm: ruby-head
33
- - rvm: rbx-2
34
- - rvm: jruby-19mode
33
+ - rvm: jruby-9.1.2.0
35
34
  - rvm: jruby-head
35
+ - rvm: rbx-2
@@ -8,6 +8,21 @@
8
8
 
9
9
  * Your contribution here.
10
10
 
11
+ ### 0.23.0 (August 5, 2016)
12
+
13
+ #### Features
14
+
15
+ * [#491](https://github.com/ruby-grape/grape/pull/491): Add `ignore_defaults` option - [@pezholio](https://github.com/pezholio).
16
+ * [#486](https://github.com/ruby-grape/grape/pull/486): Use an automated PR linter, [danger.systems](http://danger.systems) - [@dblock](https://github.com/dblock).
17
+
18
+ #### Fixes
19
+
20
+ * [#489](https://github.com/ruby-grape/grape-swagger/pull/489): Makes version settings/usage more clear; updates `UPGRADE.md`, `README.md` - [@LeFnord](https://github.com/LeFnord).
21
+ * [#476](https://github.com/ruby-grape/grape-swagger/pull/476): Fixes for handling the parameter type when body parameters are defined inside desc block - [@anakinj](https://github.com/anakinj).
22
+ * [#478](https://github.com/ruby-grape/grape-swagger/pull/478): Refactors building of properties, corrects documentation of array items - [@LeFnord](https://github.com/LeFnord).
23
+ * [#479](https://github.com/ruby-grape/grape-swagger/pull/479): Fix regex for Array and Multi Type in doc_methods. Parsing of "[APoint]" should return "APoint" - [@frodrigo](https://github.com/frodrigo).
24
+ * [#483](https://github.com/ruby-grape/grape-swagger/pull/483): Added support for nicknamed routes - [@pbendersky](https://github.com/pbendersky).
25
+
11
26
  ### 0.22.0 (July 12, 2016)
12
27
 
13
28
  #### Features
@@ -27,10 +42,10 @@
27
42
  * [#455](https://github.com/ruby-grape/grape-swagger/pull/455): Setting `type:` option as `Array[Class]` creates `array` type in JSON - [@tyspring](https://github.com/tyspring).
28
43
  * [#450](https://github.com/ruby-grape/grape-swagger/pull/438): Do not add :description to definitions if :description is missing on path - [@texpert](https://github.com/texpert).
29
44
  * [#447](https://github.com/ruby-grape/grape-swagger/pull/447): Version part of the url is now ignored when generating tags for endpoint - [@anakinj](https://github.com/anakinj).
30
- * [#444](https://github.com/ruby-grape/grape-swagger//pull/444): Default value provided in the documentation hash, override the grape default [@scauglog](https://github.com/scauglog).
31
- * [#443](https://github.com/ruby-grape/grape-swagger/issues/443): Type provided in the documentation hash, override the grape type [@scauglog](https://github.com/scauglog).
45
+ * [#444](https://github.com/ruby-grape/grape-swagger/pull/444): Default value provided in the documentation hash, override the grape default - [@scauglog](https://github.com/scauglog).
46
+ * [#443](https://github.com/ruby-grape/grape-swagger/issues/443): Type provided in the documentation hash, override the grape type - [@scauglog](https://github.com/scauglog).
32
47
  * [#454](https://github.com/ruby-grape/grape-swagger/pull/454): Include documented Hashes in documentation output - [@aschuster3](https://github.com/aschuster3).
33
- * [#457](https://github.com/ruby-grape/grape-swagger/issues/457): Using camel case on namespace throws exception on add_swagger_documentation method - [@rayko](https://github.com/rayko/).
48
+ * [#457](https://github.com/ruby-grape/grape-swagger/issues/457): Using camel case on namespace throws exception on add_swagger_documentation method - [@rayko](https://github.com/rayko).
34
49
 
35
50
  ### 0.21.0 (June 1, 2016)
36
51
 
@@ -167,7 +182,7 @@
167
182
  * [#136](https://github.com/ruby-grape/grape-swagger/pull/136), [#94](https://github.com/ruby-grape/grape-swagger/pull/94): Recurse combination of namespaces when using mounted apps - [@renier](https://github.com/renier).
168
183
  * [#100](https://github.com/ruby-grape/grape-swagger/pull/100): Added ability to specify a nickname for an endpoint - [@lhorne](https://github.com/lhorne).
169
184
  * [#94](https://github.com/ruby-grape/grape-swagger/pull/94): Added support for namespace descriptions - [@renier](https://github.com/renier).
170
- * [#110](https://github.com/ruby-grape/grape-swagger/pull/110), [#111](https://github.com/ruby-grape/grape-swagger/pull/111) - Added `responseModel` support - [@bagilevi](https://github.com/bagilevi).
185
+ * [#110](https://github.com/ruby-grape/grape-swagger/pull/110), [#111](https://github.com/ruby-grape/grape-swagger/pull/111): Added `responseModel` support - [@bagilevi](https://github.com/bagilevi).
171
186
  * [#114](https://github.com/ruby-grape/grape-swagger/pull/114): Added support for generating nested models from composed Grape Entities - [@dspaeth-faber](https://github.com/dspaeth-faber).
172
187
  * [#124](https://github.com/ruby-grape/grape-swagger/pull/124): Added ability to change the description and parameters of the API endpoints generated by grape-swagger - [@dblock](https://github.com/dblock).
173
188
  * [#128](https://github.com/ruby-grape/grape-swagger/pull/128): Combine global models and endpoint entities - [@dspaeth-faber](https://github.com/dspaeth-faber).
@@ -0,0 +1 @@
1
+ # inherits from https://github.com/ruby-grape/danger
data/Gemfile CHANGED
@@ -2,7 +2,7 @@ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- case version = ENV['GRAPE_VERSION'] || '~> 0.16.2'
5
+ case version = ENV['GRAPE_VERSION'] || '~> 0.17.0'
6
6
  when 'HEAD'
7
7
  gem 'grape', github: 'ruby-grape/grape'
8
8
  else
@@ -15,3 +15,5 @@ if RUBY_VERSION < '2.2.2'
15
15
  gem 'rack', '<2.0.0'
16
16
  gem 'activesupport', '<5.0.0'
17
17
  end
18
+
19
+ gem 'danger', '~> 2.1', require: false
data/README.md CHANGED
@@ -199,8 +199,7 @@ end
199
199
 
200
200
 
201
201
  You can pass a hash with optional configuration settings to ```add_swagger_documentation```.
202
-
203
- *not all configuration options supported yet*, but is WIP
202
+ The examples shows the default value.
204
203
 
205
204
 
206
205
  The `host` and `base_path` options also accept a `proc` or `lambda` to evaluate, which is passed a [request](http://www.rubydoc.info/github/rack/rack/Rack/Request) object:
@@ -223,7 +222,7 @@ add_swagger_documentation \
223
222
  Base path of the API that's being exposed, default would be taken from `request`.
224
223
  ```ruby
225
224
  add_swagger_documentation \
226
- base_path: '/super/api'
225
+ base_path: nil
227
226
  ```
228
227
 
229
228
  `host` and `base_path` are also accepting a `proc` or `lambda`
@@ -233,14 +232,14 @@ add_swagger_documentation \
233
232
  The path where the API documentation is loaded, default is: `/swagger_doc`.
234
233
  ```ruby
235
234
  add_swagger_documentation \
236
- mount_path: '/docu'
235
+ mount_path: '/swagger_doc'
237
236
  ```
238
237
 
239
238
  #### add_base_path:
240
239
  Add `basePath` key to the documented path keys, default is: `false`.
241
240
  ```ruby
242
241
  add_swagger_documentation \
243
- add_base_path: true
242
+ add_base_path: true # only if base_path given
244
243
  ```
245
244
 
246
245
  #### add_version:
@@ -249,7 +248,7 @@ here the version is the API version, specified by `grape` in [`path`](https://gi
249
248
 
250
249
  ```ruby
251
250
  add_swagger_documentation \
252
- add_version: false
251
+ add_version: true
253
252
  ```
254
253
 
255
254
  <a name="doc_version" />
@@ -289,9 +288,6 @@ add_swagger_documentation \
289
288
  }
290
289
  ```
291
290
 
292
- #### *authorizations*:
293
- This value is added to the `authorizations` key in the JSON documentation.
294
-
295
291
  <a name="models" />
296
292
  #### models:
297
293
  A list of entities to document. Combine with the [grape-entity](https://github.com/ruby-grape/grape-entity) gem.
@@ -333,6 +329,8 @@ add_swagger_documentation \
333
329
 
334
330
  A hash merged into the `info` key of the JSON documentation.
335
331
 
332
+ <!-- #### *authorizations*:
333
+ This value is added to the `authorizations` key in the JSON documentation. -->
336
334
 
337
335
  <!-- #### *api_documentation*:
338
336
  Customize the Swagger API documentation route, typically contains a `desc` field. The default description is "Swagger compatible API description".
@@ -10,6 +10,22 @@ gem 'grape-swagger'
10
10
  gem 'grape-swagger-entity'
11
11
  ```
12
12
 
13
+ `add_swagger_documentation` has changed from
14
+ ``` ruby
15
+ add_swagger_documentation \
16
+ api_version: '0.0.1'
17
+ ```
18
+ to
19
+
20
+ ``` ruby
21
+ add_swagger_documentation \
22
+ doc_version: '0.0.1'
23
+ ```
24
+
25
+ The API version self, would be set by grape, see -> [spec for #403](https://github.com/ruby-grape/grape-swagger/blob/master/spec/issues/403_versions_spec.rb).
26
+
27
+
28
+
13
29
  ### Upgrading to >= 0.10.2
14
30
 
15
31
  With grape >= 0.12.0, support for `notes` is replaced by passing a block `detail` option specified. For future compatibility, update your code:
@@ -32,7 +32,7 @@ module GrapeSwagger
32
32
  def parse_multi_type(raw_data_type)
33
33
  case raw_data_type
34
34
  when /\A\[.*\]\z/
35
- raw_data_type.gsub(/[(\A\[)(\s+)(\]\z)]/, '').split(',').first
35
+ raw_data_type.gsub(/[\[\s+\]]/, '').split(',').first
36
36
  when Array
37
37
  raw_data_type.first
38
38
  else
@@ -33,7 +33,7 @@ module GrapeSwagger
33
33
  end
34
34
 
35
35
  def move_params_to_new(definition, params)
36
- params, nested_params = params.partition { |x| !x[:name].include?('[') }
36
+ params, nested_params = params.partition { |x| !x[:name].to_s.include?('[') }
37
37
 
38
38
  unless params.blank?
39
39
  properties, required = build_properties(params)
@@ -44,6 +44,39 @@ module GrapeSwagger
44
44
  add_properties_to_definition(definition, nested_properties, []) unless nested_params.blank?
45
45
  end
46
46
 
47
+ def build_properties(params)
48
+ properties = {}
49
+ required = []
50
+
51
+ prepare_nested_types(params) if should_expose_as_array?(params)
52
+
53
+ params.each do |param|
54
+ name = param[:name].to_sym
55
+
56
+ properties[name] = if should_expose_as_array?([param])
57
+ document_as_array(param)
58
+ else
59
+ document_as_property(param)
60
+ end
61
+
62
+ required << name if deletable?(param) && param[:required]
63
+ end
64
+
65
+ [properties, required]
66
+ end
67
+
68
+ def document_as_array(param)
69
+ {}.tap do |property|
70
+ property[:type] = 'array'
71
+ property[:description] = param.delete(:description) unless param[:description].nil?
72
+ property[:items] = document_as_property(param)[:items]
73
+ end
74
+ end
75
+
76
+ def document_as_property(param)
77
+ property_keys.each_with_object({}) { |x, memo| memo[x] = param[x] if param[x].present? }
78
+ end
79
+
47
80
  def build_nested_properties(params, properties = {})
48
81
  property = params.bsearch { |x| x[:name].include?('[') }[:name].split('[').first
49
82
 
@@ -94,41 +127,6 @@ module GrapeSwagger
94
127
  definition[:required].push(*value)
95
128
  end
96
129
 
97
- def build_properties(params)
98
- properties = {}
99
- required = []
100
-
101
- prepare_nested_types(params) if should_expose_as_array?(params)
102
-
103
- params.each do |param|
104
- name = param[:name].to_sym
105
- properties[name] = {}
106
-
107
- if should_expose_as_array?([param])
108
- prepare_nested_types([param])
109
-
110
- properties[name][:type] = 'array'
111
- properties[name][:items] = {}
112
- properties[name][:items].tap do |x|
113
- property_keys.each do |attribute|
114
- x[attribute] = param[attribute] unless param[attribute].nil?
115
- end
116
- end
117
- else
118
-
119
- properties[name].tap do |x|
120
- property_keys.each do |attribute|
121
- x[attribute] = param[attribute] unless param[attribute].nil?
122
- end
123
- end
124
- end
125
-
126
- required << name if deletable?(param) && param[:required]
127
- end
128
-
129
- [properties, required]
130
- end
131
-
132
130
  def build_body_parameter(reference, name)
133
131
  {}.tap do |x|
134
132
  x[:name] = name
@@ -3,11 +3,17 @@ module GrapeSwagger
3
3
  class OperationId
4
4
  class << self
5
5
  def build(route, path = nil)
6
- verb = route.request_method.to_s.downcase
6
+ if route.options[:nickname]
7
+ operation_id = route.options[:nickname]
8
+ else
9
+ verb = route.request_method.to_s.downcase
7
10
 
8
- operation = manipulate(path) unless path.nil?
11
+ operation = manipulate(path) unless path.nil?
9
12
 
10
- "#{verb}#{operation}"
13
+ operation_id = "#{verb}#{operation}"
14
+ end
15
+
16
+ operation_id
11
17
  end
12
18
 
13
19
  def manipulate(path)
@@ -168,11 +168,9 @@ module Grape
168
168
  end
169
169
 
170
170
  def response_object(route, markdown)
171
- default_code = GrapeSwagger::DocMethods::StatusCodes.get[route.request_method.downcase.to_sym]
172
- default_code[:model] = @entity if @entity
173
- default_code[:message] = route.description || default_code[:message].sub('{item}', @item)
171
+ codes = (route.http_codes || route.options[:failure] || [])
172
+ codes = apply_defaults(route, codes) if route.options[:ignore_defaults].nil?
174
173
 
175
- codes = [default_code] + (route.http_codes || route.options[:failure] || [])
176
174
  codes.map! { |x| x.is_a?(Array) ? { code: x[0], message: x[1], model: x[2] } : x }
177
175
 
178
176
  codes.each_with_object({}) do |value, memo|
@@ -200,6 +198,13 @@ module Grape
200
198
  end
201
199
  end
202
200
 
201
+ def apply_defaults(route, codes)
202
+ default_code = GrapeSwagger::DocMethods::StatusCodes.get[route.request_method.downcase.to_sym]
203
+ default_code[:model] = @entity if @entity
204
+ default_code[:message] = route.description || default_code[:message].sub('{item}', @item)
205
+ [default_code] + codes
206
+ end
207
+
203
208
  def tag_object(route)
204
209
  Array(route.path.split('{')[0].split('/').reject(&:empty?).delete_if { |i| ((i == route.prefix.to_s) || (i == route.version)) }.first)
205
210
  end
@@ -231,9 +236,11 @@ module Grape
231
236
  array_key = nil
232
237
  params.select { |param| public_parameter?(param) }.each_with_object({}) do |param, memo|
233
238
  name, options = *param
234
- array_key = name.to_s if param_type_is_array?(options[:type])
239
+ param_type = options[:type]
240
+ param_type = param_type.to_s unless param_type.nil?
241
+ array_key = name.to_s if param_type_is_array?(param_type)
235
242
  options[:is_array] = true if array_key && name.start_with?(array_key)
236
- memo[param.first] = options unless (options[:type] == 'Hash' || options[:type] == 'Array') && !options.key?(:documentation)
243
+ memo[name] = options unless %w(Hash Array).include?(param_type) && !options.key?(:documentation)
237
244
  end
238
245
  end
239
246
 
@@ -1,3 +1,3 @@
1
1
  module GrapeSwagger
2
- VERSION = '0.22.0'.freeze
2
+ VERSION = '0.23.0'.freeze
3
3
  end
@@ -16,31 +16,12 @@ describe 'describing versions' do
16
16
 
17
17
  subject do
18
18
  get '/swagger_doc'
19
- JSON.parse(last_response.body, symbolize_names: true)
19
+ JSON.parse(last_response.body)
20
20
  end
21
21
 
22
22
  specify do
23
- expect(subject).to eql(
24
- info: { title: 'API title', version: '0.0.1' },
25
- swagger: '2.0',
26
- produces: ['application/xml', 'application/json', 'application/octet-stream', 'text/plain'],
27
- host: 'example.org',
28
- tags: [{ name: 'nothings', description: 'Operations about nothings' }],
29
- paths: {
30
- :'/nothings' => {
31
- get: {
32
- summary: 'no versions given',
33
- description: 'no versions given',
34
- produces: ['application/json'],
35
- responses: {
36
- :'200' => { description: 'no versions given' }
37
- },
38
- tags: ['nothings'],
39
- operationId: 'getNothings'
40
- }
41
- }
42
- }
43
- )
23
+ expect(subject['info']['version']).to eql '0.0.1'
24
+ expect(subject['paths'].keys.first).to eql '/nothings'
44
25
  end
45
26
  end
46
27
 
@@ -59,31 +40,12 @@ describe 'describing versions' do
59
40
 
60
41
  subject do
61
42
  get '/v2/swagger_doc'
62
- JSON.parse(last_response.body, symbolize_names: true)
43
+ JSON.parse(last_response.body)
63
44
  end
64
45
 
65
46
  specify do
66
- expect(subject).to eql(
67
- info: { title: 'API title', version: '0.0.1' },
68
- swagger: '2.0',
69
- produces: ['application/xml', 'application/json', 'application/octet-stream', 'text/plain'],
70
- host: 'example.org',
71
- tags: [{ name: 'api_version', description: 'Operations about api_versions' }],
72
- paths: {
73
- :'/v2/api_version' => {
74
- get: {
75
- summary: 'api versions given',
76
- description: 'api versions given',
77
- produces: ['application/json'],
78
- responses: {
79
- :'200' => { description: 'api versions given' }
80
- },
81
- tags: ['api_version'],
82
- operationId: 'getV2ApiVersion'
83
- }
84
- }
85
- }
86
- )
47
+ expect(subject['info']['version']).to eql '0.0.1'
48
+ expect(subject['paths'].keys.first).to eql '/v2/api_version'
87
49
  end
88
50
  end
89
51
 
@@ -95,80 +57,67 @@ describe 'describing versions' do
95
57
  { message: 'hello world …' }
96
58
  end
97
59
 
98
- add_swagger_documentation doc_version: '0.0.2'
60
+ add_swagger_documentation doc_version: '0.1'
99
61
  end
100
62
  end
101
63
 
102
64
  subject do
103
65
  get '/swagger_doc'
104
- JSON.parse(last_response.body, symbolize_names: true)
66
+ JSON.parse(last_response.body)
105
67
  end
106
68
 
107
69
  specify do
108
- expect(subject).to eql(
109
- info: { title: 'API title', version: '0.0.2' },
110
- swagger: '2.0',
111
- produces: ['application/xml', 'application/json', 'application/octet-stream', 'text/plain'],
112
- host: 'example.org',
113
- tags: [{ name: 'doc_version', description: 'Operations about doc_versions' }],
114
- paths: {
115
- :'/doc_version' => {
116
- get: {
117
- summary: 'doc versions given',
118
- description: 'doc versions given',
119
- produces: ['application/json'],
120
- responses: {
121
- :'200' => { description: 'doc versions given' }
122
- },
123
- tags: ['doc_version'],
124
- operationId: 'getDocVersion'
125
- }
126
- }
127
- }
128
- )
70
+ expect(subject['info']['version']).to eql '0.1'
71
+ expect(subject['paths'].keys.first).to eql '/doc_version'
129
72
  end
130
73
  end
131
74
 
132
75
  describe 'both versions given' do
133
76
  def app
134
77
  Class.new(Grape::API) do
135
- version :v2, using: :path
78
+ version :v3, using: :path
136
79
  desc 'both versions given'
137
80
  get '/both_versions' do
138
81
  { message: 'hello world …' }
139
82
  end
140
83
 
141
- add_swagger_documentation doc_version: '0.0.2'
84
+ add_swagger_documentation doc_version: '0.2'
142
85
  end
143
86
  end
144
87
 
145
88
  subject do
146
- get '/v2/swagger_doc'
147
- JSON.parse(last_response.body, symbolize_names: true)
89
+ get '/v3/swagger_doc'
90
+ JSON.parse(last_response.body)
91
+ end
92
+
93
+ specify do
94
+ expect(subject['info']['version']).to eql '0.2'
95
+ expect(subject['paths'].keys.first).to eql '/v3/both_versions'
96
+ end
97
+ end
98
+
99
+ describe 'try to override grape given version' do
100
+ def app
101
+ Class.new(Grape::API) do
102
+ version :v4, using: :path
103
+ desc 'overriding grape given version?'
104
+ get '/grape_version' do
105
+ { message: 'hello world …' }
106
+ end
107
+
108
+ add_swagger_documentation doc_version: '0.0.3',
109
+ version: 'v5'
110
+ end
111
+ end
112
+
113
+ subject do
114
+ get '/v4/swagger_doc'
115
+ JSON.parse(last_response.body)
148
116
  end
149
117
 
150
118
  specify do
151
- expect(subject).to eql(
152
- info: { title: 'API title', version: '0.0.2' },
153
- swagger: '2.0',
154
- produces: ['application/xml', 'application/json', 'application/octet-stream', 'text/plain'],
155
- host: 'example.org',
156
- tags: [{ name: 'both_versions', description: 'Operations about both_versions' }],
157
- paths: {
158
- :'/v2/both_versions' => {
159
- get: {
160
- summary: 'both versions given',
161
- description: 'both versions given',
162
- produces: ['application/json'],
163
- responses: {
164
- :'200' => { description: 'both versions given' }
165
- },
166
- tags: ['both_versions'],
167
- operationId: 'getV2BothVersions'
168
- }
169
- }
170
- }
171
- )
119
+ expect(subject['info']['version']).to eql '0.0.3'
120
+ expect(subject['paths'].keys.first).to eql '/v4/grape_version'
172
121
  end
173
122
  end
174
123
  end
@@ -24,6 +24,12 @@ describe GrapeSwagger::DocMethods::DataType do
24
24
  it { expect(subject).to eql 'string' }
25
25
  end
26
26
 
27
+ describe 'Multi types in a string stating with A' do
28
+ let(:value) { { type: '[Apple, Orange]' } }
29
+
30
+ it { expect(subject).to eql 'Apple' }
31
+ end
32
+
27
33
  describe 'Multi types in array' do
28
34
  let(:value) { { type: [String, Integer] } }
29
35
 
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'body parameter definitions' do
4
+ before :all do
5
+ module TheBodyApi
6
+ class Endpoint < Grape::API
7
+ resource :endpoint do
8
+ desc 'The endpoint' do
9
+ headers XAuthToken: {
10
+ description: 'Valdates your identity',
11
+ required: true
12
+ }
13
+ params body_param: { type: 'String', desc: 'param', documentation: { in: 'body' } },
14
+ body_type_as_const_param: { type: String, desc: 'string_param', documentation: { in: 'body' } }
15
+ end
16
+
17
+ post do
18
+ { 'declared_params' => declared(params) }
19
+ end
20
+ end
21
+
22
+ add_swagger_documentation
23
+ end
24
+ end
25
+ end
26
+
27
+ def app
28
+ TheBodyApi::Endpoint
29
+ end
30
+
31
+ subject do
32
+ get '/swagger_doc'
33
+ JSON.parse(last_response.body)
34
+ end
35
+
36
+ context 'a definition is generated for the endpoints parameters defined within the desc block' do
37
+ specify do
38
+ expect(subject['definitions']['postEndpoint']['properties']).to eql(
39
+ 'body_param' => { 'type' => 'string', 'description' => 'param' },
40
+ 'body_type_as_const_param' => { 'type' => 'string', 'description' => 'string_param' }
41
+ )
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'swagger spec v2.0' do
4
+ include_context "#{MODEL_PARSER} swagger example"
5
+
6
+ def app
7
+ Class.new(Grape::API) do
8
+ format :json
9
+
10
+ desc 'This creates Thing after a delay',
11
+ success: Entities::Something
12
+ params do
13
+ requires :text, type: String, documentation: { type: 'string', desc: 'Content of something.' }
14
+ requires :links, type: Array, documentation: { type: 'link', is_array: true }
15
+ end
16
+ post '/delay_thing', http_codes: [{ code: 202, message: 'OK' }], ignore_defaults: true do
17
+ status 202
18
+ end
19
+
20
+ version 'v3', using: :path
21
+ add_swagger_documentation api_version: 'v1',
22
+ base_path: '/api',
23
+ info: {
24
+ title: 'The API title to be displayed on the API homepage.',
25
+ description: 'A description of the API.',
26
+ contact_name: 'Contact name',
27
+ contact_email: 'Contact@email.com',
28
+ contact_url: 'Contact URL',
29
+ license: 'The name of the license.',
30
+ license_url: 'www.The-URL-of-the-license.org',
31
+ terms_of_service_url: 'www.The-URL-of-the-terms-and-service.com'
32
+ }
33
+ end
34
+ end
35
+
36
+ before do
37
+ get '/v3/swagger_doc'
38
+ end
39
+
40
+ let(:json) { JSON.parse(last_response.body) }
41
+
42
+ it 'only returns one response if ignore_defaults is specified' do
43
+ expect(json['paths']['/delay_thing']['post']['responses']).to eq('202' => { 'description' => 'OK' })
44
+ expect(json['paths']['/delay_thing']['post']['responses'].keys).not_to include '201'
45
+ end
46
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'a nicknamed mounted api' do
4
+ def app
5
+ Class.new(Grape::API) do
6
+ desc 'Show this endpoint', nickname: 'simple'
7
+ get '/simple' do
8
+ { foo: 'bar' }
9
+ end
10
+
11
+ add_swagger_documentation format: :json
12
+ end
13
+ end
14
+
15
+ subject do
16
+ get '/swagger_doc.json'
17
+ JSON.parse(last_response.body)
18
+ end
19
+
20
+ it 'uses the nickname as the operationId' do
21
+ expect(subject['paths']['/simple']['get']['operationId']).to eql('simple')
22
+ end
23
+ end
@@ -128,8 +128,10 @@ describe 'Group Params as Array' do
128
128
  expect(subject['definitions']['postObjectAndArray']['type']).to eql 'object'
129
129
  expect(subject['definitions']['postObjectAndArray']['properties']).to eql(
130
130
  'array_of_string' => {
131
- 'type' => 'array', 'items' => {
132
- 'type' => 'string', 'description' => 'array of strings'
131
+ 'type' => 'array',
132
+ 'description' => 'array of strings',
133
+ 'items' => {
134
+ 'type' => 'string'
133
135
  }
134
136
  },
135
137
  'integer_value' => {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-swagger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Vandecasteele
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-12 00:00:00.000000000 Z
11
+ date: 2016-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -222,6 +222,7 @@ files:
222
222
  - ".travis.yml"
223
223
  - CHANGELOG.md
224
224
  - CONTRIBUTING.md
225
+ - Dangerfile
225
226
  - Gemfile
226
227
  - LICENSE.txt
227
228
  - README.md
@@ -276,6 +277,7 @@ files:
276
277
  - spec/support/model_parsers/representable_parser.rb
277
278
  - spec/support/namespace_tags.rb
278
279
  - spec/support/the_paths_definitions.rb
280
+ - spec/swagger_v2/api_swagger_v2_body_definitions_spec.rb
279
281
  - spec/swagger_v2/api_swagger_v2_definitions-models_spec.rb
280
282
  - spec/swagger_v2/api_swagger_v2_detail_spec.rb
281
283
  - spec/swagger_v2/api_swagger_v2_extensions_spec.rb
@@ -285,6 +287,7 @@ files:
285
287
  - spec/swagger_v2/api_swagger_v2_headers_spec.rb
286
288
  - spec/swagger_v2/api_swagger_v2_hide_documentation_path_spec.rb
287
289
  - spec/swagger_v2/api_swagger_v2_hide_param_spec.rb
290
+ - spec/swagger_v2/api_swagger_v2_ignore_defaults_spec.rb
288
291
  - spec/swagger_v2/api_swagger_v2_mounted_spec.rb
289
292
  - spec/swagger_v2/api_swagger_v2_param_type_body_nested_spec.rb
290
293
  - spec/swagger_v2/api_swagger_v2_param_type_body_spec.rb
@@ -307,6 +310,7 @@ files:
307
310
  - spec/swagger_v2/namespace_tags_prefix_spec.rb
308
311
  - spec/swagger_v2/namespace_tags_spec.rb
309
312
  - spec/swagger_v2/namespaced_api_spec.rb
313
+ - spec/swagger_v2/nicknamed_api_spec.rb
310
314
  - spec/swagger_v2/param_multi_type_spec.rb
311
315
  - spec/swagger_v2/param_type_spec.rb
312
316
  - spec/swagger_v2/param_values_spec.rb
@@ -363,6 +367,7 @@ test_files:
363
367
  - spec/support/model_parsers/representable_parser.rb
364
368
  - spec/support/namespace_tags.rb
365
369
  - spec/support/the_paths_definitions.rb
370
+ - spec/swagger_v2/api_swagger_v2_body_definitions_spec.rb
366
371
  - spec/swagger_v2/api_swagger_v2_definitions-models_spec.rb
367
372
  - spec/swagger_v2/api_swagger_v2_detail_spec.rb
368
373
  - spec/swagger_v2/api_swagger_v2_extensions_spec.rb
@@ -372,6 +377,7 @@ test_files:
372
377
  - spec/swagger_v2/api_swagger_v2_headers_spec.rb
373
378
  - spec/swagger_v2/api_swagger_v2_hide_documentation_path_spec.rb
374
379
  - spec/swagger_v2/api_swagger_v2_hide_param_spec.rb
380
+ - spec/swagger_v2/api_swagger_v2_ignore_defaults_spec.rb
375
381
  - spec/swagger_v2/api_swagger_v2_mounted_spec.rb
376
382
  - spec/swagger_v2/api_swagger_v2_param_type_body_nested_spec.rb
377
383
  - spec/swagger_v2/api_swagger_v2_param_type_body_spec.rb
@@ -394,6 +400,7 @@ test_files:
394
400
  - spec/swagger_v2/namespace_tags_prefix_spec.rb
395
401
  - spec/swagger_v2/namespace_tags_spec.rb
396
402
  - spec/swagger_v2/namespaced_api_spec.rb
403
+ - spec/swagger_v2/nicknamed_api_spec.rb
397
404
  - spec/swagger_v2/param_multi_type_spec.rb
398
405
  - spec/swagger_v2/param_type_spec.rb
399
406
  - spec/swagger_v2/param_values_spec.rb