grape 1.1.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (306) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +370 -44
  3. data/CONTRIBUTING.md +32 -1
  4. data/LICENSE +1 -1
  5. data/README.md +683 -87
  6. data/UPGRADING.md +481 -17
  7. data/grape.gemspec +15 -4
  8. data/lib/grape/api/helpers.rb +2 -0
  9. data/lib/grape/api/instance.rb +279 -0
  10. data/lib/grape/api.rb +144 -176
  11. data/lib/grape/config.rb +34 -0
  12. data/lib/grape/content_types.rb +34 -0
  13. data/lib/grape/cookies.rb +4 -0
  14. data/lib/grape/dry_types.rb +12 -0
  15. data/lib/grape/dsl/api.rb +1 -1
  16. data/lib/grape/dsl/callbacks.rb +21 -1
  17. data/lib/grape/dsl/configuration.rb +1 -1
  18. data/lib/grape/dsl/desc.rb +41 -23
  19. data/lib/grape/dsl/headers.rb +7 -2
  20. data/lib/grape/dsl/helpers.rb +10 -7
  21. data/lib/grape/dsl/inside_route.rb +118 -62
  22. data/lib/grape/dsl/logger.rb +2 -0
  23. data/lib/grape/dsl/middleware.rb +11 -4
  24. data/lib/grape/dsl/parameters.rb +33 -19
  25. data/lib/grape/dsl/request_response.rb +12 -9
  26. data/lib/grape/dsl/routing.rb +22 -13
  27. data/lib/grape/dsl/settings.rb +10 -6
  28. data/lib/grape/dsl/validations.rb +19 -14
  29. data/lib/grape/eager_load.rb +20 -0
  30. data/lib/grape/endpoint.rb +67 -58
  31. data/lib/grape/error_formatter/base.rb +2 -0
  32. data/lib/grape/error_formatter/json.rb +11 -7
  33. data/lib/grape/error_formatter/txt.rb +2 -0
  34. data/lib/grape/error_formatter/xml.rb +4 -6
  35. data/lib/grape/error_formatter.rb +4 -2
  36. data/lib/grape/exceptions/base.rb +23 -16
  37. data/lib/grape/exceptions/empty_message_body.rb +11 -0
  38. data/lib/grape/exceptions/incompatible_option_values.rb +2 -0
  39. data/lib/grape/exceptions/invalid_accept_header.rb +2 -0
  40. data/lib/grape/exceptions/invalid_formatter.rb +2 -0
  41. data/lib/grape/exceptions/invalid_message_body.rb +2 -0
  42. data/lib/grape/exceptions/invalid_response.rb +11 -0
  43. data/lib/grape/exceptions/invalid_version_header.rb +2 -0
  44. data/lib/grape/exceptions/invalid_versioner_option.rb +2 -0
  45. data/lib/grape/exceptions/invalid_with_option_for_represent.rb +2 -0
  46. data/lib/grape/exceptions/method_not_allowed.rb +2 -0
  47. data/lib/grape/exceptions/missing_group_type.rb +10 -1
  48. data/lib/grape/exceptions/missing_mime_type.rb +2 -0
  49. data/lib/grape/exceptions/missing_option.rb +2 -0
  50. data/lib/grape/exceptions/missing_vendor_option.rb +2 -0
  51. data/lib/grape/exceptions/too_many_multipart_files.rb +11 -0
  52. data/lib/grape/exceptions/unknown_options.rb +2 -0
  53. data/lib/grape/exceptions/unknown_parameter.rb +2 -0
  54. data/lib/grape/exceptions/unknown_validator.rb +2 -0
  55. data/lib/grape/exceptions/unsupported_group_type.rb +10 -1
  56. data/lib/grape/exceptions/validation.rb +5 -8
  57. data/lib/grape/exceptions/validation_array_errors.rb +2 -0
  58. data/lib/grape/exceptions/validation_errors.rb +16 -13
  59. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +4 -3
  60. data/lib/grape/extensions/deep_mergeable_hash.rb +2 -0
  61. data/lib/grape/extensions/deep_symbolize_hash.rb +2 -0
  62. data/lib/grape/extensions/hash.rb +2 -0
  63. data/lib/grape/extensions/hashie/mash.rb +2 -0
  64. data/lib/grape/formatter/json.rb +3 -0
  65. data/lib/grape/formatter/serializable_hash.rb +4 -1
  66. data/lib/grape/formatter/txt.rb +2 -0
  67. data/lib/grape/formatter/xml.rb +3 -0
  68. data/lib/grape/formatter.rb +5 -3
  69. data/lib/grape/http/headers.rb +50 -18
  70. data/lib/grape/locale/en.yml +11 -8
  71. data/lib/grape/middleware/auth/base.rb +7 -7
  72. data/lib/grape/middleware/auth/dsl.rb +9 -2
  73. data/lib/grape/middleware/auth/strategies.rb +2 -0
  74. data/lib/grape/middleware/auth/strategy_info.rb +2 -0
  75. data/lib/grape/middleware/base.rb +13 -8
  76. data/lib/grape/middleware/error.rb +22 -17
  77. data/lib/grape/middleware/filter.rb +2 -0
  78. data/lib/grape/middleware/formatter.rb +12 -10
  79. data/lib/grape/middleware/globals.rb +2 -0
  80. data/lib/grape/middleware/helpers.rb +12 -0
  81. data/lib/grape/middleware/stack.rb +16 -6
  82. data/lib/grape/middleware/versioner/accept_version_header.rb +5 -5
  83. data/lib/grape/middleware/versioner/header.rb +13 -9
  84. data/lib/grape/middleware/versioner/param.rb +4 -1
  85. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +5 -1
  86. data/lib/grape/middleware/versioner/path.rb +5 -1
  87. data/lib/grape/middleware/versioner.rb +2 -0
  88. data/lib/grape/namespace.rb +14 -2
  89. data/lib/grape/parser/json.rb +3 -1
  90. data/lib/grape/parser/xml.rb +3 -1
  91. data/lib/grape/parser.rb +4 -2
  92. data/lib/grape/path.rb +16 -3
  93. data/lib/grape/presenters/presenter.rb +2 -0
  94. data/lib/grape/request.rb +21 -9
  95. data/lib/grape/router/attribute_translator.rb +41 -8
  96. data/lib/grape/router/pattern.rb +21 -17
  97. data/lib/grape/router/route.rb +15 -29
  98. data/lib/grape/router.rb +36 -29
  99. data/lib/grape/{serve_file → serve_stream}/file_body.rb +3 -1
  100. data/lib/grape/{serve_file → serve_stream}/sendfile_response.rb +3 -1
  101. data/lib/grape/{serve_file/file_response.rb → serve_stream/stream_response.rb} +10 -8
  102. data/lib/grape/types/invalid_value.rb +8 -0
  103. data/lib/grape/util/base_inheritable.rb +43 -0
  104. data/lib/grape/util/cache.rb +20 -0
  105. data/lib/grape/util/endpoint_configuration.rb +8 -0
  106. data/lib/grape/util/env.rb +19 -17
  107. data/lib/grape/util/inheritable_setting.rb +3 -3
  108. data/lib/grape/util/inheritable_values.rb +7 -25
  109. data/lib/grape/util/json.rb +4 -0
  110. data/lib/grape/util/lazy_block.rb +27 -0
  111. data/lib/grape/util/lazy_object.rb +43 -0
  112. data/lib/grape/util/lazy_value.rb +99 -0
  113. data/lib/grape/util/registrable.rb +2 -0
  114. data/lib/grape/util/reverse_stackable_values.rb +10 -35
  115. data/lib/grape/util/stackable_values.rb +21 -34
  116. data/lib/grape/util/strict_hash_configuration.rb +3 -1
  117. data/lib/grape/util/xml.rb +2 -0
  118. data/lib/grape/validations/attributes_doc.rb +58 -0
  119. data/lib/grape/validations/attributes_iterator.rb +16 -6
  120. data/lib/grape/validations/multiple_attributes_iterator.rb +13 -0
  121. data/lib/grape/validations/params_scope.rb +174 -94
  122. data/lib/grape/validations/single_attribute_iterator.rb +24 -0
  123. data/lib/grape/validations/types/array_coercer.rb +63 -0
  124. data/lib/grape/validations/types/build_coercer.rb +47 -49
  125. data/lib/grape/validations/types/custom_type_coercer.rb +30 -51
  126. data/lib/grape/validations/types/custom_type_collection_coercer.rb +10 -25
  127. data/lib/grape/validations/types/dry_type_coercer.rb +72 -0
  128. data/lib/grape/validations/types/file.rb +22 -18
  129. data/lib/grape/validations/types/invalid_value.rb +17 -0
  130. data/lib/grape/validations/types/json.rb +47 -39
  131. data/lib/grape/validations/types/multiple_type_coercer.rb +14 -33
  132. data/lib/grape/validations/types/primitive_coercer.rb +75 -0
  133. data/lib/grape/validations/types/set_coercer.rb +38 -0
  134. data/lib/grape/validations/types/variant_collection_coercer.rb +5 -13
  135. data/lib/grape/validations/types.rb +106 -63
  136. data/lib/grape/validations/validator_factory.rb +8 -11
  137. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  138. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  139. data/lib/grape/validations/validators/as_validator.rb +14 -0
  140. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  141. data/lib/grape/validations/validators/base.rb +84 -68
  142. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  143. data/lib/grape/validations/validators/default_validator.rb +51 -0
  144. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  145. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  146. data/lib/grape/validations/validators/multiple_params_base.rb +27 -16
  147. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  148. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  149. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  150. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  151. data/lib/grape/validations/validators/values_validator.rb +88 -0
  152. data/lib/grape/validations.rb +18 -6
  153. data/lib/grape/version.rb +3 -1
  154. data/lib/grape.rb +175 -94
  155. data/spec/grape/api/custom_validations_spec.rb +117 -44
  156. data/spec/grape/api/deeply_included_options_spec.rb +4 -4
  157. data/spec/grape/api/defines_boolean_in_params_spec.rb +38 -0
  158. data/spec/grape/api/documentation_spec.rb +59 -0
  159. data/spec/grape/api/inherited_helpers_spec.rb +1 -1
  160. data/spec/grape/api/instance_spec.rb +103 -0
  161. data/spec/grape/api/invalid_format_spec.rb +3 -1
  162. data/spec/grape/api/namespace_parameters_in_route_spec.rb +1 -1
  163. data/spec/grape/api/nested_helpers_spec.rb +1 -1
  164. data/spec/grape/api/optional_parameters_in_route_spec.rb +1 -1
  165. data/spec/grape/api/parameters_modification_spec.rb +2 -2
  166. data/spec/grape/api/patch_method_helpers_spec.rb +1 -1
  167. data/spec/grape/api/recognize_path_spec.rb +2 -2
  168. data/spec/grape/api/required_parameters_in_route_spec.rb +1 -1
  169. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +1 -1
  170. data/spec/grape/api/routes_with_requirements_spec.rb +59 -0
  171. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +10 -16
  172. data/spec/grape/api/shared_helpers_spec.rb +1 -1
  173. data/spec/grape/api_remount_spec.rb +473 -0
  174. data/spec/grape/api_spec.rb +995 -231
  175. data/spec/grape/config_spec.rb +17 -0
  176. data/spec/grape/dsl/callbacks_spec.rb +3 -2
  177. data/spec/grape/dsl/desc_spec.rb +43 -17
  178. data/spec/grape/dsl/headers_spec.rb +40 -10
  179. data/spec/grape/dsl/helpers_spec.rb +6 -5
  180. data/spec/grape/dsl/inside_route_spec.rb +189 -38
  181. data/spec/grape/dsl/logger_spec.rb +17 -19
  182. data/spec/grape/dsl/middleware_spec.rb +11 -2
  183. data/spec/grape/dsl/parameters_spec.rb +3 -1
  184. data/spec/grape/dsl/request_response_spec.rb +8 -7
  185. data/spec/grape/dsl/routing_spec.rb +22 -9
  186. data/spec/grape/dsl/settings_spec.rb +1 -1
  187. data/spec/grape/dsl/validations_spec.rb +1 -16
  188. data/spec/grape/endpoint/declared_spec.rb +846 -0
  189. data/spec/grape/endpoint_spec.rb +136 -577
  190. data/spec/grape/entity_spec.rb +31 -24
  191. data/spec/grape/exceptions/base_spec.rb +81 -0
  192. data/spec/grape/exceptions/body_parse_errors_spec.rb +4 -1
  193. data/spec/grape/exceptions/invalid_accept_header_spec.rb +65 -23
  194. data/spec/grape/exceptions/invalid_formatter_spec.rb +1 -1
  195. data/spec/grape/exceptions/invalid_response_spec.rb +11 -0
  196. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +2 -2
  197. data/spec/grape/exceptions/missing_group_type_spec.rb +21 -0
  198. data/spec/grape/exceptions/missing_mime_type_spec.rb +1 -1
  199. data/spec/grape/exceptions/missing_option_spec.rb +2 -2
  200. data/spec/grape/exceptions/unknown_options_spec.rb +1 -1
  201. data/spec/grape/exceptions/unknown_validator_spec.rb +1 -1
  202. data/spec/grape/exceptions/unsupported_group_type_spec.rb +23 -0
  203. data/spec/grape/exceptions/validation_errors_spec.rb +21 -15
  204. data/spec/grape/exceptions/validation_spec.rb +6 -4
  205. data/spec/grape/extensions/param_builders/hash_spec.rb +8 -8
  206. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +9 -9
  207. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +9 -9
  208. data/spec/grape/integration/global_namespace_function_spec.rb +2 -2
  209. data/spec/grape/integration/rack_sendfile_spec.rb +14 -10
  210. data/spec/grape/integration/rack_spec.rb +25 -8
  211. data/spec/grape/loading_spec.rb +9 -9
  212. data/spec/grape/middleware/auth/base_spec.rb +2 -1
  213. data/spec/grape/middleware/auth/dsl_spec.rb +19 -10
  214. data/spec/grape/middleware/auth/strategies_spec.rb +62 -22
  215. data/spec/grape/middleware/base_spec.rb +36 -17
  216. data/spec/grape/middleware/error_spec.rb +11 -4
  217. data/spec/grape/middleware/exception_spec.rb +112 -162
  218. data/spec/grape/middleware/formatter_spec.rb +65 -29
  219. data/spec/grape/middleware/globals_spec.rb +8 -5
  220. data/spec/grape/middleware/stack_spec.rb +25 -13
  221. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +3 -2
  222. data/spec/grape/middleware/versioner/header_spec.rb +37 -14
  223. data/spec/grape/middleware/versioner/param_spec.rb +8 -2
  224. data/spec/grape/middleware/versioner/path_spec.rb +6 -2
  225. data/spec/grape/middleware/versioner_spec.rb +2 -2
  226. data/spec/grape/named_api_spec.rb +19 -0
  227. data/spec/grape/parser_spec.rb +10 -6
  228. data/spec/grape/path_spec.rb +53 -53
  229. data/spec/grape/presenters/presenter_spec.rb +8 -7
  230. data/spec/grape/request_spec.rb +29 -3
  231. data/spec/grape/util/inheritable_setting_spec.rb +9 -8
  232. data/spec/grape/util/inheritable_values_spec.rb +5 -3
  233. data/spec/grape/util/reverse_stackable_values_spec.rb +5 -2
  234. data/spec/grape/util/stackable_values_spec.rb +10 -7
  235. data/spec/grape/util/strict_hash_configuration_spec.rb +2 -1
  236. data/spec/grape/validations/attributes_doc_spec.rb +153 -0
  237. data/spec/grape/validations/instance_behaivour_spec.rb +13 -14
  238. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +40 -0
  239. data/spec/grape/validations/params_scope_spec.rb +568 -99
  240. data/spec/grape/validations/single_attribute_iterator_spec.rb +57 -0
  241. data/spec/grape/validations/types/array_coercer_spec.rb +33 -0
  242. data/spec/grape/validations/types/primitive_coercer_spec.rb +150 -0
  243. data/spec/grape/validations/types/set_coercer_spec.rb +32 -0
  244. data/spec/grape/validations/types_spec.rb +44 -45
  245. data/spec/grape/validations/validators/all_or_none_spec.rb +134 -32
  246. data/spec/grape/validations/validators/allow_blank_spec.rb +137 -141
  247. data/spec/grape/validations/validators/at_least_one_of_spec.rb +169 -31
  248. data/spec/grape/validations/validators/coerce_spec.rb +491 -151
  249. data/spec/grape/validations/validators/default_spec.rb +242 -78
  250. data/spec/grape/validations/validators/exactly_one_of_spec.rb +198 -40
  251. data/spec/grape/validations/validators/except_values_spec.rb +6 -5
  252. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +181 -30
  253. data/spec/grape/validations/validators/presence_spec.rb +45 -2
  254. data/spec/grape/validations/validators/regexp_spec.rb +27 -33
  255. data/spec/grape/validations/validators/same_as_spec.rb +57 -0
  256. data/spec/grape/validations/validators/values_spec.rb +227 -180
  257. data/spec/grape/validations_spec.rb +502 -72
  258. data/spec/integration/eager_load/eager_load_spec.rb +15 -0
  259. data/spec/integration/multi_json/json_spec.rb +2 -2
  260. data/spec/integration/multi_xml/xml_spec.rb +2 -2
  261. data/spec/shared/versioning_examples.rb +34 -29
  262. data/spec/spec_helper.rb +31 -5
  263. data/spec/support/basic_auth_encode_helpers.rb +3 -1
  264. data/spec/support/chunks.rb +14 -0
  265. data/spec/support/content_type_helpers.rb +2 -0
  266. data/spec/support/endpoint_faker.rb +2 -0
  267. data/spec/support/file_streamer.rb +2 -0
  268. data/spec/support/integer_helpers.rb +2 -0
  269. data/spec/support/versioned_helpers.rb +8 -8
  270. metadata +111 -61
  271. data/Appraisals +0 -32
  272. data/Dangerfile +0 -2
  273. data/Gemfile +0 -33
  274. data/Gemfile.lock +0 -231
  275. data/Guardfile +0 -10
  276. data/RELEASING.md +0 -111
  277. data/Rakefile +0 -25
  278. data/benchmark/simple.rb +0 -27
  279. data/benchmark/simple_with_type_coercer.rb +0 -22
  280. data/gemfiles/multi_json.gemfile +0 -35
  281. data/gemfiles/multi_xml.gemfile +0 -35
  282. data/gemfiles/rack_1.5.2.gemfile +0 -35
  283. data/gemfiles/rack_edge.gemfile +0 -35
  284. data/gemfiles/rails_3.gemfile +0 -36
  285. data/gemfiles/rails_4.gemfile +0 -35
  286. data/gemfiles/rails_5.gemfile +0 -35
  287. data/gemfiles/rails_edge.gemfile +0 -35
  288. data/lib/grape/extensions/deep_hash_with_indifferent_access.rb +0 -18
  289. data/lib/grape/util/content_types.rb +0 -26
  290. data/lib/grape/validations/types/virtus_collection_patch.rb +0 -16
  291. data/lib/grape/validations/validators/all_or_none.rb +0 -20
  292. data/lib/grape/validations/validators/allow_blank.rb +0 -16
  293. data/lib/grape/validations/validators/as.rb +0 -15
  294. data/lib/grape/validations/validators/at_least_one_of.rb +0 -20
  295. data/lib/grape/validations/validators/coerce.rb +0 -74
  296. data/lib/grape/validations/validators/default.rb +0 -48
  297. data/lib/grape/validations/validators/exactly_one_of.rb +0 -29
  298. data/lib/grape/validations/validators/except_values.rb +0 -20
  299. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -25
  300. data/lib/grape/validations/validators/presence.rb +0 -10
  301. data/lib/grape/validations/validators/regexp.rb +0 -11
  302. data/lib/grape/validations/validators/values.rb +0 -71
  303. data/pkg/grape-0.17.0.gem +0 -0
  304. data/pkg/grape-0.19.0.gem +0 -0
  305. data/spec/grape/dsl/configuration_spec.rb +0 -14
  306. data/spec/grape/validations/attributes_iterator_spec.rb +0 -4
