@autorest/python 5.12.6 → 5.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/ChangeLog.md +205 -125
  2. package/autorest/black/__init__.py +3 -0
  3. package/autorest/codegen/__init__.py +120 -48
  4. package/autorest/codegen/models/__init__.py +2 -1
  5. package/autorest/codegen/models/base_schema.py +2 -6
  6. package/autorest/codegen/models/client.py +6 -0
  7. package/autorest/codegen/models/code_model.py +43 -74
  8. package/autorest/codegen/models/constant_schema.py +7 -7
  9. package/autorest/codegen/models/credential_model.py +47 -0
  10. package/autorest/codegen/models/credential_schema.py +5 -4
  11. package/autorest/codegen/models/dictionary_schema.py +7 -7
  12. package/autorest/codegen/models/enum_schema.py +8 -39
  13. package/autorest/codegen/models/imports.py +3 -1
  14. package/autorest/codegen/models/list_schema.py +18 -8
  15. package/autorest/codegen/models/lro_operation.py +3 -3
  16. package/autorest/codegen/models/lro_paging_operation.py +3 -3
  17. package/autorest/codegen/models/object_schema.py +17 -13
  18. package/autorest/codegen/models/operation.py +38 -10
  19. package/autorest/codegen/models/operation_group.py +7 -2
  20. package/autorest/codegen/models/paging_operation.py +3 -3
  21. package/autorest/codegen/models/parameter.py +71 -22
  22. package/autorest/codegen/models/parameter_list.py +11 -5
  23. package/autorest/codegen/models/primitive_schemas.py +15 -25
  24. package/autorest/codegen/models/property.py +5 -5
  25. package/autorest/codegen/models/request_builder.py +4 -4
  26. package/autorest/codegen/models/request_builder_parameter.py +17 -5
  27. package/autorest/codegen/models/schema_response.py +23 -10
  28. package/autorest/codegen/models/utils.py +20 -0
  29. package/autorest/codegen/serializers/__init__.py +184 -87
  30. package/autorest/codegen/serializers/builder_serializer.py +113 -47
  31. package/autorest/codegen/serializers/client_serializer.py +16 -6
  32. package/autorest/codegen/serializers/general_serializer.py +28 -4
  33. package/autorest/codegen/serializers/import_serializer.py +1 -1
  34. package/autorest/codegen/serializers/metadata_serializer.py +1 -1
  35. package/autorest/codegen/serializers/model_base_serializer.py +8 -0
  36. package/autorest/codegen/serializers/model_python3_serializer.py +2 -2
  37. package/autorest/codegen/serializers/operation_groups_serializer.py +1 -0
  38. package/autorest/codegen/serializers/patch_serializer.py +12 -3
  39. package/autorest/codegen/serializers/utils.py +29 -4
  40. package/autorest/codegen/templates/CHANGELOG.md.jinja2 +6 -0
  41. package/autorest/codegen/templates/LICENSE.jinja2 +21 -0
  42. package/autorest/codegen/templates/MANIFEST.in.jinja2 +7 -0
  43. package/autorest/codegen/templates/README.md.jinja2 +105 -0
  44. package/autorest/codegen/templates/config.py.jinja2 +4 -4
  45. package/autorest/codegen/templates/dev_requirements.txt.jinja2 +10 -0
  46. package/autorest/codegen/templates/enum.py.jinja2 +1 -1
  47. package/autorest/codegen/templates/enum_container.py.jinja2 +0 -1
  48. package/autorest/codegen/templates/init.py.jinja2 +9 -6
  49. package/autorest/codegen/templates/keywords.jinja2 +14 -1
  50. package/autorest/codegen/templates/lro_operation.py.jinja2 +1 -1
  51. package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +1 -1
  52. package/autorest/codegen/templates/metadata.json.jinja2 +3 -3
  53. package/autorest/codegen/templates/model.py.jinja2 +1 -6
  54. package/autorest/codegen/templates/model_init.py.jinja2 +7 -4
  55. package/autorest/codegen/templates/operation.py.jinja2 +2 -3
  56. package/autorest/codegen/templates/operation_group.py.jinja2 +20 -17
  57. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +0 -1
  58. package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -0
  59. package/autorest/codegen/templates/paging_operation.py.jinja2 +1 -1
  60. package/autorest/codegen/templates/patch.py.jinja2 +18 -29
  61. package/autorest/codegen/templates/request_builder.py.jinja2 +4 -6
  62. package/autorest/codegen/templates/setup.py.jinja2 +79 -20
  63. package/autorest/codegen/templates/vendor.py.jinja2 +12 -2
  64. package/autorest/multiapi/models/imports.py +21 -11
  65. package/autorest/multiapi/serializers/import_serializer.py +3 -1
  66. package/autorest/namer/name_converter.py +1 -1
  67. package/package.json +2 -2
  68. package/run-python3.js +1 -7
  69. package/venvtools.py +2 -2
