Skip to content

Commit b4547b1

Browse files
author
Daniel Gallagher
committed
Merge branch 'master' of github.com:dan98765/graphql-core into middleware_runs_in_passed_in_order
2 parents 370e303 + 6154aa3 commit b4547b1

File tree

4 files changed

+102
-62
lines changed

4 files changed

+102
-62
lines changed

graphql/backend/decider.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def main_thread_terminated(self):
6666
# add or remove items
6767
size = self._queue.qsize()
6868

69-
print("Sentry is attempting to send %i pending error messages" % size)
69+
print("GraphQL is attempting to retrieve %i pending documents" % size)
7070
print("Waiting up to %s seconds" % timeout)
7171

7272
if os.name == "nt":
Lines changed: 89 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,159 +1,191 @@
1+
# type: ignore
12
from __future__ import print_function
23

4+
import json
5+
6+
from pytest import raises
7+
from graphql.error import GraphQLError
38
from graphql.execution import MiddlewareManager, execute
4-
from graphql.execution.middleware import (get_middleware_resolvers,
5-
middleware_chain)
9+
from graphql.execution.middleware import get_middleware_resolvers, middleware_chain
610
from graphql.language.parser import parse
7-
from graphql.type import (GraphQLArgument, GraphQLBoolean, GraphQLField,
8-
GraphQLID, GraphQLInt, GraphQLList, GraphQLNonNull,
9-
GraphQLObjectType, GraphQLSchema, GraphQLString)
11+
from graphql.type import (
12+
GraphQLArgument,
13+
GraphQLBoolean,
14+
GraphQLField,
15+
GraphQLInt,
16+
GraphQLList,
17+
GraphQLObjectType,
18+
GraphQLSchema,
19+
GraphQLString,
20+
GraphQLNonNull,
21+
GraphQLID,
22+
)
1023
from promise import Promise
1124

1225

1326
def test_middleware():
14-
doc = '''{
27+
# type: () -> None
28+
doc = """{
1529
ok
1630
not_ok
17-
}'''
31+
}"""
1832

1933
class Data(object):
20-
2134
def ok(self):
22-
return 'ok'
35+
# type: () -> str
36+
return "ok"
2337

2438
def not_ok(self):
25-
return 'not_ok'
39+
# type: () -> str
40+
return "not_ok"
2641

2742
doc_ast = parse(doc)
2843

29-
Type = GraphQLObjectType('Type', {
30-
'ok': GraphQLField(GraphQLString),
31-
'not_ok': GraphQLField(GraphQLString),
32-
})
44+
Type = GraphQLObjectType(
45+
"Type",
46+
{"ok": GraphQLField(GraphQLString), "not_ok": GraphQLField(GraphQLString)},
47+
)
3348

3449
def reversed_middleware(next, *args, **kwargs):
50+
# type: (Callable, *Any, **Any) -> Promise
3551
p = next(*args, **kwargs)
3652
return p.then(lambda x: x[::-1])
3753

3854
middlewares = MiddlewareManager(reversed_middleware)
39-
result = execute(GraphQLSchema(Type), doc_ast,
40-
Data(), middleware=middlewares)
41-
assert result.data == {'ok': 'ko', 'not_ok': 'ko_ton'}
55+
result = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares)
56+
assert result.data == {"ok": "ko", "not_ok": "ko_ton"}
4257

4358

4459
def test_middleware_class():
45-
doc = '''{
60+
# type: () -> None
61+
doc = """{
4662
ok
4763
not_ok
48-
}'''
64+
}"""
4965

5066
class Data(object):
51-
5267
def ok(self):
53-
return 'ok'
68+
# type: () -> str
69+
return "ok"
5470

5571
def not_ok(self):
56-
return 'not_ok'
72+
# type: () -> str
73+
return "not_ok"
5774

5875
doc_ast = parse(doc)
5976

60-
Type = GraphQLObjectType('Type', {
61-
'ok': GraphQLField(GraphQLString),
62-
'not_ok': GraphQLField(GraphQLString),
63-
})
77+
Type = GraphQLObjectType(
78+
"Type",
79+
{"ok": GraphQLField(GraphQLString), "not_ok": GraphQLField(GraphQLString)},
80+
)
6481

6582
class MyMiddleware(object):
6683
def resolve(self, next, *args, **kwargs):
84+
# type: (Callable, *Any, **Any) -> Promise
6785
p = next(*args, **kwargs)
6886
return p.then(lambda x: x[::-1])
6987

7088
middlewares = MiddlewareManager(MyMiddleware())
71-
result = execute(GraphQLSchema(Type), doc_ast,
72-
Data(), middleware=middlewares)
73-
assert result.data == {'ok': 'ko', 'not_ok': 'ko_ton'}
89+
result = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares)
90+
assert result.data == {"ok": "ko", "not_ok": "ko_ton"}
7491

7592

7693
def test_middleware_skip_promise_wrap():
77-
doc = '''{
94+
# type: () -> None
95+
doc = """{
7896
ok
7997
not_ok
80-
}'''
98+
}"""
8199

82100
class Data(object):
83-
84101
def ok(self):
85-
return 'ok'
102+
# type: () -> str
103+
return "ok"
86104

87105
def not_ok(self):
88-
return 'not_ok'
106+
# type: () -> str
107+
return "not_ok"
89108

90109
doc_ast = parse(doc)
91110

92-
Type = GraphQLObjectType('Type', {
93-
'ok': GraphQLField(GraphQLString),
94-
'not_ok': GraphQLField(GraphQLString),
95-
})
111+
Type = GraphQLObjectType(
112+
"Type",
113+
{"ok": GraphQLField(GraphQLString), "not_ok": GraphQLField(GraphQLString)},
114+
)
96115

97116
class MyPromiseMiddleware(object):
98117
def resolve(self, next, *args, **kwargs):
118+
# type: (Callable, *Any, **Any) -> Promise
99119
return Promise.resolve(next(*args, **kwargs))
100120

101121
class MyEmptyMiddleware(object):
102122
def resolve(self, next, *args, **kwargs):
123+
# type: (Callable, *Any, **Any) -> str
103124
return next(*args, **kwargs)
104125

105126
middlewares_with_promise = MiddlewareManager(
106-
MyPromiseMiddleware(), wrap_in_promise=False)
127+
MyPromiseMiddleware(), wrap_in_promise=False
128+
)
107129
middlewares_without_promise = MiddlewareManager(
108-
MyEmptyMiddleware(), wrap_in_promise=False)
130+
MyEmptyMiddleware(), wrap_in_promise=False
131+
)
109132

