Skip to content

Commit dd2bb3d

Browse files
committed
Fix executor & add resolver tagging.
1 parent a0dbce7 commit dd2bb3d

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

graphql/core/execution/executor.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,27 @@ def __init__(self, schema, execution_middlewares=None, default_resolver=default_
2020
self.default_resolve_fn = default_resolver
2121
self.schema = schema
2222

23-
def execute(self, request='', root=None, args=None, operation_name=None, execute_serially=False, validate_ast=True):
23+
def execute(self, request='', root=None, args=None, operation_name=None, request_context=None,
24+
execute_serially=False, validate_ast=True):
25+
2426
curried_execution_function = functools.partial(
2527
self._execute,
2628
request,
2729
root,
2830
args,
2931
operation_name,
32+
request_context,
3033
execute_serially,
31-
validate_ast)
34+
validate_ast
35+
)
3236

3337
for middleware in self.execution_middlewares:
3438
if hasattr(middleware, 'execution_result'):
3539
curried_execution_function = functools.partial(middleware.execution_result, curried_execution_function)
3640

3741
return curried_execution_function()
3842

39-
def _execute(self, request='', root=None, args=None, operation_name=None, request_context=None,
40-
execute_serially=False, validate_ast=True):
43+
def _execute(self, request, root, args, operation_name, request_context, execute_serially, validate_ast):
4144
if not isinstance(request, ast.Document):
4245
if not isinstance(request, Source):
4346
request = Source(request, 'GraphQL request')

graphql/core/execution/middlewares/gevent.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from gevent import get_hub, spawn
44
from gevent.event import AsyncResult
5-
from graphql.core.defer import Deferred, DeferredException
5+
from ...defer import Deferred, DeferredException
6+
from .utils import resolver_has_tag, tag_resolver
67

78

89
def _run_resolver_in_greenlet(d, resolver):
@@ -24,13 +25,12 @@ def resolve_something(context, _*):
2425
return 5
2526
2627
"""
27-
f._run_in_greenlet = True
28-
return f
28+
return tag_resolver(f, 'run_in_greenlet')
2929

3030

3131
class GeventExecutionMiddleware(object):
3232
def run_resolve_fn(self, resolver, original_resolver):
33-
if hasattr(original_resolver, '_run_in_greenlet'):
33+
if resolver_has_tag(original_resolver, 'run_in_greenlet'):
3434
d = Deferred()
3535
spawn(_run_resolver_in_greenlet, d, resolver)
3636
return d
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
def tag_resolver(f, tag):
2+
"""
3+
Tags a resolver function with a specific tag that can be read by a Middleware to denote specific functionality.
4+
:param f: The function to tag.
5+
:param tag: The tag to add to the function.
6+
:return: The function with the tag added.
7+
"""
8+
if not hasattr(f, '_resolver_tags'):
9+
f._resolver_tags = set()
10+
11+
f._resolver_tags.add(tag)
12+
return f
13+
14+
15+
def resolver_has_tag(f, tag):
16+
"""
17+
Checks to see if a function has a specific tag.
18+
"""
19+
if not hasattr(f, '_resolver_tags'):
20+
return False
21+
22+
return tag in f._resolver_tags
23+
24+
25+
def merge_resolver_resolver_tags(source_resolver, target_resolver):
26+
if not hasattr(source_resolver, '_resolver_tags'):
27+
return target_resolver
28+
29+
if not hasattr(target_resolver, '_resolver_tags'):
30+
target_resolver._resolver_tags = set()
31+
32+
target_resolver._resolver_tags |= source_resolver._resolver_tags
33+
return target_resolver

0 commit comments

Comments
 (0)