@@ -3,9 +3,9 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
- from typing import List, Optional
6
+ from typing import Dict, List, Optional, Any
7
7
  from pathlib import Path
8
- from jinja2 import PackageLoader, Environment
8
+ from jinja2 import PackageLoader, Environment, FileSystemLoader, StrictUndefined
9
9
  from autorest.codegen.models.operation_group import OperationGroup
10
10
 
11
11
  from ...jsonrpc import AutorestAPI
@@ -13,6 +13,7 @@ from ..models import (
13
13
  CodeModel,
14
14
  OperationGroup,
15
15
  RequestBuilder,
16
+ TokenCredentialSchema
16
17
  )
17
18
  from .enum_serializer import EnumSerializer
18
19
  from .general_serializer import GeneralSerializer
@@ -29,11 +30,30 @@ __all__ = [
29
30
  "JinjaSerializer",
30
31
  ]
31
32
 
33
+ _PACKAGE_FILES = [
34
+ "CHANGELOG.md.jinja2",
35
+ "dev_requirements.txt.jinja2",
36
+ "LICENSE.jinja2",
37
+ "MANIFEST.in.jinja2",
38
+ "README.md.jinja2",
39
+ "setup.py.jinja2",
40
+ ]
41
+
42
+ _REGENERATE_FILES = {
43
+ "setup.py",
44
+ "MANIFEST.in"
45
+ }
46
+
32
47
  class JinjaSerializer:
33
- def __init__(self, autorestapi: AutorestAPI) -> None:
48
+ def __init__(self, autorestapi: AutorestAPI, code_model: CodeModel) -> None:
34
49
  self._autorestapi = autorestapi
50
+ self.code_model = code_model
51
+
52
+ @property
53
+ def has_aio_folder(self) -> bool:
54
+ return not self.code_model.options["no_async"] and bool(self.code_model.rest.request_builders)
35
55
 
36
- def serialize(self, code_model: CodeModel) -> None:
56
+ def serialize(self) -> None:
37
57
  env = Environment(
38
58
  loader=PackageLoader("autorest.codegen", "templates"),
39
59
  keep_trailing_newline=True,
@@ -44,85 +64,162 @@ class JinjaSerializer:
44
64
  )
45
65
 
46
66
  namespace_path = (
47
- Path(".") if code_model.options["no_namespace_folders"] else Path(*(code_model.namespace.split(".")))
67
+ Path(".")
68
+ if self.code_model.options["no_namespace_folders"]
69
+ else Path(*(self.code_model.namespace.split(".")))
48
70
  )
49
-
50
71
  # if there was a patch file before, we keep it
51
72
  self._keep_patch_file(namespace_path / Path("_patch.py"), env)
52
- self._keep_patch_file(namespace_path / Path("aio") / Path("_patch.py"), env)
73
+ if self.has_aio_folder:
74
+ self._keep_patch_file(namespace_path / Path("aio") / Path("_patch.py"), env)
75
+
76
+ if self.code_model.options["models_mode"] and (self.code_model.schemas or self.code_model.enums):
77
+ self._keep_patch_file(namespace_path / Path("models") / Path("_patch.py"), env)
78
+ if self.code_model.options["show_operations"] and self.code_model.operation_groups:
79
+ self._keep_patch_file(
80
+ namespace_path / Path(self.code_model.operations_folder_name) / Path("_patch.py"), env
81
+ )
82
+ if self.has_aio_folder:
83
+ self._keep_patch_file(
84
+ namespace_path / Path("aio") / Path(self.code_model.operations_folder_name) / Path("_patch.py"), env
85
+ )
53
86
 
