module GraphQL::Schema::Validation::Rules

Constants

ARGUMENTS_ARE_STRING_TO_ARGUMENT
ARGUMENTS_ARE_VALID
DEFAULT_VALUE_IS_VALID_FOR_TYPE
DESCRIPTION_IS_STRING_OR_NIL
FIELDS_ARE_VALID
HAS_ONE_OR_MORE_POSSIBLE_TYPES
INTERFACES_ARE_IMPLEMENTED
NAME_IS_STRING
RESERVED_NAME
RESERVED_TYPE_NAME
SCHEMA_CAN_FETCH_IDS
SCHEMA_CAN_GENERATE_IDS
SCHEMA_CAN_RESOLVE_TYPES
SCHEMA_INSTRUMENTERS_ARE_VALID
TYPE_IS_VALID_INPUT_TYPE

Public Class Methods

assert_named_items_are_valid(item_name, get_items_proc) click to toggle source
# File lib/graphql/schema/validation.rb, line 74
def self.assert_named_items_are_valid(item_name, get_items_proc)
  ->(type) {
    items = get_items_proc.call(type)
    error_message = nil
    items.each do |item|
      item_message = GraphQL::Schema::Validation.validate(item)
      if item_message
        error_message = "#{item_name} #{item.name.inspect} #{item_message}"
        break
      end
    end
    error_message
  }
end
assert_property(property_name, *allowed_classes) click to toggle source

@param property_name [Symbol] The method to validate @param allowed_classes [Class] Classes which the return value may be an instance of @return [Proc] A proc which will validate the input by calling `property_name` and asserting it is an instance of one of `allowed_classes`

# File lib/graphql/schema/validation.rb, line 25
def self.assert_property(property_name, *allowed_classes)
  # Hide LateBoundType from user-facing errors
  allowed_classes_message = allowed_classes.map(&:name).reject {|n| n.include?("LateBoundType") }.join(" or ")
  ->(obj) {
    property_value = obj.public_send(property_name)
    is_valid_value = allowed_classes.any? { |allowed_class| property_value.is_a?(allowed_class) }
    is_valid_value ? nil : "#{property_name} must return #{allowed_classes_message}, not #{property_value.class.name} (#{property_value.inspect})"
  }
end
assert_property_list_of(property_name, list_member_class) click to toggle source

@param property_name [Symbol] The method whose return value will be validated @param list_member_class [Class] The class which each member of the returned array should be an instance of @return [Proc] A proc to validate the input by calling `property_name` and asserting that the return is an Array of `list_member_class` instances

# File lib/graphql/schema/validation.rb, line 58
def self.assert_property_list_of(property_name, list_member_class)
  ->(obj) {
    property_value = obj.public_send(property_name)
    if !property_value.is_a?(Array)
      "#{property_name} must be an Array of #{list_member_class.name}, not a #{property_value.class.name} (#{property_value.inspect})"
    else
      invalid_member = property_value.find { |value| !value.is_a?(list_member_class) }
      if invalid_member
        "#{property_name} must contain #{list_member_class.name}, not #{invalid_member.class.name} (#{invalid_member.inspect})"
      else
        nil # OK
      end
    end
  }
end
assert_property_mapping(property_name, from_class, to_class) click to toggle source

@param property_name [Symbol] The method whose return value will be validated @param from_class [Class] The class for keys in the return value @param to_class [Class] The class for values in the return value @return [Proc] A proc to validate that validates the input by calling `property_name` and asserting that the return value is a Hash of `{from_class => to_class}` pairs

# File lib/graphql/schema/validation.rb, line 39
def self.assert_property_mapping(property_name, from_class, to_class)
  ->(obj) {
    property_value = obj.public_send(property_name)
    if !property_value.is_a?(Hash)
      "#{property_name} must be a hash of {#{from_class.name} => #{to_class.name}}, not a #{property_value.class.name} (#{property_value.inspect})"
    else
      invalid_key, invalid_value = property_value.find { |key, value| !key.is_a?(from_class) || !value.is_a?(to_class) }
      if invalid_key
        "#{property_name} must map #{from_class} => #{to_class}, not #{invalid_key.class.name} => #{invalid_value.class.name} (#{invalid_key.inspect} => #{invalid_value.inspect})"
      else
        nil # OK
      end
    end
  }
end