@autorest/python 6.27.4 → 6.28.1
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/generator/build/lib/pygen/black.py +3 -3
- package/generator/build/lib/pygen/codegen/__init__.py +2 -0
- package/generator/build/lib/pygen/codegen/_utils.py +4 -0
- package/generator/build/lib/pygen/codegen/models/base.py +2 -3
- package/generator/build/lib/pygen/codegen/models/base_builder.py +5 -3
- package/generator/build/lib/pygen/codegen/models/client.py +28 -19
- package/generator/build/lib/pygen/codegen/models/code_model.py +204 -33
- package/generator/build/lib/pygen/codegen/models/combined_type.py +12 -8
- package/generator/build/lib/pygen/codegen/models/constant_type.py +2 -3
- package/generator/build/lib/pygen/codegen/models/credential_types.py +6 -3
- package/generator/build/lib/pygen/codegen/models/dictionary_type.py +2 -3
- package/generator/build/lib/pygen/codegen/models/enum_type.py +47 -24
- package/generator/build/lib/pygen/codegen/models/imports.py +14 -12
- package/generator/build/lib/pygen/codegen/models/list_type.py +2 -3
- package/generator/build/lib/pygen/codegen/models/lro_operation.py +8 -4
- package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/build/lib/pygen/codegen/models/model_type.py +34 -19
- package/generator/build/lib/pygen/codegen/models/operation.py +74 -31
- package/generator/build/lib/pygen/codegen/models/operation_group.py +82 -12
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +10 -7
- package/generator/build/lib/pygen/codegen/models/parameter.py +10 -10
- package/generator/build/lib/pygen/codegen/models/parameter_list.py +7 -7
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +23 -43
- package/generator/build/lib/pygen/codegen/models/property.py +9 -9
- package/generator/build/lib/pygen/codegen/models/request_builder.py +9 -15
- package/generator/build/lib/pygen/codegen/models/response.py +6 -8
- package/generator/build/lib/pygen/codegen/models/utils.py +11 -0
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +228 -243
- package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +19 -1
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +58 -36
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +9 -5
- package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +17 -3
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +26 -14
- package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +26 -8
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +9 -4
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +65 -24
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +20 -16
- package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -10
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +10 -7
- package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +10 -1
- package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +7 -10
- package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +24 -28
- package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +6 -1
- package/generator/build/lib/pygen/codegen/serializers/utils.py +1 -15
- package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +4 -4
- package/generator/build/lib/pygen/codegen/templates/operation_groups_container.py.jinja2 +2 -0
- package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
- package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +2 -68
- package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +3 -3
- package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
- package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +4 -4
- package/generator/build/lib/pygen/preprocess/__init__.py +0 -4
- package/generator/component-detection-pip-report.json +2 -2
- package/generator/dev_requirements.txt +2 -2
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/black.py +3 -3
- package/generator/pygen/codegen/__init__.py +2 -0
- package/generator/pygen/codegen/_utils.py +4 -0
- package/generator/pygen/codegen/models/base.py +2 -3
- package/generator/pygen/codegen/models/base_builder.py +5 -3
- package/generator/pygen/codegen/models/client.py +28 -19
- package/generator/pygen/codegen/models/code_model.py +204 -33
- package/generator/pygen/codegen/models/combined_type.py +12 -8
- package/generator/pygen/codegen/models/constant_type.py +2 -3
- package/generator/pygen/codegen/models/credential_types.py +6 -3
- package/generator/pygen/codegen/models/dictionary_type.py +2 -3
- package/generator/pygen/codegen/models/enum_type.py +47 -24
- package/generator/pygen/codegen/models/imports.py +14 -12
- package/generator/pygen/codegen/models/list_type.py +2 -3
- package/generator/pygen/codegen/models/lro_operation.py +8 -4
- package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/pygen/codegen/models/model_type.py +34 -19
- package/generator/pygen/codegen/models/operation.py +74 -31
- package/generator/pygen/codegen/models/operation_group.py +82 -12
- package/generator/pygen/codegen/models/paging_operation.py +10 -7
- package/generator/pygen/codegen/models/parameter.py +10 -10
- package/generator/pygen/codegen/models/parameter_list.py +7 -7
- package/generator/pygen/codegen/models/primitive_types.py +23 -43
- package/generator/pygen/codegen/models/property.py +9 -9
- package/generator/pygen/codegen/models/request_builder.py +9 -15
- package/generator/pygen/codegen/models/response.py +6 -8
- package/generator/pygen/codegen/models/utils.py +11 -0
- package/generator/pygen/codegen/serializers/__init__.py +228 -243
- package/generator/pygen/codegen/serializers/base_serializer.py +19 -1
- package/generator/pygen/codegen/serializers/builder_serializer.py +58 -36
- package/generator/pygen/codegen/serializers/client_serializer.py +9 -5
- package/generator/pygen/codegen/serializers/enum_serializer.py +17 -3
- package/generator/pygen/codegen/serializers/general_serializer.py +26 -14
- package/generator/pygen/codegen/serializers/metadata_serializer.py +26 -8
- package/generator/pygen/codegen/serializers/model_init_serializer.py +9 -4
- package/generator/pygen/codegen/serializers/model_serializer.py +65 -24
- package/generator/pygen/codegen/serializers/operation_groups_serializer.py +20 -16
- package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -10
- package/generator/pygen/codegen/serializers/parameter_serializer.py +10 -7
- package/generator/pygen/codegen/serializers/request_builders_serializer.py +10 -1
- package/generator/pygen/codegen/serializers/sample_serializer.py +7 -10
- package/generator/pygen/codegen/serializers/test_serializer.py +24 -28
- package/generator/pygen/codegen/serializers/types_serializer.py +6 -1
- package/generator/pygen/codegen/serializers/utils.py +1 -15
- package/generator/pygen/codegen/templates/client_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/config_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/init.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/operation_group.py.jinja2 +4 -4
- package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +2 -0
- package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
- package/generator/pygen/codegen/templates/serialization.py.jinja2 +2 -68
- package/generator/pygen/codegen/templates/test.py.jinja2 +3 -3
- package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
- package/generator/pygen/codegen/templates/vendor.py.jinja2 +4 -4
- package/generator/pygen/preprocess/__init__.py +0 -4
- package/generator/pygen.egg-info/PKG-INFO +10 -1
- package/package.json +2 -2
- package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
|
@@ -3,6 +3,7 @@
|
|
|
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 Optional
|
|
6
7
|
from jinja2 import Environment
|
|
7
8
|
from ..models import (
|
|
8
9
|
FileImport,
|
|
@@ -13,9 +14,26 @@ from ..models import (
|
|
|
13
14
|
class BaseSerializer:
|
|
14
15
|
"""Base serializer for SDK root level files"""
|
|
15
16
|
|
|
16
|
-
def __init__(
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
code_model: CodeModel,
|
|
20
|
+
env: Environment,
|
|
21
|
+
async_mode: bool = False,
|
|
22
|
+
*,
|
|
23
|
+
client_namespace: Optional[str] = None
|
|
24
|
+
):
|
|
17
25
|
self.code_model = code_model
|
|
18
26
|
self.env = env
|
|
27
|
+
self.async_mode = async_mode
|
|
28
|
+
self.client_namespace = code_model.namespace if client_namespace is None else client_namespace
|
|
19
29
|
|
|
20
30
|
def init_file_import(self) -> FileImport:
|
|
21
31
|
return FileImport(self.code_model)
|
|
32
|
+
|
|
33
|
+
# get namespace of serialize file from client namespace.
|
|
34
|
+
# For async API, serialize namespace will have additional suffix '.aio' compared with client namespace;
|
|
35
|
+
# For models, there will be additional '.models';
|
|
36
|
+
# For operations, there will be additional '.operations' or '._operations';
|
|
37
|
+
@property
|
|
38
|
+
def serialize_namespace(self) -> str:
|
|
39
|
+
return self.code_model.get_serialize_namespace(self.client_namespace, async_mode=self.async_mode)
|
|
@@ -32,6 +32,7 @@ from ..models import (
|
|
|
32
32
|
ParameterListType,
|
|
33
33
|
ByteArraySchema,
|
|
34
34
|
)
|
|
35
|
+
from ..models.utils import NamespaceType
|
|
35
36
|
from .parameter_serializer import ParameterSerializer, PopKwargType
|
|
36
37
|
from ..models.parameter_list import ParameterType
|
|
37
38
|
from . import utils
|
|
@@ -188,10 +189,19 @@ def is_json_model_type(parameters: ParameterListType) -> bool:
|
|
|
188
189
|
|
|
189
190
|
|
|
190
191
|
class _BuilderBaseSerializer(Generic[BuilderType]):
|
|
191
|
-
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
192
|
+
def __init__(self, code_model: CodeModel, async_mode: bool, client_namespace: str) -> None:
|
|
192
193
|
self.code_model = code_model
|
|
193
194
|
self.async_mode = async_mode
|
|
194
|
-
self.
|
|
195
|
+
self.client_namespace = client_namespace
|
|
196
|
+
self.parameter_serializer = ParameterSerializer(self.serialize_namespace)
|
|
197
|
+
|
|
198
|
+
@property
|
|
199
|
+
def serialize_namespace(self) -> str:
|
|
200
|
+
return self.code_model.get_serialize_namespace(
|
|
201
|
+
self.client_namespace,
|
|
202
|
+
async_mode=self.async_mode,
|
|
203
|
+
client_namespace_type=NamespaceType.OPERATION,
|
|
204
|
+
)
|
|
195
205
|
|
|
196
206
|
@property
|
|
197
207
|
@abstractmethod
|
|
@@ -230,14 +240,18 @@ class _BuilderBaseSerializer(Generic[BuilderType]):
|
|
|
230
240
|
function_def=self._function_def,
|
|
231
241
|
method_name=builder.name,
|
|
232
242
|
need_self_param=self._need_self_param,
|
|
233
|
-
method_param_signatures=builder.method_signature(
|
|
243
|
+
method_param_signatures=builder.method_signature(
|
|
244
|
+
self.async_mode, serialize_namespace=self.serialize_namespace
|
|
245
|
+
),
|
|
234
246
|
pylint_disable=builder.pylint_disable(self.async_mode),
|
|
235
247
|
)
|
|
236
248
|
|
|
237
249
|
def method_signature_and_response_type_annotation(
|
|
238
250
|
self, builder: BuilderType, *, want_decorators: Optional[bool] = True
|
|
239
251
|
) -> str:
|
|
240
|
-
response_type_annotation = builder.response_type_annotation(
|
|
252
|
+
response_type_annotation = builder.response_type_annotation(
|
|
253
|
+
async_mode=self.async_mode, serialize_namespace=self.serialize_namespace
|
|
254
|
+
)
|
|
241
255
|
method_signature = self._method_signature(builder)
|
|
242
256
|
decorators = self.decorators(builder)
|
|
243
257
|
decorators_str = ""
|
|
@@ -286,6 +300,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]):
|
|
|
286
300
|
)
|
|
287
301
|
docstring_type = param.docstring_type(
|
|
288
302
|
async_mode=self.async_mode,
|
|
303
|
+
serialize_namespace=self.serialize_namespace,
|
|
289
304
|
)
|
|
290
305
|
description_list.append(f":{param.docstring_type_keyword} {param.client_name}: {docstring_type}")
|
|
291
306
|
return description_list
|
|
@@ -361,6 +376,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]):
|
|
|
361
376
|
|
|
362
377
|
|
|
363
378
|
class RequestBuilderSerializer(_BuilderBaseSerializer[RequestBuilderType]):
|
|
379
|
+
|
|
364
380
|
def description_and_summary(self, builder: RequestBuilderType) -> List[str]:
|
|
365
381
|
retval = super().description_and_summary(builder)
|
|
366
382
|
retval += [
|
|
@@ -482,7 +498,11 @@ class RequestBuilderSerializer(_BuilderBaseSerializer[RequestBuilderType]):
|
|
|
482
498
|
url_value = _escape_str(builder.url)
|
|
483
499
|
else:
|
|
484
500
|
url_value = f'kwargs.pop("template_url", {_escape_str(builder.url)})'
|
|
485
|
-
|
|
501
|
+
result = "_url = " + url_value
|
|
502
|
+
# there will be always 4 spaces before the url
|
|
503
|
+
if len(result) + 4 > 120:
|
|
504
|
+
return result + " # pylint: disable=line-too-long"
|
|
505
|
+
return result
|
|
486
506
|
|
|
487
507
|
|
|
488
508
|
############################## NORMAL OPERATIONS ##############################
|
|
@@ -616,13 +636,18 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
616
636
|
for p in builder.parameters.parameters:
|
|
617
637
|
if p.hide_in_operation_signature:
|
|
618
638
|
kwargs.append(f'{p.client_name} = kwargs.pop("{p.client_name}", None)')
|
|
619
|
-
cls_annotation = builder.cls_type_annotation(
|
|
639
|
+
cls_annotation = builder.cls_type_annotation(
|
|
640
|
+
async_mode=self.async_mode, serialize_namespace=self.serialize_namespace
|
|
641
|
+
)
|
|
620
642
|
kwargs.append(f"cls: {cls_annotation} = kwargs.pop(\n 'cls', None\n)")
|
|
621
643
|
return kwargs
|
|
622
644
|
|
|
623
645
|
def response_docstring(self, builder: OperationType) -> List[str]:
|
|
624
646
|
response_str = f":return: {builder.response_docstring_text(async_mode=self.async_mode)}"
|
|
625
|
-
|
|
647
|
+
response_docstring_type = builder.response_docstring_type(
|
|
648
|
+
async_mode=self.async_mode, serialize_namespace=self.serialize_namespace
|
|
649
|
+
)
|
|
650
|
+
rtype_str = f":rtype: {response_docstring_type}"
|
|
626
651
|
return [
|
|
627
652
|
response_str,
|
|
628
653
|
rtype_str,
|
|
@@ -670,9 +695,10 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
670
695
|
if self.code_model.options["models_mode"] == "msrest":
|
|
671
696
|
is_xml_cmd = _xml_config(send_xml, builder.parameters.body_parameter.content_types)
|
|
672
697
|
serialization_ctxt_cmd = f", {ser_ctxt_name}={ser_ctxt_name}" if xml_serialization_ctxt else ""
|
|
698
|
+
serialization_type = body_param.type.serialization_type(serialize_namespace=self.serialize_namespace)
|
|
673
699
|
create_body_call = (
|
|
674
700
|
f"_{body_kwarg_name} = self._serialize.body({body_param.client_name}, "
|
|
675
|
-
f"'{
|
|
701
|
+
f"'{serialization_type}'{is_xml_cmd}{serialization_ctxt_cmd})"
|
|
676
702
|
)
|
|
677
703
|
elif self.code_model.options["models_mode"] == "dpg":
|
|
678
704
|
if json_serializable(body_param.default_content_type):
|
|
@@ -903,7 +929,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
903
929
|
retval: List[str] = [
|
|
904
930
|
(
|
|
905
931
|
f"response_headers['{response_header.wire_name}']=self._deserialize("
|
|
906
|
-
f"'{response_header.serialization_type}', response.headers.get('{response_header.wire_name}'))"
|
|
932
|
+
f"'{response_header.serialization_type(serialize_namespace=self.serialize_namespace)}', response.headers.get('{response_header.wire_name}'))" # pylint: disable=line-too-long
|
|
907
933
|
)
|
|
908
934
|
for response_header in response.headers
|
|
909
935
|
]
|
|
@@ -911,7 +937,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
911
937
|
retval.append("")
|
|
912
938
|
return retval
|
|
913
939
|
|
|
914
|
-
def response_deserialization(
|
|
940
|
+
def response_deserialization( # pylint: disable=too-many-statements
|
|
915
941
|
self,
|
|
916
942
|
builder: OperationType,
|
|
917
943
|
response: Response,
|
|
@@ -937,7 +963,8 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
937
963
|
pylint_disable = " # pylint: disable=protected-access"
|
|
938
964
|
if self.code_model.options["models_mode"] == "msrest":
|
|
939
965
|
deserialize_code.append("deserialized = self._deserialize(")
|
|
940
|
-
|
|
966
|
+
serialization_type = response.serialization_type(serialize_namespace=self.serialize_namespace)
|
|
967
|
+
deserialize_code.append(f" '{serialization_type}',{pylint_disable}")
|
|
941
968
|
deserialize_code.append(" pipeline_response.http_response")
|
|
942
969
|
deserialize_code.append(")")
|
|
943
970
|
elif self.code_model.options["models_mode"] == "dpg":
|
|
@@ -955,9 +982,10 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
955
982
|
if xml_serializable(str(response.default_content_type)):
|
|
956
983
|
deserialize_func = "_deserialize_xml"
|
|
957
984
|
deserialize_code.append(f"deserialized = {deserialize_func}(")
|
|
958
|
-
|
|
959
|
-
|
|
985
|
+
type_annotation = response.type.type_annotation(
|
|
986
|
+
is_operation_file=True, serialize_namespace=self.serialize_namespace
|
|
960
987
|
)
|
|
988
|
+
deserialize_code.append(f" {type_annotation},{pylint_disable}")
|
|
961
989
|
deserialize_code.append(f" response.{response_attr}(){response.result_property}{format_filed}")
|
|
962
990
|
deserialize_code.append(")")
|
|
963
991
|
|
|
@@ -1002,11 +1030,14 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
1002
1030
|
if isinstance(e.status_codes[0], int):
|
|
1003
1031
|
for status_code in e.status_codes:
|
|
1004
1032
|
retval.append(f" {condition} response.status_code == {status_code}:")
|
|
1033
|
+
type_annotation = e.type.type_annotation( # type: ignore
|
|
1034
|
+
is_operation_file=True, skip_quote=True, serialize_namespace=self.serialize_namespace
|
|
1035
|
+
)
|
|
1005
1036
|
if self.code_model.options["models_mode"] == "dpg":
|
|
1006
|
-
retval.append(f" error = _failsafe_deserialize({
|
|
1037
|
+
retval.append(f" error = _failsafe_deserialize({type_annotation}, response.json())")
|
|
1007
1038
|
else:
|
|
1008
1039
|
retval.append(
|
|
1009
|
-
f" error = self._deserialize.failsafe_deserialize({
|
|
1040
|
+
f" error = self._deserialize.failsafe_deserialize({type_annotation}, "
|
|
1010
1041
|
"pipeline_response)"
|
|
1011
1042
|
)
|
|
1012
1043
|
# add build-in error type
|
|
@@ -1044,11 +1075,14 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
1044
1075
|
retval.append(
|
|
1045
1076
|
f" {condition} {e.status_codes[0][0]} <= response.status_code <= {e.status_codes[0][1]}:"
|
|
1046
1077
|
)
|
|
1078
|
+
type_annotation = e.type.type_annotation( # type: ignore
|
|
1079
|
+
is_operation_file=True, skip_quote=True, serialize_namespace=self.serialize_namespace
|
|
1080
|
+
)
|
|
1047
1081
|
if self.code_model.options["models_mode"] == "dpg":
|
|
1048
|
-
retval.append(f" error = _failsafe_deserialize({
|
|
1082
|
+
retval.append(f" error = _failsafe_deserialize({type_annotation}, response.json())")
|
|
1049
1083
|
else:
|
|
1050
1084
|
retval.append(
|
|
1051
|
-
f" error = self._deserialize.failsafe_deserialize({
|
|
1085
|
+
f" error = self._deserialize.failsafe_deserialize({type_annotation}, "
|
|
1052
1086
|
"pipeline_response)"
|
|
1053
1087
|
)
|
|
1054
1088
|
condition = "elif"
|
|
@@ -1198,13 +1232,6 @@ PagingOperationType = TypeVar("PagingOperationType", bound=Union[PagingOperation
|
|
|
1198
1232
|
|
|
1199
1233
|
|
|
1200
1234
|
class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
|
|
1201
|
-
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
1202
|
-
# for pylint reasons need to redefine init
|
|
1203
|
-
# probably because inheritance is going too deep
|
|
1204
|
-
super().__init__(code_model, async_mode)
|
|
1205
|
-
self.code_model = code_model
|
|
1206
|
-
self.async_mode = async_mode
|
|
1207
|
-
self.parameter_serializer = ParameterSerializer()
|
|
1208
1235
|
|
|
1209
1236
|
def serialize_path(self, builder: PagingOperationType) -> List[str]:
|
|
1210
1237
|
return self.parameter_serializer.serialize_path(builder.parameters.path, self.serializer_name)
|
|
@@ -1294,10 +1321,10 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
|
|
|
1294
1321
|
deserialized = "pipeline_response.http_response.json()"
|
|
1295
1322
|
if self.code_model.options["models_mode"] == "msrest":
|
|
1296
1323
|
suffix = ".http_response" if hasattr(builder, "initial_operation") else ""
|
|
1297
|
-
deserialize_type = response.serialization_type
|
|
1324
|
+
deserialize_type = response.serialization_type(serialize_namespace=self.serialize_namespace)
|
|
1298
1325
|
pylint_disable = " # pylint: disable=protected-access"
|
|
1299
1326
|
if isinstance(response.type, ModelType) and not response.type.internal:
|
|
1300
|
-
deserialize_type = f'"{response.serialization_type}"'
|
|
1327
|
+
deserialize_type = f'"{response.serialization_type(serialize_namespace=self.serialize_namespace)}"'
|
|
1301
1328
|
pylint_disable = ""
|
|
1302
1329
|
deserialized = (
|
|
1303
1330
|
f"self._deserialize(\n {deserialize_type},{pylint_disable}\n pipeline_response{suffix}\n)"
|
|
@@ -1312,7 +1339,9 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
|
|
|
1312
1339
|
access = f".{item_name}" if self.code_model.options["models_mode"] == "msrest" else f'["{item_name}"]'
|
|
1313
1340
|
list_of_elem_deserialized = ""
|
|
1314
1341
|
if self.code_model.options["models_mode"] == "dpg":
|
|
1315
|
-
item_type = builder.item_type.type_annotation(
|
|
1342
|
+
item_type = builder.item_type.type_annotation(
|
|
1343
|
+
is_operation_file=True, serialize_namespace=self.serialize_namespace
|
|
1344
|
+
)
|
|
1316
1345
|
list_of_elem_deserialized = f"_deserialize({item_type}, deserialized{access})"
|
|
1317
1346
|
else:
|
|
1318
1347
|
list_of_elem_deserialized = f"deserialized{access}"
|
|
@@ -1363,14 +1392,6 @@ LROOperationType = TypeVar("LROOperationType", bound=Union[LROOperation, LROPagi
|
|
|
1363
1392
|
|
|
1364
1393
|
|
|
1365
1394
|
class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
|
|
1366
|
-
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
1367
|
-
# for pylint reasons need to redefine init
|
|
1368
|
-
# probably because inheritance is going too deep
|
|
1369
|
-
super().__init__(code_model, async_mode)
|
|
1370
|
-
self.code_model = code_model
|
|
1371
|
-
self.async_mode = async_mode
|
|
1372
|
-
self.parameter_serializer = ParameterSerializer()
|
|
1373
|
-
|
|
1374
1395
|
def serialize_path(self, builder: LROOperationType) -> List[str]:
|
|
1375
1396
|
return self.parameter_serializer.serialize_path(builder.parameters.path, self.serializer_name)
|
|
1376
1397
|
|
|
@@ -1512,6 +1533,7 @@ def get_operation_serializer(
|
|
|
1512
1533
|
builder: Operation,
|
|
1513
1534
|
code_model,
|
|
1514
1535
|
async_mode: bool,
|
|
1536
|
+
client_namespace: str,
|
|
1515
1537
|
) -> Union[
|
|
1516
1538
|
OperationSerializer,
|
|
1517
1539
|
PagingOperationSerializer,
|
|
@@ -1530,4 +1552,4 @@ def get_operation_serializer(
|
|
|
1530
1552
|
ret_cls = LROOperationSerializer
|
|
1531
1553
|
elif builder.operation_type == "paging":
|
|
1532
1554
|
ret_cls = PagingOperationSerializer
|
|
1533
|
-
return ret_cls(code_model, async_mode)
|
|
1555
|
+
return ret_cls(code_model, async_mode, client_namespace)
|
|
@@ -12,9 +12,10 @@ from ...utils import build_policies
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class ClientSerializer:
|
|
15
|
-
def __init__(self, client: Client) -> None:
|
|
15
|
+
def __init__(self, client: Client, serialize_namespace: str) -> None:
|
|
16
16
|
self.client = client
|
|
17
|
-
self.parameter_serializer = ParameterSerializer()
|
|
17
|
+
self.parameter_serializer = ParameterSerializer(serialize_namespace)
|
|
18
|
+
self.serialize_namespace = serialize_namespace
|
|
18
19
|
|
|
19
20
|
def _init_signature(self, async_mode: bool) -> str:
|
|
20
21
|
pylint_disable = ""
|
|
@@ -24,7 +25,9 @@ class ClientSerializer:
|
|
|
24
25
|
function_def="def",
|
|
25
26
|
method_name="__init__",
|
|
26
27
|
need_self_param=True,
|
|
27
|
-
method_param_signatures=self.client.parameters.method_signature(
|
|
28
|
+
method_param_signatures=self.client.parameters.method_signature(
|
|
29
|
+
async_mode, serialize_namespace=self.serialize_namespace
|
|
30
|
+
),
|
|
28
31
|
pylint_disable=pylint_disable,
|
|
29
32
|
)
|
|
30
33
|
|
|
@@ -244,9 +247,10 @@ class ClientSerializer:
|
|
|
244
247
|
|
|
245
248
|
|
|
246
249
|
class ConfigSerializer:
|
|
247
|
-
def __init__(self, client: Client) -> None:
|
|
250
|
+
def __init__(self, client: Client, serialize_namespace: str) -> None:
|
|
248
251
|
self.client = client
|
|
249
|
-
self.parameter_serializer = ParameterSerializer()
|
|
252
|
+
self.parameter_serializer = ParameterSerializer(serialize_namespace)
|
|
253
|
+
self.serialize_namespace = serialize_namespace
|
|
250
254
|
|
|
251
255
|
def _init_signature(self, async_mode: bool) -> str:
|
|
252
256
|
return self.parameter_serializer.serialize_method(
|
|
@@ -3,13 +3,27 @@
|
|
|
3
3
|
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
|
-
|
|
6
|
+
from typing import Optional, List
|
|
7
|
+
from jinja2 import Environment
|
|
7
8
|
from .base_serializer import BaseSerializer
|
|
8
|
-
from ..models import FileImport
|
|
9
|
+
from ..models import FileImport, CodeModel, EnumType
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class EnumSerializer(BaseSerializer):
|
|
13
|
+
|
|
14
|
+
def __init__(
|
|
15
|
+
self,
|
|
16
|
+
code_model: CodeModel,
|
|
17
|
+
env: Environment,
|
|
18
|
+
async_mode: bool = False,
|
|
19
|
+
*,
|
|
20
|
+
enums: List[EnumType],
|
|
21
|
+
client_namespace: Optional[str] = None
|
|
22
|
+
):
|
|
23
|
+
super().__init__(code_model, env, async_mode=async_mode, client_namespace=client_namespace)
|
|
24
|
+
self.enums = enums
|
|
25
|
+
|
|
12
26
|
def serialize(self) -> str:
|
|
13
27
|
# Generate the enum file
|
|
14
28
|
template = self.env.get_template("enum_container.py.jinja2")
|
|
15
|
-
return template.render(code_model=self.code_model, file_import=FileImport(self.code_model))
|
|
29
|
+
return template.render(code_model=self.code_model, file_import=FileImport(self.code_model), enums=self.enums)
|
|
@@ -5,15 +5,14 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
import json
|
|
7
7
|
from typing import Any, List
|
|
8
|
-
from jinja2 import Environment
|
|
9
8
|
from .import_serializer import FileImportSerializer, TypingSection
|
|
10
9
|
from ..models.imports import MsrestImportType, FileImport
|
|
11
10
|
from ..models import (
|
|
12
11
|
ImportType,
|
|
13
|
-
CodeModel,
|
|
14
12
|
TokenCredentialType,
|
|
15
13
|
Client,
|
|
16
14
|
)
|
|
15
|
+
from ..models.utils import NamespaceType
|
|
17
16
|
from .client_serializer import ClientSerializer, ConfigSerializer
|
|
18
17
|
from .base_serializer import BaseSerializer
|
|
19
18
|
|
|
@@ -21,10 +20,6 @@ from .base_serializer import BaseSerializer
|
|
|
21
20
|
class GeneralSerializer(BaseSerializer):
|
|
22
21
|
"""General serializer for SDK root level files"""
|
|
23
22
|
|
|
24
|
-
def __init__(self, code_model: CodeModel, env: Environment, async_mode: bool):
|
|
25
|
-
super().__init__(code_model, env)
|
|
26
|
-
self.async_mode = async_mode
|
|
27
|
-
|
|
28
23
|
def serialize_setup_file(self) -> str:
|
|
29
24
|
template = self.env.get_template("packaging_templates/setup.py.jinja2")
|
|
30
25
|
params = {}
|
|
@@ -65,6 +60,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
65
60
|
code_model=self.code_model,
|
|
66
61
|
clients=clients,
|
|
67
62
|
async_mode=self.async_mode,
|
|
63
|
+
serialize_namespace=self.serialize_namespace,
|
|
68
64
|
)
|
|
69
65
|
|
|
70
66
|
def serialize_service_client_file(self, clients: List[Client]) -> str:
|
|
@@ -72,7 +68,13 @@ class GeneralSerializer(BaseSerializer):
|
|
|
72
68
|
|
|
73
69
|
imports = FileImport(self.code_model)
|
|
74
70
|
for client in clients:
|
|
75
|
-
imports.merge(
|
|
71
|
+
imports.merge(
|
|
72
|
+
client.imports(
|
|
73
|
+
self.async_mode,
|
|
74
|
+
serialize_namespace=self.serialize_namespace,
|
|
75
|
+
serialize_namespace_type=NamespaceType.CLIENT,
|
|
76
|
+
)
|
|
77
|
+
)
|
|
76
78
|
|
|
77
79
|
return template.render(
|
|
78
80
|
code_model=self.code_model,
|
|
@@ -80,14 +82,16 @@ class GeneralSerializer(BaseSerializer):
|
|
|
80
82
|
async_mode=self.async_mode,
|
|
81
83
|
get_serializer=ClientSerializer,
|
|
82
84
|
imports=FileImportSerializer(imports),
|
|
85
|
+
serialize_namespace=self.serialize_namespace,
|
|
83
86
|
)
|
|
84
87
|
|
|
85
|
-
def serialize_vendor_file(self
|
|
88
|
+
def serialize_vendor_file(self) -> str:
|
|
86
89
|
template = self.env.get_template("vendor.py.jinja2")
|
|
90
|
+
clients = self.code_model.get_clients(self.client_namespace)
|
|
87
91
|
|
|
88
92
|
# configure imports
|
|
89
93
|
file_import = FileImport(self.code_model)
|
|
90
|
-
if self.code_model.
|
|
94
|
+
if self.code_model.need_vendored_mixin(self.client_namespace):
|
|
91
95
|
file_import.add_submodule_import(
|
|
92
96
|
"abc",
|
|
93
97
|
"ABC",
|
|
@@ -100,7 +104,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
100
104
|
TypingSection.TYPING,
|
|
101
105
|
)
|
|
102
106
|
file_import.add_msrest_import(
|
|
103
|
-
|
|
107
|
+
serialize_namespace=self.serialize_namespace,
|
|
104
108
|
msrest_import_type=MsrestImportType.SerializerDeserializer,
|
|
105
109
|
typing_section=TypingSection.TYPING,
|
|
106
110
|
)
|
|
@@ -111,14 +115,14 @@ class GeneralSerializer(BaseSerializer):
|
|
|
111
115
|
f"{client.name}Configuration",
|
|
112
116
|
ImportType.LOCAL,
|
|
113
117
|
)
|
|
114
|
-
if self.code_model.
|
|
118
|
+
if self.code_model.need_vendored_etag(self.client_namespace):
|
|
115
119
|
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
116
120
|
file_import.add_submodule_import(
|
|
117
121
|
"",
|
|
118
122
|
"MatchConditions",
|
|
119
123
|
ImportType.SDKCORE,
|
|
120
124
|
)
|
|
121
|
-
if self.code_model.
|
|
125
|
+
if self.code_model.need_vendored_form_data(self.async_mode, self.client_namespace):
|
|
122
126
|
file_import.add_submodule_import("typing", "IO", ImportType.STDLIB)
|
|
123
127
|
file_import.add_submodule_import("typing", "Tuple", ImportType.STDLIB)
|
|
124
128
|
file_import.add_submodule_import("typing", "Union", ImportType.STDLIB)
|
|
@@ -146,19 +150,27 @@ class GeneralSerializer(BaseSerializer):
|
|
|
146
150
|
),
|
|
147
151
|
async_mode=self.async_mode,
|
|
148
152
|
clients=clients,
|
|
153
|
+
client_namespace=self.client_namespace,
|
|
149
154
|
)
|
|
150
155
|
|
|
151
156
|
def serialize_config_file(self, clients: List[Client]) -> str:
|
|
152
157
|
template = self.env.get_template("config_container.py.jinja2")
|
|
153
158
|
imports = FileImport(self.code_model)
|
|
154
159
|
for client in self.code_model.clients:
|
|
155
|
-
imports.merge(
|
|
160
|
+
imports.merge(
|
|
161
|
+
client.config.imports(
|
|
162
|
+
self.async_mode,
|
|
163
|
+
serialize_namespace=self.serialize_namespace,
|
|
164
|
+
serialize_namespace_type=NamespaceType.CLIENT,
|
|
165
|
+
)
|
|
166
|
+
)
|
|
156
167
|
return template.render(
|
|
157
168
|
code_model=self.code_model,
|
|
158
169
|
async_mode=self.async_mode,
|
|
159
170
|
imports=FileImportSerializer(imports),
|
|
160
171
|
get_serializer=ConfigSerializer,
|
|
161
172
|
clients=clients,
|
|
173
|
+
serialize_namespace=self.serialize_namespace,
|
|
162
174
|
)
|
|
163
175
|
|
|
164
176
|
def serialize_version_file(self) -> str:
|
|
@@ -181,7 +193,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
181
193
|
|
|
182
194
|
def serialize_cross_language_definition_file(self) -> str:
|
|
183
195
|
cross_langauge_def_dict = {
|
|
184
|
-
f"{
|
|
196
|
+
f"{model.client_namespace}.models.{model.name}": model.cross_language_definition_id
|
|
185
197
|
for model in self.code_model.public_model_types
|
|
186
198
|
}
|
|
187
199
|
cross_langauge_def_dict.update(
|
|
@@ -16,6 +16,7 @@ from ..models import (
|
|
|
16
16
|
CodeModel,
|
|
17
17
|
)
|
|
18
18
|
from .builder_serializer import get_operation_serializer
|
|
19
|
+
from .base_serializer import BaseSerializer
|
|
19
20
|
from .import_serializer import FileImportSerializer
|
|
20
21
|
|
|
21
22
|
|
|
@@ -104,11 +105,10 @@ def _mixin_typing_definitions(
|
|
|
104
105
|
return sync_mixin_typing_definitions, async_mixin_typing_definitions
|
|
105
106
|
|
|
106
107
|
|
|
107
|
-
class MetadataSerializer:
|
|
108
|
-
def __init__(self, code_model: CodeModel, env: Environment
|
|
109
|
-
|
|
108
|
+
class MetadataSerializer(BaseSerializer):
|
|
109
|
+
def __init__(self, code_model: CodeModel, env: Environment, *, client_namespace: Optional[str] = None):
|
|
110
|
+
super().__init__(code_model, env, client_namespace=client_namespace)
|
|
110
111
|
self.client = self.code_model.clients[0] # we only do one client for multiapi
|
|
111
|
-
self.env = env
|
|
112
112
|
|
|
113
113
|
def _choose_api_version(self) -> Tuple[str, List[str]]:
|
|
114
114
|
chosen_version = ""
|
|
@@ -161,6 +161,10 @@ class MetadataSerializer:
|
|
|
161
161
|
self.code_model.options["package_version"] = "0.1.0"
|
|
162
162
|
template = self.env.get_template("metadata.json.jinja2")
|
|
163
163
|
|
|
164
|
+
client_serialize_namespace = self.code_model.get_serialize_namespace(self.client_namespace, async_mode=False)
|
|
165
|
+
client_serialize_namespace_async = self.code_model.get_serialize_namespace(
|
|
166
|
+
self.client_namespace, async_mode=True
|
|
167
|
+
)
|
|
164
168
|
return template.render(
|
|
165
169
|
code_model=self.code_model,
|
|
166
170
|
chosen_version=chosen_version,
|
|
@@ -176,23 +180,37 @@ class MetadataSerializer:
|
|
|
176
180
|
async_mixin_imports=async_mixin_imports,
|
|
177
181
|
sync_mixin_typing_definitions=sync_mixin_typing_definitions,
|
|
178
182
|
async_mixin_typing_definitions=async_mixin_typing_definitions,
|
|
179
|
-
sync_client_imports=_json_serialize_imports(
|
|
180
|
-
|
|
183
|
+
sync_client_imports=_json_serialize_imports(
|
|
184
|
+
self.client.imports_for_multiapi(
|
|
185
|
+
async_mode=False, serialize_namespace=client_serialize_namespace
|
|
186
|
+
).to_dict()
|
|
187
|
+
),
|
|
188
|
+
async_client_imports=_json_serialize_imports(
|
|
189
|
+
self.client.imports_for_multiapi(
|
|
190
|
+
async_mode=True, serialize_namespace=client_serialize_namespace_async
|
|
191
|
+
).to_dict()
|
|
192
|
+
),
|
|
181
193
|
sync_config_imports=_json_serialize_imports(
|
|
182
|
-
self.client.config.imports_for_multiapi(
|
|
194
|
+
self.client.config.imports_for_multiapi(
|
|
195
|
+
async_mode=False, serialize_namespace=client_serialize_namespace
|
|
196
|
+
).to_dict()
|
|
183
197
|
),
|
|
184
198
|
async_config_imports=_json_serialize_imports(
|
|
185
|
-
self.client.config.imports_for_multiapi(
|
|
199
|
+
self.client.config.imports_for_multiapi(
|
|
200
|
+
async_mode=True, serialize_namespace=client_serialize_namespace_async
|
|
201
|
+
).to_dict()
|
|
186
202
|
),
|
|
187
203
|
get_async_operation_serializer=functools.partial(
|
|
188
204
|
get_operation_serializer,
|
|
189
205
|
code_model=self.client.code_model,
|
|
190
206
|
async_mode=True,
|
|
207
|
+
client_namespace=self.client_namespace,
|
|
191
208
|
),
|
|
192
209
|
get_sync_operation_serializer=functools.partial(
|
|
193
210
|
get_operation_serializer,
|
|
194
211
|
code_model=self.client.code_model,
|
|
195
212
|
async_mode=False,
|
|
213
|
+
client_namespace=self.client_namespace,
|
|
196
214
|
),
|
|
197
215
|
has_credential=bool(self.client.credential),
|
|
198
216
|
)
|
|
@@ -3,19 +3,24 @@
|
|
|
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
|
|
6
7
|
from jinja2 import Environment
|
|
7
|
-
from ..models import CodeModel
|
|
8
|
+
from ..models import CodeModel, ModelType, EnumType
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
class ModelInitSerializer:
|
|
11
|
-
def __init__(
|
|
12
|
+
def __init__(
|
|
13
|
+
self, code_model: CodeModel, env: Environment, *, models: List[ModelType], enums: List[EnumType]
|
|
14
|
+
) -> None:
|
|
12
15
|
self.code_model = code_model
|
|
13
16
|
self.env = env
|
|
17
|
+
self.models = models
|
|
18
|
+
self.enums = enums
|
|
14
19
|
|
|
15
20
|
def serialize(self) -> str:
|
|
16
|
-
schemas = [s.name for s in self.code_model.
|
|
21
|
+
schemas = [s.name for s in self.code_model.get_public_model_types(self.models)]
|
|
17
22
|
schemas.sort()
|
|
18
|
-
enums = [e.name for e in self.
|
|
23
|
+
enums = [e.name for e in self.enums if not e.internal] if self.enums else None
|
|
19
24
|
|
|
20
25
|
if enums:
|
|
21
26
|
enums.sort()
|