54
- self._serialize_and_write_top_level_folder(code_model=code_model, env=env, namespace_path=namespace_path)
87
+ self._serialize_and_write_top_level_folder(env=env, namespace_path=namespace_path)
55
88
 
56
- if code_model.rest.request_builders:
57
- if code_model.options["builders_visibility"] != "embedded":
58
- self._serialize_and_write_rest_layer(code_model=code_model, env=env, namespace_path=namespace_path)
59
- if not code_model.options["no_async"]:
89
+ if self.code_model.rest.request_builders:
90
+ if self.code_model.options["builders_visibility"] != "embedded":
91
+ self._serialize_and_write_rest_layer(env=env, namespace_path=namespace_path)
92
+ if self.has_aio_folder:
60
93
  self._serialize_and_write_aio_top_level_folder(
61
- code_model=code_model, env=env, namespace_path=namespace_path,
94
+ env=env, namespace_path=namespace_path,
62
95
  )
63
96
 
64
- if code_model.options["show_operations"] and code_model.operation_groups:
65
- self._serialize_and_write_operations_folder(code_model=code_model, env=env, namespace_path=namespace_path)
66
- if code_model.options["multiapi"]:
97
+ if self.code_model.options["show_operations"] and self.code_model.operation_groups:
98
+ self._serialize_and_write_operations_folder(env=env, namespace_path=namespace_path)
99
+ if self.code_model.options["multiapi"]:
67
100
  self._serialize_and_write_metadata(
68
- code_model, env=env, namespace_path=namespace_path
101
+ env=env, namespace_path=namespace_path
69
102
  )
70
103
 
71
- if code_model.options["models_mode"] and (code_model.schemas or code_model.enums):
72
- self._serialize_and_write_models_folder(code_model=code_model, env=env, namespace_path=namespace_path)
104
+ if self.code_model.options["models_mode"] and (self.code_model.schemas or self.code_model.enums):
105
+ self._serialize_and_write_models_folder(env=env, namespace_path=namespace_path)
106
+ if not self.code_model.options["models_mode"]:
107
+ # keep models file if users ended up just writing a models file
108
+ if self._autorestapi.read_file(namespace_path / Path("models.py")):
109
+ self._autorestapi.write_file(
110
+ namespace_path / Path("models.py"), self._autorestapi.read_file(namespace_path / Path("models.py"))
111
+ )
73
112
 
113
+ if self.code_model.options["package_mode"]:
114
+ self._serialize_and_write_package_files(out_path=namespace_path)
115
+
116
+
117
+ def _serialize_and_write_package_files(self, out_path: Path) -> None:
118
+ def _serialize_and_write_package_files_proc(**kwargs: Any):
119
+ for template_name in package_files:
120
+ file = template_name.replace(".jinja2", "")
121
+ output_name = out_path / file
122
+ if not self._autorestapi.read_file(output_name) or file in _REGENERATE_FILES:
123
+ template = env.get_template(template_name)
124
+ render_result = template.render(**kwargs)
125
+ self._autorestapi.write_file(output_name, render_result)
126
+
127
+ def _prepare_params() -> Dict[Any, Any]:
128
+ package_parts = self.code_model.options["package_name"].split("-")[:-1]
129
+ try:
130
+ token_cred = isinstance(
131
+ self.code_model.credential_model.credential_schema_policy.credential,
132
+ TokenCredentialSchema
133
+ )
134
+ except ValueError:
135
+ token_cred = False
136
+ version = self.code_model.options["package_version"]
137
+ if any(x in version for x in ["a", "b", "rc"]) or version[0] == '0':
138
+ dev_status = "4 - Beta"
139
+ else:
140
+ dev_status = "5 - Production/Stable"
141
+ params = {
142
+ "token_credential": token_cred,
143
+ "pkgutil_names": [".".join(package_parts[: i + 1]) for i in range(len(package_parts))],
144
+ "init_names": ["/".join(package_parts[: i + 1]) + "/__init__.py" for i in range(len(package_parts))],
145
+ "dev_status": dev_status
146
+ }
147
+ params.update(self.code_model.options)
148
+ params.update(self.code_model.package_dependency)
149
+ return params
150
+
151
+ count = self.code_model.options["package_name"].count("-") + 1
152
+ for _ in range(count):
153
+ out_path = out_path / Path("..")
154
+
155
+ if self.code_model.options["package_mode"] in ("dataplane", "mgmtplane"):
156
+ env = Environment(
157
+ loader=PackageLoader("autorest.codegen", "templates"),
158
+ undefined=StrictUndefined)
159
+ package_files = _PACKAGE_FILES
160
+ _serialize_and_write_package_files_proc(**_prepare_params())
161
+ elif Path(self.code_model.options["package_mode"]).exists():
162
+ env = Environment(
163
+ loader=FileSystemLoader(str(Path(self.code_model.options["package_mode"]))),
164
+ keep_trailing_newline=True,
165
+ undefined=StrictUndefined
166
+ )
167
+ package_files = env.list_templates()
168
+ params = self.code_model.options["package_configuration"] or {}
169
+ _serialize_and_write_package_files_proc(**params)
74
170
 
