graphql-rb 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea68c93a7c58f20140405e57455f817f587a89f7
4
- data.tar.gz: 1c70ce478b3283ed412d7d27c0c373d039907579
3
+ metadata.gz: e7b3163d3f0025e46cd6b51b90b2e4816e15ee36
4
+ data.tar.gz: 7fb736049261de9c5051281f51c2088cbc217076
5
5
  SHA512:
6
- metadata.gz: 226d8b3ec2ddfa287937c239caaaaa845a6e226fd821ac514d15de6ee0e12b40716286ef083b74f87f6302129abc2d0049fe1c5ab2cec231730ae296cb938060
7
- data.tar.gz: 90420d7f666c395dfb827f27d24b6ead1ac7f8faaa5b342940b046cf9124485df6a8aac1f903ab22d307bec5cb48db01c0707c871d26c88c2e91638e508bf65b
6
+ metadata.gz: ce7bd2ef2e8c9cf05288df3258f05f5d2dc73ac50cb4f4bf152fab41d643c7d4e021be3ea62de19618bcd92566760f223c846eb7f06d3b6265b7d7cc445ceddf
7
+ data.tar.gz: d54360b65c917072a7eca4e2b7982da20075102b34b9b9a6636873cd6e68b764b2fd3e0896d17273228a60f4adbd46b171456e408b3ca536c579bd84b05ed05d
@@ -0,0 +1,34 @@
1
+ require 'celluloid/current'
2
+
3
+ module GraphQL
4
+ module Execution
5
+
6
+ class Pool
7
+ def self.future(&block)
8
+ _pool.future.perform(block)
9
+ end
10
+
11
+ protected
12
+
13
+ class Worker
14
+ include Celluloid
15
+
16
+ def perform(block)
17
+ value = block.call
18
+ value = value.value if value.is_a?(Celluloid::Future)
19
+ value
20
+ end
21
+ end
22
+
23
+ def self._pool
24
+ Celluloid::Actor[pool_id] ||= Worker.pool
25
+ end
26
+
27
+ def self.pool_id
28
+ @pool_id ||= SecureRandom.uuid
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -1,42 +1,6 @@
1
- require 'celluloid/current'
2
- require 'singleton'
3
-
4
1
  module GraphQL
5
2
  class Executor
6
3
 
7
- class FutureCompleter
8
- include Celluloid
9
- include Singleton
10
-
11
- def self.complete_value(context, field_type, resolved_object, selection_set)
12
- completer = resolved_object.is_a?(Celluloid::Future) ? instance.future : instance
13
- completer.complete_value(context, field_type, resolved_object, selection_set)
14
- end
15
-
16
- def complete_value(context, field_type, resolved_object, selection_set)
17
- return nil if resolved_object.nil?
18
-
19
- resolved_object = resolved_object.value if resolved_object.is_a?(Celluloid::Future)
20
-
21
- case field_type
22
- when GraphQLNonNull
23
- completed_object = complete_value(context, field_type.of_type, resolved_object, selection_set)
24
- raise "Field error: expecting non null value" if completed_object.nil?
25
- completed_object
26
- when GraphQLList
27
- resolved_object.map do |item|
28
- complete_value(context, field_type.of_type, item, selection_set)
29
- end
30
- when GraphQLScalarType, GraphQLEnumType
31
- field_type.serialize(resolved_object)
32
- when GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType
33
- field_type = field_type.resolve_type(resolved_object) if field_type.is_a?(GraphQLAbstractType)
34
- selection_set.evaluate(context, field_type, resolved_object)
35
- end
36
-
37
- end
38
- end
39
-
40
4
  attr_reader :document, :schema, :context
41
5
 
42
6
  def initialize(document, schema)
@@ -44,7 +8,8 @@ module GraphQL
44
8
  @schema = schema
45
9
  @context = {
46
10
  document: document,
47
- schema: schema
11
+ schema: schema,
12
+ errors: []
48
13
  }
49
14
  end
50
15
 
@@ -60,23 +25,26 @@ module GraphQL
60
25
  context[:root] = root
61
26
  context[:params] = params
62
27
 
63
- materialize(operation.evaluate(context))
28
+ return materialize(operation.evaluate(context)), context[:errors]
64
29
  end
65
30
 
66
31
  def materialize(data)
67
32
  case data
33
+ when Celluloid::Future
34
+ materialize(data.value)
68
35
  when Hash
69
- data.each do |key, value|
70
- data[key] = value.value if value.is_a?(Celluloid::Future)
71
- materialize(data[key])
36
+ data.reduce({}) do |memo, pair|
37
+ memo[pair.first] = materialize(pair.last)
38
+ memo
72
39
  end
73
40
  when Array
74
- data.each_with_index do |value, i|
75
- data[i] = value.value if value.is_a?(Celluloid::Future)
76
- materialize(data[i])
41
+ data.each_with_index.reduce([]) do |memo, pair|
42
+ memo[pair.last] = materialize(pair.first)
43
+ memo
77
44
  end
45
+ else
46
+ data
78
47
  end
79
- data
80
48
  end
81
49
 
82
50
  end
@@ -12,33 +12,32 @@ module GraphQL
12
12
  # objectType, object, - fields
13
13
  # + context[schema, document]
14
14
  #
