@autorest/python 5.13.0 → 5.16.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 (101) hide show
  1. package/ChangeLog.md +67 -0
  2. package/autorest/__init__.py +1 -2
  3. package/autorest/black/__init__.py +12 -5
  4. package/autorest/codegen/__init__.py +239 -105
  5. package/autorest/codegen/models/__init__.py +29 -18
  6. package/autorest/codegen/models/base_builder.py +48 -11
  7. package/autorest/codegen/models/base_model.py +6 -4
  8. package/autorest/codegen/models/base_schema.py +21 -24
  9. package/autorest/codegen/models/client.py +70 -20
  10. package/autorest/codegen/models/code_model.py +144 -129
  11. package/autorest/codegen/models/constant_schema.py +32 -16
  12. package/autorest/codegen/models/credential_model.py +55 -0
  13. package/autorest/codegen/models/credential_schema.py +21 -16
  14. package/autorest/codegen/models/credential_schema_policy.py +11 -15
  15. package/autorest/codegen/models/dictionary_schema.py +27 -24
  16. package/autorest/codegen/models/enum_schema.py +41 -62
  17. package/autorest/codegen/models/imports.py +72 -41
  18. package/autorest/codegen/models/list_schema.py +40 -18
  19. package/autorest/codegen/models/lro_operation.py +61 -25
  20. package/autorest/codegen/models/lro_paging_operation.py +5 -6
  21. package/autorest/codegen/models/object_schema.py +113 -59
  22. package/autorest/codegen/models/operation.py +251 -111
  23. package/autorest/codegen/models/operation_group.py +67 -32
  24. package/autorest/codegen/models/paging_operation.py +48 -21
  25. package/autorest/codegen/models/parameter.py +182 -90
  26. package/autorest/codegen/models/parameter_list.py +184 -163
  27. package/autorest/codegen/models/primitive_schemas.py +89 -70
  28. package/autorest/codegen/models/property.py +49 -31
  29. package/autorest/codegen/models/request_builder.py +67 -32
  30. package/autorest/codegen/models/request_builder_parameter.py +54 -23
  31. package/autorest/codegen/models/request_builder_parameter_list.py +77 -108
  32. package/autorest/codegen/models/schema_request.py +16 -6
  33. package/autorest/codegen/models/schema_response.py +35 -17
  34. package/autorest/codegen/models/utils.py +24 -1
  35. package/autorest/codegen/serializers/__init__.py +273 -89
  36. package/autorest/codegen/serializers/builder_serializer.py +711 -333
  37. package/autorest/codegen/serializers/client_serializer.py +114 -43
  38. package/autorest/codegen/serializers/general_serializer.py +84 -25
  39. package/autorest/codegen/serializers/import_serializer.py +93 -31
  40. package/autorest/codegen/serializers/metadata_serializer.py +73 -24
  41. package/autorest/codegen/serializers/model_base_serializer.py +42 -14
  42. package/autorest/codegen/serializers/model_generic_serializer.py +1 -4
  43. package/autorest/codegen/serializers/model_init_serializer.py +5 -1
  44. package/autorest/codegen/serializers/model_python3_serializer.py +9 -8
  45. package/autorest/codegen/serializers/operation_groups_serializer.py +20 -8
  46. package/autorest/codegen/serializers/operations_init_serializer.py +23 -11
  47. package/autorest/codegen/serializers/patch_serializer.py +14 -2
  48. package/autorest/codegen/serializers/{rest_serializer.py → request_builders_serializer.py} +29 -12
  49. package/autorest/codegen/serializers/utils.py +60 -21
  50. package/autorest/codegen/templates/CHANGELOG.md.jinja2 +6 -0
  51. package/autorest/codegen/templates/LICENSE.jinja2 +21 -0
  52. package/autorest/codegen/templates/MANIFEST.in.jinja2 +7 -0
  53. package/autorest/codegen/templates/README.md.jinja2 +105 -0
  54. package/autorest/codegen/templates/config.py.jinja2 +4 -4
  55. package/autorest/codegen/templates/dev_requirements.txt.jinja2 +10 -0
  56. package/autorest/codegen/templates/enum.py.jinja2 +1 -1
  57. package/autorest/codegen/templates/enum_container.py.jinja2 +0 -1
  58. package/autorest/codegen/templates/init.py.jinja2 +9 -6
  59. package/autorest/codegen/templates/keywords.jinja2 +14 -1
  60. package/autorest/codegen/templates/lro_operation.py.jinja2 +5 -7
  61. package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +5 -7
  62. package/autorest/codegen/templates/metadata.json.jinja2 +10 -9
  63. package/autorest/codegen/templates/model.py.jinja2 +1 -6
  64. package/autorest/codegen/templates/model_init.py.jinja2 +7 -4
  65. package/autorest/codegen/templates/operation.py.jinja2 +8 -11
  66. package/autorest/codegen/templates/operation_group.py.jinja2 +15 -18
  67. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +1 -2
  68. package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -0
  69. package/autorest/codegen/templates/paging_operation.py.jinja2 +7 -8
  70. package/autorest/codegen/templates/patch.py.jinja2 +18 -29
  71. package/autorest/codegen/templates/request_builder.py.jinja2 +19 -14
  72. package/autorest/codegen/templates/setup.py.jinja2 +79 -20
  73. package/autorest/codegen/templates/vendor.py.jinja2 +12 -2
  74. package/autorest/jsonrpc/__init__.py +7 -12
  75. package/autorest/jsonrpc/localapi.py +4 -3
  76. package/autorest/jsonrpc/server.py +13 -6
  77. package/autorest/jsonrpc/stdstream.py +13 -6
  78. package/autorest/m2r/__init__.py +5 -8
  79. package/autorest/multiapi/__init__.py +24 -14
  80. package/autorest/multiapi/models/client.py +21 -11
  81. package/autorest/multiapi/models/code_model.py +23 -10
  82. package/autorest/multiapi/models/config.py +4 -1
  83. package/autorest/multiapi/models/constant_global_parameter.py +1 -0
  84. package/autorest/multiapi/models/global_parameter.py +2 -1
  85. package/autorest/multiapi/models/global_parameters.py +14 -8
  86. package/autorest/multiapi/models/imports.py +35 -18
  87. package/autorest/multiapi/models/mixin_operation.py +5 -5
  88. package/autorest/multiapi/models/operation_group.py +2 -1
  89. package/autorest/multiapi/models/operation_mixin_group.py +21 -10
  90. package/autorest/multiapi/serializers/__init__.py +18 -23
  91. package/autorest/multiapi/serializers/import_serializer.py +47 -15
  92. package/autorest/multiapi/serializers/multiapi_serializer.py +17 -17
  93. package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +1 -1
  94. package/autorest/multiapi/utils.py +3 -3
  95. package/autorest/namer/__init__.py +2 -4
  96. package/autorest/namer/name_converter.py +200 -103
  97. package/autorest/namer/python_mappings.py +10 -22
  98. package/package.json +3 -3
  99. package/run-python3.js +2 -3
  100. package/venvtools.py +1 -1
  101. package/autorest/codegen/models/rest.py +0 -42
