grape 1.2.5 → 1.3.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 (258) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +45 -0
  3. data/README.md +7 -6
  4. data/UPGRADING.md +43 -0
  5. data/grape.gemspec +10 -1
  6. data/lib/grape/api/helpers.rb +2 -0
  7. data/lib/grape/api/instance.rb +8 -6
  8. data/lib/grape/api.rb +4 -2
  9. data/lib/grape/config.rb +2 -0
  10. data/lib/grape/content_types.rb +34 -0
  11. data/lib/grape/cookies.rb +2 -0
  12. data/lib/grape/dsl/api.rb +2 -0
  13. data/lib/grape/dsl/callbacks.rb +2 -0
  14. data/lib/grape/dsl/configuration.rb +2 -0
  15. data/lib/grape/dsl/desc.rb +2 -0
  16. data/lib/grape/dsl/headers.rb +2 -0
  17. data/lib/grape/dsl/helpers.rb +4 -2
  18. data/lib/grape/dsl/inside_route.rb +15 -11
  19. data/lib/grape/dsl/logger.rb +2 -0
  20. data/lib/grape/dsl/middleware.rb +2 -0
  21. data/lib/grape/dsl/parameters.rb +8 -6
  22. data/lib/grape/dsl/request_response.rb +4 -2
  23. data/lib/grape/dsl/routing.rb +9 -5
  24. data/lib/grape/dsl/settings.rb +7 -1
  25. data/lib/grape/dsl/validations.rb +2 -0
  26. data/lib/grape/eager_load.rb +2 -0
  27. data/lib/grape/endpoint.rb +13 -7
  28. data/lib/grape/error_formatter/base.rb +2 -0
  29. data/lib/grape/error_formatter/json.rb +2 -0
  30. data/lib/grape/error_formatter/txt.rb +2 -0
  31. data/lib/grape/error_formatter/xml.rb +2 -0
  32. data/lib/grape/error_formatter.rb +3 -1
  33. data/lib/grape/exceptions/base.rb +11 -13
  34. data/lib/grape/exceptions/incompatible_option_values.rb +2 -0
  35. data/lib/grape/exceptions/invalid_accept_header.rb +2 -0
  36. data/lib/grape/exceptions/invalid_formatter.rb +2 -0
  37. data/lib/grape/exceptions/invalid_message_body.rb +2 -0
  38. data/lib/grape/exceptions/invalid_response.rb +2 -0
  39. data/lib/grape/exceptions/invalid_version_header.rb +2 -0
  40. data/lib/grape/exceptions/invalid_versioner_option.rb +2 -0
  41. data/lib/grape/exceptions/invalid_with_option_for_represent.rb +2 -0
  42. data/lib/grape/exceptions/method_not_allowed.rb +2 -0
  43. data/lib/grape/exceptions/missing_group_type.rb +2 -0
  44. data/lib/grape/exceptions/missing_mime_type.rb +2 -0
  45. data/lib/grape/exceptions/missing_option.rb +2 -0
  46. data/lib/grape/exceptions/missing_vendor_option.rb +2 -0
  47. data/lib/grape/exceptions/unknown_options.rb +2 -0
  48. data/lib/grape/exceptions/unknown_parameter.rb +2 -0
  49. data/lib/grape/exceptions/unknown_validator.rb +2 -0
  50. data/lib/grape/exceptions/unsupported_group_type.rb +2 -0
  51. data/lib/grape/exceptions/validation.rb +3 -1
  52. data/lib/grape/exceptions/validation_array_errors.rb +2 -0
  53. data/lib/grape/exceptions/validation_errors.rb +13 -12
  54. data/lib/grape/extensions/active_support/hash_with_indifferent_access.rb +4 -3
  55. data/lib/grape/extensions/deep_mergeable_hash.rb +2 -0
  56. data/lib/grape/extensions/deep_symbolize_hash.rb +2 -0
  57. data/lib/grape/extensions/hash.rb +2 -0
  58. data/lib/grape/extensions/hashie/mash.rb +2 -0
  59. data/lib/grape/formatter/json.rb +2 -0
  60. data/lib/grape/formatter/serializable_hash.rb +2 -0
  61. data/lib/grape/formatter/txt.rb +2 -0
  62. data/lib/grape/formatter/xml.rb +2 -0
  63. data/lib/grape/formatter.rb +5 -3
  64. data/lib/grape/http/headers.rb +49 -18
  65. data/lib/grape/middleware/auth/base.rb +2 -0
  66. data/lib/grape/middleware/auth/dsl.rb +2 -0
  67. data/lib/grape/middleware/auth/strategies.rb +2 -0
  68. data/lib/grape/middleware/auth/strategy_info.rb +2 -0
  69. data/lib/grape/middleware/base.rb +5 -5
  70. data/lib/grape/middleware/error.rb +3 -1
  71. data/lib/grape/middleware/filter.rb +2 -0
  72. data/lib/grape/middleware/formatter.rb +5 -3
  73. data/lib/grape/middleware/globals.rb +2 -0
  74. data/lib/grape/middleware/helpers.rb +2 -0
  75. data/lib/grape/middleware/stack.rb +4 -1
  76. data/lib/grape/middleware/versioner/accept_version_header.rb +2 -0
  77. data/lib/grape/middleware/versioner/header.rb +5 -3
  78. data/lib/grape/middleware/versioner/param.rb +3 -1
  79. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -0
  80. data/lib/grape/middleware/versioner/path.rb +3 -1
  81. data/lib/grape/middleware/versioner.rb +2 -0
  82. data/lib/grape/namespace.rb +14 -2
  83. data/lib/grape/parser/json.rb +2 -0
  84. data/lib/grape/parser/xml.rb +2 -0
  85. data/lib/grape/parser.rb +3 -1
  86. data/lib/grape/path.rb +13 -1
  87. data/lib/grape/presenters/presenter.rb +2 -0
  88. data/lib/grape/request.rb +15 -8
  89. data/lib/grape/router/attribute_translator.rb +18 -8
  90. data/lib/grape/router/pattern.rb +20 -16
  91. data/lib/grape/router/route.rb +9 -4
  92. data/lib/grape/router.rb +26 -12
  93. data/lib/grape/serve_file/file_body.rb +2 -0
  94. data/lib/grape/serve_file/file_response.rb +2 -0
  95. data/lib/grape/serve_file/sendfile_response.rb +2 -0
  96. data/lib/grape/util/base_inheritable.rb +6 -0
  97. data/lib/grape/util/cache.rb +20 -0
  98. data/lib/grape/util/endpoint_configuration.rb +2 -0
  99. data/lib/grape/util/env.rb +19 -17
  100. data/lib/grape/util/inheritable_setting.rb +2 -0
  101. data/lib/grape/util/inheritable_values.rb +2 -0
  102. data/lib/grape/util/json.rb +2 -0
  103. data/lib/grape/util/lazy_block.rb +2 -0
  104. data/lib/grape/util/lazy_object.rb +43 -0
  105. data/lib/grape/util/lazy_value.rb +2 -0
  106. data/lib/grape/util/registrable.rb +2 -0
  107. data/lib/grape/util/reverse_stackable_values.rb +3 -1
  108. data/lib/grape/util/stackable_values.rb +9 -21
  109. data/lib/grape/util/strict_hash_configuration.rb +2 -0
  110. data/lib/grape/util/xml.rb +2 -0
  111. data/lib/grape/validations/attributes_iterator.rb +3 -3
  112. data/lib/grape/validations/multiple_attributes_iterator.rb +2 -0
  113. data/lib/grape/validations/params_scope.rb +24 -11
  114. data/lib/grape/validations/single_attribute_iterator.rb +13 -2
  115. data/lib/grape/validations/types/array_coercer.rb +56 -0
  116. data/lib/grape/validations/types/build_coercer.rb +49 -48
  117. data/lib/grape/validations/types/custom_type_coercer.rb +15 -49
  118. data/lib/grape/validations/types/custom_type_collection_coercer.rb +10 -25
  119. data/lib/grape/validations/types/dry_type_coercer.rb +41 -0
  120. data/lib/grape/validations/types/file.rb +11 -9
  121. data/lib/grape/validations/types/json.rb +11 -8
  122. data/lib/grape/validations/types/multiple_type_coercer.rb +14 -33
  123. data/lib/grape/validations/types/primitive_coercer.rb +61 -0
  124. data/lib/grape/validations/types/set_coercer.rb +38 -0
  125. data/lib/grape/validations/types/variant_collection_coercer.rb +4 -12
  126. data/lib/grape/validations/types.rb +7 -30
  127. data/lib/grape/validations/validator_factory.rb +2 -0
  128. data/lib/grape/validations/validators/all_or_none.rb +3 -1
  129. data/lib/grape/validations/validators/allow_blank.rb +3 -1
  130. data/lib/grape/validations/validators/as.rb +2 -0
  131. data/lib/grape/validations/validators/at_least_one_of.rb +3 -1
  132. data/lib/grape/validations/validators/base.rb +8 -5
  133. data/lib/grape/validations/validators/coerce.rb +44 -27
  134. data/lib/grape/validations/validators/default.rb +2 -0
  135. data/lib/grape/validations/validators/exactly_one_of.rb +6 -2
  136. data/lib/grape/validations/validators/except_values.rb +3 -1
  137. data/lib/grape/validations/validators/multiple_params_base.rb +2 -0
  138. data/lib/grape/validations/validators/mutual_exclusion.rb +3 -1
  139. data/lib/grape/validations/validators/presence.rb +3 -1
  140. data/lib/grape/validations/validators/regexp.rb +3 -1
  141. data/lib/grape/validations/validators/same_as.rb +6 -3
  142. data/lib/grape/validations/validators/values.rb +17 -5
  143. data/lib/grape/validations.rb +2 -0
  144. data/lib/grape/version.rb +3 -1
  145. data/lib/grape.rb +4 -5
  146. data/spec/grape/api/custom_validations_spec.rb +5 -3
  147. data/spec/grape/api/deeply_included_options_spec.rb +2 -0
  148. data/spec/grape/api/defines_boolean_in_params_spec.rb +5 -3
  149. data/spec/grape/api/inherited_helpers_spec.rb +2 -0
  150. data/spec/grape/api/instance_spec.rb +54 -0
  151. data/spec/grape/api/invalid_format_spec.rb +2 -0
  152. data/spec/grape/api/namespace_parameters_in_route_spec.rb +2 -0
  153. data/spec/grape/api/nested_helpers_spec.rb +2 -0
  154. data/spec/grape/api/optional_parameters_in_route_spec.rb +2 -0
  155. data/spec/grape/api/parameters_modification_spec.rb +3 -1
  156. data/spec/grape/api/patch_method_helpers_spec.rb +2 -0
  157. data/spec/grape/api/recognize_path_spec.rb +2 -0
  158. data/spec/grape/api/required_parameters_in_route_spec.rb +2 -0
  159. data/spec/grape/api/required_parameters_with_invalid_method_spec.rb +2 -0
  160. data/spec/grape/api/routes_with_requirements_spec.rb +2 -0
  161. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +2 -0
  162. data/spec/grape/api/shared_helpers_spec.rb +2 -0
  163. data/spec/grape/api_remount_spec.rb +2 -0
  164. data/spec/grape/api_spec.rb +34 -11
  165. data/spec/grape/config_spec.rb +2 -0
  166. data/spec/grape/dsl/callbacks_spec.rb +2 -0
  167. data/spec/grape/dsl/configuration_spec.rb +2 -0
  168. data/spec/grape/dsl/desc_spec.rb +2 -0
  169. data/spec/grape/dsl/headers_spec.rb +2 -0
  170. data/spec/grape/dsl/helpers_spec.rb +4 -2
  171. data/spec/grape/dsl/inside_route_spec.rb +2 -0
  172. data/spec/grape/dsl/logger_spec.rb +2 -0
  173. data/spec/grape/dsl/middleware_spec.rb +2 -0
  174. data/spec/grape/dsl/parameters_spec.rb +2 -0
  175. data/spec/grape/dsl/request_response_spec.rb +2 -0
  176. data/spec/grape/dsl/routing_spec.rb +2 -0
  177. data/spec/grape/dsl/settings_spec.rb +2 -0
  178. data/spec/grape/dsl/validations_spec.rb +2 -0
  179. data/spec/grape/endpoint_spec.rb +3 -1
  180. data/spec/grape/entity_spec.rb +2 -0
  181. data/spec/grape/exceptions/base_spec.rb +3 -1
  182. data/spec/grape/exceptions/body_parse_errors_spec.rb +2 -0
  183. data/spec/grape/exceptions/invalid_accept_header_spec.rb +2 -0
  184. data/spec/grape/exceptions/invalid_formatter_spec.rb +2 -0
  185. data/spec/grape/exceptions/invalid_response_spec.rb +2 -0
  186. data/spec/grape/exceptions/invalid_versioner_option_spec.rb +2 -0
  187. data/spec/grape/exceptions/missing_mime_type_spec.rb +2 -0
  188. data/spec/grape/exceptions/missing_option_spec.rb +2 -0
  189. data/spec/grape/exceptions/unknown_options_spec.rb +2 -0
  190. data/spec/grape/exceptions/unknown_validator_spec.rb +2 -0
  191. data/spec/grape/exceptions/validation_errors_spec.rb +4 -2
  192. data/spec/grape/exceptions/validation_spec.rb +3 -1
  193. data/spec/grape/extensions/param_builders/hash_spec.rb +2 -0
  194. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +2 -0
  195. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +2 -0
  196. data/spec/grape/integration/global_namespace_function_spec.rb +2 -0
  197. data/spec/grape/integration/rack_sendfile_spec.rb +2 -0
  198. data/spec/grape/integration/rack_spec.rb +3 -1
  199. data/spec/grape/loading_spec.rb +2 -0
  200. data/spec/grape/middleware/auth/base_spec.rb +2 -0
  201. data/spec/grape/middleware/auth/dsl_spec.rb +2 -0
  202. data/spec/grape/middleware/auth/strategies_spec.rb +2 -0
  203. data/spec/grape/middleware/base_spec.rb +2 -0
  204. data/spec/grape/middleware/error_spec.rb +2 -0
  205. data/spec/grape/middleware/exception_spec.rb +3 -1
  206. data/spec/grape/middleware/formatter_spec.rb +19 -12
  207. data/spec/grape/middleware/globals_spec.rb +2 -0
  208. data/spec/grape/middleware/stack_spec.rb +11 -0
  209. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +3 -1
  210. data/spec/grape/middleware/versioner/header_spec.rb +3 -1
  211. data/spec/grape/middleware/versioner/param_spec.rb +3 -1
  212. data/spec/grape/middleware/versioner/path_spec.rb +3 -1
  213. data/spec/grape/middleware/versioner_spec.rb +2 -0
  214. data/spec/grape/named_api_spec.rb +2 -0
  215. data/spec/grape/parser_spec.rb +7 -5
  216. data/spec/grape/path_spec.rb +2 -0
  217. data/spec/grape/presenters/presenter_spec.rb +2 -0
  218. data/spec/grape/request_spec.rb +2 -0
  219. data/spec/grape/util/inheritable_setting_spec.rb +2 -0
  220. data/spec/grape/util/inheritable_values_spec.rb +2 -0
  221. data/spec/grape/util/reverse_stackable_values_spec.rb +2 -0
  222. data/spec/grape/util/stackable_values_spec.rb +3 -1
  223. data/spec/grape/util/strict_hash_configuration_spec.rb +2 -0
  224. data/spec/grape/validations/attributes_iterator_spec.rb +2 -0
  225. data/spec/grape/validations/instance_behaivour_spec.rb +5 -3
  226. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +2 -0
  227. data/spec/grape/validations/params_scope_spec.rb +3 -1
  228. data/spec/grape/validations/single_attribute_iterator_spec.rb +18 -4
  229. data/spec/grape/validations/types/primitive_coercer_spec.rb +75 -0
  230. data/spec/grape/validations/types_spec.rb +8 -35
  231. data/spec/grape/validations/validators/all_or_none_spec.rb +2 -0
  232. data/spec/grape/validations/validators/allow_blank_spec.rb +2 -0
  233. data/spec/grape/validations/validators/at_least_one_of_spec.rb +2 -0
  234. data/spec/grape/validations/validators/coerce_spec.rb +51 -110
  235. data/spec/grape/validations/validators/default_spec.rb +2 -0
  236. data/spec/grape/validations/validators/exactly_one_of_spec.rb +14 -12
  237. data/spec/grape/validations/validators/except_values_spec.rb +3 -1
  238. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +2 -0
  239. data/spec/grape/validations/validators/presence_spec.rb +30 -0
  240. data/spec/grape/validations/validators/regexp_spec.rb +2 -0
  241. data/spec/grape/validations/validators/same_as_spec.rb +2 -0
  242. data/spec/grape/validations/validators/values_spec.rb +29 -4
  243. data/spec/grape/validations_spec.rb +69 -15
  244. data/spec/integration/multi_json/json_spec.rb +2 -0
  245. data/spec/integration/multi_xml/xml_spec.rb +2 -0
  246. data/spec/shared/versioning_examples.rb +2 -0
  247. data/spec/spec_helper.rb +18 -0
  248. data/spec/support/basic_auth_encode_helpers.rb +2 -0
  249. data/spec/support/content_type_helpers.rb +2 -0
  250. data/spec/support/eager_load.rb +19 -0
  251. data/spec/support/endpoint_faker.rb +2 -0
  252. data/spec/support/file_streamer.rb +2 -0
  253. data/spec/support/integer_helpers.rb +2 -0
  254. data/spec/support/versioned_helpers.rb +4 -2
  255. metadata +126 -112
  256. data/lib/grape/extensions/deep_hash_with_indifferent_access.rb +0 -18
  257. data/lib/grape/util/content_types.rb +0 -26
  258. data/lib/grape/validations/types/virtus_collection_patch.rb +0 -16
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  # An Endpoint is the proxy scope in which all routing
3
5
  # blocks are executed. In other words, any methods
