Class: GraphQL::Client::Errors

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/graphql/client/errors.rb

Overview

Public: Collection of errors associated with GraphQL object type.

Inspired by ActiveModel::Errors.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(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



39
40
41
42
43
# 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 = []) ⇒ Object

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.



20
21
22
23
24
25
26
27
28
29
30
31
32
# 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["path"].to_a.each do |key|
      break unless current
      path << key
      current = current[key]
    end
    error["normalizedPath"] = path
  end
  errors
end

Instance Method Details

#[](key) ⇒ Object

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.



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

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

#allObject

Public: Return collection of all nested errors.

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

Returns Errors collection.



51
52
53
54
55
56
57
# File 'lib/graphql/client/errors.rb', line 51

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

#detailsObject

Public: Access Hash of error objects.

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

Returns HashWithIndifferentAccess.



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# 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

#eachObject

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.



130
131
132
133
134
135
# 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

#empty?Boolean 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.

Returns:

  • (Boolean)


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

def empty?
  size.zero?
end

#filter_by_path(field) ⇒ Object

Internal: Return collection of errors for a given subfield.

data.errors.filter_by_path("node")

Returns Errors collection.



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

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

#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.

Returns:

  • (Boolean)


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

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

#inspectObject

Public: Display console friendly representation of errors collection.

Returns String.



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

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

#keysObject

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.



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

def keys
  messages.keys
end

#messagesObject

Public: Access Hash of error messages.

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

Returns HashWithIndifferentAccess.



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# 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

#sizeObject 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.



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

def size
  values.flatten.size
end

#valuesObject

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.



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

def values
  messages.values
end