Class: GraphQL::Function

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/function.rb

Overview

A reusable container for field logic, including arguments, resolve, return type, and documentation.

Class-level values defined with the DSL will be inherited, so Functions can extend one another.

It’s OK to override the instance methods here in order to customize behavior of instances.

Examples:

A reusable GraphQL::Function attached as a field

class FindRecord < GraphQL::Function
  attr_reader :type

  def initialize(model:, type:)
    @model = model
    @type = type
  end

  argument :id, GraphQL::ID_TYPE

  def call(obj, args, ctx)
     @model.find(args.id)
  end
end

QueryType = GraphQL::ObjectType.define do
  name "Query"
  field :post, function: FindRecord.new(model: Post, type: PostType)
  field :comment, function: FindRecord.new(model: Comment, type: CommentType)
end

See Also:

  • for a replacement for `GraphQL::Function`

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.argument(*args, **kwargs, &block) ⇒ void

This method returns an undefined value.

Define an argument for this function & its subclasses

See Also:

  • same arguments as the `argument` definition helper
[View source]

68
69
70
71
72
# File 'lib/graphql/function.rb', line 68

def argument(*args, **kwargs, &block)
  argument = GraphQL::Argument.from_dsl(*args, **kwargs, &block)
  own_arguments[argument.name] = argument
  nil
end

.argumentsHash<String => GraphQL::Argument>

Returns Arguments for this function class, including inherited arguments

Returns:

  • (Hash<String => GraphQL::Argument>)

    Arguments for this function class, including inherited arguments

[View source]

75
76
77
78
79
80
81
# File 'lib/graphql/function.rb', line 75

def arguments
  if parent_function?
    own_arguments.merge(superclass.arguments)
  else
    own_arguments.dup
  end
end

.build_field(function) ⇒ Object

[View source]

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

def build_field(function)
  GraphQL::Field.define(
    arguments: function.arguments,
    complexity: function.complexity,
    type: function.type,
    resolve: function,
    description: function.description,
    function: function,
    deprecation_reason: function.deprecation_reason,
  )
end

.complexity(new_value = nil) ⇒ Object

Get or set this class’s complexity

[View source]

138
# File 'lib/graphql/function.rb', line 138

inherited_value(:complexity)

.deprecation_reason(new_value = nil) ⇒ Object

Get or set this class’s deprecation_reason

[View source]

135
# File 'lib/graphql/function.rb', line 135

inherited_value(:deprecation_reason)

.description(new_value = nil) ⇒ Object

Get or set this class’s description

[View source]

132
# File 'lib/graphql/function.rb', line 132

inherited_value(:description)

.inherited_value(name) ⇒ 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.

Class-level reader/writer which is inherited

[View source]

116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/graphql/function.rb', line 116

def self.inherited_value(name)
  self.class_eval <<-RUBY
    def #{name}(new_value = nil)
      if new_value
        @#{name} = new_value
      elsif parent_function?
        @#{name} || superclass.#{name}
      else
        @#{name}
      end
    end
  RUBY
end

.type(premade_type = nil, &block) ⇒ GraphQL::BaseType

Get or set the return type for this function class & descendants

Returns:

[View source]

90
91
92
93
94
95
96
97
98
99
100
# File 'lib/graphql/function.rb', line 90

def type(premade_type = nil, &block)
  if block_given?
    @type = GraphQL::ObjectType.define(&block)
  elsif premade_type
    @type = premade_type
  elsif parent_function?
    @type || superclass.type
  else
    @type
  end
end

.typesObject

Provides shorthand access to GraphQL’s built-in types

[View source]

84
85
86
# File 'lib/graphql/function.rb', line 84

def types
  GraphQL::Define::TypeDefiner.instance
end

Instance Method Details

#argumentsHash<String => GraphQL::Argument>

Returns Arguments, keyed by name

Returns:

[View source]

35
36
37
# File 'lib/graphql/function.rb', line 35

def arguments
  self.class.arguments
end

#call(obj, args, ctx) ⇒ Object

Returns This function’s resolver

Returns:

  • (Object)

    This function’s resolver

Raises:

  • (NotImplementedError)
[View source]

45
46
47
# File 'lib/graphql/function.rb', line 45

def call(obj, args, ctx)
  raise NotImplementedError
end

#complexityInteger, Proc

Returns:

  • (Integer, Proc)
[View source]

60
61
62
# File 'lib/graphql/function.rb', line 60

def complexity
  self.class.complexity || 1
end

#deprecation_reasonString?

Returns:

  • (String, nil)
[View source]

55
56
57
# File 'lib/graphql/function.rb', line 55

def deprecation_reason
  self.class.deprecation_reason
end

#descriptionString?

Returns:

  • (String, nil)
[View source]

50
51
52
# File 'lib/graphql/function.rb', line 50

def description
  self.class.description
end

#typeGraphQL::BaseType

Return type

Returns:

[View source]

40
41
42
# File 'lib/graphql/function.rb', line 40

def type
  self.class.type
end