Class: GraphQL::Query::Context
- Inherits:
-
Object
- Object
- GraphQL::Query::Context
- Extended by:
- Forwardable
- Includes:
- SharedMethods
- Defined in:
- lib/graphql/query/context.rb
Overview
Expose some query-specific info to field resolve functions.
It delegates []
to the hash that’s passed to GraphQL::Query#initialize
.
Defined Under Namespace
Modules: SharedMethods Classes: ExecutionErrors, ScopedContext
Constant Summary collapse
- RUNTIME_METADATA_KEYS =
Set.new([:current_object, :current_arguments, :current_field, :current_path])
- UNSPECIFIED_FETCH_DEFAULT =
Object.new
Instance Attribute Summary collapse
-
#errors ⇒ Array<GraphQL::ExecutionError>
readonly
Errors returned during execution.
-
#interpreter ⇒ Object
writeonly
private
-
#path ⇒ Array<String, Integer>
readonly
The current position in the result.
-
#query ⇒ GraphQL::Query
readonly
The query whose context this is.
-
#schema ⇒ GraphQL::Schema
readonly
-
#scoped_context ⇒ Object
readonly
private
-
#value ⇒ Object
writeonly
private
-
#warden ⇒ GraphQL::Schema::Warden
Instance Method Summary collapse
-
#[](key) ⇒ Object
Lookup
key
from the hash passed to Schema#execute ascontext:
. -
#[]=(key, value) ⇒ Object
Reassign
key
to the hash passed to Schema#execute ascontext:
. -
#current_path ⇒ Object
-
#dataloader ⇒ Object
-
#delete(key) ⇒ Object
-
#dig(key, *other_keys) ⇒ Object
-
#fetch(key, default = UNSPECIFIED_FETCH_DEFAULT) ⇒ Object
-
#initialize(query:, schema: query.schema, values:, object:) ⇒ Context
constructor
Make a new context which delegates key lookup to
values
. -
#inspect ⇒ Object
-
#key?(key) ⇒ Boolean
-
#namespace(ns) ⇒ Hash
Get an isolated hash for
ns
. -
#namespace?(ns) ⇒ Boolean
True if this namespace was accessed before.
-
#response_extensions ⇒ Hash
A hash that will be added verbatim to the result hash, as
"extensions" => { ... }
. -
#scoped_merge!(hash) ⇒ Object
-
#scoped_set!(key, value) ⇒ Object
-
#to_h ⇒ Object
(also: #to_hash)
Methods included from SharedMethods
#add_error, #backtrace, #execution_errors, #skip
Constructor Details
#initialize(query:, schema: query.schema, values:, object:) ⇒ Context
Make a new context which delegates key lookup to values
78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/graphql/query/context.rb', line 78 def initialize(query:, schema: query.schema, values:, object:) @query = query @schema = schema @provided_values = values || {} @object = object # Namespaced storage, where user-provided values are in `nil` namespace: @storage = Hash.new { |h, k| h[k] = {} } @storage[nil] = @provided_values @errors = [] @path = [] @value = nil @context = self # for SharedMethods TODO delete sharedmethods @scoped_context = ScopedContext.new(self) end |
Instance Attribute Details
#errors ⇒ Array<GraphQL::ExecutionError> (readonly)
Returns errors returned during execution.
64 65 66 |
# File 'lib/graphql/query/context.rb', line 64 def errors @errors end |
#interpreter=(value) ⇒ Object (writeonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
201 202 203 |
# File 'lib/graphql/query/context.rb', line 201 def interpreter=(value) @interpreter = value end |
#path ⇒ Array<String, Integer> (readonly)
Returns The current position in the result.
73 74 75 |
# File 'lib/graphql/query/context.rb', line 73 def path @path end |
#query ⇒ GraphQL::Query (readonly)
Returns The query whose context this is.
67 68 69 |
# File 'lib/graphql/query/context.rb', line 67 def query @query end |
#schema ⇒ GraphQL::Schema (readonly)
70 71 72 |
# File 'lib/graphql/query/context.rb', line 70 def schema @schema end |
#scoped_context ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
207 208 209 |
# File 'lib/graphql/query/context.rb', line 207 def scoped_context @scoped_context end |
#value=(value) ⇒ Object (writeonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
204 205 206 |
# File 'lib/graphql/query/context.rb', line 204 def value=(value) @value = value end |
#warden ⇒ GraphQL::Schema::Warden
303 304 305 |
# File 'lib/graphql/query/context.rb', line 303 def warden @warden ||= (@query && @query.warden) end |
Instance Method Details
#[](key) ⇒ Object
Lookup key
from the hash passed to Schema#execute as context:
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 |
# File 'lib/graphql/query/context.rb', line 220 def [](key) if @scoped_context.key?(key) @scoped_context[key] elsif @provided_values.key?(key) @provided_values[key] elsif RUNTIME_METADATA_KEYS.include?(key) if key == :current_path current_path else thread_info = Thread.current[:__graphql_runtime_info] thread_info && thread_info[key] end else # not found nil end end |
#[]=(key, value) ⇒ Object
Reassign key
to the hash passed to Schema#execute as context:
216 217 218 |
# File 'lib/graphql/query/context.rb', line 216 def []=(key, value) @provided_values[key] = value end |
#current_path ⇒ Object
238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/graphql/query/context.rb', line 238 def current_path thread_info = Thread.current[:__graphql_runtime_info] path = thread_info && (result = thread_info[:current_result]) && (result.path) if path && (rn = thread_info[:current_result_name]) path = path.dup path.push(rn) end path end |
#dataloader ⇒ Object
196 197 198 |
# File 'lib/graphql/query/context.rb', line 196 def dataloader @dataloader ||= self[:dataloader] || (query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new) end |
#delete(key) ⇒ Object
250 251 252 253 254 255 256 |
# File 'lib/graphql/query/context.rb', line 250 def delete(key) if @scoped_context.key?(key) @scoped_context.delete(key) else @provided_values.delete(key) end end |
#dig(key, *other_keys) ⇒ Object
277 278 279 280 281 282 283 284 285 286 |
# File 'lib/graphql/query/context.rb', line 277 def dig(key, *other_keys) if RUNTIME_METADATA_KEYS.include?(key) (thread_info = Thread.current[:__graphql_runtime_info]).key?(key) && thread_info.dig(key, *other_keys) elsif @scoped_context.key?(key) @scoped_context.dig(key, *other_keys) else @provided_values.dig(key, *other_keys) end end |
#fetch(key, default = UNSPECIFIED_FETCH_DEFAULT) ⇒ Object
260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
# File 'lib/graphql/query/context.rb', line 260 def fetch(key, default = UNSPECIFIED_FETCH_DEFAULT) if RUNTIME_METADATA_KEYS.include?(key) (thread_info = Thread.current[:__graphql_runtime_info]) && thread_info[key] elsif @scoped_context.key?(key) scoped_context[key] elsif @provided_values.key?(key) @provided_values[key] elsif default != UNSPECIFIED_FETCH_DEFAULT default elsif block_given? yield(self, key) else raise KeyError.new(key: key) end end |
#inspect ⇒ Object
326 327 328 |
# File 'lib/graphql/query/context.rb', line 326 def inspect "#<Query::Context ...>" end |
#key?(key) ⇒ Boolean
298 299 300 |
# File 'lib/graphql/query/context.rb', line 298 def key?(key) @scoped_context.key?(key) || @provided_values.key?(key) end |
#namespace(ns) ⇒ Hash
Get an isolated hash for ns
. Doesn’t affect user-provided storage.
313 314 315 316 317 318 319 |
# File 'lib/graphql/query/context.rb', line 313 def namespace(ns) if ns == :interpreter self else @storage[ns] end end |
#namespace?(ns) ⇒ Boolean
Returns true if this namespace was accessed before.
322 323 324 |
# File 'lib/graphql/query/context.rb', line 322 def namespace?(ns) @storage.key?(ns) end |
#response_extensions ⇒ Hash
Returns A hash that will be added verbatim to the result hash, as "extensions" => { ... }
.
192 193 194 |
# File 'lib/graphql/query/context.rb', line 192 def response_extensions namespace(:__query_result_extensions__) end |
#scoped_merge!(hash) ⇒ Object
330 331 332 |
# File 'lib/graphql/query/context.rb', line 330 def scoped_merge!(hash) @scoped_context.merge!(hash) end |
#scoped_set!(key, value) ⇒ Object
334 335 336 337 |
# File 'lib/graphql/query/context.rb', line 334 def scoped_set!(key, value) scoped_merge!(key => value) nil end |
#to_h ⇒ Object Also known as: to_hash
288 289 290 291 292 293 294 |
# File 'lib/graphql/query/context.rb', line 288 def to_h if (current_scoped_context = @scoped_context.merged_context) @provided_values.merge(current_scoped_context) else @provided_values end end |