@@ -3,17 +3,13 @@
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
12
- from ..models import (
13
- CodeModel,
14
- OperationGroup,
15
- RequestBuilder,
16
- )
12
+ from ..models import CodeModel, OperationGroup, RequestBuilder, TokenCredentialSchema
17
13
  from .enum_serializer import EnumSerializer
18
14
  from .general_serializer import GeneralSerializer
19
15
  from .model_generic_serializer import ModelGenericSerializer
@@ -22,18 +18,40 @@ from .model_python3_serializer import ModelPython3Serializer
22
18
  from .operations_init_serializer import OperationsInitSerializer
23
19
  from .operation_groups_serializer import OperationGroupsSerializer
24
20
  from .metadata_serializer import MetadataSerializer
25
- from .rest_serializer import RestPython3Serializer, RestGenericSerializer, RestSerializer
21
+ from .request_builders_serializer import (
22
+ RequestBuildersPython3Serializer,
23
+ RequestBuildersGenericSerializer,
24
+ RequestBuildersSerializer,
25
+ )
26
26
  from .patch_serializer import PatchSerializer
27
27
 
28
28
  __all__ = [
29
29
  "JinjaSerializer",
30
30
  ]
31
31
 
32
+ _PACKAGE_FILES = [
33
+ "CHANGELOG.md.jinja2",
34
+ "dev_requirements.txt.jinja2",
35
+ "LICENSE.jinja2",
36
+ "MANIFEST.in.jinja2",
37
+ "README.md.jinja2",
38
+ "setup.py.jinja2",
39
+ ]
40
+
41
+ _REGENERATE_FILES = {"setup.py", "MANIFEST.in"}
42
+
43
+
32
44
  class JinjaSerializer:
33
45
  def __init__(self, autorestapi: AutorestAPI, code_model: CodeModel) -> None:
34
46
  self._autorestapi = autorestapi
35
47
  self.code_model = code_model
36
48
 
49
+ @property
50
+ def has_aio_folder(self) -> bool:
51
+ return not self.code_model.options["no_async"] and bool(
52
+ self.code_model.request_builders
53
+ )
54
+
37
55
  def serialize(self) -> None:
38
56
  env = Environment(
39
57
  loader=PackageLoader("autorest.codegen", "templates"),
@@ -49,60 +67,187 @@ class JinjaSerializer:
49
67
  if self.code_model.options["no_namespace_folders"]
50
68
  else Path(*(self.code_model.namespace.split(".")))
51
69
  )
52
-
53
70
  # if there was a patch file before, we keep it
54
71
  self._keep_patch_file(namespace_path / Path("_patch.py"), env)
55
- self._keep_patch_file(namespace_path / Path("aio") / Path("_patch.py"), env)
72
+ if self.has_aio_folder:
73
+ self._keep_patch_file(namespace_path / Path("aio") / Path("_patch.py"), env)
74
+
75
+ if self.code_model.options["models_mode"] and (
76
+ self.code_model.schemas or self.code_model.enums
77
+ ):
78
+ self._keep_patch_file(
79
+ namespace_path / Path("models") / Path("_patch.py"), env
80
+ )
81
+ if (
82
+ self.code_model.options["show_operations"]
83
+ and self.code_model.operation_groups
84
+ ):
85
+ self._keep_patch_file(
86
+ namespace_path
87
+ / Path(self.code_model.operations_folder_name)
88
+ / Path("_patch.py"),
89
+ env,
90
+ )
91
+ if self.has_aio_folder:
92
+ self._keep_patch_file(
93
+ namespace_path
94
+ / Path("aio")
95
+ / Path(self.code_model.operations_folder_name)
96
+ / Path("_patch.py"),
97
+ env,
98
+ )
56
99
 
57
- self._serialize_and_write_top_level_folder(env=env, namespace_path=namespace_path)
100
+ self._serialize_and_write_top_level_folder(
101
+ env=env, namespace_path=namespace_path
102
+ )
58
103
 
59
- if self.code_model.rest.request_builders:
104
+ if self.code_model.request_builders:
60
105
  if self.code_model.options["builders_visibility"] != "embedded":
61
- self._serialize_and_write_rest_layer(env=env, namespace_path=namespace_path)
62
- if not self.code_model.options["no_async"]:
106
+ self._serialize_and_write_rest_layer(
107
+ env=env, namespace_path=namespace_path
108
+ )
109
+ if self.has_aio_folder:
63
110
  self._serialize_and_write_aio_top_level_folder(
64
- env=env, namespace_path=namespace_path,
111
+ env=env,
112
+ namespace_path=namespace_path,
65
113
  )
66
114
 
67
- if self.code_model.options["show_operations"] and self.code_model.operation_groups:
68
- self._serialize_and_write_operations_folder(env=env, namespace_path=namespace_path)
115
+ if (
116
+ self.code_model.options["show_operations"]
117
+ and self.code_model.operation_groups
118
+ ):
119
+ self._serialize_and_write_operations_folder(
120
+ env=env, namespace_path=namespace_path
121
+ )
69
122
  if self.code_model.options["multiapi"]:
70
123
  self._serialize_and_write_metadata(
71
124
  env=env, namespace_path=namespace_path
72
125
  )
73
126
 
74
- if self.code_model.options["models_mode"] and (self.code_model.schemas or self.code_model.enums):
75
- self._serialize_and_write_models_folder(env=env, namespace_path=namespace_path)
76
-
127
+ if self.code_model.options["models_mode"] and (
128
+ self.code_model.schemas or self.code_model.enums
129
+ ):
130
+ self._serialize_and_write_models_folder(
131
+ env=env, namespace_path=namespace_path
132
+ )
133
+ if not self.code_model.options["models_mode"]:
134
+ # keep models file if users ended up just writing a models file
135
+ if self._autorestapi.read_file(namespace_path / Path("models.py")):
136
+ self._autorestapi.write_file(
137
+ namespace_path / Path("models.py"),
138
+ self._autorestapi.read_file(namespace_path / Path("models.py")),
139
+ )
77
140
 
141
+ if self.code_model.options["package_mode"]:
142
+ self._serialize_and_write_package_files(out_path=namespace_path)
143
+
144
+ def _serialize_and_write_package_files(self, out_path: Path) -> None:
145
+ def _serialize_and_write_package_files_proc(**kwargs: Any):
146
+ for template_name in package_files:
147
+ file = template_name.replace(".jinja2", "")
148
+ output_name = out_path / file
149
+ if (
150
+ not self._autorestapi.read_file(output_name)
151
+ or file in _REGENERATE_FILES
152
+ ):
153
+ template = env.get_template(template_name)
154
+ render_result = template.render(**kwargs)
155
+ self._autorestapi.write_file(output_name, render_result)
156
+
157
+ def _prepare_params() -> Dict[Any, Any]:
158
+ package_parts = self.code_model.options["package_name"].split("-")[:-1]
159
+ try:
160
+ token_cred = isinstance(
161
+ self.code_model.credential_model.credential_schema_policy.credential,
162
+ TokenCredentialSchema,
163
+ )
164
+ except ValueError:
165
+ token_cred = False
166
+ version = self.code_model.options["package_version"]
167
+ if any(x in version for x in ["a", "b", "rc"]) or version[0] == "0":
168
+ dev_status = "4 - Beta"
169
+ else:
170
+ dev_status = "5 - Production/Stable"
171
+ params = {
172
+ "token_credential": token_cred,
173
+ "pkgutil_names": [
174
+ ".".join(package_parts[: i + 1]) for i in range(len(package_parts))
175
+ ],
176
+ "init_names": [
177
+ "/".join(package_parts[: i + 1]) + "/__init__.py"
178
+ for i in range(len(package_parts))
179
+ ],
180
+ "dev_status": dev_status,
181
+ }
182
+ params.update(self.code_model.options)
183
+ params.update(self.code_model.package_dependency)
184
+ return params
185
+
186
+ count = self.code_model.options["package_name"].count("-") + 1
187
+ for _ in range(count):
188
+ out_path = out_path / Path("..")
189
+
190
+ if self.code_model.options["package_mode"] in ("dataplane", "mgmtplane"):
191
+ env = Environment(
192
+ loader=PackageLoader("autorest.codegen", "templates"),
193
+ undefined=StrictUndefined,
194
+ )
195
+ package_files = _PACKAGE_FILES
196
+ _serialize_and_write_package_files_proc(**_prepare_params())
197
+ elif Path(self.code_model.options["package_mode"]).exists():
198
+ env = Environment(
199
+ loader=FileSystemLoader(
200
+ str(Path(self.code_model.options["package_mode"]))
201
+ ),
202
+ keep_trailing_newline=True,
203
+ undefined=StrictUndefined,
204
+ )
205
+ package_files = env.list_templates()
206
+ params = self.code_model.options["package_configuration"] or {}
207
+ _serialize_and_write_package_files_proc(**params)
78
208
 
79
209
  def _keep_patch_file(self, path_file: Path, env: Environment):
80
210
  if self._autorestapi.read_file(path_file):
