@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.
- package/ChangeLog.md +67 -0
- package/autorest/__init__.py +1 -2
- package/autorest/black/__init__.py +12 -5
- package/autorest/codegen/__init__.py +239 -105
- package/autorest/codegen/models/__init__.py +29 -18
- package/autorest/codegen/models/base_builder.py +48 -11
- package/autorest/codegen/models/base_model.py +6 -4
- package/autorest/codegen/models/base_schema.py +21 -24
- package/autorest/codegen/models/client.py +70 -20
- package/autorest/codegen/models/code_model.py +144 -129
- package/autorest/codegen/models/constant_schema.py +32 -16
- package/autorest/codegen/models/credential_model.py +55 -0
- package/autorest/codegen/models/credential_schema.py +21 -16
- package/autorest/codegen/models/credential_schema_policy.py +11 -15
- package/autorest/codegen/models/dictionary_schema.py +27 -24
- package/autorest/codegen/models/enum_schema.py +41 -62
- package/autorest/codegen/models/imports.py +72 -41
- package/autorest/codegen/models/list_schema.py +40 -18
- package/autorest/codegen/models/lro_operation.py +61 -25
- package/autorest/codegen/models/lro_paging_operation.py +5 -6
- package/autorest/codegen/models/object_schema.py +113 -59
- package/autorest/codegen/models/operation.py +251 -111
- package/autorest/codegen/models/operation_group.py +67 -32
- package/autorest/codegen/models/paging_operation.py +48 -21
- package/autorest/codegen/models/parameter.py +182 -90
- package/autorest/codegen/models/parameter_list.py +184 -163
- package/autorest/codegen/models/primitive_schemas.py +89 -70
- package/autorest/codegen/models/property.py +49 -31
- package/autorest/codegen/models/request_builder.py +67 -32
- package/autorest/codegen/models/request_builder_parameter.py +54 -23
- package/autorest/codegen/models/request_builder_parameter_list.py +77 -108
- package/autorest/codegen/models/schema_request.py +16 -6
- package/autorest/codegen/models/schema_response.py +35 -17
- package/autorest/codegen/models/utils.py +24 -1
- package/autorest/codegen/serializers/__init__.py +273 -89
- package/autorest/codegen/serializers/builder_serializer.py +711 -333
- package/autorest/codegen/serializers/client_serializer.py +114 -43
- package/autorest/codegen/serializers/general_serializer.py +84 -25
- package/autorest/codegen/serializers/import_serializer.py +93 -31
- package/autorest/codegen/serializers/metadata_serializer.py +73 -24
- package/autorest/codegen/serializers/model_base_serializer.py +42 -14
- package/autorest/codegen/serializers/model_generic_serializer.py +1 -4
- package/autorest/codegen/serializers/model_init_serializer.py +5 -1
- package/autorest/codegen/serializers/model_python3_serializer.py +9 -8
- package/autorest/codegen/serializers/operation_groups_serializer.py +20 -8
- package/autorest/codegen/serializers/operations_init_serializer.py +23 -11
- package/autorest/codegen/serializers/patch_serializer.py +14 -2
- package/autorest/codegen/serializers/{rest_serializer.py → request_builders_serializer.py} +29 -12
- package/autorest/codegen/serializers/utils.py +60 -21
- package/autorest/codegen/templates/CHANGELOG.md.jinja2 +6 -0
- package/autorest/codegen/templates/LICENSE.jinja2 +21 -0
- package/autorest/codegen/templates/MANIFEST.in.jinja2 +7 -0
- package/autorest/codegen/templates/README.md.jinja2 +105 -0
- package/autorest/codegen/templates/config.py.jinja2 +4 -4
- package/autorest/codegen/templates/dev_requirements.txt.jinja2 +10 -0
- package/autorest/codegen/templates/enum.py.jinja2 +1 -1
- package/autorest/codegen/templates/enum_container.py.jinja2 +0 -1
- package/autorest/codegen/templates/init.py.jinja2 +9 -6
- package/autorest/codegen/templates/keywords.jinja2 +14 -1
- package/autorest/codegen/templates/lro_operation.py.jinja2 +5 -7
- package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +5 -7
- package/autorest/codegen/templates/metadata.json.jinja2 +10 -9
- package/autorest/codegen/templates/model.py.jinja2 +1 -6
- package/autorest/codegen/templates/model_init.py.jinja2 +7 -4
- package/autorest/codegen/templates/operation.py.jinja2 +8 -11
- package/autorest/codegen/templates/operation_group.py.jinja2 +15 -18
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +1 -2
- package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -0
- package/autorest/codegen/templates/paging_operation.py.jinja2 +7 -8
- package/autorest/codegen/templates/patch.py.jinja2 +18 -29
- package/autorest/codegen/templates/request_builder.py.jinja2 +19 -14
- package/autorest/codegen/templates/setup.py.jinja2 +79 -20
- package/autorest/codegen/templates/vendor.py.jinja2 +12 -2
- package/autorest/jsonrpc/__init__.py +7 -12
- package/autorest/jsonrpc/localapi.py +4 -3
- package/autorest/jsonrpc/server.py +13 -6
- package/autorest/jsonrpc/stdstream.py +13 -6
- package/autorest/m2r/__init__.py +5 -8
- package/autorest/multiapi/__init__.py +24 -14
- package/autorest/multiapi/models/client.py +21 -11
- package/autorest/multiapi/models/code_model.py +23 -10
- package/autorest/multiapi/models/config.py +4 -1
- package/autorest/multiapi/models/constant_global_parameter.py +1 -0
- package/autorest/multiapi/models/global_parameter.py +2 -1
- package/autorest/multiapi/models/global_parameters.py +14 -8
- package/autorest/multiapi/models/imports.py +35 -18
- package/autorest/multiapi/models/mixin_operation.py +5 -5
- package/autorest/multiapi/models/operation_group.py +2 -1
- package/autorest/multiapi/models/operation_mixin_group.py +21 -10
- package/autorest/multiapi/serializers/__init__.py +18 -23
- package/autorest/multiapi/serializers/import_serializer.py +47 -15
- package/autorest/multiapi/serializers/multiapi_serializer.py +17 -17
- package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +1 -1
- package/autorest/multiapi/utils.py +3 -3
- package/autorest/namer/__init__.py +2 -4
- package/autorest/namer/name_converter.py +200 -103
- package/autorest/namer/python_mappings.py +10 -22
- package/package.json +3 -3
- package/run-python3.js +2 -3
- package/venvtools.py +1 -1
- 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 .
|
|
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.
|
|
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(
|
|
100
|
+
self._serialize_and_write_top_level_folder(
|
|
101
|
+
env=env, namespace_path=namespace_path
|
|
102
|
+
)
|
|
58
103
|
|
|
59
|
-
if self.code_model.
|
|
104
|
+
if self.code_model.request_builders:
|
|
60
105
|
if self.code_model.options["builders_visibility"] != "embedded":
|
|
61
|
-
self._serialize_and_write_rest_layer(
|
|
62
|
-
|
|
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,
|
|
111
|
+
env=env,
|
|
112
|
+
namespace_path=namespace_path,
|
|
65
113
|
)
|
|
66
114
|
|
|
67
|
-
if
|
|
68
|
-
self.
|
|
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 (
|
|
75
|
-
self.
|
|
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(
|
|
211
|
+
self._autorestapi.write_file(
|
|
212
|
+
path_file, self._autorestapi.read_file(path_file)
|
|
213
|
+
)
|
|
82
214
|
else:
|
|
83
|
-
self._autorestapi.write_file(
|
|
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(
|
|
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[
|
|
226
|
+
if not self.code_model.options["python3_only"]:
|
|
91
227
|
self._autorestapi.write_file(
|
|
92
|
-
models_path
|
|
93
|
-
|
|
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
|
|
97
|
-
|
|
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"
|
|
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"),
|
|
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.
|
|
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
|
|
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"),
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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"),
|
|
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[
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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
|
-
|
|
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[
|
|
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(
|
|
434
|
+
general_serializer = GeneralSerializer(
|
|
435
|
+
code_model=self.code_model, env=env, async_mode=False
|
|
436
|
+
)
|
|
269
437
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
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"),
|
|
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.
|
|
452
|
+
if self.code_model.request_builders:
|
|
288
453
|
self._autorestapi.write_file(
|
|
289
|
-
namespace_path / Path(f"
|
|
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(
|
|
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.
|
|
472
|
+
if self.code_model.request_builders:
|
|
306
473
|
self._autorestapi.write_file(
|
|
307
|
-
namespace_path / Path("_configuration.py"),
|
|
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(
|
|
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(
|
|
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(
|
|
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"),
|
|
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
|
-
|
|
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(
|
|
520
|
+
self._autorestapi.write_file(
|
|
521
|
+
namespace_path / Path("_metadata.json"), metadata_serializer.serialize()
|
|
522
|
+
)
|