Module: GraphQL::Schema::Member::HasArguments Private

Included in:
Directive, Field, InputObject, Resolver
Defined in:
lib/graphql/schema/member/has_arguments.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

API:

  • private

Defined Under Namespace

Modules: ArgumentClassAccessor, ArgumentObjectLoader, ClassConfigured, FieldConfigured, HasDirectiveArguments

Constant Summary collapse

NO_ARGUMENTS =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

API:

  • private

GraphQL::EmptyObjects::EMPTY_HASH

Instance Method Summary collapse

Instance Method Details

#add_argument(arg_defn) ⇒ GraphQL::Schema::Argument

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.

Register this argument with the class.

Parameters:

Returns:

API:

  • private



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/graphql/schema/member/has_arguments.rb', line 70

def add_argument(arg_defn)
  @own_arguments ||= {}
  prev_defn = @own_arguments[arg_defn.name]
  case prev_defn
  when nil
    @own_arguments[arg_defn.name] = arg_defn
  when Array
    prev_defn << arg_defn
  when GraphQL::Schema::Argument
    @own_arguments[arg_defn.name] = [prev_defn, arg_defn]
  else
    raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
  end
  arg_defn
end

#all_argument_definitionsObject

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.

API:

  • private



223
224
225
226
227
228
229
230
231
# File 'lib/graphql/schema/member/has_arguments.rb', line 223

def all_argument_definitions
  if !own_arguments.empty?
    all_defns = own_arguments.values
    all_defns.flatten!
    all_defns
  else
    EmptyObjects::EMPTY_ARRAY
  end
end

#any_arguments?Boolean

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.

Returns:

API:

  • private



115
116
117
# File 'lib/graphql/schema/member/has_arguments.rb', line 115

def any_arguments?
  !own_arguments.empty?
end

#argument(arg_name = nil, type_expr = nil, desc = nil, **kwargs, &definition_block) ⇒ GraphQL::Schema::Argument

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.

Returns An instance of #argument_class created from these arguments.

Parameters:

  • (defaults to: nil)

    The underscore-cased name of this argument, name: keyword also accepted

  • (defaults to: nil)

    The GraphQL type of this argument; type: keyword also accepted

  • (defaults to: nil)

    Argument description, description: keyword also accepted

  • Called with the newly-created Argument

  • Keywords for defining an argument. Any keywords not documented here must be handled by your base Argument class.

Options Hash (**kwargs):

  • :required (Boolean, :nullable)

    if true, this argument is non-null; if false, this argument is nullable. If :nullable, then the argument must be provided, though it may be null.

  • :description (String)

    Positional argument also accepted

  • :type (Class, Array<Class>)

    Input type; positional argument also accepted

  • :name (Symbol)

    positional argument also accepted

  • :default_value (Object)
  • :loads (Class, Array<Class>)

    A GraphQL type to load for the given ID when one is present

  • :as (Symbol)

    Override the keyword name when passed to a method

  • :prepare (Symbol)

    A method to call to transform this argument's valuebefore sending it to field resolution

  • :camelize (Boolean)

    if true, the name will be camelized when building the schema

  • :from_resolver (Boolean)

    if true, a Resolver class defined this argument

  • :directives (Hash{Class => Hash})
  • :deprecation_reason (String)
  • :comment (String)

    Private, used by GraphQL-Ruby when parsing GraphQL schema files

  • :ast_node (GraphQL::Language::Nodes::InputValueDefinition)

    Private, used by GraphQL-Ruby when parsing schema files

  • :validates (Hash, nil)

    Options for building validators, if any should be applied

  • :replace_null_with_default (Boolean)

    if true, incoming values of null will be replaced with the configured default_value

Returns:

API:

  • private



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/graphql/schema/member/has_arguments.rb', line 39

def argument(arg_name = nil, type_expr = nil, desc = nil, **kwargs, &definition_block)
  if kwargs[:loads]
    loads_name = arg_name || kwargs[:name]
    loads_name_as_string = loads_name.to_s

    inferred_arg_name = case loads_name_as_string
    when /_id$/
      loads_name_as_string.sub(/_id$/, "").to_sym
    when /_ids$/
      loads_name_as_string.sub(/_ids$/, "")
        .sub(/([^s])$/, "\\1s")
        .to_sym
    else
      loads_name
    end

    kwargs[:as] ||= inferred_arg_name
  end
  kwargs[:owner] = self
  arg_defn = self.argument_class.new(
    arg_name, type_expr, desc,
    **kwargs,
    &definition_block
  )
  add_argument(arg_defn)
  arg_defn
end

#argument_class(new_arg_class = nil) ⇒ Object

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.

Parameters:

  • (defaults to: nil)

    A class to use for building argument definitions

API:

  • private



246
247
248
# File 'lib/graphql/schema/member/has_arguments.rb', line 246

def argument_class(new_arg_class = nil)
  self.class.argument_class(new_arg_class)
end

#arguments(context = GraphQL::Query::NullContext.instance, _require_defined_arguments = nil) ⇒ Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions

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.

