55from gql .query_parser import ParsedQuery , ParsedField , ParsedObject , ParsedEnum , ParsedOperation , ParsedVariableDefinition
66
77
8- CLASS_TEMPLATE = """
9- @dataclass_json
10- @dataclass(frozen=True)
11- """
12-
13-
148class DataclassesRenderer :
159
1610 def __init__ (self , schema : GraphQLSchema , config : Config ):
@@ -42,8 +36,8 @@ def render(self, parsed_query: ParsedQuery):
4236 for enum in parsed_query .enums :
4337 self .__render_enum (buffer , enum )
4438
45- # Iterate in reverse so that operation is last
46- for obj in parsed_query . objects [:: - 1 ] :
39+ sorted_objects = sorted ( parsed_query . objects , key = lambda obj : 1 if isinstance ( obj , ParsedOperation ) else 0 )
40+ for obj in sorted_objects :
4741 if isinstance (obj , ParsedObject ):
4842 self .__render_object (parsed_query , buffer , obj )
4943 elif isinstance (obj , ParsedOperation ):
@@ -73,21 +67,26 @@ def __render_datetime_field(buffer: CodeChunk):
7367 buffer .write ('' )
7468
7569 def __render_object (self , parsed_query : ParsedQuery , buffer : CodeChunk , obj : ParsedObject ):
70+ class_parents = '' if not obj .parents else f'({ ", " .join (obj .parents )} )'
71+
7672 buffer .write ('@dataclass_json' )
7773 buffer .write ('@dataclass' )
78- with buffer .write_block (f'class { obj .name } ( { ", " . join ( obj . parents ) } ) :' ):
74+ with buffer .write_block (f'class { obj .name } { class_parents } :' ):
7975 # render child objects
80- if not obj .children :
81- buffer .write ('pass' )
82- else :
83- for child_object in obj .children :
84- self .__render_object (parsed_query , buffer , child_object )
76+ for child_object in obj .children :
77+ self .__render_object (parsed_query , buffer , child_object )
8578
8679 # render fields
8780 sorted_fields = sorted (obj .fields , key = lambda f : 1 if f .nullable else 0 )
8881 for field in sorted_fields :
8982 self .__render_field (parsed_query , buffer , field )
9083
84+ # pass if not children or fields
85+ if not (obj .children or obj .fields ):
86+ buffer .write ('pass' )
87+
88+ buffer .write ('' )
89+
9190 def __render_operation (self , parsed_query : ParsedQuery , buffer : CodeChunk , parsed_op : ParsedOperation ):
9291 buffer .write ('@dataclass_json' )
9392 buffer .write ('@dataclass' )
@@ -122,6 +121,8 @@ def __render_operation(self, parsed_query: ParsedQuery, buffer: CodeChunk, parse
122121 buffer .write ('response_text = client.call(cls.__QUERY__, variables=variables, on_before_callback=on_before_callback)' )
123122 buffer .write ('return cls.from_json(response_text)' )
124123
124+ buffer .write ('' )
125+
125126 buffer .write ('@classmethod' )
126127 with buffer .write_block (f'async def execute_async(cls, { vars_args } on_before_callback: Callable[[Mapping[str, str], Mapping[str, str]], None] = None):' ):
127128 buffer .write (f'client = AsyncIOClient(\' { self .config .endpoint } \' )' )
@@ -143,18 +144,20 @@ def __render_variable_definition(var: ParsedVariableDefinition):
143144 def __render_field (parsed_query : ParsedQuery , buffer : CodeChunk , field : ParsedField ):
144145 enum_names = [e .name for e in parsed_query .enums ]
145146 is_enum = field .type in enum_names
147+ suffix = ''
148+ field_type = field .type
149+
146150 if is_enum :
147- buffer .write (f'{ field .name } : { field .type } = enum_field({ field .type } )' )
148- return
151+ suffix = f'= enum_field({ field .type } )'
149152
150153 if field .type == 'DateTime' :
151- buffer . write ( f' { field . name } : datetime = DATETIME_FIELD')
152- return
154+ suffix = ' = DATETIME_FIELD'
155+ field_type = 'datetime'
153156
154157 if field .nullable :
155- buffer . write ( f' { field . name } : { field . type } = { field .default_value } ')
156- else :
157- buffer .write (f'{ field .name } : { field . type } ' )
158+ suffix = f' = { field .default_value } '
159+
160+ buffer .write (f'{ field .name } : { field_type } { suffix } ' )
158161
159162 @staticmethod
160163 def __render_enum (buffer : CodeChunk , enum : ParsedEnum ):
0 commit comments