Set query parameter for array of primitive types (#929)
* Set query parameter for array of primitive types * Update PR number in changelog * refactor param_type method to handle array params. --------- Co-authored-by: Eugene Lim <limzhiweieugene@gmail.com>
This commit is contained in:
parent
e7856de6d0
commit
95be315986
|
@ -3,6 +3,7 @@
|
||||||
#### Features
|
#### Features
|
||||||
|
|
||||||
* [#927](https://github.com/ruby-grape/grape-swagger/pull/927): Set default parameter location based on consumes - [@spaceraccoon](https://github.com/spaceraccoon)
|
* [#927](https://github.com/ruby-grape/grape-swagger/pull/927): Set default parameter location based on consumes - [@spaceraccoon](https://github.com/spaceraccoon)
|
||||||
|
* [#929](https://github.com/ruby-grape/grape-swagger/pull/929): Set query parameter for array of primitive types - [@spaceraccoon](https://github.com/spaceraccoon)
|
||||||
* Your contribution here.
|
* Your contribution here.
|
||||||
|
|
||||||
#### Fixes
|
#### Fixes
|
||||||
|
|
|
@ -75,6 +75,14 @@ module GrapeSwagger
|
||||||
PRIMITIVE_MAPPINGS.keys.map(&:downcase)
|
PRIMITIVE_MAPPINGS.keys.map(&:downcase)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def query_array_primitive?(type)
|
||||||
|
query_array_primitives.include?(type.to_s.downcase)
|
||||||
|
end
|
||||||
|
|
||||||
|
def query_array_primitives
|
||||||
|
primitives << 'string'
|
||||||
|
end
|
||||||
|
|
||||||
def mapping(value)
|
def mapping(value)
|
||||||
PRIMITIVE_MAPPINGS[value] || 'string'
|
PRIMITIVE_MAPPINGS[value] || 'string'
|
||||||
end
|
end
|
||||||
|
|
|
@ -70,21 +70,17 @@ module GrapeSwagger
|
||||||
|
|
||||||
def document_array_param(value_type, definitions)
|
def document_array_param(value_type, definitions)
|
||||||
if value_type[:documentation].present?
|
if value_type[:documentation].present?
|
||||||
param_type = value_type[:documentation][:param_type] || value_type[:documentation][:in]
|
|
||||||
doc_type = value_type[:documentation][:type]
|
doc_type = value_type[:documentation][:type]
|
||||||
type = DataType.mapping(doc_type) if doc_type && !DataType.request_primitive?(doc_type)
|
type = DataType.mapping(doc_type) if doc_type && !DataType.request_primitive?(doc_type)
|
||||||
collection_format = value_type[:documentation][:collectionFormat]
|
collection_format = value_type[:documentation][:collectionFormat]
|
||||||
end
|
end
|
||||||
|
|
||||||
param_type ||= value_type[:param_type]
|
|
||||||
|
|
||||||
array_items = parse_array_item(
|
array_items = parse_array_item(
|
||||||
definitions,
|
definitions,
|
||||||
type,
|
type,
|
||||||
value_type
|
value_type
|
||||||
)
|
)
|
||||||
|
|
||||||
@parsed_param[:in] = param_type || 'formData'
|
|
||||||
@parsed_param[:items] = array_items
|
@parsed_param[:items] = array_items
|
||||||
@parsed_param[:type] = 'array'
|
@parsed_param[:type] = 'array'
|
||||||
@parsed_param[:collectionFormat] = collection_format if DataType.collections.include?(collection_format)
|
@parsed_param[:collectionFormat] = collection_format if DataType.collections.include?(collection_format)
|
||||||
|
@ -150,7 +146,7 @@ module GrapeSwagger
|
||||||
|
|
||||||
def param_type(value_type, consumes)
|
def param_type(value_type, consumes)
|
||||||
param_type = value_type[:param_type] || value_type[:in]
|
param_type = value_type[:param_type] || value_type[:in]
|
||||||
if value_type[:path].include?("{#{value_type[:param_name]}}")
|
if !value_type[:is_array] && value_type[:path].include?("{#{value_type[:param_name]}}")
|
||||||
'path'
|
'path'
|
||||||
elsif param_type
|
elsif param_type
|
||||||
param_type
|
param_type
|
||||||
|
@ -160,6 +156,8 @@ module GrapeSwagger
|
||||||
else
|
else
|
||||||
'body'
|
'body'
|
||||||
end
|
end
|
||||||
|
elsif value_type[:is_array] && !DataType.query_array_primitive?(value_type[:data_type])
|
||||||
|
'formData'
|
||||||
else
|
else
|
||||||
'query'
|
'query'
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe '#883 Group Params as Array' do
|
||||||
|
let(:app) do
|
||||||
|
Class.new(Grape::API) do
|
||||||
|
namespace :issue_883 do
|
||||||
|
params do
|
||||||
|
requires :array_of_string, type: [String]
|
||||||
|
requires :array_of_integer, type: [Integer]
|
||||||
|
end
|
||||||
|
get '/get_primitive_array_parameters' do
|
||||||
|
'accepts array query parameters of primitive value types'
|
||||||
|
end
|
||||||
|
|
||||||
|
params do
|
||||||
|
requires :array_of, type: Array, documentation: { type: 'link', is_array: true }
|
||||||
|
end
|
||||||
|
get '/get_object_array_parameters' do
|
||||||
|
'does not accept array query parameters of object value types'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
add_swagger_documentation
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'retrieves the documentation for typed group range parameters' do
|
||||||
|
subject do
|
||||||
|
get '/swagger_doc'
|
||||||
|
JSON.parse(last_response.body)
|
||||||
|
end
|
||||||
|
|
||||||
|
specify do
|
||||||
|
expect(subject['paths']['/issue_883/get_primitive_array_parameters']['get']['parameters']).to eql(
|
||||||
|
[
|
||||||
|
{ 'in' => 'query', 'name' => 'array_of_string', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => true },
|
||||||
|
{ 'in' => 'query', 'name' => 'array_of_integer', 'type' => 'array', 'items' => { 'type' => 'integer', 'format' => 'int32' }, 'required' => true }
|
||||||
|
]
|
||||||
|
)
|
||||||
|
expect(subject['paths']['/issue_883/get_object_array_parameters']['get']['parameters']).to eql(
|
||||||
|
[{ 'in' => 'formData', 'items' => { 'type' => 'string' }, 'name' => 'array_of', 'required' => true, 'type' => 'array' }]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -52,7 +52,7 @@ describe 'Group Array Params, using collection format' do
|
||||||
specify do
|
specify do
|
||||||
expect(subject['paths']['/array_of_strings_without_collection_format']['get']['parameters']).to eql(
|
expect(subject['paths']['/array_of_strings_without_collection_format']['get']['parameters']).to eql(
|
||||||
[
|
[
|
||||||
{ 'in' => 'formData', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false, 'description' => 'array in csv collection format' }
|
{ 'in' => 'query', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false, 'description' => 'array in csv collection format' }
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
@ -67,7 +67,7 @@ describe 'Group Array Params, using collection format' do
|
||||||
specify do
|
specify do
|
||||||
expect(subject['paths']['/array_of_strings_multi_collection_format']['get']['parameters']).to eql(
|
expect(subject['paths']['/array_of_strings_multi_collection_format']['get']['parameters']).to eql(
|
||||||
[
|
[
|
||||||
{ 'in' => 'formData', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false, 'collectionFormat' => 'multi', 'description' => 'array in multi collection format' }
|
{ 'in' => 'query', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false, 'collectionFormat' => 'multi', 'description' => 'array in multi collection format' }
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
@ -82,7 +82,7 @@ describe 'Group Array Params, using collection format' do
|
||||||
specify do
|
specify do
|
||||||
expect(subject['paths']['/array_of_strings_brackets_collection_format']['get']['parameters']).to eql(
|
expect(subject['paths']['/array_of_strings_brackets_collection_format']['get']['parameters']).to eql(
|
||||||
[
|
[
|
||||||
{ 'in' => 'formData', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false, 'collectionFormat' => 'brackets', 'description' => 'array in brackets collection format' }
|
{ 'in' => 'query', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false, 'collectionFormat' => 'brackets', 'description' => 'array in brackets collection format' }
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
@ -97,7 +97,7 @@ describe 'Group Array Params, using collection format' do
|
||||||
specify do
|
specify do
|
||||||
expect(subject['paths']['/array_of_strings_invalid_collection_format']['get']['parameters']).to eql(
|
expect(subject['paths']['/array_of_strings_invalid_collection_format']['get']['parameters']).to eql(
|
||||||
[
|
[
|
||||||
{ 'in' => 'formData', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false }
|
{ 'in' => 'query', 'name' => 'array_of_strings', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false }
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue