grape 1.2.5 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (262) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +97 -0
  3. data/LICENSE +1 -1
  4. data/README.md +53 -16
  5. data/UPGRADING.md +231 -23
  6. data/grape.gemspec +10 -1
  7. data/lib/grape.rb +6 -7
  8. data/lib/grape/api.rb +4 -2
  9. data/lib/grape/api/helpers.rb +2 -0
  10. data/lib/grape/api/instance.rb +36 -33
  11. data/lib/grape/config.rb +2 -0
  12. data/lib/grape/content_types.rb +34 -0
  13. data/lib/grape/cookies.rb +2 -0
  14. data/lib/grape/dsl/api.rb +2 -0
  15. data/lib/grape/dsl/callbacks.rb +2 -0
  16. data/lib/grape/dsl/configuration.rb +2 -0
  17. data/lib/grape/dsl/desc.rb +2 -0
  18. data/lib/grape/dsl/headers.rb +2 -0
  19. data/lib/grape/dsl/helpers.rb +4 -2
  20. data/lib/grape/dsl/inside_route.rb +83 -34
  21. data/lib/grape/dsl/logger.rb +2 -0
  22. data/lib/grape/dsl/middleware.rb +2 -0
  23. data/lib/grape/dsl/parameters.rb +8 -6
  24. data/lib/grape/dsl/request_response.rb +4 -2
  25. data/lib/grape/dsl/routing.rb +9 -5
  26. data/lib/grape/dsl/settings.rb +7 -1
  27. data/lib/grape/dsl/validations.rb +20 -1
  28. data/lib/grape/eager_load.rb +3 -1
  29. data/lib/grape/endpoint.rb +21 -13
  30. data/lib/grape/error_formatter.rb +3 -1
  31. data/lib/grape/error_formatter/base.rb +2 -0
  32. data/lib/grape/error_formatter/json.rb +2 -0
  33. data/lib/grape/error_formatter/txt.rb +2 -0
  34. data/lib/grape/error_formatter/xml.rb +2 -0
  35. data/lib/grape/exceptions/base.rb +11 -13
  36. data/lib/grape/exceptions/incompatible_option_values.rb +2 -0
  37. data/lib/grape/exceptions/invalid_accept_header.rb +2 -0
  38. data/lib/grape/exceptions/invalid_formatter.rb +2 -0
  39. data/lib/grape/exceptions/invalid_message_body.rb +2 -0
  40. data/lib/grape/exceptions/invalid_response.rb +2 -0
  41. data/lib/grape/exceptions/invalid_version_header.rb +2 -0
  42. data/lib/grape/exceptions/invalid_versioner_option.rb +2 -0
  43. data/lib/grape/exceptions/invalid_with_option_for_represent.rb +2 -0
  44. data/lib/grape/exceptions/method_not_allowed.rb +2 -0
  45. data/lib/grape/exceptions/missing_group_type.rb +2 -0
  46. data/lib/grape/exceptions/missing_mime_type.rb +2 -0
  47. data/lib/grape/exceptions/missing_option.rb +2 -0
  48. data/lib/grape/exceptions/missing_vendor_option.rb +2 -0
  49. data/lib/grape/exceptions/unknown_options.rb +2 -0
  50. data/lib/grape/exceptions/unknown_parameter.rb +2 -0
  51. data/lib/grape/exceptions/unknown_validator.rb +2 -0
  52. data/lib/grape/exceptions/unsupported_group_type.rb +2 -0
  53. data/lib/grape/exceptions/validation.rb +3 -1
  54. data/lib/grape/exceptions/validation_array_errors.rb +2 -0
  55. data/lib/grape/exceptions/validation_errors.rb +13 -12
  56. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +4 -3
  57. data/lib/grape/extensions/deep_mergeable_hash.rb +2 -0
  58. data/lib/grape/extensions/deep_symbolize_hash.rb +2 -0
  59. data/lib/grape/extensions/hash.rb +2 -0
  60. data/lib/grape/extensions/hashie/mash.rb +2 -0
  61. data/lib/grape/formatter.rb +5 -3
  62. data/lib/grape/formatter/json.rb +2 -0
  63. data/lib/grape/formatter/serializable_hash.rb +2 -0
  64. data/lib/grape/formatter/txt.rb +2 -0
  65. data/lib/grape/formatter/xml.rb +2 -0
  66. data/lib/grape/http/headers.rb +50 -18
  67. data/lib/grape/middleware/auth/base.rb +2 -0
  68. data/lib/grape/middleware/auth/dsl.rb +2 -0
  69. data/lib/grape/middleware/auth/strategies.rb +2 -0
  70. data/lib/grape/middleware/auth/strategy_info.rb +2 -0
  71. data/lib/grape/middleware/base.rb +7 -7
  72. data/lib/grape/middleware/error.rb +3 -1
  73. data/lib/grape/middleware/filter.rb +2 -0
  74. data/lib/grape/middleware/formatter.rb +8 -6
  75. data/lib/grape/middleware/globals.rb +2 -0
  76. data/lib/grape/middleware/helpers.rb +2 -0
  77. data/lib/grape/middleware/stack.rb +4 -1
  78. data/lib/grape/middleware/versioner.rb +2 -0
  79. data/lib/grape/middleware/versioner/accept_version_header.rb +2 -0
  80. data/lib/grape/middleware/versioner/header.rb +6 -4
  81. data/lib/grape/middleware/versioner/param.rb +3 -1
  82. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +4 -1
  83. data/lib/grape/middleware/versioner/path.rb +3 -1
  84. data/lib/grape/namespace.rb +14 -2
  85. data/lib/grape/parser.rb +3 -1
  86. data/lib/grape/parser/json.rb +2 -0
  87. data/lib/grape/parser/xml.rb +2 -0
  88. data/lib/grape/path.rb +15 -3
  89. data/lib/grape/presenters/presenter.rb +2 -0
  90. data/lib/grape/request.rb +15 -8
  91. data/lib/grape/router.rb +30 -29
  92. data/lib/grape/router/attribute_translator.rb +39 -8
  93. data/lib/grape/router/pattern.rb +20 -16
  94. data/lib/grape/router/route.rb +12 -26
  95. data/lib/grape/{serve_file → serve_stream}/file_body.rb +3 -1
  96. data/lib/grape/{serve_file → serve_stream}/sendfile_response.rb +3 -1
  97. data/lib/grape/{serve_file/file_response.rb → serve_stream/stream_response.rb} +10 -8
  98. data/lib/grape/util/base_inheritable.rb +15 -6
  99. data/lib/grape/util/cache.rb +20 -0
  100. data/lib/grape/util/endpoint_configuration.rb +2 -0
  101. data/lib/grape/util/env.rb +19 -17
  102. data/lib/grape/util/inheritable_setting.rb +2 -0
  103. data/lib/grape/util/inheritable_values.rb +2 -0
  104. data/lib/grape/util/json.rb +2 -0
  105. data/lib/grape/util/lazy_block.rb +2 -0
  106. data/lib/grape/util/lazy_object.rb +43 -0
  107. data/lib/grape/util/lazy_value.rb +2 -0
  108. data/lib/grape/util/registrable.rb +2 -0
  109. data/lib/grape/util/reverse_stackable_values.rb +4 -0
  110. data/lib/grape/util/stackable_values.rb +10 -20
  111. data/lib/grape/util/strict_hash_configuration.rb +2 -0
  112. data/lib/grape/util/xml.rb +2 -0
  113. data/lib/grape/validations.rb +2 -0
  114. data/lib/grape/validations/attributes_iterator.rb +3 -3
  115. data/lib/grape/validations/multiple_attributes_iterator.rb +2 -0
  116. data/lib/grape/validations/params_scope.rb +27 -14
  117. data/lib/grape/validations/single_attribute_iterator.rb +13 -2
  118. data/lib/grape/validations/types.rb +12 -34
  119. data/lib/grape/validations/types/array_coercer.rb +65 -0
  120. data/lib/grape/validations/types/build_coercer.rb +47 -49
  121. data/lib/grape/validations/types/custom_type_coercer.rb +15 -49
  122. data/lib/grape/validations/types/custom_type_collection_coercer.rb +10 -25
  123. data/lib/grape/validations/types/dry_type_coercer.rb +76 -0
  124. data/lib/grape/validations/types/file.rb +22 -18
  125. data/lib/grape/validations/types/json.rb +46 -39
  126. data/lib/grape/validations/types/multiple_type_coercer.rb +14 -33
  127. data/lib/grape/validations/types/primitive_coercer.rb +67 -0
  128. data/lib/grape/validations/types/set_coercer.rb +40 -0
  129. data/lib/grape/validations/types/variant_collection_coercer.rb +5 -13
  130. data/lib/grape/validations/validator_factory.rb +2 -0
  131. data/lib/grape/validations/validators/all_or_none.rb +3 -1
  132. data/lib/grape/validations/validators/allow_blank.rb +3 -1
  133. data/lib/grape/validations/validators/as.rb +2 -0
  134. data/lib/grape/validations/validators/at_least_one_of.rb +3 -1
  135. data/lib/grape/validations/validators/base.rb +8 -5
  136. data/lib/grape/validations/validators/coerce.rb +39 -29
  137. data/lib/grape/validations/validators/default.rb +2 -1
  138. data/lib/grape/validations/validators/exactly_one_of.rb +6 -2
  139. data/lib/grape/validations/validators/except_values.rb +3 -1
  140. data/lib/grape/validations/validators/multiple_params_base.rb +2 -0
  141. data/lib/grape/validations/validators/mutual_exclusion.rb +3 -1
  142. data/lib/grape/validations/validators/presence.rb +3 -1
  143. data/lib/grape/validations/validators/regexp.rb +4 -2
  144. data/lib/grape/validations/validators/same_as.rb +6 -3
  145. data/lib/grape/validations/validators/values.rb +17 -5
  146. data/lib/grape/version.rb +3 -1
  147. data/spec/grape/api/custom_validations_spec.rb +5 -3
  148. data/spec/grape/api/deeply_included_options_spec.rb +2 -0
  149. data/spec/grape/api/defines_boolean_in_params_spec.rb +5 -3
  150. data/spec/grape/api/inherited_helpers_spec.rb +2 -0
  151. data/spec/grape/api/instance_spec.rb +104 -0
  152. data/spec/grape/api/invalid_format_spec.rb +2 -0
  153. data/spec/grape/api/namespace_parameters_in_route_spec.rb +2 -0
  154. data/spec/grape/api/nested_helpers_spec.rb +2 -0
  155. data/spec/grape/api/optional_parameters_in_route_spec.rb +2 -0
  156. data/spec/grape/api/parameters_modification_spec.rb +3 -1
  157. data/spec/grape/api/patch_method_helpers_spec.rb +2 -0
  158. data/spec/grape/api/recognize_path_spec.rb +2 -0
  159. data/spec/grape/api/required_parameters_in_route_spec.rb +2 -0
  160. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +2 -0
  161. data/spec/grape/api/routes_with_requirements_spec.rb +2 -0
  162. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +2 -0
  163. data/spec/grape/api/shared_helpers_spec.rb +2 -0
  164. data/spec/grape/api_remount_spec.rb +2 -0
  165. data/spec/grape/api_spec.rb +99 -11
  166. data/spec/grape/config_spec.rb +2 -0
  167. data/spec/grape/dsl/callbacks_spec.rb +2 -0
  168. data/spec/grape/dsl/configuration_spec.rb +2 -0
  169. data/spec/grape/dsl/desc_spec.rb +2 -0
  170. data/spec/grape/dsl/headers_spec.rb +2 -0
  171. data/spec/grape/dsl/helpers_spec.rb +4 -2
  172. data/spec/grape/dsl/inside_route_spec.rb +177 -33
  173. data/spec/grape/dsl/logger_spec.rb +2 -0
  174. data/spec/grape/dsl/middleware_spec.rb +2 -0
  175. data/spec/grape/dsl/parameters_spec.rb +2 -0
  176. data/spec/grape/dsl/request_response_spec.rb +2 -0
  177. data/spec/grape/dsl/routing_spec.rb +2 -0
  178. data/spec/grape/dsl/settings_spec.rb +2 -0
  179. data/spec/grape/dsl/validations_spec.rb +2 -0
  180. data/spec/grape/endpoint_spec.rb +21 -6
  181. data/spec/grape/entity_spec.rb +2 -0
  182. data/spec/grape/exceptions/base_spec.rb +3 -1
  183. data/spec/grape/exceptions/body_parse_errors_spec.rb +2 -0
  184. data/spec/grape/exceptions/invalid_accept_header_spec.rb +2 -0
  185. data/spec/grape/exceptions/invalid_formatter_spec.rb +2 -0
  186. data/spec/grape/exceptions/invalid_response_spec.rb +2 -0
  187. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +2 -0
  188. data/spec/grape/exceptions/missing_mime_type_spec.rb +2 -0
  189. data/spec/grape/exceptions/missing_option_spec.rb +2 -0
  190. data/spec/grape/exceptions/unknown_options_spec.rb +2 -0
  191. data/spec/grape/exceptions/unknown_validator_spec.rb +2 -0
  192. data/spec/grape/exceptions/validation_errors_spec.rb +4 -2
  193. data/spec/grape/exceptions/validation_spec.rb +3 -1
  194. data/spec/grape/extensions/param_builders/hash_spec.rb +2 -0
  195. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +2 -0
  196. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +2 -0
  197. data/spec/grape/integration/global_namespace_function_spec.rb +2 -0
  198. data/spec/grape/integration/rack_sendfile_spec.rb +14 -8
  199. data/spec/grape/integration/rack_spec.rb +3 -1
  200. data/spec/grape/loading_spec.rb +2 -0
  201. data/spec/grape/middleware/auth/base_spec.rb +2 -0
  202. data/spec/grape/middleware/auth/dsl_spec.rb +2 -0
  203. data/spec/grape/middleware/auth/strategies_spec.rb +3 -1
  204. data/spec/grape/middleware/base_spec.rb +2 -0
  205. data/spec/grape/middleware/error_spec.rb +2 -0
  206. data/spec/grape/middleware/exception_spec.rb +3 -1
  207. data/spec/grape/middleware/formatter_spec.rb +19 -12
  208. data/spec/grape/middleware/globals_spec.rb +2 -0
  209. data/spec/grape/middleware/stack_spec.rb +11 -0
  210. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +3 -1
  211. data/spec/grape/middleware/versioner/header_spec.rb +3 -1
  212. data/spec/grape/middleware/versioner/param_spec.rb +3 -1
  213. data/spec/grape/middleware/versioner/path_spec.rb +3 -1
  214. data/spec/grape/middleware/versioner_spec.rb +2 -0
  215. data/spec/grape/named_api_spec.rb +2 -0
  216. data/spec/grape/parser_spec.rb +7 -5
  217. data/spec/grape/path_spec.rb +6 -4
  218. data/spec/grape/presenters/presenter_spec.rb +2 -0
  219. data/spec/grape/request_spec.rb +2 -0
  220. data/spec/grape/util/inheritable_setting_spec.rb +2 -0
  221. data/spec/grape/util/inheritable_values_spec.rb +2 -0
  222. data/spec/grape/util/reverse_stackable_values_spec.rb +2 -0
  223. data/spec/grape/util/stackable_values_spec.rb +3 -1
  224. data/spec/grape/util/strict_hash_configuration_spec.rb +2 -0
  225. data/spec/grape/validations/attributes_iterator_spec.rb +2 -0
  226. data/spec/grape/validations/instance_behaivour_spec.rb +5 -3
  227. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +2 -0
  228. data/spec/grape/validations/params_scope_spec.rb +3 -1
  229. data/spec/grape/validations/single_attribute_iterator_spec.rb +18 -4
  230. data/spec/grape/validations/types/array_coercer_spec.rb +35 -0
  231. data/spec/grape/validations/types/primitive_coercer_spec.rb +135 -0
  232. data/spec/grape/validations/types/set_coercer_spec.rb +34 -0
  233. data/spec/grape/validations/types_spec.rb +9 -36
  234. data/spec/grape/validations/validators/all_or_none_spec.rb +2 -0
  235. data/spec/grape/validations/validators/allow_blank_spec.rb +2 -0
  236. data/spec/grape/validations/validators/at_least_one_of_spec.rb +2 -0
  237. data/spec/grape/validations/validators/coerce_spec.rb +341 -136
  238. data/spec/grape/validations/validators/default_spec.rb +123 -0
  239. data/spec/grape/validations/validators/exactly_one_of_spec.rb +14 -12
  240. data/spec/grape/validations/validators/except_values_spec.rb +3 -1
  241. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +2 -0
  242. data/spec/grape/validations/validators/presence_spec.rb +30 -0
  243. data/spec/grape/validations/validators/regexp_spec.rb +2 -0
  244. data/spec/grape/validations/validators/same_as_spec.rb +2 -0
  245. data/spec/grape/validations/validators/values_spec.rb +30 -5
  246. data/spec/grape/validations_spec.rb +91 -33
  247. data/spec/integration/eager_load/eager_load_spec.rb +15 -0
  248. data/spec/integration/multi_json/json_spec.rb +2 -0
  249. data/spec/integration/multi_xml/xml_spec.rb +2 -0
  250. data/spec/shared/versioning_examples.rb +2 -0
  251. data/spec/spec_helper.rb +18 -0
  252. data/spec/support/basic_auth_encode_helpers.rb +2 -0
  253. data/spec/support/content_type_helpers.rb +2 -0
  254. data/spec/support/eager_load.rb +19 -0
  255. data/spec/support/endpoint_faker.rb +2 -0
  256. data/spec/support/file_streamer.rb +2 -0
  257. data/spec/support/integer_helpers.rb +2 -0
  258. data/spec/support/versioned_helpers.rb +4 -2
  259. metadata +48 -28
  260. data/lib/grape/extensions/deep_hash_with_indifferent_access.rb +0 -18
  261. data/lib/grape/util/content_types.rb +0 -26
  262. data/lib/grape/validations/types/virtus_collection_patch.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8934b2070d7c44a7100315712c05ee9e76eff602290b30f475f6e2e324c5392c
