From ea69be61174a7afcc3d61f36f30422fe75cbc687 Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Wed, 26 Oct 2016 10:50:27 +0100 Subject: [PATCH 1/3] Add support to return a promise for connections. --- graphene/relay/connection.py | 37 +++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/graphene/relay/connection.py b/graphene/relay/connection.py index e63478e5..05f4a68a 100644 --- a/graphene/relay/connection.py +++ b/graphene/relay/connection.py @@ -118,25 +118,28 @@ class IterableConnectionField(Field): return connection_type @classmethod - def connection_resolver(cls, resolver, connection, root, args, context, info): - resolved = resolver(root, args, context, info) + def connection_resolver(cls, resolver, connection_type, root, args, context, info): + p = Promise.resolve(resolver(root, args, context, info)) - if isinstance(resolved, connection): - return resolved + def resolve_connection(resolved): + if isinstance(resolved, connection_type): + return resolved - assert isinstance(resolved, Iterable), ( - 'Resolved value from the connection field have to be iterable or instance of {}. ' - 'Received "{}"' - ).format(connection, resolved) - connection = connection_from_list( - resolved, - args, - connection_type=connection, - edge_type=connection.Edge, - pageinfo_type=PageInfo - ) - connection.iterable = resolved - return connection + assert isinstance(resolved, Iterable), ( + 'Resolved value from the connection field have to be iterable or instance of {}. ' + 'Received "{}"' + ).format(connection_type, resolved) + connection = connection_from_list( + resolved, + args, + connection_type=connection_type, + edge_type=connection_type.Edge, + pageinfo_type=PageInfo + ) + connection.iterable = resolved + return connection + + return p.then(resolve_connection) def get_resolver(self, parent_resolver): resolver = super(IterableConnectionField, self).get_resolver(parent_resolver) From 16e9f221b52510bd1ac54ff5691e4f2a506dda4b Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Wed, 26 Oct 2016 10:52:46 +0100 Subject: [PATCH 2/3] added missing import --- graphene/relay/connection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/graphene/relay/connection.py b/graphene/relay/connection.py index 05f4a68a..b8f49207 100644 --- a/graphene/relay/connection.py +++ b/graphene/relay/connection.py @@ -5,6 +5,7 @@ from functools import partial import six from graphql_relay import connection_from_list +from promise import Promise from ..types import (AbstractType, Boolean, Enum, Int, Interface, List, NonNull, Scalar, String, Union) From 760ccc83587396df9a2cbf5806b7f4fa73ba620e Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Thu, 27 Oct 2016 02:41:36 +0200 Subject: [PATCH 3/3] Improved Promise connection abstraction --- graphene/relay/connection.py | 43 ++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/graphene/relay/connection.py b/graphene/relay/connection.py index b8f49207..20f3cceb 100644 --- a/graphene/relay/connection.py +++ b/graphene/relay/connection.py @@ -118,29 +118,34 @@ class IterableConnectionField(Field): ).format(str(self), connection_type) return connection_type + @classmethod + def resolve_connection(cls, connection_type, args, resolved): + if isinstance(resolved, connection_type): + return resolved + + assert isinstance(resolved, Iterable), ( + 'Resolved value from the connection field have to be iterable or instance of {}. ' + 'Received "{}"' + ).format(connection_type, resolved) + connection = connection_from_list( + resolved, + args, + connection_type=connection_type, + edge_type=connection_type.Edge, + pageinfo_type=PageInfo + ) + connection.iterable = resolved + return connection + @classmethod def connection_resolver(cls, resolver, connection_type, root, args, context, info): - p = Promise.resolve(resolver(root, args, context, info)) + resolved = resolver(root, args, context, info) - def resolve_connection(resolved): - if isinstance(resolved, connection_type): - return resolved + on_resolve = partial(cls.resolve_connection, connection_type, args) + if isinstance(resolved, Promise): + return resolved.then(on_resolve) - assert isinstance(resolved, Iterable), ( - 'Resolved value from the connection field have to be iterable or instance of {}. ' - 'Received "{}"' - ).format(connection_type, resolved) - connection = connection_from_list( - resolved, - args, - connection_type=connection_type, - edge_type=connection_type.Edge, - pageinfo_type=PageInfo - ) - connection.iterable = resolved - return connection - - return p.then(resolve_connection) + return on_resolve(resolved) def get_resolver(self, parent_resolver): resolver = super(IterableConnectionField, self).get_resolver(parent_resolver)