grape-swagger 0.22.0 → 0.23.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 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