data/lib/grape.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'logger'
2
4
  require 'rack'
3
5
  require 'rack/builder'
@@ -5,24 +7,27 @@ require 'rack/accept'
5
7
  require 'rack/auth/basic'
6
8
  require 'rack/auth/digest/md5'
7
9
  require 'set'
10
+ require 'bigdecimal'
11
+ require 'date'
12
+ require 'active_support'
13
+ require 'active_support/concern'
8
14
  require 'active_support/version'
9
- require 'active_support/core_ext/hash/indifferent_access'
10
- require 'active_support/core_ext/object/blank'
15
+ require 'active_support/isolated_execution_state' if ActiveSupport::VERSION::MAJOR > 6
16
+ require 'active_support/core_ext/array/conversions'
11
17
  require 'active_support/core_ext/array/extract_options'
12
18
  require 'active_support/core_ext/array/wrap'
19
+ require 'active_support/core_ext/hash/conversions'
13
20
  require 'active_support/core_ext/hash/deep_merge'
14
- require 'active_support/core_ext/hash/reverse_merge'
15
21
  require 'active_support/core_ext/hash/except'
22
+ require 'active_support/core_ext/hash/indifferent_access'
23
+ require 'active_support/core_ext/hash/reverse_merge'
16
24
  require 'active_support/core_ext/hash/slice'