81
- self._autorestapi.write_file(path_file, self._autorestapi.read_file(path_file))
211
+ self._autorestapi.write_file(
212
+ path_file, self._autorestapi.read_file(path_file)
213
+ )
82
214
  else:
83
- self._autorestapi.write_file(path_file, PatchSerializer(env=env).serialize())
84
-
215
+ self._autorestapi.write_file(
216
+ path_file,
217
+ PatchSerializer(env=env, code_model=self.code_model).serialize(),
218
+ )
85
219
 
86
- def _serialize_and_write_models_folder(self, env: Environment, namespace_path: Path) -> None:
220
+ def _serialize_and_write_models_folder(
221
+ self, env: Environment, namespace_path: Path
222
+ ) -> None:
87
223
  # Write the models folder
88
224
  models_path = namespace_path / Path("models")
89
225
  if self.code_model.schemas:
90
- if not self.code_model.options['python3_only']:
226
+ if not self.code_model.options["python3_only"]:
91
227
  self._autorestapi.write_file(
92
- models_path / Path("_models.py"),
93
- ModelGenericSerializer(code_model=self.code_model, env=env).serialize()
228
+ models_path
229
+ / Path(
230
+ f"{self.code_model.get_models_filename(is_python3_file=False)}.py"
231
+ ),
232
+ ModelGenericSerializer(
233
+ code_model=self.code_model, env=env
234
+ ).serialize(),
94
235
  )
95
236
  self._autorestapi.write_file(
96
- models_path / Path("_models_py3.py"),
97
- ModelPython3Serializer(code_model=self.code_model, env=env).serialize()
237
+ models_path
238
+ / Path(
239
+ f"{self.code_model.get_models_filename(is_python3_file=True)}.py"
240
+ ),
241
+ ModelPython3Serializer(code_model=self.code_model, env=env).serialize(),
98
242
  )
99
243
  if self.code_model.enums:
100
244
  self._autorestapi.write_file(
101
- models_path / Path(f"_{self.code_model.module_name}_enums.py"),
245
+ models_path / Path(f"{self.code_model.enums_filename}.py"),
102
246
  EnumSerializer(code_model=self.code_model, env=env).serialize(),
103
247
  )
104
248
  self._autorestapi.write_file(
105
- models_path / Path("__init__.py"), ModelInitSerializer(code_model=self.code_model, env=env).serialize()
249
+ models_path / Path("__init__.py"),
250
+ ModelInitSerializer(code_model=self.code_model, env=env).serialize(),
106
251
  )
107
252
 
108
253
  def _serialize_and_write_rest_layer(
@@ -110,55 +255,60 @@ class JinjaSerializer:
110
255
  ) -> None:
111
256
  rest_path = namespace_path / Path(self.code_model.rest_layer_name)
112
257
  operation_group_names = {
113
- rb.operation_group_name for rb in self.code_model.rest.request_builders
258
+ rb.operation_group_name for rb in self.code_model.request_builders
114
259
  }
115
260
 
116
261
  for operation_group_name in operation_group_names:
117
262
  request_builders = [
118
- r for r in self.code_model.rest.request_builders if r.operation_group_name == operation_group_name
263
+ r
264
+ for r in self.code_model.request_builders
265
+ if r.operation_group_name == operation_group_name
119
266
  ]
120
267
  self._serialize_and_write_single_rest_layer(
121
268
  env, rest_path, request_builders
122
269
  )
123
270
  if not "" in operation_group_names:
124
271
  self._autorestapi.write_file(
125
- rest_path / Path("__init__.py"), self.code_model.options['license_header']
272
+ rest_path / Path("__init__.py"),
273
+ self.code_model.options["license_header"],
126
274
  )
127
275
 
128
-
129
276
  def _serialize_and_write_single_rest_layer(
130
277
  self, env: Environment, rest_path: Path, request_builders: List[RequestBuilder]
131
278
  ) -> None:
132
279
  builder_group_name = request_builders[0].builder_group_name
133
- output_path = rest_path / Path(builder_group_name) if builder_group_name else rest_path
280
+ output_path = (
281
+ rest_path / Path(builder_group_name) if builder_group_name else rest_path
282
+ )
134
283
  # write generic request builders file
