Class: GraphQL::Nodes::AbstractNode

Inherits:
Object
  • Object
show all
Defined in:
lib/graph_ql/parser/nodes.rb

Overview

AbstractNode creates classes who:

  • require their keyword arguments, throw ArgumentError if they don’t match

  • expose accessors for keyword arguments

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ AbstractNode

Returns a new instance of AbstractNode.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/graph_ql/parser/nodes.rb', line 6

def initialize(options)
  required_keys = self.class.required_attrs

  extra_keys = options.keys - required_keys
  if extra_keys.any?
    raise ArgumentError, "#{self.class.name} Extra arguments: #{extra_keys}"
  end

  required_keys.each do |attr|
    if !options.has_key?(attr)
      raise ArgumentError, "#{self.class.name} Missing argument: #{attr}"
    else
      value = options[attr]
      self.send("#{attr}=", value)
    end
  end
end

Class Attribute Details

.required_attrsObject (readonly)

Returns the value of attribute required_attrs.



32
33
34
# File 'lib/graph_ql/parser/nodes.rb', line 32

def required_attrs
  @required_attrs
end

Class Method Details

.attr_required(*attr_names) ⇒ Object



33
34
35
36
37
# File 'lib/graph_ql/parser/nodes.rb', line 33

def attr_required(*attr_names)
  @required_attrs ||= []
  @required_attrs += attr_names
  attr_accessor(*attr_names)
end

.create(*attr_names, &block) ⇒ Object

Create a new AbstractNode child which requires and exposes attr_names.



41
42
43
44
45
# File 'lib/graph_ql/parser/nodes.rb', line 41

def create(*attr_names, &block)
  cls = Class.new(self, &block)
  cls.attr_required(*attr_names)
  cls
end

Instance Method Details

#childrenObject



24
25
26
27
28
29
# File 'lib/graph_ql/parser/nodes.rb', line 24

def children
  self.class.required_attrs
    .map { |attr| send(attr) }
    .flatten # eg #fields is a list of children
    .select { |val| val.is_a?(GraphQL::Nodes::AbstractNode) }
end