@autorest/python 6.2.0 → 6.2.2
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/autorest/codegen/__init__.py +9 -74
- package/autorest/codegen/models/__init__.py +11 -12
- package/autorest/codegen/models/{base_type.py → base.py} +29 -10
- package/autorest/codegen/models/base_builder.py +8 -10
- package/autorest/codegen/models/client.py +111 -40
- package/autorest/codegen/models/code_model.py +131 -90
- package/autorest/codegen/models/combined_type.py +7 -7
- package/autorest/codegen/models/constant_type.py +44 -10
- package/autorest/codegen/models/credential_types.py +17 -19
- package/autorest/codegen/models/dictionary_type.py +7 -9
- package/autorest/codegen/models/enum_type.py +19 -24
- package/autorest/codegen/models/imports.py +82 -33
- package/autorest/codegen/models/list_type.py +11 -15
- package/autorest/codegen/models/lro_operation.py +6 -10
- package/autorest/codegen/models/model_type.py +20 -21
- package/autorest/codegen/models/operation.py +49 -42
- package/autorest/codegen/models/operation_group.py +11 -11
- package/autorest/codegen/models/paging_operation.py +9 -11
- package/autorest/codegen/models/parameter.py +48 -32
- package/autorest/codegen/models/parameter_list.py +16 -22
- package/autorest/codegen/models/primitive_types.py +12 -23
- package/autorest/codegen/models/property.py +11 -11
- package/autorest/codegen/models/request_builder.py +19 -19
- package/autorest/codegen/models/request_builder_parameter.py +14 -16
- package/autorest/codegen/models/response.py +24 -28
- package/autorest/codegen/serializers/__init__.py +202 -187
- package/autorest/codegen/serializers/builder_serializer.py +49 -50
- package/autorest/codegen/serializers/client_serializer.py +9 -7
- package/autorest/codegen/serializers/enum_serializer.py +4 -4
- package/autorest/codegen/serializers/general_serializer.py +26 -36
- package/autorest/codegen/serializers/import_serializer.py +30 -36
- package/autorest/codegen/serializers/metadata_serializer.py +35 -17
- package/autorest/codegen/serializers/model_init_serializer.py +6 -10
- package/autorest/codegen/serializers/model_serializer.py +42 -27
- package/autorest/codegen/serializers/operation_groups_serializer.py +12 -8
- package/autorest/codegen/serializers/operations_init_serializer.py +13 -6
- package/autorest/codegen/serializers/patch_serializer.py +4 -4
- package/autorest/codegen/serializers/request_builders_serializer.py +6 -6
- package/autorest/codegen/serializers/sample_serializer.py +10 -12
- package/autorest/codegen/templates/client_container.py.jinja2 +2 -2
- package/autorest/codegen/templates/config.py.jinja2 +1 -1
- package/autorest/codegen/templates/config_container.py.jinja2 +3 -3
- package/autorest/codegen/templates/enum_container.py.jinja2 +2 -2
- package/autorest/codegen/templates/init.py.jinja2 +2 -2
- package/autorest/codegen/templates/lro_operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/metadata.json.jinja2 +2 -2
- package/autorest/codegen/templates/model_container.py.jinja2 +3 -3
- package/autorest/codegen/templates/model_dpg.py.jinja2 +4 -4
- package/autorest/codegen/templates/model_init.py.jinja2 +3 -3
- package/autorest/codegen/templates/operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/operation_group.py.jinja2 +2 -2
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +3 -3
- package/autorest/codegen/templates/operation_tools.jinja2 +3 -3
- package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -4
- package/autorest/codegen/templates/packaging_templates/setup.py.jinja2 +4 -1
- package/autorest/codegen/templates/paging_operation.py.jinja2 +1 -1
- package/autorest/codegen/templates/request_builder.py.jinja2 +1 -1
- package/autorest/codegen/templates/request_builders.py.jinja2 +2 -2
- package/autorest/codegen/templates/rest_init.py.jinja2 +1 -1
- package/autorest/codegen/templates/sample.py.jinja2 +5 -5
- package/autorest/codegen/templates/validation.py.jinja2 +1 -1
- package/autorest/codegen/templates/vendor.py.jinja2 +6 -6
- package/autorest/codegen/templates/version.py.jinja2 +2 -2
- package/autorest/m4reformatter/__init__.py +57 -47
- package/autorest/multiapi/models/imports.py +89 -18
- package/autorest/multiapi/serializers/import_serializer.py +88 -7
- package/autorest/multiapi/utils.py +6 -0
- package/autorest/preprocess/__init__.py +23 -26
- package/package.json +1 -1
- package/run_cadl.py +0 -1
- package/autorest/cadlflags/__init__.py +0 -130
- package/autorest/codegen/models/base_model.py +0 -30
|
@@ -14,11 +14,11 @@ from ..models import (
|
|
|
14
14
|
OperationGroup,
|
|
15
15
|
RequestBuilder,
|
|
16
16
|
OverloadedRequestBuilder,
|
|
17
|
-
NamespaceModel,
|
|
18
17
|
CodeModel,
|
|
18
|
+
Client,
|
|
19
19
|
)
|
|
20
20
|
from .enum_serializer import EnumSerializer
|
|
21
|
-
from .general_serializer import
|
|
21
|
+
from .general_serializer import GeneralSerializer
|
|
22
22
|
from .model_init_serializer import ModelInitSerializer
|
|
23
23
|
from .model_serializer import DpgModelSerializer, MsrestModelSerializer
|
|
24
24
|
from .operations_init_serializer import OperationsInitSerializer
|
|
@@ -51,57 +51,37 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
51
51
|
def __init__(
|
|
52
52
|
self,
|
|
53
53
|
code_model: CodeModel,
|
|
54
|
-
namespace_model: NamespaceModel,
|
|
55
54
|
*,
|
|
56
55
|
output_folder: Union[str, Path],
|
|
57
56
|
**kwargs: Any,
|
|
58
57
|
) -> None:
|
|
59
58
|
super().__init__(output_folder=output_folder, **kwargs)
|
|
60
59
|
self.code_model = code_model
|
|
61
|
-
self.namespace_model = namespace_model
|
|
62
60
|
|
|
63
61
|
@property
|
|
64
62
|
def has_aio_folder(self) -> bool:
|
|
65
|
-
return not self.
|
|
66
|
-
self.
|
|
63
|
+
return not self.code_model.options["no_async"] and bool(
|
|
64
|
+
self.code_model.has_operations
|
|
67
65
|
)
|
|
68
66
|
|
|
69
67
|
@property
|
|
70
68
|
def has_operations_folder(self) -> bool:
|
|
71
|
-
return self.
|
|
72
|
-
self.
|
|
69
|
+
return self.code_model.options["show_operations"] and bool(
|
|
70
|
+
self.code_model.has_operations
|
|
73
71
|
)
|
|
74
72
|
|
|
75
|
-
def
|
|
76
|
-
env
|
|
77
|
-
|
|
78
|
-
keep_trailing_newline=True,
|
|
79
|
-
line_statement_prefix="##",
|
|
80
|
-
line_comment_prefix="###",
|
|
81
|
-
trim_blocks=True,
|
|
82
|
-
lstrip_blocks=True,
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
namespace_path = (
|
|
86
|
-
Path(".")
|
|
87
|
-
if self.namespace_model.options["no_namespace_folders"]
|
|
88
|
-
else Path(*(self.namespace_model.namespace.split(".")))
|
|
89
|
-
)
|
|
73
|
+
def _serialize_namespace_level(
|
|
74
|
+
self, env: Environment, namespace_path: Path, clients: List[Client]
|
|
75
|
+
) -> None:
|
|
90
76
|
# if there was a patch file before, we keep it
|
|
91
77
|
self._keep_patch_file(namespace_path / Path("_patch.py"), env)
|
|
92
78
|
if self.has_aio_folder:
|
|
93
79
|
self._keep_patch_file(namespace_path / Path("aio") / Path("_patch.py"), env)
|
|
94
80
|
|
|
95
|
-
if self.namespace_model.options["models_mode"] and (
|
|
96
|
-
self.namespace_model.model_types or self.namespace_model.enums
|
|
97
|
-
):
|
|
98
|
-
self._keep_patch_file(
|
|
99
|
-
namespace_path / Path("models") / Path("_patch.py"), env
|
|
100
|
-
)
|
|
101
81
|
if self.has_operations_folder:
|
|
102
82
|
self._keep_patch_file(
|
|
103
83
|
namespace_path
|
|
104
|
-
/ Path(self.
|
|
84
|
+
/ Path(self.code_model.operations_folder_name)
|
|
105
85
|
/ Path("_patch.py"),
|
|
106
86
|
env,
|
|
107
87
|
)
|
|
@@ -109,17 +89,16 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
109
89
|
self._keep_patch_file(
|
|
110
90
|
namespace_path
|
|
111
91
|
/ Path("aio")
|
|
112
|
-
/ Path(self.
|
|
92
|
+
/ Path(self.code_model.operations_folder_name)
|
|
113
93
|
/ Path("_patch.py"),
|
|
114
94
|
env,
|
|
115
95
|
)
|
|
116
|
-
|
|
117
96
|
self._serialize_and_write_top_level_folder(
|
|
118
|
-
env=env, namespace_path=namespace_path
|
|
97
|
+
env=env, namespace_path=namespace_path, clients=clients
|
|
119
98
|
)
|
|
120
99
|
|
|
121
|
-
if self.
|
|
122
|
-
if self.
|
|
100
|
+
if any(c for c in self.code_model.clients if c.operation_groups):
|
|
101
|
+
if self.code_model.options["builders_visibility"] != "embedded":
|
|
123
102
|
self._serialize_and_write_rest_layer(
|
|
124
103
|
env=env, namespace_path=namespace_path
|
|
125
104
|
)
|
|
@@ -127,24 +106,86 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
127
106
|
self._serialize_and_write_aio_top_level_folder(
|
|
128
107
|
env=env,
|
|
129
108
|
namespace_path=namespace_path,
|
|
109
|
+
clients=clients,
|
|
130
110
|
)
|
|
131
111
|
|
|
132
112
|
if self.has_operations_folder:
|
|
133
113
|
self._serialize_and_write_operations_folder(
|
|
134
|
-
env=env, namespace_path=namespace_path
|
|
114
|
+
clients, env=env, namespace_path=namespace_path
|
|
135
115
|
)
|
|
136
|
-
if self.
|
|
116
|
+
if self.code_model.options["multiapi"]:
|
|
137
117
|
self._serialize_and_write_metadata(
|
|
138
118
|
env=env, namespace_path=namespace_path
|
|
139
119
|
)
|
|
120
|
+
if self.code_model.options["package_mode"]:
|
|
121
|
+
self._serialize_and_write_package_files(namespace_path=namespace_path)
|
|
122
|
+
|
|
123
|
+
if (
|
|
124
|
+
self.code_model.options["show_operations"]
|
|
125
|
+
and self.code_model.has_operations
|
|
126
|
+
and self.code_model.options["generate_sample"]
|
|
127
|
+
and not self.code_model.options["multiapi"]
|
|
128
|
+
):
|
|
129
|
+
self._serialize_and_write_sample(env, namespace_path)
|
|
130
|
+
|
|
131
|
+
def serialize(self) -> None:
|
|
132
|
+
env = Environment(
|
|
133
|
+
loader=PackageLoader("autorest.codegen", "templates"),
|
|
134
|
+
keep_trailing_newline=True,
|
|
135
|
+
line_statement_prefix="##",
|
|
136
|
+
line_comment_prefix="###",
|
|
137
|
+
trim_blocks=True,
|
|
138
|
+
lstrip_blocks=True,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
namespace_path = (
|
|
142
|
+
Path(".")
|
|
143
|
+
if self.code_model.options["no_namespace_folders"]
|
|
144
|
+
else Path(*(self.code_model.namespace.split(".")))
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
p = namespace_path.parent
|
|
148
|
+
general_serializer = GeneralSerializer(
|
|
149
|
+
code_model=self.code_model, env=env, async_mode=False
|
|
150
|
+
)
|
|
151
|
+
while p != Path("."):
|
|
152
|
+
# write pkgutil init file
|
|
153
|
+
self.write_file(
|
|
154
|
+
p / Path("__init__.py"),
|
|
155
|
+
general_serializer.serialize_pkgutil_init_file(),
|
|
156
|
+
)
|
|
157
|
+
p = p.parent
|
|
158
|
+
|
|
159
|
+
# serialize main module
|
|
160
|
+
self._serialize_namespace_level(
|
|
161
|
+
env,
|
|
162
|
+
namespace_path,
|
|
163
|
+
[c for c in self.code_model.clients if c.has_operations],
|
|
164
|
+
)
|
|
165
|
+
# serialize sub modules
|
|
166
|
+
for (
|
|
167
|
+
subnamespace,
|
|
168
|
+
clients,
|
|
169
|
+
) in self.code_model.subnamespace_to_clients.items():
|
|
170
|
+
subnamespace_path = namespace_path / Path(subnamespace)
|
|
171
|
+
self._serialize_namespace_level(
|
|
172
|
+
env, subnamespace_path, [c for c in clients if c.has_operations]
|
|
173
|
+
)
|
|
140
174
|
|
|
141
|
-
if self.
|
|
142
|
-
self.
|
|
175
|
+
if self.code_model.options["models_mode"] and (
|
|
176
|
+
self.code_model.model_types or self.code_model.enums
|
|
177
|
+
):
|
|
178
|
+
self._keep_patch_file(
|
|
179
|
+
namespace_path / Path("models") / Path("_patch.py"), env
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
if self.code_model.options["models_mode"] and (
|
|
183
|
+
self.code_model.model_types or self.code_model.enums
|
|
143
184
|
):
|
|
144
185
|
self._serialize_and_write_models_folder(
|
|
145
186
|
env=env, namespace_path=namespace_path
|
|
146
187
|
)
|
|
147
|
-
if not self.
|
|
188
|
+
if not self.code_model.options["models_mode"]:
|
|
148
189
|
# keep models file if users ended up just writing a models file
|
|
149
190
|
if self.read_file(namespace_path / Path("models.py")):
|
|
150
191
|
self.write_file(
|
|
@@ -152,20 +193,9 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
152
193
|
cast(str, self.read_file(namespace_path / Path("models.py"))),
|
|
153
194
|
)
|
|
154
195
|
|
|
155
|
-
if self.namespace_model.options["package_mode"]:
|
|
156
|
-
self._serialize_and_write_package_files(namespace_path=namespace_path)
|
|
157
|
-
|
|
158
|
-
if (
|
|
159
|
-
self.namespace_model.options["show_operations"]
|
|
160
|
-
and self.namespace_model.operation_groups
|
|
161
|
-
and self.namespace_model.options["generate_sample"]
|
|
162
|
-
and not self.namespace_model.options["multiapi"]
|
|
163
|
-
):
|
|
164
|
-
self._serialize_and_write_sample(env, namespace_path)
|
|
165
|
-
|
|
166
196
|
def _serialize_and_write_package_files(self, namespace_path: Path) -> None:
|
|
167
197
|
root_of_sdk = self._package_root_folder(namespace_path)
|
|
168
|
-
if self.
|
|
198
|
+
if self.code_model.options["package_mode"] in ("dataplane", "mgmtplane"):
|
|
169
199
|
env = Environment(
|
|
170
200
|
loader=PackageLoader(
|
|
171
201
|
"autorest.codegen", "templates/packaging_templates"
|
|
@@ -174,10 +204,10 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
174
204
|
)
|
|
175
205
|
|
|
176
206
|
package_files = _PACKAGE_FILES
|
|
177
|
-
elif Path(self.
|
|
207
|
+
elif Path(self.code_model.options["package_mode"]).exists():
|
|
178
208
|
env = Environment(
|
|
179
209
|
loader=FileSystemLoader(
|
|
180
|
-
str(Path(self.
|
|
210
|
+
str(Path(self.code_model.options["package_mode"]))
|
|
181
211
|
),
|
|
182
212
|
keep_trailing_newline=True,
|
|
183
213
|
undefined=StrictUndefined,
|
|
@@ -185,8 +215,8 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
185
215
|
package_files = env.list_templates()
|
|
186
216
|
else:
|
|
187
217
|
return
|
|
188
|
-
serializer = GeneralSerializer(self.code_model, env)
|
|
189
|
-
params = self.
|
|
218
|
+
serializer = GeneralSerializer(self.code_model, env, async_mode=False)
|
|
219
|
+
params = self.code_model.options["package_configuration"] or {}
|
|
190
220
|
for template_name in package_files:
|
|
191
221
|
file = template_name.replace(".jinja2", "")
|
|
192
222
|
output_name = root_of_sdk / file
|
|
@@ -202,9 +232,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
202
232
|
else:
|
|
203
233
|
self.write_file(
|
|
204
234
|
path_file,
|
|
205
|
-
PatchSerializer(
|
|
206
|
-
env=env, namespace_model=self.namespace_model
|
|
207
|
-
).serialize(),
|
|
235
|
+
PatchSerializer(env=env, code_model=self.code_model).serialize(),
|
|
208
236
|
)
|
|
209
237
|
|
|
210
238
|
def _serialize_and_write_models_folder(
|
|
@@ -214,42 +242,36 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
214
242
|
models_path = namespace_path / Path("models")
|
|
215
243
|
serializer = (
|
|
216
244
|
DpgModelSerializer
|
|
217
|
-
if self.
|
|
245
|
+
if self.code_model.options["models_mode"] == "dpg"
|
|
218
246
|
else MsrestModelSerializer
|
|
219
247
|
)
|
|
220
|
-
if self.
|
|
248
|
+
if self.code_model.model_types:
|
|
221
249
|
self.write_file(
|
|
222
|
-
models_path / Path(f"{self.
|
|
223
|
-
serializer(
|
|
250
|
+
models_path / Path(f"{self.code_model.models_filename}.py"),
|
|
251
|
+
serializer(code_model=self.code_model, env=env).serialize(),
|
|
224
252
|
)
|
|
225
|
-
if self.
|
|
253
|
+
if self.code_model.enums:
|
|
226
254
|
self.write_file(
|
|
227
|
-
models_path / Path(f"{self.
|
|
228
|
-
EnumSerializer(
|
|
229
|
-
namespace_model=self.namespace_model, env=env
|
|
230
|
-
).serialize(),
|
|
255
|
+
models_path / Path(f"{self.code_model.enums_filename}.py"),
|
|
256
|
+
EnumSerializer(code_model=self.code_model, env=env).serialize(),
|
|
231
257
|
)
|
|
232
258
|
self.write_file(
|
|
233
259
|
models_path / Path("__init__.py"),
|
|
234
|
-
ModelInitSerializer(
|
|
235
|
-
namespace_model=self.namespace_model, env=env
|
|
236
|
-
).serialize(),
|
|
260
|
+
ModelInitSerializer(code_model=self.code_model, env=env).serialize(),
|
|
237
261
|
)
|
|
238
262
|
|
|
239
263
|
def _serialize_and_write_rest_layer(
|
|
240
264
|
self, env: Environment, namespace_path: Path
|
|
241
265
|
) -> None:
|
|
242
|
-
rest_path = namespace_path / Path(self.
|
|
266
|
+
rest_path = namespace_path / Path(self.code_model.rest_layer_name)
|
|
243
267
|
group_names = {
|
|
244
|
-
rb.group_name
|
|
245
|
-
for c in self.namespace_model.clients
|
|
246
|
-
for rb in c.request_builders
|
|
268
|
+
rb.group_name for c in self.code_model.clients for rb in c.request_builders
|
|
247
269
|
}
|
|
248
270
|
|
|
249
271
|
for group_name in group_names:
|
|
250
272
|
request_builders = [
|
|
251
273
|
r
|
|
252
|
-
for c in self.
|
|
274
|
+
for c in self.code_model.clients
|
|
253
275
|
for r in c.request_builders
|
|
254
276
|
if r.group_name == group_name
|
|
255
277
|
]
|
|
@@ -259,7 +281,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
259
281
|
if not "" in group_names:
|
|
260
282
|
self.write_file(
|
|
261
283
|
rest_path / Path("__init__.py"),
|
|
262
|
-
self.
|
|
284
|
+
self.code_model.options["license_header"],
|
|
263
285
|
)
|
|
264
286
|
|
|
265
287
|
def _serialize_and_write_single_rest_layer(
|
|
@@ -274,7 +296,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
274
296
|
self.write_file(
|
|
275
297
|
output_path / Path("_request_builders.py"),
|
|
276
298
|
RequestBuildersSerializer(
|
|
277
|
-
|
|
299
|
+
code_model=self.code_model,
|
|
278
300
|
env=env,
|
|
279
301
|
request_builders=request_builders,
|
|
280
302
|
).serialize_request_builders(),
|
|
@@ -284,7 +306,7 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
284
306
|
self.write_file(
|
|
285
307
|
output_path / Path("__init__.py"),
|
|
286
308
|
RequestBuildersSerializer(
|
|
287
|
-
|
|
309
|
+
code_model=self.code_model,
|
|
288
310
|
env=env,
|
|
289
311
|
request_builders=request_builders,
|
|
290
312
|
).serialize_init(),
|
|
@@ -293,20 +315,22 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
293
315
|
def _serialize_and_write_operations_file(
|
|
294
316
|
self,
|
|
295
317
|
env: Environment,
|
|
318
|
+
clients: List[Client],
|
|
296
319
|
namespace_path: Path,
|
|
297
320
|
operation_group: Optional[OperationGroup] = None,
|
|
298
321
|
) -> None:
|
|
299
322
|
filename = operation_group.filename if operation_group else "_operations"
|
|
300
323
|
# write first sync file
|
|
301
324
|
operation_group_serializer = OperationGroupsSerializer(
|
|
302
|
-
|
|
325
|
+
code_model=self.code_model,
|
|
326
|
+
clients=clients,
|
|
303
327
|
env=env,
|
|
304
328
|
async_mode=False,
|
|
305
329
|
operation_group=operation_group,
|
|
306
330
|
)
|
|
307
331
|
self.write_file(
|
|
308
332
|
namespace_path
|
|
309
|
-
/ Path(self.
|
|
333
|
+
/ Path(self.code_model.operations_folder_name)
|
|
310
334
|
/ Path(f"{filename}.py"),
|
|
311
335
|
operation_group_serializer.serialize(),
|
|
312
336
|
)
|
|
@@ -314,7 +338,8 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
314
338
|
if self.has_aio_folder:
|
|
315
339
|
# write async operation group and operation files
|
|
316
340
|
operation_group_async_serializer = OperationGroupsSerializer(
|
|
317
|
-
|
|
341
|
+
code_model=self.code_model,
|
|
342
|
+
clients=clients,
|
|
318
343
|
env=env,
|
|
319
344
|
async_mode=True,
|
|
320
345
|
operation_group=operation_group,
|
|
@@ -323,22 +348,22 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
323
348
|
(
|
|
324
349
|
namespace_path
|
|
325
350
|
/ Path("aio")
|
|
326
|
-
/ Path(self.
|
|
351
|
+
/ Path(self.code_model.operations_folder_name)
|
|
327
352
|
/ Path(f"{filename}.py")
|
|
328
353
|
),
|
|
329
354
|
operation_group_async_serializer.serialize(),
|
|
330
355
|
)
|
|
331
356
|
|
|
332
357
|
def _serialize_and_write_operations_folder(
|
|
333
|
-
self, env: Environment, namespace_path: Path
|
|
358
|
+
self, clients: List[Client], env: Environment, namespace_path: Path
|
|
334
359
|
) -> None:
|
|
335
360
|
# write sync operations init file
|
|
336
361
|
operations_init_serializer = OperationsInitSerializer(
|
|
337
|
-
|
|
362
|
+
code_model=self.code_model, clients=clients, env=env, async_mode=False
|
|
338
363
|
)
|
|
339
364
|
self.write_file(
|
|
340
365
|
namespace_path
|
|
341
|
-
/ Path(self.
|
|
366
|
+
/ Path(self.code_model.operations_folder_name)
|
|
342
367
|
/ Path("__init__.py"),
|
|
343
368
|
operations_init_serializer.serialize(),
|
|
344
369
|
)
|
|
@@ -346,33 +371,36 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
346
371
|
# write async operations init file
|
|
347
372
|
if self.has_aio_folder:
|
|
348
373
|
operations_async_init_serializer = OperationsInitSerializer(
|
|
349
|
-
|
|
374
|
+
code_model=self.code_model, clients=clients, env=env, async_mode=True
|
|
350
375
|
)
|
|
351
376
|
self.write_file(
|
|
352
377
|
namespace_path
|
|
353
378
|
/ Path("aio")
|
|
354
|
-
/ Path(self.
|
|
379
|
+
/ Path(self.code_model.operations_folder_name)
|
|
355
380
|
/ Path("__init__.py"),
|
|
356
381
|
operations_async_init_serializer.serialize(),
|
|
357
382
|
)
|
|
358
383
|
|
|
359
|
-
if self.
|
|
384
|
+
if self.code_model.options["combine_operation_files"]:
|
|
360
385
|
self._serialize_and_write_operations_file(
|
|
361
386
|
env=env,
|
|
362
387
|
namespace_path=namespace_path,
|
|
388
|
+
clients=clients,
|
|
363
389
|
)
|
|
364
390
|
else:
|
|
365
|
-
for
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
391
|
+
for client in self.code_model.clients:
|
|
392
|
+
for operation_group in client.operation_groups:
|
|
393
|
+
self._serialize_and_write_operations_file(
|
|
394
|
+
env=env,
|
|
395
|
+
namespace_path=namespace_path,
|
|
396
|
+
operation_group=operation_group,
|
|
397
|
+
clients=self.code_model.clients,
|
|
398
|
+
)
|
|
371
399
|
|
|
372
400
|
def _serialize_and_write_version_file(
|
|
373
401
|
self,
|
|
374
402
|
namespace_path: Path,
|
|
375
|
-
|
|
403
|
+
general_serializer: GeneralSerializer,
|
|
376
404
|
):
|
|
377
405
|
def _read_version_file(original_version_file_name: str) -> str:
|
|
378
406
|
return self.read_file(namespace_path / original_version_file_name)
|
|
@@ -383,99 +411,98 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
383
411
|
_read_version_file(original_version_file_name),
|
|
384
412
|
)
|
|
385
413
|
|
|
386
|
-
keep_version_file = self.
|
|
414
|
+
keep_version_file = self.code_model.options["keep_version_file"]
|
|
387
415
|
if keep_version_file and _read_version_file("_version.py"):
|
|
388
416
|
_write_version_file(original_version_file_name="_version.py")
|
|
389
417
|
elif keep_version_file and _read_version_file("version.py"):
|
|
390
418
|
_write_version_file(original_version_file_name="version.py")
|
|
391
|
-
elif self.
|
|
419
|
+
elif self.code_model.options["package_version"]:
|
|
392
420
|
self.write_file(
|
|
393
421
|
namespace_path / Path("_version.py"),
|
|
394
|
-
|
|
422
|
+
general_serializer.serialize_version_file(),
|
|
423
|
+
)
|
|
424
|
+
|
|
425
|
+
def _serialize_client_and_config_files(
|
|
426
|
+
self,
|
|
427
|
+
namespace_path: Path,
|
|
428
|
+
general_serializer: GeneralSerializer,
|
|
429
|
+
async_mode: bool,
|
|
430
|
+
clients: List[Client],
|
|
431
|
+
) -> None:
|
|
432
|
+
if self.code_model.has_operations:
|
|
433
|
+
namespace_path = (
|
|
434
|
+
namespace_path / Path("aio") if async_mode else namespace_path
|
|
435
|
+
)
|
|
436
|
+
self.write_file(
|
|
437
|
+
namespace_path / Path(f"{self.code_model.client_filename}.py"),
|
|
438
|
+
general_serializer.serialize_service_client_file(clients),
|
|
439
|
+
)
|
|
440
|
+
self.write_file(
|
|
441
|
+
namespace_path / Path("_configuration.py"),
|
|
442
|
+
general_serializer.serialize_config_file(clients),
|
|
395
443
|
)
|
|
396
444
|
|
|
397
445
|
def _serialize_and_write_top_level_folder(
|
|
398
|
-
self, env: Environment, namespace_path: Path
|
|
446
|
+
self, env: Environment, namespace_path: Path, clients: List[Client]
|
|
399
447
|
) -> None:
|
|
400
|
-
general_namespace_serializer = GeneralNamespaceSerializer(
|
|
401
|
-
namespace_model=self.namespace_model, env=env, async_mode=False
|
|
402
|
-
)
|
|
403
448
|
general_serializer = GeneralSerializer(
|
|
404
|
-
code_model=self.code_model,
|
|
405
|
-
env=env,
|
|
449
|
+
code_model=self.code_model, env=env, async_mode=False
|
|
406
450
|
)
|
|
407
451
|
|
|
408
452
|
self.write_file(
|
|
409
453
|
namespace_path / Path("__init__.py"),
|
|
410
|
-
|
|
454
|
+
general_serializer.serialize_init_file(clients),
|
|
411
455
|
)
|
|
412
|
-
p = namespace_path.parent
|
|
413
|
-
while p != Path("."):
|
|
414
|
-
# write pkgutil init file
|
|
415
|
-
self.write_file(
|
|
416
|
-
p / Path("__init__.py"),
|
|
417
|
-
general_namespace_serializer.serialize_pkgutil_init_file(),
|
|
418
|
-
)
|
|
419
|
-
p = p.parent
|
|
420
456
|
|
|
421
457
|
# Write the service client
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
)
|
|
427
|
-
|
|
428
|
-
if self.namespace_model.need_vendored_code(async_mode=False):
|
|
458
|
+
self._serialize_client_and_config_files(
|
|
459
|
+
namespace_path, general_serializer, async_mode=False, clients=clients
|
|
460
|
+
)
|
|
461
|
+
if self.code_model.need_vendored_code(async_mode=False):
|
|
429
462
|
self.write_file(
|
|
430
463
|
namespace_path / Path("_vendor.py"),
|
|
431
|
-
|
|
464
|
+
general_serializer.serialize_vendor_file(),
|
|
432
465
|
)
|
|
433
466
|
|
|
434
|
-
self._serialize_and_write_version_file(
|
|
435
|
-
namespace_path, general_namespace_serializer
|
|
436
|
-
)
|
|
467
|
+
self._serialize_and_write_version_file(namespace_path, general_serializer)
|
|
437
468
|
|
|
438
469
|
# write the empty py.typed file
|
|
439
470
|
self.write_file(namespace_path / Path("py.typed"), "# Marker file for PEP 561.")
|
|
440
471
|
|
|
441
472
|
if (
|
|
442
|
-
not self.
|
|
443
|
-
and not self.
|
|
473
|
+
not self.code_model.options["client_side_validation"]
|
|
474
|
+
and not self.code_model.options["multiapi"]
|
|
444
475
|
):
|
|
445
476
|
self.write_file(
|
|
446
477
|
namespace_path / Path("_serialization.py"),
|
|
447
|
-
|
|
478
|
+
general_serializer.serialize_serialization_file(),
|
|
448
479
|
)
|
|
449
|
-
if self.
|
|
480
|
+
if self.code_model.options["models_mode"] == "dpg":
|
|
450
481
|
self.write_file(
|
|
451
482
|
namespace_path / Path("_model_base.py"),
|
|
452
|
-
|
|
483
|
+
general_serializer.serialize_model_base_file(),
|
|
453
484
|
)
|
|
454
485
|
|
|
455
486
|
if any(
|
|
456
|
-
og
|
|
487
|
+
og
|
|
488
|
+
for client in self.code_model.clients
|
|
489
|
+
for og in client.operation_groups
|
|
490
|
+
if og.need_validation
|
|
457
491
|
):
|
|
458
492
|
self.write_file(
|
|
459
493
|
namespace_path / Path("_validation.py"),
|
|
460
|
-
|
|
461
|
-
)
|
|
462
|
-
|
|
463
|
-
# Write the config file
|
|
464
|
-
if self.namespace_model.request_builders:
|
|
465
|
-
self.write_file(
|
|
466
|
-
namespace_path / Path("_configuration.py"),
|
|
467
|
-
general_namespace_serializer.serialize_config_file(),
|
|
494
|
+
general_serializer.serialize_validation_file(),
|
|
468
495
|
)
|
|
469
496
|
|
|
470
497
|
# Write the setup file
|
|
471
|
-
if self.
|
|
498
|
+
if self.code_model.options["basic_setup_py"]:
|
|
472
499
|
self.write_file(Path("setup.py"), general_serializer.serialize_setup_file())
|
|
473
500
|
|
|
474
501
|
def _serialize_and_write_aio_top_level_folder(
|
|
475
|
-
self, env: Environment, namespace_path: Path
|
|
502
|
+
self, env: Environment, namespace_path: Path, clients: List[Client]
|
|
476
503
|
) -> None:
|
|
477
|
-
|
|
478
|
-
|
|
504
|
+
aio_general_serializer = GeneralSerializer(
|
|
505
|
+
code_model=self.code_model, env=env, async_mode=True
|
|
479
506
|
)
|
|
480
507
|
|
|
481
508
|
aio_path = namespace_path / Path("aio")
|
|
@@ -483,68 +510,58 @@ class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
|
483
510
|
# Write the __init__ file
|
|
484
511
|
self.write_file(
|
|
485
512
|
aio_path / Path("__init__.py"),
|
|
486
|
-
|
|
513
|
+
aio_general_serializer.serialize_init_file(clients),
|
|
487
514
|
)
|
|
488
515
|
|
|
489
516
|
# Write the service client
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
aio_path / Path(f"{self.namespace_model.client_filename}.py"),
|
|
493
|
-
aio_general_namespace_serializer.serialize_service_client_file(),
|
|
494
|
-
)
|
|
495
|
-
|
|
496
|
-
# Write the config file
|
|
497
|
-
self.write_file(
|
|
498
|
-
aio_path / Path("_configuration.py"),
|
|
499
|
-
aio_general_namespace_serializer.serialize_config_file(),
|
|
517
|
+
self._serialize_client_and_config_files(
|
|
518
|
+
namespace_path, aio_general_serializer, async_mode=True, clients=clients
|
|
500
519
|
)
|
|
501
|
-
if self.
|
|
520
|
+
if self.code_model.need_vendored_code(async_mode=True):
|
|
502
521
|
self.write_file(
|
|
503
522
|
aio_path / Path("_vendor.py"),
|
|
504
|
-
|
|
523
|
+
aio_general_serializer.serialize_vendor_file(),
|
|
505
524
|
)
|
|
506
525
|
|
|
507
526
|
def _serialize_and_write_metadata(
|
|
508
527
|
self, env: Environment, namespace_path: Path
|
|
509
528
|
) -> None:
|
|
510
|
-
metadata_serializer = MetadataSerializer(self.
|
|
529
|
+
metadata_serializer = MetadataSerializer(self.code_model, env)
|
|
511
530
|
self.write_file(
|
|
512
531
|
namespace_path / Path("_metadata.json"), metadata_serializer.serialize()
|
|
513
532
|
)
|
|
514
533
|
|
|
515
534
|
# find root folder where "setup.py" is
|
|
516
535
|
def _package_root_folder(self, namespace_path: Path) -> Path:
|
|
517
|
-
return namespace_path / Path(
|
|
518
|
-
"../" * (self.namespace_model.namespace.count(".") + 1)
|
|
519
|
-
)
|
|
536
|
+
return namespace_path / Path("../" * (self.code_model.namespace.count(".") + 1))
|
|
520
537
|
|
|
521
538
|
def _serialize_and_write_sample(self, env: Environment, namespace_path: Path):
|
|
522
539
|
out_path = self._package_root_folder(namespace_path) / Path("generated_samples")
|
|
523
|
-
for
|
|
524
|
-
for
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
"error happens
|
|
547
|
-
|
|
540
|
+
for client in self.code_model.clients:
|
|
541
|
+
for op_group in client.operation_groups:
|
|
542
|
+
for operation in op_group.operations:
|
|
543
|
+
samples = operation.yaml_data["samples"]
|
|
544
|
+
if not samples or operation.name.startswith("_"):
|
|
545
|
+
continue
|
|
546
|
+
for key, value in samples.items():
|
|
547
|
+
file_name = to_snake_case(key) + ".py"
|
|
548
|
+
try:
|
|
549
|
+
self.write_file(
|
|
550
|
+
out_path / file_name,
|
|
551
|
+
SampleSerializer(
|
|
552
|
+
code_model=self.code_model,
|
|
553
|
+
env=env,
|
|
554
|
+
operation_group=op_group,
|
|
555
|
+
operation=operation,
|
|
556
|
+
sample=value,
|
|
557
|
+
file_name=file_name,
|
|
558
|
+
sample_origin_name=key,
|
|
559
|
+
).serialize(),
|
|
560
|
+
)
|
|
561
|
+
except Exception as e: # pylint: disable=broad-except
|
|
562
|
+
# sample generation shall not block code generation, so just log error
|
|
563
|
+
log_error = f"error happens in sample {key}: {e}"
|
|
564
|
+
_LOGGER.error(log_error)
|
|
548
565
|
|
|
549
566
|
|
|
550
567
|
class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
|
|
@@ -552,7 +569,6 @@ class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
|
|
|
552
569
|
self,
|
|
553
570
|
autorestapi: AutorestAPI,
|
|
554
571
|
code_model: CodeModel,
|
|
555
|
-
namespace_model: NamespaceModel,
|
|
556
572
|
*,
|
|
557
573
|
output_folder: Union[str, Path],
|
|
558
574
|
**kwargs: Any,
|
|
@@ -560,7 +576,6 @@ class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
|
|
|
560
576
|
super().__init__(
|
|
561
577
|
autorestapi=autorestapi,
|
|
562
578
|
code_model=code_model,
|
|
563
|
-
namespace_model=namespace_model,
|
|
564
579
|
output_folder=output_folder,
|
|
565
580
|
**kwargs,
|
|
566
581
|
)
|