@@ -154,8 +156,8 @@ module Grape
154
156
  methods << Grape::Http::Headers::HEAD
155
157
  end
156
158
  methods.each do |method|
157
- unless route.request_method.to_s.upcase == method
158
- route = Grape::Router::Route.new(method, route.origin, route.attributes.to_h)
159
+ unless route.request_method == method
160
+ route = Grape::Router::Route.new(method, route.origin, **route.attributes.to_h)
159
161
  end
160
162
  router.append(route.apply(self))
161
163
  end
@@ -167,8 +169,8 @@ module Grape
167
169
  route_options = prepare_default_route_attributes
168
170
  map_routes do |method, path|
169
171
  path = prepare_path(path)
170
- params = merge_route_options(route_options.merge(suffix: path.suffix))
171
- route = Router::Route.new(method, path.path, params)
172
+ params = merge_route_options(**route_options.merge(suffix: path.suffix))
173
+ route = Router::Route.new(method, path.path, **params)
172
174
  route.apply(self)
173
175
  end.flatten
174
176
  end
@@ -260,7 +262,7 @@ module Grape
260
262
  run_validators validations, request
261
263
  remove_renamed_params
262
264
  run_filters after_validations, :after_validation
263
- response_object = @block ? @block.call(self) : nil
265
+ response_object = execute
264
266
  end