17
- require 'active_support/core_ext/hash/conversions'
25
+ require 'active_support/core_ext/object/blank'
18
26
  require 'active_support/dependencies/autoload'
19
27
  require 'active_support/notifications'
20
28
  require 'i18n'
21
- require 'thread'
22
-
23
- require 'virtus'
24
29
 
25
- I18n.load_path << File.expand_path('../grape/locale/en.yml', __FILE__)
30
+ I18n.load_path << File.expand_path('grape/locale/en.yml', __dir__)
26
31
 
27
32
  module Grape
28
33
  extend ::ActiveSupport::Autoload
@@ -34,7 +39,6 @@ module Grape
34
39
  autoload :Namespace
35
40
 
36
41
  autoload :Path
37
-
38
42
  autoload :Cookies
39
43
  autoload :Validations
40
44
  autoload :ErrorFormatter
@@ -44,6 +48,7 @@ module Grape
44
48
  autoload :Env, 'grape/util/env'
45
49
  autoload :Json, 'grape/util/json'
46
50
  autoload :Xml, 'grape/util/xml'
51
+ autoload :DryTypes
47
52
  end
48
53
 
49
54
  module Http
@@ -55,105 +60,128 @@ module Grape
55
60
 
56
61
  module Exceptions
57
62
  extend ::ActiveSupport::Autoload
