1
- import os
2
1
import sys
3
- from pathlib import Path
4
2
from typing import Any , List , Optional , Union
5
3
6
- from jinja2 import Environment , FileSystemLoader , Template
7
- from pydantic import BaseModel
4
+ from pydantic import BaseModel as PydanticBaseModel
8
5
from pydantic import Field as PydanticField
9
6
7
+ from .templates import (
8
+ _template_key_value ,
9
+ _template_key_values ,
10
+ _template_key_argument ,
11
+ _template_key_variable ,
12
+ _template_key_arguments ,
13
+ _template_key_objects ,
14
+ _template_directive ,
15
+ _template_variable ,
16
+ _template_operation ,
17
+ _template_query ,
18
+ _template_fragment ,
19
+ _template_inline_fragment ,
20
+ _template_field ,
21
+ )
22
+
10
23
if sys .version_info >= (3 , 10 ):
11
24
from typing import TypeGuard
12
25
else :
25
38
]
26
39
27
40
28
- # templates setting for render of classes
29
- TEMPLATES_FOLDER = Path (os .path .join (os .path .dirname (__file__ ), "templates/" ))
30
-
31
- template_env = Environment (loader = FileSystemLoader (searchpath = TEMPLATES_FOLDER ))
32
-
33
-
34
- class _GraphQL2PythonQuery (BaseModel ):
41
+ class _GraphQL2PythonQuery (PydanticBaseModel ):
35
42
"""An abstract class for GraphQL query type."""
36
43
37
44
class Config :
38
- # pylint: disable=too-few-public-methods
39
- smart_union = True
40
45
extra = "forbid"
41
46
arbitrary_types_allowed = True
42
- allow_reuse = True
43
47
44
48
@staticmethod
45
49
def _line_shift (text : str ) -> str :
@@ -93,14 +97,12 @@ class Variable(_GraphQL2PythonQuery):
93
97
type : str
94
98
default : Optional [str ] = PydanticField (default = None )
95
99
96
- _template : Template = template_env .get_template ("variable.jinja2" )
97
-
98
100
def render (self ) -> str :
99
- return self . _template .render (name = self .name , type = self .type , default = self .default )
101
+ return _template_variable .render (name = self .name , type = self .type , default = self .default )
100
102
101
103
102
104
class Argument (_GraphQL2PythonQuery ):
103
- """GraphQL argument type.
105
+ """GraphQL Argument type.
104
106
105
107
See https://graphql.org/learn/queries/#arguments for more details.
106
108
@@ -164,25 +166,28 @@ class Argument(_GraphQL2PythonQuery):
164
166
value : Union [
165
167
str ,
166
168
int ,
169
+ bool ,
167
170
'Argument' ,
168
171
Variable ,
169
172
List [str ],
170
173
List [int ],
174
+ List [bool ],
171
175
List ['Argument' ],
172
176
List [List ['Argument' ]],
173
177
]
174
178
175
- _template_key_value : Template = template_env .get_template ("argument_key_value.jinja2" )
176
- _template_key_values : Template = template_env .get_template ("argument_key_values.jinja2" )
177
- _template_key_argument : Template = template_env .get_template ("argument_key_argument.jinja2" )
178
- _template_key_variable : Template = template_env .get_template ("argument_key_variable.jinja2" )
179
- _template_key_arguments : Template = template_env .get_template ("argument_key_arguments.jinja2" )
180
- _template_key_objects : Template = template_env .get_template ("argument_key_objects.jinja2" )
181
-
182
179
@staticmethod
183
180
def _check_is_list_of_str (values : List [Any ]) -> TypeGuard [List [str ]]:
184
181
return all (isinstance (value , str ) for value in values )
185
182
183
+ @staticmethod
184
+ def _check_is_list_of_int (values : List [Any ]) -> TypeGuard [List [int ]]:
185
+ return all (isinstance (value , int ) for value in values )
186
+
187
+ @staticmethod
188
+ def _check_is_list_of_bool (values : List [Any ]) -> TypeGuard [List [bool ]]:
189
+ return all (isinstance (value , bool ) for value in values )
190
+
186
191
@staticmethod
187
192
def _check_is_list_of_arguments (values : List [Any ]) -> TypeGuard [List ['Argument' ]]:
188
193
return all (isinstance (value , Argument ) for value in values )
@@ -191,38 +196,49 @@ def _check_is_list_of_arguments(values: List[Any]) -> TypeGuard[List['Argument']
191
196
def _check_is_list_of_list (values : List [Any ]) -> TypeGuard [List [List [Any ]]]:
192
197
return all (isinstance (value , list ) for value in values )
193
198
194
- def _render_for_str (self , name : str , value : str ) -> str :
195
- return self ._template_key_value .render (name = name , value = value )
199
+ @staticmethod
200
+ def _render_for_str (name : str , value : str ) -> str :
201
+ return _template_key_value .render (name = name , value = value )
196
202
197
- def _render_for_int (self , name : str , value : int ) -> str :
198
- return self ._template_key_value .render (name = name , value = str (value ))
203
+ @staticmethod
204
+ def _render_for_int (name : str , value : int ) -> str :
205
+ return _template_key_value .render (name = name , value = str (value ))
199
206
200
- def _render_for_argument (self , name : str , value : 'Argument' ) -> str :
201
- return self ._template_key_argument .render (name = name , argument = self ._line_shift (value .render ()))
207
+ @staticmethod
208
+ def _render_for_list_str (name : str , value : List [str ]) -> str :
209
+ return _template_key_values .render (name = name , values = value )
210
+
211
+ @staticmethod
212
+ def _render_for_list_bool (name : str , value : List [bool ]) -> str :
213
+ return _template_key_values .render (name = name , values = [str (v ).lower () for v in value ])
202
214
203
- def _render_for_list_str (self , name : str , value : List [str ]) -> str :
204
- return self ._template_key_values .render (name = name , values = value )
215
+ @staticmethod
216
+ def _render_for_variable (name : str , value : Variable ) -> str :
217
+ return _template_key_variable .render (name = name , value = value .name )
218
+
219
+ def _render_for_argument (self , name : str , value : 'Argument' ) -> str :
220
+ return _template_key_argument .render (name = name , argument = self ._line_shift (value .render ()))
205
221
206
222
def _render_for_list_argument (self , name : str , value : List ['Argument' ]) -> str :
207
- return self . _template_key_arguments .render (
223
+ return _template_key_arguments .render (
208
224
name = name , arguments = [self ._line_shift (argument .render ()) for argument in value ]
209
225
)
210
226
211
227
def _render_for_list_list_argument (self , name : str , value : List [List ['Argument' ]]) -> str :
212
- return self . _template_key_objects .render (
228
+ return _template_key_objects .render (
213
229
name = name ,
214
230
list_arguments = [
215
231
[self ._line_shift (self ._line_shift (argument .render ())) for argument in arguments ] for arguments in value
216
232
],
217
233
)
218
234
219
- def _render_for_variable (self , name : str , value : Variable ) -> str :
220
- return self ._template_key_variable .render (name = name , value = value .name )
221
-
222
235
def render (self ) -> str :
223
236
if isinstance (self .value , str ):
224
237
return self ._render_for_str (self .name , self .value )
225
238
239
+ if isinstance (self .value , bool ):
240
+ return self ._render_for_str (self .name , str (self .value ).lower ())
241
+
226
242
if isinstance (self .value , int ):
227
243
return self ._render_for_int (self .name , self .value )
228
244
@@ -236,6 +252,12 @@ def render(self) -> str:
236
252
if self ._check_is_list_of_str (self .value ):
237
253
return self ._render_for_list_str (self .name , self .value )
238
254
255
+ if self ._check_is_list_of_bool (self .value ):
256
+ return self ._render_for_list_bool (self .name , self .value )
257
+
258
+ if self ._check_is_list_of_int (self .value ):
259
+ return self ._render_for_list_str (self .name , [str (v ) for v in self .value ])
260
+
239
261
if self ._check_is_list_of_arguments (self .value ):
240
262
return self ._render_for_list_argument (self .name , self .value )
241
263
@@ -285,11 +307,10 @@ class Directive(_GraphQL2PythonQuery):
285
307
name : str
286
308
arguments : List [Argument ] = PydanticField (default_factory = list )
287
309
288
- _template_directive : Template = template_env .get_template ("directive.jinja2" )
289
-
290
310
def render (self ) -> str :
291
- return self ._template_directive .render (
292
- name = self .name , arguments = [self ._line_shift (argument .render ()) for argument in self .arguments ]
311
+ return _template_directive .render (
312
+ name = self .name ,
313
+ arguments = [self ._line_shift (argument .render ()) for argument in self .arguments ],
293
314
)
294
315
295
316
@@ -351,10 +372,8 @@ class Field(_GraphQL2PythonQuery):
351
372
directives : List [Directive ] = PydanticField (default_factory = list )
352
373
typename : bool = PydanticField (default = False , description = "Add meta field `__typename` to sub-fields." )
353
374
354
- _template : Template = template_env .get_template ("field.jinja2" )
355
-
356
375
def render (self ) -> str :
357
- return self . _template .render (
376
+ return _template_field .render (
358
377
name = self .name ,
359
378
alias = self .alias ,
360
379
arguments = [self ._line_shift (argument .render ()) for argument in self .arguments ],
@@ -405,10 +424,8 @@ class InlineFragment(_GraphQL2PythonQuery):
405
424
fields : List [Union [str , 'Field' , 'InlineFragment' , 'Fragment' ]] = PydanticField (default_factory = list )
406
425
typename : bool = PydanticField (default = False , description = "Add meta field `__typename` to sub-fields." )
407
426
408
- _template : Template = template_env .get_template ("inline_fragment.jinja2" )
409
-
410
427
def render (self ) -> str :
411
- return self . _template .render (
428
+ return _template_inline_fragment .render (
412
429
type = self .type ,
413
430
arguments = [self ._line_shift (argument .render ()) for argument in self .arguments ],
414
431
fields = [self ._render_field (field ) for field in self .fields ],
@@ -465,10 +482,8 @@ class Fragment(_GraphQL2PythonQuery):
465
482
fields : List [Union [str , 'Field' , 'InlineFragment' , 'Fragment' ]] = PydanticField (default_factory = list )
466
483
typename : bool = PydanticField (default = False , description = "Add meta field `__typename` to sub-fields" )
467
484
468
- _template : Template = template_env .get_template ("fragment.jinja2" )
469
-
470
485
def render (self ) -> str :
471
- return self . _template .render (
486
+ return _template_fragment .render (
472
487
name = self .name ,
473
488
type = self .type ,
474
489
fields = [self ._render_field (field ) for field in self .fields ],
@@ -520,10 +535,8 @@ class Query(_GraphQL2PythonQuery):
520
535
typename : bool = PydanticField (default = False , description = "Add meta field `__typename` to the query." )
521
536
fields : List [Union [str , 'Field' , 'InlineFragment' , 'Fragment' ]] = PydanticField (default_factory = list )
522
537
523
- _template : Template = template_env .get_template ("query.jinja2" )
524
-
525
538
def render (self ) -> str :
526
- return self . _template .render (
539
+ return _template_query .render (
527
540
name = self .name ,
528
541
alias = self .alias ,
529
542
arguments = [self ._line_shift (argument .render ()) for argument in self .arguments ],
@@ -533,7 +546,7 @@ def render(self) -> str:
533
546
534
547
535
548
class Operation (_GraphQL2PythonQuery ):
536
- """GraphQL operation type.
549
+ """GraphQL Operation type.
537
550
538
551
See https://graphql.org/learn/queries/ for more details.
539
552
@@ -590,23 +603,11 @@ class Operation(_GraphQL2PythonQuery):
590
603
default_factory = list , description = "https://graphql.org/learn/queries/#fragments"
591
604
)
592
605
593
- _template : Template = template_env .get_template ("operation.jinja2" )
594
- _supported_types = ["query" , "mutation" , "subscription" ]
595
-
596
606
def render (self ) -> str :
597
- return self . _template .render (
607
+ return _template_operation .render (
598
608
type = self .type ,
599
609
name = self .name ,
600
610
variables = [self ._line_shift (variable .render ()) for variable in self .variables ],
601
611
queries = [self ._line_shift (query .render ()) for query in self .queries ],
602
612
fragments = [fragment .render () for fragment in self .fragments ],
603
613
)
604
-
605
-
606
- Variable .update_forward_refs ()
607
- Argument .update_forward_refs ()
608
- Field .update_forward_refs ()
609
- InlineFragment .update_forward_refs ()
610
- Fragment .update_forward_refs ()
611
- Query .update_forward_refs ()
612
- Operation .update_forward_refs ()
0 commit comments