265
267
 
266
268
  run_filters afters, :after
@@ -333,6 +335,10 @@ module Grape
333
335
 
334
336
  private :build_stack, :build_helpers, :remove_renamed_params
335
337
 
338
+ def execute
339
+ @block ? @block.call(self) : nil
340
+ end
341
+
336
342
  def helpers
337
343
  lazy_initialize! && @helpers
338
344
  end
@@ -353,7 +359,7 @@ module Grape
353
359
  def run_validators(validator_factories, request)
354
360
  validation_errors = []
355
361
 
356
- validators = validator_factories.map { |options| Grape::Validations::ValidatorFactory.create_validator(options) }
362
+ validators = validator_factories.map { |options| Grape::Validations::ValidatorFactory.create_validator(**options) }
357
363
 
358
364
  ActiveSupport::Notifications.instrument('endpoint_run_validators.grape', endpoint: self, validators: validators, request: request) do
359
365
  validators.each do |validator|
@@ -369,7 +375,7 @@ module Grape
369
375
  end
370
376
  end
371
377
 
372
- validation_errors.any? && raise(Grape::Exceptions::ValidationErrors, errors: validation_errors, headers: header)
378
+ validation_errors.any? && raise(Grape::Exceptions::ValidationErrors.new(errors: validation_errors, headers: header))
373
379
  end