15
- # TODO: think of way to have error accessor at this point. Executor?
16
15
  #
17
16
  def evaluate(context, object_type, object)
18
- grouped_fields = collect_fields(context, object_type)
19
-
20
- #
21
- # TODO: Merge equal fields
22
- #
23
-
24
- grouped_fields.reduce({}) do |memo, (key, fields)|
25
- field = fields.first
26
- field_definition = case
27
- when GraphQL::Introspection.meta_field?(field.name)
28
- GraphQL::Introspection.meta_field(field.name)
29
- else
30
- object_type.field(field.name)
31
- end
17
+ Execution::Pool.future do
32
18
 
33
- unless field_definition.nil?
34
- resolve_context = context.merge({ parent_type: object_type })
19
+ collect_fields(context, object_type).reduce({}) do |memo, (key, fields)|
20
+ field = fields.first
21
+ field_definition = case
35
22
 
36
- resolved_object = field.resolve(context, object_type, object)
37
- selection_set = merge_selection_sets(fields)
38
- memo[key.to_sym] = Executor::FutureCompleter.complete_value(context, field_definition.type, resolved_object, selection_set)
39
- end
23
+ when GraphQL::Introspection.meta_field?(field.name)
24
+ GraphQL::Introspection.meta_field(field.name)
25
+ else
26
+ object_type.field(field.name)
27
+ end
40
28
 
41
- memo
29
+
30
+ memo[key.to_sym] = begin
31
+ resolution_context = context.merge({ parent_type: object_type })
32
+ resolved_object = field.resolve(resolution_context, object_type, object)
33
+ complete_value(context, field_definition.type, resolved_object, merge_selection_sets(fields))
34
+ rescue Celluloid::TaskTerminated => e
35
+ context[:errors] << "Field '#{field.name}' of '#{object_type}' error: #{e}"
36
+ nil
37
+ end unless field_definition.nil?
38
+
39
+ memo
40
+ end
42
41
  end
43
42
  end
44
43
 
@@ -102,6 +101,32 @@ module GraphQL
102
101
  SelectionSet.new(selections)
103
102
  end
104
103
 
104
+
105
+ def complete_value(context, field_type, resolved_object, selection_set)
106
+ return nil if resolved_object.nil?
107
+
108
+ return Execution::Pool.future do
109
+ complete_value(context, field_type, resolved_object.value, selection_set)
110
+ end if resolved_object.is_a?(Celluloid::Future)
111
+
112
+ case field_type
113
+ when GraphQLNonNull
114
+ completed_object = complete_value(context, field_type.of_type, resolved_object, selection_set)
115
+ raise "Field error: expecting non null value" if completed_object.nil?
116
+ completed_object
117
+ when GraphQLList
118
+ resolved_object.map do |item|
119
+ complete_value(context, field_type.of_type, item, selection_set)
120
+ end
121
+ when GraphQLScalarType, GraphQLEnumType
122
+ field_type.serialize(resolved_object)
123
+ when GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType
124
+ field_type = field_type.resolve_type(resolved_object) if field_type.is_a?(GraphQLAbstractType)
125
+ selection_set.evaluate(context, field_type, resolved_object)
126
+ end
127
+
128
+ end
129
+
105
130
  end
106
131
  end
107
132
  end
@@ -1,3 +1,3 @@
1
1
  module GraphQL
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
data/lib/graphql.rb CHANGED
@@ -6,14 +6,15 @@ require 'graphql/language'
6
6
  require 'graphql/version'
7
7
  require 'graphql/executor'
8
8
  require 'graphql/validator'
9
+ require 'graphql/execution/pool'
9
10
 
10
11
  module GraphQL
11
12
 
12
- def self.graphql(schema, query, root, params, operation = nil)
13
- document = GraphQL::Language.parse(query)
14
- executor = GraphQL::Executor.new(document, schema)
15
- result = executor.execute(root, params, operation)
16
- { data: result }
13
+ def self.graphql(schema, query, root = nil, params = {}, operation = nil)
14
+ document = GraphQL::Language.parse(query)
15
+ executor = GraphQL::Executor.new(document, schema)
16
+ result, errors = executor.execute(root, params, operation)
17
+ { data: result }.tap { |result| result[:errors] = errors unless errors.empty? }
17
18
  rescue StandardError => e
18
19
  { errors: [e] }
19
20
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugene Kovalev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-18 00:00:00.000000000 Z
11
+ date: 2015-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -109,6 +109,7 @@ files:
109
109
  - lib/graphql/configuration/slot.rb
110
110
  - lib/graphql/errors.rb
111
111
  - lib/graphql/errors/error.rb
112
+ - lib/graphql/execution/pool.rb
112
113
  - lib/graphql/executor.rb
113
114
  - lib/graphql/introspection.rb
114
115
  - lib/graphql/introspection/meta_fields.rb
@@ -172,9 +173,9 @@ require_paths:
172
173
  - lib
173
174
  required_ruby_version: !ruby/object:Gem::Requirement
174
175
  requirements:
175
- - - ">="
176
+ - - "~>"
176
177
  - !ruby/object:Gem::Version
177
- version: '0'
178
+ version: '2.0'
178
179
  required_rubygems_version: !ruby/object:Gem::Requirement
179
180
  requirements:
180
181
  - - ">="