75
171
 
76
172
  def _keep_patch_file(self, path_file: Path, env: Environment):
77
173
  if self._autorestapi.read_file(path_file):
78
174
  self._autorestapi.write_file(path_file, self._autorestapi.read_file(path_file))
79
175
  else:
80
- self._autorestapi.write_file(path_file, PatchSerializer(env=env).serialize())
81
-
176
+ self._autorestapi.write_file(path_file, PatchSerializer(env=env, code_model=self.code_model).serialize())
82
177
 
83
- def _serialize_and_write_models_folder(self, code_model: CodeModel, env: Environment, namespace_path: Path) -> None:
178
+ def _serialize_and_write_models_folder(self, env: Environment, namespace_path: Path) -> None:
84
179
  # Write the models folder
85
180
  models_path = namespace_path / Path("models")
86
- if code_model.schemas:
87
- if not code_model.options['python3_only']:
181
+ if self.code_model.schemas:
182
+ if not self.code_model.options['python3_only']:
88
183
  self._autorestapi.write_file(
89
- models_path / Path("_models.py"), ModelGenericSerializer(code_model=code_model, env=env).serialize()
184
+ models_path / Path(f"{self.code_model.get_models_filename(is_python3_file=False)}.py"),
185
+ ModelGenericSerializer(code_model=self.code_model, env=env).serialize()
90
186
  )
91
187
  self._autorestapi.write_file(
92
- models_path / Path("_models_py3.py"), ModelPython3Serializer(code_model=code_model, env=env).serialize()
188
+ models_path / Path(f"{self.code_model.get_models_filename(is_python3_file=True)}.py"),
189
+ ModelPython3Serializer(code_model=self.code_model, env=env).serialize()
93
190
  )
94
- if code_model.enums:
191
+ if self.code_model.enums:
95
192
  self._autorestapi.write_file(
96
- models_path / Path(f"_{code_model.module_name}_enums.py"),
97
- EnumSerializer(code_model=code_model, env=env).serialize(),
193
+ models_path / Path(f"{self.code_model.enums_filename}.py"),
194
+ EnumSerializer(code_model=self.code_model, env=env).serialize(),
98
195
  )
99
196
  self._autorestapi.write_file(
100
- models_path / Path("__init__.py"), ModelInitSerializer(code_model=code_model, env=env).serialize()
197
+ models_path / Path("__init__.py"), ModelInitSerializer(code_model=self.code_model, env=env).serialize()
101
198
  )
102
199
 
103
200
  def _serialize_and_write_rest_layer(
104
- self, code_model: CodeModel, env: Environment, namespace_path: Path
201
+ self, env: Environment, namespace_path: Path
105
202
  ) -> None:
106
- rest_path = namespace_path / Path(code_model.rest_layer_name)
203
+ rest_path = namespace_path / Path(self.code_model.rest_layer_name)
107
204
  operation_group_names = {
108
- rb.operation_group_name for rb in code_model.rest.request_builders
205
+ rb.operation_group_name for rb in self.code_model.rest.request_builders
109
206
  }
110
207
 
111
208
  for operation_group_name in operation_group_names:
112
209
  request_builders = [
113
- r for r in code_model.rest.request_builders if r.operation_group_name == operation_group_name
210
+ r for r in self.code_model.rest.request_builders if r.operation_group_name == operation_group_name
114
211
  ]
115
212
  self._serialize_and_write_single_rest_layer(
116
- code_model, env, rest_path, request_builders
213
+ env, rest_path, request_builders
117
214
  )