135
284
  self._autorestapi.write_file(
136
285
  output_path / Path("_request_builders.py"),
137
- RestGenericSerializer(
286
+ RequestBuildersGenericSerializer(
138
287
  code_model=self.code_model, env=env, request_builders=request_builders
139
- ).serialize_request_builders()
288
+ ).serialize_request_builders(),
140
289
  )
141
290
 
142
291
  # write python3 request builders file
143
292
  self._autorestapi.write_file(
144
293
  output_path / Path("_request_builders_py3.py"),
145
- RestPython3Serializer(
294
+ RequestBuildersPython3Serializer(
146
295
  code_model=self.code_model, env=env, request_builders=request_builders
147
- ).serialize_request_builders()
296
+ ).serialize_request_builders(),
148
297
  )
149
298
 
150
299
  # write rest init file
151
300
  self._autorestapi.write_file(
152
- output_path / Path("__init__.py"), RestSerializer(
301
+ output_path / Path("__init__.py"),
302
+ RequestBuildersSerializer(
153
303
  code_model=self.code_model, env=env, request_builders=request_builders
154
- ).serialize_init()
304
+ ).serialize_init(),
155
305
  )
156
306
 
157
307
  def _serialize_and_write_operations_file(
158
308
  self,
159
309
  env: Environment,
160
310
  namespace_path: Path,
161
- operation_group: Optional[OperationGroup] = None
311
+ operation_group: Optional[OperationGroup] = None,
162
312
  ) -> None:
163
313
  filename = operation_group.filename if operation_group else "_operations"
164
314
  # write first sync file
@@ -166,36 +316,42 @@ class JinjaSerializer:
166
316
  code_model=self.code_model,
167
317
  env=env,
168
318
  async_mode=False,
169
- is_python3_file=self.code_model.options['python3_only'],
170
- operation_group=operation_group
319
+ is_python3_file=self.code_model.options["python3_only"],
320
+ operation_group=operation_group,
171
321
  )
172
322
  self._autorestapi.write_file(
173
- namespace_path / Path(self.code_model.operations_folder_name) / Path(f"{filename}.py"),
323
+ namespace_path
324
+ / Path(self.code_model.operations_folder_name)
325
+ / Path(f"{filename}.py"),
174
326
  operation_group_serializer.serialize(),
175
327
  )
176
328
 
177
- if not self.code_model.options['python3_only'] and self.code_model.options["add_python3_operation_files"]:
329
+ if (
330
+ not self.code_model.options["python3_only"]
331
+ and self.code_model.options["add_python3_operation_files"]
332
+ ):
178
333
  # write typed second file if not python 3 only
179
334
  operation_group_serializer = OperationGroupsSerializer(
180
335
  code_model=self.code_model,
181
336
  env=env,
182
337
  async_mode=False,
183
338
  is_python3_file=True,
184
-
185
339
  )
186
340
  self._autorestapi.write_file(
187
- namespace_path / Path(self.code_model.operations_folder_name) / Path(f"{filename}_py3.py"),
341
+ namespace_path
342
+ / Path(self.code_model.operations_folder_name)
343
+ / Path(f"{filename}_py3.py"),
188
344
  operation_group_serializer.serialize(),
189
345
  )
190
346
 
191
- if not self.code_model.options["no_async"]:
347
+ if self.has_aio_folder:
192
348
  # write async operation group and operation files
193
349
  operation_group_async_serializer = OperationGroupsSerializer(
194
350
  code_model=self.code_model,
195
351
  env=env,
196
352
  async_mode=True,
197
353
  is_python3_file=True,
198
- operation_group=operation_group
354
+ operation_group=operation_group,
199
355
  )
