Skip to content

Commit 67fad4a

Browse files
committed
Improved resolvers with exe_context and info
1 parent f67f813 commit 67fad4a

File tree

3 files changed

+30
-20
lines changed

3 files changed

+30
-20
lines changed

graphql/execution/querybuilder/fragment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def get_resolvers(context, type, selection_set):
5555
info=info,
5656
context=context
5757
)
58-
resolver = field_resolver(field_def, fragment=field_fragment)
58+
resolver = field_resolver(field_def, exe_context=context, info=info, fragment=field_fragment)
5959
args = get_argument_values(
6060
field_def.args,
6161
field_ast.arguments,

graphql/execution/querybuilder/resolver.py

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,30 @@ def is_promise(value):
1414
return type(value) == Promise
1515

1616

17-
def on_complete_resolver(__func, __resolver, *args, **kwargs):
18-
result = __resolver(*args, **kwargs)
17+
def on_complete_resolver(__func, exe_context, info, __resolver, *args, **kwargs):
18+
try:
19+
result = __resolver(*args, **kwargs)
20+
except Exception, e:
21+
exe_context.errors.append(e)
22+
return None
23+
1924
if is_promise(result):
2025
return result.then(__func)
2126
return __func(result)
2227

2328

24-
def complete_list_value(inner_resolver, result):
29+
def complete_list_value(inner_resolver, exe_context, info, result):
2530
assert isinstance(result, collections.Iterable), \
2631
('User Error: expected iterable, but did not find one ' +
2732
'for field {}.{}.').format(info.parent_type, info.field_name)
2833

2934
completed_results = []
3035
for item in result:
31-
completed_item = inner_resolver(item)
36+
try:
37+
completed_item = inner_resolver(item)
38+
except Exception, e:
39+
completed_item = None
40+
exe_context.errors.append(e)
3241
completed_results.append(completed_item)
3342

3443
return completed_results
@@ -44,44 +53,44 @@ def complete_nonnull_value(result):
4453
return result
4554

4655

47-
def field_resolver(field, fragment=None):
48-
return type_resolver(field.type, field.resolver, fragment)
56+
def field_resolver(field, fragment=None, exe_context=None, info=None):
57+
return type_resolver(field.type, field.resolver, fragment, exe_context, info)
4958

5059

51-
def type_resolver(return_type, resolver, fragment=None):
60+
def type_resolver(return_type, resolver, fragment=None, exe_context=None, info=None):
5261
if isinstance(return_type, GraphQLNonNull):
53-
return type_resolver_non_null(return_type, resolver, fragment)
62+
return type_resolver_non_null(return_type, resolver, fragment, exe_context, info)
5463

5564
if isinstance(return_type, (GraphQLScalarType, GraphQLEnumType)):
56-
return type_resolver_leaf(return_type, resolver)
65+
return type_resolver_leaf(return_type, resolver, exe_context, info)
5766

5867
if isinstance(return_type, (GraphQLList)):
59-
return type_resolver_list(return_type, resolver, fragment)
68+
return type_resolver_list(return_type, resolver, fragment, exe_context, info)
6069

6170
if isinstance(return_type, (GraphQLObjectType)):
6271
assert fragment and fragment.type == return_type
63-
return partial(on_complete_resolver, fragment.resolve, resolver)
72+
return partial(on_complete_resolver, fragment.resolve, exe_context, info, resolver)
6473
# return partial(fragment.resolver, resolver)
6574

6675
if isinstance(return_type, (GraphQLInterfaceType, GraphQLUnionType)):
6776
assert fragment
68-
return partial(on_complete_resolver, fragment.resolve, resolver)
77+
return partial(on_complete_resolver, fragment.resolve, exe_context, info, resolver)
6978
# return partial(fragment.resolver, resolver)
7079
# return partial(fragment.abstract_resolver, resolver, return_type)
7180

7281
raise Exception("The resolver have to be created for a fragment")
7382

7483

75-
def type_resolver_non_null(return_type, resolver, fragment=None):
84+
def type_resolver_non_null(return_type, resolver, fragment, exe_context, info):
7685
resolver = type_resolver(return_type.of_type, resolver)
77-
return partial(on_complete_resolver, complete_nonnull_value, resolver)
86+
return partial(on_complete_resolver, complete_nonnull_value, exe_context, info, resolver)
7887

7988

80-
def type_resolver_leaf(return_type, resolver):
81-
return partial(on_complete_resolver, return_type.serialize, resolver)
89+
def type_resolver_leaf(return_type, resolver, exe_context, info):
90+
return partial(on_complete_resolver, return_type.serialize, exe_context, info, resolver)
8291

8392

84-
def type_resolver_list(return_type, resolver, fragment=None):
93+
def type_resolver_list(return_type, resolver, fragment, exe_context, info):
8594
inner_resolver = type_resolver(return_type.of_type, lambda item: item, fragment)
86-
list_complete = partial(complete_list_value, inner_resolver)
87-
return partial(on_complete_resolver, list_complete, resolver)
95+
list_complete = partial(complete_list_value, inner_resolver, exe_context, info)
96+
return partial(on_complete_resolver, list_complete, exe_context, info, resolver)

graphql/execution/querybuilder/tests/test_executor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ def test_fragment_resolver_resolves_all_list():
111111
# resolved = benchmark(partial_execute)
112112
resolved = execute(schema, document_ast, context_value="1")
113113
assert len(resolved.errors) == 1
114+
# assert str(resolved.errors[0]) == 'Cant convert NaN to int'
114115
assert resolved.data == {
115116
'ints': [1, 2, None]
116117
}

0 commit comments

Comments
 (0)