@typespec/http-client-python 0.5.1 → 0.6.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.
Files changed (146) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +10 -7
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/emitter.d.ts.map +1 -1
  5. package/dist/emitter/emitter.js +4 -1
  6. package/dist/emitter/emitter.js.map +1 -1
  7. package/dist/emitter/lib.d.ts +1 -0
  8. package/dist/emitter/lib.d.ts.map +1 -1
  9. package/dist/emitter/lib.js +1 -0
  10. package/dist/emitter/lib.js.map +1 -1
  11. package/dist/emitter/types.d.ts.map +1 -1
  12. package/dist/emitter/types.js +7 -4
  13. package/dist/emitter/types.js.map +1 -1
  14. package/dist/emitter/utils.d.ts +1 -0
  15. package/dist/emitter/utils.d.ts.map +1 -1
  16. package/dist/emitter/utils.js +19 -0
  17. package/dist/emitter/utils.js.map +1 -1
  18. package/emitter/src/code-model.ts +16 -6
  19. package/emitter/src/emitter.ts +4 -1
  20. package/emitter/src/lib.ts +4 -0
  21. package/emitter/src/types.ts +16 -4
  22. package/emitter/src/utils.ts +27 -0
  23. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  24. package/eng/scripts/ci/regenerate.ts +7 -0
  25. package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
  26. package/generator/build/lib/pygen/black.py +2 -2
  27. package/generator/build/lib/pygen/codegen/__init__.py +2 -0
  28. package/generator/build/lib/pygen/codegen/_utils.py +4 -0
  29. package/generator/build/lib/pygen/codegen/models/base.py +2 -3
  30. package/generator/build/lib/pygen/codegen/models/base_builder.py +5 -3
  31. package/generator/build/lib/pygen/codegen/models/client.py +28 -19
  32. package/generator/build/lib/pygen/codegen/models/code_model.py +200 -33
  33. package/generator/build/lib/pygen/codegen/models/combined_type.py +8 -5
  34. package/generator/build/lib/pygen/codegen/models/constant_type.py +2 -3
  35. package/generator/build/lib/pygen/codegen/models/credential_types.py +2 -3
  36. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +2 -3
  37. package/generator/build/lib/pygen/codegen/models/enum_type.py +47 -24
  38. package/generator/build/lib/pygen/codegen/models/imports.py +14 -12
  39. package/generator/build/lib/pygen/codegen/models/list_type.py +2 -3
  40. package/generator/build/lib/pygen/codegen/models/lro_operation.py +8 -4
  41. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
  42. package/generator/build/lib/pygen/codegen/models/model_type.py +34 -19
  43. package/generator/build/lib/pygen/codegen/models/operation.py +66 -29
  44. package/generator/build/lib/pygen/codegen/models/operation_group.py +56 -11
  45. package/generator/build/lib/pygen/codegen/models/paging_operation.py +9 -6
  46. package/generator/build/lib/pygen/codegen/models/parameter.py +10 -10
  47. package/generator/build/lib/pygen/codegen/models/parameter_list.py +7 -7
  48. package/generator/build/lib/pygen/codegen/models/primitive_types.py +23 -43
  49. package/generator/build/lib/pygen/codegen/models/property.py +7 -7
  50. package/generator/build/lib/pygen/codegen/models/request_builder.py +9 -15
  51. package/generator/build/lib/pygen/codegen/models/response.py +6 -8
  52. package/generator/build/lib/pygen/codegen/models/utils.py +11 -0
  53. package/generator/build/lib/pygen/codegen/serializers/__init__.py +201 -242
  54. package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +19 -1
  55. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +53 -35
  56. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +9 -5
  57. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +17 -3
  58. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +26 -14
  59. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +26 -8
  60. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +9 -4
  61. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +63 -23
  62. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
  63. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  64. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +10 -7
  65. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  66. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +7 -10
  67. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +24 -28
  68. package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +6 -1
  69. package/generator/build/lib/pygen/codegen/serializers/utils.py +1 -15
  70. package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  71. package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  72. package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  73. package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +1 -1
  74. package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  75. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  76. package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +3 -3
  77. package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  78. package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  79. package/generator/build/lib/pygen/preprocess/__init__.py +0 -4
  80. package/generator/component-detection-pip-report.json +2 -2
  81. package/generator/dev_requirements.txt +2 -2
  82. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  83. package/generator/pygen/black.py +2 -2
  84. package/generator/pygen/codegen/__init__.py +2 -0
  85. package/generator/pygen/codegen/_utils.py +4 -0
  86. package/generator/pygen/codegen/models/base.py +2 -3
  87. package/generator/pygen/codegen/models/base_builder.py +5 -3
  88. package/generator/pygen/codegen/models/client.py +28 -19
  89. package/generator/pygen/codegen/models/code_model.py +200 -33
  90. package/generator/pygen/codegen/models/combined_type.py +8 -5
  91. package/generator/pygen/codegen/models/constant_type.py +2 -3
  92. package/generator/pygen/codegen/models/credential_types.py +2 -3
  93. package/generator/pygen/codegen/models/dictionary_type.py +2 -3
  94. package/generator/pygen/codegen/models/enum_type.py +47 -24
  95. package/generator/pygen/codegen/models/imports.py +14 -12
  96. package/generator/pygen/codegen/models/list_type.py +2 -3
  97. package/generator/pygen/codegen/models/lro_operation.py +8 -4
  98. package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
  99. package/generator/pygen/codegen/models/model_type.py +34 -19
  100. package/generator/pygen/codegen/models/operation.py +66 -29
  101. package/generator/pygen/codegen/models/operation_group.py +56 -11
  102. package/generator/pygen/codegen/models/paging_operation.py +9 -6
  103. package/generator/pygen/codegen/models/parameter.py +10 -10
  104. package/generator/pygen/codegen/models/parameter_list.py +7 -7
  105. package/generator/pygen/codegen/models/primitive_types.py +23 -43
  106. package/generator/pygen/codegen/models/property.py +7 -7
  107. package/generator/pygen/codegen/models/request_builder.py +9 -15
  108. package/generator/pygen/codegen/models/response.py +6 -8
  109. package/generator/pygen/codegen/models/utils.py +11 -0
  110. package/generator/pygen/codegen/serializers/__init__.py +201 -242
  111. package/generator/pygen/codegen/serializers/base_serializer.py +19 -1
  112. package/generator/pygen/codegen/serializers/builder_serializer.py +53 -35
  113. package/generator/pygen/codegen/serializers/client_serializer.py +9 -5
  114. package/generator/pygen/codegen/serializers/enum_serializer.py +17 -3
  115. package/generator/pygen/codegen/serializers/general_serializer.py +26 -14
  116. package/generator/pygen/codegen/serializers/metadata_serializer.py +26 -8
  117. package/generator/pygen/codegen/serializers/model_init_serializer.py +9 -4
  118. package/generator/pygen/codegen/serializers/model_serializer.py +63 -23
  119. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
  120. package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  121. package/generator/pygen/codegen/serializers/parameter_serializer.py +10 -7
  122. package/generator/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  123. package/generator/pygen/codegen/serializers/sample_serializer.py +7 -10
  124. package/generator/pygen/codegen/serializers/test_serializer.py +24 -28
  125. package/generator/pygen/codegen/serializers/types_serializer.py +6 -1
  126. package/generator/pygen/codegen/serializers/utils.py +1 -15
  127. package/generator/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  128. package/generator/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  129. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  130. package/generator/pygen/codegen/templates/init.py.jinja2 +1 -1
  131. package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  132. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  133. package/generator/pygen/codegen/templates/test.py.jinja2 +3 -3
  134. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  135. package/generator/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  136. package/generator/pygen/preprocess/__init__.py +0 -4
  137. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +1 -1
  138. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +31 -0
  139. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +1 -1
  140. package/generator/test/azure/mock_api_tests/test_client_namespace.py +29 -0
  141. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven_async.py +1 -0
  142. package/generator/test/azure/requirements.txt +3 -2
  143. package/generator/test/azure/tox.ini +2 -2
  144. package/generator/test/unbranded/requirements.txt +2 -2
  145. package/generator/test/unbranded/tox.ini +2 -2
  146. 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.parameter_serializer = ParameterSerializer()
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(self.async_mode),
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(async_mode=self.async_mode)
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(async_mode=self.async_mode)
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
- rtype_str = f":rtype: {builder.response_docstring_type(async_mode=self.async_mode)}"
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"'{body_param.type.serialization_type}'{is_xml_cmd}{serialization_ctxt_cmd})"
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
- deserialize_code.append(f" '{response.serialization_type}',{pylint_disable}")
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
- deserialize_code.append(
959
- f" {response.type.type_annotation(is_operation_file=True)},{pylint_disable}"
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({e.type.type_annotation(is_operation_file=True, skip_quote=True)}, response.json())") # type: ignore # pylint: disable=line-too-long
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({e.type.type_annotation(is_operation_file=True, skip_quote=True)}, " # type: ignore # pylint: disable=line-too-long
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({e.type.type_annotation(is_operation_file=True, skip_quote=True)}, response.json())") # type: ignore # pylint: disable=line-too-long
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({e.type.type_annotation(is_operation_file=True, skip_quote=True)}, " # type: ignore # pylint: disable=line-too-long
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(is_operation_file=True)
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(async_mode),
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(client.imports(self.async_mode))
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, clients: List[Client]) -> str:
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.need_mixin_abc:
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
- relative_path=".." if self.async_mode else ".",
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.has_etag:
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.has_form_data and self.code_model.options["models_mode"] == "dpg" and not self.async_mode:
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(client.config.imports(self.async_mode))
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"{self.code_model.namespace}.models.{model.name}": model.cross_language_definition_id
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) -> None:
109
- self.code_model = code_model
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(self.client.imports_for_multiapi(async_mode=False).to_dict()),
180
- async_client_imports=_json_serialize_imports(self.client.imports_for_multiapi(async_mode=True).to_dict()),
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(async_mode=False).to_dict()
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(async_mode=True).to_dict()
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__(self, code_model: CodeModel, env: Environment) -> None:
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.public_model_types]
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.code_model.enums if not e.internal] if self.code_model.enums else None
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()