1
+ import json
2
+ import logging
1
3
import traceback
2
4
from collections import defaultdict
3
5
from enum import Enum
20
22
21
23
from .utils import execute_async_function , recursive_to_snake_case , to_camel_case , to_snake_case
22
24
25
+
26
+ logger = logging .getLogger (__name__ )
27
+
23
28
ReferenceResolver = Callable [[Any , GraphQLResolveInfo , dict ], Any ]
24
29
FieldResolverMap = Dict [str , Dict [str , GraphQLFieldResolver ]]
25
30
TypeResolverMap = Dict [str , GraphQLTypeResolver ]
30
35
reference_resolver_map : ReferenceResolverMap = {}
31
36
32
37
38
+ def print_resolver_error (info : GraphQLResolveInfo ):
39
+ logger .error (
40
+ f'Failed execute "{ info .parent_type .name } .{ info .field_name } " resolver. '
41
+ f'Variables: { json .dumps (info .variable_values )} .'
42
+ )
43
+
44
+
33
45
def reference_resolver (type_name : str ):
34
46
if type_name in reference_resolver_map :
35
47
raise Exception (
@@ -39,20 +51,22 @@ def reference_resolver(type_name: str):
39
51
40
52
def wrap (func : ReferenceResolver ):
41
53
@wraps (func )
42
- def sync_resolver (* args , ** kwargs ):
54
+ def sync_resolver (parent , info , ** kwargs ):
43
55
try :
44
- result = func (* args , ** kwargs )
56
+ result = func (parent , info , ** kwargs )
45
57
return dict (result ) if result is not None else result
46
58
except Exception as exc :
59
+ print_resolver_error (info )
47
60
traceback .print_exc ()
48
61
raise exc
49
62
50
63
@wraps (func )
51
- async def async_resolver (* args , ** kwargs ):
64
+ async def async_resolver (parent , info , ** kwargs ):
52
65
try :
53
- result = await execute_async_function (func , * args , ** kwargs )
66
+ result = await execute_async_function (func , parent , info , ** kwargs )
54
67
return dict (result ) if result is not None else result
55
68
except Exception as exc :
69
+ print_resolver_error (info )
56
70
traceback .print_exc ()
57
71
raise exc
58
72
@@ -87,28 +101,30 @@ def field_resolver(
87
101
):
88
102
def wrap (func : GraphQLFieldResolver ):
89
103
@wraps (func )
90
- def sync_resolver (* args , ** kwargs ):
104
+ def sync_resolver (parent , info , ** kwargs ):
91
105
if snake_argument :
92
106
kwargs = recursive_to_snake_case (kwargs )
93
107
if not print_exc :
94
- return func (* args , ** kwargs )
108
+ return func (parent , info , ** kwargs )
95
109
96
110
try :
97
- return func (* args , ** kwargs )
111
+ return func (parent , info , ** kwargs )
98
112
except Exception as exc :
113
+ print_resolver_error (info )
99
114
traceback .print_exc ()
100
115
raise exc
101
116
102
117
@wraps (func )
103
- async def async_resolver (* args , ** kwargs ):
118
+ async def async_resolver (parent , info , ** kwargs ):
104
119
if snake_argument :
105
120
kwargs = recursive_to_snake_case (kwargs )
106
121
if not print_exc :
107
- return await execute_async_function (func , * args , ** kwargs )
122
+ return await execute_async_function (func , parent , info , ** kwargs )
108
123
109
124
try :
110
- return await execute_async_function (func , * args , ** kwargs )
125
+ return await execute_async_function (func , parent , info , ** kwargs )
111
126
except Exception as exc :
127
+ print_resolver_error (info )
112
128
traceback .print_exc ()
113
129
raise exc
114
130
0 commit comments