13
13
)
14
14
15
15
from ..codegen import (
16
+ generate_ann_assign ,
16
17
generate_annotation_name ,
17
18
generate_arg ,
18
19
generate_arguments ,
20
+ generate_assign ,
19
21
generate_call ,
20
22
generate_class_def ,
23
+ generate_comp ,
21
24
generate_constant ,
22
25
generate_dict ,
23
26
generate_import_from ,
26
29
generate_module ,
27
30
generate_name ,
28
31
generate_return ,
32
+ generate_subscript ,
33
+ generate_tuple ,
29
34
)
30
35
from ..exceptions import ParsingError
31
36
from ..plugins .manager import PluginManager
36
41
BASE_MODEL_FILE_PATH ,
37
42
CUSTOM_FIELDS_FILE_PATH ,
38
43
CUSTOM_FIELDS_TYPING_FILE_PATH ,
44
+ DICT ,
39
45
INPUT_SCALARS_MAP ,
40
46
OPTIONAL ,
41
47
TYPING_MODULE ,
@@ -69,7 +75,7 @@ def __init__(
69
75
70
76
self ._imports : List [ast .ImportFrom ] = []
71
77
self ._type_imports : List [ast .ImportFrom ] = []
72
- self ._add_import (generate_import_from ([OPTIONAL , ANY ], TYPING_MODULE ))
78
+ self ._add_import (generate_import_from ([OPTIONAL , ANY , DICT ], TYPING_MODULE ))
73
79
74
80
self ._class_def = generate_class_def (name = name , base_names = [])
75
81
@@ -114,14 +120,64 @@ def _generate_method(
114
120
operation_args ,
115
121
final_type ,
116
122
) -> ast .FunctionDef :
117
- method_arguments , return_arguments = self ._generate_arguments (operation_args )
123
+ (
124
+ method_arguments ,
125
+ return_arguments_keys ,
126
+ return_arguments_values ,
127
+ ) = self ._generate_arguments (operation_args )
118
128
return_type_name = self ._get_return_type_and_from (final_type )
119
129
120
130
return generate_method_definition (
121
131
name = str_to_snake_case (operation_name ),
122
132
arguments = method_arguments ,
123
133
return_type = generate_name (return_type_name ),
124
134
body = [
135
+ generate_ann_assign (
136
+ "arguments" ,
137
+ generate_subscript (
138
+ generate_name (DICT ),
139
+ generate_tuple (
140
+ [
141
+ generate_name ("str" ),
142
+ generate_subscript (
143
+ generate_name (DICT ),
144
+ generate_tuple (
145
+ [
146
+ generate_name ("str" ),
147
+ generate_name (ANY ),
148
+ ]
149
+ ),
150
+ ),
151
+ ]
152
+ ),
153
+ ),
154
+ generate_dict (return_arguments_keys , return_arguments_values ),
155
+ ),
156
+ generate_assign (
157
+ ["cleared_arguments" ],
158
+ ast .DictComp (
159
+ key = generate_name ("key" ),
160
+ value = generate_name ("value" ),
161
+ generators = [
162
+ generate_comp (
163
+ target = "key, value" ,
164
+ iter_ = "arguments.items()" ,
165
+ ifs = [
166
+ ast .Compare (
167
+ left = generate_subscript (
168
+ value = generate_name ("value" ),
169
+ slice_ = ast .Index (
170
+ value = generate_constant ("value" ),
171
+ ), # type: ignore
172
+ ),
173
+ ops = [ast .IsNot ()],
174
+ comparators = [generate_constant (None )],
175
+ )
176
+ ],
177
+ )
178
+ ],
179
+ ),
180
+ ),
125
181
generate_return (
126
182
value = generate_call (
127
183
func = generate_name (return_type_name ),
@@ -131,10 +187,13 @@ def _generate_method(
131
187
arg = "field_name" ,
132
188
value = generate_constant (value = operation_name ),
133
189
),
134
- return_arguments ,
190
+ generate_keyword (
191
+ arg = "arguments" ,
192
+ value = generate_name ("cleared_arguments" ),
193
+ ),
135
194
],
136
195
)
137
- )
196
+ ),
138
197
],
139
198
decorator_list = [generate_name ("classmethod" )],
140
199
)
@@ -171,11 +230,8 @@ def _generate_arguments(self, operation_args):
171
230
method_arguments = self ._assemble_method_arguments (
172
231
cls_arg , args , kw_only_args , kw_defaults
173
232
)
174
- return_arguments = self ._assemble_return_arguments (
175
- return_arguments_keys , return_arguments_values
176
- )
177
233
178
- return method_arguments , return_arguments
234
+ return method_arguments , return_arguments_keys , return_arguments_values
179
235
180
236
def _accumulate_method_arguments (
181
237
self , args , kw_only_args , kw_defaults , name , annotation , is_required
@@ -231,15 +287,6 @@ def _assemble_method_arguments(self, cls_arg, args, kw_only_args, kw_defaults):
231
287
kw_defaults = kw_defaults ,
232
288
)
233
289
234
- def _assemble_return_arguments (self , keys , values ):
235
- return generate_keyword (
236
- arg = "arguments" ,
237
- value = generate_dict (
238
- keys = keys ,
239
- values = values ,
240
- ),
241
- )
242
-
243
290
def _parse_graphql_type_name (
244
291
self , type_ , nullable : bool = True
245
292
) -> Tuple [Union [ast .Name , ast .Subscript ], Optional [str ]]:
0 commit comments