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: Initalize 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



38
39
40
41
42
# File 'lib/graphql/client/errors.rb', line 38

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.



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/graphql/client/errors.rb', line 19

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



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

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

#allObject

Public: Return collection of all nested errors.

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

Returns Errors collection.



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

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.



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/graphql/client/errors.rb', line 94

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.



129
130
131
132
133
134
# File 'lib/graphql/client/errors.rb', line 129

def each
  return enum_for(:each) unless block_given?
  messages.keys.each 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)


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

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.



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

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)


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

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

#inspectObject

Public: Display console friendly representation of errors collection.

Returns String.



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

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.



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

def keys
  messages.keys
end

#messagesObject

Public: Access Hash of error messages.

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

Returns HashWithIndifferentAccess.



73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/graphql/client/errors.rb', line 73

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.



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

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.



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

def values
  messages.values
end