@@ -76,6 +76,7 @@ def get_py_zero(type_num: int) -> Union[str, float]:
76
76
return zero
77
77
78
78
79
+ # Todo: Keep information about nested hierarchy
79
80
def traverse (proto_file ):
80
81
def _traverse (path , items , prefix = "" ):
81
82
for i , item in enumerate (items ):
@@ -146,11 +147,10 @@ def generate_code(request, response):
146
147
)
147
148
output_package_files [output_package ]["files" ].append (proto_file )
148
149
149
- output_paths = set ()
150
+ # Initialize Template data for each package
150
151
for output_package_name , output_package_content in output_package_files .items ():
151
- input_package_name = output_package_content ["input_package" ]
152
152
template_data = {
153
- "input_package" : input_package_name ,
153
+ "input_package" : output_package_content [ "input_package" ] ,
154
154
"files" : [f .name for f in output_package_content ["files" ]],
155
155
"imports" : set (),
156
156
"datetime_imports" : set (),
@@ -159,15 +159,26 @@ def generate_code(request, response):
159
159
"enums" : [],
160
160
"services" : [],
161
161
}
162
+ output_package_content ["template_data" ] = template_data
162
163
164
+ # Read Messages and Enums
165
+ for output_package_name , output_package_content in output_package_files .items ():
163
166
for proto_file in output_package_content ["files" ]:
164
- item : DescriptorProto
165
167
for item , path in traverse (proto_file ):
166
- read_protobuf_type ( input_package_name , item , path , proto_file , template_data )
168
+ read_protobuf_object ( item , path , proto_file , output_package_content )
167
169
168
- for i , service in enumerate (proto_file .service ):
169
- read_protobuf_service (i , input_package_name , proto_file , service , template_data )
170
+ # Read Services
171
+ for output_package_name , output_package_content in output_package_files .items ():
172
+ for proto_file in output_package_content ["files" ]:
173
+ for index , service in enumerate (proto_file .service ):
174
+ read_protobuf_service (
175
+ service , index , proto_file , output_package_content
176
+ )
170
177
178
+ # Render files
179
+ output_paths = set ()
180
+ for output_package_name , output_package_content in output_package_files .items ():
181
+ template_data = output_package_content ["template_data" ]
171
182
template_data ["imports" ] = sorted (template_data ["imports" ])
172
183
template_data ["datetime_imports" ] = sorted (template_data ["datetime_imports" ])
173
184
template_data ["typing_imports" ] = sorted (template_data ["typing_imports" ])
@@ -203,12 +214,14 @@ def generate_code(request, response):
203
214
print (f"Writing { output_package_name } " , file = sys .stderr )
204
215
205
216
206
- def read_protobuf_service (i , input_package_name , proto_file , service , template_data ):
217
+ def read_protobuf_service (service : DescriptorProto , index , proto_file , content ):
218
+ input_package_name = content ["input_package" ]
219
+ template_data = content ["template_data" ]
207
220
# print(service, file=sys.stderr)
208
221
data = {
209
222
"name" : service .name ,
210
223
"py_name" : pythonize_class_name (service .name ),
211
- "comment" : get_comment (proto_file , [6 , i ]),
224
+ "comment" : get_comment (proto_file , [6 , index ]),
212
225
"methods" : [],
213
226
}
214
227
for j , method in enumerate (service .method ):
@@ -228,7 +241,7 @@ def read_protobuf_service(i, input_package_name, proto_file, service, template_d
228
241
{
229
242
"name" : method .name ,
230
243
"py_name" : pythonize_method_name (method .name ),
231
- "comment" : get_comment (proto_file , [6 , i , 2 , j ], indent = 8 ),
244
+ "comment" : get_comment (proto_file , [6 , index , 2 , j ], indent = 8 ),
232
245
"route" : f"/{ input_package_name } .{ service .name } /{ method .name } " ,
233
246
"input" : get_type_reference (
234
247
input_package_name , template_data ["imports" ], method .input_type
@@ -254,7 +267,9 @@ def read_protobuf_service(i, input_package_name, proto_file, service, template_d
254
267
template_data ["services" ].append (data )
255
268
256
269
257
- def read_protobuf_type (input_package_name , item , path , proto_file , template_data ):
270
+ def read_protobuf_object (item : DescriptorProto , path : List [int ], proto_file , content ):
271
+ input_package_name = content ["input_package" ]
272
+ template_data = content ["template_data" ]
258
273
data = {"name" : item .name , "py_name" : pythonize_class_name (item .name )}
259
274
if isinstance (item , DescriptorProto ):
260
275
# print(item, file=sys.stderr)
@@ -280,9 +295,7 @@ def read_protobuf_type(input_package_name, item, path, proto_file, template_data
280
295
field_type = f .Type .Name (f .type ).lower ()[5 :]
281
296
282
297
field_wraps = ""
283
- match_wrapper = re .match (
284
- r"\.google\.protobuf\.(.+)Value" , f .type_name
285
- )
298
+ match_wrapper = re .match (r"\.google\.protobuf\.(.+)Value" , f .type_name )
286
299
if match_wrapper :
287
300
wrapped_type = "TYPE_" + match_wrapper .group (1 ).upper ()
288
301
if hasattr (betterproto , wrapped_type ):
@@ -297,10 +310,7 @@ def read_protobuf_type(input_package_name, item, path, proto_file, template_data
297
310
298
311
if message_type == map_entry :
299
312
for nested in item .nested_type :
300
- if (
301
- nested .name .replace ("_" , "" ).lower ()
302
- == map_entry
303
- ):
313
+ if nested .name .replace ("_" , "" ).lower () == map_entry :
304
314
if nested .options .map_entry :
305
315
# print("Found a map!", file=sys.stderr)
306
316
k = py_type (
0 commit comments