110-
result1 = execute(GraphQLSchema(Type), doc_ast, Data(),
111-
middleware=middlewares_with_promise)
112-
result2 = execute(GraphQLSchema(Type), doc_ast, Data(),
113-
middleware=middlewares_without_promise)
133+
result1 = execute(
134+
GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_with_promise
135+
)
136+
result2 = execute(
137+
GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_without_promise
138+
)
114139
assert result1.data == result2.data and result1.data == {
115-
'ok': 'ok', 'not_ok': 'not_ok'}
140+
"ok": "ok",
141+
"not_ok": "not_ok",
142+
}
116143

117144

118145
def test_middleware_chain(capsys):
119-
146+
# type: () -> None
120147
class CharPrintingMiddleware(object):
121148
def __init__(self, char):
149+
# type: (str) -> None
122150
self.char = char
123151

124152
def resolve(self, next, *args, **kwargs):
153+
# type: (Callable, *Any, **Any) -> str
125154
print("resolve() called for middleware {}".format(self.char))
126155
return next(*args, **kwargs).then(
127156
lambda x: print("then() for {}".format(self.char))
128157
)
129158

130159
middlewares = [
131-
CharPrintingMiddleware('a'),
132-
CharPrintingMiddleware('b'),
133-
CharPrintingMiddleware('c'),
160+
CharPrintingMiddleware("a"),
161+
CharPrintingMiddleware("b"),
162+
CharPrintingMiddleware("c"),
134163
]
135164

136165
middlewares_resolvers = get_middleware_resolvers(middlewares)
137166

138-
def func(): return
167+
def func():
168+
# type: () -> None
169+
return
139170

140-
chain_iter = middleware_chain(func, middlewares_resolvers)
171+
chain_iter = middleware_chain(func, middlewares_resolvers, wrap_in_promise=True)
141172

142173
assert_stdout(capsys, "")
143174

144175
chain_iter()
145176

146177
expected_stdout = (
147-
'resolve() called for middleware c\n'
148-
'resolve() called for middleware b\n'
149-
'resolve() called for middleware a\n'
150-
'then() for a\n'
151-
'then() for b\n'
152-
'then() for c\n'
178+
"resolve() called for middleware c\n"
179+
"resolve() called for middleware b\n"
180+
"resolve() called for middleware a\n"
181+
"then() for a\n"
182+
"then() for b\n"
183+
"then() for c\n"
153184
)
154185
assert_stdout(capsys, expected_stdout)
155186

156187

157188
def assert_stdout(capsys, expected_stdout):
189+
# type: (Any, str) -> None
158190
captured = capsys.readouterr()
159191
assert captured.out == expected_stdout

graphql/execution/utils.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,12 @@ def get_field_resolver(self, field_resolver):
136136
def get_argument_values(self, field_def, field_ast):
137137
# type: (GraphQLField, Field) -> Dict[str, Any]
138138
k = field_def, field_ast
139-
result = self.argument_values_cache.get(k)
140-
if not result:
141-
result = self.argument_values_cache[k] = get_argument_values(
139+
if k not in self.argument_values_cache:
140+
self.argument_values_cache[k] = get_argument_values(
142141
field_def.args, field_ast.arguments, self.variable_values
143142
)
144143

145-
return result
144+
return self.argument_values_cache[k]
146145

147146
def report_error(self, error, traceback=None):
148147
# type: (Exception, Optional[TracebackType]) -> None

graphql/flags.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# This file makes it easier to know what are the features
2+
# the GraphQL-core API supports
3+
4+
# This permits to plug different backend when executing graphql(...)
5+
BACKEND_EXECUTOR = True
6+
7+
# This add a new path attribute to ResolveInfo, filled with the
8+
# path of the field where is being executed
9+
PATH_IN_RESOLVEINFO = True

0 commit comments

Comments
 (0)