Skip to content

Commit ad56e17

Browse files
author
Bill Leeper
committed
Added feature to report header params in params block
1 parent 3453ead commit ad56e17

File tree

7 files changed

+39
-17
lines changed

7 files changed

+39
-17
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#### Fixes
66

77
* [#389](https://github.com/ruby-grape/grape-swagger/pull/389): respect X-Forwarded-Host - [@edvakf](https://github.com/edvakf).
8+
* [#393](https://github.com/ruby-grape/grape-swagger/pull/393): properly handle header parameters- [@wleeper](https://github.com/wleeper).
89

910
### 0.20.1 / 2016-04-17
1011

lib/grape-swagger/doc_methods.rb

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
require 'grape-swagger/doc_methods/tag_name_description'
1010
require 'grape-swagger/doc_methods/parse_params'
1111
require 'grape-swagger/doc_methods/move_params'
12+
require 'grape-swagger/doc_methods/headers'
1213

1314
module GrapeSwagger
1415
module DocMethods
+18
Original file line numberDiff line numberDiff line change
@@ -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

lib/grape-swagger/endpoint.rb

+4-6
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ def path_item(routes, options)
105105
def method_object(route, options, path)
106106
method = {}
107107
method[:description] = description_object(route, options[:markdown])
108-
method[:headers] = route.route_headers if route.route_headers
109108
method[:produces] = produces_object(route, options[:produces] || options[:format])
110109
method[:consumes] = consumes_object(route, options[:format])
111110
method[:parameters] = params_object(route)
@@ -194,14 +193,13 @@ def tag_object(route, version)
194193
def partition_params(route)
195194
declared_params = route.route_settings[:declared_params] if route.route_settings[:declared_params].present?
196195
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?
198197
default_type(required)
199198
default_type(exposed)
200199

201-
unless declared_params.nil?
200+
unless declared_params.nil? && route.route_headers.nil?
202201
request_params = parse_request_params(required)
203202
end
204-
205203
if !exposed.empty?
206204
exposed_params = exposed.each_with_object({}) { |x, memo| memo[x.first] = x.last }
207205
properties = parse_response_params(exposed_params)
@@ -215,8 +213,7 @@ def partition_params(route)
215213
@definitions[key] = { type: 'object', properties: properties } unless @definitions.key?(key)
216214
@definitions[key][:properties].merge!(properties) if @definitions.key?(key)
217215
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?
220217
request_params || {}
221218
end
222219

@@ -244,6 +241,7 @@ def parse_response_params(params)
244241
return if params.nil?
245242

246243
params.each_with_object({}) do |x, memo|
244+
next if x[1].fetch(:documentation, {}).fetch(:in, nil).to_s == 'header'
247245
x[0] = x.last[:as] if x.last[:as]
248246

249247
model = x.last[:using] if x.last[:using].present?

spec/swagger_v2/api_swagger_v2_headers_spec.rb

+8-4
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,13 @@ def app
3636
end
3737

3838
specify do
39-
expect(subject['paths']['/use_headers']['get']).to include('headers')
40-
expect(subject['paths']['/use_headers']['get']['headers']).to eql({
41-
"X-Rate-Limit-Limit"=>{"description"=>"The number of allowed requests in the current period", "type"=>"integer"}
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+
])
4347
end
4448
end

spec/swagger_v2/param_type_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def app
5050

5151
it 'has consistent types' do
5252
types = subject.map { |param| param['type'] }
53-
expect(types).to eq(%w(string))
53+
expect(types).to eq(%w(string string))
5454
end
5555
end
5656
end

spec/swagger_v2/simple_mounted_api_spec.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,10 @@ def app
9797
"/simple_with_headers"=>{
9898
"get"=>{
9999
"description"=>"this gets something else",
100-
"headers"=>{
101-
"XAuthToken"=>{"description"=>"A required header.", "required"=>true},
102-
"XOtherHeader"=>{"description"=>"An optional header.", "required"=>false}},
103100
"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}],
104104
"tags"=>["simple_with_headers"],
105105
"operationId"=>"getSimpleWithHeaders",
106106
"responses"=>{
@@ -203,10 +203,10 @@ def app
203203
"/simple_with_headers"=>{
204204
"get"=>{
205205
"description"=>"this gets something else",
206-
"headers"=>{
207-
"XAuthToken"=>{"description"=>"A required header.", "required"=>true},
208-
"XOtherHeader"=>{"description"=>"An optional header.", "required"=>false}},
209206
"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}],
210210
"tags"=>["simple_with_headers"],
211211
"operationId"=>"getSimpleWithHeaders",
212212
"responses"=>{

0 commit comments

Comments
 (0)