grape 1.6.0 → 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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/CONTRIBUTING.md +1 -0
  4. data/README.md +9 -1
  5. data/lib/grape/api.rb +12 -0
  6. data/lib/grape/dry_types.rb +12 -0
  7. data/lib/grape/dsl/headers.rb +5 -2
  8. data/lib/grape/dsl/helpers.rb +1 -1
  9. data/lib/grape/middleware/auth/dsl.rb +7 -1
  10. data/lib/grape/middleware/base.rb +1 -1
  11. data/lib/grape/util/json.rb +2 -0
  12. data/lib/grape/util/strict_hash_configuration.rb +1 -1
  13. data/lib/grape/validations/types/array_coercer.rb +0 -2
  14. data/lib/grape/validations/types/dry_type_coercer.rb +1 -10
  15. data/lib/grape/validations/types/json.rb +0 -2
  16. data/lib/grape/validations/types/primitive_coercer.rb +5 -7
  17. data/lib/grape/validations/types/set_coercer.rb +0 -3
  18. data/lib/grape/validations/types.rb +83 -9
  19. data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
  20. data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
  21. data/lib/grape/validations/validators/as_validator.rb +14 -0
  22. data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
  23. data/lib/grape/validations/validators/base.rb +73 -71
  24. data/lib/grape/validations/validators/coerce_validator.rb +75 -0
  25. data/lib/grape/validations/validators/default_validator.rb +51 -0
  26. data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
  27. data/lib/grape/validations/validators/except_values_validator.rb +24 -0
  28. data/lib/grape/validations/validators/multiple_params_base.rb +24 -22
  29. data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
  30. data/lib/grape/validations/validators/presence_validator.rb +15 -0
  31. data/lib/grape/validations/validators/regexp_validator.rb +16 -0
  32. data/lib/grape/validations/validators/same_as_validator.rb +29 -0
  33. data/lib/grape/validations/validators/values_validator.rb +88 -0
  34. data/lib/grape/version.rb +1 -1
  35. data/lib/grape.rb +59 -24
  36. data/spec/grape/api/custom_validations_spec.rb +77 -46
  37. data/spec/grape/api/deeply_included_options_spec.rb +3 -3
  38. data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
  39. data/spec/grape/api/invalid_format_spec.rb +2 -0
  40. data/spec/grape/api/recognize_path_spec.rb +1 -1
  41. data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
  42. data/spec/grape/api_remount_spec.rb +16 -15
  43. data/spec/grape/api_spec.rb +317 -193
  44. data/spec/grape/dsl/callbacks_spec.rb +1 -0
  45. data/spec/grape/dsl/headers_spec.rb +39 -9
  46. data/spec/grape/dsl/helpers_spec.rb +3 -2
  47. data/spec/grape/dsl/inside_route_spec.rb +6 -4
  48. data/spec/grape/dsl/logger_spec.rb +16 -18
  49. data/spec/grape/dsl/middleware_spec.rb +1 -0
  50. data/spec/grape/dsl/parameters_spec.rb +1 -0
  51. data/spec/grape/dsl/request_response_spec.rb +1 -0
  52. data/spec/grape/dsl/routing_spec.rb +9 -6
  53. data/spec/grape/endpoint/declared_spec.rb +12 -12
  54. data/spec/grape/endpoint_spec.rb +59 -50
  55. data/spec/grape/entity_spec.rb +13 -13
  56. data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
  57. data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
  58. data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
  59. data/spec/grape/exceptions/validation_spec.rb +5 -3
  60. data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
  61. data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
  62. data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
  63. data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
  64. data/spec/grape/loading_spec.rb +8 -8
  65. data/spec/grape/middleware/auth/dsl_spec.rb +14 -5
  66. data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
  67. data/spec/grape/middleware/base_spec.rb +24 -15
  68. data/spec/grape/middleware/error_spec.rb +1 -0
  69. data/spec/grape/middleware/exception_spec.rb +111 -161
  70. data/spec/grape/middleware/formatter_spec.rb +25 -4
  71. data/spec/grape/middleware/globals_spec.rb +7 -4
  72. data/spec/grape/middleware/stack_spec.rb +11 -11
  73. data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
  74. data/spec/grape/middleware/versioner/header_spec.rb +14 -13
  75. data/spec/grape/middleware/versioner/param_spec.rb +7 -1
  76. data/spec/grape/middleware/versioner/path_spec.rb +5 -1
  77. data/spec/grape/middleware/versioner_spec.rb +1 -1
  78. data/spec/grape/parser_spec.rb +4 -0
  79. data/spec/grape/path_spec.rb +52 -52
  80. data/spec/grape/presenters/presenter_spec.rb +7 -6
  81. data/spec/grape/request_spec.rb +6 -4
  82. data/spec/grape/util/inheritable_setting_spec.rb +7 -7
  83. data/spec/grape/util/inheritable_values_spec.rb +3 -2
  84. data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
  85. data/spec/grape/util/stackable_values_spec.rb +7 -5
  86. data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
  87. data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
  88. data/spec/grape/validations/params_scope_spec.rb +9 -7
  89. data/spec/grape/validations/single_attribute_iterator_spec.rb +1 -0
  90. data/spec/grape/validations/types/primitive_coercer_spec.rb +2 -2
  91. data/spec/grape/validations/types_spec.rb +8 -8
  92. data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
  93. data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
  94. data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
  95. data/spec/grape/validations/validators/coerce_spec.rb +10 -12
  96. data/spec/grape/validations/validators/default_spec.rb +72 -78
  97. data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
  98. data/spec/grape/validations/validators/except_values_spec.rb +1 -1
  99. data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
  100. data/spec/grape/validations/validators/presence_spec.rb +16 -1
  101. data/spec/grape/validations/validators/regexp_spec.rb +25 -31
  102. data/spec/grape/validations/validators/same_as_spec.rb +14 -20
  103. data/spec/grape/validations/validators/values_spec.rb +172 -171
  104. data/spec/grape/validations_spec.rb +45 -16
  105. data/spec/integration/eager_load/eager_load_spec.rb +2 -2
  106. data/spec/integration/multi_json/json_spec.rb +1 -1
  107. data/spec/integration/multi_xml/xml_spec.rb +1 -1
  108. data/spec/shared/versioning_examples.rb +10 -7
  109. data/spec/spec_helper.rb +11 -1
  110. metadata +116 -116
  111. data/lib/grape/validations/types/build_coercer.rb +0 -94
  112. data/lib/grape/validations/validators/all_or_none.rb +0 -16
  113. data/lib/grape/validations/validators/allow_blank.rb +0 -18
  114. data/lib/grape/validations/validators/as.rb +0 -12
  115. data/lib/grape/validations/validators/at_least_one_of.rb +0 -15
  116. data/lib/grape/validations/validators/coerce.rb +0 -87
  117. data/lib/grape/validations/validators/default.rb +0 -49
  118. data/lib/grape/validations/validators/exactly_one_of.rb +0 -17
  119. data/lib/grape/validations/validators/except_values.rb +0 -22
  120. data/lib/grape/validations/validators/mutual_exclusion.rb +0 -16
  121. data/lib/grape/validations/validators/presence.rb +0 -13
  122. data/lib/grape/validations/validators/regexp.rb +0 -14
  123. data/lib/grape/validations/validators/same_as.rb +0 -27
  124. data/lib/grape/validations/validators/values.rb +0 -86
