Class: GraphQL::Field

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(query: nil, owner: nil, calls: [], fields: []) ⇒ Field

Returns a new instance of Field.



3
4
5
6
7
8
# File 'lib/graphql/field.rb', line 3

def initialize(query: nil, owner: nil, calls: [], fields: [])
  @query = query
  @owner = owner
  @calls = calls
  @fields = fields
end

Instance Attribute Details

#callsObject (readonly)

Returns the value of attribute calls.



2
3
4
# File 'lib/graphql/field.rb', line 2

def calls
  @calls
end

#fieldsObject (readonly)

Returns the value of attribute fields.



2
3
4
# File 'lib/graphql/field.rb', line 2

def fields
  @fields
end

#ownerObject (readonly)

Returns the value of attribute owner.



2
3
4
# File 'lib/graphql/field.rb', line 2

def owner
  @owner
end

#queryObject (readonly)

Returns the value of attribute query.



2
3
4
# File 'lib/graphql/field.rb', line 2

def query
  @query
end

Class Method Details

._callsObject



107
108
109
# File 'lib/graphql/field.rb', line 107

def _calls
  @calls ||= {}
end

.call(name, lambda) ⇒ Object



111
112
113
# File 'lib/graphql/field.rb', line 111

def call(name, lambda)
  _calls[name.to_s] = GraphQL::Call.new(name: name.to_s, lambda: lambda)
end

.callsObject



101
102
103
104
105
# File 'lib/graphql/field.rb', line 101

def calls
  superclass.calls.merge(_calls)
rescue NoMethodError
  {}
end

.create_class(name:, owner_class:, type:, description: nil, connection_class_name: nil, node_class_name: nil) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/graphql/field.rb', line 53

def create_class(name:, owner_class:, type:, description: nil, connection_class_name: nil, node_class_name: nil)
  if type.is_a?(Symbol)
    type = GraphQL::SCHEMA.get_field(type)
  end

  field_superclass = type || self
  new_class = Class.new(field_superclass)
  new_class.const_set :NAME, name
  new_class.const_set :OWNER_CLASS, owner_class
  new_class.const_set :DESCRIPTION , description
  new_class.const_set :CONNECTION_CLASS_NAME, connection_class_name
  new_class.const_set :NODE_CLASS_NAME, node_class_name
  new_class
end

.default_schema_nameObject



89
90
91
# File 'lib/graphql/field.rb', line 89

def default_schema_name
  name.split("::").last.sub(/Field$/, '').underscore
end

.descriptionObject



97
98
99
# File 'lib/graphql/field.rb', line 97

def description
  const_get(:DESCRIPTION)
end

.field_nameObject



93
94
95
# File 'lib/graphql/field.rb', line 93

def field_name
  const_get(:NAME)
end

.inherited(child_class) ⇒ Object



49
50
51
# File 'lib/graphql/field.rb', line 49

def inherited(child_class)
  GraphQL::SCHEMA.add_field(child_class)
end

.schema_nameObject



85
86
87
# File 'lib/graphql/field.rb', line 85

def schema_name
  @value_type || (name.present? ? default_schema_name : nil)
end

.to_sObject



68
69
70
71
72
73
74
# File 'lib/graphql/field.rb', line 68

def to_s
  if const_defined?(:NAME)
    "<FieldClass: #{const_get(:OWNER_CLASS).name}::#{const_get(:NAME)}>"
  else
    super
  end
end

.type(value_type_name) ⇒ Object



76
77
78
79
# File 'lib/graphql/field.rb', line 76

def type(value_type_name)
  @value_type = value_type_name.to_s
  GraphQL::SCHEMA.add_field(self)
end

.value_typeObject



81
82
83
# File 'lib/graphql/field.rb', line 81

def value_type
  @value_type || superclass.value_type
end

Instance Method Details

#as_resultObject



14
15
16
# File 'lib/graphql/field.rb', line 14

def as_result
  finished_value
end

#const_get(const_name) ⇒ Object

instance ‘const_get` reaches up to class namespace



33
34
35
36
37
# File 'lib/graphql/field.rb', line 33

def const_get(const_name)
  self.class.const_get(const_name)
rescue
  nil
end

#finished_valueObject



18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/graphql/field.rb', line 18

def finished_value
  @finished_value ||= begin
    val = raw_value
    calls.each do |call|
      registered_call = self.class.calls[call.identifier]
      if registered_call.nil?
        raise "Call not found: #{self.class.name}##{call.identifier}"
      end
      val = registered_call.lambda.call(val, *call.arguments)
    end
    val
  end
end

#methodObject



46
# File 'lib/graphql/field.rb', line 46

def method; name; end

#raw_valueObject



10
11
12
# File 'lib/graphql/field.rb', line 10

def raw_value
  owner.send(method)
end