58
- autoload :Base
59
- autoload :Validation
60
- autoload :ValidationArrayErrors
61
- autoload :ValidationErrors
62
- autoload :MissingVendorOption
63
- autoload :MissingMimeType
64
- autoload :MissingOption
65
- autoload :InvalidFormatter
66
- autoload :InvalidVersionerOption
67
- autoload :UnknownValidator
68
- autoload :UnknownOptions
69
- autoload :UnknownParameter
70
- autoload :InvalidWithOptionForRepresent
71
- autoload :IncompatibleOptionValues
72
- autoload :MissingGroupTypeError, 'grape/exceptions/missing_group_type'
73
- autoload :UnsupportedGroupTypeError, 'grape/exceptions/unsupported_group_type'
74
- autoload :InvalidMessageBody
75
- autoload :InvalidAcceptHeader
76
- autoload :InvalidVersionHeader
77
- autoload :MethodNotAllowed
63
+ eager_autoload do
64
+ autoload :Base
65
+ autoload :Validation
66
+ autoload :ValidationArrayErrors
67
+ autoload :ValidationErrors
68
+ autoload :MissingVendorOption
69
+ autoload :MissingMimeType
70
+ autoload :MissingOption
71
+ autoload :InvalidFormatter
72
+ autoload :InvalidVersionerOption
73
+ autoload :UnknownValidator
74
+ autoload :UnknownOptions
75
+ autoload :UnknownParameter
76
+ autoload :InvalidWithOptionForRepresent
77
+ autoload :IncompatibleOptionValues
78
+ autoload :MissingGroupType
79
+ autoload :UnsupportedGroupType
80
+ autoload :InvalidMessageBody
81
+ autoload :InvalidAcceptHeader
82
+ autoload :InvalidVersionHeader
83
+ autoload :MethodNotAllowed
84
+ autoload :InvalidResponse
85
+ autoload :EmptyMessageBody
86
+ autoload :TooManyMultipartFiles
87
+ autoload :MissingGroupTypeError, 'grape/exceptions/missing_group_type'
88
+ autoload :UnsupportedGroupTypeError, 'grape/exceptions/unsupported_group_type'
89
+ end
78
90
  end
