Class: GraphQL::Language::Nodes::AbstractNode

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

Overview

AbstractNode is the base class for all nodes in a GraphQL AST.

It provides some APIs for working with ASTs:

  • children returns all AST nodes attached to this one. Used for tree traversal.
  • scalars returns all scalar (Ruby) values attached to this one. Used for comparing nodes.
  • to_query_string turns an AST node into a GraphQL string

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ AbstractNode

Initialize a node by extracting its position, then calling the class's initialize_node method.

Parameters:

  • options (Hash) (defaults to: {})

    Initial attributes for this node


18
19
20
21
22
23
24
25
26
27
# File 'lib/graphql/language/nodes.rb', line 18

def initialize(options={})
  if options.key?(:position_source)
    position_source = options.delete(:position_source)
    @line, @col = position_source.line_and_column
  end

  @filename = options.delete(:filename)

  initialize_node(options)
end

Instance Attribute Details

#colObject

Returns the value of attribute col


13
14
15
# File 'lib/graphql/language/nodes.rb', line 13

def col
  @col
end

#filenameObject

Returns the value of attribute filename


13
14
15
# File 'lib/graphql/language/nodes.rb', line 13

def filename
  @filename
end

#lineObject

Returns the value of attribute line


13
14
15
# File 'lib/graphql/language/nodes.rb', line 13

def line
  @line
end

Class Method Details

.child_attributes(*attr_names) ⇒ Object

define attr_names as places where child nodes may be attached to this node


71
72
73
74
# File 'lib/graphql/language/nodes.rb', line 71

def child_attributes(*attr_names)
  @child_attributes ||= []
  @child_attributes += attr_names
end

.inherited(subclass) ⇒ Object

A node subclass inherits scalar_attributes and child_attributes from its parent


59
60
61
62
# File 'lib/graphql/language/nodes.rb', line 59

def inherited(subclass)
  subclass.scalar_attributes(*@scalar_attributes)
  subclass.child_attributes(*@child_attributes)
end

.scalar_attributes(*attr_names) ⇒ Object

define attr_names as places where scalars may be attached to this node


65
66
67
68
# File 'lib/graphql/language/nodes.rb', line 65

def scalar_attributes(*attr_names)
  @scalar_attributes ||= []
  @scalar_attributes += attr_names
end

Instance Method Details

#childrenArray<GraphQL::Language::Nodes::AbstractNode>

Returns all nodes in the tree below this one

Returns:


44
45
46
47
48
# File 'lib/graphql/language/nodes.rb', line 44

def children
  self.class.child_attributes
    .map { |attr_name| public_send(attr_name) }
    .flatten
end

#eql?(other) ⇒ Boolean

Value equality

Returns:

  • (Boolean)

    True if self is equivalent to other


36
37
38
39
40
41
# File 'lib/graphql/language/nodes.rb', line 36

def eql?(other)
  return true if equal?(other)
  other.is_a?(self.class) &&
    other.scalars.eql?(self.scalars) &&
    other.children.eql?(self.children)
end

#initialize_node(options = {}) ⇒ Object

This is called with node-specific options

Raises:

  • (NotImplementedError)

30
31
32
# File 'lib/graphql/language/nodes.rb', line 30

def initialize_node(options={})
  raise NotImplementedError
end

#positionObject


77
78
79
# File 'lib/graphql/language/nodes.rb', line 77

def position
  [line, col]
end

#scalarsArray<Integer, Float, String, Boolean, Array>

Returns Scalar values attached to this node

Returns:

  • (Array<Integer, Float, String, Boolean, Array>)

    Scalar values attached to this node


51
52
53
54
# File 'lib/graphql/language/nodes.rb', line 51

def scalars
  self.class.scalar_attributes
    .map { |attr_name| public_send(attr_name) }
end

#to_query_string(printer: GraphQL::Language::Printer.new) ⇒ Object


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

def to_query_string(printer: GraphQL::Language::Printer.new)
  printer.print(self)
end