@@ -27,6 +27,9 @@ def on_complete_resolver(__func, exe_context, info, __resolver, *args, **kwargs)
27
27
28
28
29
29
def complete_list_value (inner_resolver , exe_context , info , result ):
30
+ if result is None :
31
+ return None
32
+
30
33
assert isinstance (result , collections .Iterable ), \
31
34
('User Error: expected iterable, but did not find one ' +
32
35
'for field {}.{}.' ).format (info .parent_type , info .field_name )
@@ -43,16 +46,22 @@ def complete_list_value(inner_resolver, exe_context, info, result):
43
46
return completed_results
44
47
45
48
46
- def complete_nonnull_value (result ):
49
+ def complete_nonnull_value (exe_context , info , result ):
47
50
if result is None :
48
51
field_asts = 'TODO'
49
52
raise GraphQLError (
50
53
'Cannot return null for non-nullable field {}.{}.' .format (info .parent_type , info .field_name ),
51
- field_asts
54
+ info . field_asts
52
55
)
53
56
return result
54
57
55
58
59
+ def complete_object_value (fragment_resolve , result ):
60
+ if result is None :
61
+ return None
62
+ return fragment_resolve (result )
63
+
64
+
56
65
def field_resolver (field , fragment = None , exe_context = None , info = None ):
57
66
return type_resolver (field .type , field .resolver , fragment , exe_context , info )
58
67
@@ -68,12 +77,13 @@ def type_resolver(return_type, resolver, fragment=None, exe_context=None, info=N
68
77
return type_resolver_list (return_type , resolver , fragment , exe_context , info )
69
78
70
79
if isinstance (return_type , (GraphQLObjectType )):
71
- assert fragment and fragment .type == return_type
72
- return partial (on_complete_resolver , fragment .resolve , exe_context , info , resolver )
80
+ assert fragment and fragment .type == return_type , 'Fragment and return_type dont match'
81
+ complete_object_value_resolve = partial (complete_object_value , fragment .resolve )
82
+ return partial (on_complete_resolver , complete_object_value_resolve , exe_context , info , resolver )
73
83
# return partial(fragment.resolver, resolver)
74
84
75
85
if isinstance (return_type , (GraphQLInterfaceType , GraphQLUnionType )):
76
- assert fragment
86
+ assert fragment , 'You need to pass a fragment to resolve a Interface or Union'
77
87
return partial (on_complete_resolver , fragment .resolve , exe_context , info , resolver )
78
88
# return partial(fragment.resolver, resolver)
79
89
# return partial(fragment.abstract_resolver, resolver, return_type)
@@ -82,15 +92,16 @@ def type_resolver(return_type, resolver, fragment=None, exe_context=None, info=N
82
92
83
93
84
94
def type_resolver_non_null (return_type , resolver , fragment , exe_context , info ):
85
- resolver = type_resolver (return_type .of_type , resolver )
86
- return partial (on_complete_resolver , complete_nonnull_value , exe_context , info , resolver )
95
+ resolver = type_resolver (return_type .of_type , resolver , fragment , exe_context , info )
96
+ nonnull_complete = partial (complete_nonnull_value , exe_context , info )
97
+ return partial (on_complete_resolver , nonnull_complete , exe_context , info , resolver )
87
98
88
99
89
100
def type_resolver_leaf (return_type , resolver , exe_context , info ):
90
101
return partial (on_complete_resolver , return_type .serialize , exe_context , info , resolver )
91
102
92
103
93
104
def type_resolver_list (return_type , resolver , fragment , exe_context , info ):
94
- inner_resolver = type_resolver (return_type .of_type , lambda item : item , fragment )
105
+ inner_resolver = type_resolver (return_type .of_type , lambda item : item , fragment , exe_context , info )
95
106
list_complete = partial (complete_list_value , inner_resolver , exe_context , info )
96
107
return partial (on_complete_resolver , list_complete , exe_context , info , resolver )
0 commit comments