gql 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 40a578a7c57911bdf4d1b7c062259f3e47bfee30
4
- data.tar.gz: 8dbc6b5ddf034a2fa5f939aa401c1ea2c031412a
3
+ metadata.gz: e3b82548839c3920e499f9256cab69aa5ba31081
4
+ data.tar.gz: c1631dc4bac082ad2086eadbe816791971f45b57
5
5
  SHA512:
6
- metadata.gz: f13475e99d0efe4cac42faecb6d8128d861dbb74bd89ae971adf2613d17d47a5d8108be0bcf412eb8b00fbdfd41e1deae26a0291c5424012a1518df73929f0d2
7
- data.tar.gz: b47a428fd3e2235fb38c81434651ffa06195f8b98c40abb0215b0e1d039a02346c7e0153a4735f2de09a5d23db6f04e0cac9793d5b69ffa42540cc9730196356
6
+ metadata.gz: 71d53e0856f5c0937d980deb1e1f27351dd9f76c84a6a9f449d23a26483bfd2745323c5d39fde5a480783f052389daf9ee5f690fc071f3eabc3bed3ebe308f8b
7
+ data.tar.gz: 0247f336c99c7365ebe800e1df5213cbdc9d525d1f4cf9ceb44b689b60547fe99a7126a9ed7ebc59400b6264a6af0397a505808f8ee8f2e03e31de3300f15c20
@@ -2,21 +2,24 @@ module GQL
2
2
  class Call
3
3
  attr_reader :target, :context
4
4
 
5
- def initialize(caller, ast_node, target, definition, variables, context)
5
+ def initialize(caller, ast_node, target, variables, context)
6
6
  @caller, @ast_node, @target = caller, ast_node, target
7
- @definition, @variables, @context = definition, variables, context
7
+ @variables, @context = variables, context
8
8
  end
9
9
 
10
10
  def execute
11
- args = @ast_node.arguments.map { |arg| arg.is_a?(Symbol) ? @variables[arg] : arg }
12
- target = instance_exec(*args, &@definition[:body])
11
+ args = substitute_variables(@ast_node.arguments)
12
+ target = instance_exec(*args, &self.class.const_get(:Function))
13
13
 
14
- node_class = @definition[:returns] || @caller.class
14
+ result_class = self.class.const_get(:Result) || @caller.class
15
15
 
16
- raise Errors::InvalidNodeClass.new(node_class, Node) unless node_class < Node
17
-
18
- node = node_class.new(@ast_node, target, @variables, context)
19
- node.__value
16
+ result = result_class.new(@ast_node, target, @variables, context)
17
+ result.__value
20
18
  end
19
+
20
+ private
21
+ def substitute_variables(args)
22
+ args.map { |arg| arg.is_a?(Symbol) ? @variables[arg] : arg }
23
+ end
21
24
  end
22
25
  end
@@ -25,7 +25,11 @@ module GQL
25
25
 
26
26
  EdgesField.class_eval do
27
27
  def __value
28
- __target
28
+ if @ast_node.fields
29
+ __target
30
+ else
31
+ nil
32
+ end
29
33
  end
30
34
  end
31
35
  end
@@ -23,7 +23,7 @@ module GQL
23
23
  class UndefinedType < SchemaError
24
24
  def initialize(name)
25
25
  types = Schema.fields.keys.sort.map { |name| "`#{name}`" }
26
- types = types.size > 0 ? " Available types are #{types.to_sentence}." : ''
26
+ types = types.size > 0 ? " Available types: #{types.to_sentence}." : ''
27
27
 
28
28
  super("The field type `#{name}` is not known to the schema. Define it with `GQL::Schema.fields[my_type] = MyFieldType`.#{types}")
29
29
  end
@@ -31,8 +31,8 @@ module GQL
31
31
 
32
32
  class UndefinedCall < SchemaError
33
33
  def initialize(name, node_class)
34
- calls = node_class.call_definitions.keys.sort.map { |name| "`#{name}`" }
35
- calls = calls.size > 0 ? " Available calls are #{calls.to_sentence}." : ''
34
+ calls = node_class.call_classes.keys.sort.map { |name| "`#{name}`" }
35
+ calls = calls.size > 0 ? " Available calls: #{calls.to_sentence}." : ''
36
36
 
37
37
  super("#{node_class} has no call named `#{name}`.#{calls}")
38
38
  end
@@ -41,7 +41,7 @@ module GQL
41
41
  class UndefinedField < SchemaError
42
42
  def initialize(name, node_class)
43
43
  fields = node_class.field_classes.keys.sort.map { |name| "`#{name}`" }
44
- fields = fields.size > 0 ? " Available fields are #{fields.to_sentence}." : ''
44
+ fields = fields.size > 0 ? " Available fields: #{fields.to_sentence}." : ''
45
45
 
46
46
  super("#{node_class} has no field named `#{name}`.#{fields}")
47
47
  end
@@ -10,20 +10,14 @@ module GQL
10
10
  end
11
11
 
12
12
  def __raw_value
