Skip to content

Commit 34f38d0

Browse files
yewtonLeFnord
authored andcommitted
Apply values and default of array params to its items (#651)
* Apply `values` and `default` of array params to its items * Fixes #650 https://github.com/ruby-grape/grape#values * Update CHANGELOG.md
1 parent 8c3fb89 commit 34f38d0

File tree

4 files changed

+69
-3
lines changed

4 files changed

+69
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* [#267](https://github.com/ruby-grape/grape-swagger/pull/634): Fix mounting APIs in route_param namespaces - [@milgner](https://github.com/milgner), [@wojciechka](https://github.com/wojciechka).
1313
* [#642](https://github.com/ruby-grape/grape-swagger/pull/642): Fix examples link in readme - [@iBublik](https://github.com/iBublik).
1414
* [#641](https://github.com/ruby-grape/grape-swagger/pull/641): Exclude default success code if http_codes define one already - [@anakinj](https://github.com/anakinj).
15+
* [#651](https://github.com/ruby-grape/grape-swagger/pull/651): Apply `values` and `default` of array params to its items - [@yewton](https://github.com/yewton).
1516

1617
* Your contribution here.
1718

lib/grape-swagger/doc_methods/parse_params.rb

+8-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ def call(param, settings, path, route, definitions)
2222
document_description(settings)
2323
document_type_and_format(settings, data_type)
2424
document_array_param(value_type, definitions) if value_type[:is_array]
25-
document_default_value(settings)
26-
document_range_values(settings)
25+
document_default_value(settings) unless value_type[:is_array]
26+
document_range_values(settings) unless value_type[:is_array]
2727
document_required(settings)
2828

2929
@parsed_param
@@ -79,6 +79,12 @@ def document_array_param(value_type, definitions)
7979
end
8080
array_items[:format] = @parsed_param.delete(:format) if @parsed_param[:format]
8181

82+
values = value_type[:values] || nil
83+
enum_or_range_values = parse_enum_or_range_values(values)
84+
array_items.merge!(enum_or_range_values) if enum_or_range_values
85+
86+
array_items[:default] = value_type[:default] if value_type[:default].present?
87+
8288
@parsed_param[:in] = param_type || 'formData'
8389
@parsed_param[:items] = array_items
8490
@parsed_param[:type] = 'array'

spec/issues/650_params_array_spec.rb

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe '#605 Group Params as Array' do
6+
let(:app) do
7+
Class.new(Grape::API) do
8+
params do
9+
requires :array_of_range_string, type: [String], values: %w[a b c]
10+
requires :array_of_range_integer, type: [Integer], values: [1, 2, 3]
11+
end
12+
post '/array_of_range' do
13+
{ 'declared_params' => declared(params) }
14+
end
15+
16+
params do
17+
requires :array_with_default_string, type: [String], default: 'abc'
18+
requires :array_with_default_integer, type: Array[Integer], default: 123
19+
end
20+
post '/array_with_default' do
21+
{ 'declared_params' => declared(params) }
22+
end
23+
24+
add_swagger_documentation
25+
end
26+
end
27+
28+
describe 'retrieves the documentation for typed group range parameters' do
29+
subject do
30+
get '/swagger_doc/array_of_range'
31+
JSON.parse(last_response.body)
32+
end
33+
34+
specify do
35+
expect(subject['paths']['/array_of_range']['post']['parameters']).to eql(
36+
[
37+
{ 'in' => 'formData', 'name' => 'array_of_range_string', 'type' => 'array', 'items' => { 'type' => 'string', 'enum' => %w[a b c] }, 'required' => true },
38+
{ 'in' => 'formData', 'name' => 'array_of_range_integer', 'type' => 'array', 'items' => { 'type' => 'integer', 'format' => 'int32', 'enum' => [1, 2, 3] }, 'required' => true }
39+
]
40+
)
41+
end
42+
end
43+
44+
describe 'retrieves the documentation for typed group parameters with default' do
45+
subject do
46+
get '/swagger_doc/array_with_default'
47+
JSON.parse(last_response.body)
48+
end
49+
50+
specify do
51+
expect(subject['paths']['/array_with_default']['post']['parameters']).to eql(
52+
[
53+
{ 'in' => 'formData', 'name' => 'array_with_default_string', 'type' => 'array', 'items' => { 'type' => 'string', 'default' => 'abc' }, 'required' => true },
54+
{ 'in' => 'formData', 'name' => 'array_with_default_integer', 'type' => 'array', 'items' => { 'type' => 'integer', 'format' => 'int32', 'default' => 123 }, 'required' => true }
55+
]
56+
)
57+
end
58+
end
59+
end

spec/swagger_v2/params_array_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def app
101101
{ 'in' => 'formData', 'name' => 'typed_group[id]', 'description' => 'integer given', 'type' => 'array', 'items' => { 'type' => 'integer', 'format' => 'int32' }, 'required' => true },
102102
{ 'in' => 'formData', 'name' => 'typed_group[name]', 'description' => 'string given', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => true },
103103
{ 'in' => 'formData', 'name' => 'typed_group[email]', 'description' => 'email given', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => false },
104-
{ 'in' => 'formData', 'name' => 'typed_group[others]', 'type' => 'array', 'items' => { 'type' => 'integer', 'format' => 'int32' }, 'enum' => [1, 2, 3], 'required' => false }
104+
{ 'in' => 'formData', 'name' => 'typed_group[others]', 'type' => 'array', 'items' => { 'type' => 'integer', 'format' => 'int32', 'enum' => [1, 2, 3] }, 'required' => false }
105105
]
106106
)
107107
end

0 commit comments

Comments
 (0)