grape 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/CONTRIBUTING.md +1 -0
- data/README.md +9 -1
- data/lib/grape/api.rb +12 -0
- data/lib/grape/dry_types.rb +12 -0
- data/lib/grape/dsl/headers.rb +5 -2
- data/lib/grape/dsl/helpers.rb +1 -1
- data/lib/grape/middleware/auth/dsl.rb +7 -1
- data/lib/grape/middleware/base.rb +1 -1
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/util/strict_hash_configuration.rb +1 -1
- data/lib/grape/validations/types/array_coercer.rb +0 -2
- data/lib/grape/validations/types/dry_type_coercer.rb +1 -10
- data/lib/grape/validations/types/json.rb +0 -2
- data/lib/grape/validations/types/primitive_coercer.rb +5 -7
- data/lib/grape/validations/types/set_coercer.rb +0 -3
- data/lib/grape/validations/types.rb +83 -9
- data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
- data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
- data/lib/grape/validations/validators/as_validator.rb +14 -0
- data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
- data/lib/grape/validations/validators/base.rb +73 -71
- data/lib/grape/validations/validators/coerce_validator.rb +75 -0
- data/lib/grape/validations/validators/default_validator.rb +51 -0
- data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
- data/lib/grape/validations/validators/except_values_validator.rb +24 -0
- data/lib/grape/validations/validators/multiple_params_base.rb +24 -22
- data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
- data/lib/grape/validations/validators/presence_validator.rb +15 -0
- data/lib/grape/validations/validators/regexp_validator.rb +16 -0
- data/lib/grape/validations/validators/same_as_validator.rb +29 -0
- data/lib/grape/validations/validators/values_validator.rb +88 -0
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +59 -24
- data/spec/grape/api/custom_validations_spec.rb +77 -46
- data/spec/grape/api/deeply_included_options_spec.rb +3 -3
- data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
- data/spec/grape/api/invalid_format_spec.rb +2 -0
- data/spec/grape/api/recognize_path_spec.rb +1 -1
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
- data/spec/grape/api_remount_spec.rb +16 -15
- data/spec/grape/api_spec.rb +317 -193
- data/spec/grape/dsl/callbacks_spec.rb +1 -0
- data/spec/grape/dsl/headers_spec.rb +39 -9
- data/spec/grape/dsl/helpers_spec.rb +3 -2
- data/spec/grape/dsl/inside_route_spec.rb +6 -4
- data/spec/grape/dsl/logger_spec.rb +16 -18
- data/spec/grape/dsl/middleware_spec.rb +1 -0
- data/spec/grape/dsl/parameters_spec.rb +1 -0
- data/spec/grape/dsl/request_response_spec.rb +1 -0
- data/spec/grape/dsl/routing_spec.rb +9 -6
- data/spec/grape/endpoint/declared_spec.rb +12 -12
- data/spec/grape/endpoint_spec.rb +59 -50
- data/spec/grape/entity_spec.rb +13 -13
- data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
- data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
- data/spec/grape/exceptions/validation_spec.rb +5 -3
- data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
- data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
- data/spec/grape/loading_spec.rb +8 -8
- data/spec/grape/middleware/auth/dsl_spec.rb +14 -5
- data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
- data/spec/grape/middleware/base_spec.rb +24 -15
- data/spec/grape/middleware/error_spec.rb +1 -0
- data/spec/grape/middleware/exception_spec.rb +111 -161
- data/spec/grape/middleware/formatter_spec.rb +25 -4
- data/spec/grape/middleware/globals_spec.rb +7 -4
- data/spec/grape/middleware/stack_spec.rb +11 -11
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
- data/spec/grape/middleware/versioner/header_spec.rb +14 -13
- data/spec/grape/middleware/versioner/param_spec.rb +7 -1
- data/spec/grape/middleware/versioner/path_spec.rb +5 -1
- data/spec/grape/middleware/versioner_spec.rb +1 -1
- data/spec/grape/parser_spec.rb +4 -0
- data/spec/grape/path_spec.rb +52 -52
- data/spec/grape/presenters/presenter_spec.rb +7 -6
- data/spec/grape/request_spec.rb +6 -4
- data/spec/grape/util/inheritable_setting_spec.rb +7 -7
- data/spec/grape/util/inheritable_values_spec.rb +3 -2
- data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
- data/spec/grape/util/stackable_values_spec.rb +7 -5
- data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
- data/spec/grape/validations/params_scope_spec.rb +9 -7
- data/spec/grape/validations/single_attribute_iterator_spec.rb +1 -0
- data/spec/grape/validations/types/primitive_coercer_spec.rb +2 -2
- data/spec/grape/validations/types_spec.rb +8 -8
- data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
- data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
- data/spec/grape/validations/validators/coerce_spec.rb +10 -12
- data/spec/grape/validations/validators/default_spec.rb +72 -78
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
- data/spec/grape/validations/validators/except_values_spec.rb +1 -1
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
- data/spec/grape/validations/validators/presence_spec.rb +16 -1
- data/spec/grape/validations/validators/regexp_spec.rb +25 -31
- data/spec/grape/validations/validators/same_as_spec.rb +14 -20
- data/spec/grape/validations/validators/values_spec.rb +172 -171
- data/spec/grape/validations_spec.rb +45 -16
- data/spec/integration/eager_load/eager_load_spec.rb +2 -2
- data/spec/integration/multi_json/json_spec.rb +1 -1
- data/spec/integration/multi_xml/xml_spec.rb +1 -1
- data/spec/shared/versioning_examples.rb +10 -7
- data/spec/spec_helper.rb +11 -1
- metadata +116 -116
- data/lib/grape/validations/types/build_coercer.rb +0 -94
- data/lib/grape/validations/validators/all_or_none.rb +0 -16
- data/lib/grape/validations/validators/allow_blank.rb +0 -18
- data/lib/grape/validations/validators/as.rb +0 -12
- data/lib/grape/validations/validators/at_least_one_of.rb +0 -15
- data/lib/grape/validations/validators/coerce.rb +0 -87
- data/lib/grape/validations/validators/default.rb +0 -49
- data/lib/grape/validations/validators/exactly_one_of.rb +0 -17
- data/lib/grape/validations/validators/except_values.rb +0 -22
- data/lib/grape/validations/validators/mutual_exclusion.rb +0 -16
- data/lib/grape/validations/validators/presence.rb +0 -13
- data/lib/grape/validations/validators/regexp.rb +0 -14
- data/lib/grape/validations/validators/same_as.rb +0 -27
- data/lib/grape/validations/validators/values.rb +0 -86
@@ -2,53 +2,47 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Grape::Validations::RegexpValidator do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
default_format :json
|
10
|
-
|
11
|
-
resources :custom_message do
|
12
|
-
params do
|
13
|
-
requires :name, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
14
|
-
end
|
15
|
-
get do
|
16
|
-
end
|
17
|
-
|
18
|
-
params do
|
19
|
-
requires :names, type: { value: Array[String], message: 'can\'t be nil' }, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
20
|
-
end
|
21
|
-
get 'regexp_with_array' do
|
22
|
-
end
|
23
|
-
end
|
5
|
+
describe Grape::Validations::Validators::RegexpValidator do
|
6
|
+
let_it_be(:app) do
|
7
|
+
Class.new(Grape::API) do
|
8
|
+
default_format :json
|
24
9
|
|
10
|
+
resources :custom_message do
|
25
11
|
params do
|
26
|
-
requires :name, regexp: /^[a-z]
|
12
|
+
requires :name, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
27
13
|
end
|
28
14
|
get do
|
29
15
|
end
|
30
16
|
|
31
17
|
params do
|
32
|
-
requires :names, type: Array[String], regexp: /^[a-z]
|
18
|
+
requires :names, type: { value: Array[String], message: 'can\'t be nil' }, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
|
33
19
|
end
|
34
20
|
get 'regexp_with_array' do
|
35
21
|
end
|
22
|
+
end
|
36
23
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
24
|
+
params do
|
25
|
+
requires :name, regexp: /^[a-z]+$/
|
26
|
+
end
|
27
|
+
get do
|
28
|
+
end
|
29
|
+
|
30
|
+
params do
|
31
|
+
requires :names, type: Array[String], regexp: /^[a-z]+$/
|
32
|
+
end
|
33
|
+
get 'regexp_with_array' do
|
34
|
+
end
|
35
|
+
|
36
|
+
params do
|
37
|
+
requires :people, type: Hash do
|
38
|
+
requires :names, type: Array[String], regexp: /^[a-z]+$/
|
43
39
|
end
|
44
40
|
end
|
41
|
+
get 'nested_regexp_with_array' do
|
42
|
+
end
|
45
43
|
end
|
46
44
|
end
|
47
45
|
|
48
|
-
def app
|
49
|
-
ValidationsSpec::RegexpValidatorSpec::API
|
50
|
-
end
|
51
|
-
|
52
46
|
context 'custom validation message' do
|
53
47
|
context 'with invalid input' do
|
54
48
|
it 'refuses inapppopriate' do
|
@@ -2,31 +2,25 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Grape::Validations::SameAsValidator do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
5
|
+
describe Grape::Validations::Validators::SameAsValidator do
|
6
|
+
let_it_be(:app) do
|
7
|
+
Class.new(Grape::API) do
|
8
|
+
params do
|
9
|
+
requires :password
|
10
|
+
requires :password_confirmation, same_as: :password
|
11
|
+
end
|
12
|
+
post do
|
13
|
+
end
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
15
|
+
params do
|
16
|
+
requires :password
|
17
|
+
requires :password_confirmation, same_as: { value: :password, message: 'not match' }
|
18
|
+
end
|
19
|
+
post '/custom-message' do
|
22
20
|
end
|
23
21
|
end
|
24
22
|
end
|
25
23
|
|
26
|
-
def app
|
27
|
-
ValidationsSpec::SameAsValidatorSpec::API
|
28
|
-
end
|
29
|
-
|
30
24
|
describe '/' do
|
31
25
|
context 'is the same' do
|
32
26
|
it do
|
@@ -2,11 +2,12 @@
|
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
|
-
describe Grape::Validations::ValuesValidator do
|
6
|
-
|
7
|
-
|
5
|
+
describe Grape::Validations::Validators::ValuesValidator do
|
6
|
+
let_it_be(:values_model) do
|
7
|
+
Class.new do
|
8
8
|
DEFAULT_VALUES = %w[valid-type1 valid-type2 valid-type3].freeze
|
9
9
|
DEFAULT_EXCEPTS = %w[invalid-type1 invalid-type2 invalid-type3].freeze
|
10
|
+
|
10
11
|
class << self
|
11
12
|
def values
|
12
13
|
@values ||= []
|
@@ -33,212 +34,213 @@ describe Grape::Validations::ValuesValidator do
|
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
37
|
+
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
get '/' do
|
46
|
-
{ type: params[:type] }
|
47
|
-
end
|
48
|
-
|
49
|
-
params do
|
50
|
-
optional :type, values: { value: -> { ValuesModel.values }, message: 'value does not include in values' }, default: 'valid-type2'
|
51
|
-
end
|
52
|
-
get '/lambda' do
|
53
|
-
{ type: params[:type] }
|
54
|
-
end
|
55
|
-
|
56
|
-
params do
|
57
|
-
requires :type, values: { except: ValuesModel.excepts, except_message: 'value is on exclusions list', message: 'default exclude message' }
|
58
|
-
end
|
59
|
-
get '/exclude/exclude_message'
|
60
|
-
|
61
|
-
params do
|
62
|
-
requires :type, values: { except: -> { ValuesModel.excepts }, except_message: 'value is on exclusions list' }
|
63
|
-
end
|
64
|
-
get '/exclude/lambda/exclude_message'
|
65
|
-
|
66
|
-
params do
|
67
|
-
requires :type, values: { except: ValuesModel.excepts, message: 'default exclude message' }
|
68
|
-
end
|
69
|
-
get '/exclude/fallback_message'
|
70
|
-
end
|
39
|
+
before do
|
40
|
+
stub_const('ValuesModel', values_model)
|
41
|
+
end
|
42
|
+
|
43
|
+
let_it_be(:app) do
|
44
|
+
ValuesModel = values_model
|
45
|
+
Class.new(Grape::API) do
|
46
|
+
default_format :json
|
71
47
|
|
48
|
+
resources :custom_message do
|
72
49
|
params do
|
73
|
-
requires :type, values: ValuesModel.values
|
50
|
+
requires :type, values: { value: ValuesModel.values, message: 'value does not include in values' }
|
74
51
|
end
|
75
52
|
get '/' do
|
76
53
|
{ type: params[:type] }
|
77
54
|
end
|
78
55
|
|
79
56
|
params do
|
80
|
-
|
57
|
+
optional :type, values: { value: -> { ValuesModel.values }, message: 'value does not include in values' }, default: 'valid-type2'
|
81
58
|
end
|
82
|
-
get '/
|
83
|
-
|
84
|
-
params do
|
85
|
-
optional :type, values: { value: ValuesModel.values }, default: 'valid-type2'
|
86
|
-
end
|
87
|
-
get '/default/hash/valid' do
|
59
|
+
get '/lambda' do
|
88
60
|
{ type: params[:type] }
|
89
61
|
end
|
90
62
|
|
91
63
|
params do
|
92
|
-
|
93
|
-
end
|
94
|
-
get '/default/valid' do
|
95
|
-
{ type: params[:type] }
|
64
|
+
requires :type, values: { except: ValuesModel.excepts, except_message: 'value is on exclusions list', message: 'default exclude message' }
|
96
65
|
end
|
66
|
+
get '/exclude/exclude_message'
|
97
67
|
|
98
68
|
params do
|
99
|
-
|
100
|
-
end
|
101
|
-
get '/default/except' do
|
102
|
-
{ type: params[:type] }
|
69
|
+
requires :type, values: { except: -> { ValuesModel.excepts }, except_message: 'value is on exclusions list' }
|
103
70
|
end
|
71
|
+
get '/exclude/lambda/exclude_message'
|
104
72
|
|
105
73
|
params do
|
106
|
-
|
107
|
-
end
|
108
|
-
get '/lambda' do
|
109
|
-
{ type: params[:type] }
|
74
|
+
requires :type, values: { except: ValuesModel.excepts, message: 'default exclude message' }
|
110
75
|
end
|
76
|
+
get '/exclude/fallback_message'
|
77
|
+
end
|
111
78
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
79
|
+
params do
|
80
|
+
requires :type, values: ValuesModel.values
|
81
|
+
end
|
82
|
+
get '/' do
|
83
|
+
{ type: params[:type] }
|
84
|
+
end
|
118
85
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
{ number: params[:number] }
|
124
|
-
end
|
86
|
+
params do
|
87
|
+
requires :type, values: []
|
88
|
+
end
|
89
|
+
get '/empty'
|
125
90
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
91
|
+
params do
|
92
|
+
optional :type, values: { value: ValuesModel.values }, default: 'valid-type2'
|
93
|
+
end
|
94
|
+
get '/default/hash/valid' do
|
95
|
+
{ type: params[:type] }
|
96
|
+
end
|
130
97
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
98
|
+
params do
|
99
|
+
optional :type, values: ValuesModel.values, default: 'valid-type2'
|
100
|
+
end
|
101
|
+
get '/default/valid' do
|
102
|
+
{ type: params[:type] }
|
103
|
+
end
|
137
104
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
105
|
+
params do
|
106
|
+
optional :type, values: { except: ValuesModel.excepts }, default: 'valid-type2'
|
107
|
+
end
|
108
|
+
get '/default/except' do
|
109
|
+
{ type: params[:type] }
|
110
|
+
end
|
144
111
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
112
|
+
params do
|
113
|
+
optional :type, values: -> { ValuesModel.values }, default: 'valid-type2'
|
114
|
+
end
|
115
|
+
get '/lambda' do
|
116
|
+
{ type: params[:type] }
|
117
|
+
end
|
151
118
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
119
|
+
params do
|
120
|
+
requires :type, values: ->(v) { ValuesModel.include? v }
|
121
|
+
end
|
122
|
+
get '/lambda_val' do
|
123
|
+
{ type: params[:type] }
|
124
|
+
end
|
158
125
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
126
|
+
params do
|
127
|
+
requires :number, type: Integer, values: ->(v) { v > 0 }
|
128
|
+
end
|
129
|
+
get '/lambda_int_val' do
|
130
|
+
{ number: params[:number] }
|
131
|
+
end
|
165
132
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
end
|
171
|
-
get '/optional_with_required_values'
|
133
|
+
params do
|
134
|
+
requires :type, values: -> { [] }
|
135
|
+
end
|
136
|
+
get '/empty_lambda'
|
172
137
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
138
|
+
params do
|
139
|
+
optional :type, values: ValuesModel.values, default: -> { ValuesModel.values.sample }
|
140
|
+
end
|
141
|
+
get '/default_lambda' do
|
142
|
+
{ type: params[:type] }
|
143
|
+
end
|
179
144
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
145
|
+
params do
|
146
|
+
optional :type, values: -> { ValuesModel.values }, default: -> { ValuesModel.values.sample }
|
147
|
+
end
|
148
|
+
get '/default_and_values_lambda' do
|
149
|
+
{ type: params[:type] }
|
150
|
+
end
|
186
151
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
152
|
+
params do
|
153
|
+
optional :type, type: Grape::API::Boolean, desc: 'A boolean', values: [true]
|
154
|
+
end
|
155
|
+
get '/values/optional_boolean' do
|
156
|
+
{ type: params[:type] }
|
157
|
+
end
|
193
158
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
159
|
+
params do
|
160
|
+
requires :type, type: Integer, desc: 'An integer', values: [10, 11], default: 10
|
161
|
+
end
|
162
|
+
get '/values/coercion' do
|
163
|
+
{ type: params[:type] }
|
164
|
+
end
|
200
165
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
166
|
+
params do
|
167
|
+
requires :type, type: Array[Integer], desc: 'An integer', values: [10, 11], default: 10
|
168
|
+
end
|
169
|
+
get '/values/array_coercion' do
|
170
|
+
{ type: params[:type] }
|
171
|
+
end
|
207
172
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
get '/mixed/value/except' do
|
212
|
-
{ type: params[:type] }
|
173
|
+
params do
|
174
|
+
optional :optional, type: Array do
|
175
|
+
requires :type, values: %w[a b]
|
213
176
|
end
|
177
|
+
end
|
178
|
+
get '/optional_with_required_values'
|
214
179
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
180
|
+
params do
|
181
|
+
requires :type, values: { except: ValuesModel.excepts }
|
182
|
+
end
|
183
|
+
get '/except/exclusive' do
|
184
|
+
{ type: params[:type] }
|
185
|
+
end
|
219
186
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
187
|
+
params do
|
188
|
+
requires :type, type: String, values: { except: ValuesModel.excepts }
|
189
|
+
end
|
190
|
+
get '/except/exclusive/type' do
|
191
|
+
{ type: params[:type] }
|
192
|
+
end
|
226
193
|
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
194
|
+
params do
|
195
|
+
requires :type, values: { except: -> { ValuesModel.excepts } }
|
196
|
+
end
|
197
|
+
get '/except/exclusive/lambda' do
|
198
|
+
{ type: params[:type] }
|
199
|
+
end
|
231
200
|
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
201
|
+
params do
|
202
|
+
requires :type, type: String, values: { except: -> { ValuesModel.excepts } }
|
203
|
+
end
|
204
|
+
get '/except/exclusive/lambda/type' do
|
205
|
+
{ type: params[:type] }
|
236
206
|
end
|
237
|
-
end
|
238
|
-
end
|
239
207
|
|
240
|
-
|
241
|
-
|
208
|
+
params do
|
209
|
+
requires :type, type: Integer, values: { except: -> { [3, 4, 5] } }
|
210
|
+
end
|
211
|
+
get '/except/exclusive/lambda/coercion' do
|
212
|
+
{ type: params[:type] }
|
213
|
+
end
|
214
|
+
|
215
|
+
params do
|
216
|
+
requires :type, type: Integer, values: { value: 1..5, except: [3] }
|
217
|
+
end
|
218
|
+
get '/mixed/value/except' do
|
219
|
+
{ type: params[:type] }
|
220
|
+
end
|
221
|
+
|
222
|
+
params do
|
223
|
+
optional :optional, type: Array[String], values: %w[a b c]
|
224
|
+
end
|
225
|
+
put '/optional_with_array_of_string_values'
|
226
|
+
|
227
|
+
params do
|
228
|
+
requires :type, values: { proc: ->(v) { ValuesModel.include? v } }
|
229
|
+
end
|
230
|
+
get '/proc' do
|
231
|
+
{ type: params[:type] }
|
232
|
+
end
|
233
|
+
|
234
|
+
params do
|
235
|
+
requires :type, values: { proc: ->(v) { ValuesModel.include? v }, message: 'failed check' }
|
236
|
+
end
|
237
|
+
get '/proc/message'
|
238
|
+
|
239
|
+
params do
|
240
|
+
optional :name, type: String, values: %w[a b], allow_blank: true
|
241
|
+
end
|
242
|
+
get '/allow_blank'
|
243
|
+
end
|
242
244
|
end
|
243
245
|
|
244
246
|
context 'with a custom validation message' do
|
@@ -255,7 +257,7 @@ describe Grape::Validations::ValuesValidator do
|
|
255
257
|
end
|
256
258
|
|
257
259
|
it 'validates against values in a proc' do
|
258
|
-
|
260
|
+
ValuesModel.add_value('valid-type4')
|
259
261
|
|
260
262
|
get('/custom_message/lambda', type: 'valid-type4')
|
261
263
|
expect(last_response.status).to eq 200
|
@@ -354,15 +356,14 @@ describe Grape::Validations::ValuesValidator do
|
|
354
356
|
end
|
355
357
|
|
356
358
|
it 'does not validate updated values without proc' do
|
357
|
-
|
358
|
-
|
359
|
+
ValuesModel.add_value('valid-type4')
|
359
360
|
get('/', type: 'valid-type4')
|
360
361
|
expect(last_response.status).to eq 400
|
361
362
|
expect(last_response.body).to eq({ error: 'type does not have a valid value' }.to_json)
|
362
363
|
end
|
363
364
|
|
364
365
|
it 'validates against values in a proc' do
|
365
|
-
|
366
|
+
ValuesModel.add_value('valid-type4')
|
366
367
|
|
367
368
|
get('/lambda', type: 'valid-type4')
|
368
369
|
expect(last_response.status).to eq 200
|
@@ -424,7 +425,7 @@ describe Grape::Validations::ValuesValidator do
|
|
424
425
|
it 'raises IncompatibleOptionValues on an invalid default value from proc' do
|
425
426
|
subject = Class.new(Grape::API)
|
426
427
|
expect do
|
427
|
-
subject.params { optional :type, values: %w[valid-type1 valid-type2 valid-type3], default: "#{
|
428
|
+
subject.params { optional :type, values: %w[valid-type1 valid-type2 valid-type3], default: "#{ValuesModel.values.sample}_invalid" }
|
428
429
|
end.to raise_error Grape::Exceptions::IncompatibleOptionValues
|
429
430
|
end
|
430
431
|
|