Skip to content

Commit 29aba38

Browse files
authored
Merge pull request #108 from rapthead/master
optional wrapping the middleware into promises
2 parents eec3518 + cc0420b commit 29aba38

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

graphql/execution/middleware.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,19 @@
99

1010
class MiddlewareManager(object):
1111

12-
def __init__(self, *middlewares):
12+
def __init__(self, *middlewares, **kwargs):
1313
self.middlewares = middlewares
14+
self.wrap_in_promise = kwargs.get('wrap_in_promise', True)
1415
self._middleware_resolvers = list(get_middleware_resolvers(middlewares))
1516
self._cached_resolvers = {}
1617

1718
def get_field_resolver(self, field_resolver):
1819
if field_resolver not in self._cached_resolvers:
19-
self._cached_resolvers[field_resolver] = middleware_chain(field_resolver, self._middleware_resolvers)
20+
self._cached_resolvers[field_resolver] = middleware_chain(
21+
field_resolver,
22+
self._middleware_resolvers,
23+
wrap_in_promise=self.wrap_in_promise,
24+
)
2025

2126
return self._cached_resolvers[field_resolver]
2227

@@ -34,10 +39,13 @@ def get_middleware_resolvers(middlewares):
3439
yield getattr(middleware, MIDDLEWARE_RESOLVER_FUNCTION)
3540

3641

37-
def middleware_chain(func, middlewares):
42+
def middleware_chain(func, middlewares, wrap_in_promise):
3843
if not middlewares:
3944
return func
40-
middlewares = chain((func, make_it_promise), middlewares)
45+
if wrap_in_promise:
46+
middlewares = chain((func, make_it_promise), middlewares)
47+
else:
48+
middlewares = chain((func,), middlewares)
4149
last_func = None
4250
for middleware in middlewares:
4351
last_func = partial(middleware, last_func) if last_func else middleware

graphql/execution/tests/test_executor.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from graphql.type import (GraphQLArgument, GraphQLBoolean, GraphQLField,
99
GraphQLInt, GraphQLList, GraphQLObjectType,
1010
GraphQLSchema, GraphQLString)
11+
from promise import Promise
1112

1213

1314
def test_executes_arbitary_code():
@@ -607,3 +608,40 @@ def resolve(self, next, *args, **kwargs):
607608
middlewares = MiddlewareManager(MyMiddleware())
608609
result = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares)
609610
assert result.data == {'ok': 'ko', 'not_ok': 'ko_ton'}
611+
612+
613+
def test_middleware_skip_promise_wrap():
614+
doc = '''{
615+
ok
616+
not_ok
617+
}'''
618+
619+
class Data(object):
620+
621+
def ok(self):
622+
return 'ok'
623+
624+
def not_ok(self):
625+
return 'not_ok'
626+
627+
doc_ast = parse(doc)
628+
629+
Type = GraphQLObjectType('Type', {
630+
'ok': GraphQLField(GraphQLString),
631+
'not_ok': GraphQLField(GraphQLString),
632+
})
633+
634+
class MyPromiseMiddleware(object):
635+
def resolve(self, next, *args, **kwargs):
636+
return Promise.resolve(next(*args, **kwargs))
637+
638+
class MyEmptyMiddleware(object):
639+
def resolve(self, next, *args, **kwargs):
640+
return next(*args, **kwargs)
641+
642+
middlewares_with_promise = MiddlewareManager(MyPromiseMiddleware(), wrap_in_promise=False)
643+
middlewares_without_promise = MiddlewareManager(MyEmptyMiddleware(), wrap_in_promise=False)
644+
645+
result1 = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_with_promise)
646+
result2 = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_without_promise)
647+
assert result1.data == result2.data and result1.data == {'ok': 'ok', 'not_ok': 'not_ok'}

0 commit comments

Comments
 (0)