grape-swagger 0.20.1 → 0.20.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +14 -0
- data/lib/grape-swagger/doc_methods.rb +1 -0
- data/lib/grape-swagger/doc_methods/headers.rb +18 -0
- data/lib/grape-swagger/doc_methods/parse_params.rb +1 -5
- data/lib/grape-swagger/endpoint.rb +5 -7
- data/lib/grape-swagger/version.rb +1 -1
- data/spec/swagger_v2/api_swagger_v2_headers_spec.rb +8 -4
- data/spec/swagger_v2/host.rb +43 -0
- data/spec/swagger_v2/param_type_spec.rb +1 -1
- data/spec/swagger_v2/simple_mounted_api_spec.rb +6 -6
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e7244ce5e2e54fd314fdf08bb3a948aa85c1981
|
4
|
+
data.tar.gz: c2647e5425cfd200375341daf3ee1f691709863b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebce21c42bb460babe20f85d0b4e020d111f5c992be70e4b58595cdd6e3efc9e0c7060eca217f32dba61d6e0c422ba9a3243f995cf41fae265076ab0e6298362
|
7
|
+
data.tar.gz: a6b0ac5ec95360f00a86eeff4107499caa33b2d55c70f243a5132e538945d68d46bae621dd58026a30254d8b005f4e291ca171b50a88bc28d7fe77661d406f59
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@
|
|
4
4
|
|
5
5
|
#### Fixes
|
6
6
|
|
7
|
+
* [#394](https://github.com/ruby-grape/grape-swagger/pull/394): removes overiding default trough example - [@LeFnord](https://github.com/LeFnord).
|
8
|
+
* [#393](https://github.com/ruby-grape/grape-swagger/pull/393): properly handle header parameters - [@wleeper](https://github.com/wleeper).
|
9
|
+
* [#389](https://github.com/ruby-grape/grape-swagger/pull/389): respect X-Forwarded-Host - [@edvakf](https://github.com/edvakf).
|
10
|
+
|
7
11
|
### 0.20.1 / 2016-04-17
|
8
12
|
|
9
13
|
#### Features
|
data/README.md
CHANGED
@@ -7,6 +7,7 @@
|
|
7
7
|
|
8
8
|
* [What is grape-swagger?](#what)
|
9
9
|
* [Related Projects](#related)
|
10
|
+
* [Compatibility](#version)
|
10
11
|
* [Swagger-Spec](#swagger-spec)
|
11
12
|
* [Installation](#install)
|
12
13
|
* [Usage](#usage)
|
@@ -31,9 +32,22 @@ These screenshot is based on the [Hussars](https://github.com/LeFnord/hussars) s
|
|
31
32
|
## Related Projects
|
32
33
|
|
33
34
|
* [Grape](https://github.com/ruby-grape/grape)
|
35
|
+
* [Grape Entity](https://github.com/ruby-grape/grape-entity)
|
34
36
|
* [Swagger UI](https://github.com/wordnik/swagger-ui)
|
35
37
|
|
36
38
|
|
39
|
+
<a name="version" />
|
40
|
+
## Compatibility
|
41
|
+
|
42
|
+
The following versions of grape, grape-entity and grape-swagger can currently be used together.
|
43
|
+
|
44
|
+
grape-swagger | grape | grape-entity
|
45
|
+
--------------|-------------------------|-------------
|
46
|
+
0.10.5 | >= 0.10.0 ... <= 0.14.0 | < 0.5.0
|
47
|
+
0.11.0 | >= 0.16.2 | < 0.5.0
|
48
|
+
0.20.1 | >= 0.12.0 ... <= 0.14.0 | <= 0.5.1
|
49
|
+
|
50
|
+
|
37
51
|
<a name="swagger-spec" />
|
38
52
|
## Swagger-Spec
|
39
53
|
|
@@ -9,6 +9,7 @@ require 'grape-swagger/doc_methods/path_string'
|
|
9
9
|
require 'grape-swagger/doc_methods/tag_name_description'
|
10
10
|
require 'grape-swagger/doc_methods/parse_params'
|
11
11
|
require 'grape-swagger/doc_methods/move_params'
|
12
|
+
require 'grape-swagger/doc_methods/headers'
|
12
13
|
|
13
14
|
module GrapeSwagger
|
14
15
|
module DocMethods
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module GrapeSwagger
|
2
|
+
module DocMethods
|
3
|
+
class Headers
|
4
|
+
class << self
|
5
|
+
def parse(route)
|
6
|
+
route.route_headers.to_a.map do |route_header|
|
7
|
+
route_header.tap do |header|
|
8
|
+
hash = header[1]
|
9
|
+
description = hash.delete('description')
|
10
|
+
hash[:documentation] = { desc: description, in: 'header' }
|
11
|
+
hash[:type] = hash['type'].titleize if hash['type']
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -43,11 +43,7 @@ module GrapeSwagger
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def document_default_value(settings)
|
46
|
-
|
47
|
-
example = settings[:example] || nil
|
48
|
-
|
49
|
-
@parsed_param[:default] = example if example
|
50
|
-
@parsed_param[:default] = default_value if default_value && example.blank?
|
46
|
+
@parsed_param[:default] = settings[:default] if settings[:default].present?
|
51
47
|
end
|
52
48
|
|
53
49
|
def document_type_and_format(data_type)
|
@@ -24,7 +24,7 @@ module Grape
|
|
24
24
|
swagger: '2.0',
|
25
25
|
produces: content_types_for(target_class),
|
26
26
|
authorizations: options[:authorizations],
|
27
|
-
host: GrapeSwagger::DocMethods::OptionalObject.build(:host, options, request.
|
27
|
+
host: GrapeSwagger::DocMethods::OptionalObject.build(:host, options, request.host_with_port),
|
28
28
|
basePath: GrapeSwagger::DocMethods::OptionalObject.build(:base_path, options, request.env['SCRIPT_NAME']),
|
29
29
|
tags: GrapeSwagger::DocMethods::TagNameDescription.build(options),
|
30
30
|
schemes: options[:schemes].is_a?(String) ? [options[:schemes]] : options[:schemes]
|
@@ -105,7 +105,6 @@ module Grape
|
|
105
105
|
def method_object(route, options, path)
|
106
106
|
method = {}
|
107
107
|
method[:description] = description_object(route, options[:markdown])
|
108
|
-
method[:headers] = route.route_headers if route.route_headers
|
109
108
|
method[:produces] = produces_object(route, options[:produces] || options[:format])
|
110
109
|
method[:consumes] = consumes_object(route, options[:format])
|
111
110
|
method[:parameters] = params_object(route)
|
@@ -194,14 +193,13 @@ module Grape
|
|
194
193
|
def partition_params(route)
|
195
194
|
declared_params = route.route_settings[:declared_params] if route.route_settings[:declared_params].present?
|
196
195
|
required, exposed = route.route_params.partition { |x| x.first.is_a? String }
|
197
|
-
|
196
|
+
required.concat GrapeSwagger::DocMethods::Headers.parse(route) unless route.route_headers.nil?
|
198
197
|
default_type(required)
|
199
198
|
default_type(exposed)
|
200
199
|
|
201
|
-
unless declared_params.nil?
|
200
|
+
unless declared_params.nil? && route.route_headers.nil?
|
202
201
|
request_params = parse_request_params(required)
|
203
202
|
end
|
204
|
-
|
205
203
|
if !exposed.empty?
|
206
204
|
exposed_params = exposed.each_with_object({}) { |x, memo| memo[x.first] = x.last }
|
207
205
|
properties = parse_response_params(exposed_params)
|
@@ -215,8 +213,7 @@ module Grape
|
|
215
213
|
@definitions[key] = { type: 'object', properties: properties } unless @definitions.key?(key)
|
216
214
|
@definitions[key][:properties].merge!(properties) if @definitions.key?(key)
|
217
215
|
end
|
218
|
-
|
219
|
-
return route.route_params if route.route_params && !route.route_settings[:declared_params].present?
|
216
|
+
return route.route_params if route.route_params.present? && !route.route_settings[:declared_params].present?
|
220
217
|
request_params || {}
|
221
218
|
end
|
222
219
|
|
@@ -244,6 +241,7 @@ module Grape
|
|
244
241
|
return if params.nil?
|
245
242
|
|
246
243
|
params.each_with_object({}) do |x, memo|
|
244
|
+
next if x[1].fetch(:documentation, {}).fetch(:in, nil).to_s == 'header'
|
247
245
|
x[0] = x.last[:as] if x.last[:as]
|
248
246
|
|
249
247
|
model = x.last[:using] if x.last[:using].present?
|
@@ -36,9 +36,13 @@ describe 'headers' do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
specify do
|
39
|
-
expect(subject['paths']['/use_headers']['get']).to
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
expect(subject['paths']['/use_headers']['get']['parameters']).to eql([
|
40
|
+
{"in"=>"header",
|
41
|
+
"name"=>"X-Rate-Limit-Limit",
|
42
|
+
"description"=>"The number of allowed requests in the current period",
|
43
|
+
"type"=>"integer",
|
44
|
+
"format" => "int32",
|
45
|
+
"required"=>false},
|
46
|
+
])
|
43
47
|
end
|
44
48
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'host in the swagger_doc' do
|
4
|
+
include_context "the api entities"
|
5
|
+
|
6
|
+
before :all do
|
7
|
+
module TheApi
|
8
|
+
class EmptyApi < Grape::API
|
9
|
+
format :json
|
10
|
+
|
11
|
+
add_swagger_documentation
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def app
|
17
|
+
TheApi::EmptyApi
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'host should include port' do
|
21
|
+
subject do
|
22
|
+
get 'http://example.com:8080/swagger_doc'
|
23
|
+
JSON.parse(last_response.body)
|
24
|
+
end
|
25
|
+
|
26
|
+
specify do
|
27
|
+
expect(subject['host']).to eq 'example.com:8080'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'respect X-Forwarded-Host over Host header' do
|
32
|
+
subject do
|
33
|
+
header 'Host', 'dummy.example.com'
|
34
|
+
header 'X-Forwarded-Host', 'real.example.com'
|
35
|
+
get '/swagger_doc'
|
36
|
+
JSON.parse(last_response.body)
|
37
|
+
end
|
38
|
+
|
39
|
+
specify do
|
40
|
+
expect(subject['host']).to eq 'real.example.com'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -97,10 +97,10 @@ describe 'a simple mounted api' do
|
|
97
97
|
"/simple_with_headers"=>{
|
98
98
|
"get"=>{
|
99
99
|
"description"=>"this gets something else",
|
100
|
-
"headers"=>{
|
101
|
-
"XAuthToken"=>{"description"=>"A required header.", "required"=>true},
|
102
|
-
"XOtherHeader"=>{"description"=>"An optional header.", "required"=>false}},
|
103
100
|
"produces"=>["application/json"],
|
101
|
+
"parameters"=>[
|
102
|
+
{"in"=>"header", "name"=>"XAuthToken", "description"=>"A required header.", "type"=>"string", "required"=>true},
|
103
|
+
{"in"=>"header", "name"=>"XOtherHeader", "description"=>"An optional header.", "type"=>"string", "required"=>false}],
|
104
104
|
"tags"=>["simple_with_headers"],
|
105
105
|
"operationId"=>"getSimpleWithHeaders",
|
106
106
|
"responses"=>{
|
@@ -203,10 +203,10 @@ describe 'a simple mounted api' do
|
|
203
203
|
"/simple_with_headers"=>{
|
204
204
|
"get"=>{
|
205
205
|
"description"=>"this gets something else",
|
206
|
-
"headers"=>{
|
207
|
-
"XAuthToken"=>{"description"=>"A required header.", "required"=>true},
|
208
|
-
"XOtherHeader"=>{"description"=>"An optional header.", "required"=>false}},
|
209
206
|
"produces"=>["application/json"],
|
207
|
+
"parameters"=>[
|
208
|
+
{"in"=>"header", "name"=>"XAuthToken", "description"=>"A required header.", "type"=>"string", "required"=>true},
|
209
|
+
{"in"=>"header", "name"=>"XOtherHeader", "description"=>"An optional header.", "type"=>"string", "required"=>false}],
|
210
210
|
"tags"=>["simple_with_headers"],
|
211
211
|
"operationId"=>"getSimpleWithHeaders",
|
212
212
|
"responses"=>{
|
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.20.
|
4
|
+
version: 0.20.2
|
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-04-
|
11
|
+
date: 2016-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grape
|
@@ -273,6 +273,7 @@ files:
|
|
273
273
|
- lib/grape-swagger/doc_methods.rb
|
274
274
|
- lib/grape-swagger/doc_methods/data_type.rb
|
275
275
|
- lib/grape-swagger/doc_methods/extensions.rb
|
276
|
+
- lib/grape-swagger/doc_methods/headers.rb
|
276
277
|
- lib/grape-swagger/doc_methods/move_params.rb
|
277
278
|
- lib/grape-swagger/doc_methods/operation_id.rb
|
278
279
|
- lib/grape-swagger/doc_methods/optional_object.rb
|
@@ -325,6 +326,7 @@ files:
|
|
325
326
|
- spec/swagger_v2/form_params_spec.rb
|
326
327
|
- spec/swagger_v2/grape-swagger_spec.rb
|
327
328
|
- spec/swagger_v2/hide_api_spec.rb
|
329
|
+
- spec/swagger_v2/host.rb
|
328
330
|
- spec/swagger_v2/mounted_target_class_spec.rb
|
329
331
|
- spec/swagger_v2/namespace_tags_prefix_spec.rb
|
330
332
|
- spec/swagger_v2/namespace_tags_spec.rb
|
@@ -403,6 +405,7 @@ test_files:
|
|
403
405
|
- spec/swagger_v2/form_params_spec.rb
|
404
406
|
- spec/swagger_v2/grape-swagger_spec.rb
|
405
407
|
- spec/swagger_v2/hide_api_spec.rb
|
408
|
+
- spec/swagger_v2/host.rb
|
406
409
|
- spec/swagger_v2/mounted_target_class_spec.rb
|
407
410
|
- spec/swagger_v2/namespace_tags_prefix_spec.rb
|
408
411
|
- spec/swagger_v2/namespace_tags_spec.rb
|