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
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Exceptions
5
- class TooManyMultipartFiles < Base
6
- def initialize(limit)
7
- super(message: compose_message(:too_many_multipart_files, limit: limit), status: 413)
8
- end
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Exceptions
5
- class UnknownOptions < Base
6
- def initialize(options)
7
- super(message: compose_message(:unknown_options, options: options))
8
- end
9
- end
10
- end
11
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Extensions
5
- module ActiveSupport
6
- module HashWithIndifferentAccess
7
- module ParamBuilder
8
- extend ::ActiveSupport::Concern
9
-
10
- included do
11
- namespace_inheritable(:build_params_with, Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder)
12
- end
13
-
14
- def params_builder
15
- Grape::Extensions::ActiveSupport::HashWithIndifferentAccess::ParamBuilder
16
- end
17
-
18
- def build_params
19
- ::ActiveSupport::HashWithIndifferentAccess.new(rack_params).tap do |params|
20
- params.deep_merge!(grape_routing_args) if env.key?(Grape::Env::GRAPE_ROUTING_ARGS)
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Extensions
5
- module Hash
6
- module ParamBuilder
7
- extend ::ActiveSupport::Concern
8
-
9
- included do
10
- namespace_inheritable(:build_params_with, Grape::Extensions::Hash::ParamBuilder)
11
- end
12
-
13
- def build_params
14
- rack_params.deep_dup.tap do |params|
15
- params.deep_merge!(grape_routing_args) if env.key?(Grape::Env::GRAPE_ROUTING_ARGS)
16
- params.deep_symbolize_keys!
17
- end
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Extensions
5
- module Hashie
6
- module Mash
7
- module ParamBuilder
8
- extend ::ActiveSupport::Concern
9
- included do
10
- namespace_inheritable(:build_params_with, Grape::Extensions::Hashie::Mash::ParamBuilder)
11
- end
12
-
13
- def params_builder
14
- Grape::Extensions::Hashie::Mash::ParamBuilder
15
- end
16
-
17
- def build_params
18
- ::Hashie::Mash.new(rack_params).tap do |params|
19
- params.deep_merge!(grape_routing_args) if env.key?(Grape::Env::GRAPE_ROUTING_ARGS)
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grape/util/lazy_object'
4
-
5
- module Grape
6
- module Http
7
- module Headers
8
- # https://github.com/rack/rack/blob/master/lib/rack.rb
9
- HTTP_VERSION = 'HTTP_VERSION'
10
- PATH_INFO = 'PATH_INFO'
11
- REQUEST_METHOD = 'REQUEST_METHOD'
12
- QUERY_STRING = 'QUERY_STRING'
13
- CONTENT_TYPE = 'Content-Type'
14
-
15
- GET = 'GET'
16
- POST = 'POST'
17
- PUT = 'PUT'
18
- PATCH = 'PATCH'
19
- DELETE = 'DELETE'
20
- HEAD = 'HEAD'
21
- OPTIONS = 'OPTIONS'
22
-
23
- SUPPORTED_METHODS = [GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS].freeze
24
- SUPPORTED_METHODS_WITHOUT_OPTIONS = Grape::Util::LazyObject.new { [GET, POST, PUT, PATCH, DELETE, HEAD].freeze }
25
-
26
- HTTP_ACCEPT_VERSION = 'HTTP_ACCEPT_VERSION'
27
- X_CASCADE = 'X-Cascade'
28
- HTTP_TRANSFER_ENCODING = 'HTTP_TRANSFER_ENCODING'
29
- HTTP_ACCEPT = 'HTTP_ACCEPT'
30
-
31
- FORMAT = 'format'
32
-
33
- HTTP_HEADERS = Grape::Util::LazyObject.new do
34
- common_http_headers = %w[
35
- Version
36
- Host
37
- Connection
38
- Cache-Control
39
- Dnt
40
- Upgrade-Insecure-Requests
41
- User-Agent
42
- Sec-Fetch-Dest
43
- Accept
44
- Sec-Fetch-Site
45
- Sec-Fetch-Mode
46
- Sec-Fetch-User
47
- Accept-Encoding
48
- Accept-Language
49
- Cookie
50
- ].freeze
51
- common_http_headers.each_with_object({}) do |header, response|
52
- response["HTTP_#{header.upcase.tr('-', '_')}"] = header
53
- end.freeze
54
- end
55
-
56
- def self.find_supported_method(route_method)
57
- Grape::Http::Headers::SUPPORTED_METHODS.detect { |supported_method| supported_method.casecmp(route_method).zero? }
58
- end
59
- end
60
- end
61
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grape/middleware/base'
4
-
5
- module Grape
6
- module Middleware
7
- class Globals < Base
8
- def before
9
- request = Grape::Request.new(@env, build_params_with: @options[:build_params_with])
10
- @env[Grape::Env::GRAPE_REQUEST] = request
11
- @env[Grape::Env::GRAPE_REQUEST_HEADERS] = request.headers
12
- @env[Grape::Env::GRAPE_REQUEST_PARAMS] = request.params if @env[Grape::Env::RACK_INPUT]
13
- end
14
- end
15
- end
16
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Middleware
5
- # Common methods for all types of Grape middleware
6
- module Helpers
7
- def context
8
- env[Grape::Env::API_ENDPOINT]
9
- end
10
- end
11
- end
12
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'English'
4
- module Rack
5
- module Accept
6
- module Header
7
- ALLOWED_CHARACTERS = %r{^([a-z*]+)/([a-z0-9*&\^\-_#{$ERROR_INFO}.+]+)(?:;([a-z0-9=;]+))?$}.freeze
8
- class << self
9
- # Corrected version of https://github.com/mjackson/rack-accept/blob/master/lib/rack/accept/header.rb#L40-L44
10
- def parse_media_type(media_type)
11
- # see http://tools.ietf.org/html/rfc6838#section-4.2 for allowed characters in media type names
12
- m = media_type&.match(ALLOWED_CHARACTERS)
13
- m ? [m[1], m[2], m[3] || ''] : []
14
- end
15
- end
16
- end
17
-
18
- class MediaType
19
- def parse_media_type(media_type)
20
- Header.parse_media_type(media_type)
21
- end
22
- end
23
- end
24
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- class Router
5
- # this could be an OpenStruct, but doesn't work in Ruby 2.3.0, see https://bugs.ruby-lang.org/issues/12251
6
- class AttributeTranslator
7
- attr_reader :attributes
8
-
9
- ROUTE_ATTRIBUTES = %i[
10
- prefix
11
- version
12
- settings
13
- format
14
- description
15
- http_codes
16
- headers
17
- entity
18
- details
19
- requirements
20
- request_method
21
- namespace
22
- ].freeze
23
-
24
- ROUTER_ATTRIBUTES = %i[pattern index].freeze
25
-
26
- def initialize(**attributes)
27
- @attributes = attributes
28
- end
29
-
30
- (ROUTER_ATTRIBUTES + ROUTE_ATTRIBUTES).each do |attr|
31
- define_method attr do
32
- attributes[attr]
33
- end
34
- end
35
-
36
- def to_h
37
- attributes
38
- end
39
-
40
- def method_missing(method_name, *args)
41
- if setter?(method_name[-1])
42
- attributes[method_name[0..]] = *args
43
- else
44
- attributes[method_name]
45
- end
46
- end
47
-
48
- def respond_to_missing?(method_name, _include_private = false)
49
- if setter?(method_name[-1])
50
- true
51
- else
52
- @attributes.key?(method_name)
53
- end
54
- end
55
-
56
- private
57
-
58
- def setter?(method_name)
59
- method_name[-1] == '='
60
- end
61
- end
62
- end
63
- end
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # only exists to make it shorter for external use
4
- module Grape
5
- module Types
6
- InvalidValue = Class.new(Grape::Validations::Types::InvalidValue)
7
- end
8
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Util
5
- # Base for classes which need to operate with own values kept
6
- # in the hash and inherited values kept in a Hash-like object.
7
- class BaseInheritable
8
- attr_accessor :inherited_values, :new_values
9
-
10
- # @param inherited_values [Object] An object implementing an interface
11
- # of the Hash class.
12
- def initialize(inherited_values = nil)
13
- @inherited_values = inherited_values || {}
14
- @new_values = {}
15
- end
16
-
17
- def delete(key)
18
- new_values.delete key
19
- end
20
-
21
- def initialize_copy(other)
22
- super
23
- self.inherited_values = other.inherited_values
24
- self.new_values = other.new_values.dup
25
- end
26
-
27
- def keys
28
- if new_values.any?
29
- combined = inherited_values.keys
30
- combined.concat(new_values.keys)
31
- combined.uniq!
32
- combined
33
- else
34
- inherited_values.keys
35
- end
36
- end
37
-
38
- def key?(name)
39
- inherited_values.key?(name) || new_values.key?(name)
40
- end
41
- end
42
- end
43
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base_inheritable'
4
-
5
- module Grape
6
- module Util
7
- class InheritableValues < BaseInheritable
8
- def [](name)
9
- values[name]
10
- end
11
-
12
- def []=(name, value)
13
- new_values[name] = value
14
- end
15
-
16
- def merge(new_hash)
17
- values.merge!(new_hash)
18
- end
19
-
20
- def to_hash
21
- values
22
- end
23
-
24
- protected
25
-
26
- def values
27
- @inherited_values.merge(@new_values)
28
- end
29
- end
30
- end
31
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'json'
4
-
5
- module Grape
6
- if Object.const_defined? :MultiJson
7
- Json = ::MultiJson
8
- else
9
- Json = ::JSON
10
- Json::ParseError = Json::ParserError
11
- end
12
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Util
5
- class LazyBlock
6
- def initialize(&new_block)
7
- @block = new_block
8
- end
9
-
10
- def evaluate_from(configuration)
11
- @block.call(configuration)
12
- end
13
-
14
- def evaluate
15
- @block.call({})
16
- end
17
-
18
- def lazy?
19
- true
20
- end
21
-
22
- def to_s
23
- evaluate.to_s
24
- end
25
- end
26
- end
27
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Based on https://github.com/HornsAndHooves/lazy_object
4
-
5
- module Grape
6
- module Util
7
- class LazyObject < BasicObject
8
- attr_reader :callable
9
-
10
- def initialize(&callable)
11
- @callable = callable
12
- end
13
-
14
- def __target_object__
15
- @__target_object__ ||= callable.call
16
- end
17
-
18
- def ==(other)
19
- __target_object__ == other
20
- end
21
-
22
- def !=(other)
23
- __target_object__ != other
24
- end
25
-
26
- def !
27
- !__target_object__
28
- end
29
-
30
- def method_missing(method_name, *args, &block)
31
- if __target_object__.respond_to?(method_name)
32
- __target_object__.send(method_name, *args, &block)
33
- else
34
- super
35
- end
36
- end
37
-
38
- def respond_to_missing?(method_name, include_priv = false)
39
- __target_object__.respond_to?(method_name, include_priv)
40
- end
41
- end
42
- end
43
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Util
5
- class LazyValue
6
- attr_reader :access_keys
7
-
8
- def initialize(value, access_keys = [])
9
- @value = value
10
- @access_keys = access_keys
11
- end
12
-
13
- def evaluate_from(configuration)
14
- matching_lazy_value = configuration.fetch(@access_keys)
15
- matching_lazy_value.evaluate
16
- end
17
-
18
- def evaluate
19
- @value
20
- end
21
-
22
- def lazy?
23
- true
24
- end
25
-
26
- def reached_by(parent_access_keys, access_key)
27
- @access_keys = parent_access_keys + [access_key]
28
- self
29
- end
30
-
31
- def to_s
32
- evaluate.to_s
33
- end
34
- end
35
-
36
- class LazyValueEnumerable < LazyValue
37
- def [](key)
38
- if @value_hash[key].nil?
39
- LazyValue.new(nil).reached_by(access_keys, key)
40
- else
41
- @value_hash[key].reached_by(access_keys, key)
42
- end
43
- end
44
-
45
- def fetch(access_keys)
46
- fetched_keys = access_keys.dup
47
- value = self[fetched_keys.shift]
48
- fetched_keys.any? ? value.fetch(fetched_keys) : value
49
- end
50
-
51
- def []=(key, value)
52
- @value_hash[key] = case value
53
- when Hash
54
- LazyValueHash.new(value)
55
- when Array
56
- LazyValueArray.new(value)
57
- else
58
- LazyValue.new(value)
59
- end
60
- end
61
- end
62
-
63
- class LazyValueArray < LazyValueEnumerable
64
- def initialize(array)
65
- super
66
- @value_hash = []
67
- array.each_with_index do |value, index|
68
- self[index] = value
69
- end
70
- end
71
-
72
- def evaluate
73
- @value_hash.map(&:evaluate)
74
- end
75
- end
76
-
77
- class LazyValueHash < LazyValueEnumerable
78
- def initialize(hash)
79
- super
80
- @value_hash = ActiveSupport::HashWithIndifferentAccess.new
81
- hash.each do |key, value|
82
- self[key] = value
83
- end
84
- end
85
-
86
- def evaluate
87
- @value_hash.transform_values(&:evaluate)
88
- end
89
- end
90
- end
91
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Util
5
- module Registrable
6
- def default_elements
7
- @default_elements ||= {}
8
- end
9
-
10
- def register(format, element)
11
- default_elements[format] = element unless default_elements[format]
12
- end
13
- end
14
- end
15
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'stackable_values'
4
-
5
- module Grape
6
- module Util
7
- class ReverseStackableValues < StackableValues
8
- protected
9
-
10
- def concat_values(inherited_value, new_value)
11
- return inherited_value unless new_value
12
-
13
- [].tap do |value|
14
- value.concat(new_value)
15
- value.concat(inherited_value)
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,108 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Util
5
- module StrictHashConfiguration
6
- extend ActiveSupport::Concern
7
-
8
- module DSL
9
- extend ActiveSupport::Concern
10
-
11
- module ClassMethods
12
- def settings
13
- config_context.to_hash
14
- end
15
-
16
- def configure(&block)
17
- config_context.instance_exec(&block)
18
- end
19
- end
20
- end
21
-
22
- class SettingsContainer
23
- def initialize
24
- @settings = {}
25
- @contexts = {}
26
- end
27
-
28
- def to_hash
29
- @settings.to_hash
30
- end
31
- end
32
-
33
- def self.config_class(*args)
34
- new_config_class = Class.new(SettingsContainer)
35
-
36
- args.each do |setting_name|
37
- if setting_name.respond_to? :values
38
- nested_settings_methods(setting_name, new_config_class)
39
- else
40
- simple_settings_methods(setting_name, new_config_class)
41
- end
42
- end
43
-
44
- new_config_class
45
- end
46
-
47
- def self.simple_settings_methods(setting_name, new_config_class)
48
- setting_name_sym = setting_name.to_sym
49
- new_config_class.class_eval do
50
- define_method setting_name do |new_value|
51
- @settings[setting_name_sym] = new_value
52
- end
53
- end
54
- end
55
-
56
- def self.nested_settings_methods(setting_name, new_config_class)
57
- new_config_class.class_eval do
58
- setting_name.each_pair do |key, value|
59
- define_method "#{key}_context" do
60
- @contexts[key] ||= Grape::Util::StrictHashConfiguration.config_class(*value).new
61
- end
62
-
63
- define_method key do |&block|
64
- send("#{key}_context").instance_exec(&block)
65
- end
66
- end
67
-
68
- define_method :to_hash do
69
- @settings.to_hash.merge(
70
- setting_name.each_key.with_object({}) do |k, merge_hash|
71
- merge_hash[k] = send("#{k}_context").to_hash
72
- end
73
- )
74
- end
75
- end
76
- end
77
-
78
- def self.module(*args)
79
- new_module = Module.new do
80
- extend ActiveSupport::Concern
81
- include DSL
82
- end
83
-
84
- new_module.tap do |mod|
85
- class_mod = create_class_mod(args)
86
-
87
- mod.const_set(:ClassMethods, class_mod)
88
- end
89
- end
90
-
91
- def self.create_class_mod(args)
92
- new_module = Module.new do
93
- def config_context
94
- @config_context ||= config_class.new
95
- end
96
- end
97
-
98
- new_module.tap do |class_mod|
99
- new_config_class = config_class(*args)
100
-
101
- class_mod.send(:define_method, :config_class) do
102
- @config_class ||= new_config_class
103
- end
104
- end
105
- end
106
- end
107
- end
108
- end