1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
# frozen_string_literal: true
module GraphQL
class Schema
class Validator
# Use this to assert numerical comparisons hold true for inputs.
#
# @example Require a number between 0 and 1
#
# argument :batting_average, Float, required: true, validates: { numericality: { within: 0..1 } }
#
# @example Require the number 42
#
# argument :the_answer, Integer, required: true, validates: { numericality: { equal_to: 42 } }
#
# @example Require a real number
#
# argument :items_count, Integer, required: true, validates: { numericality: { greater_than_or_equal_to: 0 } }
#
class NumericalityValidator < Validator
# @param greater_than [Integer]
# @param greater_than_or_equal_to [Integer]
# @param less_than [Integer]
# @param less_than_or_equal_to [Integer]
# @param equal_to [Integer]
# @param other_than [Integer]
# @param odd [Boolean]
# @param even [Boolean]
# @param within [Range]
# @param message [String] used for all validation failures
def initialize(
greater_than: nil, greater_than_or_equal_to: nil,
less_than: nil, less_than_or_equal_to: nil,
equal_to: nil, other_than: nil,
odd: nil, even: nil, within: nil,
message: "%{validated} must be %{comparison} %{target}",
null_message: Validator::AllowNullValidator::MESSAGE,
**default_options
)
@greater_than = greater_than
@greater_than_or_equal_to = greater_than_or_equal_to
@less_than = less_than
@less_than_or_equal_to = less_than_or_equal_to
@equal_to = equal_to
@other_than = other_than
@odd = odd
@even = even
@within = within
@message = message
@null_message = null_message
super(**default_options)
end
def validate(object, context, value)
if permitted_empty_value?(value)
# pass in this case
elsif value.nil? # @allow_null is handled in the parent class
@null_message
elsif @greater_than && value <= @greater_than
partial_format(@message, { comparison: "greater than", target: @greater_than })
elsif @greater_than_or_equal_to && value < @greater_than_or_equal_to
partial_format(@message, { comparison: "greater than or equal to", target: @greater_than_or_equal_to })
elsif @less_than && value >= @less_than
partial_format(@message, { comparison: "less than", target: @less_than })
elsif @less_than_or_equal_to && value > @less_than_or_equal_to
partial_format(@message, { comparison: "less than or equal to", target: @less_than_or_equal_to })
elsif @equal_to && value != @equal_to
partial_format(@message, { comparison: "equal to", target: @equal_to })
elsif @other_than && value == @other_than
partial_format(@message, { comparison: "something other than", target: @other_than })
elsif @even && !value.even?
(partial_format(@message, { comparison: "even", target: "" })).strip
elsif @odd && !value.odd?
(partial_format(@message, { comparison: "odd", target: "" })).strip
elsif @within && !@within.include?(value)
partial_format(@message, { comparison: "within", target: @within })
end
end
end
end
end
end
|