200
356
  self._autorestapi.write_file(
201
357
  (
@@ -211,19 +367,26 @@ class JinjaSerializer:
211
367
  self, env: Environment, namespace_path: Path
212
368
  ) -> None:
213
369
  # write sync operations init file
214
- operations_init_serializer = OperationsInitSerializer(code_model=self.code_model, env=env, async_mode=False)
370
+ operations_init_serializer = OperationsInitSerializer(
371
+ code_model=self.code_model, env=env, async_mode=False
372
+ )
215
373
  self._autorestapi.write_file(
216
- namespace_path / Path(self.code_model.operations_folder_name) / Path("__init__.py"),
374
+ namespace_path
375
+ / Path(self.code_model.operations_folder_name)
376
+ / Path("__init__.py"),
217
377
  operations_init_serializer.serialize(),
218
378
  )
219
379
 
220
380
  # write async operations init file
221
- if not self.code_model.options["no_async"]:
381
+ if self.has_aio_folder:
222
382
  operations_async_init_serializer = OperationsInitSerializer(
223
383
  code_model=self.code_model, env=env, async_mode=True
224
384
  )
225
385
  self._autorestapi.write_file(
226
- namespace_path / Path("aio") / Path(self.code_model.operations_folder_name) / Path("__init__.py"),
386
+ namespace_path
387
+ / Path("aio")
388
+ / Path(self.code_model.operations_folder_name)
389
+ / Path("__init__.py"),
227
390
  operations_async_init_serializer.serialize(),
228
391
  )
229
392
 
@@ -244,95 +407,116 @@ class JinjaSerializer:
244
407
  self, namespace_path: Path, general_serializer: GeneralSerializer
245
408
  ):
246
409
  def _read_version_file(original_version_file_name: str) -> str:
247
- return self._autorestapi.read_file(namespace_path / original_version_file_name)
410
+ return self._autorestapi.read_file(
411
+ namespace_path / original_version_file_name
412
+ )
248
413
 
249
414
  def _write_version_file(original_version_file_name: str) -> None:
250
415
  self._autorestapi.write_file(
251
416
  namespace_path / Path("_version.py"),
252
- _read_version_file(original_version_file_name)
417
+ _read_version_file(original_version_file_name),
253
418
  )
254
- keep_version_file = self.code_model.options['keep_version_file']
419
+
420
+ keep_version_file = self.code_model.options["keep_version_file"]
255
421
  if keep_version_file and _read_version_file("_version.py"):
256
422
  _write_version_file(original_version_file_name="_version.py")
257
423
  elif keep_version_file and _read_version_file("version.py"):
258
424
  _write_version_file(original_version_file_name="version.py")
259
- elif self.code_model.options['package_version']:
425
+ elif self.code_model.options["package_version"]:
260
426
  self._autorestapi.write_file(
261
427
  namespace_path / Path("_version.py"),
262
- general_serializer.serialize_version_file()
428
+ general_serializer.serialize_version_file(),
263
429
  )
264
430
 
265
431
  def _serialize_and_write_top_level_folder(
266
432
  self, env: Environment, namespace_path: Path
267
433
  ) -> None:
268
- general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=False)
434
+ general_serializer = GeneralSerializer(
435
+ code_model=self.code_model, env=env, async_mode=False
436
+ )
269
437
 
270
- if self.code_model.rest.request_builders:
271
- self._autorestapi.write_file(
272
- namespace_path / Path("__init__.py"), general_serializer.serialize_init_file()
273
- )
274
- else:
275
- self._autorestapi.write_file(
276
- namespace_path / Path("__init__.py"), general_serializer.serialize_pkgutil_init_file()
277
- )
438
+ self._autorestapi.write_file(
439
+ namespace_path / Path("__init__.py"),
440
+ general_serializer.serialize_init_file(),
441
+ )
278
442
  p = namespace_path.parent
279
443
  while p != Path("."):
280
444
  # write pkgutil init file
281
445
  self._autorestapi.write_file(
282
- p / Path("__init__.py"), general_serializer.serialize_pkgutil_init_file()
446
+ p / Path("__init__.py"),
447
+ general_serializer.serialize_pkgutil_init_file(),
283
448
  )
284
449
  p = p.parent
285
450
 
286
451
  # Write the service client
287
- if self.code_model.rest.request_builders:
452
+ if self.code_model.request_builders:
288
453
  self._autorestapi.write_file(
289
- namespace_path / Path(f"_{self.code_model.module_name}.py"),
290
- general_serializer.serialize_service_client_file()
454
+ namespace_path / Path(f"{self.code_model.service_client.filename}.py"),
455
+ general_serializer.serialize_service_client_file(),
291
456
  )
