grape 1.8.0 → 4.0.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.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +517 -1
  3. data/CONTRIBUTING.md +19 -11
  4. data/README.md +841 -545
  5. data/UPGRADING.md +1553 -7
  6. data/grape.gemspec +11 -14
  7. data/lib/grape/api/instance.rb +77 -160
  8. data/lib/grape/api.rb +75 -107
  9. data/lib/grape/content_types.rb +67 -9
  10. data/lib/grape/cookies.rb +28 -25
  11. data/lib/grape/declared_params_handler.rb +116 -0
  12. data/lib/grape/dry_types.rb +48 -6
  13. data/lib/grape/dsl/callbacks.rb +8 -58
  14. data/lib/grape/dsl/declared.rb +35 -0
  15. data/lib/grape/dsl/desc.rb +25 -63
  16. data/lib/grape/dsl/entity.rb +106 -0
  17. data/lib/grape/dsl/headers.rb +2 -2
  18. data/lib/grape/dsl/helpers.rb +83 -64
  19. data/lib/grape/dsl/inside_route.rb +69 -296
  20. data/lib/grape/dsl/logger.rb +4 -9
  21. data/lib/grape/dsl/middleware.rb +22 -40
  22. data/lib/grape/dsl/parameters.rb +88 -94
  23. data/lib/grape/dsl/request_response.rb +143 -147
  24. data/lib/grape/dsl/rescue_options.rb +25 -0
  25. data/lib/grape/dsl/routing.rb +333 -191
  26. data/lib/grape/dsl/settings.rb +29 -135
  27. data/lib/grape/dsl/validations.rb +39 -32
  28. data/lib/grape/dsl/version_options.rb +23 -0
  29. data/lib/grape/endpoint/options.rb +25 -0
  30. data/lib/grape/endpoint.rb +319 -269
  31. data/lib/grape/{util/env.rb → env.rb} +8 -8
  32. data/lib/grape/error_formatter/base.rb +57 -21
  33. data/lib/grape/error_formatter/json.rb +13 -15
  34. data/lib/grape/error_formatter/serializable_hash.rb +7 -0
  35. data/lib/grape/error_formatter/txt.rb +12 -18
  36. data/lib/grape/error_formatter/xml.rb +3 -13
  37. data/lib/grape/error_formatter.rb +9 -25
  38. data/lib/grape/exceptions/base.rb +22 -58
  39. data/lib/grape/exceptions/error_response.rb +48 -0
  40. data/lib/grape/exceptions/incompatible_option_values.rb +1 -1
  41. data/lib/grape/exceptions/internal_server_error.rb +16 -0
  42. data/lib/grape/exceptions/invalid_accept_header.rb +1 -1
  43. data/lib/grape/exceptions/invalid_formatter.rb +1 -1
  44. data/lib/grape/exceptions/invalid_message_body.rb +1 -1
  45. data/lib/grape/exceptions/invalid_version_header.rb +1 -1
  46. data/lib/grape/exceptions/invalid_versioner_option.rb +1 -1
  47. data/lib/grape/exceptions/method_not_allowed.rb +1 -1
  48. data/lib/grape/exceptions/missing_group_type.rb +0 -2
  49. data/lib/grape/exceptions/missing_mime_type.rb +1 -1
  50. data/lib/grape/exceptions/request_error.rb +11 -0
  51. data/lib/grape/exceptions/unknown_auth_strategy.rb +11 -0
  52. data/lib/grape/exceptions/unknown_error_formatter.rb +11 -0
  53. data/lib/grape/exceptions/unknown_parameter.rb +1 -1
  54. data/lib/grape/exceptions/unknown_params_builder.rb +11 -0
  55. data/lib/grape/exceptions/unknown_validator.rb +1 -1
  56. data/lib/grape/exceptions/unsupported_group_type.rb +0 -2
  57. data/lib/grape/exceptions/validation.rb +28 -11
  58. data/lib/grape/exceptions/validation_array_errors.rb +5 -0
  59. data/lib/grape/exceptions/validation_errors.rb +22 -26
  60. data/lib/grape/formatter/base.rb +16 -0
  61. data/lib/grape/formatter/json.rb +5 -6
  62. data/lib/grape/formatter/serializable_hash.rb +7 -10
  63. data/lib/grape/formatter/txt.rb +3 -5
  64. data/lib/grape/formatter/xml.rb +4 -6
  65. data/lib/grape/formatter.rb +7 -25
  66. data/lib/grape/json.rb +46 -0
  67. data/lib/grape/locale/en.yml +44 -42
  68. data/lib/grape/middleware/auth/base.rb +11 -33
  69. data/lib/grape/middleware/auth/dsl.rb +12 -34
  70. data/lib/grape/middleware/auth/strategies.rb +1 -2
  71. data/lib/grape/middleware/base.rb +56 -33
  72. data/lib/grape/middleware/error.rb +290 -91
  73. data/lib/grape/middleware/formatter.rb +164 -106
  74. data/lib/grape/middleware/precomputed_content_types.rb +51 -0
  75. data/lib/grape/middleware/stack.rb +38 -40
  76. data/lib/grape/middleware/versioner/accept_version_header.rb +6 -33
  77. data/lib/grape/middleware/versioner/base.rb +66 -0
  78. data/lib/grape/middleware/versioner/header.rb +44 -129
  79. data/lib/grape/middleware/versioner/param.rb +4 -25
  80. data/lib/grape/middleware/versioner/path.rb +48 -25
  81. data/lib/grape/middleware/versioner.rb +7 -14
  82. data/lib/grape/mountable.rb +22 -0
  83. data/lib/grape/namespace.rb +21 -14
  84. data/lib/grape/params_builder/base.rb +20 -0
  85. data/lib/grape/params_builder/hash.rb +11 -0
  86. data/lib/grape/params_builder/hash_with_indifferent_access.rb +11 -0
  87. data/lib/grape/params_builder/hashie_mash.rb +11 -0
  88. data/lib/grape/params_builder.rb +15 -0
  89. data/lib/grape/parser/base.rb +16 -0
  90. data/lib/grape/parser/json.rb +6 -8
  91. data/lib/grape/parser/xml.rb +6 -8
  92. data/lib/grape/parser.rb +5 -23
  93. data/lib/grape/path.rb +8 -94
  94. data/lib/grape/precompiled_json.rb +50 -0
  95. data/lib/grape/railtie.rb +9 -0
  96. data/lib/grape/request.rb +200 -26
  97. data/lib/grape/router/base_route.rb +85 -0
  98. data/lib/grape/router/greedy_route.rb +30 -0
  99. data/lib/grape/router/mustermann_pattern.rb +44 -0
  100. data/lib/grape/router/pattern/path.rb +78 -0
  101. data/lib/grape/router/pattern.rb +77 -35
  102. data/lib/grape/router/route.rb +79 -60
  103. data/lib/grape/router.rb +128 -104
  104. data/lib/grape/serve_stream/file_body.rb +7 -0
  105. data/lib/grape/serve_stream/sendfile_response.rb +3 -5
  106. data/lib/grape/serve_stream/stream_response.rb +7 -0
  107. data/lib/grape/testing.rb +33 -0
  108. data/lib/grape/util/api_description.rb +67 -0
  109. data/lib/grape/util/cache.rb +22 -5
  110. data/lib/grape/util/deep_freeze.rb +34 -0
  111. data/lib/grape/util/endpoint_configuration.rb +1 -1
  112. data/lib/grape/util/freeze_on_new.rb +20 -0
  113. data/lib/grape/util/header.rb +13 -0
  114. data/lib/grape/util/inheritable_setting.rb +777 -39
  115. data/lib/grape/util/lazy/base.rb +16 -0
  116. data/lib/grape/util/lazy/block.rb +22 -0
  117. data/lib/grape/util/lazy/value.rb +31 -0
  118. data/lib/grape/util/lazy/value_array.rb +21 -0
  119. data/lib/grape/util/lazy/value_enumerable.rb +31 -0
  120. data/lib/grape/util/lazy/value_hash.rb +21 -0
  121. data/lib/grape/util/media_type.rb +74 -0
  122. data/lib/grape/util/path_normalizer.rb +37 -0
  123. data/lib/grape/util/registry.rb +37 -0
  124. data/lib/grape/util/shadowed_rescue_handlers.rb +49 -0
  125. data/lib/grape/util/stackable_values.rb +40 -16
  126. data/lib/grape/util/translation.rb +42 -0
  127. data/lib/grape/validations/attributes_iterator.rb +61 -28
  128. data/lib/grape/validations/coerce_options.rb +21 -0
  129. data/lib/grape/validations/contract_scope.rb +29 -0
  130. data/lib/grape/validations/multiple_attributes_iterator.rb +1 -1
  131. data/lib/grape/validations/oneof_collector.rb +35 -0
  132. data/lib/grape/validations/param_scope_tracker.rb +62 -0
  133. data/lib/grape/validations/params_documentation.rb +52 -0
  134. data/lib/grape/validations/params_scope.rb +223 -306
  135. data/lib/grape/validations/shared_options.rb +19 -0
  136. data/lib/grape/validations/single_attribute_iterator.rb +6 -4
  137. data/lib/grape/validations/types/array_coercer.rb +7 -12
  138. data/lib/grape/validations/types/custom_type_coercer.rb +47 -85
  139. data/lib/grape/validations/types/custom_type_collection_coercer.rb +1 -1
  140. data/lib/grape/validations/types/dry_type_coercer.rb +17 -28
  141. data/lib/grape/validations/types/json.rb +1 -5
  142. data/lib/grape/validations/types/multiple_type_coercer.rb +5 -3
  143. data/lib/grape/validations/types/primitive_coercer.rb +14 -35
  144. data/lib/grape/validations/types/set_coercer.rb +1 -4
  145. data/lib/grape/validations/types/variant_collection_coercer.rb +16 -3
  146. data/lib/grape/validations/types.rb +29 -54
  147. data/lib/grape/validations/validations_spec.rb +164 -0
  148. data/lib/grape/validations/validators/all_or_none_of_validator.rb +6 -3
  149. data/lib/grape/validations/validators/allow_blank_validator.rb +10 -5
  150. data/lib/grape/validations/validators/at_least_one_of_validator.rb +5 -2
  151. data/lib/grape/validations/validators/base.rb +118 -37
  152. data/lib/grape/validations/validators/coerce_validator.rb +26 -38
  153. data/lib/grape/validations/validators/contract_scope_validator.rb +46 -0
  154. data/lib/grape/validations/validators/default_validator.rb +13 -16
  155. data/lib/grape/validations/validators/exactly_one_of_validator.rb +10 -3
  156. data/lib/grape/validations/validators/except_values_validator.rb +15 -5
  157. data/lib/grape/validations/validators/length_validator.rb +50 -0
  158. data/lib/grape/validations/validators/multiple_params_base.rb +12 -9
  159. data/lib/grape/validations/validators/{mutual_exclusion_validator.rb → mutually_exclusive_validator.rb} +4 -2
  160. data/lib/grape/validations/validators/oneof_validator.rb +51 -0
  161. data/lib/grape/validations/validators/presence_validator.rb +4 -2
  162. data/lib/grape/validations/validators/regexp_validator.rb +11 -3
  163. data/lib/grape/validations/validators/same_as_validator.rb +7 -15
  164. data/lib/grape/validations/validators/values_validator.rb +36 -65
  165. data/lib/grape/validations.rb +8 -21
  166. data/lib/grape/version.rb +1 -2
  167. data/lib/grape/xml.rb +17 -0
  168. data/lib/grape.rb +96 -288
  169. metadata +83 -294
  170. data/lib/grape/api/helpers.rb +0 -9
  171. data/lib/grape/dsl/api.rb +0 -19
  172. data/lib/grape/dsl/configuration.rb +0 -15
  173. data/lib/grape/eager_load.rb +0 -20
  174. data/lib/grape/exceptions/empty_message_body.rb +0 -11
  175. data/lib/grape/exceptions/missing_option.rb +0 -11
  176. data/lib/grape/exceptions/too_many_multipart_files.rb +0 -11
  177. data/lib/grape/exceptions/unknown_options.rb +0 -11
  178. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +0 -27
  179. data/lib/grape/extensions/hash.rb +0 -22
  180. data/lib/grape/extensions/hashie/mash.rb +0 -26
  181. data/lib/grape/http/headers.rb +0 -61
  182. data/lib/grape/middleware/globals.rb +0 -16
  183. data/lib/grape/middleware/helpers.rb +0 -12
  184. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +0 -24
  185. data/lib/grape/router/attribute_translator.rb +0 -63
  186. data/lib/grape/types/invalid_value.rb +0 -8
  187. data/lib/grape/util/base_inheritable.rb +0 -43
  188. data/lib/grape/util/inheritable_values.rb +0 -31
  189. data/lib/grape/util/json.rb +0 -12
  190. data/lib/grape/util/lazy_block.rb +0 -27
  191. data/lib/grape/util/lazy_object.rb +0 -43
  192. data/lib/grape/util/lazy_value.rb +0 -91
  193. data/lib/grape/util/registrable.rb +0 -15
  194. data/lib/grape/util/reverse_stackable_values.rb +0 -20
  195. data/lib/grape/util/strict_hash_configuration.rb +0 -108
  196. data/lib/grape/util/xml.rb +0 -10
  197. data/lib/grape/validations/attributes_doc.rb +0 -58
  198. data/lib/grape/validations/types/build_coercer.rb +0 -94
  199. data/lib/grape/validations/validator_factory.rb +0 -15
  200. data/spec/grape/api/custom_validations_spec.rb +0 -213
  201. data/spec/grape/api/deeply_included_options_spec.rb +0 -56
  202. data/spec/grape/api/defines_boolean_in_params_spec.rb +0 -38
  203. data/spec/grape/api/documentation_spec.rb +0 -59
  204. data/spec/grape/api/inherited_helpers_spec.rb +0 -114
  205. data/spec/grape/api/instance_spec.rb +0 -103
  206. data/spec/grape/api/invalid_format_spec.rb +0 -45
  207. data/spec/grape/api/namespace_parameters_in_route_spec.rb +0 -38
  208. data/spec/grape/api/nested_helpers_spec.rb +0 -50
  209. data/spec/grape/api/optional_parameters_in_route_spec.rb +0 -43
  210. data/spec/grape/api/parameters_modification_spec.rb +0 -41
  211. data/spec/grape/api/patch_method_helpers_spec.rb +0 -79
  212. data/spec/grape/api/recognize_path_spec.rb +0 -21
  213. data/spec/grape/api/required_parameters_in_route_spec.rb +0 -37
  214. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +0 -26
  215. data/spec/grape/api/routes_with_requirements_spec.rb +0 -59
  216. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +0 -41
  217. data/spec/grape/api/shared_helpers_spec.rb +0 -36
  218. data/spec/grape/api_remount_spec.rb +0 -509
  219. data/spec/grape/api_spec.rb +0 -4356
  220. data/spec/grape/dsl/callbacks_spec.rb +0 -45
  221. data/spec/grape/dsl/desc_spec.rb +0 -98
  222. data/spec/grape/dsl/headers_spec.rb +0 -62
  223. data/spec/grape/dsl/helpers_spec.rb +0 -100
  224. data/spec/grape/dsl/inside_route_spec.rb +0 -531
  225. data/spec/grape/dsl/logger_spec.rb +0 -24
  226. data/spec/grape/dsl/middleware_spec.rb +0 -60
  227. data/spec/grape/dsl/parameters_spec.rb +0 -180
  228. data/spec/grape/dsl/request_response_spec.rb +0 -225
  229. data/spec/grape/dsl/routing_spec.rb +0 -275
  230. data/spec/grape/dsl/settings_spec.rb +0 -261
  231. data/spec/grape/dsl/validations_spec.rb +0 -55
  232. data/spec/grape/endpoint/declared_spec.rb +0 -846
  233. data/spec/grape/endpoint_spec.rb +0 -1085
  234. data/spec/grape/entity_spec.rb +0 -336
  235. data/spec/grape/exceptions/base_spec.rb +0 -81
  236. data/spec/grape/exceptions/body_parse_errors_spec.rb +0 -185
  237. data/spec/grape/exceptions/invalid_accept_header_spec.rb +0 -358
  238. data/spec/grape/exceptions/invalid_formatter_spec.rb +0 -15
  239. data/spec/grape/exceptions/invalid_response_spec.rb +0 -11
  240. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +0 -15
  241. data/spec/grape/exceptions/missing_group_type_spec.rb +0 -17
  242. data/spec/grape/exceptions/missing_mime_type_spec.rb +0 -17
  243. data/spec/grape/exceptions/missing_option_spec.rb +0 -15
  244. data/spec/grape/exceptions/unknown_options_spec.rb +0 -15
  245. data/spec/grape/exceptions/unknown_validator_spec.rb +0 -15
  246. data/spec/grape/exceptions/unsupported_group_type_spec.rb +0 -19
  247. data/spec/grape/exceptions/validation_errors_spec.rb +0 -92
  248. data/spec/grape/exceptions/validation_spec.rb +0 -19
  249. data/spec/grape/extensions/param_builders/hash_spec.rb +0 -83
  250. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +0 -105
  251. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +0 -79
  252. data/spec/grape/grape_spec.rb +0 -9
  253. data/spec/grape/integration/global_namespace_function_spec.rb +0 -29
  254. data/spec/grape/integration/rack_sendfile_spec.rb +0 -48
  255. data/spec/grape/integration/rack_spec.rb +0 -51
  256. data/spec/grape/loading_spec.rb +0 -44
  257. data/spec/grape/middleware/auth/base_spec.rb +0 -31
  258. data/spec/grape/middleware/auth/dsl_spec.rb +0 -60
  259. data/spec/grape/middleware/auth/strategies_spec.rb +0 -120
  260. data/spec/grape/middleware/base_spec.rb +0 -221
  261. data/spec/grape/middleware/error_spec.rb +0 -85
  262. data/spec/grape/middleware/exception_spec.rb +0 -294
  263. data/spec/grape/middleware/formatter_spec.rb +0 -461
  264. data/spec/grape/middleware/globals_spec.rb +0 -30
  265. data/spec/grape/middleware/stack_spec.rb +0 -155
  266. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +0 -122
  267. data/spec/grape/middleware/versioner/header_spec.rb +0 -345
  268. data/spec/grape/middleware/versioner/param_spec.rb +0 -171
  269. data/spec/grape/middleware/versioner/path_spec.rb +0 -62
  270. data/spec/grape/middleware/versioner_spec.rb +0 -21
  271. data/spec/grape/named_api_spec.rb +0 -19
  272. data/spec/grape/parser_spec.rb +0 -86
  273. data/spec/grape/path_spec.rb +0 -252
  274. data/spec/grape/presenters/presenter_spec.rb +0 -71
  275. data/spec/grape/request_spec.rb +0 -126
  276. data/spec/grape/util/inheritable_setting_spec.rb +0 -242
  277. data/spec/grape/util/inheritable_values_spec.rb +0 -79
  278. data/spec/grape/util/reverse_stackable_values_spec.rb +0 -134
  279. data/spec/grape/util/stackable_values_spec.rb +0 -128
  280. data/spec/grape/util/strict_hash_configuration_spec.rb +0 -38
  281. data/spec/grape/validations/attributes_doc_spec.rb +0 -153
  282. data/spec/grape/validations/instance_behaivour_spec.rb +0 -43
  283. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +0 -38
  284. data/spec/grape/validations/params_scope_spec.rb +0 -1420
  285. data/spec/grape/validations/single_attribute_iterator_spec.rb +0 -56
  286. data/spec/grape/validations/types/array_coercer_spec.rb +0 -33
  287. data/spec/grape/validations/types/primitive_coercer_spec.rb +0 -150
  288. data/spec/grape/validations/types/set_coercer_spec.rb +0 -32
  289. data/spec/grape/validations/types_spec.rb +0 -111
  290. data/spec/grape/validations/validators/all_or_none_spec.rb +0 -162
  291. data/spec/grape/validations/validators/allow_blank_spec.rb +0 -575
  292. data/spec/grape/validations/validators/at_least_one_of_spec.rb +0 -205
  293. data/spec/grape/validations/validators/base_spec.rb +0 -38
  294. data/spec/grape/validations/validators/coerce_spec.rb +0 -1261
  295. data/spec/grape/validations/validators/default_spec.rb +0 -463
  296. data/spec/grape/validations/validators/exactly_one_of_spec.rb +0 -233
  297. data/spec/grape/validations/validators/except_values_spec.rb +0 -192
  298. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +0 -214
  299. data/spec/grape/validations/validators/presence_spec.rb +0 -315
  300. data/spec/grape/validations/validators/regexp_spec.rb +0 -161
  301. data/spec/grape/validations/validators/same_as_spec.rb +0 -57
  302. data/spec/grape/validations/validators/values_spec.rb +0 -733
  303. data/spec/grape/validations/validators/zh-CN.yml +0 -10
  304. data/spec/grape/validations_spec.rb +0 -2030
  305. data/spec/integration/eager_load/eager_load_spec.rb +0 -15
  306. data/spec/integration/multi_json/json_spec.rb +0 -7
  307. data/spec/integration/multi_xml/xml_spec.rb +0 -7
  308. data/spec/shared/deprecated_class_examples.rb +0 -16
  309. data/spec/shared/versioning_examples.rb +0 -215
  310. data/spec/spec_helper.rb +0 -52
  311. data/spec/support/basic_auth_encode_helpers.rb +0 -11
  312. data/spec/support/chunks.rb +0 -14
  313. data/spec/support/content_type_helpers.rb +0 -15
  314. data/spec/support/endpoint_faker.rb +0 -25
  315. data/spec/support/file_streamer.rb +0 -13
  316. data/spec/support/integer_helpers.rb +0 -13
  317. data/spec/support/versioned_helpers.rb +0 -55
