Skip to content

Commit 0c73138

Browse files
committed
simplify logic for defining declared params
Now, route settings get declared params when an endpoint gets initialized, the `Grape::Validations::ParamsScope` doesn't need to worry about that anymore. Since the endpoint takes care of finalizing declared params, the `declared_params` method works with a structure which doesn't require any processing.
1 parent 9198f7e commit 0c73138

File tree

6 files changed

+46
-22
lines changed

6 files changed

+46
-22
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* [#1520](https://github.com/ruby-grape/grape/pull/1520): Un-deprecate stream-like objects - [@urkle](https://github.com/urkle).
66
* [#2060](https://github.com/ruby-grape/grape/pull/2060): Drop support for Ruby 2.4 - [@dblock](https://github.com/dblock).
77
* [#2060](https://github.com/ruby-grape/grape/pull/2060): Upgraded Rubocop to 0.84.0 - [@dblock](https://github.com/dblock).
8+
* [#](https://github.com/ruby-grape/grape/pull/): Simplify logic for defining declared params - [@dnesteryuk](https://github.com/dnesteryuk).
89
* Your contribution here.
910

1011
#### Fixes

lib/grape/dsl/inside_route.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,10 @@ def route_options_params_key(params_nested_path)
124124
def optioned_declared_params(**options)
125125
declared_params = if options[:include_parent_namespaces]
126126
# Declared params including parent namespaces
127-
route_setting(:saved_declared_params).flatten | Array(route_setting(:declared_params))
127+
route_setting(:declared_params)
128128
else
129129
# Declared params at current namespace
130-
route_setting(:saved_declared_params).last & Array(route_setting(:declared_params))
130+
namespace_stackable(:declared_params).last || []
131131
end
132132

133133
raise ArgumentError, 'Tried to filter for declared parameters but none exist.' unless declared_params

lib/grape/dsl/validations.rb

+18-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,24 @@ module Validations
1010
include Grape::DSL::Configuration
1111

1212
module ClassMethods
13-
# Clears all defined parameters and validations.
13+
# Clears all defined parameters and validations. The main purpose of it is to clean up
14+
# settings, so next endpoint won't interfere with previous one.
15+
#
16+
# params do
17+
# # params for the endpoint below this block
18+
# end
19+
# post '/current' do
20+
# # whatever
21+
# end
22+
#
23+
# # somewhere between them the reset_validations! method gets called
24+
#
25+
# params do
26+
# # params for the endpoint below this block
27+
# end
28+
# post '/next' do
29+
# # whatever
30+
# end
1431
def reset_validations!
1532
unset_namespace_stackable :declared_params
1633
unset_namespace_stackable :validations

lib/grape/endpoint.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,10 @@ def initialize(new_settings, options = {}, &block)
8080

8181
self.inheritable_setting = new_settings.point_in_time_copy
8282

83-
route_setting(:saved_declared_params, namespace_stackable(:declared_params))
83+
# now +namespace_stackable(:declared_params)+ contains all params defined for
84+
# this endpoint and its parents, but later it will be cleaned up,
85+
# see +reset_validations!+ in lib/grape/dsl/validations.rb
86+
route_setting(:declared_params, namespace_stackable(:declared_params).flatten)
8487
route_setting(:saved_validations, namespace_stackable(:validations))
8588

8689
namespace_stackable(:representations, []) unless namespace_stackable(:representations)
@@ -116,7 +119,6 @@ def inherit_settings(namespace_stackable)
116119
parent_declared_params = namespace_stackable[:declared_params]
117120

118121
if parent_declared_params
119-
inheritable_setting.route[:declared_params] ||= []
120122
inheritable_setting.route[:declared_params].concat(parent_declared_params.flatten)
121123
end
122124

@@ -190,7 +192,7 @@ def prepare_default_route_attributes
190192
requirements: prepare_routes_requirements,
191193
prefix: namespace_inheritable(:root_prefix),
192194
anchor: options[:route_options].fetch(:anchor, true),
193-
settings: inheritable_setting.route.except(:saved_declared_params, :saved_validations),
195+
settings: inheritable_setting.route.except(:declared_params, :saved_validations),
194196
forward_match: options[:forward_match]
195197
}
196198
end

lib/grape/validations/params_scope.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -237,10 +237,10 @@ def configure_declared_params
237237
@parent.push_declared_params [element => @declared_params]
238238
else
239239
@api.namespace_stackable(:declared_params, @declared_params)
240-
241-
@api.route_setting(:declared_params, []) unless @api.route_setting(:declared_params)
242-
@api.route_setting(:declared_params, @api.namespace_stackable(:declared_params).flatten)
243240
end
241+
242+
# params were stored in settings, it can be cleaned from the params scope
243+
@declared_params = nil
244244
end
245245

246246
def validates(attrs, validations)

spec/grape/validations_spec.rb

+17-13
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ def app
99
subject
1010
end
1111

12+
def declared_params
13+
subject.namespace_stackable(:declared_params).flatten
14+
end
15+
1216
describe 'params' do
1317
context 'optional' do
1418
before do
@@ -41,7 +45,7 @@ def app
4145
subject.params do
4246
optional :some_param
4347
end
44-
expect(subject.route_setting(:declared_params)).to eq([:some_param])
48+
expect(declared_params).to eq([:some_param])
4549
end
4650
end
4751

@@ -61,7 +65,7 @@ def define_optional_using
6165

6266
it 'adds entity documentation to declared params' do
6367
define_optional_using
64-
expect(subject.route_setting(:declared_params)).to eq(%i[field_a field_b])
68+
expect(declared_params).to eq(%i[field_a field_b])
6569
end
6670

6771
it 'works when field_a and field_b are not present' do
@@ -108,7 +112,7 @@ def define_optional_using
108112
subject.params do
109113
requires :some_param
110114
end
111-
expect(subject.route_setting(:declared_params)).to eq([:some_param])
115+
expect(declared_params).to eq([:some_param])
112116
end
113117

114118
it 'works when required field is present but nil' do
@@ -193,7 +197,7 @@ def define_requires_all
193197

194198
it 'adds entity documentation to declared params' do
195199
define_requires_all
196-
expect(subject.route_setting(:declared_params)).to eq(%i[required_field optional_field])
200+
expect(declared_params).to eq(%i[required_field optional_field])
197201
end
198202

199203
it 'errors when required_field is not present' do
@@ -228,7 +232,7 @@ def define_requires_none
228232

229233
it 'adds entity documentation to declared params' do
230234
define_requires_none
231-
expect(subject.route_setting(:declared_params)).to eq(%i[required_field optional_field])
235+
expect(declared_params).to eq(%i[required_field optional_field])
232236
end
233237

234238
it 'errors when required_field is not present' do
@@ -258,7 +262,7 @@ def define_requires_all
258262

259263
it 'adds only the entity documentation to declared params, nothing more' do
260264
define_requires_all
261-
expect(subject.route_setting(:declared_params)).to eq(%i[required_field optional_field])
265+
expect(declared_params).to eq(%i[required_field optional_field])
262266
end
263267
end
264268

@@ -324,7 +328,7 @@ def define_requires_none
324328
requires :key
325329
end
326330
end
327-
expect(subject.route_setting(:declared_params)).to eq([items: [:key]])
331+
expect(declared_params).to eq([items: [:key]])
328332
end
329333
end
330334

@@ -396,7 +400,7 @@ def define_requires_none
396400
requires :key
397401
end
398402
end
399-
expect(subject.route_setting(:declared_params)).to eq([items: [:key]])
403+
expect(declared_params).to eq([items: [:key]])
400404
end
401405
end
402406

@@ -459,7 +463,7 @@ def define_requires_none
459463
requires :key
460464
end
461465
end
462-
expect(subject.route_setting(:declared_params)).to eq([items: [:key]])
466+
expect(declared_params).to eq([items: [:key]])
463467
end
464468
end
465469

@@ -813,7 +817,7 @@ def validate_param!(attr_name, params)
813817
requires :key
814818
end
815819
end
816-
expect(subject.route_setting(:declared_params)).to eq([items: [:key]])
820+
expect(declared_params).to eq([items: [:key]])
817821
end
818822
end
819823

@@ -877,7 +881,7 @@ def validate_param!(attr_name, params)
877881
requires(:required_subitems, type: Array) { requires :value }
878882
end
879883
end
880-
expect(subject.route_setting(:declared_params)).to eq([items: [:key, { optional_subitems: [:value] }, { required_subitems: [:value] }]])
884+
expect(declared_params).to eq([items: [:key, { optional_subitems: [:value] }, { required_subitems: [:value] }]])
881885
end
882886
end
883887

@@ -1122,14 +1126,14 @@ def validate_param!(attr_name, params)
11221126
subject.params do
11231127
use :pagination
11241128
end
1125-
expect(subject.route_setting(:declared_params)).to eq %i[page per_page]
1129+
expect(declared_params).to eq %i[page per_page]
11261130
end
11271131

11281132
it 'by #use with multiple params' do
11291133
subject.params do
11301134
use :pagination, :period
11311135
end
1132-
expect(subject.route_setting(:declared_params)).to eq %i[page per_page start_date end_date]
1136+
expect(declared_params).to eq %i[page per_page start_date end_date]
11331137
end
11341138
end
11351139

0 commit comments

Comments
 (0)