118
215
  if not "" in operation_group_names:
119
216
  self._autorestapi.write_file(
120
- rest_path / Path("__init__.py"), code_model.options['license_header']
217
+ rest_path / Path("__init__.py"), self.code_model.options['license_header']
121
218
  )
122
219
 
123
220
 
124
221
  def _serialize_and_write_single_rest_layer(
125
- self, code_model: CodeModel, env: Environment, rest_path: Path, request_builders: List[RequestBuilder]
222
+ self, env: Environment, rest_path: Path, request_builders: List[RequestBuilder]
126
223
  ) -> None:
127
224
  builder_group_name = request_builders[0].builder_group_name
128
225
  output_path = rest_path / Path(builder_group_name) if builder_group_name else rest_path
@@ -130,7 +227,7 @@ class JinjaSerializer:
130
227
  self._autorestapi.write_file(
131
228
  output_path / Path("_request_builders.py"),
132
229
  RestGenericSerializer(
133
- code_model=code_model, env=env, request_builders=request_builders
230
+ code_model=self.code_model, env=env, request_builders=request_builders
134
231
  ).serialize_request_builders()
135
232
  )
136
233
 
@@ -138,20 +235,19 @@ class JinjaSerializer:
138
235
  self._autorestapi.write_file(
139
236
  output_path / Path("_request_builders_py3.py"),
140
237
  RestPython3Serializer(
141
- code_model=code_model, env=env, request_builders=request_builders
238
+ code_model=self.code_model, env=env, request_builders=request_builders
142
239
  ).serialize_request_builders()
143
240
  )
144
241
 
145
242
  # write rest init file
146
243
  self._autorestapi.write_file(
147
244
  output_path / Path("__init__.py"), RestSerializer(
148
- code_model=code_model, env=env, request_builders=request_builders
245
+ code_model=self.code_model, env=env, request_builders=request_builders
149
246
  ).serialize_init()
150
247
  )
151
248
 
