Skip to content

Commit e70c3ce

Browse files
committed
remove ParamsScope#optional_group, and instead allow #requires and #optional to take blocks
1 parent 8652c92 commit e70c3ce

File tree

2 files changed

+64
-17
lines changed

2 files changed

+64
-17
lines changed

lib/grape/validations.rb

+12-7
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ def optional?
105105
@optional
106106
end
107107

108-
def requires(*attrs)
108+
def requires(*attrs, &block)
109+
return new_scope(attrs, &block) if block_given?
110+
109111
validations = {:presence => true}
110112
if attrs.last.is_a?(Hash)
111113
validations.merge!(attrs.pop)
@@ -115,7 +117,9 @@ def requires(*attrs)
115117
validates(attrs, validations)
116118
end
117119

118-
def optional(*attrs)
120+
def optional(*attrs, &block)
121+
return new_scope(attrs, true, &block) if block_given?
122+
119123
validations = {}
120124
if attrs.last.is_a?(Hash)
121125
validations.merge!(attrs.pop)
@@ -126,11 +130,7 @@ def optional(*attrs)
126130
end
127131

128132
def group(element, &block)
129-
ParamsScope.new(api: @api, element: element, parent: self, &block)
130-
end
131-
132-
def optional_group(element, &block)
133-
ParamsScope.new(api: @api, element: element, parent: self, optional: true, &block)
133+
requires(element, &block)
134134
end
135135

136136
def params(params)
@@ -152,6 +152,11 @@ def push_declared_params(attrs)
152152

153153
private
154154

155+
def new_scope(attrs, optional=false, &block)
156+
raise ArgumentError unless attrs.size == 1
157+
ParamsScope.new(api: @api, element: attrs.first, parent: self, optional: optional, &block)
158+
end
159+
155160
# Pushes declared params to parent or settings
156161
def configure_declared_params
157162
if @parent

spec/grape/validations_spec.rb

+52-10
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,48 @@ def app; subject end
5858
end
5959
end
6060

61+
context 'required with a block' do
62+
before do
63+
subject.params {
64+
requires :items do
65+
requires :key
66+
end
67+
}
68+
subject.get '/required' do 'required works'; end
69+
end
70+
71+
it 'errors when param not present' do
72+
get '/required'
73+
last_response.status.should == 400
74+
last_response.body.should == 'missing parameter: items[key]'
75+
end
76+
77+
it "doesn't throw a missing param when param is present" do
78+
get '/required', { :items => [:key => 'hello', :key => 'world'] }
79+
last_response.status.should == 200
80+
last_response.body.should == 'required works'
81+
end
82+
83+
it "doesn't allow more than one parameter" do
84+
expect {
85+
subject.params {
86+
requires(:items, desc: 'Foo') do
87+
requires :key
88+
end
89+
}
90+
}.to raise_error ArgumentError
91+
end
92+
93+
it 'adds to declared parameters' do
94+
subject.params {
95+
requires :items do
96+
requires :key
97+
end
98+
}
99+
subject.settings[:declared_params].should == [:items => [:key]]
100+
end
101+
end
102+
61103
context 'group' do
62104
before do
63105
subject.params {
@@ -90,10 +132,10 @@ def app; subject end
90132
end
91133
end
92134

93-
context 'optional group' do
135+
context 'optional with a block' do
94136
before do
95137
subject.params {
96-
optional_group :items do
138+
optional :items do
97139
requires :key
98140
end
99141
}
@@ -120,21 +162,21 @@ def app; subject end
120162

121163
it 'adds to declared parameters' do
122164
subject.params {
123-
optional_group :items do
165+
optional :items do
124166
requires :key
125167
end
126168
}
127169
subject.settings[:declared_params].should == [:items => [:key]]
128170
end
129171
end
130172

131-
context 'nested optional groups' do
173+
context 'nested optional blocks' do
132174
before do
133175
subject.params {
134-
optional_group :items do
176+
optional :items do
135177
requires :key
136-
optional_group(:optional_subitems) { requires :value }
137-
group(:required_subitems) { requires :value }
178+
optional(:optional_subitems) { requires :value }
179+
requires(:required_subitems) { requires :value }
138180
end
139181
}
140182
subject.get('/nested_optional_group') { 'nested optional group works' }
@@ -168,10 +210,10 @@ def app; subject end
168210

169211
it 'adds to declared parameters' do
170212
subject.params {
171-
optional_group :items do
213+
optional :items do
172214
requires :key
173-
optional_group(:optional_subitems) { requires :value }
174-
group(:required_subitems) { requires :value }
215+
optional(:optional_subitems) { requires :value }
216+
requires(:required_subitems) { requires :value }
175217
end
176218
}
177219
subject.settings[:declared_params].should == [:items => [:key, {:optional_subitems => [:value]}, {:required_subitems => [:value]}]]

0 commit comments

Comments
 (0)