4
- data.tar.gz: 0d618a852be97bf103c7f783702342b030440834fedd725b4e6a90e03a8b0556
3
+ metadata.gz: 342f290903dcc993f0e60d0d15bee151f3425abf2b68a191da459d9ac47ac943
4
+ data.tar.gz: 5b03c2c50e3b485787fd9d7ae64130b7cfe56ca9a9128d51133e46e58562d151
5
5
  SHA512:
6
- metadata.gz: f11c651eb7dea86dd45065c04cdebcbb2635cf8136536850b245d4ad94eac921a4218f191cc5f523968cdc4708ee7ede49fce17de21b97b96edcd82426c06795
7
- data.tar.gz: 8266b0bf359c1ed96b7aacd9bbecacfe6ef5f406b94d54a1a9c6dfdbf18d95967f8c853f13dfab642631e261f81893bcc5323e83c0d27a04226bdc03d7b19381
6
+ metadata.gz: c6f78f911d63d73b8cd2422b8918d53fadfd963e4b212e555f9c8fac8d1dfe801ca2e29a9e1ca236e41a82c1b75a0e503062d5a87430c1821817fae83cfd8ffd
7
+ data.tar.gz: c856baf9f14a2eebb371f69bd35f6b7a555113e92eb9e35384901df09ac86dfcea691753ef9990123e54a335a0b9dca66b97170fb27a377cf0bb3f4f6e5233ae
@@ -1,3 +1,100 @@
1
+ ### 1.4.0 (2020/07/10)
2
+
3
+ #### Features
4
+
5
+ * [#1520](https://github.com/ruby-grape/grape/pull/1520): Un-deprecate stream-like objects - [@urkle](https://github.com/urkle).
6
+ * [#2060](https://github.com/ruby-grape/grape/pull/2060): Drop support for Ruby 2.4 - [@dblock](https://github.com/dblock).
7
+ * [#2060](https://github.com/ruby-grape/grape/pull/2060): Upgraded Rubocop to 0.84.0 - [@dblock](https://github.com/dblock).
8
+ * [#2077](https://github.com/ruby-grape/grape/pull/2077): Simplify logic for defining declared params - [@dnesteryuk](https://github.com/dnesteryuk).
9
+ * [#2084](https://github.com/ruby-grape/grape/pull/2084): Fix memory leak in path normalization - [@fcheung](https://github.com/fcheung).
10
+
11
+ #### Fixes
12
+
13
+ * [#2067](https://github.com/ruby-grape/grape/pull/2067): Coerce empty string to nil for all primitive types except String - [@petekinnecom](https://github.com/petekinnecom).
14
+ * [#2064](https://github.com/ruby-grape/grape/pull/2064): Fix Ruby 2.7 deprecation warning in `Grape::Middleware::Base#initialize` - [@skarger](https://github.com/skarger).
15
+ * [#2072](https://github.com/ruby-grape/grape/pull/2072): Fix `Grape.eager_load!` and `compile!` - [@stanhu](https://github.com/stanhu).
16
+ * [#2076](https://github.com/ruby-grape/grape/pull/2076): Make route information available for hooks when the automatically generated endpoints are invoked - [@anakinj](https://github.com/anakinj).
17
+
18
+ ### 1.3.3 (2020/05/23)
19
+
20
+ #### Features
21
+
22
+ * [#2048](https://github.com/ruby-grape/grape/issues/2034): Grape Enterprise support is now available [via TideLift](https://tidelift.com/subscription/request-a-demo?utm_source=rubygems-grape&utm_medium=referral&utm_campaign=enterprise) - [@dblock](https://github.com/dblock).
23
+ * [#2039](https://github.com/ruby-grape/grape/pull/2039): Travis - update rails versions - [@ericproulx](https://github.com/ericproulx).
24
+ * [#2038](https://github.com/ruby-grape/grape/pull/2038): Travis - update ruby versions - [@ericproulx](https://github.com/ericproulx).
25
+ * [#2050](https://github.com/ruby-grape/grape/pull/2050): Refactor route public_send to AttributeTranslator - [@ericproulx](https://github.com/ericproulx).
26
+
27
+ #### Fixes
28
+
29
+ * [#2049](https://github.com/ruby-grape/grape/pull/2049): Coerce an empty string to nil in case of the bool type - [@dnesteryuk](https://github.com/dnesteryuk).
30
+ * [#2043](https://github.com/ruby-grape/grape/pull/2043): Modify declared for nested array and hash - [@kadotami](https://github.com/kadotami).
31
+ * [#2040](https://github.com/ruby-grape/grape/pull/2040): Fix a regression with Array of type nil - [@ericproulx](https://github.com/ericproulx).
32
+ * [#2054](https://github.com/ruby-grape/grape/pull/2054): Coercing of nested arrays - [@dnesteryuk](https://github.com/dnesteryuk).
33
+ * [#2050](https://github.com/ruby-grape/grape/pull/2053): Fix broken multiple mounts - [@Jack12816](https://github.com/Jack12816).
34
+
35
+ ### 1.3.2 (2020/04/12)
36
+
37
+ #### Features
38
+
39
+ * [#2020](https://github.com/ruby-grape/grape/pull/2020): Reduce array allocation - [@ericproulx](https://github.com/ericproulx).
40
+ * [#2015](https://github.com/ruby-grape/grape/pull/2014): Reduce MatchData allocation - [@ericproulx](https://github.com/ericproulx).
41
+ * [#2014](https://github.com/ruby-grape/grape/pull/2014): Reduce total allocated arrays - [@ericproulx](https://github.com/ericproulx).
42
+ * [#2011](https://github.com/ruby-grape/grape/pull/2011): Reduce total retained regexes - [@ericproulx](https://github.com/ericproulx).
43
+
44
+ #### Fixes
45
+
46
+ * [#2033](https://github.com/ruby-grape/grape/pull/2033): Ensure `Float` params are correctly coerced to `BigDecimal` - [@tlconnor](https://github.com/tlconnor).
47
+ * [#2031](https://github.com/ruby-grape/grape/pull/2031): Fix a regression with an array of a custom type - [@dnesteryuk](https://github.com/dnesteryuk).
48
+ * [#2026](https://github.com/ruby-grape/grape/pull/2026): Fix a regression in `coerce_with` when coercion returns `nil` - [@misdoro](https://github.com/misdoro).
49
+ * [#2025](https://github.com/ruby-grape/grape/pull/2025): Fix Decimal type category - [@kdoya](https://github.com/kdoya).
50
+ * [#2019](https://github.com/ruby-grape/grape/pull/2019): Avoid coercing parameter with multiple types to an empty Array - [@stanhu](https://github.com/stanhu).
51
+
52
+ ### 1.3.1 (2020/03/11)
53
+
54
+ #### Features
55
+
56
+ * [#2005](https://github.com/ruby-grape/grape/pull/2005): Content types registrable - [@ericproulx](https://github.com/ericproulx).
57
+ * [#2003](https://github.com/ruby-grape/grape/pull/2003): Upgraded Rubocop to 0.80.1 - [@ericproulx](https://github.com/ericproulx).
58
+ * [#2002](https://github.com/ruby-grape/grape/pull/2002): Objects allocation optimization (lazy_lookup) - [@ericproulx](https://github.com/ericproulx).
59
+
60
+ #### Fixes
61
+
62
+ * [#2006](https://github.com/ruby-grape/grape/pull/2006): Fix explicit rescue StandardError - [@ericproulx](https://github.com/ericproulx).
63
+ * [#2004](https://github.com/ruby-grape/grape/pull/2004): Rubocop fixes - [@ericproulx](https://github.com/ericproulx).
64
+ * [#1995](https://github.com/ruby-grape/grape/pull/1995): Fix: "undefined instance variables" and "method redefined" warnings - [@nbeyer](https://github.com/nbeyer).
65
+ * [#1994](https://github.com/ruby-grape/grape/pull/1993): Fix typos in README - [@bellmyer](https://github.com/bellmyer).
66
+ * [#1993](https://github.com/ruby-grape/grape/pull/1993): Lazy join allow header - [@ericproulx](https://github.com/ericproulx).
67
+ * [#1987](https://github.com/ruby-grape/grape/pull/1987): Re-add exactly_one_of mutually exclusive error message - [@ZeroInputCtrl](https://github.com/ZeroInputCtrl).
68
+ * [#1977](https://github.com/ruby-grape/grape/pull/1977): Skip validation for a file if it is optional and nil - [@dnesteryuk](https://github.com/dnesteryuk).
69
+ * [#1976](https://github.com/ruby-grape/grape/pull/1976): Ensure classes/modules listed for autoload really exist - [@dnesteryuk](https://github.com/dnesteryuk).
70
+ * [#1971](https://github.com/ruby-grape/grape/pull/1971): Fix BigDecimal coercion - [@FlickStuart](https://github.com/FlickStuart).
71
+ * [#1968](https://github.com/ruby-grape/grape/pull/1968): Fix args forwarding in Grape::Middleware::Stack#merge_with for ruby 2.7.0 - [@dm1try](https://github.com/dm1try).
72
+ * [#1988](https://github.com/ruby-grape/grape/pull/1988): Refactor the full_messages method and stop overriding full_message - [@hosseintoussi](https://github.com/hosseintoussi).
73
+ * [#1956](https://github.com/ruby-grape/grape/pull/1956): Comply with Rack spec, fix `undefined method [] for nil:NilClass` error when upgrading Rack - [@ioquatix](https://github.com/ioquatix).
74
+
75
+ ### 1.3.0 (2020/01/11)
76
+
77
+ #### Features
78
+
79
+ * [#1949](https://github.com/ruby-grape/grape/pull/1949): Add support for Ruby 2.7 - [@nbulaj](https://github.com/nbulaj).
80
+ * [#1948](https://github.com/ruby-grape/grape/pull/1948): Relax `dry-types` dependency version - [@nbulaj](https://github.com/nbulaj).
81
+ * [#1944](https://github.com/ruby-grape/grape/pull/1944): Reduces `attribute_translator` string allocations - [@ericproulx](https://github.com/ericproulx).
82
+ * [#1943](https://github.com/ruby-grape/grape/pull/1943): Reduces number of regex string allocations - [@ericproulx](https://github.com/ericproulx).
83
+ * [#1942](https://github.com/ruby-grape/grape/pull/1942): Optimizes retained memory methods - [@ericproulx](https://github.com/ericproulx).
84
+ * [#1941](https://github.com/ruby-grape/grape/pull/1941): Adds frozen string literal - [@ericproulx](https://github.com/ericproulx).
85
+ * [#1940](https://github.com/ruby-grape/grape/pull/1940): Gets rid of a needless step in `HashWithIndifferentAccess` - [@dnesteryuk](https://github.com/dnesteryuk).
86
+ * [#1938](https://github.com/ruby-grape/grape/pull/1938): Adds project metadata to the gemspec - [@orien](https://github.com/orien).
87
+ * [#1920](https://github.com/ruby-grape/grape/pull/1920): Replaces Virtus with dry-types - [@dnesteryuk](https://github.com/dnesteryuk).
88
+ * [#1930](https://github.com/ruby-grape/grape/pull/1930): Moves block call to separate method so it can be spied on - [@estolfo](https://github.com/estolfo).
89
+
90
+ #### Fixes
91
+
92
+ * [#1965](https://github.com/ruby-grape/grape/pull/1965): Fix typos in README - [@davidalee](https://github.com/davidalee).
93
+ * [#1963](https://github.com/ruby-grape/grape/pull/1963): The values validator must properly work with booleans - [@dnesteryuk](https://github.com/dnesteryuk).
94
+ * [#1950](https://github.com/ruby-grape/grape/pull/1950): Consider the allow_blank option in the values validator - [@dnesteryuk](https://github.com/dnesteryuk).
95
+ * [#1947](https://github.com/ruby-grape/grape/pull/1947): Careful check for empty params - [@dnesteryuk](https://github.com/dnesteryuk).
96
+ * [#1931](https://github.com/ruby-grape/grape/pull/1946): Fixes issue when using namespaces in `Grape::API::Instance` mounted directly - [@myxoh](https://github.com/myxoh).
97
+
1
98
  ### 1.2.5 (2019/12/01)
2
99
 
3
100
  #### Features
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2019 Michael Bleigh, Intridea Inc. and Contributors.
1
+ Copyright (c) 2010-2020 Michael Bleigh, Intridea Inc. and Contributors.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -12,6 +12,7 @@
12
12
  - [What is Grape?](#what-is-grape)
13
13
  - [Stable Release](#stable-release)
14
14
  - [Project Resources](#project-resources)
15
+ - [Grape for Enterprise](#grape-for-enterprise)
15
16
  - [Installation](#installation)
16
17
  - [Basic Usage](#basic-usage)
17
18
  - [Mounting](#mounting)
@@ -141,6 +142,7 @@
141
142
  - [format_response.grape](#format_responsegrape)
142
143
  - [Monitoring Products](#monitoring-products)
143
144
  - [Contributing to Grape](#contributing-to-grape)
145
+ - [Security](#security)
144
146
  - [License](#license)
145
147
  - [Copyright](#copyright)
146
148
 
@@ -154,7 +156,7 @@ content negotiation, versioning and much more.
154
156
 
155
157
  ## Stable Release
156
158
 
157
- You're reading the documentation for the stable release of Grape, **1.2.5**.
159
+ You're reading the documentation for the stable release of Grape, 1.4.0.
158
160
  Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
159
161
 
160
162
  ## Project Resources
@@ -164,8 +166,18 @@ Please read [UPGRADING](UPGRADING.md) when upgrading from a previous version.
164
166
  * Need help? Try [Grape Google Group](http://groups.google.com/group/ruby-grape) or [Gitter](https://gitter.im/ruby-grape/grape)
165
167
  * [Follow us on Twitter](https://twitter.com/grapeframework)
166
168
 
169
+ ## Grape for Enterprise
170
+
171
+ Available as part of the Tidelift Subscription.
172
+
173
+ The maintainers of Grape are working with Tidelift to deliver commercial support and maintenance. Save time, reduce risk, and improve code health, while paying the maintainers of Grape. Click [here](https://tidelift.com/subscription/request-a-demo?utm_source=rubygems-grape&utm_medium=referral&utm_campaign=enterprise) for more details.
174
+
175
+ In 2020, we plan to use the money towards gathering Grape contributors for dinner in New York City.
176
+
167
177
  ## Installation
168
178
 
179
+ Ruby 2.4 or newer is required.
180
+
169
181
  Grape is available as a gem, to install it just install the gem:
170
182
 
171
183
  gem install grape
@@ -1046,13 +1058,13 @@ params do
1046
1058
  end
1047
1059
  ```
1048
1060
 
1049
- Note that default values will be passed through to any validation options specified.
1050
- The following example will always fail if `:color` is not explicitly provided.
1051
-
1052
1061
  Default values are eagerly evaluated. Above `:non_random_number` will evaluate to the same
1053
1062
  number for each call to the endpoint of this `params` block. To have the default evaluate
1054
1063
  lazily with each request use a lambda, like `:random_number` above.
1055
1064
 
1065
+ Note that default values will be passed through to any validation options specified.
1066
+ The following example will always fail if `:color` is not explicitly provided.
1067
+
1056
1068
  ```ruby
1057
1069
  params do
1058
1070
  optional :color, type: String, default: 'blue', values: ['red', 'green']
@@ -1720,7 +1732,7 @@ params do
1720
1732
  end
1721
1733
  ```
1722
1734
 
1723
- Every validation will have it's own instance of the validator, which means that the validator can have a state.
1735
+ Every validation will have its own instance of the validator, which means that the validator can have a state.
1724
1736
 
1725
1737
  ### Validation Errors
1726
1738
 
@@ -3155,17 +3167,19 @@ end
3155
3167
 
3156
3168
  Use `body false` to return `204 No Content` without any data or content-type.
3157
3169
 
3158
- You can also set the response to a file with `file`.
3170
+ You can also set the response to a file with `sendfile`. This works with the
3171
+ [Rack::Sendfile](https://www.rubydoc.info/gems/rack/Rack/Sendfile) middleware to optimally send
3172
+ the file through your web server software.
3159
3173
 
3160
3174
  ```ruby
3161
3175
  class API < Grape::API
3162
3176
  get '/' do
3163
- file '/path/to/file'
3177
+ sendfile '/path/to/file'
3164
3178
  end
3165
3179
  end
3166
3180
  ```
3167
3181
 
3168
- If you want a file to be streamed using Rack::Chunked, use `stream`.
3182
+ To stream a file in chunks use `stream`
3169
3183
 
3170
3184
  ```ruby
3171
3185
  class API < Grape::API
@@ -3175,6 +3189,26 @@ class API < Grape::API
3175
3189
  end
3176
3190
  ```
3177
3191
 
3192
+ If you want to stream non-file data use the `stream` method and a `Stream` object.
3193
+ This is an object that responds to `each` and yields for each chunk to send to the client.
3194
+ Each chunk will be sent as it is yielded instead of waiting for all of the content to be available.
3195
+
3196
+ ```ruby
3197
+ class MyStream
3198
+ def each
3199
+ yield 'part 1'
3200
+ yield 'part 2'
3201
+ yield 'part 3'
3202
+ end
3203
+ end
3204
+
3205
+ class API < Grape::API
3206
+ get '/' do
3207
+ stream MyStream.new
3208
+ end
3209
+ end
3210
+ ```
3211
+
3178
3212
  ## Authentication
3179
3213
 
3180
3214
  ### Basic and Digest Auth
@@ -3186,14 +3220,13 @@ applies to the current namespace and any children, but not parents.
3186
3220
  ```ruby
3187
3221
  http_basic do |username, password|
3188
3222
  # verify user's password here
3189
- { 'test' => 'password1' }[username] == password
3223
+ # IMPORTANT: make sure you use a comparison method which isn't prone to a timing attack
3190
3224
  end
3191
3225
  ```
3192
3226
 
3193
3227
  ```ruby
3194
3228
  http_digest({ realm: 'Test Api', opaque: 'app secret' }) do |username|
3195
3229
  # lookup the user's password here
3196
- { 'user1' => 'password1' }[username]
3197
3230
  end
3198
3231
  ```
3199
3232
 
@@ -3226,7 +3259,7 @@ end
3226
3259
 
3227
3260
  Use [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper), [warden-oauth2](https://github.com/opperator/warden-oauth2) or [rack-oauth2](https://github.com/nov/rack-oauth2) for OAuth2 support.
3228
3261
 
3229
- You can access the controller params, headers, and helpers through the context with the `#context` method inside any auth middleware inherited from `Grape::Middlware::Auth::Base`.
3262
+ You can access the controller params, headers, and helpers through the context with the `#context` method inside any auth middleware inherited from `Grape::Middleware::Auth::Base`.
3230
3263
 
3231
3264
  ## Describing and Inspecting an API
3232
3265
 
@@ -3299,7 +3332,7 @@ end
3299
3332
 
3300
3333
  Blocks can be executed before or after every API call, using `before`, `after`,
3301
3334
  `before_validation` and `after_validation`.
3302
- If the API fails the `after` call will not be trigered, if you need code to execute for sure
3335
+ If the API fails the `after` call will not be triggered, if you need code to execute for sure
3303
3336
  use the `finally`.
3304
3337
 
3305
3338
  Before and after callbacks execute in the following order:
@@ -3540,7 +3573,7 @@ class API < Grape::API
3540
3573
  end
3541
3574
  ```
3542
3575
 
3543
- You can access the controller params, headers, and helpers through the context with the `#context` method inside any middleware inherited from `Grape::Middlware::Base`.
3576
+ You can access the controller params, headers, and helpers through the context with the `#context` method inside any middleware inherited from `Grape::Middleware::Base`.
3544
3577
 
3545
3578
  ### Rails Middleware
3546
3579
 
@@ -3850,7 +3883,7 @@ Grape integrates with following third-party tools:
3850
3883
  * **Librato Metrics** - [grape-librato](https://github.com/seanmoon/grape-librato) gem
3851
3884
  * **[Skylight](https://www.skylight.io/)** - [skylight](https://github.com/skylightio/skylight-ruby) gem, [documentation](https://docs.skylight.io/grape/)
3852
3885
  * **[AppSignal](https://www.appsignal.com)** - [appsignal-ruby](https://github.com/appsignal/appsignal-ruby) gem, [documentation](http://docs.appsignal.com/getting-started/supported-frameworks.html#grape)
3853
- * **[ElasticAPM](https://www.elastic.co/products/apm) - [elastic-apm](https://github.com/elastic/apm-agent-ruby) gem, [documentation](https://www.elastic.co/guide/en/apm/agent/ruby/3.x/getting-started-rack.html#getting-started-grape)
3886
+ * **[ElasticAPM](https://www.elastic.co/products/apm)** - [elastic-apm](https://github.com/elastic/apm-agent-ruby) gem, [documentation](https://www.elastic.co/guide/en/apm/agent/ruby/3.x/getting-started-rack.html#getting-started-grape)
3854
3887
 
3855
3888
  ## Contributing to Grape
3856
3889
 
@@ -3859,10 +3892,14 @@ features and discuss issues.
3859
3892
 
3860
3893
  See [CONTRIBUTING](CONTRIBUTING.md).
3861
3894
 
3895
+ ## Security
3896
+
3897
+ See [SECURITY](SECURITY.md) for details.
3898
+
3862
3899
  ## License
3863
3900
 
3864
- MIT License. See LICENSE for details.
3901
+ MIT License. See [LICENSE](LICENSE) for details.
3865
3902
 
3866
3903
  ## Copyright
3867
3904
 
3868
- Copyright (c) 2010-2019 Michael Bleigh, Intridea Inc. and Contributors.
3905
+ Copyright (c) 2010-2020 Michael Bleigh, Intridea Inc. and Contributors.
@@ -1,6 +1,223 @@
1
1
  Upgrading Grape
2
2
  ===============
3
3
 
4
+ ### Upgrading to >= 1.4.0
5
+
6
+ #### Reworking stream and file and un-deprecating stream like-objects
7
+
8
+ Previously in 0.16 stream-like objects were deprecated. This release restores their functionality for use-cases other than file streaming.
9
+
10
+ This release deprecated `file` in favor of `sendfile` to better document its purpose.
11
+
12
+ To deliver a file via the Sendfile support in your web server and have the Rack::Sendfile middleware enabled. See [`Rack::Sendfile`](https://www.rubydoc.info/gems/rack/Rack/Sendfile).
13
+ ```ruby
14
+ class API < Grape::API
15
+ get '/' do
16
+ sendfile '/path/to/file'
17
+ end
18
+ end
19
+ ```
20
+
21
+ Use `stream` to stream file content in chunks.
22
+
23
+ ```ruby
24
+ class API < Grape::API
25
+ get '/' do
26
+ stream '/path/to/file'
27
+ end
28
+ end
29
+ ```
30
+
31
+ Or use `stream` to stream other kinds of content. In the following example a streamer class
32
+ streams paginated data from a database.
33
+
34
+ ```ruby
35
+ class MyObject
36
+ attr_accessor :result
37
+
38
+ def initialize(query)
39
+ @result = query
40
+ end
41
+
42
+ def each
43
+ yield '['
44
+ # Do paginated DB fetches and return each page formatted
45
+ first = false
46
+ result.find_in_batches do |records|
47
+ yield process_records(records, first)
48
+ first = false
49
+ end
50
+ yield ']'
51
+ end
52
+
53
+ def process_records(records, first)
54
+ buffer = +''
55
+ buffer << ',' unless first
56
+ buffer << records.map(&:to_json).join(',')
57
+ buffer
58
+ end
59
+ end
60
+
61
+ class API < Grape::API
62
+ get '/' do
63
+ stream MyObject.new(Sprocket.all)
64
+ end
65
+ end
66
+ ```
67
+
68
+ ### Upgrading to >= 1.3.3
69
+
70
+ #### Nil values for structures
71
+
72
+ Nil values always been a special case when dealing with types especially with the following structures:
73
+
74
+ - Array
75
+ - Hash
76
+ - Set
77
+
78
+ The behavior for these structures has change through out the latest releases. For example:
79
+
80
+ ```ruby
81
+ class Api < Grape::API
82
+ params do
83
+ require :my_param, type: Array[Integer]
84
+ end
85
+
86
+ get 'example' do
87
+ params[:my_param]
88
+ end
89
+ get '/example', params: { my_param: nil }
90
+ # 1.3.1 = []
91
+ # 1.3.2 = nil
92
+ end
93
+ ```
94
+
95
+ For now on, `nil` values stay `nil` values for all types, including arrays, sets and hashes.
96
+
97
+ If you want to have the same behavior as 1.3.1, apply a `default` validator:
98
+
99
+ ```ruby
100
+ class Api < Grape::API
101
+ params do
102
+ require :my_param, type: Array[Integer], default: []
103
+ end
104
+
105
+ get 'example' do
106
+ params[:my_param]
107
+ end
108
+ get '/example', params: { my_param: nil } # => []
109
+ end
110
+ ```
111
+
112
+ #### Default validator
113
+
114
+ Default validator is now applied for `nil` values.
115
+
116
+ ```ruby
117
+ class Api < Grape::API
118
+ params do
119
+ requires :my_param, type: Integer, default: 0
120
+ end
121
+
122
+ get 'example' do
123
+ params[:my_param]
124
+ end
125
+ get '/example', params: { my_param: nil } #=> before: nil, after: 0
126
+ end
127
+ ```
128
+
129
+ ### Upgrading to >= 1.3.0
130
+
131
+ #### Ruby
132
+
133
+ After adding dry-types, Ruby 2.4 or newer is required.
134
+
135
+ #### Coercion
136
+
137
+ [Virtus](https://github.com/solnic/virtus) has been replaced by [dry-types](https://dry-rb.org/gems/dry-types/1.2/) for parameter coercion. If your project depends on Virtus outside of Grape, explicitly add it to your `Gemfile`.
138
+
139
+ Here's an example of how to migrate a custom type from Virtus to dry-types:
140
+
141
+ ```ruby
142
+ # Legacy Grape parser
143
+ class SecureUriType < Virtus::Attribute
144
+ def coerce(input)
145
+ URI.parse value
146
+ end
147
+
148
+ def value_coerced?(input)
149
+ value.is_a? String
150
+ end
151
+ end
152
+
153
+ params do
154
+ requires :secure_uri, type: SecureUri
155
+ end
156
+ ```
157
+
158
+ To use dry-types, we need to:
159
+
160
+ 1. Remove the inheritance of `Virtus::Attribute`
161
+ 1. Rename `coerce` to `self.parse`
162
+ 1. Rename `value_coerced?` to `self.parsed?`
163
+
164
+ The custom type must have a class-level `parse` method to the model. A class-level `parsed?` is needed if the parsed type differs from the defined type. In the example below, since `SecureUri` is not the same as `URI::HTTPS`, `self.parsed?` is needed:
165
+
166
+ ```ruby
167
+ # New dry-types parser
168
+ class SecureUri
169
+ def self.parse(value)
170
+ URI.parse value
171
+ end
172
+
173
+ def self.parsed?(value)
174
+ value.is_a? URI::HTTPS
175
+ end
176
+ end
177
+
178
+ params do
179
+ requires :secure_uri, type: SecureUri
180
+ end
181
+ ```
182
+
183
+ #### Coercing to `FalseClass` or `TrueClass` no longer works
184
+
185
+ Previous Grape versions allowed this, though it wasn't documented:
186
+
187
+ ```ruby
188
+ requires :true_value, type: TrueClass
189
+ requires :bool_value, types: [FalseClass, TrueClass]
190
+ ```
191
+
192
+ This is no longer supported, if you do this, your values will never be valid. Instead you should do this:
193
+
194
+ ```ruby
195
+ requires :true_value, type: Boolean # in your endpoint you should validate if this is actually `true`
196
+ requires :bool_value, type: Boolean
197
+ ```
198
+
199
+ #### Ensure that Array types have explicit coercions
200
+
201
+ Unlike Virtus, dry-types does not perform any implict coercions. If you have any uses of `Array[String]`, `Array[Integer]`, etc. be sure they use a `coerce_with` block. For example:
202
+
203
+ ```ruby
204
+ requires :values, type: Array[String]
205
+ ```
206
+
207
+ It's quite common to pass a comma-separated list, such as `tag1,tag2` as `values`. Previously Virtus would implicitly coerce this to `Array(values)` so that `["tag1,tag2"]` would pass the type checks, but with `dry-types` the values are no longer coerced for you. To fix this, you might do:
208
+
209
+ ```ruby
210
+ requires :values, type: Array[String], coerce_with: ->(val) { val.split(',').map(&:strip) }
211
+ ```
212
+
213
+ Likewise, for `Array[Integer]`, you might do:
214
+
215
+ ```ruby
216
+ requires :values, type: Array[Integer], coerce_with: ->(val) { val.split(',').map(&:strip).map(&:to_i) }
217
+ ```
218
+
219
+ For more information see [#1920](https://github.com/ruby-grape/grape/pull/1920).
220
+
4
221
  ### Upgrading to >= 1.2.4
5
222
 
6
223
  #### Headers in `error!` call
@@ -54,12 +271,9 @@ In order to make obtaining the name of a mounted class simpler, we've delegated
54
271
 
55
272
  ##### Patching the class
56
273
 
57
- In an effort to make APIs re-mountable, The class `Grape::API` no longer refers to an API instance,
58
- rather, what used to be `Grape::API` is now `Grape::API::Instance` and `Grape::API` was replaced
59
- with a class that can contain several instances of `Grape::API`.
274
+ In an effort to make APIs re-mountable, The class `Grape::API` no longer refers to an API instance, rather, what used to be `Grape::API` is now `Grape::API::Instance` and `Grape::API` was replaced with a class that can contain several instances of `Grape::API`.
60
275
 
61
- This changes were done in such a way that no code-changes should be required.
62
- However, if experiencing problems, or relying on private methods and internal behaviour too deeply, it is possible to restore the prior behaviour by replacing the references from `Grape::API` to `Grape::API::Instance`.
276
+ This changes were done in such a way that no code-changes should be required. However, if experiencing problems, or relying on private methods and internal behaviour too deeply, it is possible to restore the prior behaviour by replacing the references from `Grape::API` to `Grape::API::Instance`.
63
277
 
64
278
  Note, this is particularly relevant if you are opening the class `Grape::API` for modification.
65
279
 
@@ -82,15 +296,20 @@ end
82
296
 
83
297
  After the patch, the mounted API is no longer a Named class inheriting from `Grape::API`, it is an anonymous class
84
298
  which inherit from `Grape::API::Instance`.
299
+
85
300
  What this means in practice, is:
301
+
86
302
  - Generally: you can access the named class from the instance calling the getter `base`.
87
- - In particular: If you need the `name`, you can use `base`.`name`
303
+ - In particular: If you need the `name`, you can use `base`.`name`.
88
304
 
89
305
  **Deprecated**
306
+
90
307
  ```ruby
91
308
  payload[:endpoint].options[:for].name
92
309
  ```
310
+
93
311
  **New**
312
+
94
313
  ```ruby
95
314
  payload[:endpoint].options[:for].base.name
96
315
  ```
@@ -181,8 +400,7 @@ See [#1610](https://github.com/ruby-grape/grape/pull/1610) for more information.
181
400
 
182
401
  #### The `except`, `except_message`, and `proc` options of the `values` validator are deprecated.
183
402
 
184
- The new `except_values` validator should be used in place of the `except` and `except_message` options of
185
- the `values` validator.
403
+ The new `except_values` validator should be used in place of the `except` and `except_message` options of the `values` validator.
186
404
 
187
405
  Arity one Procs may now be used directly as the `values` option to explicitly test param values.
188
406
 
@@ -258,9 +476,7 @@ get '/example' #=> before: 405, after: 404
258
476
 
259
477
  #### Removed param processing from built-in OPTIONS handler
260
478
 
261
- When a request is made to the built-in `OPTIONS` handler, only the `before` and `after`
262
- callbacks associated with the resource will be run. The `before_validation` and
263
- `after_validation` callbacks and parameter validations will be skipped.
479
+ When a request is made to the built-in `OPTIONS` handler, only the `before` and `after` callbacks associated with the resource will be run. The `before_validation` and `after_validation` callbacks and parameter validations will be skipped.
264
480
 
265
481
  See [#1505](https://github.com/ruby-grape/grape/pull/1505) for more information.
266
482
 
@@ -281,8 +497,7 @@ See [#1510](https://github.com/ruby-grape/grape/pull/1510) for more information.
281
497
 
282
498
  #### The default status code for DELETE is now 204 instead of 200.
283
499
 
284
- Breaking change: Sets the default response status code for a delete request to 204.
285
- A status of 204 makes the response more distinguishable and therefore easier to handle on the client side, particularly because a DELETE request typically returns an empty body as the resource was deleted or voided.
500
+ Breaking change: Sets the default response status code for a delete request to 204. A status of 204 makes the response more distinguishable and therefore easier to handle on the client side, particularly because a DELETE request typically returns an empty body as the resource was deleted or voided.
286
501
 
287
502
  To achieve the old behavior, one has to set it explicitly:
288
503
  ```ruby
@@ -460,18 +675,14 @@ See [#1114](https://github.com/ruby-grape/grape/pull/1114) for more information.
460
675
 
461
676
  #### Bypasses formatters when status code indicates no content
462
677
 
463
- To be consistent with rack and it's handling of standard responses
464
- associated with no content, both default and custom formatters will now
678
+ To be consistent with rack and it's handling of standard responses associated with no content, both default and custom formatters will now
465
679
  be bypassed when processing responses for status codes defined [by rack](https://github.com/rack/rack/blob/master/lib/rack/utils.rb#L567)
466
680
 
467
681
  See [#1190](https://github.com/ruby-grape/grape/pull/1190) for more information.
468
682
 
469
683
  #### Redirects respond as plain text with message
470
684
 
471
- `#redirect` now uses `text/plain` regardless of whether that format has
472
- been enabled. This prevents formatters from attempting to serialize the
473
- message body and allows for a descriptive message body to be provided - and
474
- optionally overridden - that better fulfills the theme of the HTTP spec.
685
+ `#redirect` now uses `text/plain` regardless of whether that format has been enabled. This prevents formatters from attempting to serialize the message body and allows for a descriptive message body to be provided - and optionally overridden - that better fulfills the theme of the HTTP spec.
475
686
 
476
687
  See [#1194](https://github.com/ruby-grape/grape/pull/1194) for more information.
477
688
 
@@ -505,10 +716,7 @@ end
505
716
 
506
717
  See [#1029](https://github.com/ruby-grape/grape/pull/1029) for more information.
507
718
 
508
- There is a known issue because of this change. When Grape is used with an older
509
- than 1.2.4 version of [warden](https://github.com/hassox/warden) there may be raised
510
- the following exception having the [rack-mount](https://github.com/jm/rack-mount) gem's
511
- lines as last ones in the backtrace:
719
+ There is a known issue because of this change. When Grape is used with an older than 1.2.4 version of [warden](https://github.com/hassox/warden) there may be raised the following exception having the [rack-mount](https://github.com/jm/rack-mount) gem's lines as last ones in the backtrace:
512
720
 
513
721
  ```
514
722
  NoMethodError: undefined method `[]' for nil:NilClass