152
249
  def _serialize_and_write_operations_file(
153
250
  self,
154
- code_model: CodeModel,
155
251
  env: Environment,
156
252
  namespace_path: Path,
157
253
  operation_group: Optional[OperationGroup] = None
@@ -159,35 +255,35 @@ class JinjaSerializer:
159
255
  filename = operation_group.filename if operation_group else "_operations"
160
256
  # write first sync file
161
257
  operation_group_serializer = OperationGroupsSerializer(
162
- code_model=code_model,
258
+ code_model=self.code_model,
163
259
  env=env,
164
260
  async_mode=False,
165
- is_python3_file=code_model.options['python3_only'],
261
+ is_python3_file=self.code_model.options['python3_only'],
166
262
  operation_group=operation_group
167
263
  )
168
264
  self._autorestapi.write_file(
169
- namespace_path / Path(code_model.operations_folder_name) / Path(f"{filename}.py"),
265
+ namespace_path / Path(self.code_model.operations_folder_name) / Path(f"{filename}.py"),
170
266
  operation_group_serializer.serialize(),
171
267
  )
172
268
 
173
- if not code_model.options['python3_only'] and code_model.options["add_python3_operation_files"]:
269
+ if not self.code_model.options['python3_only'] and self.code_model.options["add_python3_operation_files"]:
174
270
  # write typed second file if not python 3 only
175
271
  operation_group_serializer = OperationGroupsSerializer(
176
- code_model=code_model,
272
+ code_model=self.code_model,
177
273
  env=env,
178
274
  async_mode=False,
179
275
  is_python3_file=True,
180
276
 
181
277
  )
182
278
  self._autorestapi.write_file(
183
- namespace_path / Path(code_model.operations_folder_name) / Path(f"{filename}_py3.py"),
279
+ namespace_path / Path(self.code_model.operations_folder_name) / Path(f"{filename}_py3.py"),
184
280
  operation_group_serializer.serialize(),
185
281
  )
186
282
 
187
- if not code_model.options["no_async"]:
283
+ if self.has_aio_folder:
188
284
  # write async operation group and operation files
189
285
  operation_group_async_serializer = OperationGroupsSerializer(
190
- code_model=code_model,
286
+ code_model=self.code_model,
191
287
  env=env,
192
288
  async_mode=True,
193
289
  is_python3_file=True,
@@ -197,47 +293,47 @@ class JinjaSerializer:
197
293
  (
198
294
  namespace_path
199
295
  / Path("aio")
200
- / Path(code_model.operations_folder_name)
296
+ / Path(self.code_model.operations_folder_name)
201
297
  / Path(f"{filename}.py")
202
298
  ),
203
299
  operation_group_async_serializer.serialize(),
204
300
  )
205
301
 
206
302
  def _serialize_and_write_operations_folder(
207
- self, code_model: CodeModel, env: Environment, namespace_path: Path
303
+ self, env: Environment, namespace_path: Path
208
304
  ) -> None:
209
305
  # write sync operations init file
210
- operations_init_serializer = OperationsInitSerializer(code_model=code_model, env=env, async_mode=False)
306
+ operations_init_serializer = OperationsInitSerializer(code_model=self.code_model, env=env, async_mode=False)
211
307
  self._autorestapi.write_file(
212
- namespace_path / Path(code_model.operations_folder_name) / Path("__init__.py"),
308
+ namespace_path / Path(self.code_model.operations_folder_name) / Path("__init__.py"),
213
309
  operations_init_serializer.serialize(),
214
310
  )
215
311
 
216
312
  # write async operations init file
217
- if not code_model.options["no_async"]:
218
- operations_async_init_serializer = OperationsInitSerializer(code_model=code_model, env=env, async_mode=True)
313
+ if self.has_aio_folder:
314
+ operations_async_init_serializer = OperationsInitSerializer(
315
+ code_model=self.code_model, env=env, async_mode=True
316
+ )
219
317
  self._autorestapi.write_file(
220
- namespace_path / Path("aio") / Path(code_model.operations_folder_name) / Path("__init__.py"),
318
+ namespace_path / Path("aio") / Path(self.code_model.operations_folder_name) / Path("__init__.py"),
221
319
  operations_async_init_serializer.serialize(),
222
320
  )
223
321
 
224
- if code_model.options["combine_operation_files"]:
322
+ if self.code_model.options["combine_operation_files"]:
225
323
  self._serialize_and_write_operations_file(
226
- code_model=code_model,
227
324
  env=env,
228
325
  namespace_path=namespace_path,
229
326
  )
230
327
  else:
231
- for operation_group in code_model.operation_groups:
328
+ for operation_group in self.code_model.operation_groups:
232
329
  self._serialize_and_write_operations_file(
233
- code_model=code_model,
234
330
  env=env,
235
331
  namespace_path=namespace_path,
236
332
  operation_group=operation_group,
237
333
  )
238
334
 
239
335
  def _serialize_and_write_version_file(
240
- self, code_model: CodeModel, namespace_path: Path, general_serializer: GeneralSerializer
336
+ self, namespace_path: Path, general_serializer: GeneralSerializer
241
337
  ):
242
338
  def _read_version_file(original_version_file_name: str) -> str:
243
339
  return self._autorestapi.read_file(namespace_path / original_version_file_name)
@@ -247,30 +343,25 @@ class JinjaSerializer:
247
343
  namespace_path / Path("_version.py"),
248
344
  _read_version_file(original_version_file_name)
249
345
  )
250
- keep_version_file = code_model.options['keep_version_file']
346
+ keep_version_file = self.code_model.options['keep_version_file']
251
347
  if keep_version_file and _read_version_file("_version.py"):
252
348
  _write_version_file(original_version_file_name="_version.py")
253
349
  elif keep_version_file and _read_version_file("version.py"):
254
350
  _write_version_file(original_version_file_name="version.py")
255
- elif code_model.options['package_version']:
351
+ elif self.code_model.options['package_version']:
256
352
  self._autorestapi.write_file(
257
353
  namespace_path / Path("_version.py"),
258
354
  general_serializer.serialize_version_file()
259
355
  )
260
356
 
261
357
  def _serialize_and_write_top_level_folder(
262
- self, code_model: CodeModel, env: Environment, namespace_path: Path
358
+ self, env: Environment, namespace_path: Path
263
359
  ) -> None:
264
- general_serializer = GeneralSerializer(code_model=code_model, env=env, async_mode=False)
360
+ general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False)
265
361
 
