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


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



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



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



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



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

inherited_value(:deprecation_reason)

.description(new_value = nil) ⇒ Object

Get or set this class's description



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



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:



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



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:



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)


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

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

#complexityInteger, Proc

Returns:

  • (Integer, Proc)


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

def complexity
  self.class.complexity || 1
end

#deprecation_reasonString?

Returns:

  • (String, nil)


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

def deprecation_reason
  self.class.deprecation_reason
end

#descriptionString?

Returns:

  • (String, nil)


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

def description
  self.class.description
end

#typeGraphQL::BaseType

Return type

Returns:



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

def type
  self.class.type
end