123456789_123456789_123456789_123456789_123456789_

Class: GraphQL::Client::Errors

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, Enumerable
Inherits: Object
Defined in: lib/graphql/client/errors.rb

Overview

Public: Collection of errors associated with ::GraphQL object type.

Inspired by ActiveModel::Errors.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(errors = [], path = [], all = false) ⇒ Errors

Internal: Initialize from collection of errors.

errors - Array of ::GraphQL Hash error objects path - Array of String|Integer fields to data all - Boolean flag if all nested errors should be available

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 39

def initialize(errors = [], path = [], all = false)
  @ast_path = path
  @all = all
  @raw_errors = errors
end

Class Method Details

.normalize_error_paths(data = nil, errors = [])

Internal: Normalize GraphQL Error “path” ensuring the path exists.

Records “normalizedPath” value to error object.

data - Hash of response data errors - Array of error Hashes

Returns nothing.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 20

def self.normalize_error_paths(data = nil, errors = [])
  errors.each do |error|
    path = ["data"]
    current = data
    error.fetch("path", []).each do |key|
      break unless current
      path << key
      current = current[key]
    end
    error["normalizedPath"] = path
  end
  errors
end

Instance Attribute Details

#blank? (readonly)

Alias for #empty?.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 171

alias blank? empty?

#empty?Boolean (readonly) Also known as: #blank?

Public: Check if there are no errors on object.

data.errors.messages # => {"node"=>["couldn't find node by id"]}
data.errors.empty?   # => false

Returns true if no errors are found, otherwise false.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 168

def empty?
  size.zero?
end

Instance Method Details

#[](key)

Public: When passed a symbol or a name of a field, returns an array of errors for the method.

data.errors[:node]  # => ["couldn't find node by id"]
data.errors['node'] # => ["couldn't find node by id"]

Returns Array of errors.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 122

def [](key)
  messages.fetch(key, [])
end

#all

Public: Return collection of all nested errors.

data.errors[:node]
data.errors.all[:node]

Returns Errors collection.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 51

def all
  if @all
    self
  else
    self.class.new(@raw_errors, @ast_path, true)
  end
end

#count

Alias for #size.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 160

alias count size

#details

Public: Access Hash of error objects.

data.errors.details["node"]
data.errors.details[:node]

Returns HashWithIndifferentAccess.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 95

def details
  return @details if defined? @details

  details = {}

  @raw_errors.each do |error|
    path = error.fetch("normalizedPath", [])
    matched_path = @all ? path[0, @ast_path.length] : path[0...-1]
    next unless @ast_path == matched_path

    field = path[@ast_path.length]
    next unless field

    details[field] ||= []
    details[field] << error
  end

  @details = HashWithIndifferentAccess.new(details)
end

#each

Public: Iterates through each error key, value pair in the error messages hash. Yields the field and the error for that attribute. If the field has more than one error message, yields once for each error message.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 130

def each
  return enum_for(:each) unless block_given?
  messages.each_key do |field|
    messages[field].each { |error| yield field, error }
  end
end

#filter_by_path(field)

Internal: Return collection of errors for a given subfield.

data.errors.filter_by_path("node")

Returns Errors collection.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 64

def filter_by_path(field)
  self.class.new(@raw_errors, @ast_path + [field], @all)
end

#has_key?(field)

Alias for #include?.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 148

alias has_key? include?

#include?(field) ⇒ Boolean Also known as: #has_key?, #key?

Public: Check if there are any errors on a given field.

data.errors.messages # => {"node"=>["couldn't find node by id", "unauthorized"]}
data.errors.include?("node")    # => true
data.errors.include?("version") # => false

Returns true if the error messages include an error for the given field, otherwise false.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 145

def include?(field)
  self[field].any?
end

#inspect

Public: Display console friendly representation of errors collection.

Returns String.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 196

def inspect
  "#<#{self.class} @messages=#{messages.inspect} @details=#{details.inspect}>"
end

#key?(field)

Alias for #include?.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 149

alias key? include?

#keys

Public: Returns all message keys.

data.errors.messages # => {"node"=>["couldn't find node by id"]}
data.errors.values   # => ["node"]

Returns Array of String field names.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 179

def keys
  messages.keys
end

#messages

Public: Access Hash of error messages.

data.errors.messages["node"]
data.errors.messages[:node]

Returns HashWithIndifferentAccess.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 74

def messages
  return @messages if defined? @messages

  messages = {}

  details.each do |field, errors|
    messages[field] ||= []
    errors.each do |error|
      messages[field] << error.fetch("message")
    end
  end

  @messages = HashWithIndifferentAccess.new(messages)
end

#size Also known as: #count

Public: Count the number of errors on object.

data.errors.messages # => {"node"=>["couldn't find node by id", "unauthorized"]}
data.errors.size     # => 2

Returns the number of error messages.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 157

def size
  values.flatten.size
end

#values

Public: Returns all message values.

data.errors.messages # => {"node"=>["couldn't find node by id"]}
data.errors.values   # => [["couldn't find node by id"]]

Returns Array of Array String messages.

[ GitHub ]

  
# File 'lib/graphql/client/errors.rb', line 189

def values
  messages.values
end