374
380
 
375
381
  def run_filters(filters, type = :other)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module ErrorFormatter
3
5
  module Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module ErrorFormatter
3
5
  module Json
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module ErrorFormatter
3
5
  module Txt
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module ErrorFormatter
3
5
  module Xml
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module ErrorFormatter
3
5
  extend Util::Registrable
@@ -13,7 +15,7 @@ module Grape
13
15
  }
14
16
  end
15
17
 
16
- def formatters(options)
18
+ def formatters(**options)
17
19
  builtin_formatters.merge(default_elements).merge!(options[:error_formatters] || {})
18
20
  end
19
21
 
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class Base < StandardError
4
- BASE_MESSAGES_KEY = 'grape.errors.messages'.freeze
5
- BASE_ATTRIBUTES_KEY = 'grape.errors.attributes'.freeze
6
+ BASE_MESSAGES_KEY = 'grape.errors.messages'
7
+ BASE_ATTRIBUTES_KEY = 'grape.errors.attributes'
6
8
  FALLBACK_LOCALE = :en
7
9
 
8
10
  attr_reader :status, :message, :headers
@@ -28,7 +30,7 @@ module Grape
28
30
  @problem = problem(key, **attributes)
29
31
  @summary = summary(key, **attributes)
30
32
  @resolution = resolution(key, **attributes)
