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