Skip to content

Commit e7856de

Browse files
Set default parameter location based on consumes (#927)
* Set default parameter location based on consumes * fix rubocop warnings and update todos. * fix spec * change rubocop fix * correct PR number in changelog --------- Co-authored-by: Eugene Lim <limzhiweieugene@gmail.com>
1 parent 953075a commit e7856de

31 files changed

+265
-36
lines changed

.rubocop_todo.yml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This configuration was generated by
22
# `rubocop --auto-gen-config`
3-
# on 2023-05-20 18:23:47 UTC using RuboCop version 1.51.0.
3+
# on 2024-05-07 07:32:56 UTC using RuboCop version 1.63.4.
44
# The point is for the user to remove these configuration records
55
# one by one as the offenses are removed from the code base.
66
# Note that changes in the inspected code, or installation of new
@@ -13,17 +13,17 @@ Gemspec/RequiredRubyVersion:
1313
Exclude:
1414
- 'grape-swagger.gemspec'
1515

16-
# Offense count: 32
16+
# Offense count: 33
1717
# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
1818
Metrics/AbcSize:
19-
Max: 56
19+
Max: 59
2020

21-
# Offense count: 30
21+
# Offense count: 32
2222
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns.
2323
Metrics/MethodLength:
2424
Max: 28
2525

26-
# Offense count: 8
26+
# Offense count: 9
2727
# Configuration parameters: AllowedMethods, AllowedPatterns.
2828
Metrics/PerceivedComplexity:
2929
Max: 16
@@ -35,6 +35,7 @@ Style/ClassVars:
3535

3636
# Offense count: 1
3737
# This cop supports unsafe autocorrection (--autocorrect-all).
38+
# Configuration parameters: AllowedReceivers.
3839
Style/CollectionCompact:
3940
Exclude:
4041
- 'lib/grape-swagger/endpoint.rb'

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#### Features
44

5+
* [#927](https://github.com/ruby-grape/grape-swagger/pull/927): Set default parameter location based on consumes - [@spaceraccoon](https://github.com/spaceraccoon)
56
* Your contribution here.
67

78
#### Fixes

lib/grape-swagger/doc_methods/parse_params.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ module GrapeSwagger
44
module DocMethods
55
class ParseParams
66
class << self
7-
def call(param, settings, path, route, definitions)
7+
def call(param, settings, path, route, definitions, consumes) # rubocop:disable Metrics/ParameterLists
88
method = route.request_method
99
additional_documentation = settings.fetch(:documentation, {})
1010
settings.merge!(additional_documentation)
@@ -14,7 +14,7 @@ def call(param, settings, path, route, definitions)
1414

1515
# required properties
1616
@parsed_param = {
17-
in: param_type(value_type),
17+
in: param_type(value_type, consumes),
1818
name: settings[:full_name] || param
1919
}
2020

@@ -148,14 +148,18 @@ def document_example(settings)
148148
@parsed_param[:example] = example if example
149149
end
150150

151-
def param_type(value_type)
151+
def param_type(value_type, consumes)
152152
param_type = value_type[:param_type] || value_type[:in]
153153
if value_type[:path].include?("{#{value_type[:param_name]}}")
154154
'path'
155155
elsif param_type
156156
param_type
157157
elsif %w[POST PUT PATCH].include?(value_type[:method])
158-
DataType.request_primitive?(value_type[:data_type]) ? 'formData' : 'body'
158+
if consumes.include?('application/x-www-form-urlencoded') || consumes.include?('multipart/form-data')
159+
'formData'
160+
else
161+
'body'
162+
end
159163
else
160164
'query'
161165
end

lib/grape-swagger/endpoint.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ def method_object(route, options, path)
119119
method[:description] = description_object(route)
120120
method[:produces] = produces_object(route, options[:produces] || options[:format])
121121
method[:consumes] = consumes_object(route, options[:consumes] || options[:format])
122-
method[:parameters] = params_object(route, options, path)
122+
method[:parameters] = params_object(route, options, path, method[:consumes])
123123
method[:security] = security_object(route)
124124
method[:responses] = response_object(route, options)
125125
method[:tags] = route.options.fetch(:tags, tag_object(route, path))
@@ -175,7 +175,7 @@ def consumes_object(route, format)
175175
GrapeSwagger::DocMethods::ProducesConsumes.call(route.settings.dig(:description, :consumes) || format)
176176
end
177177

178-
def params_object(route, options, path)
178+
def params_object(route, options, path, consumes)
179179
parameters = build_request_params(route, options).each_with_object([]) do |(param, value), memo|
180180
next if hidden_parameter?(value)
181181

@@ -187,7 +187,7 @@ def params_object(route, options, path)
187187
elsif value[:type]
188188
expose_params(value[:type])
189189
end
190-
memo << GrapeSwagger::DocMethods::ParseParams.call(param, value, path, route, @definitions)
190+
memo << GrapeSwagger::DocMethods::ParseParams.call(param, value, path, route, @definitions, consumes)
191191
end
192192

193193
if GrapeSwagger::DocMethods::MoveParams.can_be_moved?(route.request_method, parameters)

spec/issues/532_allow_custom_format_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
let(:app) do
77
Class.new(Grape::API) do
88
namespace :issue_532 do
9+
desc 'issue_532' do
10+
consumes ['application/x-www-form-urlencoded']
11+
end
12+
913
params do
1014
requires :logs, type: String, documentation: { format: 'log' }
1115
optional :phone_number, type: Integer, documentation: { format: 'phone_number' }

spec/issues/553_align_array_put_post_params_spec.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,19 @@
66
let(:app) do
77
Class.new(Grape::API) do
88
namespace :in_form_data do
9-
desc 'create foo'
9+
desc 'create foo' do
10+
consumes ['application/x-www-form-urlencoded']
11+
end
1012
params do
1113
requires :guid, type: Array[String]
1214
end
1315
post do
1416
# your code goes here
1517
end
1618

17-
desc 'put specific foo'
19+
desc 'put specific foo' do
20+
consumes ['application/x-www-form-urlencoded']
21+
end
1822
params do
1923
requires :id
2024
requires :guid, type: Array[String]
@@ -25,15 +29,19 @@
2529
end
2630

2731
namespace :in_body do
28-
desc 'create foo'
32+
desc 'create foo' do
33+
consumes ['application/x-www-form-urlencoded']
34+
end
2935
params do
3036
requires :guid, type: Array[String], documentation: { param_type: 'body' }
3137
end
3238
post do
3339
# your code goes here
3440
end
3541

36-
desc 'put specific foo'
42+
desc 'put specific foo' do
43+
consumes ['application/x-www-form-urlencoded']
44+
end
3745
params do
3846
requires :id
3947
requires :guid, type: Array[String], documentation: { param_type: 'body' }

spec/issues/579_align_put_post_parameters_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Spec < Grape::Entity
2121
namespace :implicit do
2222
namespace :body_parameter do
2323
desc 'update spec',
24+
consumes: ['application/x-www-form-urlencoded'],
2425
success: BodySpec,
2526
params: BodySpec.documentation
2627
put ':guid' do
@@ -30,6 +31,7 @@ class Spec < Grape::Entity
3031

3132
namespace :form_parameter do
3233
desc 'update spec',
34+
consumes: ['application/x-www-form-urlencoded'],
3335
success: Spec,
3436
params: Spec.documentation
3537
put ':guid' do
@@ -41,6 +43,7 @@ class Spec < Grape::Entity
4143
namespace :explicit do
4244
namespace :body_parameter do
4345
desc 'update spec',
46+
consumes: ['application/x-www-form-urlencoded'],
4447
success: BodySpec,
4548
params: BodySpec.documentation
4649
params do
@@ -53,6 +56,7 @@ class Spec < Grape::Entity
5356

5457
namespace :form_parameter do
5558
desc 'update spec',
59+
consumes: ['application/x-www-form-urlencoded'],
5660
success: Spec,
5761
params: Spec.documentation
5862
params do
@@ -68,6 +72,7 @@ class Spec < Grape::Entity
6872
route_param :guid do
6973
namespace :body_parameter do
7074
desc 'update spec',
75+
consumes: ['application/x-www-form-urlencoded'],
7176
success: BodySpec,
7277
params: BodySpec.documentation
7378
put do
@@ -77,6 +82,7 @@ class Spec < Grape::Entity
7782

7883
namespace :form_parameter do
7984
desc 'update spec',
85+
consumes: ['application/x-www-form-urlencoded'],
8086
success: Spec,
8187
params: Spec.documentation
8288
put do

spec/issues/650_params_array_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
describe '#605 Group Params as Array' do
66
let(:app) do
77
Class.new(Grape::API) do
8+
desc 'array_of_range' do
9+
consumes ['application/x-www-form-urlencoded']
10+
end
811
params do
912
requires :array_of_range_string, type: [String], values: %w[a b c]
1013
requires :array_of_range_integer, type: [Integer], values: [1, 2, 3]
@@ -13,6 +16,9 @@
1316
{ 'declared_params' => declared(params) }
1417
end
1518

19+
desc 'array_with_default' do
20+
consumes ['application/x-www-form-urlencoded']
21+
end
1622
params do
1723
requires :array_with_default_string, type: [String], default: 'abc'
1824
requires :array_with_default_integer, type: Array[Integer], default: 123
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe '#721 set default parameter location based on consumes' do
6+
let(:app) do
7+
Class.new(Grape::API) do
8+
namespace :issue_721 do
9+
desc 'create item' do
10+
consumes ['application/json']
11+
end
12+
13+
params do
14+
requires :logs, type: String
15+
optional :phone_number, type: Integer
16+
end
17+
18+
post do
19+
present params
20+
end
21+
22+
desc 'modify item' do
23+
consumes ['application/x-www-form-urlencoded']
24+
end
25+
26+
params do
27+
requires :id, type: Integer
28+
requires :logs, type: String
29+
optional :phone_number, type: Integer
30+
end
31+
32+
put ':id' do
33+
present params
34+
end
35+
end
36+
37+
add_swagger_documentation
38+
end
39+
end
40+
41+
subject do
42+
get '/swagger_doc'
43+
JSON.parse(last_response.body)
44+
end
45+
46+
let(:post_parameters) { subject['paths']['/issue_721']['post']['parameters'] }
47+
let(:post_schema) { subject['definitions']['postIssue721'] }
48+
let(:put_parameters) { subject['paths']['/issue_721/{id}']['put']['parameters'] }
49+
50+
specify do
51+
expect(post_parameters).to eql(
52+
[{ 'in' => 'body', 'name' => 'postIssue721', 'required' => true, 'schema' => { '$ref' => '#/definitions/postIssue721' } }]
53+
)
54+
expect(post_schema).to eql(
55+
{ 'description' => 'create item', 'properties' => { 'logs' => { 'type' => 'string' }, 'phone_number' => { 'format' => 'int32', 'type' => 'integer' } }, 'required' => ['logs'], 'type' => 'object' }
56+
)
57+
puts put_parameters
58+
expect(put_parameters).to eql(
59+
[{ 'in' => 'path', 'name' => 'id', 'type' => 'integer', 'format' => 'int32', 'required' => true }, { 'in' => 'formData', 'name' => 'logs', 'type' => 'string', 'required' => true }, { 'in' => 'formData', 'name' => 'phone_number', 'type' => 'integer', 'format' => 'int32', 'required' => false }]
60+
)
61+
end
62+
end

spec/issues/784_extensions_on_params_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
let(:app) do
77
Class.new(Grape::API) do
88
namespace :issue_784 do
9+
desc 'issue_784' do
10+
consumes ['application/x-www-form-urlencoded']
11+
end
12+
913
params do
1014
requires :logs, type: String, documentation: { format: 'log', x: { name: 'Log' } }
1115
optional :phone_number, type: Integer, documentation: { format: 'phone_number', x: { name: 'PhoneNumber' } }

spec/issues/832_array_hash_float_decimal_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
let(:app) do
77
Class.new(Grape::API) do
88
resource :issue_832 do
9+
desc 'issue_832' do
10+
consumes ['application/x-www-form-urlencoded']
11+
end
912
params do
1013
requires :array_param, type: Array do
1114
requires :float_param, type: Float

spec/support/model_parsers/entity_parser.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ class DocumentedHashAndArrayModel < Grape::Entity
234234
'post' => {
235235
'description' => 'This creates Thing.',
236236
'produces' => ['application/json'],
237-
'consumes' => ['application/json'],
237+
'consumes' => ['application/x-www-form-urlencoded'],
238238
'parameters' => [
239239
{ 'in' => 'formData', 'name' => 'text', 'description' => 'Content of something.', 'type' => 'string', 'required' => true },
240240
{ 'in' => 'formData', 'name' => 'links', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => true }
@@ -256,7 +256,7 @@ class DocumentedHashAndArrayModel < Grape::Entity
256256
'put' => {
257257
'description' => 'This updates Thing.',
258258
'produces' => ['application/json'],
259-
'consumes' => ['application/json'],
259+
'consumes' => ['application/x-www-form-urlencoded'],
260260
'parameters' => [
261261
{ 'in' => 'path', 'name' => 'id', 'type' => 'integer', 'format' => 'int32', 'required' => true },
262262
{ 'in' => 'formData', 'name' => 'text', 'description' => 'Content of something.', 'type' => 'string', 'required' => false },

spec/support/model_parsers/mock_parser.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ class ApiResponse < OpenStruct; end
242242
'post' => {
243243
'description' => 'This creates Thing.',
244244
'produces' => ['application/json'],
245-
'consumes' => ['application/json'],
245+
'consumes' => ['application/x-www-form-urlencoded'],
246246
'parameters' => [
247247
{ 'in' => 'formData', 'name' => 'text', 'description' => 'Content of something.', 'type' => 'string', 'required' => true },
248248
{ 'in' => 'formData', 'name' => 'links', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => true }
@@ -264,7 +264,7 @@ class ApiResponse < OpenStruct; end
264264
'put' => {
265265
'description' => 'This updates Thing.',
266266
'produces' => ['application/json'],
267-
'consumes' => ['application/json'],
267+
'consumes' => ['application/x-www-form-urlencoded'],
268268
'parameters' => [
269269
{ 'in' => 'path', 'name' => 'id', 'type' => 'integer', 'format' => 'int32', 'required' => true },
270270
{ 'in' => 'formData', 'name' => 'text', 'description' => 'Content of something.', 'type' => 'string', 'required' => false },

spec/support/model_parsers/representable_parser.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ class DocumentedHashAndArrayModel < Representable::Decorator
306306
'post' => {
307307
'description' => 'This creates Thing.',
308308
'produces' => ['application/json'],
309-
'consumes' => ['application/json'],
309+
'consumes' => ['application/x-www-form-urlencoded'],
310310
'parameters' => [
311311
{ 'in' => 'formData', 'name' => 'text', 'description' => 'Content of something.', 'type' => 'string', 'required' => true },
312312
{ 'in' => 'formData', 'name' => 'links', 'type' => 'array', 'items' => { 'type' => 'string' }, 'required' => true }
@@ -328,7 +328,7 @@ class DocumentedHashAndArrayModel < Representable::Decorator
328328
'put' => {
329329
'description' => 'This updates Thing.',
330330
'produces' => ['application/json'],
331-
'consumes' => ['application/json'],
331+
'consumes' => ['application/x-www-form-urlencoded'],
332332
'parameters' => [
333333
{ 'in' => 'path', 'name' => 'id', 'type' => 'integer', 'format' => 'int32', 'required' => true },
334334
{ 'in' => 'formData', 'name' => 'text', 'description' => 'Content of something.', 'type' => 'string', 'required' => false },

0 commit comments

Comments
 (0)