Returns Hash GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions.

Returns:

  • Hash GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions

API:

  • private



102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/graphql/schema/member/has_arguments.rb', line 102

def arguments(context = GraphQL::Query::NullContext.instance, _require_defined_arguments = nil)
  if !own_arguments.empty?
    own_arguments_that_apply = {}
    own_arguments.each do |name, args_entry|
      if (visible_defn = Warden.visible_entry?(:visible_argument?, args_entry, context))
        own_arguments_that_apply[visible_defn.graphql_name] = visible_defn
      end
    end
  end
  # might be nil if there are actually no arguments
  own_arguments_that_apply || own_arguments
end

#arguments_statically_coercible?Boolean

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.

Returns:

API:

  • private



329
330
331
332
333
334
335
# File 'lib/graphql/schema/member/has_arguments.rb', line 329

def arguments_statically_coercible?
  if defined?(@arguments_statically_coercible) && !@arguments_statically_coercible.nil?
    @arguments_statically_coercible
  else
    @arguments_statically_coercible = all_argument_definitions.all?(&:statically_coercible?)
  end
end

#coerce_arguments(parent_object, values, context) {|Interpreter::Arguments, Execution::Lazy<Interpreter::Arguments>| ... } ⇒ Interpreter::Arguments, Execution::Lazy<Interpreter::Arguments>

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.

If given a block, it will eventually yield the loaded args to the block.

If no block is given, it will immediately dataload (but might return a Lazy).

Parameters:

Yields:

Returns:

API:

  • private



259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
# File 'lib/graphql/schema/member/has_arguments.rb', line 259

def coerce_arguments(parent_object, values, context, &block)
  # Cache this hash to avoid re-merging it
  arg_defns = context.types.arguments(self)
  total_args_count = arg_defns.size

  finished_args = nil
  prepare_finished_args = -> {
    if total_args_count == 0
      finished_args = GraphQL::Execution::Interpreter::Arguments::EMPTY
      if block_given?
        block.call(finished_args)
      end
    else
      argument_values = {}
      resolved_args_count = 0
      raised_error = false
      arg_defns.each do |arg_defn|
        context.dataloader.append_job do
          begin
            arg_defn.coerce_into_values(parent_object, values, context, argument_values)
          rescue GraphQL::ExecutionError, GraphQL::UnauthorizedError => err
            raised_error = true
            finished_args = err
            if block_given?
              block.call(finished_args)
            end
          end

          resolved_args_count += 1
          if resolved_args_count == total_args_count && !raised_error
            finished_args = context.schema.after_any_lazies(argument_values.values) {
              GraphQL::Execution::Interpreter::Arguments.new(
                argument_values: argument_values,
              )
            }
            if block_given?
              block.call(finished_args)
            end
          end
        end
      end
    end
  }

  if block_given?
    prepare_finished_args.call
    nil
  else
    # This API returns eagerly, gotta run it now
    context.dataloader.run_isolated(&prepare_finished_args)
    finished_args
  end
end

#get_argument(argument_name, context = GraphQL::Query::NullContext.instance) ⇒ GraphQL::Schema::Argument?

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.

Returns Argument defined on this thing, fetched by name.

Returns:

  • Argument defined on this thing, fetched by name.

API:

  • private



234
235
236
237
238
239
240
241
242
243
# File 'lib/graphql/schema/member/has_arguments.rb', line 234

def get_argument(argument_name, context = GraphQL::Query::NullContext.instance)
  warden = Warden.from_context(context)
  if (arg_config = own_arguments[argument_name]) && ((context.respond_to?(:types) && context.types.is_a?(GraphQL::Schema::Visibility::Profile)) || (visible_arg = Warden.visible_entry?(:visible_argument?, arg_config, context, warden)))
    visible_arg || arg_config
  elsif defined?(@resolver_class) && @resolver_class
    @resolver_class.get_field_argument(argument_name, context)
  else
    nil
  end
end

#own_argumentsObject

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.

API:

  • private



451
452
453
# File 'lib/graphql/schema/member/has_arguments.rb', line 451

def own_arguments
  @own_arguments || NO_ARGUMENTS
end

#remove_argument(arg_defn) ⇒ Object

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.

API:

  • private



86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/graphql/schema/member/has_arguments.rb', line 86

def remove_argument(arg_defn)
  prev_defn = @own_arguments[arg_defn.name]
  case prev_defn
  when nil
    # done
  when Array
    prev_defn.delete(arg_defn)
  when GraphQL::Schema::Argument
    @own_arguments.delete(arg_defn.name)
  else
    raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
  end
  nil
end

#validate_directive_argument(arg_defn, value) ⇒ Object

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.

Usually, this is validated statically by RequiredArgumentsArePresent, but not for directives. TODO apply static validations on schema definitions?

API:

  • private



316
317
318
319
# File 'lib/graphql/schema/member/has_arguments.rb', line 316

def validate_directive_argument(arg_defn, value)
  # this is only implemented on directives.
  nil
end