79
91
 
80
92
  module Extensions
81
93
  extend ::ActiveSupport::Autoload
82
-
83
- autoload :DeepMergeableHash
84
- autoload :DeepSymbolizeHash
85
- autoload :DeepHashWithIndifferentAccess
86
- autoload :Hash
87
-
94
+ eager_autoload do
95
+ autoload :DeepMergeableHash
96
+ autoload :DeepSymbolizeHash
97
+ autoload :Hash
98
+ end
88
99
  module ActiveSupport
89
100
  extend ::ActiveSupport::Autoload
90
-
91
- autoload :HashWithIndifferentAccess
101
+ eager_autoload do
102
+ autoload :HashWithIndifferentAccess
103
+ end
92
104
  end
93
105
 
94
106
  module Hashie
95
107
  extend ::ActiveSupport::Autoload
96
-
97
- autoload :Mash
108
+ eager_autoload do
109
+ autoload :Mash
110
+ end
98
111
  end
99
112
  end
100
113
 
101
114
  module Middleware
102
115
  extend ::ActiveSupport::Autoload
103
- autoload :Base
104
- autoload :Versioner
105
- autoload :Formatter
106
- autoload :Error
107
- autoload :Globals
108
- autoload :Stack
116
+ eager_autoload do
117
+ autoload :Base
118
+ autoload :Versioner
119
+ autoload :Formatter
120
+ autoload :Error
121
+ autoload :Globals
122
+ autoload :Stack
123
+ autoload :Helpers
124
+ end
109
125
 
110
126
  module Auth