292
457
 
293
- if self.code_model.need_vendored_code:
458
+ if self.code_model.need_vendored_code(async_mode=False):
294
459
  self._autorestapi.write_file(
295
460
  namespace_path / Path("_vendor.py"),
296
- general_serializer.serialize_vendor_file()
461
+ general_serializer.serialize_vendor_file(),
297
462
  )
298
463
 
299
464
  self._serialize_and_write_version_file(namespace_path, general_serializer)
300
465
 
301
466
  # write the empty py.typed file
302
- self._autorestapi.write_file(namespace_path / Path("py.typed"), "# Marker file for PEP 561.")
467
+ self._autorestapi.write_file(
468
+ namespace_path / Path("py.typed"), "# Marker file for PEP 561."
469
+ )
303
470
 
304
471
  # Write the config file
305
- if self.code_model.rest.request_builders:
472
+ if self.code_model.request_builders:
306
473
  self._autorestapi.write_file(
307
- namespace_path / Path("_configuration.py"), general_serializer.serialize_config_file()
474
+ namespace_path / Path("_configuration.py"),
475
+ general_serializer.serialize_config_file(),
308
476
  )
309
477
 
310
478
  # Write the setup file
311
479
  if self.code_model.options["basic_setup_py"]:
312
- self._autorestapi.write_file(Path("setup.py"), general_serializer.serialize_setup_file())
480
+ self._autorestapi.write_file(
481
+ Path("setup.py"), general_serializer.serialize_setup_file()
482
+ )
313
483
 
314
484
  def _serialize_and_write_aio_top_level_folder(
315
485
  self, env: Environment, namespace_path: Path
316
486
  ) -> None:
317
- aio_general_serializer = GeneralSerializer(code_model=self.code_model, env=env, async_mode=True)
487
+ aio_general_serializer = GeneralSerializer(
488
+ code_model=self.code_model, env=env, async_mode=True
489
+ )
318
490
 
319
491
  aio_path = namespace_path / Path("aio")
320
492
 
321
493
  # Write the __init__ file
322
- self._autorestapi.write_file(aio_path / Path("__init__.py"), aio_general_serializer.serialize_init_file())
323
-
324
- # Write the service client
325
494
  self._autorestapi.write_file(
326
- aio_path / Path(f"_{self.code_model.module_name}.py"),
327
- aio_general_serializer.serialize_service_client_file(),
495
+ aio_path / Path("__init__.py"), aio_general_serializer.serialize_init_file()
328
496
  )
329
497
 
498
+ # Write the service client
499
+ if self.code_model.request_builders:
500
+ self._autorestapi.write_file(
501
+ aio_path / Path(f"{self.code_model.service_client.filename}.py"),
502
+ aio_general_serializer.serialize_service_client_file(),
503
+ )
504
+
330
505
  # Write the config file
331
506
  self._autorestapi.write_file(
332
- aio_path / Path("_configuration.py"), aio_general_serializer.serialize_config_file()
507
+ aio_path / Path("_configuration.py"),
508
+ aio_general_serializer.serialize_config_file(),
333
509
  )
510
+ if self.code_model.need_vendored_code(async_mode=True):
511
+ self._autorestapi.write_file(
512
+ aio_path / Path("_vendor.py"),
513
+ aio_general_serializer.serialize_vendor_file(),
514
+ )
334
515
 
335
-
336
- def _serialize_and_write_metadata(self, env: Environment, namespace_path: Path) -> None:
516
+ def _serialize_and_write_metadata(
517
+ self, env: Environment, namespace_path: Path
518
+ ) -> None:
337
519
  metadata_serializer = MetadataSerializer(self.code_model, env)
338
- self._autorestapi.write_file(namespace_path / Path("_metadata.json"), metadata_serializer.serialize())
520
+ self._autorestapi.write_file(
521
+ namespace_path / Path("_metadata.json"), metadata_serializer.serialize()
522
+ )