Class: GraphQL::Client::Errors
- Inherits:
-
Object
- Object
- GraphQL::Client::Errors
- 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
-
.normalize_error_paths(data = nil, errors = []) ⇒ Object
Internal: Normalize GraphQL Error “path” ensuring the path exists.
Instance Method Summary collapse
-
#[](key) ⇒ Object
Public: When passed a symbol or a name of a field, returns an array of errors for the method.
-
#all ⇒ Object
Public: Return collection of all nested errors.
-
#details ⇒ Object
Public: Access Hash of error objects.
-
#each ⇒ Object
Public: Iterates through each error key, value pair in the error messages hash.
-
#empty? ⇒ Boolean
(also: #blank?)
Public: Check if there are no errors on object.
-
#filter_by_path(field) ⇒ Object
Internal: Return collection of errors for a given subfield.
-
#include?(field) ⇒ Boolean
(also: #has_key?, #key?)
Public: Check if there are any errors on a given field.
-
#initialize(errors = [], path = [], all = false) ⇒ Errors
constructor
Internal: Initialize from collection of errors.
-
#inspect ⇒ Object
Public: Display console friendly representation of errors collection.
-
#keys ⇒ Object
Public: Returns all message keys.
-
#messages ⇒ Object
Public: Access Hash of error messages.
-
#size ⇒ Object
(also: #count)
Public: Count the number of errors on object.
-
#values ⇒ Object
Public: Returns all message values.
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) .fetch(key, []) end |
#all ⇒ Object
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 |
#details ⇒ Object
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 |
#each ⇒ Object
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? .each_key do |field| [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. # => {"node"=>["couldn't find node by id"]}
data.errors.empty? # => false
Returns true if no errors are found, otherwise false.
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. # => {"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.
145 146 147 |
# File 'lib/graphql/client/errors.rb', line 145 def include?(field) self[field].any? end |
#inspect ⇒ Object
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=#{.inspect} @details=#{details.inspect}>" end |
#keys ⇒ Object
Public: Returns all message keys.
data.errors. # => {"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 .keys end |
#messages ⇒ Object
Public: Access Hash of error messages.
data.errors.["node"]
data.errors.[: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 return @messages if defined? @messages = {} details.each do |field, errors| [field] ||= [] errors.each do |error| [field] << error.fetch("message") end end @messages = HashWithIndifferentAccess.new() end |
#size ⇒ Object Also known as: count
Public: Count the number of errors on object.
data.errors. # => {"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 |
#values ⇒ Object
Public: Returns all message values.
data.errors. # => {"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 .values end |