@@ -45,9 +45,17 @@ class Project:
45
45
package_name_override : Optional [str ] = None
46
46
package_version_override : Optional [str ] = None
47
47
48
- def __init__ (self , * , openapi : GeneratorData , meta : MetaType , custom_template_path : Optional [Path ] = None ) -> None :
48
+ def __init__ (
49
+ self ,
50
+ * ,
51
+ openapi : GeneratorData ,
52
+ meta : MetaType ,
53
+ custom_template_path : Optional [Path ] = None ,
54
+ file_encoding : str = "utf-8" ,
55
+ ) -> None :
49
56
self .openapi : GeneratorData = openapi
50
57
self .meta : MetaType = meta
58
+ self .file_encoding = file_encoding
51
59
52
60
package_loader = PackageLoader (__package__ )
53
61
loader : BaseLoader
@@ -137,15 +145,17 @@ def _create_package(self) -> None:
137
145
package_init = self .package_dir / "__init__.py"
138
146
139
147
package_init_template = self .env .get_template ("package_init.py.jinja" )
140
- package_init .write_text (package_init_template .render (description = self .package_description ))
148
+ package_init .write_text (
149
+ package_init_template .render (description = self .package_description ), encoding = self .file_encoding
150
+ )
141
151
142
152
if self .meta != MetaType .NONE :
143
153
pytyped = self .package_dir / "py.typed"
144
- pytyped .write_text ("# Marker file for PEP 561" )
154
+ pytyped .write_text ("# Marker file for PEP 561" , encoding = self . file_encoding )
145
155
146
156
types_template = self .env .get_template ("types.py.jinja" )
147
157
types_path = self .package_dir / "types.py"
148
- types_path .write_text (types_template .render ())
158
+ types_path .write_text (types_template .render (), encoding = self . file_encoding )
149
159
150
160
def _build_metadata (self ) -> None :
151
161
if self .meta == MetaType .NONE :
@@ -161,13 +171,14 @@ def _build_metadata(self) -> None:
161
171
readme .write_text (
162
172
readme_template .render (
163
173
project_name = self .project_name , description = self .package_description , package_name = self .package_name
164
- )
174
+ ),
175
+ encoding = self .file_encoding ,
165
176
)
166
177
167
178
# .gitignore
168
179
git_ignore_path = self .project_dir / ".gitignore"
169
180
git_ignore_template = self .env .get_template (".gitignore.jinja" )
170
- git_ignore_path .write_text (git_ignore_template .render ())
181
+ git_ignore_path .write_text (git_ignore_template .render (), encoding = self . file_encoding )
171
182
172
183
def _build_pyproject_toml (self , * , use_poetry : bool ) -> None :
173
184
template = "pyproject.toml.jinja" if use_poetry else "pyproject_no_poetry.toml.jinja"
@@ -179,7 +190,8 @@ def _build_pyproject_toml(self, *, use_poetry: bool) -> None:
179
190
package_name = self .package_name ,
180
191
version = self .version ,
181
192
description = self .package_description ,
182
- )
193
+ ),
194
+ encoding = self .file_encoding ,
183
195
)
184
196
185
197
def _build_setup_py (self ) -> None :
@@ -191,7 +203,8 @@ def _build_setup_py(self) -> None:
191
203
package_name = self .package_name ,
192
204
version = self .version ,
193
205
description = self .package_description ,
194
- )
206
+ ),
207
+ encoding = self .file_encoding ,
195
208
)
196
209
197
210
def _build_models (self ) -> None :
@@ -204,7 +217,7 @@ def _build_models(self) -> None:
204
217
model_template = self .env .get_template ("model.py.jinja" )
205
218
for model in self .openapi .models .values ():
206
219
module_path = models_dir / f"{ model .reference .module_name } .py"
207
- module_path .write_text (model_template .render (model = model ))
220
+ module_path .write_text (model_template .render (model = model ), encoding = self . file_encoding )
208
221
imports .append (import_string_from_reference (model .reference ))
209
222
210
223
# Generate enums
@@ -213,25 +226,25 @@ def _build_models(self) -> None:
213
226
for enum in self .openapi .enums .values ():
214
227
module_path = models_dir / f"{ enum .reference .module_name } .py"
215
228
if enum .value_type is int :
216
- module_path .write_text (int_enum_template .render (enum = enum ))
229
+ module_path .write_text (int_enum_template .render (enum = enum ), encoding = self . file_encoding )
217
230
else :
218
- module_path .write_text (str_enum_template .render (enum = enum ))
231
+ module_path .write_text (str_enum_template .render (enum = enum ), encoding = self . file_encoding )
219
232
imports .append (import_string_from_reference (enum .reference ))
220
233
221
234
models_init_template = self .env .get_template ("models_init.py.jinja" )
222
- models_init .write_text (models_init_template .render (imports = imports ))
235
+ models_init .write_text (models_init_template .render (imports = imports ), encoding = self . file_encoding )
223
236
224
237
def _build_api (self ) -> None :
225
238
# Generate Client
226
239
client_path = self .package_dir / "client.py"
227
240
client_template = self .env .get_template ("client.py.jinja" )
228
- client_path .write_text (client_template .render ())
241
+ client_path .write_text (client_template .render (), encoding = self . file_encoding )
229
242
230
243
# Generate endpoints
231
244
api_dir = self .package_dir / "api"
232
245
api_dir .mkdir ()
233
246
api_init = api_dir / "__init__.py"
234
- api_init .write_text ('""" Contains methods for accessing the API """' )
247
+ api_init .write_text ('""" Contains methods for accessing the API """' , encoding = self . file_encoding )
235
248
236
249
endpoint_template = self .env .get_template ("endpoint_module.py.jinja" )
237
250
for tag , collection in self .openapi .endpoint_collections_by_tag .items ():
@@ -241,46 +254,64 @@ def _build_api(self) -> None:
241
254
242
255
for endpoint in collection .endpoints :
243
256
module_path = tag_dir / f"{ snake_case (endpoint .name )} .py"
244
- module_path .write_text (endpoint_template .render (endpoint = endpoint ))
257
+ module_path .write_text (endpoint_template .render (endpoint = endpoint ), encoding = self . file_encoding )
245
258
246
259
247
260
def _get_project_for_url_or_path (
248
- url : Optional [str ], path : Optional [Path ], meta : MetaType , custom_template_path : Optional [Path ] = None
261
+ url : Optional [str ],
262
+ path : Optional [Path ],
263
+ meta : MetaType ,
264
+ custom_template_path : Optional [Path ] = None ,
265
+ file_encoding : str = "utf-8" ,
249
266
) -> Union [Project , GeneratorError ]:
250
267
data_dict = _get_document (url = url , path = path )
251
268
if isinstance (data_dict , GeneratorError ):
252
269
return data_dict
253
270
openapi = GeneratorData .from_dict (data_dict )
254
271
if isinstance (openapi , GeneratorError ):
255
272
return openapi
256
- return Project (openapi = openapi , custom_template_path = custom_template_path , meta = meta )
273
+ return Project (openapi = openapi , custom_template_path = custom_template_path , meta = meta , file_encoding = file_encoding )
257
274
258
275
259
276
def create_new_client (
260
- * , url : Optional [str ], path : Optional [Path ], meta : MetaType , custom_template_path : Optional [Path ] = None
277
+ * ,
278
+ url : Optional [str ],
279
+ path : Optional [Path ],
280
+ meta : MetaType ,
281
+ custom_template_path : Optional [Path ] = None ,
282
+ file_encoding : str = "utf-8" ,
261
283
) -> Sequence [GeneratorError ]:
262
284
"""
263
285
Generate the client library
264
286
265
287
Returns:
266
288
A list containing any errors encountered when generating.
267
289
"""
268
- project = _get_project_for_url_or_path (url = url , path = path , custom_template_path = custom_template_path , meta = meta )
290
+ project = _get_project_for_url_or_path (
291
+ url = url , path = path , custom_template_path = custom_template_path , meta = meta , file_encoding = file_encoding
292
+ )
269
293
if isinstance (project , GeneratorError ):
270
294
return [project ]
271
295
return project .build ()
272
296
273
297
274
298
def update_existing_client (
275
- * , url : Optional [str ], path : Optional [Path ], meta : MetaType , custom_template_path : Optional [Path ] = None
299
+ * ,
300
+ url : Optional [str ],
301
+ path : Optional [Path ],
302
+ meta : MetaType ,
303
+ custom_template_path : Optional [Path ] = None ,
304
+ file_encoding : str = "utf-8" ,
276
305
) -> Sequence [GeneratorError ]:
277
306
"""
278
307
Update an existing client library
279
308
280
309
Returns:
281
310
A list containing any errors encountered when generating.
282
311
"""
283
- project = _get_project_for_url_or_path (url = url , path = path , custom_template_path = custom_template_path , meta = meta )
312
+ project = _get_project_for_url_or_path (
313
+ url = url , path = path , custom_template_path = custom_template_path , meta = meta , file_encoding = file_encoding
314
+ )
284
315
if isinstance (project , GeneratorError ):
285
316
return [project ]
286
317
return project .update ()
0 commit comments