13
- raise Errors::InvalidNodeClass.new(__connection_class__, GQL::Connection) unless __connection_class__ < GQL::Connection
13
+ connection_class = self.class.const_get(:CONNECTION_CLASS)
14
+ node_class = self.class.const_get(:NODE_CLASS)
14
15
 
15
- connection = __connection_class__.new(__node_class__, @ast_node, __target, @variables, __context)
16
+ raise Errors::InvalidNodeClass.new(connection_class, GQL::Connection) unless connection_class <= GQL::Connection
17
+
18
+ connection = connection_class.new(node_class, @ast_node, __target, @variables, __context)
16
19
  connection.__value
17
20
  end
18
-
19
- private
20
- def __connection_class__
21
- self.class.const_get :CONNECTION_CLASS
22
- end
23
-
24
- def __node_class__
25
- self.class.const_get :NODE_CLASS
26
- end
27
21
  end
28
22
  end
29
23
  end
@@ -3,8 +3,8 @@ require 'active_support/core_ext/string/inflections'
3
3
 
4
4
  module GQL
5
5
  class Node
6
- class_attribute :call_definitions
7
- self.call_definitions = {}
6
+ class_attribute :call_classes
7
+ self.call_classes = {}
8
8
 
9
9
  class_attribute :field_classes
10
10
  self.field_classes = {}
@@ -17,12 +17,30 @@ module GQL
17
17
  end
18
18
 
19
19
  def call(name, options = {}, &block)
20
- definition = {
21
- returns: options[:returns],
22
- body: block || lambda { |*args| __target.public_send(name, *args) }
23
- }
20
+ result_class = options[:returns]
21
+ function = block || lambda { |*args| target.public_send(name, *args) }
24
22
 
25
- self.call_definitions = call_definitions.merge(name => definition)
23
+ if result_class.is_a? Array
24
+ result_class.unshift Connection if result_class.size == 1
25
+ result_class.unshift Fields::Connection if result_class.size == 2
26
+
27
+ field_class, connection_class, node_class = result_class
28
+
29
+ raise Errors::InvalidNodeClass.new(field_class, Fields::Connection) unless field_class <= Fields::Connection
30
+
31
+ result_class = Class.new(field_class)
32
+ result_class.const_set :NODE_CLASS, node_class
33
+ result_class.const_set :CONNECTION_CLASS, connection_class
34
+ else
35
+ raise Errors::InvalidNodeClass.new(result_class, Node) unless result_class.nil? || result_class < Node
36
+ end
37
+
38
+ call_class = Class.new(Call)
39
+ call_class.const_set :Function, function
40
+ call_class.const_set :Result, result_class
41
+
42
+ self.const_set "#{name.to_s.camelize}Call", call_class
43
+ self.call_classes = call_classes.merge(name => call_class)
26
44
  end
27
45
 
28
46
  def fields(&block)
@@ -31,8 +49,12 @@ module GQL
31
49
 
32
50
  def field(*names, base_class: nil, node_class: nil, connection_class: nil)
33
51
  classes = names.reduce({}) do |result, name|
34
- field_class = Class.new(base_class || Field)
35
- field_class.const_set :NAME, name
52
+ base_class ||= Field
53
+
54
+ raise Errors::InvalidNodeClass.new(base_class, Field) unless base_class <= Field
55
+
56
+ field_class = Class.new(base_class)
57
+
36
58
  field_class.const_set :NODE_CLASS, node_class
37
59
  field_class.const_set :CONNECTION_CLASS, connection_class
38
60
 
@@ -57,10 +79,6 @@ module GQL
57
79
  end
58
80
  end
59
81
 
60
- call :_identity do
61
- target
62
- end
63
-
64
82
  attr_reader :__target, :__context
65
83
 
66
84
  def initialize(ast_node, target, variables, context)
@@ -70,11 +88,11 @@ module GQL
70
88
 
71
89
  def __value
72
90
  if ast_call = @ast_node.call
73
- definition = self.class.call_definitions[ast_call.name]
91
+ call_class = self.class.call_classes[ast_call.name]
74
92
 
75
- raise Errors::UndefinedCall.new(ast_call.name, self.class) if definition.nil?
93
+ raise Errors::UndefinedCall.new(ast_call.name, self.class.superclass) if call_class.nil?
76
94
 
77
- call = Call.new(self, ast_call, __target, definition, @variables, __context)
95
+ call = call_class.new(self, ast_call, __target, @variables, __context)
78
96
  call.execute
79
97
  elsif ast_fields = @ast_node.fields
80
98
  ast_fields.reduce({}) do |memo, ast_field|
@@ -91,7 +109,8 @@ module GQL
91
109
  target = public_send(ast_field.name)
92
110
  field_class = self.class.field_classes[ast_field.name]
93
111
 
94
- raise Errors::InvalidNodeClass.new(field_class.superclass, Field) unless field_class < Field
112
+ raise Errors::UndefinedField.new(ast_field.name, self.class) if field_class.nil?
113
+ raise Errors::InvalidNodeClass.new(field_class.superclass, Field) unless field_class <= Field
95
114
 
96
115
  field = field_class.new(ast_field, target, @variables, __context)
97
116
  field.__value
@@ -1,3 +1,3 @@
1
1
  module GQL
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Andert