From 7ff0f0287183f86c1e80b3eaf2bda4c0664a3417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B0=D0=B2=D0=B5=D0=BB=20=D0=93=D1=80=D0=B8=D0=B1?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Fri, 24 Feb 2017 16:52:28 +0500 Subject: [PATCH 1/2] optional wrapping the middleware into promises --- graphql/execution/middleware.py | 16 +++++++--- graphql/execution/tests/test_executor.py | 38 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/graphql/execution/middleware.py b/graphql/execution/middleware.py index fa7fc5ad..af0c2ed0 100644 --- a/graphql/execution/middleware.py +++ b/graphql/execution/middleware.py @@ -9,14 +9,19 @@ class MiddlewareManager(object): - def __init__(self, *middlewares): + def __init__(self, *middlewares, wrap_in_promise=True): self.middlewares = middlewares + self.wrap_in_promise = wrap_in_promise self._middleware_resolvers = list(get_middleware_resolvers(middlewares)) self._cached_resolvers = {} def get_field_resolver(self, field_resolver): if field_resolver not in self._cached_resolvers: - self._cached_resolvers[field_resolver] = middleware_chain(field_resolver, self._middleware_resolvers) + self._cached_resolvers[field_resolver] = middleware_chain( + field_resolver, + self._middleware_resolvers, + wrap_in_promise=self.wrap_in_promise, + ) return self._cached_resolvers[field_resolver] @@ -34,10 +39,13 @@ def get_middleware_resolvers(middlewares): yield getattr(middleware, MIDDLEWARE_RESOLVER_FUNCTION) -def middleware_chain(func, middlewares): +def middleware_chain(func, middlewares, wrap_in_promise): if not middlewares: return func - middlewares = chain((func, make_it_promise), middlewares) + if wrap_in_promise: + middlewares = chain((func, make_it_promise), middlewares) + else: + middlewares = chain((func,), middlewares) last_func = None for middleware in middlewares: last_func = partial(middleware, last_func) if last_func else middleware diff --git a/graphql/execution/tests/test_executor.py b/graphql/execution/tests/test_executor.py index 2bbaf2c2..7d9b5e7f 100644 --- a/graphql/execution/tests/test_executor.py +++ b/graphql/execution/tests/test_executor.py @@ -8,6 +8,7 @@ from graphql.type import (GraphQLArgument, GraphQLBoolean, GraphQLField, GraphQLInt, GraphQLList, GraphQLObjectType, GraphQLSchema, GraphQLString) +from promise import Promise def test_executes_arbitary_code(): @@ -607,3 +608,40 @@ def resolve(self, next, *args, **kwargs): middlewares = MiddlewareManager(MyMiddleware()) result = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares) assert result.data == {'ok': 'ko', 'not_ok': 'ko_ton'} + + +def test_middleware_skip_promise_wrap(): + doc = '''{ + ok + not_ok + }''' + + class Data(object): + + def ok(self): + return 'ok' + + def not_ok(self): + return 'not_ok' + + doc_ast = parse(doc) + + Type = GraphQLObjectType('Type', { + 'ok': GraphQLField(GraphQLString), + 'not_ok': GraphQLField(GraphQLString), + }) + + class MyPromiseMiddleware(object): + def resolve(self, next, *args, **kwargs): + return Promise.resolve(next(*args, **kwargs)) + + class MyEmptyMiddleware(object): + def resolve(self, next, *args, **kwargs): + return next(*args, **kwargs) + + middlewares_with_promise = MiddlewareManager(MyPromiseMiddleware(), wrap_in_promise=False) + middlewares_without_promise = MiddlewareManager(MyEmptyMiddleware(), wrap_in_promise=False) + + result1 = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_with_promise) + result2 = execute(GraphQLSchema(Type), doc_ast, Data(), middleware=middlewares_without_promise) + assert result1.data == result2.data and result1.data == {'ok': 'ok', 'not_ok': 'not_ok'} From cc0420b467513a14cad097dc980f526eae4e9189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B0=D0=B2=D0=B5=D0=BB=20=D0=93=D1=80=D0=B8=D0=B1?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Sat, 25 Feb 2017 01:11:02 +0500 Subject: [PATCH 2/2] optional wrapping the middleware into promises fix python 2.7 error --- graphql/execution/middleware.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphql/execution/middleware.py b/graphql/execution/middleware.py index af0c2ed0..22bcfd32 100644 --- a/graphql/execution/middleware.py +++ b/graphql/execution/middleware.py @@ -9,9 +9,9 @@ class MiddlewareManager(object): - def __init__(self, *middlewares, wrap_in_promise=True): + def __init__(self, *middlewares, **kwargs): self.middlewares = middlewares - self.wrap_in_promise = wrap_in_promise + self.wrap_in_promise = kwargs.get('wrap_in_promise', True) self._middleware_resolvers = list(get_middleware_resolvers(middlewares)) self._cached_resolvers = {}