@@ -1,94 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'array_coercer'
4
- require_relative 'set_coercer'
5
- require_relative 'primitive_coercer'
6
-
7
- module Grape
8
- module Validations
9
- module Types
10
- # Chooses the best coercer for the given type. For example, if the type
11
- # is Integer, it will return a coercer which will be able to coerce a value
12
- # to the integer.
13
- #
14
- # There are a few very special coercers which might be returned.
15
- #
16
- # +Grape::Types::MultipleTypeCoercer+ is a coercer which is returned when
17
- # the given type implies values in an array with different types.
18
- # For example, +[Integer, String]+ allows integer and string values in
19
- # an array.
20
- #
21
- # +Grape::Types::CustomTypeCoercer+ is a coercer which is returned when
22
- # a method is specified by a user with +coerce_with+ option or the user
23
- # specifies a custom type which implements requirments of
24
- # +Grape::Types::CustomTypeCoercer+.
25
- #
26
- # +Grape::Types::CustomTypeCollectionCoercer+ is a very similar to the
27
- # previous one, but it expects an array or set of values having a custom
28
- # type implemented by the user.
29
- #
30
- # There is also a group of custom types implemented by Grape, check
31
- # +Grape::Validations::Types::SPECIAL+ to get the full list.
32
- #
33
- # @param type [Class] the type to which input strings
34
- # should be coerced
35
- # @param method [Class,#call] the coercion method to use
36
- # @return [Object] object to be used
37
- # for coercion and type validation
38
- def self.build_coercer(type, method: nil, strict: false)
39
- cache_instance(type, method, strict) do
40
- create_coercer_instance(type, method, strict)
41
- end
42
- end
43
-
44
- def self.create_coercer_instance(type, method, strict)
45
- # Maps a custom type provided by Grape, it doesn't map types wrapped by collections!!!
46
- type = Types.map_special(type)
47
-
48
- # Use a special coercer for multiply-typed parameters.
49
- if Types.multiple?(type)
50
- MultipleTypeCoercer.new(type, method)
51
-
52
- # Use a special coercer for custom types and coercion methods.
53
- elsif method || Types.custom?(type)
54
- CustomTypeCoercer.new(type, method)
55
-
56
- # Special coercer for collections of types that implement a parse method.
57
- # CustomTypeCoercer (above) already handles such types when an explicit coercion
58
- # method is supplied.
59
- elsif Types.collection_of_custom?(type)
60
- Types::CustomTypeCollectionCoercer.new(
61
- Types.map_special(type.first), type.is_a?(Set)
62
- )
63
- else
64
- DryTypeCoercer.coercer_instance_for(type, strict)
65
- end
66
- end
67
-
68
- def self.cache_instance(type, method, strict, &_block)
69
- key = cache_key(type, method, strict)
70
-
71
- return @__cache[key] if @__cache.key?(key)
72
-
73
- instance = yield
74
-
75
- @__cache_write_lock.synchronize do
76
- @__cache[key] = instance
77
- end
78
-
79
- instance
80
- end
81
-
82
- def self.cache_key(type, method, strict)
83
- [type, method, strict].each_with_object(+'_') do |val, memo|
84
- next if val.nil?
85
-
86
- memo << '_' << val.to_s
87
- end
88
- end
89
-
90
- instance_variable_set(:@__cache, {})
91
- instance_variable_set(:@__cache_write_lock, Mutex.new)
92
- end
93
- end
94
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grape/validations/validators/multiple_params_base'
4
-
5
- module Grape
6
- module Validations
7
- class AllOrNoneOfValidator < MultipleParamsBase
8
- def validate_params!(params)
9
- keys = keys_in_common(params)
10
- return if keys.empty? || keys.length == all_keys.length
11
-
12
- raise Grape::Exceptions::Validation.new(params: all_keys, message: message(:all_or_none))
13
- end
14
- end
15
- end
16
- end
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class AllowBlankValidator < Base
6
- def validate_param!(attr_name, params)
7
- return if (options_key?(:value) ? @option[:value] : @option) || !params.is_a?(Hash)
8
-
9
- value = params[attr_name]
10
- value = value.strip if value.respond_to?(:strip)
11
-
12
- return if value == false || value.present?
13
-
14
- raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message(:blank))
15
- end
16
- end
17
- end
18
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class AsValidator < Base
6
- # We use a validator for renaming parameters. This is just a marker for
7
- # the parameter scope to handle the renaming. No actual validation
8
- # happens here.
9
- def validate_param!(*); end
10
- end
11
- end
12
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grape/validations/validators/multiple_params_base'
4
-
5
- module Grape
6
- module Validations
7
- class AtLeastOneOfValidator < MultipleParamsBase
8
- def validate_params!(params)
9
- return unless keys_in_common(params).empty?
10
-
11
- raise Grape::Exceptions::Validation.new(params: all_keys, message: message(:at_least_one))
12
- end
13
- end
14
- end
15
- end
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- class API
5
- class Boolean
6
- def self.build(val)
7
- return nil if val != true && val != false
8
-
9
- new
10
- end
11
- end
12
-
13
- class Instance
14
- Boolean = Grape::API::Boolean
15
- end
16
- end
17
-
18
- module Validations
19
- class CoerceValidator < Base
20
- def initialize(attrs, options, required, scope, **opts)
21
- super
22
-
23
- @converter = if type.is_a?(Grape::Validations::Types::VariantCollectionCoercer)
24
- type
25
- else
26
- Types.build_coercer(type, method: @option[:method])
27
- end
28
- end
29
-
30
- def validate_param!(attr_name, params)
31
- raise validation_exception(attr_name) unless params.is_a? Hash
32
-
33
- new_value = coerce_value(params[attr_name])
34
-
35
- raise validation_exception(attr_name, new_value.message) unless valid_type?(new_value)
36
-
37
- # Don't assign a value if it is identical. It fixes a problem with Hashie::Mash
38
- # which looses wrappers for hashes and arrays after reassigning values
39
- #
40
- # h = Hashie::Mash.new(list: [1, 2, 3, 4])
41
- # => #<Hashie::Mash list=#<Hashie::Array [1, 2, 3, 4]>>
42
- # list = h.list
43
- # h[:list] = list
44
- # h
45
- # => #<Hashie::Mash list=[1, 2, 3, 4]>
46
- return if params[attr_name].instance_of?(new_value.class) && params[attr_name] == new_value
47
-
48
- params[attr_name] = new_value
49
- end
50
-
51
- private
52
-
53
- # @!attribute [r] converter
54
- # Object that will be used for parameter coercion and type checking.
55
- #
56
- # See {Types.build_coercer}
57
- #
58
- # @return [Object]
59
- attr_reader :converter
60
-
61
- def valid_type?(val)
62
- !val.is_a?(Types::InvalidValue)
63
- end
64
-
65
- def coerce_value(val)
66
- converter.call(val)
67
- # Some custom types might fail, so it should be treated as an invalid value
68
- rescue StandardError
69
- Types::InvalidValue.new
70
- end
71
-
72
- # Type to which the parameter will be coerced.
73
- #
74
- # @return [Class]
75
- def type
76
- @option[:type].is_a?(Hash) ? @option[:type][:value] : @option[:type]
77
- end
78
-
79
- def validation_exception(attr_name, custom_msg = nil)
80
- Grape::Exceptions::Validation.new(
81
- params: [@scope.full_name(attr_name)],
82
- message: custom_msg || message(:coerce)
83
- )
84
- end
85
- end
86
- end
87
- end
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class DefaultValidator < Base
6
- def initialize(attrs, options, required, scope, **opts)
7
- @default = options
8
- super
9
- end
10
-
11
- def validate_param!(attr_name, params)
12
- params[attr_name] = if @default.is_a? Proc
13
- @default.call
14
- elsif @default.frozen? || !duplicatable?(@default)
15
- @default
16
- else
17
- duplicate(@default)
18
- end
19
- end
20
-
21
- def validate!(params)
22
- attrs = SingleAttributeIterator.new(self, @scope, params)
23
- attrs.each do |resource_params, attr_name|
24
- next unless @scope.meets_dependency?(resource_params, params)
25
-
26
- validate_param!(attr_name, resource_params) if resource_params.is_a?(Hash) && resource_params[attr_name].nil?
27
- end
28
- end
29
-
30
- private
31
-
32
- # return true if we might be able to dup this object
33
- def duplicatable?(obj)
34
- !obj.nil? &&
35
- obj != true &&
36
- obj != false &&
37
- !obj.is_a?(Symbol) &&
38
- !obj.is_a?(Numeric)
39
- end
40
-
41
- # make a best effort to dup the object
42
- def duplicate(obj)
43
- obj.dup
44
- rescue TypeError
45
- obj
46
- end
47
- end
48
- end
49
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grape/validations/validators/multiple_params_base'
4
-
5
- module Grape
6
- module Validations
7
- class ExactlyOneOfValidator < MultipleParamsBase
8
- def validate_params!(params)
9
- keys = keys_in_common(params)
10
- return if keys.length == 1
11
- raise Grape::Exceptions::Validation.new(params: all_keys, message: message(:exactly_one)) if keys.length.zero?
12
-
13
- raise Grape::Exceptions::Validation.new(params: keys, message: message(:mutual_exclusion))
14
- end
15
- end
16
- end
17
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Grape
4
- module Validations
5
- class ExceptValuesValidator < Base
6
- def initialize(attrs, options, required, scope, **opts)
7
- @except = options.is_a?(Hash) ? options[:value] : options
8
- super
9
- end
10
-
11
- def validate_param!(attr_name, params)
12
- return unless params.respond_to?(:key?) && params.key?(attr_name)
13
-
14
- excepts = @except.is_a?(Proc) ? @except.call : @except
15
- return if excepts.nil?
16
-
17
- param_array = params[attr_name].nil? ? [nil] : Array.wrap(params[attr_name])
18
- raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message(:except_values)) if param_array.any? { |param| excepts.include?(param) }
19
- end
20
- end
21
- end
22
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'grape/validations/validators/multiple_params_base'
4
-
5
- module Grape
6
- module Validations
7
- class MutualExclusionValidator < MultipleParamsBase
8
- def validate_params!(params)
9
- keys = keys_in_common(params)
10
- return if keys.length <= 1
11
-
12
- raise Grape::Exceptions::Validation.new(params: keys, message: message(:mutual_exclusion))
13
- end
14
- end
15
- end
16
- end
@@ -1,13 +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
-
9
- raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message(:presence))
10
- end
11
- end
12
- end
13
- end
@@ -1,14 +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
-
10
- raise Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message(:regexp))
11
- end
12
- end
13
- end
14
- end
@@ -1,27 +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
-
10
- raise Grape::Exceptions::Validation.new(
11
- params: [@scope.full_name(attr_name)],
12
- message: build_message
13
- )
14
- end
15
-
16
- private
17
-
18
- def build_message
19
- if options_key?(:message)
20
- @option[:message]
21
- else
22
- format I18n.t(:same_as, scope: 'grape.errors.messages'), parameter: @option
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,86 +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
-
17
- warn '[DEPRECATION] The values validator proc option is deprecated. ' \
18
- 'The lambda expression can now be assigned directly to values.' if @proc
19
- else
20
- @excepts = nil
21
- @values = nil
22
- @proc = nil
23
- @values = options
24
- end
25
- super
26
- end
27
-
28
- def validate_param!(attr_name, params)
29
- return unless params.is_a?(Hash)
30
-
31
- val = params[attr_name]
32
-
33
- return if val.nil? && !required_for_root_scope?
34
-
35
- # don't forget that +false.blank?+ is true
36
- return if val != false && val.blank? && @allow_blank
37
-
38
- param_array = val.nil? ? [nil] : Array.wrap(val)
39
-
40
- raise validation_exception(attr_name, except_message) \
41
- unless check_excepts(param_array)
42
-
43
- raise validation_exception(attr_name, message(:values)) \
44
- unless check_values(param_array, attr_name)
45
-
46
- raise validation_exception(attr_name, message(:values)) \
47
- if @proc && !param_array.all? { |param| @proc.call(param) }
48
- end
49
-
50
- private
51
-
52
- def check_values(param_array, attr_name)
53
- values = @values.is_a?(Proc) && @values.arity.zero? ? @values.call : @values
54
- return true if values.nil?
55
-
56
- begin
57
- return param_array.all? { |param| values.call(param) } if values.is_a? Proc
58
- rescue StandardError => e
59
- warn "Error '#{e}' raised while validating attribute '#{attr_name}'"
60
- return false
61
- end
62
- param_array.all? { |param| values.include?(param) }
63
- end
64
-
65
- def check_excepts(param_array)
66
- excepts = @excepts.is_a?(Proc) ? @excepts.call : @excepts
67
- return true if excepts.nil?
68
-
69
- param_array.none? { |param| excepts.include?(param) }
70
- end
71
-
72
- def except_message
73
- options = instance_variable_get(:@option)
74
- options_key?(:except_message) ? options[:except_message] : message(:except_values)
75
- end
76
-
77
- def required_for_root_scope?
78
- @required && @scope.root?
79
- end
80
-
81
- def validation_exception(attr_name, message)
82
- Grape::Exceptions::Validation.new(params: [@scope.full_name(attr_name)], message: message)
83
- end
84
- end
85
- end
86
- end