31
- [['Problem', @problem], ['Summary', @summary], ['Resolution', @resolution]].reduce('') do |message, detail_array|
33
+ [['Problem', @problem], ['Summary', @summary], ['Resolution', @resolution]].each_with_object(+'') do |detail_array, message|
32
34
  message << "\n#{detail_array[0]}:\n #{detail_array[1]}" unless detail_array[1].blank?
33
35
  message
34
36
  end
@@ -37,16 +39,16 @@ module Grape
37
39
  end
38
40
  end
39
41
 
40
- def problem(key, attributes)
41
- translate_message("#{key}.problem".to_sym, attributes)
42
+ def problem(key, **attributes)
43
+ translate_message("#{key}.problem".to_sym, **attributes)
42
44
  end
43
45
 
44
- def summary(key, attributes)
45
- translate_message("#{key}.summary".to_sym, attributes)
46
+ def summary(key, **attributes)
47
+ translate_message("#{key}.summary".to_sym, **attributes)
46
48
  end
47
49
 
48
- def resolution(key, attributes)
49
- translate_message("#{key}.resolution".to_sym, attributes)
50
+ def resolution(key, **attributes)
51
+ translate_message("#{key}.resolution".to_sym, **attributes)
50
52
  end
51
53
 
52
54
  def translate_attributes(keys, **options)