111
127
  extend ::ActiveSupport::Autoload
112
- autoload :Base
113
- autoload :DSL
114
- autoload :StrategyInfo
115
- autoload :Strategies
128
+ eager_autoload do
129
+ autoload :Base
130
+ autoload :DSL
131
+ autoload :StrategyInfo
132
+ autoload :Strategies
133
+ end
116
134
  end
117
135
 
118
136
  module Versioner
119
137
  extend ::ActiveSupport::Autoload
120
- autoload :Path
121
- autoload :Header
122
- autoload :Param
123
- autoload :AcceptVersionHeader
138
+ eager_autoload do
139
+ autoload :Path
140
+ autoload :Header
141
+ autoload :Param
142
+ autoload :AcceptVersionHeader
143
+ end
124
144
  end
125
145
  end
126
146
 
127
147
  module Util
128
148
  extend ::ActiveSupport::Autoload
129
- autoload :InheritableValues
130
- autoload :StackableValues
131
- autoload :ReverseStackableValues
132
- autoload :InheritableSetting
133
- autoload :StrictHashConfiguration
134
- autoload :Registrable
149
+ eager_autoload do
150
+ autoload :InheritableValues
151
+ autoload :StackableValues
152
+ autoload :ReverseStackableValues
153
+ autoload :InheritableSetting
154
+ autoload :StrictHashConfiguration
155
+ autoload :Registrable
156
+ end
135
157
  end
136
158
 
137
159
  module ErrorFormatter
138
160
  extend ::ActiveSupport::Autoload
139
- autoload :Base
140
- autoload :Json
141
- autoload :Txt
142
- autoload :Xml
161
+ eager_autoload do
162
+ autoload :Base
163
+ autoload :Json
164
+ autoload :Txt
165
+ autoload :Xml
166
+ end
143
167
  end
144
168
 
145
169
  module Formatter
146
170
  extend ::ActiveSupport::Autoload
147
- autoload :Json
148
- autoload :SerializableHash
149
- autoload :Txt
150
- autoload :Xml
171
+ eager_autoload do
172
+ autoload :Json
173
+ autoload :SerializableHash
174
+ autoload :Txt
175
+ autoload :Xml
176
+ end
151
177
  end
152
178
 
153
179
  module Parser
154
180
  extend ::ActiveSupport::Autoload
155
- autoload :Json
156
- autoload :Xml
181
+ eager_autoload do
182
+ autoload :Json
183
+ autoload :Xml
184
+ end
157
185
  end
158
186
 
159
187
  module DSL
@@ -177,40 +205,93 @@ module Grape
177
205
 
178
206
  class API
179
207
  extend ::ActiveSupport::Autoload
180
- autoload :Helpers
208
+ eager_autoload do
209
+ autoload :Helpers
210
+ end
181
211
  end
182
212
 
183
213
  module Presenters
184
214
  extend ::ActiveSupport::Autoload
185
- autoload :Presenter
215
+ eager_autoload do
216
+ autoload :Presenter
217
+ end
186
218
  end
187
219
 
188
- module ServeFile
220
+ module ServeStream
189
221
  extend ::ActiveSupport::Autoload
190
- autoload :FileResponse
191
- autoload :FileBody
192
- autoload :SendfileResponse
222
+ eager_autoload do
223
+ autoload :FileBody
224
+ autoload :SendfileResponse
225
+ autoload :StreamResponse
226
+ end
227
+ end
228
+
229
+ module Validations
230
+ extend ::ActiveSupport::Autoload
231
+
232
+ eager_autoload do
233
+ autoload :AttributesIterator
234
+ autoload :MultipleAttributesIterator
235
+ autoload :SingleAttributeIterator
236
+ autoload :Types
237
+ autoload :ParamsScope
238
+ autoload :ValidatorFactory
239
+ autoload :Base, 'grape/validations/validators/base'
240
+ end
241
+
242
+ module Types
243
+ extend ::ActiveSupport::Autoload
244
+
245
+ eager_autoload do
246
+ autoload :InvalidValue
247
+ autoload :DryTypeCoercer
248
+ autoload :ArrayCoercer
249
+ autoload :SetCoercer
250
+ autoload :PrimitiveCoercer
251
+ autoload :CustomTypeCoercer
252
+ autoload :CustomTypeCollectionCoercer
253
+ autoload :MultipleTypeCoercer
254
+ autoload :VariantCollectionCoercer
255
+ end
256
+ end
257
+
258
+ module Validators
259
+ extend ::ActiveSupport::Autoload
260
+
261
+ eager_autoload do
262
+ autoload :Base
263
+ autoload :MultipleParamsBase
264
+ autoload :AllOrNoneOfValidator
265
+ autoload :AllowBlankValidator
266
+ autoload :AsValidator
267
+ autoload :AtLeastOneOfValidator
268
+ autoload :CoerceValidator
269
+ autoload :DefaultValidator
270
+ autoload :ExactlyOneOfValidator
271
+ autoload :ExceptValuesValidator
272
+ autoload :MutualExclusionValidator
273
+ autoload :PresenceValidator
274
+ autoload :RegexpValidator
275
+ autoload :SameAsValidator
276
+ autoload :ValuesValidator
277
+ end
278
+ end
279
+ end
280
+
281
+ module Types
282
+ extend ::ActiveSupport::Autoload
283
+
284
+ eager_autoload do
285
+ autoload :InvalidValue
286
+ end
193
287
  end
