grape 1.5.1 → 1.6.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 (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -3
  3. data/CONTRIBUTING.md +1 -0
  4. data/README.md +50 -8
  5. data/UPGRADING.md +69 -0
  6. data/grape.gemspec +5 -5
  7. data/lib/grape/api/instance.rb +13 -17
  8. data/lib/grape/api.rb +19 -14
  9. data/lib/grape/cookies.rb +2 -0
  10. data/lib/grape/dry_types.rb +12 -0
  11. data/lib/grape/dsl/callbacks.rb +1 -1
  12. data/lib/grape/dsl/desc.rb +3 -5
  13. data/lib/grape/dsl/headers.rb +5 -2
  14. data/lib/grape/dsl/helpers.rb +7 -5
  15. data/lib/grape/dsl/inside_route.rb +18 -9
  16. data/lib/grape/dsl/middleware.rb +4 -4
  17. data/lib/grape/dsl/parameters.rb +4 -4
  18. data/lib/grape/dsl/request_response.rb +9 -6
  19. data/lib/grape/dsl/routing.rb +7 -6
  20. data/lib/grape/dsl/settings.rb +5 -5
  21. data/lib/grape/endpoint.rb +21 -36
  22. data/lib/grape/error_formatter/json.rb +2 -6
  23. data/lib/grape/error_formatter/xml.rb +2 -6
  24. data/lib/grape/exceptions/empty_message_body.rb +11 -0
  25. data/lib/grape/exceptions/validation.rb +2 -3
  26. data/lib/grape/exceptions/validation_errors.rb +1 -1
  27. data/lib/grape/formatter/json.rb +1 -0
  28. data/lib/grape/formatter/serializable_hash.rb +2 -1
  29. data/lib/grape/formatter/xml.rb +1 -0
  30. data/lib/grape/locale/en.yml +1 -1
  31. data/lib/grape/middleware/auth/base.rb +3 -3
  32. data/lib/grape/middleware/auth/dsl.rb +7 -1
  33. data/lib/grape/middleware/base.rb +5 -3
  34. data/lib/grape/middleware/error.rb +1 -1
  35. data/lib/grape/middleware/formatter.rb +4 -4
  36. data/lib/grape/middleware/stack.rb +14 -20
  37. data/lib/grape/middleware/versioner/accept_version_header.rb +3 -5
  38. data/lib/grape/middleware/versioner/header.rb +6 -4
  39. data/lib/grape/middleware/versioner/param.rb +1 -0
  40. data/lib/grape/middleware/versioner/parse_media_type_patch.rb +2 -1
  41. data/lib/grape/middleware/versioner/path.rb +2 -0
  42. data/lib/grape/parser/json.rb +1 -1
  43. data/lib/grape/parser/xml.rb +1 -1
  44. data/lib/grape/path.rb +1 -0
  45. data/lib/grape/request.rb +3 -0
  46. data/lib/grape/router/pattern.rb +1 -1
  47. data/lib/grape/router/route.rb +2 -2
  48. data/lib/grape/router.rb +6 -0
  49. data/lib/grape/util/inheritable_setting.rb +1 -3
  50. data/lib/grape/util/json.rb +2 -0
  51. data/lib/grape/util/lazy_value.rb +3 -2
  52. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  53. data/lib/grape/validations/params_scope.rb +89 -56
  54. data/lib/grape/validations/types/array_coercer.rb +0 -2
  55. data/lib/grape/validations/types/custom_type_coercer.rb +3 -2
  56. data/lib/grape/validations/types/dry_type_coercer.rb +2 -11
  57. data/lib/grape/validations/types/invalid_value.rb +24 -0
  58. data/lib/grape/validations/types/json.rb +2 -3
  59. data/lib/grape/validations/types/primitive_coercer.rb +5 -7
  60. data/lib/grape/validations/types/set_coercer.rb +0 -3
  61. data/lib/grape/validations/types.rb +83 -12
  62. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  63. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  64. data/lib/grape/validations/validators/as_validator.rb +14 -0
  65. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  66. data/lib/grape/validations/validators/base.rb +75 -69
  67. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  68. data/lib/grape/validations/validators/default_validator.rb +51 -0
  69. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  70. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  71. data/lib/grape/validations/validators/multiple_params_base.rb +24 -20
  72. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  73. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  74. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  75. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  76. data/lib/grape/validations/validators/values_validator.rb +88 -0
  77. data/lib/grape/version.rb +1 -1
  78. data/lib/grape.rb +61 -24
  79. data/spec/grape/api/custom_validations_spec.rb +77 -45
  80. data/spec/grape/api/deeply_included_options_spec.rb +3 -3
  81. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
  82. data/spec/grape/api/invalid_format_spec.rb +2 -0
  83. data/spec/grape/api/recognize_path_spec.rb +1 -1
  84. data/spec/grape/api/routes_with_requirements_spec.rb +8 -8
  85. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
  86. data/spec/grape/api_remount_spec.rb +25 -19
  87. data/spec/grape/api_spec.rb +510 -220
  88. data/spec/grape/dsl/callbacks_spec.rb +2 -1
  89. data/spec/grape/dsl/headers_spec.rb +39 -9
  90. data/spec/grape/dsl/helpers_spec.rb +3 -2
  91. data/spec/grape/dsl/inside_route_spec.rb +6 -4
  92. data/spec/grape/dsl/logger_spec.rb +16 -18
  93. data/spec/grape/dsl/middleware_spec.rb +2 -1
  94. data/spec/grape/dsl/parameters_spec.rb +2 -0
  95. data/spec/grape/dsl/request_response_spec.rb +1 -0
  96. data/spec/grape/dsl/routing_spec.rb +10 -7
  97. data/spec/grape/endpoint/declared_spec.rb +259 -12
  98. data/spec/grape/endpoint_spec.rb +77 -55
  99. data/spec/grape/entity_spec.rb +23 -23
  100. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
  101. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
  102. data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
  103. data/spec/grape/exceptions/validation_spec.rb +5 -3
  104. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
  105. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
  106. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
  107. data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
  108. data/spec/grape/loading_spec.rb +8 -8
  109. data/spec/grape/middleware/auth/dsl_spec.rb +15 -6
  110. data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
  111. data/spec/grape/middleware/base_spec.rb +24 -15
  112. data/spec/grape/middleware/error_spec.rb +2 -2
  113. data/spec/grape/middleware/exception_spec.rb +111 -161
  114. data/spec/grape/middleware/formatter_spec.rb +27 -6
  115. data/spec/grape/middleware/globals_spec.rb +7 -4
  116. data/spec/grape/middleware/stack_spec.rb +15 -14
  117. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
  118. data/spec/grape/middleware/versioner/header_spec.rb +14 -13
  119. data/spec/grape/middleware/versioner/param_spec.rb +7 -1
  120. data/spec/grape/middleware/versioner/path_spec.rb +5 -1
  121. data/spec/grape/middleware/versioner_spec.rb +1 -1
  122. data/spec/grape/parser_spec.rb +4 -0
  123. data/spec/grape/path_spec.rb +52 -52
  124. data/spec/grape/presenters/presenter_spec.rb +7 -6
  125. data/spec/grape/request_spec.rb +6 -4
  126. data/spec/grape/util/inheritable_setting_spec.rb +7 -7
  127. data/spec/grape/util/inheritable_values_spec.rb +3 -2
  128. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
  129. data/spec/grape/util/stackable_values_spec.rb +7 -5
  130. data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
  131. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
  132. data/spec/grape/validations/params_scope_spec.rb +46 -10
  133. data/spec/grape/validations/single_attribute_iterator_spec.rb +2 -1
  134. data/spec/grape/validations/types/primitive_coercer_spec.rb +4 -4
  135. data/spec/grape/validations/types_spec.rb +8 -8
  136. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
  137. data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
  138. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
  139. data/spec/grape/validations/validators/coerce_spec.rb +139 -34
  140. data/spec/grape/validations/validators/default_spec.rb +72 -78
  141. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
  142. data/spec/grape/validations/validators/except_values_spec.rb +3 -3
  143. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
  144. data/spec/grape/validations/validators/presence_spec.rb +16 -1
  145. data/spec/grape/validations/validators/regexp_spec.rb +25 -31
  146. data/spec/grape/validations/validators/same_as_spec.rb +14 -20
  147. data/spec/grape/validations/validators/values_spec.rb +183 -178
  148. data/spec/grape/validations_spec.rb +99 -58
  149. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  150. data/spec/integration/multi_json/json_spec.rb +1 -1
  151. data/spec/integration/multi_xml/xml_spec.rb +1 -1
  152. data/spec/shared/versioning_examples.rb +32 -29
  153. data/spec/spec_helper.rb +12 -2
  154. data/spec/support/basic_auth_encode_helpers.rb +1 -1
  155. data/spec/support/versioned_helpers.rb +1 -1
  156. metadata +117 -115
  157. data/lib/grape/validations/types/build_coercer.rb +0 -94
  158. data/lib/grape/validations/validators/all_or_none.rb +0 -15
  159. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  160. data/lib/grape/validations/validators/as.rb +0 -16
  161. data/lib/grape/validations/validators/at_least_one_of.rb +0 -14
  162. data/lib/grape/validations/validators/coerce.rb +0 -88
  163. data/lib/grape/validations/validators/default.rb +0 -48
  164. data/lib/grape/validations/validators/exactly_one_of.rb +0 -16
  165. data/lib/grape/validations/validators/except_values.rb +0 -22
  166. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -15
  167. data/lib/grape/validations/validators/presence.rb +0 -12
  168. data/lib/grape/validations/validators/regexp.rb +0 -13
  169. data/lib/grape/validations/validators/same_as.rb +0 -26
  170. data/lib/grape/validations/validators/values.rb +0 -83
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class PresenceValidator < Base
6
- def validate_param!(attr_name, params)
7
- return if params.respond_to?(:key?) && params.key?(attr_name)
8
- raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message(:presence))
9
- end
10
- end
11
- end
12
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class RegexpValidator < Base
6
- def validate_param!(attr_name, params)
7
- return unless params.respond_to?(:key?) && params.key?(attr_name)
8
- return if Array.wrap(params[attr_name]).all? { |param| param.nil? || param.to_s.match?((options_key?(:value) ? @option[:value] : @option)) }
9
- raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message(:regexp))
10
- end
11
- end
12
- end
13
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class SameAsValidator < Base
6
- def validate_param!(attr_name, params)
7
- confirmation = options_key?(:value) ? @option[:value] : @option
8
- return if params[attr_name] == params[confirmation]
9
- raise Grape::Exceptions::Validation.new(
10
- params: [@scope.full_name(attr_name)],
11
- message: build_message
12
- )
13
- end
14
-
15
- private
16
-
17
- def build_message
18
- if options_key?(:message)
19
- @option[:message]
20
- else
21
- format I18n.t(:same_as, scope: 'grape.errors.messages'), parameter: @option
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,83 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class ValuesValidator < Base
6
- def initialize(attrs, options, required, scope, **opts)
7
- if options.is_a?(Hash)
8
- @excepts = options[:except]
9
- @values = options[:value]
10
- @proc = options[:proc]
11
-
12
- warn '[DEPRECATION] The values validator except option is deprecated. ' \
13
- 'Use the except validator instead.' if @excepts
14
-
15
- raise ArgumentError, 'proc must be a Proc' if @proc && !@proc.is_a?(Proc)
16
- warn '[DEPRECATION] The values validator proc option is deprecated. ' \
17
- 'The lambda expression can now be assigned directly to values.' if @proc
18
- else
19
- @excepts = nil
20
- @values = nil
21
- @proc = nil
22
- @values = options
23
- end
24
- super
25
- end
26
-
27
- def validate_param!(attr_name, params)
28
- return unless params.is_a?(Hash)
29
-
30
- val = params[attr_name]
31
-
32
- return if val.nil? && !required_for_root_scope?
33
-
34
- # don't forget that +false.blank?+ is true
35
- return if val != false && val.blank? && @allow_blank
36
-
37
- param_array = val.nil? ? [nil] : Array.wrap(val)
38
-
39
- raise validation_exception(attr_name, except_message) \
40
- unless check_excepts(param_array)
41
-
42
- raise validation_exception(attr_name, message(:values)) \
43
- unless check_values(param_array, attr_name)
44
-
45
- raise validation_exception(attr_name, message(:values)) \
46
- if @proc && !param_array.all? { |param| @proc.call(param) }
47
- end
48
-
49
- private
50
-
51
- def check_values(param_array, attr_name)
52
- values = @values.is_a?(Proc) && @values.arity.zero? ? @values.call : @values
53
- return true if values.nil?
54
- begin
55
- return param_array.all? { |param| values.call(param) } if values.is_a? Proc
56
- rescue StandardError => e
57
- warn "Error '#{e}' raised while validating attribute '#{attr_name}'"
58
- return false
59
- end
60
- param_array.all? { |param| values.include?(param) }
61
- end
62
-
63
- def check_excepts(param_array)
64
- excepts = @excepts.is_a?(Proc) ? @excepts.call : @excepts
65
- return true if excepts.nil?
66
- param_array.none? { |param| excepts.include?(param) }
67
- end
68
-
69
- def except_message
70
- options = instance_variable_get(:@option)
71
- options_key?(:except_message) ? options[:except_message] : message(:except_values)
72
- end
73
-
74
- def required_for_root_scope?
75
- @required && @scope.root?
76
- end
77
-
78
- def validation_exception(attr_name, message)
79
- Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message)
80
- end
81
- end
82
- end
83
- end