@@ -55,10 +57,6 @@ module Grape
55
57
  end.join(', ')
56
58
  end
57
59
 
58
- def translate_attribute(key, **options)
59
- translate("#{BASE_ATTRIBUTES_KEY}.#{key}", default: key, **options)
60
- end
61
-
62
60
  def translate_message(key, **options)
63
61
  case key
64
62
  when Symbol
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class IncompatibleOptionValues < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class InvalidAcceptHeader < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class InvalidFormatter < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class InvalidMessageBody < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class InvalidResponse < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class InvalidVersionHeader < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class InvalidVersionerOption < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class InvalidWithOptionForRepresent < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class MethodNotAllowed < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class MissingGroupTypeError < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class MissingMimeType < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class MissingOption < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class MissingVendorOption < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class UnknownOptions < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class UnknownParameter < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class UnknownValidator < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class UnsupportedGroupTypeError < Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'grape/exceptions/base'
2
4
 
3
5
  module Grape
@@ -12,7 +14,7 @@ module Grape
12
14
  @message_key = message if message.is_a?(Symbol)
13
15
  args[:message] = translate_message(message)
14
16
  end
15
- super(args)
17
+ super(**args)
16
18
  end
17
19
 
18
20
  # remove all the unnecessary stuff from Grape::Exceptions::Base like status
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Exceptions
3
5
  class ValidationArrayErrors < Base
@@ -1,8 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'grape/exceptions/base'
2
4
 
3
5
  module Grape
4
6
  module Exceptions
5
7
  class ValidationErrors < Grape::Exceptions::Base
8
+ ERRORS_FORMAT_KEY = 'grape.errors.format'
9
+ DEFAULT_ERRORS_FORMAT = '%{attributes} %{message}'
10
+
6
11
  include Enumerable
7
12
 
8
13
  attr_reader :errors
@@ -39,21 +44,17 @@ module Grape
39
44
  end
40
45
 
41
46
  def full_messages
42
- messages = map { |attributes, error| full_message(attributes, error) }
47
+ messages = map do |attributes, error|
48
+ I18n.t(
49
+ ERRORS_FORMAT_KEY,
50
+ default: DEFAULT_ERRORS_FORMAT,
51
+ attributes: translate_attributes(attributes),
52
+ message: error.message
53
+ )
54
+ end
43
55
  messages.uniq!