data/lib/grape.rb CHANGED
@@ -1,305 +1,113 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'logger'
4
- require 'rack'
5
- require 'rack/builder'
6
- require 'rack/accept'
7
- require 'rack/auth/basic'
8
- require 'rack/auth/digest/md5'
9
- require 'set'
10
- require 'bigdecimal'
11
- require 'date'
4
+ require 'monitor'
12
5
  require 'active_support'
13
- require 'active_support/concern'
14
- require 'active_support/configurable'
15
- require 'active_support/version'
16
- require 'active_support/isolated_execution_state' if ActiveSupport::VERSION::MAJOR > 6
17
- require 'active_support/core_ext/array/conversions'
18
- require 'active_support/core_ext/array/extract_options'
6
+ require 'active_support/isolated_execution_state'
7
+ require 'active_support/core_ext/array/conversions' # to_xml
19
8
  require 'active_support/core_ext/array/wrap'
20
- require 'active_support/core_ext/hash/conversions'
9
+ require 'active_support/core_ext/hash/conversions' # to_xml
21
10
  require 'active_support/core_ext/hash/deep_merge'
22
- require 'active_support/core_ext/hash/except'
23
- require 'active_support/core_ext/hash/indifferent_access'
24
- require 'active_support/core_ext/hash/keys'
25
- require 'active_support/core_ext/hash/reverse_merge'
26
- require 'active_support/core_ext/hash/slice'
11
+ require 'active_support/core_ext/hash/deep_transform_values'
12
+ require 'active_support/core_ext/hash/indifferent_access' # nested_under_indifferent_access, required by HashWithIndifferentAccess.new
13
+ require 'active_support/hash_with_indifferent_access'
14
+ require 'active_support/core_ext/module/delegation' # delegate_missing_to
27
15
  require 'active_support/core_ext/object/blank'
