@typespec/http-client-python 0.5.1 → 0.6.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/dist/emitter/code-model.d.ts.map +1 -1
- package/dist/emitter/code-model.js +10 -7
- package/dist/emitter/code-model.js.map +1 -1
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +4 -1
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/lib.d.ts +1 -0
- package/dist/emitter/lib.d.ts.map +1 -1
- package/dist/emitter/lib.js +1 -0
- package/dist/emitter/lib.js.map +1 -1
- package/dist/emitter/types.d.ts.map +1 -1
- package/dist/emitter/types.js +7 -4
- package/dist/emitter/types.js.map +1 -1
- package/dist/emitter/utils.d.ts +1 -0
- package/dist/emitter/utils.d.ts.map +1 -1
- package/dist/emitter/utils.js +19 -0
- package/dist/emitter/utils.js.map +1 -1
- package/emitter/src/code-model.ts +16 -6
- package/emitter/src/emitter.ts +4 -1
- package/emitter/src/lib.ts +4 -0
- package/emitter/src/types.ts +16 -4
- package/emitter/src/utils.ts +27 -0
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate.ts +7 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
- package/generator/build/lib/pygen/black.py +2 -2
- 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 +200 -33
- package/generator/build/lib/pygen/codegen/models/combined_type.py +8 -5
- package/generator/build/lib/pygen/codegen/models/constant_type.py +2 -3
- package/generator/build/lib/pygen/codegen/models/credential_types.py +1 -2
- 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 +66 -29
- package/generator/build/lib/pygen/codegen/models/operation_group.py +56 -11
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +9 -6
- 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 +7 -7
- 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 +201 -242
- package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +19 -1
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +53 -35
- 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 +62 -22
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +19 -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/operations_folder_init.py.jinja2 +2 -4
- 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/dev_requirements.txt +2 -2
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/black.py +2 -2
- 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 +200 -33
- package/generator/pygen/codegen/models/combined_type.py +8 -5
- package/generator/pygen/codegen/models/constant_type.py +2 -3
- package/generator/pygen/codegen/models/credential_types.py +1 -2
- 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 +66 -29
- package/generator/pygen/codegen/models/operation_group.py +56 -11
- package/generator/pygen/codegen/models/paging_operation.py +9 -6
- 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 +7 -7
- 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 +201 -242
- package/generator/pygen/codegen/serializers/base_serializer.py +19 -1
- package/generator/pygen/codegen/serializers/builder_serializer.py +53 -35
- 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 +62 -22
- package/generator/pygen/codegen/serializers/operation_groups_serializer.py +19 -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/operations_folder_init.py.jinja2 +2 -4
- 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/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +31 -0
- package/generator/test/azure/mock_api_tests/test_client_namespace.py +29 -0
- package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven_async.py +1 -0
- package/generator/test/azure/requirements.txt +3 -2
- package/generator/test/azure/tox.ini +2 -2
- package/generator/test/unbranded/requirements.txt +2 -2
- package/generator/test/unbranded/tox.ini +2 -2
- package/package.json +1 -1
|
@@ -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 += [
|
|
@@ -616,13 +632,18 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
616
632
|
for p in builder.parameters.parameters:
|
|
617
633
|
if p.hide_in_operation_signature:
|
|
618
634
|
kwargs.append(f'{p.client_name} = kwargs.pop("{p.client_name}", None)')
|
|
619
|
-
cls_annotation = builder.cls_type_annotation(
|
|
635
|
+
cls_annotation = builder.cls_type_annotation(
|
|
636
|
+
async_mode=self.async_mode, serialize_namespace=self.serialize_namespace
|
|
637
|
+
)
|
|
620
638
|
kwargs.append(f"cls: {cls_annotation} = kwargs.pop(\n 'cls', None\n)")
|
|
621
639
|
return kwargs
|
|
622
640
|
|
|
623
641
|
def response_docstring(self, builder: OperationType) -> List[str]:
|
|
624
642
|
response_str = f":return: {builder.response_docstring_text(async_mode=self.async_mode)}"
|
|
625
|
-
|
|
643
|
+
response_docstring_type = builder.response_docstring_type(
|
|
644
|
+
async_mode=self.async_mode, serialize_namespace=self.serialize_namespace
|
|
645
|
+
)
|
|
646
|
+
rtype_str = f":rtype: {response_docstring_type}"
|
|
626
647
|
return [
|
|
627
648
|
response_str,
|
|
628
649
|
rtype_str,
|
|
@@ -670,9 +691,10 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
670
691
|
if self.code_model.options["models_mode"] == "msrest":
|
|
671
692
|
is_xml_cmd = _xml_config(send_xml, builder.parameters.body_parameter.content_types)
|
|
672
693
|
serialization_ctxt_cmd = f", {ser_ctxt_name}={ser_ctxt_name}" if xml_serialization_ctxt else ""
|
|
694
|
+
serialization_type = body_param.type.serialization_type(serialize_namespace=self.serialize_namespace)
|
|
673
695
|
create_body_call = (
|
|
674
696
|
f"_{body_kwarg_name} = self._serialize.body({body_param.client_name}, "
|
|
675
|
-
f"'{
|
|
697
|
+
f"'{serialization_type}'{is_xml_cmd}{serialization_ctxt_cmd})"
|
|
676
698
|
)
|
|
677
699
|
elif self.code_model.options["models_mode"] == "dpg":
|
|
678
700
|
if json_serializable(body_param.default_content_type):
|
|
@@ -903,7 +925,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
903
925
|
retval: List[str] = [
|
|
904
926
|
(
|
|
905
927
|
f"response_headers['{response_header.wire_name}']=self._deserialize("
|
|
906
|
-
f"'{response_header.serialization_type}', response.headers.get('{response_header.wire_name}'))"
|
|
928
|
+
f"'{response_header.serialization_type(serialize_namespace=self.serialize_namespace)}', response.headers.get('{response_header.wire_name}'))" # pylint: disable=line-too-long
|
|
907
929
|
)
|
|
908
930
|
for response_header in response.headers
|
|
909
931
|
]
|
|
@@ -911,7 +933,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
911
933
|
retval.append("")
|
|
912
934
|
return retval
|
|
913
935
|
|
|
914
|
-
def response_deserialization(
|
|
936
|
+
def response_deserialization( # pylint: disable=too-many-statements
|
|
915
937
|
self,
|
|
916
938
|
builder: OperationType,
|
|
917
939
|
response: Response,
|
|
@@ -937,7 +959,8 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
937
959
|
pylint_disable = " # pylint: disable=protected-access"
|
|
938
960
|
if self.code_model.options["models_mode"] == "msrest":
|
|
939
961
|
deserialize_code.append("deserialized = self._deserialize(")
|
|
940
|
-
|
|
962
|
+
serialization_type = response.serialization_type(serialize_namespace=self.serialize_namespace)
|
|
963
|
+
deserialize_code.append(f" '{serialization_type}',{pylint_disable}")
|
|
941
964
|
deserialize_code.append(" pipeline_response.http_response")
|
|
942
965
|
deserialize_code.append(")")
|
|
943
966
|
elif self.code_model.options["models_mode"] == "dpg":
|
|
@@ -955,9 +978,10 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
955
978
|
if xml_serializable(str(response.default_content_type)):
|
|
956
979
|
deserialize_func = "_deserialize_xml"
|
|
957
980
|
deserialize_code.append(f"deserialized = {deserialize_func}(")
|
|
958
|
-
|
|
959
|
-
|
|
981
|
+
type_annotation = response.type.type_annotation(
|
|
982
|
+
is_operation_file=True, serialize_namespace=self.serialize_namespace
|
|
960
983
|
)
|
|
984
|
+
deserialize_code.append(f" {type_annotation},{pylint_disable}")
|
|
961
985
|
deserialize_code.append(f" response.{response_attr}(){response.result_property}{format_filed}")
|
|
962
986
|
deserialize_code.append(")")
|
|
963
987
|
|
|
@@ -1002,11 +1026,14 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
1002
1026
|
if isinstance(e.status_codes[0], int):
|
|
1003
1027
|
for status_code in e.status_codes:
|
|
1004
1028
|
retval.append(f" {condition} response.status_code == {status_code}:")
|
|
1029
|
+
type_annotation = e.type.type_annotation( # type: ignore
|
|
1030
|
+
is_operation_file=True, skip_quote=True, serialize_namespace=self.serialize_namespace
|
|
1031
|
+
)
|
|
1005
1032
|
if self.code_model.options["models_mode"] == "dpg":
|
|
1006
|
-
retval.append(f" error = _failsafe_deserialize({
|
|
1033
|
+
retval.append(f" error = _failsafe_deserialize({type_annotation}, response.json())")
|
|
1007
1034
|
else:
|
|
1008
1035
|
retval.append(
|
|
1009
|
-
f" error = self._deserialize.failsafe_deserialize({
|
|
1036
|
+
f" error = self._deserialize.failsafe_deserialize({type_annotation}, "
|
|
1010
1037
|
"pipeline_response)"
|
|
1011
1038
|
)
|
|
1012
1039
|
# add build-in error type
|
|
@@ -1044,11 +1071,14 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
|
|
|
1044
1071
|
retval.append(
|
|
1045
1072
|
f" {condition} {e.status_codes[0][0]} <= response.status_code <= {e.status_codes[0][1]}:"
|
|
1046
1073
|
)
|
|
1074
|
+
type_annotation = e.type.type_annotation( # type: ignore
|
|
1075
|
+
is_operation_file=True, skip_quote=True, serialize_namespace=self.serialize_namespace
|
|
1076
|
+
)
|
|
1047
1077
|
if self.code_model.options["models_mode"] == "dpg":
|
|
1048
|
-
retval.append(f" error = _failsafe_deserialize({
|
|
1078
|
+
retval.append(f" error = _failsafe_deserialize({type_annotation}, response.json())")
|
|
1049
1079
|
else:
|
|
1050
1080
|
retval.append(
|
|
1051
|
-
f" error = self._deserialize.failsafe_deserialize({
|
|
1081
|
+
f" error = self._deserialize.failsafe_deserialize({type_annotation}, "
|
|
1052
1082
|
"pipeline_response)"
|
|
1053
1083
|
)
|
|
1054
1084
|
condition = "elif"
|
|
@@ -1198,13 +1228,6 @@ PagingOperationType = TypeVar("PagingOperationType", bound=Union[PagingOperation
|
|
|
1198
1228
|
|
|
1199
1229
|
|
|
1200
1230
|
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
1231
|
|
|
1209
1232
|
def serialize_path(self, builder: PagingOperationType) -> List[str]:
|
|
1210
1233
|
return self.parameter_serializer.serialize_path(builder.parameters.path, self.serializer_name)
|
|
@@ -1294,10 +1317,10 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
|
|
|
1294
1317
|
deserialized = "pipeline_response.http_response.json()"
|
|
1295
1318
|
if self.code_model.options["models_mode"] == "msrest":
|
|
1296
1319
|
suffix = ".http_response" if hasattr(builder, "initial_operation") else ""
|
|
1297
|
-
deserialize_type = response.serialization_type
|
|
1320
|
+
deserialize_type = response.serialization_type(serialize_namespace=self.serialize_namespace)
|
|
1298
1321
|
pylint_disable = " # pylint: disable=protected-access"
|
|
1299
1322
|
if isinstance(response.type, ModelType) and not response.type.internal:
|
|
1300
|
-
deserialize_type = f'"{response.serialization_type}"'
|
|
1323
|
+
deserialize_type = f'"{response.serialization_type(serialize_namespace=self.serialize_namespace)}"'
|
|
1301
1324
|
pylint_disable = ""
|
|
1302
1325
|
deserialized = (
|
|
1303
1326
|
f"self._deserialize(\n {deserialize_type},{pylint_disable}\n pipeline_response{suffix}\n)"
|
|
@@ -1312,7 +1335,9 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
|
|
|
1312
1335
|
access = f".{item_name}" if self.code_model.options["models_mode"] == "msrest" else f'["{item_name}"]'
|
|
1313
1336
|
list_of_elem_deserialized = ""
|
|
1314
1337
|
if self.code_model.options["models_mode"] == "dpg":
|
|
1315
|
-
item_type = builder.item_type.type_annotation(
|
|
1338
|
+
item_type = builder.item_type.type_annotation(
|
|
1339
|
+
is_operation_file=True, serialize_namespace=self.serialize_namespace
|
|
1340
|
+
)
|
|
1316
1341
|
list_of_elem_deserialized = f"_deserialize({item_type}, deserialized{access})"
|
|
1317
1342
|
else:
|
|
1318
1343
|
list_of_elem_deserialized = f"deserialized{access}"
|
|
@@ -1363,14 +1388,6 @@ LROOperationType = TypeVar("LROOperationType", bound=Union[LROOperation, LROPagi
|
|
|
1363
1388
|
|
|
1364
1389
|
|
|
1365
1390
|
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
1391
|
def serialize_path(self, builder: LROOperationType) -> List[str]:
|
|
1375
1392
|
return self.parameter_serializer.serialize_path(builder.parameters.path, self.serializer_name)
|
|
1376
1393
|
|
|
@@ -1512,6 +1529,7 @@ def get_operation_serializer(
|
|
|
1512
1529
|
builder: Operation,
|
|
1513
1530
|
code_model,
|
|
1514
1531
|
async_mode: bool,
|
|
1532
|
+
client_namespace: str,
|
|
1515
1533
|
) -> Union[
|
|
1516
1534
|
OperationSerializer,
|
|
1517
1535
|
PagingOperationSerializer,
|
|
@@ -1530,4 +1548,4 @@ def get_operation_serializer(
|
|
|
1530
1548
|
ret_cls = LROOperationSerializer
|
|
1531
1549
|
elif builder.operation_type == "paging":
|
|
1532
1550
|
ret_cls = PagingOperationSerializer
|
|
1533
|
-
return ret_cls(code_model, async_mode)
|
|
1551
|
+
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()
|