44
56
  messages
45
57
  end
46
-
47
- private
48
-
49
- def full_message(attributes, error)
50
- I18n.t(
51
- 'grape.errors.format',
52
- default: '%{attributes} %{message}',
53
- attributes: attributes.count == 1 ? translate_attribute(attributes.first) : translate_attributes(attributes),
54
- message: error.message
55
- )
56
- end
57
58
  end
58
59
  end
59
60
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Extensions
3
5
  module ActiveSupport
@@ -14,10 +16,9 @@ module Grape
14
16
  end
15
17
 
16
18
  def build_params
17
- params = ::ActiveSupport::HashWithIndifferentAccess[rack_params]
19
+ params = ::ActiveSupport::HashWithIndifferentAccess.new(rack_params)
18
20
  params.deep_merge!(grape_routing_args) if env[Grape::Env::GRAPE_ROUTING_ARGS]
19
- # TODO: remove, in Rails 4 or later ::ActiveSupport::HashWithIndifferentAccess converts nested Hashes into indifferent access ones
20
- DeepHashWithIndifferentAccess.deep_hash_with_indifferent_access(params)
21
+ params
21
22
  end
22
23
  end
23
24
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Extensions
3
5
  class DeepMergeableHash < ::Hash
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Extensions
3
5
  module DeepSymbolizeHash
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Extensions
3
5
  module Hash
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Extensions
3
5
  module Hashie
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Formatter
3
5
  module Json
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Formatter
3
5
  module SerializableHash
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Formatter
3
5
  module Txt
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Formatter
3
5
  module Xml
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Formatter
3
5
  extend Util::Registrable
4
6
 
5
7
  class << self
6
- def builtin_formmaters
8
+ def builtin_formatters
7
9
  @builtin_formatters ||= {
8
10
  json: Grape::Formatter::Json,
9
11
  jsonapi: Grape::Formatter::Json,
@@ -13,8 +15,8 @@ module Grape
13
15
  }
14
16
  end
15
17
 
16
- def formatters(options)
17
- builtin_formmaters.merge(default_elements).merge!(options[:formatters] || {})
18
+ def formatters(**options)
19
+ builtin_formatters.merge(default_elements).merge!(options[:formatters] || {})
18
20
  end
19
21
 
20
22
  def formatter_for(api_format, **options)
@@ -1,29 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'grape/util/lazy_object'
4
+
1
5
  module Grape
2
6
  module Http
3
7
  module Headers
4
8
  # https://github.com/rack/rack/blob/master/lib/rack.rb
5
- HTTP_VERSION = 'HTTP_VERSION'.freeze
6
- PATH_INFO = 'PATH_INFO'.freeze
7
- REQUEST_METHOD = 'REQUEST_METHOD'.freeze
8
- QUERY_STRING = 'QUERY_STRING'.freeze
9
- CONTENT_TYPE = 'Content-Type'.freeze
10
-
11
- GET = 'GET'.freeze
12
- POST = 'POST'.freeze
13
- PUT = 'PUT'.freeze
14
- PATCH = 'PATCH'.freeze
15
- DELETE = 'DELETE'.freeze
16
- HEAD = 'HEAD'.freeze
17
- OPTIONS = 'OPTIONS'.freeze
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'
18
22
 
19
23
  SUPPORTED_METHODS = [GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS].freeze
20
24
 
21
- HTTP_ACCEPT_VERSION = 'HTTP_ACCEPT_VERSION'.freeze
22
- X_CASCADE = 'X-Cascade'.freeze
23
- HTTP_TRANSFER_ENCODING = 'HTTP_TRANSFER_ENCODING'.freeze
24
- HTTP_ACCEPT = 'HTTP_ACCEPT'.freeze
25
+ HTTP_ACCEPT_VERSION = 'HTTP_ACCEPT_VERSION'
26
+ X_CASCADE = 'X-Cascade'
27
+ HTTP_TRANSFER_ENCODING = 'HTTP_TRANSFER_ENCODING'
28
+ HTTP_ACCEPT = 'HTTP_ACCEPT'
29
+
30
+ FORMAT = 'format'
31
+
32
+ HTTP_HEADERS = Grape::Util::LazyObject.new do
33
+ common_http_headers = %w[
34
+ Version
35
+ Host
36
+ Connection
37
+ Cache-Control
38
+ Dnt
39
+ Upgrade-Insecure-Requests
40
+ User-Agent
41
+ Sec-Fetch-Dest
42
+ Accept
43
+ Sec-Fetch-Site
44
+ Sec-Fetch-Mode
45
+ Sec-Fetch-User
46
+ Accept-Encoding
47
+ Accept-Language
48
+ Cookie
49
+ ].freeze
50
+ common_http_headers.each_with_object({}) do |header, response|
51
+ response["HTTP_#{header.upcase.tr('-', '_')}"] = header
52
+ end.freeze
53
+ end
25
54
 