16
+ require 'active_support/core_ext/object/deep_dup'
28
17
  require 'active_support/core_ext/object/duplicable'
29
- require 'active_support/dependencies/autoload'
18
+ require 'active_support/core_ext/string/inflections' # demodulize, underscore
30
19
  require 'active_support/deprecation'
31
- require 'active_support/inflector'
20
+ require 'active_support/ordered_options'
32
21
  require 'active_support/notifications'
33
- require 'i18n'
22
+
23
+ require 'English'
24
+ require 'bigdecimal'
25
+ require 'date'
26
+ require 'dry-types'
27
+ require 'dry-configurable'
28
+ require 'forwardable'
29
+ require 'json'
30
+ require 'mustermann'
31
+ require 'mustermann/ast/pattern'
32
+ require 'rack'
33
+ require 'rack/auth/basic'
34
+ require 'rack/builder'
35
+ require 'rack/head'
36
+ require 'singleton'
37
+ require 'zeitwerk'
38
+
39
+ loader = Zeitwerk::Loader.for_gem
40
+ loader.inflector.inflect(
41
+ 'api' => 'API',
42
+ 'dsl' => 'DSL'
43
+ )
44
+ railtie = "#{__dir__}/grape/railtie.rb"
45
+ # Grape::Testing is a test-environment helper -- it extends Grape::Endpoint with
46
+ # `before_each` and prepends a hook to Grape::Endpoint#run. It is documented as
47
+ # opt-in (`require 'grape/testing'`), which eager loading quietly contradicted
48
+ # by installing it in every process.
49
+ testing = "#{__dir__}/grape/testing.rb"
50
+ loader.do_not_eager_load(railtie, testing)
51
+ loader.setup
34
52
 
