@autorest/python 5.18.0 → 6.0.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 +58 -13
- package/README.md +9 -0
- package/autorest/codegen/__init__.py +24 -30
- package/autorest/codegen/models/base_builder.py +17 -6
- package/autorest/codegen/models/client.py +9 -6
- package/autorest/codegen/models/code_model.py +20 -14
- package/autorest/codegen/models/imports.py +57 -2
- package/autorest/codegen/models/lro_operation.py +4 -6
- package/autorest/codegen/models/lro_paging_operation.py +3 -9
- package/autorest/codegen/models/model_type.py +1 -6
- package/autorest/codegen/models/operation.py +47 -79
- package/autorest/codegen/models/operation_group.py +10 -9
- package/autorest/codegen/models/paging_operation.py +19 -7
- package/autorest/codegen/models/parameter.py +3 -7
- package/autorest/codegen/models/parameter_list.py +20 -36
- package/autorest/codegen/models/request_builder.py +31 -42
- package/autorest/codegen/serializers/__init__.py +12 -50
- package/autorest/codegen/serializers/builder_serializer.py +53 -40
- package/autorest/codegen/serializers/client_serializer.py +22 -31
- package/autorest/codegen/serializers/general_serializer.py +12 -12
- package/autorest/codegen/serializers/import_serializer.py +11 -22
- package/autorest/codegen/serializers/metadata_serializer.py +0 -2
- package/autorest/codegen/serializers/{model_base_serializer.py → model_serializer.py} +57 -43
- package/autorest/codegen/serializers/operation_groups_serializer.py +3 -7
- package/autorest/codegen/serializers/operations_init_serializer.py +2 -23
- package/autorest/codegen/serializers/patch_serializer.py +1 -3
- package/autorest/codegen/serializers/request_builders_serializer.py +2 -5
- package/autorest/codegen/serializers/utils.py +1 -4
- package/autorest/codegen/templates/client.py.jinja2 +6 -3
- package/autorest/codegen/templates/config.py.jinja2 +2 -2
- package/autorest/codegen/templates/metadata.json.jinja2 +4 -4
- package/autorest/codegen/templates/model_init.py.jinja2 +5 -12
- package/autorest/codegen/templates/operation_group.py.jinja2 +16 -3
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +2 -8
- package/autorest/codegen/templates/operation_tools.jinja2 +3 -1
- package/autorest/codegen/templates/patch.py.jinja2 +1 -2
- package/autorest/codegen/templates/request_builder.py.jinja2 +0 -7
- package/autorest/codegen/templates/request_builders.py.jinja2 +1 -4
- package/autorest/codegen/templates/rest_init.py.jinja2 +3 -8
- package/autorest/codegen/templates/serialization.py.jinja2 +2006 -0
- package/autorest/codegen/templates/setup.py.jinja2 +4 -0
- package/autorest/codegen/templates/vendor.py.jinja2 +10 -0
- package/autorest/m4reformatter/__init__.py +9 -3
- package/autorest/multiapi/models/client.py +12 -2
- package/autorest/multiapi/serializers/__init__.py +17 -8
- package/autorest/multiapi/serializers/import_serializer.py +4 -8
- package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +1 -1
- package/autorest/preprocess/__init__.py +24 -4
- package/package.json +2 -2
- package/autorest/codegen/serializers/model_generic_serializer.py +0 -32
- package/autorest/codegen/serializers/model_python3_serializer.py +0 -72
|
@@ -14,9 +14,8 @@ from ..models import CodeModel, OperationGroup, RequestBuilder
|
|
|
14
14
|
from ..models import TokenCredentialType
|
|
15
15
|
from .enum_serializer import EnumSerializer
|
|
16
16
|
from .general_serializer import GeneralSerializer
|
|
17
|
-
from .model_generic_serializer import ModelGenericSerializer
|
|
18
17
|
from .model_init_serializer import ModelInitSerializer
|
|
19
|
-
from .
|
|
18
|
+
from .model_serializer import ModelSerializer
|
|
20
19
|
from .operations_init_serializer import OperationsInitSerializer
|
|
21
20
|
from .operation_groups_serializer import OperationGroupsSerializer
|
|
22
21
|
from .metadata_serializer import MetadataSerializer
|
|
@@ -224,22 +223,9 @@ class JinjaSerializer:
|
|
|
224
223
|
# Write the models folder
|
|
225
224
|
models_path = namespace_path / Path("models")
|
|
226
225
|
if self.code_model.model_types:
|
|
227
|
-
if not self.code_model.options["python3_only"]:
|
|
228
|
-
self._autorestapi.write_file(
|
|
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(),
|
|
236
|
-
)
|
|
237
226
|
self._autorestapi.write_file(
|
|
238
|
-
models_path
|
|
239
|
-
|
|
240
|
-
f"{self.code_model.get_models_filename(is_python3_file=True)}.py"
|
|
241
|
-
),
|
|
242
|
-
ModelPython3Serializer(code_model=self.code_model, env=env).serialize(),
|
|
227
|
+
models_path / Path(f"{self.code_model.models_filename}.py"),
|
|
228
|
+
ModelSerializer(code_model=self.code_model, env=env).serialize(),
|
|
243
229
|
)
|
|
244
230
|
if self.code_model.enums:
|
|
245
231
|
self._autorestapi.write_file(
|
|
@@ -287,18 +273,6 @@ class JinjaSerializer:
|
|
|
287
273
|
code_model=self.code_model,
|
|
288
274
|
env=env,
|
|
289
275
|
request_builders=request_builders,
|
|
290
|
-
is_python3_file=False,
|
|
291
|
-
).serialize_request_builders(),
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
# write python3 request builders file
|
|
295
|
-
self._autorestapi.write_file(
|
|
296
|
-
output_path / Path("_request_builders_py3.py"),
|
|
297
|
-
RequestBuildersSerializer(
|
|
298
|
-
code_model=self.code_model,
|
|
299
|
-
env=env,
|
|
300
|
-
request_builders=request_builders,
|
|
301
|
-
is_python3_file=True,
|
|
302
276
|
).serialize_request_builders(),
|
|
303
277
|
)
|
|
304
278
|
|
|
@@ -309,7 +283,6 @@ class JinjaSerializer:
|
|
|
309
283
|
code_model=self.code_model,
|
|
310
284
|
env=env,
|
|
311
285
|
request_builders=request_builders,
|
|
312
|
-
is_python3_file=True,
|
|
313
286
|
).serialize_init(),
|
|
314
287
|
)
|
|
315
288
|
|
|
@@ -325,7 +298,6 @@ class JinjaSerializer:
|
|
|
325
298
|
code_model=self.code_model,
|
|
326
299
|
env=env,
|
|
327
300
|
async_mode=False,
|
|
328
|
-
is_python3_file=self.code_model.options["python3_only"],
|
|
329
301
|
operation_group=operation_group,
|
|
330
302
|
)
|
|
331
303
|
self._autorestapi.write_file(
|
|
@@ -335,31 +307,12 @@ class JinjaSerializer:
|
|
|
335
307
|
operation_group_serializer.serialize(),
|
|
336
308
|
)
|
|
337
309
|
|
|
338
|
-
if (
|
|
339
|
-
not self.code_model.options["python3_only"]
|
|
340
|
-
and self.code_model.options["add_python3_operation_files"]
|
|
341
|
-
):
|
|
342
|
-
# write typed second file if not python 3 only
|
|
343
|
-
operation_group_serializer = OperationGroupsSerializer(
|
|
344
|
-
code_model=self.code_model,
|
|
345
|
-
env=env,
|
|
346
|
-
async_mode=False,
|
|
347
|
-
is_python3_file=True,
|
|
348
|
-
)
|
|
349
|
-
self._autorestapi.write_file(
|
|
350
|
-
namespace_path
|
|
351
|
-
/ Path(self.code_model.operations_folder_name)
|
|
352
|
-
/ Path(f"{filename}_py3.py"),
|
|
353
|
-
operation_group_serializer.serialize(),
|
|
354
|
-
)
|
|
355
|
-
|
|
356
310
|
if self.has_aio_folder:
|
|
357
311
|
# write async operation group and operation files
|
|
358
312
|
operation_group_async_serializer = OperationGroupsSerializer(
|
|
359
313
|
code_model=self.code_model,
|
|
360
314
|
env=env,
|
|
361
315
|
async_mode=True,
|
|
362
|
-
is_python3_file=True,
|
|
363
316
|
operation_group=operation_group,
|
|
364
317
|
)
|
|
365
318
|
self._autorestapi.write_file(
|
|
@@ -477,6 +430,15 @@ class JinjaSerializer:
|
|
|
477
430
|
namespace_path / Path("py.typed"), "# Marker file for PEP 561."
|
|
478
431
|
)
|
|
479
432
|
|
|
433
|
+
if (
|
|
434
|
+
not self.code_model.options["client_side_validation"]
|
|
435
|
+
and not self.code_model.options["multiapi"]
|
|
436
|
+
):
|
|
437
|
+
self._autorestapi.write_file(
|
|
438
|
+
namespace_path / Path("_serialization.py"),
|
|
439
|
+
general_serializer.serialize_serialization_file(),
|
|
440
|
+
)
|
|
441
|
+
|
|
480
442
|
# Write the config file
|
|
481
443
|
if self.code_model.request_builders:
|
|
482
444
|
self._autorestapi.write_file(
|
|
@@ -176,12 +176,9 @@ def _get_json_response_template_to_status_codes(
|
|
|
176
176
|
|
|
177
177
|
|
|
178
178
|
class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-method
|
|
179
|
-
def __init__(
|
|
180
|
-
self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
|
|
181
|
-
) -> None:
|
|
179
|
+
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
182
180
|
self.code_model = code_model
|
|
183
181
|
self.async_mode = async_mode
|
|
184
|
-
self.is_python3_file = is_python3_file
|
|
185
182
|
self.parameter_serializer = ParameterSerializer()
|
|
186
183
|
|
|
187
184
|
@property
|
|
@@ -225,9 +222,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
|
|
|
225
222
|
function_def=self._function_def,
|
|
226
223
|
method_name=builder.name,
|
|
227
224
|
need_self_param=self._need_self_param,
|
|
228
|
-
method_param_signatures=builder.method_signature(
|
|
229
|
-
self.async_mode or self.is_python3_file, self.async_mode
|
|
230
|
-
),
|
|
225
|
+
method_param_signatures=builder.method_signature(self.async_mode),
|
|
231
226
|
pylint_disable=builder.pylint_disable,
|
|
232
227
|
)
|
|
233
228
|
|
|
@@ -245,7 +240,6 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
|
|
|
245
240
|
return (
|
|
246
241
|
decorators_str
|
|
247
242
|
+ utils.method_signature_and_response_type_annotation_template(
|
|
248
|
-
is_python3_file=self.is_python3_file,
|
|
249
243
|
method_signature=method_signature,
|
|
250
244
|
response_type_annotation=response_type_annotation,
|
|
251
245
|
)
|
|
@@ -442,7 +436,7 @@ class RequestBuilderSerializer(
|
|
|
442
436
|
|
|
443
437
|
def pop_kwargs_from_signature(self, builder: RequestBuilderType) -> List[str]:
|
|
444
438
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
445
|
-
builder.parameters.kwargs_to_pop
|
|
439
|
+
builder.parameters.kwargs_to_pop,
|
|
446
440
|
check_kwarg_dict=True,
|
|
447
441
|
pop_headers_kwarg=PopKwargType.CASE_INSENSITIVE
|
|
448
442
|
if bool(builder.parameters.headers)
|
|
@@ -452,7 +446,8 @@ class RequestBuilderSerializer(
|
|
|
452
446
|
else PopKwargType.NO,
|
|
453
447
|
)
|
|
454
448
|
|
|
455
|
-
|
|
449
|
+
@staticmethod
|
|
450
|
+
def create_http_request(builder: RequestBuilderType) -> List[str]:
|
|
456
451
|
retval = ["return HttpRequest("]
|
|
457
452
|
retval.append(f' method="{builder.method}",')
|
|
458
453
|
retval.append(" url=_url,")
|
|
@@ -465,9 +460,9 @@ class RequestBuilderSerializer(
|
|
|
465
460
|
and builder.parameters.body_parameter.in_method_signature
|
|
466
461
|
):
|
|
467
462
|
body_param = builder.parameters.body_parameter
|
|
468
|
-
if
|
|
469
|
-
|
|
470
|
-
|
|
463
|
+
if (
|
|
464
|
+
body_param.constant
|
|
465
|
+
or body_param.method_location != ParameterMethodLocation.KWARG
|
|
471
466
|
):
|
|
472
467
|
# we only need to pass it through if it's not a kwarg or it's a popped kwarg
|
|
473
468
|
retval.append(
|
|
@@ -598,8 +593,6 @@ class _OperationSerializer(
|
|
|
598
593
|
def decorators(self, builder: OperationType) -> List[str]:
|
|
599
594
|
"""Decorators for the method"""
|
|
600
595
|
super_decorators = super().decorators(builder)
|
|
601
|
-
if builder.abstract:
|
|
602
|
-
super_decorators.append("@abc.abstractmethod")
|
|
603
596
|
return super_decorators
|
|
604
597
|
|
|
605
598
|
def param_description(
|
|
@@ -613,9 +606,7 @@ class _OperationSerializer(
|
|
|
613
606
|
return description_list
|
|
614
607
|
|
|
615
608
|
def pop_kwargs_from_signature(self, builder: OperationType) -> List[str]:
|
|
616
|
-
kwargs_to_pop = builder.parameters.kwargs_to_pop
|
|
617
|
-
is_python3_file=self.is_python3_file
|
|
618
|
-
)
|
|
609
|
+
kwargs_to_pop = builder.parameters.kwargs_to_pop
|
|
619
610
|
kwargs = self.parameter_serializer.pop_kwargs_from_signature(
|
|
620
611
|
kwargs_to_pop,
|
|
621
612
|
check_kwarg_dict=True,
|
|
@@ -824,7 +815,6 @@ class _OperationSerializer(
|
|
|
824
815
|
is_next_request
|
|
825
816
|
and builder.operation_type == "paging"
|
|
826
817
|
and not bool(builder.next_request_builder) # type: ignore
|
|
827
|
-
and not self.code_model.options["reformat_next_link"]
|
|
828
818
|
and parameter.location == ParameterLocation.QUERY
|
|
829
819
|
):
|
|
830
820
|
# if we don't want to reformat query parameters for next link calls
|
|
@@ -835,10 +825,15 @@ class _OperationSerializer(
|
|
|
835
825
|
f" {parameter.client_name}={parameter.name_in_high_level_operation},"
|
|
836
826
|
)
|
|
837
827
|
if request_builder.overloads:
|
|
828
|
+
seen_body_params = set()
|
|
838
829
|
for overload in request_builder.overloads:
|
|
839
830
|
body_param = cast(
|
|
840
831
|
RequestBuilderBodyParameter, overload.parameters.body_parameter
|
|
841
832
|
)
|
|
833
|
+
if body_param.client_name in seen_body_params:
|
|
834
|
+
continue
|
|
835
|
+
seen_body_params.add(body_param.client_name)
|
|
836
|
+
|
|
842
837
|
retval.append(
|
|
843
838
|
f" {body_param.client_name}={body_param.name_in_high_level_operation},"
|
|
844
839
|
)
|
|
@@ -1105,15 +1100,12 @@ PagingOperationType = TypeVar(
|
|
|
1105
1100
|
class _PagingOperationSerializer(
|
|
1106
1101
|
_OperationSerializer[PagingOperationType]
|
|
1107
1102
|
): # pylint: disable=abstract-method
|
|
1108
|
-
def __init__(
|
|
1109
|
-
self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
|
|
1110
|
-
) -> None:
|
|
1103
|
+
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
1111
1104
|
# for pylint reasons need to redefine init
|
|
1112
1105
|
# probably because inheritance is going too deep
|
|
1113
|
-
super().__init__(code_model, async_mode
|
|
1106
|
+
super().__init__(code_model, async_mode)
|
|
1114
1107
|
self.code_model = code_model
|
|
1115
1108
|
self.async_mode = async_mode
|
|
1116
|
-
self.is_python3_file = is_python3_file
|
|
1117
1109
|
self.parameter_serializer = ParameterSerializer()
|
|
1118
1110
|
|
|
1119
1111
|
def serialize_path(self, builder: PagingOperationType) -> List[str]:
|
|
@@ -1126,8 +1118,6 @@ class _PagingOperationSerializer(
|
|
|
1126
1118
|
retval: List[str] = []
|
|
1127
1119
|
if self.code_model.options["tracing"] and builder.want_tracing:
|
|
1128
1120
|
retval.append("@distributed_trace")
|
|
1129
|
-
if builder.abstract:
|
|
1130
|
-
retval.append("@abc.abstractmethod")
|
|
1131
1121
|
return retval
|
|
1132
1122
|
|
|
1133
1123
|
def call_next_link_request_builder(self, builder: PagingOperationType) -> List[str]:
|
|
@@ -1143,9 +1133,39 @@ class _PagingOperationSerializer(
|
|
|
1143
1133
|
template_url = "next_link"
|
|
1144
1134
|
|
|
1145
1135
|
request_builder = builder.next_request_builder or builder.request_builder
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1136
|
+
if builder.next_request_builder:
|
|
1137
|
+
return self._call_request_builder_helper(
|
|
1138
|
+
builder,
|
|
1139
|
+
request_builder,
|
|
1140
|
+
template_url=template_url,
|
|
1141
|
+
is_next_request=True,
|
|
1142
|
+
)
|
|
1143
|
+
retval: List[str] = []
|
|
1144
|
+
query_str = ""
|
|
1145
|
+
next_link_str = "next_link"
|
|
1146
|
+
try:
|
|
1147
|
+
api_version_param = next(
|
|
1148
|
+
p
|
|
1149
|
+
for p in self.code_model.client.parameters
|
|
1150
|
+
if p.rest_api_name == "api-version"
|
|
1151
|
+
)
|
|
1152
|
+
retval.append("# make call to next link with the client's api-version")
|
|
1153
|
+
retval.append("_parsed_next_link = urlparse(next_link)")
|
|
1154
|
+
retval.append(
|
|
1155
|
+
"_next_request_params = case_insensitive_dict(parse_qs(_parsed_next_link.query))"
|
|
1156
|
+
)
|
|
1157
|
+
retval.append(
|
|
1158
|
+
f'_next_request_params["api-version"] = {api_version_param.full_client_name}'
|
|
1159
|
+
)
|
|
1160
|
+
query_str = ", params=_next_request_params"
|
|
1161
|
+
next_link_str = "urljoin(next_link, _parsed_next_link.path)"
|
|
1162
|
+
except StopIteration:
|
|
1163
|
+
pass
|
|
1164
|
+
|
|
1165
|
+
retval.append(f'request = HttpRequest("GET", {next_link_str}{query_str})')
|
|
1166
|
+
retval.extend(self._postprocess_http_request(builder, "request.url"))
|
|
1167
|
+
|
|
1168
|
+
return retval
|
|
1149
1169
|
|
|
1150
1170
|
def _prepare_request_callback(self, builder: PagingOperationType) -> List[str]:
|
|
1151
1171
|
retval = ["def prepare_request(next_link=None):"]
|
|
@@ -1158,10 +1178,7 @@ class _PagingOperationSerializer(
|
|
|
1158
1178
|
retval.extend(
|
|
1159
1179
|
[f" {line}" for line in self.call_next_link_request_builder(builder)]
|
|
1160
1180
|
)
|
|
1161
|
-
if not builder.next_request_builder and
|
|
1162
|
-
retval.append("")
|
|
1163
|
-
retval.extend([f" {line}" for line in self.serialize_path(builder)])
|
|
1164
|
-
if not builder.next_request_builder:
|
|
1181
|
+
if not builder.next_request_builder and self.code_model.is_legacy:
|
|
1165
1182
|
retval.append(' request.method = "GET"')
|
|
1166
1183
|
else:
|
|
1167
1184
|
retval.append("")
|
|
@@ -1239,15 +1256,12 @@ LROOperationType = TypeVar(
|
|
|
1239
1256
|
|
|
1240
1257
|
|
|
1241
1258
|
class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
|
|
1242
|
-
def __init__(
|
|
1243
|
-
self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
|
|
1244
|
-
) -> None:
|
|
1259
|
+
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
1245
1260
|
# for pylint reasons need to redefine init
|
|
1246
1261
|
# probably because inheritance is going too deep
|
|
1247
|
-
super().__init__(code_model, async_mode
|
|
1262
|
+
super().__init__(code_model, async_mode)
|
|
1248
1263
|
self.code_model = code_model
|
|
1249
1264
|
self.async_mode = async_mode
|
|
1250
|
-
self.is_python3_file = is_python3_file
|
|
1251
1265
|
self.parameter_serializer = ParameterSerializer()
|
|
1252
1266
|
|
|
1253
1267
|
def param_description(self, builder: LROOperationType) -> List[str]:
|
|
@@ -1427,7 +1441,6 @@ def get_operation_serializer(
|
|
|
1427
1441
|
builder: Operation,
|
|
1428
1442
|
code_model,
|
|
1429
1443
|
async_mode: bool,
|
|
1430
|
-
is_python3_file: bool,
|
|
1431
1444
|
) -> Union[
|
|
1432
1445
|
OperationSerializer,
|
|
1433
1446
|
PagingOperationSerializer,
|
|
@@ -1446,4 +1459,4 @@ def get_operation_serializer(
|
|
|
1446
1459
|
retcls = LROOperationSerializer
|
|
1447
1460
|
elif builder.operation_type == "paging":
|
|
1448
1461
|
retcls = PagingOperationSerializer
|
|
1449
|
-
return retcls(code_model, async_mode
|
|
1462
|
+
return retcls(code_model, async_mode)
|
|
@@ -11,9 +11,8 @@ from .parameter_serializer import ParameterSerializer, PopKwargType
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class ClientSerializer:
|
|
14
|
-
def __init__(self, code_model: CodeModel
|
|
14
|
+
def __init__(self, code_model: CodeModel) -> None:
|
|
15
15
|
self.code_model = code_model
|
|
16
|
-
self.is_python3_file = is_python3_file
|
|
17
16
|
self.parameter_serializer = ParameterSerializer()
|
|
18
17
|
|
|
19
18
|
def _init_signature(self, async_mode: bool) -> str:
|
|
@@ -22,36 +21,32 @@ class ClientSerializer:
|
|
|
22
21
|
method_name="__init__",
|
|
23
22
|
need_self_param=True,
|
|
24
23
|
method_param_signatures=self.code_model.client.parameters.method_signature(
|
|
25
|
-
async_mode
|
|
24
|
+
async_mode
|
|
26
25
|
),
|
|
27
26
|
)
|
|
28
27
|
|
|
29
28
|
def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
|
|
30
29
|
init_signature = self._init_signature(async_mode)
|
|
31
30
|
return utils.method_signature_and_response_type_annotation_template(
|
|
32
|
-
is_python3_file=async_mode or self.is_python3_file,
|
|
33
31
|
method_signature=init_signature,
|
|
34
32
|
response_type_annotation="None",
|
|
35
33
|
)
|
|
36
34
|
|
|
37
|
-
def pop_kwargs_from_signature(self
|
|
35
|
+
def pop_kwargs_from_signature(self) -> List[str]:
|
|
38
36
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
39
|
-
self.code_model.client.parameters.kwargs_to_pop
|
|
40
|
-
async_mode or self.is_python3_file,
|
|
41
|
-
),
|
|
37
|
+
self.code_model.client.parameters.kwargs_to_pop,
|
|
42
38
|
check_kwarg_dict=False,
|
|
43
39
|
pop_headers_kwarg=PopKwargType.NO,
|
|
44
40
|
pop_params_kwarg=PopKwargType.NO,
|
|
45
41
|
)
|
|
46
42
|
|
|
47
|
-
|
|
43
|
+
@property
|
|
44
|
+
def class_definition(self) -> str:
|
|
48
45
|
class_name = self.code_model.client.name
|
|
49
46
|
has_mixin_og = any(og for og in self.code_model.operation_groups if og.is_mixin)
|
|
50
47
|
base_class = ""
|
|
51
48
|
if has_mixin_og:
|
|
52
49
|
base_class = f"{class_name}OperationsMixin"
|
|
53
|
-
elif not (async_mode or self.is_python3_file):
|
|
54
|
-
base_class = "object"
|
|
55
50
|
pylint_disable = self.code_model.client.pylint_disable
|
|
56
51
|
if base_class:
|
|
57
52
|
return f"class {class_name}({base_class}):{pylint_disable}"
|
|
@@ -101,6 +96,14 @@ class ClientSerializer:
|
|
|
101
96
|
except StopIteration:
|
|
102
97
|
return "_endpoint"
|
|
103
98
|
|
|
99
|
+
@property
|
|
100
|
+
def should_init_super(self) -> bool:
|
|
101
|
+
return any(
|
|
102
|
+
og
|
|
103
|
+
for og in self.code_model.operation_groups
|
|
104
|
+
if og.is_mixin and og.has_abstract_operations
|
|
105
|
+
)
|
|
106
|
+
|
|
104
107
|
def initialize_pipeline_client(self, async_mode: bool) -> str:
|
|
105
108
|
pipeline_client_name = self.code_model.client.pipeline_class(async_mode)
|
|
106
109
|
return (
|
|
@@ -138,17 +141,10 @@ class ClientSerializer:
|
|
|
138
141
|
)
|
|
139
142
|
return retval
|
|
140
143
|
|
|
141
|
-
def _send_request_signature(self
|
|
142
|
-
|
|
143
|
-
request_signature = [
|
|
144
|
+
def _send_request_signature(self) -> str:
|
|
145
|
+
send_request_signature = [
|
|
144
146
|
"request: HttpRequest,"
|
|
145
|
-
|
|
146
|
-
else "request, # type: HttpRequest"
|
|
147
|
-
]
|
|
148
|
-
send_request_signature = (
|
|
149
|
-
request_signature
|
|
150
|
-
+ self.code_model.client.parameters.method_signature_kwargs(is_python3_file)
|
|
151
|
-
)
|
|
147
|
+
] + self.code_model.client.parameters.method_signature_kwargs
|
|
152
148
|
return self.parameter_serializer.serialize_method(
|
|
153
149
|
function_def="def",
|
|
154
150
|
method_name=self.code_model.client.send_request_name,
|
|
@@ -159,9 +155,8 @@ class ClientSerializer:
|
|
|
159
155
|
def send_request_signature_and_response_type_annotation(
|
|
160
156
|
self, async_mode: bool
|
|
161
157
|
) -> str:
|
|
162
|
-
send_request_signature = self._send_request_signature(
|
|
158
|
+
send_request_signature = self._send_request_signature()
|
|
163
159
|
return utils.method_signature_and_response_type_annotation_template(
|
|
164
|
-
is_python3_file=async_mode or self.is_python3_file,
|
|
165
160
|
method_signature=send_request_signature,
|
|
166
161
|
response_type_annotation="Awaitable[AsyncHttpResponse]"
|
|
167
162
|
if async_mode
|
|
@@ -247,10 +242,9 @@ class ClientSerializer:
|
|
|
247
242
|
|
|
248
243
|
|
|
249
244
|
class ConfigSerializer:
|
|
250
|
-
def __init__(self, code_model: CodeModel
|
|
245
|
+
def __init__(self, code_model: CodeModel) -> None:
|
|
251
246
|
self.code_model = code_model
|
|
252
247
|
self.parameter_serializer = ParameterSerializer()
|
|
253
|
-
self.is_python3_file = is_python3_file
|
|
254
248
|
|
|
255
249
|
def _init_signature(self, async_mode: bool) -> str:
|
|
256
250
|
return self.parameter_serializer.serialize_method(
|
|
@@ -258,23 +252,20 @@ class ConfigSerializer:
|
|
|
258
252
|
method_name="__init__",
|
|
259
253
|
need_self_param=True,
|
|
260
254
|
method_param_signatures=self.code_model.config.parameters.method_signature(
|
|
261
|
-
async_mode
|
|
255
|
+
async_mode
|
|
262
256
|
),
|
|
263
257
|
)
|
|
264
258
|
|
|
265
259
|
def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
|
|
266
260
|
init_signature = self._init_signature(async_mode)
|
|
267
261
|
return utils.method_signature_and_response_type_annotation_template(
|
|
268
|
-
is_python3_file=async_mode or self.is_python3_file,
|
|
269
262
|
method_signature=init_signature,
|
|
270
263
|
response_type_annotation="None",
|
|
271
264
|
)
|
|
272
265
|
|
|
273
|
-
def pop_kwargs_from_signature(self
|
|
266
|
+
def pop_kwargs_from_signature(self) -> List[str]:
|
|
274
267
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
275
|
-
self.code_model.config.parameters.kwargs_to_pop
|
|
276
|
-
async_mode or self.is_python3_file
|
|
277
|
-
),
|
|
268
|
+
self.code_model.config.parameters.kwargs_to_pop,
|
|
278
269
|
check_kwarg_dict=False,
|
|
279
270
|
pop_headers_kwarg=PopKwargType.NO,
|
|
280
271
|
pop_params_kwarg=PopKwargType.NO,
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from jinja2 import Environment
|
|
7
7
|
from .import_serializer import FileImportSerializer, TypingSection
|
|
8
|
+
from ..models.imports import MsrestImportType
|
|
8
9
|
from ..models import (
|
|
9
10
|
FileImport,
|
|
10
11
|
ImportType,
|
|
@@ -33,14 +34,12 @@ class GeneralSerializer:
|
|
|
33
34
|
|
|
34
35
|
template = self.env.get_template("client.py.jinja2")
|
|
35
36
|
|
|
36
|
-
python3_only = self.code_model.options["python3_only"]
|
|
37
37
|
return template.render(
|
|
38
38
|
code_model=self.code_model,
|
|
39
39
|
async_mode=self.async_mode,
|
|
40
|
-
serializer=ClientSerializer(self.code_model
|
|
40
|
+
serializer=ClientSerializer(self.code_model),
|
|
41
41
|
imports=FileImportSerializer(
|
|
42
42
|
self.code_model.client.imports(self.async_mode),
|
|
43
|
-
is_python3_file=self.async_mode or python3_only,
|
|
44
43
|
),
|
|
45
44
|
)
|
|
46
45
|
|
|
@@ -73,18 +72,17 @@ class GeneralSerializer:
|
|
|
73
72
|
f"{self.code_model.client.name}Configuration",
|
|
74
73
|
ImportType.LOCAL,
|
|
75
74
|
)
|
|
76
|
-
file_import.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
75
|
+
file_import.add_msrest_import(
|
|
76
|
+
self.code_model,
|
|
77
|
+
".." if self.async_mode else ".",
|
|
78
|
+
MsrestImportType.SerializerDeserializer,
|
|
79
|
+
TypingSection.TYPING,
|
|
81
80
|
)
|
|
82
81
|
|
|
83
82
|
return template.render(
|
|
84
83
|
code_model=self.code_model,
|
|
85
84
|
imports=FileImportSerializer(
|
|
86
85
|
file_import,
|
|
87
|
-
is_python3_file=self.async_mode,
|
|
88
86
|
),
|
|
89
87
|
async_mode=self.async_mode,
|
|
90
88
|
)
|
|
@@ -98,15 +96,13 @@ class GeneralSerializer:
|
|
|
98
96
|
package_name if package_name else self.code_model.client.name.lower()
|
|
99
97
|
)
|
|
100
98
|
template = self.env.get_template("config.py.jinja2")
|
|
101
|
-
python3_only = self.code_model.options["python3_only"]
|
|
102
99
|
return template.render(
|
|
103
100
|
code_model=self.code_model,
|
|
104
101
|
async_mode=self.async_mode,
|
|
105
102
|
imports=FileImportSerializer(
|
|
106
103
|
self.code_model.config.imports(self.async_mode),
|
|
107
|
-
is_python3_file=self.async_mode or python3_only,
|
|
108
104
|
),
|
|
109
|
-
serializer=ConfigSerializer(self.code_model
|
|
105
|
+
serializer=ConfigSerializer(self.code_model),
|
|
110
106
|
sdk_moniker=sdk_moniker,
|
|
111
107
|
)
|
|
112
108
|
|
|
@@ -120,3 +116,7 @@ class GeneralSerializer:
|
|
|
120
116
|
params.update(self.code_model.options)
|
|
121
117
|
params.update(self.code_model.package_dependency)
|
|
122
118
|
return template.render(code_model=self.code_model, **params)
|
|
119
|
+
|
|
120
|
+
def serialize_serialization_file(self) -> str:
|
|
121
|
+
template = self.env.get_template("serialization.py.jinja2")
|
|
122
|
+
return template.render(code_model=self.code_model)
|
|
@@ -58,11 +58,8 @@ def _get_import_clauses(imports: List[ImportModel], delimiter: str) -> List[str]
|
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
class FileImportSerializer:
|
|
61
|
-
def __init__(
|
|
62
|
-
self, file_import: FileImport, is_python3_file: bool, async_mode: bool = False
|
|
63
|
-
) -> None:
|
|
61
|
+
def __init__(self, file_import: FileImport, async_mode: bool = False) -> None:
|
|
64
62
|
self.file_import = file_import
|
|
65
|
-
self.is_python3_file = is_python3_file
|
|
66
63
|
self.async_mode = async_mode
|
|
67
64
|
|
|
68
65
|
def _get_imports_list(
|
|
@@ -82,20 +79,14 @@ class FileImportSerializer:
|
|
|
82
79
|
return file_import_copy.get_imports_from_section(baseline_typing_section)
|
|
83
80
|
|
|
84
81
|
def _add_type_checking_import(self):
|
|
85
|
-
|
|
86
|
-
self.file_import.get_imports_from_section(TypingSection.TYPING)
|
|
87
|
-
)
|
|
88
|
-
conditional_and_not_py3 = not self.is_python3_file and any(
|
|
89
|
-
self.file_import.get_imports_from_section(TypingSection.CONDITIONAL)
|
|
90
|
-
)
|
|
91
|
-
if any_typing or conditional_and_not_py3:
|
|
82
|
+
if any(self.file_import.get_imports_from_section(TypingSection.TYPING)):
|
|
92
83
|
self.file_import.add_submodule_import(
|
|
93
84
|
"typing", "TYPE_CHECKING", ImportType.STDLIB
|
|
94
85
|
)
|
|
95
86
|
|
|
96
87
|
def _get_typing_definitions(self) -> str:
|
|
97
88
|
def declare_defintion(
|
|
98
|
-
|
|
89
|
+
type_name: str, type_definition: TypeDefinition
|
|
99
90
|
) -> List[str]:
|
|
100
91
|
ret: List[str] = []
|
|
101
92
|
definition_value = (
|
|
@@ -112,21 +103,20 @@ class FileImportSerializer:
|
|
|
112
103
|
):
|
|
113
104
|
if version is not None:
|
|
114
105
|
ret.append(
|
|
115
|
-
"{}
|
|
116
|
-
|
|
106
|
+
"{} sys.version_info >= {}:".format(
|
|
107
|
+
"if" if i == 0 else "elif", version
|
|
117
108
|
)
|
|
118
109
|
)
|
|
119
110
|
elif i > 0:
|
|
120
|
-
ret.append("
|
|
111
|
+
ret.append("else:")
|
|
121
112
|
for import_clause in _get_import_clauses(
|
|
122
113
|
[type_definition.version_imports[version]], "\n"
|
|
123
114
|
):
|
|
124
115
|
ret.append(
|
|
125
|
-
"{}{}
|
|
116
|
+
"{}{}".format(
|
|
126
117
|
" "
|
|
127
118
|
if len(versions) > 1 or version is not None
|
|
128
119
|
else "",
|
|
129
|
-
spacing,
|
|
130
120
|
import_clause,
|
|
131
121
|
)
|
|
132
122
|
)
|
|
@@ -134,15 +124,14 @@ class FileImportSerializer:
|
|
|
134
124
|
ret[
|
|
135
125
|
-1
|
|
136
126
|
] += " # type: ignore # pylint: disable=ungrouped-imports"
|
|
137
|
-
ret.append("{}
|
|
127
|
+
ret.append("{} = {}".format(type_name, definition_value))
|
|
138
128
|
return ret
|
|
139
129
|
|
|
140
130
|
if not self.file_import.type_definitions:
|
|
141
131
|
return ""
|
|
142
|
-
spacing = "" if self.is_python3_file else " "
|
|
143
132
|
declarations: List[str] = [""]
|
|
144
133
|
for type_name, value in self.file_import.type_definitions.items():
|
|
145
|
-
declarations.extend(declare_defintion(
|
|
134
|
+
declarations.extend(declare_defintion(type_name, value))
|
|
146
135
|
return "\n".join(declarations)
|
|
147
136
|
|
|
148
137
|
def __str__(self) -> str:
|
|
@@ -150,7 +139,7 @@ class FileImportSerializer:
|
|
|
150
139
|
regular_imports = ""
|
|
151
140
|
regular_imports_list = self._get_imports_list(
|
|
152
141
|
baseline_typing_section=TypingSection.REGULAR,
|
|
153
|
-
add_conditional_typing=
|
|
142
|
+
add_conditional_typing=True,
|
|
154
143
|
)
|
|
155
144
|
|
|
156
145
|
if regular_imports_list:
|
|
@@ -161,7 +150,7 @@ class FileImportSerializer:
|
|
|
161
150
|
typing_imports = ""
|
|
162
151
|
typing_imports_list = self._get_imports_list(
|
|
163
152
|
baseline_typing_section=TypingSection.TYPING,
|
|
164
|
-
add_conditional_typing=
|
|
153
|
+
add_conditional_typing=False,
|
|
165
154
|
)
|
|
166
155
|
if typing_imports_list:
|
|
167
156
|
typing_imports += "\n\nif TYPE_CHECKING:\n # pylint: disable=unused-import,ungrouped-imports\n "
|
|
@@ -143,13 +143,11 @@ class MetadataSerializer:
|
|
|
143
143
|
get_operation_serializer,
|
|
144
144
|
code_model=self.code_model,
|
|
145
145
|
async_mode=True,
|
|
146
|
-
is_python3_file=True,
|
|
147
146
|
),
|
|
148
147
|
get_sync_operation_serializer=functools.partial(
|
|
149
148
|
get_operation_serializer,
|
|
150
149
|
code_model=self.code_model,
|
|
151
150
|
async_mode=False,
|
|
152
|
-
is_python3_file=False,
|
|
153
151
|
),
|
|
154
152
|
has_credential=bool(self.code_model.credential),
|
|
155
153
|
)
|