grape 1.5.3 → 1.7.0
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 +67 -0
- data/CONTRIBUTING.md +2 -1
- data/README.md +150 -21
- data/UPGRADING.md +61 -4
- data/grape.gemspec +5 -5
- data/lib/grape/api/instance.rb +14 -18
- data/lib/grape/api.rb +17 -12
- data/lib/grape/cookies.rb +2 -0
- data/lib/grape/dry_types.rb +12 -0
- data/lib/grape/dsl/api.rb +0 -2
- data/lib/grape/dsl/callbacks.rb +0 -2
- data/lib/grape/dsl/configuration.rb +0 -2
- data/lib/grape/dsl/desc.rb +2 -19
- data/lib/grape/dsl/headers.rb +5 -2
- data/lib/grape/dsl/helpers.rb +7 -7
- data/lib/grape/dsl/inside_route.rb +43 -30
- data/lib/grape/dsl/middleware.rb +4 -6
- data/lib/grape/dsl/parameters.rb +8 -10
- data/lib/grape/dsl/request_response.rb +9 -8
- data/lib/grape/dsl/routing.rb +6 -4
- data/lib/grape/dsl/settings.rb +5 -7
- data/lib/grape/dsl/validations.rb +0 -15
- data/lib/grape/endpoint.rb +20 -35
- data/lib/grape/error_formatter/json.rb +9 -7
- data/lib/grape/error_formatter/xml.rb +2 -6
- data/lib/grape/exceptions/base.rb +2 -2
- data/lib/grape/exceptions/missing_group_type.rb +8 -1
- data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
- data/lib/grape/exceptions/unsupported_group_type.rb +8 -1
- data/lib/grape/exceptions/validation.rb +1 -6
- data/lib/grape/formatter/json.rb +1 -0
- data/lib/grape/formatter/serializable_hash.rb +2 -1
- data/lib/grape/formatter/xml.rb +1 -0
- data/lib/grape/locale/en.yml +9 -8
- data/lib/grape/middleware/auth/dsl.rb +7 -2
- data/lib/grape/middleware/base.rb +3 -1
- data/lib/grape/middleware/error.rb +2 -2
- data/lib/grape/middleware/formatter.rb +4 -4
- data/lib/grape/middleware/stack.rb +2 -2
- data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
- data/lib/grape/middleware/versioner/header.rb +6 -4
- data/lib/grape/middleware/versioner/param.rb +1 -0
- data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
- data/lib/grape/middleware/versioner/path.rb +2 -0
- data/lib/grape/path.rb +1 -0
- data/lib/grape/request.rb +3 -0
- data/lib/grape/router/pattern.rb +1 -1
- data/lib/grape/router/route.rb +2 -2
- data/lib/grape/router.rb +6 -0
- data/lib/grape/util/inheritable_setting.rb +1 -3
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/util/lazy_value.rb +3 -2
- data/lib/grape/util/strict_hash_configuration.rb +1 -1
- data/lib/grape/validations/attributes_doc.rb +58 -0
- data/lib/grape/validations/params_scope.rb +137 -78
- data/lib/grape/validations/types/array_coercer.rb +0 -2
- data/lib/grape/validations/types/custom_type_coercer.rb +1 -0
- data/lib/grape/validations/types/dry_type_coercer.rb +4 -8
- data/lib/grape/validations/types/json.rb +2 -1
- data/lib/grape/validations/types/primitive_coercer.rb +16 -8
- data/lib/grape/validations/types/set_coercer.rb +0 -2
- data/lib/grape/validations/types.rb +98 -30
- 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 +82 -70
- 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 -20
- 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/validations.rb +16 -6
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +69 -29
- data/spec/grape/api/custom_validations_spec.rb +116 -45
- data/spec/grape/api/deeply_included_options_spec.rb +3 -5
- data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -3
- data/spec/grape/api/documentation_spec.rb +59 -0
- data/spec/grape/api/inherited_helpers_spec.rb +0 -2
- data/spec/grape/api/instance_spec.rb +0 -1
- data/spec/grape/api/invalid_format_spec.rb +2 -2
- data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -2
- data/spec/grape/api/nested_helpers_spec.rb +0 -2
- data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -2
- data/spec/grape/api/parameters_modification_spec.rb +0 -2
- data/spec/grape/api/patch_method_helpers_spec.rb +0 -2
- data/spec/grape/api/recognize_path_spec.rb +1 -3
- data/spec/grape/api/required_parameters_in_route_spec.rb +0 -2
- data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -2
- data/spec/grape/api/routes_with_requirements_spec.rb +8 -10
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -17
- data/spec/grape/api/shared_helpers_spec.rb +0 -2
- data/spec/grape/api_remount_spec.rb +16 -16
- data/spec/grape/api_spec.rb +457 -231
- data/spec/grape/config_spec.rb +0 -2
- data/spec/grape/dsl/callbacks_spec.rb +2 -3
- data/spec/grape/dsl/configuration_spec.rb +0 -2
- data/spec/grape/dsl/desc_spec.rb +0 -2
- data/spec/grape/dsl/headers_spec.rb +39 -11
- data/spec/grape/dsl/helpers_spec.rb +3 -4
- data/spec/grape/dsl/inside_route_spec.rb +16 -16
- data/spec/grape/dsl/logger_spec.rb +15 -19
- data/spec/grape/dsl/middleware_spec.rb +2 -3
- data/spec/grape/dsl/parameters_spec.rb +2 -2
- data/spec/grape/dsl/request_response_spec.rb +7 -8
- data/spec/grape/dsl/routing_spec.rb +11 -10
- data/spec/grape/dsl/settings_spec.rb +0 -2
- data/spec/grape/dsl/validations_spec.rb +0 -17
- data/spec/grape/endpoint/declared_spec.rb +261 -16
- data/spec/grape/endpoint_spec.rb +86 -58
- data/spec/grape/entity_spec.rb +22 -23
- data/spec/grape/exceptions/base_spec.rb +16 -2
- data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -2
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -24
- data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -2
- data/spec/grape/exceptions/invalid_response_spec.rb +0 -2
- data/spec/grape/exceptions/invalid_versioner_option_spec.rb +1 -3
- data/spec/grape/exceptions/missing_group_type_spec.rb +21 -0
- data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -2
- data/spec/grape/exceptions/missing_option_spec.rb +1 -3
- data/spec/grape/exceptions/unknown_options_spec.rb +0 -2
- data/spec/grape/exceptions/unknown_validator_spec.rb +0 -2
- data/spec/grape/exceptions/unsupported_group_type_spec.rb +23 -0
- data/spec/grape/exceptions/validation_errors_spec.rb +13 -11
- data/spec/grape/exceptions/validation_spec.rb +5 -5
- data/spec/grape/extensions/param_builders/hash_spec.rb +7 -9
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -10
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -10
- data/spec/grape/integration/global_namespace_function_spec.rb +0 -2
- data/spec/grape/integration/rack_sendfile_spec.rb +1 -3
- data/spec/grape/integration/rack_spec.rb +0 -2
- data/spec/grape/loading_spec.rb +8 -10
- data/spec/grape/middleware/auth/base_spec.rb +0 -1
- data/spec/grape/middleware/auth/dsl_spec.rb +15 -8
- data/spec/grape/middleware/auth/strategies_spec.rb +60 -22
- data/spec/grape/middleware/base_spec.rb +24 -17
- data/spec/grape/middleware/error_spec.rb +8 -3
- data/spec/grape/middleware/exception_spec.rb +111 -163
- data/spec/grape/middleware/formatter_spec.rb +27 -8
- data/spec/grape/middleware/globals_spec.rb +7 -6
- data/spec/grape/middleware/stack_spec.rb +14 -14
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -3
- data/spec/grape/middleware/versioner/header_spec.rb +30 -15
- data/spec/grape/middleware/versioner/param_spec.rb +7 -3
- data/spec/grape/middleware/versioner/path_spec.rb +5 -3
- data/spec/grape/middleware/versioner_spec.rb +1 -3
- data/spec/grape/named_api_spec.rb +0 -2
- data/spec/grape/parser_spec.rb +4 -2
- data/spec/grape/path_spec.rb +52 -54
- data/spec/grape/presenters/presenter_spec.rb +7 -8
- data/spec/grape/request_spec.rb +6 -6
- data/spec/grape/util/inheritable_setting_spec.rb +7 -8
- data/spec/grape/util/inheritable_values_spec.rb +3 -3
- data/spec/grape/util/reverse_stackable_values_spec.rb +3 -2
- data/spec/grape/util/stackable_values_spec.rb +7 -6
- data/spec/grape/util/strict_hash_configuration_spec.rb +0 -1
- data/spec/grape/validations/attributes_doc_spec.rb +153 -0
- data/spec/grape/validations/attributes_iterator_spec.rb +0 -2
- data/spec/grape/validations/instance_behaivour_spec.rb +9 -12
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -2
- data/spec/grape/validations/params_scope_spec.rb +361 -96
- data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -3
- data/spec/grape/validations/types/array_coercer_spec.rb +0 -2
- data/spec/grape/validations/types/primitive_coercer_spec.rb +24 -9
- data/spec/grape/validations/types/set_coercer_spec.rb +0 -2
- data/spec/grape/validations/types_spec.rb +36 -10
- data/spec/grape/validations/validators/all_or_none_spec.rb +50 -58
- data/spec/grape/validations/validators/allow_blank_spec.rb +135 -141
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -58
- data/spec/grape/validations/validators/coerce_spec.rb +23 -24
- data/spec/grape/validations/validators/default_spec.rb +72 -80
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -79
- data/spec/grape/validations/validators/except_values_spec.rb +3 -5
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -79
- data/spec/grape/validations/validators/presence_spec.rb +16 -3
- data/spec/grape/validations/validators/regexp_spec.rb +25 -33
- data/spec/grape/validations/validators/same_as_spec.rb +14 -22
- data/spec/grape/validations/validators/values_spec.rb +182 -179
- data/spec/grape/validations_spec.rb +149 -80
- data/spec/integration/eager_load/eager_load_spec.rb +2 -2
- data/spec/integration/multi_json/json_spec.rb +1 -3
- data/spec/integration/multi_xml/xml_spec.rb +1 -3
- data/spec/shared/versioning_examples.rb +12 -9
- data/spec/spec_helper.rb +21 -6
- data/spec/support/basic_auth_encode_helpers.rb +1 -1
- metadata +126 -117
- data/lib/grape/validations/validators/all_or_none.rb +0 -15
- data/lib/grape/validations/validators/allow_blank.rb +0 -18
- data/lib/grape/validations/validators/as.rb +0 -16
- data/lib/grape/validations/validators/at_least_one_of.rb +0 -14
- data/lib/grape/validations/validators/coerce.rb +0 -91
- data/lib/grape/validations/validators/default.rb +0 -48
- data/lib/grape/validations/validators/exactly_one_of.rb +0 -16
- data/lib/grape/validations/validators/except_values.rb +0 -22
- data/lib/grape/validations/validators/mutual_exclusion.rb +0 -15
- data/lib/grape/validations/validators/presence.rb +0 -12
- data/lib/grape/validations/validators/regexp.rb +0 -13
- data/lib/grape/validations/validators/same_as.rb +0 -26
- data/lib/grape/validations/validators/values.rb +0 -83
- data/spec/support/eager_load.rb +0 -19
@@ -1,12 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
describe Grape::Validations::Validators::ValuesValidator do
|
4
|
+
let_it_be(:values_model) do
|
5
|
+
Class.new do
|
6
|
+
DEFAULT_VALUES = %w[valid-type1 valid-type2 valid-type3].freeze
|
7
|
+
DEFAULT_EXCEPTS = %w[invalid-type1 invalid-type2 invalid-type3].freeze
|
4
8
|
|
5
|
-
describe Grape::Validations::ValuesValidator do
|
6
|
-
module ValidationsSpec
|
7
|
-
class ValuesModel
|
8
|
-
DEFAULT_VALUES = ['valid-type1', 'valid-type2', 'valid-type3'].freeze
|
9
|
-
DEFAULT_EXCEPTS = ['invalid-type1', 'invalid-type2', 'invalid-type3'].freeze
|
10
9
|
class << self
|
11
10
|
def values
|
12
11
|
@values ||= []
|
@@ -27,214 +26,219 @@ describe Grape::Validations::ValuesValidator do
|
|
27
26
|
@excepts ||= []
|
28
27
|
@excepts << except
|
29
28
|
end
|
29
|
+
|
30
|
+
def include?(value)
|
31
|
+
values.include?(value)
|
32
|
+
end
|
30
33
|
end
|
31
34
|
end
|
35
|
+
end
|
32
36
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
resources :custom_message do
|
38
|
-
params do
|
39
|
-
requires :type, values: { value: ValuesModel.values, message: 'value does not include in values' }
|
40
|
-
end
|
41
|
-
get '/' do
|
42
|
-
{ type: params[:type] }
|
43
|
-
end
|
44
|
-
|
45
|
-
params do
|
46
|
-
optional :type, values: { value: -> { ValuesModel.values }, message: 'value does not include in values' }, default: 'valid-type2'
|
47
|
-
end
|
48
|
-
get '/lambda' do
|
49
|
-
{ type: params[:type] }
|
50
|
-
end
|
51
|
-
|
52
|
-
params do
|
53
|
-
requires :type, values: { except: ValuesModel.excepts, except_message: 'value is on exclusions list', message: 'default exclude message' }
|
54
|
-
end
|
55
|
-
get '/exclude/exclude_message'
|
56
|
-
|
57
|
-
params do
|
58
|
-
requires :type, values: { except: -> { ValuesModel.excepts }, except_message: 'value is on exclusions list' }
|
59
|
-
end
|
60
|
-
get '/exclude/lambda/exclude_message'
|
61
|
-
|
62
|
-
params do
|
63
|
-
requires :type, values: { except: ValuesModel.excepts, message: 'default exclude message' }
|
64
|
-
end
|
65
|
-
get '/exclude/fallback_message'
|
66
|
-
end
|
37
|
+
before do
|
38
|
+
stub_const('ValuesModel', values_model)
|
39
|
+
end
|
67
40
|
|
41
|
+
let_it_be(:app) do
|
42
|
+
ValuesModel = values_model
|
43
|
+
Class.new(Grape::API) do
|
44
|
+
default_format :json
|
45
|
+
|
46
|
+
resources :custom_message do
|
68
47
|
params do
|
69
|
-
requires :type, values: ValuesModel.values
|
48
|
+
requires :type, values: { value: ValuesModel.values, message: 'value does not include in values' }
|
70
49
|
end
|
71
50
|
get '/' do
|
72
51
|
{ type: params[:type] }
|
73
52
|
end
|
74
53
|
|
75
54
|
params do
|
76
|
-
|
77
|
-
end
|
78
|
-
get '/empty'
|
79
|
-
|
80
|
-
params do
|
81
|
-
optional :type, values: { value: ValuesModel.values }, default: 'valid-type2'
|
55
|
+
optional :type, values: { value: -> { ValuesModel.values }, message: 'value does not include in values' }, default: 'valid-type2'
|
82
56
|
end
|
83
|
-
get '/
|
57
|
+
get '/lambda' do
|
84
58
|
{ type: params[:type] }
|
85
59
|
end
|
86
60
|
|
87
61
|
params do
|
88
|
-
|
89
|
-
end
|
90
|
-
get '/default/valid' do
|
91
|
-
{ type: params[:type] }
|
62
|
+
requires :type, values: { except: ValuesModel.excepts, except_message: 'value is on exclusions list', message: 'default exclude message' }
|
92
63
|
end
|
64
|
+
get '/exclude/exclude_message'
|
93
65
|
|
94
66
|
params do
|
95
|
-
|
96
|
-
end
|
97
|
-
get '/default/except' do
|
98
|
-
{ type: params[:type] }
|
67
|
+
requires :type, values: { except: -> { ValuesModel.excepts }, except_message: 'value is on exclusions list' }
|
99
68
|
end
|
69
|
+
get '/exclude/lambda/exclude_message'
|
100
70
|
|
101
71
|
params do
|
102
|
-
|
103
|
-
end
|
104
|
-
get '/lambda' do
|
105
|
-
{ type: params[:type] }
|
72
|
+
requires :type, values: { except: ValuesModel.excepts, message: 'default exclude message' }
|
106
73
|
end
|
74
|
+
get '/exclude/fallback_message'
|
75
|
+
end
|
107
76
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
77
|
+
params do
|
78
|
+
requires :type, values: ValuesModel.values
|
79
|
+
end
|
80
|
+
get '/' do
|
81
|
+
{ type: params[:type] }
|
82
|
+
end
|
114
83
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
{ number: params[:number] }
|
120
|
-
end
|
84
|
+
params do
|
85
|
+
requires :type, values: []
|
86
|
+
end
|
87
|
+
get '/empty'
|
121
88
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
89
|
+
params do
|
90
|
+
optional :type, values: { value: ValuesModel.values }, default: 'valid-type2'
|
91
|
+
end
|
92
|
+
get '/default/hash/valid' do
|
93
|
+
{ type: params[:type] }
|
94
|
+
end
|
126
95
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
96
|
+
params do
|
97
|
+
optional :type, values: ValuesModel.values, default: 'valid-type2'
|
98
|
+
end
|
99
|
+
get '/default/valid' do
|
100
|
+
{ type: params[:type] }
|
101
|
+
end
|
133
102
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
103
|
+
params do
|
104
|
+
optional :type, values: { except: ValuesModel.excepts }, default: 'valid-type2'
|
105
|
+
end
|
106
|
+
get '/default/except' do
|
107
|
+
{ type: params[:type] }
|
108
|
+
end
|
140
109
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
110
|
+
params do
|
111
|
+
optional :type, values: -> { ValuesModel.values }, default: 'valid-type2'
|
112
|
+
end
|
113
|
+
get '/lambda' do
|
114
|
+
{ type: params[:type] }
|
115
|
+
end
|
147
116
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
117
|
+
params do
|
118
|
+
requires :type, values: ->(v) { ValuesModel.include? v }
|
119
|
+
end
|
120
|
+
get '/lambda_val' do
|
121
|
+
{ type: params[:type] }
|
122
|
+
end
|
154
123
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
124
|
+
params do
|
125
|
+
requires :number, type: Integer, values: ->(v) { v > 0 }
|
126
|
+
end
|
127
|
+
get '/lambda_int_val' do
|
128
|
+
{ number: params[:number] }
|
129
|
+
end
|
161
130
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
end
|
167
|
-
get '/optional_with_required_values'
|
131
|
+
params do
|
132
|
+
requires :type, values: -> { [] }
|
133
|
+
end
|
134
|
+
get '/empty_lambda'
|
168
135
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
136
|
+
params do
|
137
|
+
optional :type, values: ValuesModel.values, default: -> { ValuesModel.values.sample }
|
138
|
+
end
|
139
|
+
get '/default_lambda' do
|
140
|
+
{ type: params[:type] }
|
141
|
+
end
|
175
142
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
143
|
+
params do
|
144
|
+
optional :type, values: -> { ValuesModel.values }, default: -> { ValuesModel.values.sample }
|
145
|
+
end
|
146
|
+
get '/default_and_values_lambda' do
|
147
|
+
{ type: params[:type] }
|
148
|
+
end
|
182
149
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
150
|
+
params do
|
151
|
+
optional :type, type: Grape::API::Boolean, desc: 'A boolean', values: [true]
|
152
|
+
end
|
153
|
+
get '/values/optional_boolean' do
|
154
|
+
{ type: params[:type] }
|
155
|
+
end
|
189
156
|
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
157
|
+
params do
|
158
|
+
requires :type, type: Integer, desc: 'An integer', values: [10, 11], default: 10
|
159
|
+
end
|
160
|
+
get '/values/coercion' do
|
161
|
+
{ type: params[:type] }
|
162
|
+
end
|
196
163
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
164
|
+
params do
|
165
|
+
requires :type, type: Array[Integer], desc: 'An integer', values: [10, 11], default: 10
|
166
|
+
end
|
167
|
+
get '/values/array_coercion' do
|
168
|
+
{ type: params[:type] }
|
169
|
+
end
|
203
170
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
get '/mixed/value/except' do
|
208
|
-
{ type: params[:type] }
|
171
|
+
params do
|
172
|
+
optional :optional, type: Array do
|
173
|
+
requires :type, values: %w[a b]
|
209
174
|
end
|
175
|
+
end
|
176
|
+
get '/optional_with_required_values'
|
210
177
|
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
178
|
+
params do
|
179
|
+
requires :type, values: { except: ValuesModel.excepts }
|
180
|
+
end
|
181
|
+
get '/except/exclusive' do
|
182
|
+
{ type: params[:type] }
|
183
|
+
end
|
215
184
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
185
|
+
params do
|
186
|
+
requires :type, type: String, values: { except: ValuesModel.excepts }
|
187
|
+
end
|
188
|
+
get '/except/exclusive/type' do
|
189
|
+
{ type: params[:type] }
|
190
|
+
end
|
222
191
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
192
|
+
params do
|
193
|
+
requires :type, values: { except: -> { ValuesModel.excepts } }
|
194
|
+
end
|
195
|
+
get '/except/exclusive/lambda' do
|
196
|
+
{ type: params[:type] }
|
197
|
+
end
|
227
198
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
199
|
+
params do
|
200
|
+
requires :type, type: String, values: { except: -> { ValuesModel.excepts } }
|
201
|
+
end
|
202
|
+
get '/except/exclusive/lambda/type' do
|
203
|
+
{ type: params[:type] }
|
232
204
|
end
|
233
|
-
end
|
234
|
-
end
|
235
205
|
|
236
|
-
|
237
|
-
|
206
|
+
params do
|
207
|
+
requires :type, type: Integer, values: { except: -> { [3, 4, 5] } }
|
208
|
+
end
|
209
|
+
get '/except/exclusive/lambda/coercion' do
|
210
|
+
{ type: params[:type] }
|
211
|
+
end
|
212
|
+
|
213
|
+
params do
|
214
|
+
requires :type, type: Integer, values: { value: 1..5, except: [3] }
|
215
|
+
end
|
216
|
+
get '/mixed/value/except' do
|
217
|
+
{ type: params[:type] }
|
218
|
+
end
|
219
|
+
|
220
|
+
params do
|
221
|
+
optional :optional, type: Array[String], values: %w[a b c]
|
222
|
+
end
|
223
|
+
put '/optional_with_array_of_string_values'
|
224
|
+
|
225
|
+
params do
|
226
|
+
requires :type, values: { proc: ->(v) { ValuesModel.include? v } }
|
227
|
+
end
|
228
|
+
get '/proc' do
|
229
|
+
{ type: params[:type] }
|
230
|
+
end
|
231
|
+
|
232
|
+
params do
|
233
|
+
requires :type, values: { proc: ->(v) { ValuesModel.include? v }, message: 'failed check' }
|
234
|
+
end
|
235
|
+
get '/proc/message'
|
236
|
+
|
237
|
+
params do
|
238
|
+
optional :name, type: String, values: %w[a b], allow_blank: true
|
239
|
+
end
|
240
|
+
get '/allow_blank'
|
241
|
+
end
|
238
242
|
end
|
239
243
|
|
240
244
|
context 'with a custom validation message' do
|
@@ -251,7 +255,7 @@ describe Grape::Validations::ValuesValidator do
|
|
251
255
|
end
|
252
256
|
|
253
257
|
it 'validates against values in a proc' do
|
254
|
-
|
258
|
+
ValuesModel.add_value('valid-type4')
|
255
259
|
|
256
260
|
get('/custom_message/lambda', type: 'valid-type4')
|
257
261
|
expect(last_response.status).to eq 200
|
@@ -350,15 +354,14 @@ describe Grape::Validations::ValuesValidator do
|
|
350
354
|
end
|
351
355
|
|
352
356
|
it 'does not validate updated values without proc' do
|
353
|
-
|
354
|
-
|
357
|
+
ValuesModel.add_value('valid-type4')
|
355
358
|
get('/', type: 'valid-type4')
|
356
359
|
expect(last_response.status).to eq 400
|
357
360
|
expect(last_response.body).to eq({ error: 'type does not have a valid value' }.to_json)
|
358
361
|
end
|
359
362
|
|
360
363
|
it 'validates against values in a proc' do
|
361
|
-
|
364
|
+
ValuesModel.add_value('valid-type4')
|
362
365
|
|
363
366
|
get('/lambda', type: 'valid-type4')
|
364
367
|
expect(last_response.status).to eq 200
|
@@ -420,21 +423,21 @@ describe Grape::Validations::ValuesValidator do
|
|
420
423
|
it 'raises IncompatibleOptionValues on an invalid default value from proc' do
|
421
424
|
subject = Class.new(Grape::API)
|
422
425
|
expect do
|
423
|
-
subject.params { optional :type, values: [
|
426
|
+
subject.params { optional :type, values: %w[valid-type1 valid-type2 valid-type3], default: "#{ValuesModel.values.sample}_invalid" }
|
424
427
|
end.to raise_error Grape::Exceptions::IncompatibleOptionValues
|
425
428
|
end
|
426
429
|
|
427
430
|
it 'raises IncompatibleOptionValues on an invalid default value' do
|
428
431
|
subject = Class.new(Grape::API)
|
429
432
|
expect do
|
430
|
-
subject.params { optional :type, values: [
|
433
|
+
subject.params { optional :type, values: %w[valid-type1 valid-type2 valid-type3], default: 'invalid-type' }
|
431
434
|
end.to raise_error Grape::Exceptions::IncompatibleOptionValues
|
432
435
|
end
|
433
436
|
|
434
437
|
it 'raises IncompatibleOptionValues when type is incompatible with values array' do
|
435
438
|
subject = Class.new(Grape::API)
|
436
439
|
expect do
|
437
|
-
subject.params { optional :type, values: [
|
440
|
+
subject.params { optional :type, values: %w[valid-type1 valid-type2 valid-type3], type: Symbol }
|
438
441
|
end.to raise_error Grape::Exceptions::IncompatibleOptionValues
|
439
442
|
end
|
440
443
|
|
@@ -648,9 +651,9 @@ describe Grape::Validations::ValuesValidator do
|
|
648
651
|
end
|
649
652
|
|
650
653
|
it 'accepts multiple valid values' do
|
651
|
-
get '/proc', type: [
|
654
|
+
get '/proc', type: %w[valid-type1 valid-type3]
|
652
655
|
expect(last_response.status).to eq 200
|
653
|
-
expect(last_response.body).to eq({ type: [
|
656
|
+
expect(last_response.body).to eq({ type: %w[valid-type1 valid-type3] }.to_json)
|
654
657
|
end
|
655
658
|
|
656
659
|
it 'rejects a single invalid value' do
|
@@ -660,7 +663,7 @@ describe Grape::Validations::ValuesValidator do
|
|
660
663
|
end
|
661
664
|
|
662
665
|
it 'rejects an invalid value among valid ones' do
|
663
|
-
get '/proc', type: [
|
666
|
+
get '/proc', type: %w[valid-type1 invalid-type1 valid-type3]
|
664
667
|
expect(last_response.status).to eq 400
|
665
668
|
expect(last_response.body).to eq({ error: 'type does not have a valid value' }.to_json)
|
666
669
|
end
|