35
53
  I18n.load_path << File.expand_path('grape/locale/en.yml', __dir__)
36
54
 
37
55
  module Grape
38
- include ActiveSupport::Configurable
39
- extend ::ActiveSupport::Autoload
40
-
41
- eager_autoload do
42
- autoload :API
43
- autoload :Endpoint
44
-
45
- autoload :Namespace
46
-
47
- autoload :Path
48
- autoload :Cookies
49
- autoload :Validations
50
- autoload :ErrorFormatter
51
- autoload :Formatter
52
- autoload :Parser
53
- autoload :Request
54
- autoload :Env, 'grape/util/env'
55
- autoload :Json, 'grape/util/json'
56
- autoload :Xml, 'grape/util/xml'
57
- autoload :DryTypes
58
- end
59
-
60
- module Http
61
- extend ::ActiveSupport::Autoload
62
- eager_autoload do
63
- autoload :Headers
64
- end
65
- end
66
-
67
- module Exceptions
68
- extend ::ActiveSupport::Autoload
69
- eager_autoload do
70
- autoload :Base
71
- autoload :Validation
72
- autoload :ValidationArrayErrors
73
- autoload :ValidationErrors
74
- autoload :MissingVendorOption
75
- autoload :MissingMimeType
76
- autoload :MissingOption
77
- autoload :InvalidFormatter
78
- autoload :InvalidVersionerOption
79
- autoload :UnknownValidator
80
- autoload :UnknownOptions
81
- autoload :UnknownParameter
82
- autoload :InvalidWithOptionForRepresent
83
- autoload :IncompatibleOptionValues
84
- autoload :MissingGroupType
85
- autoload :UnsupportedGroupType
86
- autoload :InvalidMessageBody
87
- autoload :InvalidAcceptHeader
88
- autoload :InvalidVersionHeader
89
- autoload :MethodNotAllowed
90
- autoload :InvalidResponse
91
- autoload :EmptyMessageBody
92
- autoload :TooManyMultipartFiles
93
- autoload :MissingGroupTypeError, 'grape/exceptions/missing_group_type'
94
- autoload :UnsupportedGroupTypeError, 'grape/exceptions/unsupported_group_type'
95
- end
96
- end
97
-
98
- module Extensions
99
- extend ::ActiveSupport::Autoload
100
- eager_autoload do
101
- autoload :Hash
102
- end
103
- module ActiveSupport
104
- extend ::ActiveSupport::Autoload
105
- eager_autoload do
106
- autoload :HashWithIndifferentAccess
107
- end
108
- end
109
-
110
- module Hashie
111
- extend ::ActiveSupport::Autoload
112
- eager_autoload do
113
- autoload :Mash
114
- end
115
- end
116
- end
117
-
118
- module Middleware
119
- extend ::ActiveSupport::Autoload
120
- eager_autoload do
121
- autoload :Base
122
- autoload :Versioner
123
- autoload :Formatter
124
- autoload :Error
125
- autoload :Globals
126
- autoload :Stack
127
- autoload :Helpers
128
- end
129
-
130
- module Auth
131
- extend ::ActiveSupport::Autoload
132
- eager_autoload do
133
- autoload :Base
134
- autoload :DSL
135
- autoload :StrategyInfo
136
- autoload :Strategies
137
- end
138
- end
139
-
140
- module Versioner
141
- extend ::ActiveSupport::Autoload
142
- eager_autoload do
143
- autoload :Path
144
- autoload :Header
145
- autoload :Param
146
- autoload :AcceptVersionHeader
147
- end
148
- end
149
- end
150
-
151
- module Util
152
- extend ::ActiveSupport::Autoload
153
- eager_autoload do
154
- autoload :InheritableValues
155
- autoload :StackableValues
156
- autoload :ReverseStackableValues
157
- autoload :InheritableSetting
158
- autoload :StrictHashConfiguration
159
- autoload :Registrable
160
- end
161
- end
162
-
163
- module ErrorFormatter
164
- extend ::ActiveSupport::Autoload
165
- eager_autoload do
166
- autoload :Base
167
- autoload :Json
168
- autoload :Txt
169
- autoload :Xml
170
- end
171
- end
172
-
173
- module Formatter
174
- extend ::ActiveSupport::Autoload
175
- eager_autoload do
176
- autoload :Json
177
- autoload :SerializableHash
178
- autoload :Txt
179
- autoload :Xml
180
- end
181
- end
182
-
183
- module Parser
184
- extend ::ActiveSupport::Autoload
185
- eager_autoload do
186
- autoload :Json
187
- autoload :Xml
188
- end
189
- end
190
-
191
- module DSL
192
- extend ::ActiveSupport::Autoload
193
- eager_autoload do
194
- autoload :API
195
- autoload :Callbacks
196
- autoload :Settings
197
- autoload :Configuration
198
- autoload :InsideRoute
199
- autoload :Helpers
200
- autoload :Middleware
201
- autoload :Parameters
202
- autoload :RequestResponse
203
- autoload :Routing
204
- autoload :Validations
205
- autoload :Logger
206
- autoload :Desc
207
- end
208
- end
209
-
210
- class API
211
- extend ::ActiveSupport::Autoload
212
- eager_autoload do
213
- autoload :Helpers
214
- end
215
- end
216
-
217
- module Presenters
218
- extend ::ActiveSupport::Autoload
219
- eager_autoload do
220
- autoload :Presenter
221
- end
222
- end
223
-
224
- module ServeStream
225
- extend ::ActiveSupport::Autoload
226
- eager_autoload do
227
- autoload :FileBody
228
- autoload :SendfileResponse
229
- autoload :StreamResponse
230
- end
231
- end
232
-
233
- module Validations
234
- extend ::ActiveSupport::Autoload
235
-
236
- eager_autoload do
237
- autoload :AttributesIterator
238
- autoload :MultipleAttributesIterator
239
- autoload :SingleAttributeIterator
240
- autoload :Types
241
- autoload :ParamsScope
242
- autoload :ValidatorFactory
243
- autoload :Base, 'grape/validations/validators/base'
244
- end
245
-
246
- module Types
247
- extend ::ActiveSupport::Autoload
248
-
249
- eager_autoload do
250
- autoload :InvalidValue
251
- autoload :DryTypeCoercer
252
- autoload :ArrayCoercer
253
- autoload :SetCoercer
254
- autoload :PrimitiveCoercer
255
- autoload :CustomTypeCoercer
256
- autoload :CustomTypeCollectionCoercer
257
- autoload :MultipleTypeCoercer
258
- autoload :VariantCollectionCoercer
259
- end
260
- end
261
-
262
- module Validators
263
- extend ::ActiveSupport::Autoload
264
-
265
- eager_autoload do
266
- autoload :Base
267
- autoload :MultipleParamsBase
268
- autoload :AllOrNoneOfValidator
269
- autoload :AllowBlankValidator
270
- autoload :AsValidator
271
- autoload :AtLeastOneOfValidator
272
- autoload :CoerceValidator
273
- autoload :DefaultValidator
274
- autoload :ExactlyOneOfValidator
275
- autoload :ExceptValuesValidator
276
- autoload :MutualExclusionValidator
277
- autoload :PresenceValidator
278
- autoload :RegexpValidator
279
- autoload :SameAsValidator
280
- autoload :ValuesValidator
281
- end
282
- end
283
- end
284
-
285
- module Types
286
- extend ::ActiveSupport::Autoload
287
-
288
- eager_autoload do
289
- autoload :InvalidValue
290
- end
291
- end
292
-
293
- configure do |config|
294
- config.param_builder = Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder
295
- config.compile_methods!
56
+ extend Dry::Configurable
57
+
58
+ setting :param_builder, default: :hash_with_indifferent_access
59
+ setting :lint, default: false
60
+ setting :warn_on_helper_overrides, default: false
61
+ # Let an error response that cannot be rendered propagate out of the
62
+ # middleware stack instead of being answered with a failsafe 500.
63
+ setting :raise_rendering_errors, default: false
64
+
65
+ # The HTTP QUERY method (RFC 10008): a safe, idempotent request whose content
66
+ # carries the query. Rack has no constant for it yet, hence the literal.
67
+ QUERY = 'QUERY'
68
+
69
+ HTTP_SUPPORTED_METHODS = [
70
+ Rack::GET,
71
+ QUERY,
72
+ Rack::POST,
73
+ Rack::PUT,
74
+ Rack::PATCH,
75
+ Rack::DELETE,
76
+ Rack::HEAD,
77
+ Rack::OPTIONS
78
+ ].freeze
79
+
80
+ # Rack errors that should be rescued and wrapped as Grape::Exceptions::RequestError.
81
+ # Rack 3.1.0 introduced Rack::BadRequest as a marker module included by all bad request
82
+ # exception classes, allowing a single rescue entry to cover them all.
83
+ # Before, these errors are raised as individual exception classes.
84
+ RACK_ERRORS =
85
+ if Gem::Version.new(Rack.release) >= Gem::Version.new('3.1.0')
86
+ [EOFError, Rack::BadRequest]
87
+ else
88
+ [
89
+ EOFError,
90
+ Rack::Multipart::MultipartPartLimitError,
91
+ Rack::Multipart::MultipartTotalPartLimitError,
92
+ Rack::Utils::ParameterTypeError,
93
+ Rack::Utils::InvalidParameterError,
94
+ Rack::QueryParser::ParamsTooDeepError
95
+ ]
96
+ end.freeze
97
+
98
+ # The deprecation horizon is the version a deprecation announces as its
99
+ # removal point, so it is the *next* major rather than the current one, and
100
+ # it is derived from VERSION rather than written out. Written out, it went
101
+ # stale: it said '2.0' from 2023 (#2353) through all of 2.x, 3.x and 4.x, so
102
+ # a method deprecated through this deprecator announced a removal version
103
+ # that had already shipped, and every custom `behavior` lambda -- how a Rails
104
+ # app consumes deprecations -- was handed the same wrong number.
105
+ def self.deprecator
106
+ @deprecator ||= ActiveSupport::Deprecation.new("#{Gem::Version.new(VERSION).segments.first + 1}.0", 'Grape')
296
107
  end
297
108
  end
298
109
 
299
- require 'grape/content_types'
300
-
301
- require 'grape/util/lazy_value'
302
- require 'grape/util/lazy_block'
303
- require 'grape/util/endpoint_configuration'
304
-
305
- require 'grape/version'
110
+ # https://api.rubyonrails.org/classes/ActiveSupport/Deprecation.html
111
+ # adding Grape.deprecator to Rails App if any
112
+ require 'grape/railtie' if defined?(Rails::Railtie)
113
+ loader.eager_load