266
- if code_model.rest.request_builders:
267
- self._autorestapi.write_file(
268
- namespace_path / Path("__init__.py"), general_serializer.serialize_init_file()
269
- )
270
- else:
271
- self._autorestapi.write_file(
272
- namespace_path / Path("__init__.py"), general_serializer.serialize_pkgutil_init_file()
273
- )
362
+ self._autorestapi.write_file(
363
+ namespace_path / Path("__init__.py"), general_serializer.serialize_init_file()
364
+ )
274
365
  p = namespace_path.parent
275
366
  while p != Path("."):
276
367
  # write pkgutil init file
@@ -280,37 +371,37 @@ class JinjaSerializer:
280
371
  p = p.parent
281
372
 
282
373
  # Write the service client
283
- if code_model.rest.request_builders:
374
+ if self.code_model.rest.request_builders:
284
375
  self._autorestapi.write_file(
285
- namespace_path / Path(f"_{code_model.module_name}.py"),
376
+ namespace_path / Path(f"{self.code_model.service_client.filename}.py"),
286
377
  general_serializer.serialize_service_client_file()
287
378
  )
288
379
 
289
- if code_model.need_vendored_code:
380
+ if self.code_model.need_vendored_code(async_mode=False):
290
381
  self._autorestapi.write_file(
291
382
  namespace_path / Path("_vendor.py"),
292
383
  general_serializer.serialize_vendor_file()
293
384
  )
294
385
 
295
- self._serialize_and_write_version_file(code_model, namespace_path, general_serializer)
386
+ self._serialize_and_write_version_file(namespace_path, general_serializer)
296
387
 
297
388
  # write the empty py.typed file
298
389
  self._autorestapi.write_file(namespace_path / Path("py.typed"), "# Marker file for PEP 561.")
299
390
 
300
391
  # Write the config file
301
- if code_model.rest.request_builders:
392
+ if self.code_model.rest.request_builders:
302
393
  self._autorestapi.write_file(
303
394
  namespace_path / Path("_configuration.py"), general_serializer.serialize_config_file()
304
395
  )
305
396
 
306
397
  # Write the setup file
307
- if code_model.options["basic_setup_py"]:
398
+ if self.code_model.options["basic_setup_py"]:
308
399
  self._autorestapi.write_file(Path("setup.py"), general_serializer.serialize_setup_file())
309
400
 
310
401
  def _serialize_and_write_aio_top_level_folder(
311
- self, code_model: CodeModel, env: Environment, namespace_path: Path
402
+ self, env: Environment, namespace_path: Path
312
403
  ) -> None:
313
- aio_general_serializer = GeneralSerializer(code_model=code_model, env=env, async_mode=True)
404
+ aio_general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=True)
314
405
 
315
406
  aio_path = namespace_path / Path("aio")
316
407
 
@@ -318,17 +409,23 @@ class JinjaSerializer:
318
409
  self._autorestapi.write_file(aio_path / Path("__init__.py"), aio_general_serializer.serialize_init_file())
319
410
 
320
411
  # Write the service client
321
- self._autorestapi.write_file(
322
- aio_path / Path(f"_{code_model.module_name}.py"),
323
- aio_general_serializer.serialize_service_client_file(),
324
- )
412
+ if self.code_model.rest.request_builders:
413
+ self._autorestapi.write_file(
414
+ aio_path / Path(f"{self.code_model.service_client.filename}.py"),
415
+ aio_general_serializer.serialize_service_client_file(),
416
+ )
325
417
 
326
418
  # Write the config file
327
419
  self._autorestapi.write_file(
328
420
  aio_path / Path("_configuration.py"), aio_general_serializer.serialize_config_file()
329
421
  )
422
+ if self.code_model.need_vendored_code(async_mode=True):
423
+ self._autorestapi.write_file(
424
+ aio_path / Path("_vendor.py"),
425
+ aio_general_serializer.serialize_vendor_file()
426
+ )
330
427
 
331
428
 
332
- def _serialize_and_write_metadata(self, code_model: CodeModel, env: Environment, namespace_path: Path) -> None:
333
- metadata_serializer = MetadataSerializer(code_model, env)
429
+ def _serialize_and_write_metadata(self, env: Environment, namespace_path: Path) -> None:
430
+ metadata_serializer = MetadataSerializer(self.code_model, env)
334
431
  self._autorestapi.write_file(namespace_path / Path("_metadata.json"), metadata_serializer.serialize())