grape 1.5.2 → 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.
Files changed (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +75 -0
  3. data/CONTRIBUTING.md +2 -1
  4. data/README.md +152 -21
  5. data/UPGRADING.md +86 -2
  6. data/grape.gemspec +5 -5
  7. data/lib/grape/api/instance.rb +14 -18
  8. data/lib/grape/api.rb +18 -13
  9. data/lib/grape/cookies.rb +2 -0
  10. data/lib/grape/dry_types.rb +12 -0
  11. data/lib/grape/dsl/api.rb +0 -2
  12. data/lib/grape/dsl/callbacks.rb +0 -2
  13. data/lib/grape/dsl/configuration.rb +0 -2
  14. data/lib/grape/dsl/desc.rb +2 -19
  15. data/lib/grape/dsl/headers.rb +5 -2
  16. data/lib/grape/dsl/helpers.rb +7 -7
  17. data/lib/grape/dsl/inside_route.rb +43 -30
  18. data/lib/grape/dsl/middleware.rb +4 -6
  19. data/lib/grape/dsl/parameters.rb +8 -10
  20. data/lib/grape/dsl/request_response.rb +9 -8
  21. data/lib/grape/dsl/routing.rb +6 -4
  22. data/lib/grape/dsl/settings.rb +5 -7
  23. data/lib/grape/dsl/validations.rb +0 -15
  24. data/lib/grape/endpoint.rb +21 -36
  25. data/lib/grape/error_formatter/json.rb +9 -7
  26. data/lib/grape/error_formatter/xml.rb +2 -6
  27. data/lib/grape/exceptions/base.rb +2 -2
  28. data/lib/grape/exceptions/empty_message_body.rb +11 -0
  29. data/lib/grape/exceptions/missing_group_type.rb +8 -1
  30. data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
  31. data/lib/grape/exceptions/unsupported_group_type.rb +8 -1
  32. data/lib/grape/exceptions/validation.rb +1 -6
  33. data/lib/grape/formatter/json.rb +1 -0
  34. data/lib/grape/formatter/serializable_hash.rb +2 -1
  35. data/lib/grape/formatter/xml.rb +1 -0
  36. data/lib/grape/locale/en.yml +9 -8
  37. data/lib/grape/middleware/auth/dsl.rb +7 -2
  38. data/lib/grape/middleware/base.rb +3 -1
  39. data/lib/grape/middleware/error.rb +2 -2
  40. data/lib/grape/middleware/formatter.rb +4 -4
  41. data/lib/grape/middleware/stack.rb +2 -2
  42. data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
  43. data/lib/grape/middleware/versioner/header.rb +6 -4
  44. data/lib/grape/middleware/versioner/param.rb +1 -0
  45. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
  46. data/lib/grape/middleware/versioner/path.rb +2 -0
  47. data/lib/grape/parser/json.rb +1 -1
  48. data/lib/grape/parser/xml.rb +1 -1
  49. data/lib/grape/path.rb +1 -0
  50. data/lib/grape/request.rb +5 -0
  51. data/lib/grape/router/pattern.rb +1 -1
  52. data/lib/grape/router/route.rb +2 -2
  53. data/lib/grape/router.rb +6 -0
  54. data/lib/grape/util/inheritable_setting.rb +1 -3
  55. data/lib/grape/util/json.rb +2 -0
  56. data/lib/grape/util/lazy_value.rb +3 -2
  57. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  58. data/lib/grape/validations/attributes_doc.rb +58 -0
  59. data/lib/grape/validations/params_scope.rb +137 -78
  60. data/lib/grape/validations/types/array_coercer.rb +0 -2
  61. data/lib/grape/validations/types/custom_type_coercer.rb +1 -2
  62. data/lib/grape/validations/types/dry_type_coercer.rb +4 -8
  63. data/lib/grape/validations/types/json.rb +2 -1
  64. data/lib/grape/validations/types/primitive_coercer.rb +16 -8
  65. data/lib/grape/validations/types/set_coercer.rb +0 -2
  66. data/lib/grape/validations/types.rb +98 -30
  67. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  68. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  69. data/lib/grape/validations/validators/as_validator.rb +14 -0
  70. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  71. data/lib/grape/validations/validators/base.rb +82 -70
  72. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  73. data/lib/grape/validations/validators/default_validator.rb +51 -0
  74. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  75. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  76. data/lib/grape/validations/validators/multiple_params_base.rb +24 -20
  77. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  78. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  79. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  80. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  81. data/lib/grape/validations/validators/values_validator.rb +88 -0
  82. data/lib/grape/validations.rb +16 -6
  83. data/lib/grape/version.rb +1 -1
  84. data/lib/grape.rb +70 -29
  85. data/spec/grape/api/custom_validations_spec.rb +116 -45
  86. data/spec/grape/api/deeply_included_options_spec.rb +3 -5
  87. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -3
  88. data/spec/grape/api/documentation_spec.rb +59 -0
  89. data/spec/grape/api/inherited_helpers_spec.rb +0 -2
  90. data/spec/grape/api/instance_spec.rb +0 -1
  91. data/spec/grape/api/invalid_format_spec.rb +2 -2
  92. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -2
  93. data/spec/grape/api/nested_helpers_spec.rb +0 -2
  94. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -2
  95. data/spec/grape/api/parameters_modification_spec.rb +0 -2
  96. data/spec/grape/api/patch_method_helpers_spec.rb +0 -2
  97. data/spec/grape/api/recognize_path_spec.rb +1 -3
  98. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -2
  99. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -2
  100. data/spec/grape/api/routes_with_requirements_spec.rb +8 -10
  101. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -17
  102. data/spec/grape/api/shared_helpers_spec.rb +0 -2
  103. data/spec/grape/api_remount_spec.rb +16 -16
  104. data/spec/grape/api_spec.rb +527 -224
  105. data/spec/grape/config_spec.rb +0 -2
  106. data/spec/grape/dsl/callbacks_spec.rb +2 -3
  107. data/spec/grape/dsl/configuration_spec.rb +0 -2
  108. data/spec/grape/dsl/desc_spec.rb +0 -2
  109. data/spec/grape/dsl/headers_spec.rb +39 -11
  110. data/spec/grape/dsl/helpers_spec.rb +3 -4
  111. data/spec/grape/dsl/inside_route_spec.rb +16 -16
  112. data/spec/grape/dsl/logger_spec.rb +15 -19
  113. data/spec/grape/dsl/middleware_spec.rb +2 -3
  114. data/spec/grape/dsl/parameters_spec.rb +2 -2
  115. data/spec/grape/dsl/request_response_spec.rb +7 -8
  116. data/spec/grape/dsl/routing_spec.rb +11 -10
  117. data/spec/grape/dsl/settings_spec.rb +0 -2
  118. data/spec/grape/dsl/validations_spec.rb +0 -17
  119. data/spec/grape/endpoint/declared_spec.rb +261 -16
  120. data/spec/grape/endpoint_spec.rb +98 -57
  121. data/spec/grape/entity_spec.rb +22 -23
  122. data/spec/grape/exceptions/base_spec.rb +16 -2
  123. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -2
  124. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -24
  125. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -2
  126. data/spec/grape/exceptions/invalid_response_spec.rb +0 -2
  127. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +1 -3
  128. data/spec/grape/exceptions/missing_group_type_spec.rb +21 -0
  129. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -2
  130. data/spec/grape/exceptions/missing_option_spec.rb +1 -3
  131. data/spec/grape/exceptions/unknown_options_spec.rb +0 -2
  132. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -2
  133. data/spec/grape/exceptions/unsupported_group_type_spec.rb +23 -0
  134. data/spec/grape/exceptions/validation_errors_spec.rb +13 -11
  135. data/spec/grape/exceptions/validation_spec.rb +5 -5
  136. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -9
  137. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -10
  138. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -10
  139. data/spec/grape/integration/global_namespace_function_spec.rb +0 -2
  140. data/spec/grape/integration/rack_sendfile_spec.rb +1 -3
  141. data/spec/grape/integration/rack_spec.rb +0 -2
  142. data/spec/grape/loading_spec.rb +8 -10
  143. data/spec/grape/middleware/auth/base_spec.rb +0 -1
  144. data/spec/grape/middleware/auth/dsl_spec.rb +15 -8
  145. data/spec/grape/middleware/auth/strategies_spec.rb +60 -22
  146. data/spec/grape/middleware/base_spec.rb +24 -17
  147. data/spec/grape/middleware/error_spec.rb +8 -3
  148. data/spec/grape/middleware/exception_spec.rb +111 -163
  149. data/spec/grape/middleware/formatter_spec.rb +27 -8
  150. data/spec/grape/middleware/globals_spec.rb +7 -6
  151. data/spec/grape/middleware/stack_spec.rb +14 -14
  152. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -3
  153. data/spec/grape/middleware/versioner/header_spec.rb +30 -15
  154. data/spec/grape/middleware/versioner/param_spec.rb +7 -3
  155. data/spec/grape/middleware/versioner/path_spec.rb +5 -3
  156. data/spec/grape/middleware/versioner_spec.rb +1 -3
  157. data/spec/grape/named_api_spec.rb +0 -2
  158. data/spec/grape/parser_spec.rb +4 -2
  159. data/spec/grape/path_spec.rb +52 -54
  160. data/spec/grape/presenters/presenter_spec.rb +7 -8
  161. data/spec/grape/request_spec.rb +6 -6
  162. data/spec/grape/util/inheritable_setting_spec.rb +7 -8
  163. data/spec/grape/util/inheritable_values_spec.rb +3 -3
  164. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -2
  165. data/spec/grape/util/stackable_values_spec.rb +7 -6
  166. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -1
  167. data/spec/grape/validations/attributes_doc_spec.rb +153 -0
  168. data/spec/grape/validations/attributes_iterator_spec.rb +0 -2
  169. data/spec/grape/validations/instance_behaivour_spec.rb +9 -12
  170. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -2
  171. data/spec/grape/validations/params_scope_spec.rb +361 -96
  172. data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -3
  173. data/spec/grape/validations/types/array_coercer_spec.rb +0 -2
  174. data/spec/grape/validations/types/primitive_coercer_spec.rb +24 -9
  175. data/spec/grape/validations/types/set_coercer_spec.rb +0 -2
  176. data/spec/grape/validations/types_spec.rb +36 -10
  177. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -58
  178. data/spec/grape/validations/validators/allow_blank_spec.rb +135 -141
  179. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -58
  180. data/spec/grape/validations/validators/coerce_spec.rb +99 -24
  181. data/spec/grape/validations/validators/default_spec.rb +72 -80
  182. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -79
  183. data/spec/grape/validations/validators/except_values_spec.rb +3 -5
  184. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -79
  185. data/spec/grape/validations/validators/presence_spec.rb +16 -3
  186. data/spec/grape/validations/validators/regexp_spec.rb +25 -33
  187. data/spec/grape/validations/validators/same_as_spec.rb +14 -22
  188. data/spec/grape/validations/validators/values_spec.rb +182 -179
  189. data/spec/grape/validations_spec.rb +149 -80
  190. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  191. data/spec/integration/multi_json/json_spec.rb +1 -3
  192. data/spec/integration/multi_xml/xml_spec.rb +1 -3
  193. data/spec/shared/versioning_examples.rb +12 -9
  194. data/spec/spec_helper.rb +21 -6
  195. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  196. metadata +125 -115
  197. data/lib/grape/validations/validators/all_or_none.rb +0 -15
  198. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  199. data/lib/grape/validations/validators/as.rb +0 -16
  200. data/lib/grape/validations/validators/at_least_one_of.rb +0 -14
  201. data/lib/grape/validations/validators/coerce.rb +0 -91
  202. data/lib/grape/validations/validators/default.rb +0 -48
  203. data/lib/grape/validations/validators/exactly_one_of.rb +0 -16
  204. data/lib/grape/validations/validators/except_values.rb +0 -22
  205. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -15
  206. data/lib/grape/validations/validators/presence.rb +0 -12
  207. data/lib/grape/validations/validators/regexp.rb +0 -13
  208. data/lib/grape/validations/validators/same_as.rb +0 -26
  209. data/lib/grape/validations/validators/values.rb +0 -83
  210. data/spec/support/eager_load.rb +0 -19
@@ -1,96 +1,88 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
- describe Grape::Validations::ExactlyOneOfValidator do
6
- describe '#validate!' do
7
- subject(:validate) { post path, params }
8
-
9
- module ValidationsSpec
10
- module ExactlyOneOfValidatorSpec
11
- class API < Grape::API
12
- rescue_from Grape::Exceptions::ValidationErrors do |e|
13
- error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
14
- end
3
+ describe Grape::Validations::Validators::ExactlyOneOfValidator do
4
+ let_it_be(:app) do
5
+ Class.new(Grape::API) do
6
+ rescue_from Grape::Exceptions::ValidationErrors do |e|
7
+ error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
8
+ end
15
9
 
16
- params do
17
- optional :beer
18
- optional :wine
19
- optional :grapefruit
20
- exactly_one_of :beer, :wine, :grapefruit
21
- end
22
- post do
23
- end
10
+ params do
11
+ optional :beer
12
+ optional :wine
13
+ optional :grapefruit
14
+ exactly_one_of :beer, :wine, :grapefruit
15
+ end
16
+ post do
17
+ end
24
18
 
25
- params do
26
- optional :beer
27
- optional :wine
28
- optional :grapefruit
29
- optional :other
30
- exactly_one_of :beer, :wine, :grapefruit
31
- end
32
- post 'mixed-params' do
33
- end
19
+ params do
20
+ optional :beer
21
+ optional :wine
22
+ optional :grapefruit
23
+ optional :other
24
+ exactly_one_of :beer, :wine, :grapefruit
25
+ end
26
+ post 'mixed-params' do
27
+ end
34
28
 
35
- params do
36
- optional :beer
37
- optional :wine
38
- optional :grapefruit
39
- exactly_one_of :beer, :wine, :grapefruit, message: 'you should choose one'
40
- end
41
- post '/custom-message' do
42
- end
29
+ params do
30
+ optional :beer
31
+ optional :wine
32
+ optional :grapefruit
33
+ exactly_one_of :beer, :wine, :grapefruit, message: 'you should choose one'
34
+ end
35
+ post '/custom-message' do
36
+ end
43
37
 
44
- params do
45
- requires :item, type: Hash do
46
- optional :beer
47
- optional :wine
48
- optional :grapefruit
49
- exactly_one_of :beer, :wine, :grapefruit
50
- end
51
- end
52
- post '/nested-hash' do
53
- end
38
+ params do
39
+ requires :item, type: Hash do
40
+ optional :beer
41
+ optional :wine
42
+ optional :grapefruit
43
+ exactly_one_of :beer, :wine, :grapefruit
44
+ end
45
+ end
46
+ post '/nested-hash' do
47
+ end
54
48
 
55
- params do
56
- optional :item, type: Hash do
57
- optional :beer
58
- optional :wine
59
- optional :grapefruit
60
- exactly_one_of :beer, :wine, :grapefruit
61
- end
62
- end
63
- post '/nested-optional-hash' do
64
- end
49
+ params do
50
+ optional :item, type: Hash do
51
+ optional :beer
52
+ optional :wine
53
+ optional :grapefruit
54
+ exactly_one_of :beer, :wine, :grapefruit
55
+ end
56
+ end
57
+ post '/nested-optional-hash' do
58
+ end
65
59
 
66
- params do
67
- requires :items, type: Array do
68
- optional :beer
69
- optional :wine
70
- optional :grapefruit
71
- exactly_one_of :beer, :wine, :grapefruit
72
- end
73
- end
74
- post '/nested-array' do
75
- end
60
+ params do
61
+ requires :items, type: Array do
62
+ optional :beer
63
+ optional :wine
64
+ optional :grapefruit
65
+ exactly_one_of :beer, :wine, :grapefruit
66
+ end
67
+ end
68
+ post '/nested-array' do
69
+ end
76
70
 
77
- params do
78
- requires :items, type: Array do
79
- requires :nested_items, type: Array do
80
- optional :beer, :wine, :grapefruit, type: Boolean
81
- exactly_one_of :beer, :wine, :grapefruit
82
- end
83
- end
84
- end
85
- post '/deeply-nested-array' do
71
+ params do
72
+ requires :items, type: Array do
73
+ requires :nested_items, type: Array do
74
+ optional :beer, :wine, :grapefruit, type: Grape::API::Boolean
75
+ exactly_one_of :beer, :wine, :grapefruit
86
76
  end
87
77
  end
88
78
  end
79
+ post '/deeply-nested-array' do
80
+ end
89
81
  end
82
+ end
90
83
 
91
- def app
92
- ValidationsSpec::ExactlyOneOfValidatorSpec::API
93
- end
84
+ describe '#validate!' do
85
+ subject(:validate) { post path, params }
94
86
 
95
87
  context 'when all params are present' do
96
88
  let(:path) { '/' }
@@ -1,11 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
- describe Grape::Validations::ExceptValuesValidator do
3
+ describe Grape::Validations::Validators::ExceptValuesValidator do
6
4
  module ValidationsSpec
7
5
  class ExceptValuesModel
8
- DEFAULT_EXCEPTS = ['invalid-type1', 'invalid-type2', 'invalid-type3'].freeze
6
+ DEFAULT_EXCEPTS = %w[invalid-type1 invalid-type2 invalid-type3].freeze
9
7
  class << self
10
8
  attr_accessor :excepts
11
9
 
@@ -170,7 +168,7 @@ describe Grape::Validations::ExceptValuesValidator do
170
168
  it 'raises IncompatibleOptionValues when type is incompatible with values array' do
171
169
  subject = Class.new(Grape::API)
172
170
  expect do
173
- subject.params { optional :type, except_values: ['valid-type1', 'valid-type2', 'valid-type3'], type: Symbol }
171
+ subject.params { optional :type, except_values: %w[valid-type1 valid-type2 valid-type3], type: Symbol }
174
172
  end.to raise_error Grape::Exceptions::IncompatibleOptionValues
175
173
  end
176
174
 
@@ -1,96 +1,88 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
- describe Grape::Validations::MutualExclusionValidator do
6
- describe '#validate!' do
7
- subject(:validate) { post path, params }
8
-
9
- module ValidationsSpec
10
- module MutualExclusionValidatorSpec
11
- class API < Grape::API
12
- rescue_from Grape::Exceptions::ValidationErrors do |e|
13
- error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
14
- end
3
+ describe Grape::Validations::Validators::MutualExclusionValidator do
4
+ let_it_be(:app) do
5
+ Class.new(Grape::API) do
6
+ rescue_from Grape::Exceptions::ValidationErrors do |e|
7
+ error!(e.errors.transform_keys! { |key| key.join(',') }, 400)
8
+ end
15
9
 
16
- params do
17
- optional :beer
18
- optional :wine
19
- optional :grapefruit
20
- mutually_exclusive :beer, :wine, :grapefruit
21
- end
22
- post do
23
- end
10
+ params do
11
+ optional :beer
12
+ optional :wine
13
+ optional :grapefruit
14
+ mutually_exclusive :beer, :wine, :grapefruit
15
+ end
16
+ post do
17
+ end
24
18
 
25
- params do
26
- optional :beer
27
- optional :wine
28
- optional :grapefruit
29
- optional :other
30
- mutually_exclusive :beer, :wine, :grapefruit
31
- end
32
- post 'mixed-params' do
33
- end
19
+ params do
20
+ optional :beer
21
+ optional :wine
22
+ optional :grapefruit
23
+ optional :other
24
+ mutually_exclusive :beer, :wine, :grapefruit
25
+ end
26
+ post 'mixed-params' do
27
+ end
34
28
 
35
- params do
36
- optional :beer
37
- optional :wine
38
- optional :grapefruit
39
- mutually_exclusive :beer, :wine, :grapefruit, message: 'you should not mix beer and wine'
40
- end
41
- post '/custom-message' do
42
- end
29
+ params do
30
+ optional :beer
31
+ optional :wine
32
+ optional :grapefruit
33
+ mutually_exclusive :beer, :wine, :grapefruit, message: 'you should not mix beer and wine'
34
+ end
35
+ post '/custom-message' do
36
+ end
43
37
 
44
- params do
45
- requires :item, type: Hash do
46
- optional :beer
47
- optional :wine
48
- optional :grapefruit
49
- mutually_exclusive :beer, :wine, :grapefruit
50
- end
51
- end
52
- post '/nested-hash' do
53
- end
38
+ params do
39
+ requires :item, type: Hash do
40
+ optional :beer
41
+ optional :wine
42
+ optional :grapefruit
43
+ mutually_exclusive :beer, :wine, :grapefruit
44
+ end
45
+ end
46
+ post '/nested-hash' do
47
+ end
54
48
 
55
- params do
56
- optional :item, type: Hash do
57
- optional :beer
58
- optional :wine
59
- optional :grapefruit
60
- mutually_exclusive :beer, :wine, :grapefruit
61
- end
62
- end
63
- post '/nested-optional-hash' do
64
- end
49
+ params do
50
+ optional :item, type: Hash do
51
+ optional :beer
52
+ optional :wine
53
+ optional :grapefruit
54
+ mutually_exclusive :beer, :wine, :grapefruit
55
+ end
56
+ end
57
+ post '/nested-optional-hash' do
58
+ end
65
59
 
66
- params do
67
- requires :items, type: Array do
68
- optional :beer
69
- optional :wine
70
- optional :grapefruit
71
- mutually_exclusive :beer, :wine, :grapefruit
72
- end
73
- end
74
- post '/nested-array' do
75
- end
60
+ params do
61
+ requires :items, type: Array do
62
+ optional :beer
63
+ optional :wine
64
+ optional :grapefruit
65
+ mutually_exclusive :beer, :wine, :grapefruit
66
+ end
67
+ end
68
+ post '/nested-array' do
69
+ end
76
70
 
77
- params do
78
- requires :items, type: Array do
79
- requires :nested_items, type: Array do
80
- optional :beer, :wine, :grapefruit, type: Boolean
81
- mutually_exclusive :beer, :wine, :grapefruit
82
- end
83
- end
84
- end
85
- post '/deeply-nested-array' do
71
+ params do
72
+ requires :items, type: Array do
73
+ requires :nested_items, type: Array do
74
+ optional :beer, :wine, :grapefruit, type: Grape::API::Boolean
75
+ mutually_exclusive :beer, :wine, :grapefruit
86
76
  end
87
77
  end
88
78
  end
79
+ post '/deeply-nested-array' do
80
+ end
89
81
  end
82
+ end
90
83
 
91
- def app
92
- ValidationsSpec::MutualExclusionValidatorSpec::API
93
- end
84
+ describe '#validate!' do
85
+ subject(:validate) { post path, params }
94
86
 
95
87
  context 'when all mutually exclusive params are present' do
96
88
  let(:path) { '/' }
@@ -1,13 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
- describe Grape::Validations::PresenceValidator do
3
+ describe Grape::Validations::Validators::PresenceValidator do
6
4
  subject do
7
5
  Class.new(Grape::API) do
8
6
  format :json
9
7
  end
10
8
  end
9
+
11
10
  def app
12
11
  subject
13
12
  end
@@ -20,6 +19,7 @@ describe Grape::Validations::PresenceValidator do
20
19
  end
21
20
  end
22
21
  end
22
+
23
23
  it 'does not validate for any params' do
24
24
  get '/bacons'
25
25
  expect(last_response.status).to eq(200)
@@ -38,15 +38,18 @@ describe Grape::Validations::PresenceValidator do
38
38
  end
39
39
  end
40
40
  end
41
+
41
42
  it 'requires when missing' do
42
43
  get '/requires'
43
44
  expect(last_response.status).to eq(400)
44
45
  expect(last_response.body).to eq('{"error":"email is required, email has no value"}')
45
46
  end
47
+
46
48
  it 'requires when empty' do
47
49
  get '/requires', email: ''
48
50
  expect(last_response.body).to eq('{"error":"email has no value, email format is invalid"}')
49
51
  end
52
+
50
53
  it 'valid when set' do
51
54
  get '/requires', email: 'bob@example.com'
52
55
  expect(last_response.status).to eq(200)
@@ -64,6 +67,7 @@ describe Grape::Validations::PresenceValidator do
64
67
  { ret: params[:id] }
65
68
  end
66
69
  end
70
+
67
71
  it 'validates id' do
68
72
  post '/'
69
73
  expect(last_response.status).to eq(400)
@@ -90,16 +94,19 @@ describe Grape::Validations::PresenceValidator do
90
94
  'Hello'
91
95
  end
92
96
  end
97
+
93
98
  it 'requires when missing' do
94
99
  get '/'
95
100
  expect(last_response.status).to eq(400)
96
101
  expect(last_response.body).to eq('{"error":"email is missing, email is empty"}')
97
102
  end
103
+
98
104
  it 'requires when empty' do
99
105
  get '/', email: ''
100
106
  expect(last_response.status).to eq(400)
101
107
  expect(last_response.body).to eq('{"error":"email is empty, email is invalid"}')
102
108
  end
109
+
103
110
  it 'valid when set' do
104
111
  get '/', email: 'bob@example.com'
105
112
  expect(last_response.status).to eq(200)
@@ -124,6 +131,7 @@ describe Grape::Validations::PresenceValidator do
124
131
  'Hello'
125
132
  end
126
133
  end
134
+
127
135
  it 'validates for all defined params' do
128
136
  get '/single-requires'
129
137
  expect(last_response.status).to eq(400)
@@ -144,6 +152,7 @@ describe Grape::Validations::PresenceValidator do
144
152
  'Hello'
145
153
  end
146
154
  end
155
+
147
156
  it 'validates name, company' do
148
157
  get '/'
149
158
  expect(last_response.status).to eq(400)
@@ -171,6 +180,7 @@ describe Grape::Validations::PresenceValidator do
171
180
  'Nested'
172
181
  end
173
182
  end
183
+
174
184
  it 'validates nested parameters' do
175
185
  get '/nested'
176
186
  expect(last_response.status).to eq(400)
@@ -203,6 +213,7 @@ describe Grape::Validations::PresenceValidator do
203
213
  'Nested triple'
204
214
  end
205
215
  end
216
+
206
217
  it 'validates triple nested parameters' do
207
218
  get '/nested_triple'
208
219
  expect(last_response.status).to eq(400)
@@ -252,6 +263,7 @@ describe Grape::Validations::PresenceValidator do
252
263
  'Hello optional'
253
264
  end
254
265
  end
266
+
255
267
  it 'works with required' do
256
268
  get '/required'
257
269
  expect(last_response.status).to eq(400)
@@ -261,6 +273,7 @@ describe Grape::Validations::PresenceValidator do
261
273
  expect(last_response.status).to eq(200)
262
274
  expect(last_response.body).to eq('Hello required'.to_json)
263
275
  end
276
+
264
277
  it 'works with optional' do
265
278
  get '/optional'
266
279
  expect(last_response.status).to eq(200)
@@ -1,54 +1,46 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
- describe Grape::Validations::RegexpValidator do
6
- module ValidationsSpec
7
- module RegexpValidatorSpec
8
- class API < Grape::API
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
3
+ describe Grape::Validations::Validators::RegexpValidator do
4
+ let_it_be(:app) do
5
+ Class.new(Grape::API) do
6
+ default_format :json
24
7
 
8
+ resources :custom_message do
25
9
  params do
26
- requires :name, regexp: /^[a-z]+$/
10
+ requires :name, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
27
11
  end
28
12
  get do
29
13
  end
30
14
 
31
15
  params do
32
- requires :names, type: Array[String], regexp: /^[a-z]+$/
16
+ requires :names, type: { value: Array[String], message: 'can\'t be nil' }, regexp: { value: /^[a-z]+$/, message: 'format is invalid' }
33
17
  end
34
18
  get 'regexp_with_array' do
35
19
  end
20
+ end
36
21
 
37
- params do
38
- requires :people, type: Hash do
39
- requires :names, type: Array[String], regexp: /^[a-z]+$/
40
- end
41
- end
42
- get 'nested_regexp_with_array' do
22
+ params do
23
+ requires :name, regexp: /^[a-z]+$/
24
+ end
25
+ get do
26
+ end
27
+
28
+ params do
29
+ requires :names, type: Array[String], regexp: /^[a-z]+$/
30
+ end
31
+ get 'regexp_with_array' do
32
+ end
33
+
34
+ params do
35
+ requires :people, type: Hash do
36
+ requires :names, type: Array[String], regexp: /^[a-z]+$/
43
37
  end
44
38
  end
39
+ get 'nested_regexp_with_array' do
40
+ end
45
41
  end
46
42
  end
47
43
 
48
- def app
49
- ValidationsSpec::RegexpValidatorSpec::API
50
- end
51
-
52
44
  context 'custom validation message' do
53
45
  context 'with invalid input' do
54
46
  it 'refuses inapppopriate' do
@@ -1,32 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
4
-
5
- describe Grape::Validations::SameAsValidator do
6
- module ValidationsSpec
7
- module SameAsValidatorSpec
8
- class API < Grape::API
9
- params do
10
- requires :password
11
- requires :password_confirmation, same_as: :password
12
- end
13
- post do
14
- end
3
+ describe Grape::Validations::Validators::SameAsValidator do
4
+ let_it_be(:app) do
5
+ Class.new(Grape::API) do
6
+ params do
7
+ requires :password
8
+ requires :password_confirmation, same_as: :password
9
+ end
10
+ post do
11
+ end
15
12
 
16
- params do
17
- requires :password
18
- requires :password_confirmation, same_as: { value: :password, message: 'not match' }
19
- end
20
- post '/custom-message' do
21
- end
13
+ params do
14
+ requires :password
15
+ requires :password_confirmation, same_as: { value: :password, message: 'not match' }
16
+ end
17
+ post '/custom-message' do
22
18
  end
23
19
  end
24
20
  end
25
21
 
26
- def app
27
- ValidationsSpec::SameAsValidatorSpec::API
28
- end
29
-
30
22
  describe '/' do
31
23
  context 'is the same' do
32
24
  it do