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

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

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.

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.

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:



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.



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:



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:

  • arg_name (Symbol) (defaults to: nil)

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

  • type_expr (defaults to: nil)

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

  • desc (String) (defaults to: nil)

    Argument description, description: keyword also accepted

  • definition_block (Proc)

    Called with the newly-created Argument

  • kwargs (Hash)

    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:



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:

  • new_arg_class (Class) (defaults to: nil)

    A class to use for building argument definitions



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<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions.

Returns:

  • (Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions)

    Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions



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:



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:



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:



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.



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.



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?



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