194
288
  end
195
289
 
196
- require 'grape/util/content_types'
197
-
198
- require 'grape/validations/validators/base'
199
- require 'grape/validations/attributes_iterator'
200
- require 'grape/validations/validators/allow_blank'
201
- require 'grape/validations/validators/as'
202
- require 'grape/validations/validators/at_least_one_of'
203
- require 'grape/validations/validators/coerce'
204
- require 'grape/validations/validators/default'
205
- require 'grape/validations/validators/exactly_one_of'
206
- require 'grape/validations/validators/mutual_exclusion'
207
- require 'grape/validations/validators/presence'
208
- require 'grape/validations/validators/regexp'
209
- require 'grape/validations/validators/values'
210
- require 'grape/validations/validators/except_values'
211
- require 'grape/validations/params_scope'
212
- require 'grape/validations/validators/all_or_none'
213
- require 'grape/validations/types'
214
- require 'grape/validations/validator_factory'
290
+ require 'grape/config'
291
+ require 'grape/content_types'
292
+
293
+ require 'grape/util/lazy_value'
294
+ require 'grape/util/lazy_block'
295
+ require 'grape/util/endpoint_configuration'
215
296
 
216
297
  require 'grape/version'
@@ -1,18 +1,48 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
2
 
3
3
  describe Grape::Validations do
4
- context 'using a custom length validator' do
5
- before do
6
- module CustomValidationsSpec
7
- class DefaultLength < Grape::Validations::Base
8
- def validate_param!(attr_name, params)
9
- @option = params[:max].to_i if params.key?(:max)
10
- return if params[attr_name].length <= @option
11
- raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long"
12
- end
4
+ context 'deprecated Grape::Validations::Base' do
5
+ subject do
6
+ Class.new(Grape::API) do
7
+ params do
8
+ requires :text, validator_with_old_base: true
9
+ end
10
+ get do
11
+ end
12
+ end
13
+ end
14
+
15
+ let(:validator_with_old_base) do
16
+ Class.new(Grape::Validations::Base) do
17
+ def validate_param!(_attr_name, _params)
18
+ true
13
19
  end
14
20
  end
15
21
  end
22
+
23
+ before do
24
+ described_class.register_validator('validator_with_old_base', validator_with_old_base)
25
+ allow(Warning).to receive(:warn)
26
+ end
27
+
28
+ after do
29
+ described_class.deregister_validator('validator_with_old_base')
30
+ end
31
+
32
+ def app
33
+ subject
34
+ end
35
+
36
+ it 'puts a deprecation warning' do
37
+ expect(Warning).to receive(:warn) do |message|
38
+ expect(message).to include('`Grape::Validations::Base` is deprecated')
39
+ end
40
+
41
+ get '/'
42
+ end
43
+ end
44
+
45
+ context 'using a custom length validator' do
16
46
  subject do
17
47
  Class.new(Grape::API) do
18
48
  params do
@@ -24,6 +54,25 @@ describe Grape::Validations do
24
54
  end
25
55
  end
26
56
 
57
+ let(:default_length_validator) do
58
+ Class.new(Grape::Validations::Validators::Base) do
59
+ def validate_param!(attr_name, params)
60
+ @option = params[:max].to_i if params.key?(:max)
61
+ return if params[attr_name].length <= @option
62
+
63
+ raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: "must be at the most #{@option} characters long")
64
+ end
65
+ end
66
+ end
67
+
68
+ before do
69
+ described_class.register_validator('default_length', default_length_validator)
70
+ end
71
+
72
+ after do
73
+ described_class.deregister_validator('default_length')
74
+ end
75
+
27
76
  def app
28
77
  subject
29
78
  end
@@ -33,11 +82,13 @@ describe Grape::Validations do
33
82
  expect(last_response.status).to eq 200
34
83
  expect(last_response.body).to eq 'bacon'
35
84
  end
85
+
36
86
  it 'over 140 characters' do
37
87
  get '/', text: 'a' * 141
38
88
  expect(last_response.status).to eq 400
39
89
  expect(last_response.body).to eq 'text must be at the most 140 characters long'
40
90
  end
91
+
41
92
  it 'specified in the query string' do
42
93
  get '/', text: 'a' * 141, max: 141
43
94
  expect(last_response.status).to eq 200
@@ -46,15 +97,6 @@ describe Grape::Validations do
46
97
  end
47
98
 
48
99
  context 'using a custom body-only validator' do
49
- before do
50
- module CustomValidationsSpec
51
- class InBody < Grape::Validations::PresenceValidator
52
- def validate(request)
53
- validate!(request.env['api.request.body'])
54
- end
55
- end
56
- end
57
- end
58
100
  subject do
59
101
  Class.new(Grape::API) do
60
102
  params do
@@ -66,6 +108,22 @@ describe Grape::Validations do
66
108
  end
67
109
  end
68
110
 
111
+ let(:in_body_validator) do
112
+ Class.new(Grape::Validations::Validators::PresenceValidator) do
113
+ def validate(request)
114
+ validate!(request.env['api.request.body'])
115
+ end
116
+ end
117
+ end
118
+
119
+ before do
120
+ described_class.register_validator('in_body', in_body_validator)
121
+ end
122
+
123
+ after do
124
+ described_class.deregister_validator('in_body')
125
+ end
126
+
69
127
  def app
70
128
  subject
71
129
  end
