Skip to content

Commit 2ab068c

Browse files
committed
Improved experimental executor code
1 parent d4de4a2 commit 2ab068c

File tree

12 files changed

+132
-90
lines changed

12 files changed

+132
-90
lines changed

graphql/execution/experimental/executor.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,26 @@
1-
import collections
2-
import functools
31
import logging
4-
import sys
52

63
from promise import Promise, promise_for_dict, promisify
74

85
from ...error import GraphQLError, GraphQLLocatedError
96
from ...pyutils.default_ordered_dict import DefaultOrderedDict
107
from ...pyutils.ordereddict import OrderedDict
118
from ...type import (GraphQLEnumType, GraphQLInterfaceType, GraphQLList,
12-
GraphQLNonNull, GraphQLObjectType, GraphQLScalarType,
13-
GraphQLSchema, GraphQLUnionType)
9+
GraphQLNonNull, GraphQLObjectType, GraphQLScalarType,
10+
GraphQLSchema, GraphQLUnionType)
1411
from ..base import (ExecutionContext, ExecutionResult, ResolveInfo, Undefined,
15-
collect_fields, default_resolve_fn, get_field_def,
16-
get_operation_root_type)
12+
collect_fields, default_resolve_fn, get_field_def,
13+
get_operation_root_type)
1714
from ..executors.sync import SyncExecutor
1815
from ..middleware import MiddlewareManager
19-
20-
from .resolver import type_resolver
2116
from .fragment import Fragment
17+
from .resolver import type_resolver
2218

2319
logger = logging.getLogger(__name__)
2420

2521

2622
def is_promise(obj):
27-
return type(obj) == Promise
23+
return isinstance(obj, Promise)
2824

2925