26
- FORMAT = 'format'.freeze
55
+ def self.find_supported_method(route_method)
56
+ Grape::Http::Headers::SUPPORTED_METHODS.detect { |supported_method| supported_method.casecmp(route_method).zero? }
57
+ end
27
58
  end
28
59
  end
29
60
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rack/auth/basic'
2
4
 
3
5
  module Grape
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rack/auth/basic'
2
4
  require 'active_support/concern'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Middleware
3
5
  module Auth
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Middleware
3
5
  module Auth
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'grape/dsl/headers'
2
4
 
3
5
  module Grape
@@ -6,7 +8,7 @@ module Grape
6
8
  include Helpers
7
9
 
8
10
  attr_reader :app, :env, :options
9
- TEXT_HTML = 'text/html'.freeze
11
+ TEXT_HTML = 'text/html'
10
12
 
11
13
  include Grape::DSL::Headers
12
14
 
@@ -23,7 +25,7 @@ module Grape
23
25
  end
24
26
 
25
27
  def call(env)
26
- dup.call!(env)
28
+ dup.call!(env).to_a
27
29
  end
28
30
 
29
31
  def call!(env)
@@ -72,11 +74,9 @@ module Grape
72
74
  end
73
75
 
74
76
  def mime_types
75
- types_without_params = {}
76
- content_types.each_pair do |k, v|
77
+ @mime_type ||= content_types.each_pair.with_object({}) do |(k, v), types_without_params|
77
78
  types_without_params[v.split(';').first] = k
78
79
  end
79
- types_without_params
80
80
  end
81
81
 
82
82
  private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'grape/middleware/base'
2
4
  require 'active_support/core_ext/string/output_safety'
3
5
 
@@ -77,7 +79,7 @@ module Grape
77
79
 
78
80
  def format_message(message, backtrace, original_exception = nil)
79
81
  format = env[Grape::Env::API_FORMAT] || options[:format]
80
- formatter = Grape::ErrorFormatter.formatter_for(format, options)
82
+ formatter = Grape::ErrorFormatter.formatter_for(format, **options)
81
83
  throw :error,
82
84
  status: 406,
83
85
  message: "The requested format '#{format}' is not supported.",
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Grape
2
4
  module Middleware
3
5
  # This is a simple middleware for adding before and after filters
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'grape/middleware/base'
2
4
 
3
5
  module Grape
4
6
  module Middleware
5
7
  class Formatter < Base
6
- CHUNKED = 'chunked'.freeze
8
+ CHUNKED = 'chunked'
7
9
 
8
10
  def default_options
9
11
  {
@@ -52,7 +54,7 @@ module Grape
52
54
 
53
55
  def fetch_formatter(headers, options)
54
56
  api_format = mime_types[headers[Grape::Http::Headers::CONTENT_TYPE]] || env[Grape::Env::API_FORMAT]
55
- Grape::Formatter.formatter_for(api_format, options)
57
+ Grape::Formatter.formatter_for(api_format, **options)
56
58
  end
57
59
 
58
60
  # Set the content type header for the API format if it is not already present.
@@ -97,7 +99,7 @@ module Grape
97
99
  unless content_type_for(fmt)
98
100
  throw :error, status: 415, message: "The provided content-type '#{request.media_type}' is not supported."
99
101
  end
100
- parser = Grape::Parser.parser_for fmt, options
102
+ parser = Grape::Parser.parser_for fmt, **options
101
103
  if parser
102
104
  begin
103
105
  body = (env[Grape::Env::API_REQUEST_BODY] = parser.call(body, env))
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'grape/middleware/base'
2
4
 
3
5
  module Grape