@@ -75,6 +133,7 @@ describe Grape::Validations do
75
133
  expect(last_response.status).to eq 200
76
134
  expect(last_response.body).to eq 'bacon'
77
135
  end
136
+
78
137
  it 'ignores field in query' do
79
138
  get '/', nil, text: 'abc'
80
139
  expect(last_response.status).to eq 400
@@ -83,15 +142,6 @@ describe Grape::Validations do
83
142
  end
84
143
 
85
144
  context 'using a custom validator with message_key' do
86
- before do
87
- module CustomValidationsSpec
88
- class WithMessageKey < Grape::Validations::PresenceValidator
89
- def validate_param!(attr_name, _params)
90
- raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: :presence
91
- end
92
- end
93
- end
94
- end
95
145
  subject do
96
146
  Class.new(Grape::API) do
97
147
  params do
@@ -103,6 +153,22 @@ describe Grape::Validations do
103
153
  end
104
154
  end
105
155
 
156
+ let(:message_key_validator) do
157
+ Class.new(Grape::Validations::Validators::PresenceValidator) do
158
+ def validate_param!(attr_name, _params)
159
+ raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: :presence)
160
+ end
161
+ end
162
+ end
163
+
164
+ before do
165
+ described_class.register_validator('with_message_key', message_key_validator)
166
+ end
167
+
168
+ after do
169
+ described_class.deregister_validator('with_message_key')
170
+ end
171
+
106
172
  def app
107
173
  subject
108
174
  end
@@ -115,22 +181,6 @@ describe Grape::Validations do
115
181
  end
116
182
 
117
183
  context 'using a custom request/param validator' do
118
- before do
119
- module CustomValidationsSpec
120
- class Admin < Grape::Validations::Base
121
- def validate(request)
122
- # return if the param we are checking was not in request
123
- # @attrs is a list containing the attribute we are currently validating
124
- return unless request.params.key? @attrs.first
125
- # check if admin flag is set to true
126
- return unless @option
127
- # check if user is admin or not
128
- # as an example get a token from request and check if it's admin or not
129
- raise Grape::Exceptions::Validation, params: @attrs, message: 'Can not set Admin only field.' unless request.headers['X-Access-Token'] == 'admin'
130
- end
131
- end
132
- end
133
- end
134
184
  subject do
135
185
  Class.new(Grape::API) do
136
186
  params do
@@ -144,6 +194,29 @@ describe Grape::Validations do
144
194
  end
145
195
  end
146
196
 
197
+ let(:admin_validator) do
198
+ Class.new(Grape::Validations::Validators::Base) do
199
+ def validate(request)
200
+ # return if the param we are checking was not in request
201
+ # @attrs is a list containing the attribute we are currently validating
202
+ return unless request.params.key? @attrs.first
203
+ # check if admin flag is set to true
204
+ return unless @option
205
+ # check if user is admin or not
206
+ # as an example get a token from request and check if it's admin or not
207
+ raise Grape::Exceptions::Validation.new(params: @attrs, message: 'Can not set Admin only field.') unless request.headers['X-Access-Token'] == 'admin'
208
+ end
209
+ end
210
+ end
211
+
212
+ before do
213
+ described_class.register_validator('admin', admin_validator)
214
+ end
215
+
216
+ after do
217
+ described_class.deregister_validator('admin')
218
+ end
219
+
147
220
  def app
148
221
  subject
149
222
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module DeeplyIncludedOptionsSpec
4
4
  module Defaults
@@ -39,18 +39,18 @@ describe Grape::API do
39
39
 
40
40
  it 'works for unspecified format' do
41
41
  get '/users'
42
- expect(last_response.status).to eql 200
42
+ expect(last_response.status).to be 200
43
43
  expect(last_response.content_type).to eql 'application/json'
44
44
  end
45
45
 
46
46
  it 'works for specified format' do
47
47
  get '/users.json'
48
- expect(last_response.status).to eql 200
48
+ expect(last_response.status).to be 200
49
49
  expect(last_response.content_type).to eql 'application/json'
50
50
  end
51
51
 
52
52
  it "doesn't work for format different than specified" do
53
53
  get '/users.txt'
54
- expect(last_response.status).to eql 404
54
+ expect(last_response.status).to be 404
55
55
  end
56
56
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Grape::API::Instance do
4
+ describe 'boolean constant' do
5
+ module DefinesBooleanInstanceSpec
6
+ class API < Grape::API
7
+ params do
8
+ requires :message, type: Boolean
9
+ end
10
+ post :echo do
11
+ { class: params[:message].class.name, value: params[:message] }
12
+ end
13
+ end
14
+ end
15
+
16
+ def app
17
+ DefinesBooleanInstanceSpec::API
18
+ end
19
+
20
+ let(:expected_body) do
21
+ { class: 'TrueClass', value: true }.to_s
22
+ end
23
+
24
+ it 'sets Boolean as a type' do
25
+ post '/echo?message=true'
26
+ expect(last_response.status).to eq(201)
27
+ expect(last_response.body).to eq expected_body
28
+ end
29
+
30
+ context 'Params endpoint type' do
31
+ subject { DefinesBooleanInstanceSpec::API.new.router.map['POST'].first.options[:params]['message'][:type] }
32
+
33
+ it 'params type is a boolean' do
34
+ expect(subject).to eq 'Grape::API::Boolean'
35
+ end
36
+ end
37
+ end
38
+ end