3026
def execute(schema, document_ast, root_value=None, context_value=None,

graphql/execution/experimental/fragment.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
from promise import promise_for_dict, Promise
2-
31
import functools
4-
from functools import partial
5-
from ...pyutils.cached_property import cached_property
6-
from ..values import get_argument_values, get_variable_values
7-
from ..base import collect_fields, ResolveInfo, Undefined, get_field_def
8-
from ..executor import is_promise
9-
10-
from ...pyutils.ordereddict import OrderedDict
11-
from ...pyutils.default_ordered_dict import DefaultOrderedDict
122

3+
from promise import Promise, promise_for_dict
134

14-
from ...type import GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLInterfaceType, GraphQLUnionType
5+
from ...pyutils.cached_property import cached_property
6+
from ...pyutils.default_ordered_dict import DefaultOrderedDict
7+
from ...pyutils.ordereddict import OrderedDict
8+
from ...type import (GraphQLInterfaceType, GraphQLList, GraphQLNonNull,
9+
GraphQLObjectType, GraphQLUnionType)
10+
from ..base import ResolveInfo, Undefined, collect_fields, get_field_def
11+
from ..executor import is_promise
12+
from ..values import get_argument_values, get_variable_values
1513

1614

1715
def get_base_type(type):
@@ -74,6 +72,7 @@ def get_resolvers(context, type, selection_set):
7472

7573

7674
class Fragment(object):
75+
7776
def __init__(self, type, selection_set, context=None):
7877
self.type = type
7978
self.selection_set = selection_set
@@ -147,6 +146,7 @@ def __eq__(self, other):
147146

148147

149148
class AbstractFragment(object):
149+
150150
def __init__(self, abstract_type, selection_set, context=None, info=None):
151151
self.abstract_type = abstract_type
152152
self.selection_set = selection_set

graphql/execution/experimental/resolver.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
1-
import itertools
2-
import sys
3-
import traceback
41
import collections
2+
import itertools
53
from functools import partial
64

7-
from ..base import default_resolve_fn
5+
from promise import Promise
6+
87
from ...error import GraphQLError, GraphQLLocatedError
98
from ...type import (GraphQLEnumType, GraphQLInterfaceType, GraphQLList,
109
GraphQLNonNull, GraphQLObjectType, GraphQLScalarType,
1110
GraphQLSchema, GraphQLUnionType)
11+
from ..base import default_resolve_fn
1212
from .fragment import Fragment
1313

14-
from promise import Promise
15-
1614

1715
def is_promise(value):
18-
return type(value) == Promise
16+
return isinstance(value, Promise)
1917

2018

2119
def on_complete_resolver(on_error, __func, exe_context, info, __resolver, *args, **kwargs):
@@ -24,11 +22,10 @@ def on_complete_resolver(on_error, __func, exe_context, info, __resolver, *args,
2422
if is_promise(result):
2523
return result.then(__func).catch(on_error)
2624
return __func(result)
27-
except Exception, e:
25+
except Exception as e:
2826
return on_error(e)
2927

3028

31-
3229
def complete_list_value(inner_resolver, exe_context, info, on_error, result):
3330
if result is None:
3431
return None
@@ -71,7 +68,8 @@ def complete_object_value(fragment_resolve, exe_context, on_error, result):
7168

7269

7370
def field_resolver(field, fragment=None, exe_context=None, info=None):
74-
return type_resolver(field.type, field.resolver or default_resolve_fn, fragment, exe_context, info, catch_error=True)
71+
return type_resolver(field.type, field.resolver or default_resolve_fn,
72+
fragment, exe_context, info, catch_error=True)
7573

7674

7775
def type_resolver(return_type, resolver, fragment=None, exe_context=None, info=None, catch_error=False):
@@ -107,12 +105,16 @@ def on_error(exe_context, info, catch_error, e):
107105

108106
def type_resolver_fragment(return_type, resolver, fragment, exe_context, info, catch_error):
109107
on_complete_type_error = partial(on_error, exe_context, info, catch_error)
110-
complete_object_value_resolve = partial(complete_object_value, fragment.resolve, exe_context, on_complete_type_error)
108+
complete_object_value_resolve = partial(
109+
complete_object_value,
110+
fragment.resolve,
111+
exe_context,
112+
on_complete_type_error)
111113
on_resolve_error = partial(on_error, exe_context, info, catch_error)
112114
return partial(on_complete_resolver, on_resolve_error, complete_object_value_resolve, exe_context, info, resolver)
113115

114116

115-
def type_resolver_non_null(return_type, resolver, fragment, exe_context, info): # no catch_error
117+
def type_resolver_non_null(return_type, resolver, fragment, exe_context, info): # no catch_error
116118
resolver = type_resolver(return_type.of_type, resolver, fragment, exe_context, info)
117119
nonnull_complete = partial(complete_nonnull_value, exe_context, info)
118120
on_resolve_error = partial(on_error, exe_context, info, False)

graphql/execution/experimental/tests/test_benchmark.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,38 @@
11
import pytest
22

3-
from ....language import ast
4-
from ....type import (GraphQLEnumType, GraphQLInterfaceType, GraphQLList,
5-
GraphQLNonNull, GraphQLObjectType, GraphQLScalarType,
6-
GraphQLSchema, GraphQLUnionType, GraphQLString, GraphQLInt, GraphQLField)
7-
from ..resolver import type_resolver, Fragment
8-
93
from promise import Promise
104

5+
from ....language import ast
6+
from ....type import (GraphQLEnumType, GraphQLField, GraphQLInt,
7+
GraphQLInterfaceType, GraphQLList, GraphQLNonNull,
8+
GraphQLObjectType, GraphQLScalarType, GraphQLSchema,
9+
GraphQLString, GraphQLUnionType)
10+
from ..resolver import Fragment, type_resolver
1111

1212
SIZE = 10000
1313

14+
1415
def test_querybuilder_big_list_of_ints(benchmark):
1516
big_int_list = [x for x in range(SIZE)]
1617

1718
resolver = type_resolver(GraphQLList(GraphQLInt), lambda: big_int_list)
1819
result = benchmark(resolver)
19-
20+
2021
assert result == big_int_list
2122

2223

2324
def test_querybuilder_big_list_of_nested_ints(benchmark):
2425
big_int_list = [x for x in range(SIZE)]
2526

26-
Node = GraphQLObjectType('Node', fields={'id': GraphQLField(GraphQLInt, resolver=lambda obj, args, context, info: obj)})
27+
Node = GraphQLObjectType(
28+
'Node',
29+
fields={
30+
'id': GraphQLField(
31+
GraphQLInt,
32+
resolver=lambda obj,
33+
args,
34+
context,
35+
info: obj)})
2736
selection_set = ast.SelectionSet(selections=[
2837
ast.Field(
2938
alias=None,
@@ -43,13 +52,12 @@ def test_querybuilder_big_list_of_nested_ints(benchmark):
4352
} for n in big_int_list]
4453

4554

46-
4755
def test_querybuilder_big_list_of_objecttypes_with_two_int_fields(benchmark):
4856
big_int_list = [x for x in range(SIZE)]
4957

5058
Node = GraphQLObjectType('Node', fields={
5159
'id': GraphQLField(GraphQLInt, resolver=lambda obj, args, context, info: obj),
52-
'ida': GraphQLField(GraphQLInt, resolver=lambda obj, args, context, info: obj*2)
60+
'ida': GraphQLField(GraphQLInt, resolver=lambda obj, args, context, info: obj * 2)
5361
})
5462
selection_set = ast.SelectionSet(selections=[
5563
ast.Field(
@@ -74,15 +82,20 @@ def test_querybuilder_big_list_of_objecttypes_with_two_int_fields(benchmark):
7482

7583
assert resolved == [{
7684
'id': n,
77-
'ida': n*2
85+
'ida': n * 2
7886
} for n in big_int_list]
7987

8088

81-
8289
def test_querybuilder_big_list_of_objecttypes_with_one_int_field(benchmark):
8390
big_int_list = [x for x in range(SIZE)]
8491
Node = GraphQLObjectType('Node', fields={'id': GraphQLField(GraphQLInt, resolver=lambda obj, *_, **__: obj)})
85-
Query = GraphQLObjectType('Query', fields={'nodes': GraphQLField(GraphQLList(Node), resolver=lambda *_, **__: big_int_list)})
92+
Query = GraphQLObjectType(
93+
'Query',
94+
fields={
95+
'nodes': GraphQLField(
96+
GraphQLList(Node),
97+
resolver=lambda *_,
98+
**__: big_int_list)})
8699
node_selection_set = ast.SelectionSet(selections=[
87100
ast.Field(
88101
name=ast.Name(value='id'),

graphql/execution/experimental/tests/test_directives.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from graphql.language.parser import parse
22
from graphql.type import (GraphQLField, GraphQLObjectType, GraphQLSchema,
33
GraphQLString)
4+
45
from ..executor import execute
56

67
schema = GraphQLSchema(

graphql/execution/experimental/tests/test_executor.py

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
1-
import pytest
21
from functools import partial
32

3+
import pytest
4+
5+
from promise import Promise
6+
47
from ....language import ast
5-
from ....type import (GraphQLEnumType, GraphQLInterfaceType, GraphQLList,
6-
GraphQLNonNull, GraphQLObjectType, GraphQLScalarType, GraphQLBoolean,
7-
GraphQLSchema, GraphQLUnionType, GraphQLString, GraphQLInt, GraphQLField)
8-
from ..resolver import type_resolver
9-
from ..fragment import Fragment
10-
from ...base import ExecutionContext
118
from ....language.parser import parse
12-
9+
from ....type import (GraphQLBoolean, GraphQLEnumType, GraphQLField,
10+
GraphQLInt, GraphQLInterfaceType, GraphQLList,
11+
GraphQLNonNull, GraphQLObjectType, GraphQLScalarType,
12+
GraphQLSchema, GraphQLString, GraphQLUnionType)
13+
from ...base import ExecutionContext
1314
from ..executor import execute
15+
from ..fragment import Fragment
16+
from ..resolver import type_resolver
17+
18+
1419
# from ...executor import execute
1520

16-
from promise import Promise
1721

1822

1923
def test_fragment_resolver_abstract(benchmark):
@@ -22,9 +26,15 @@ def test_fragment_resolver_abstract(benchmark):
2226
Node = GraphQLInterfaceType('Node', fields={'id': GraphQLField(GraphQLInt)})
2327
Person = GraphQLObjectType('Person', interfaces=(Node, ), is_type_of=lambda *_, **__: True, fields={
2428
'id': GraphQLField(GraphQLInt, resolver=lambda obj, *_, **__: obj),
25-
'name': GraphQLField(GraphQLString, resolver=lambda obj, *_, **__: "name:"+str(obj))
29+
'name': GraphQLField(GraphQLString, resolver=lambda obj, *_, **__: "name:" + str(obj))
2630
})
27-
Query = GraphQLObjectType('Query', fields={'nodes': GraphQLField(GraphQLList(Node), resolver=lambda *_, **__: all_slots)})
31+
Query = GraphQLObjectType(
32+
'Query',
33+
fields={
34+
'nodes': GraphQLField(
35+
GraphQLList(Node),
36+
resolver=lambda *_,
37+
**__: all_slots)})
2838

2939
document_ast = parse('''query {
3040
nodes {
@@ -43,7 +53,7 @@ def test_fragment_resolver_abstract(benchmark):
4353
assert resolved.data == {
4454
'nodes': [{
4555
'id': x,
46-
'name': 'name:'+str(x)
56+
'name': 'name:' + str(x)
4757
} for x in all_slots]
4858
}
4959

graphql/execution/experimental/tests/test_fragment.py

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import pytest
22

3+
from promise import Promise
4+
35
from ....language import ast
4-
from ....type import (GraphQLEnumType, GraphQLInterfaceType, GraphQLList,
5-
GraphQLNonNull, GraphQLObjectType, GraphQLScalarType,
6-
GraphQLSchema, GraphQLUnionType, GraphQLString, GraphQLInt, GraphQLField)
7-
from ..resolver import type_resolver
8-
from ..fragment import Fragment
9-
from ...base import ExecutionContext
106
from ....language.parser import parse
11-
12-
13-
from promise import Promise
7+
from ....type import (GraphQLEnumType, GraphQLField, GraphQLInt,
8+
GraphQLInterfaceType, GraphQLList, GraphQLNonNull,
9+
GraphQLObjectType, GraphQLScalarType, GraphQLSchema,
10+
GraphQLString, GraphQLUnionType)
11+
from ...base import ExecutionContext
12+
from ..fragment import Fragment
13+
from ..resolver import type_resolver
1414

1515

1616
def test_fragment_equal():
@@ -36,7 +36,7 @@ def test_fragment_equal():
3636

3737

3838
def test_fragment_resolver():
39-
Node = GraphQLObjectType('Node', fields={'id': GraphQLField(GraphQLInt, resolver=lambda obj, *_, **__: obj*2)})
39+
Node = GraphQLObjectType('Node', fields={'id': GraphQLField(GraphQLInt, resolver=lambda obj, *_, **__: obj * 2)})
4040
selection_set = ast.SelectionSet(selections=[
4141
ast.Field(
4242
name=ast.Name(value='id'),
@@ -91,7 +91,18 @@ def test_fragment_resolver_nested():
9191

9292
def test_fragment_resolver_abstract():
9393
Node = GraphQLInterfaceType('Node', fields={'id': GraphQLField(GraphQLInt)})
94-
Person = GraphQLObjectType('Person', interfaces=(Node, ), is_type_of=lambda *_: True, fields={'id': GraphQLField(GraphQLInt, resolver=lambda obj, *_, **__: obj)})
94+
Person = GraphQLObjectType(
95+
'Person',
96+
interfaces=(
97+
Node,
98+
),
99+
is_type_of=lambda *_: True,
100+
fields={
101+
'id': GraphQLField(
102+
GraphQLInt,
103+
resolver=lambda obj,
104+
*_,
105+
**__: obj)})
95106
Query = GraphQLObjectType('Query', fields={'node': GraphQLField(Node, resolver=lambda *_, **__: 1)})
96107
node_selection_set = ast.SelectionSet(selections=[
97108
ast.Field(
@@ -141,7 +152,13 @@ def test_fragment_resolver_abstract():
141152

142153
def test_fragment_resolver_nested_list():
143154
Node = GraphQLObjectType('Node', fields={'id': GraphQLField(GraphQLInt, resolver=lambda obj, *_, **__: obj)})
144-
Query = GraphQLObjectType('Query', fields={'nodes': GraphQLField(GraphQLList(Node), resolver=lambda *_, **__: range(3))})
155+
Query = GraphQLObjectType(
156+
'Query',
157+
fields={
158+
'nodes': GraphQLField(
159+
GraphQLList(Node),
160+
resolver=lambda *_,
161+
**__: range(3))})
145162
node_selection_set = ast.SelectionSet(selections=[
146163
ast.Field(
147164
name=ast.Name(value='id'),
@@ -177,4 +194,4 @@ def test_fragment_resolver_nested_list():
177194
# ('author', AuthorFragment(
178195
# ('name', str(resolve_author()))
179196
# ))
180-
# )
197+
# )

graphql/execution/experimental/tests/test_mutations.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
from ..executor import execute
21
from graphql.language.parser import parse
32
from graphql.type import (GraphQLArgument, GraphQLField, GraphQLInt,
43
GraphQLList, GraphQLObjectType, GraphQLSchema,
54
GraphQLString)
65

6+
from ..executor import execute
7+
78

89
class NumberHolder(object):
910

0 commit comments

Comments
 (0)