@typespec/http-client-python 0.13.0-dev.2 → 0.13.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.
Files changed (110) hide show
  1. package/eng/scripts/setup/__pycache__/package_manager.cpython-39.pyc +0 -0
  2. package/eng/scripts/setup/__pycache__/venvtools.cpython-39.pyc +0 -0
  3. package/eng/scripts/setup/build_pygen_wheel.py +1 -0
  4. package/eng/scripts/setup/install.py +4 -2
  5. package/eng/scripts/setup/package_manager.py +24 -22
  6. package/eng/scripts/setup/prepare.py +1 -1
  7. package/eng/scripts/setup/venvtools.py +1 -3
  8. package/generator/build/lib/pygen/__init__.py +176 -2
  9. package/generator/build/lib/pygen/black.py +1 -1
  10. package/generator/build/lib/pygen/codegen/__init__.py +4 -256
  11. package/generator/build/lib/pygen/codegen/_utils.py +0 -3
  12. package/generator/build/lib/pygen/codegen/models/__init__.py +1 -1
  13. package/generator/build/lib/pygen/codegen/models/base_builder.py +1 -1
  14. package/generator/build/lib/pygen/codegen/models/client.py +15 -13
  15. package/generator/build/lib/pygen/codegen/models/code_model.py +10 -9
  16. package/generator/build/lib/pygen/codegen/models/enum_type.py +4 -4
  17. package/generator/build/lib/pygen/codegen/models/imports.py +1 -1
  18. package/generator/build/lib/pygen/codegen/models/list_type.py +6 -6
  19. package/generator/build/lib/pygen/codegen/models/lro_operation.py +1 -1
  20. package/generator/build/lib/pygen/codegen/models/operation.py +16 -16
  21. package/generator/build/lib/pygen/codegen/models/operation_group.py +12 -6
  22. package/generator/build/lib/pygen/codegen/models/paging_operation.py +4 -4
  23. package/generator/build/lib/pygen/codegen/models/parameter.py +8 -8
  24. package/generator/build/lib/pygen/codegen/models/property.py +1 -1
  25. package/generator/build/lib/pygen/codegen/models/request_builder.py +2 -2
  26. package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +2 -2
  27. package/generator/build/lib/pygen/codegen/models/response.py +3 -3
  28. package/generator/build/lib/pygen/codegen/serializers/__init__.py +27 -28
  29. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +31 -31
  30. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +6 -5
  31. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +4 -4
  32. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +1 -1
  33. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +1 -1
  34. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +6 -2
  35. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +1 -1
  36. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +5 -5
  37. package/generator/build/lib/pygen/codegen/templates/config.py.jinja2 +1 -1
  38. package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  39. package/generator/build/lib/pygen/codegen/templates/conftest.py.jinja2 +1 -1
  40. package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +1 -1
  41. package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +2 -2
  42. package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +2 -2
  43. package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +1 -1
  44. package/generator/build/lib/pygen/codegen/templates/operation_groups_container.py.jinja2 +1 -1
  45. package/generator/build/lib/pygen/codegen/templates/operation_tools.jinja2 +1 -1
  46. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -0
  47. package/generator/build/lib/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +1 -1
  48. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +38 -7
  49. package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  50. package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +9 -9
  51. package/generator/build/lib/pygen/codegen/templates/request_builder.py.jinja2 +1 -1
  52. package/generator/build/lib/pygen/codegen/templates/sample.py.jinja2 +1 -1
  53. package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +6 -6
  54. package/generator/build/lib/pygen/codegen/templates/version.py.jinja2 +1 -1
  55. package/generator/build/lib/pygen/preprocess/__init__.py +1 -1
  56. package/generator/build/lib/pygen/utils.py +4 -0
  57. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  58. package/generator/pygen/__init__.py +176 -2
  59. package/generator/pygen/black.py +1 -1
  60. package/generator/pygen/codegen/__init__.py +4 -256
  61. package/generator/pygen/codegen/_utils.py +0 -3
  62. package/generator/pygen/codegen/models/__init__.py +1 -1
  63. package/generator/pygen/codegen/models/base_builder.py +1 -1
  64. package/generator/pygen/codegen/models/client.py +15 -13
  65. package/generator/pygen/codegen/models/code_model.py +10 -9
  66. package/generator/pygen/codegen/models/enum_type.py +4 -4
  67. package/generator/pygen/codegen/models/imports.py +1 -1
  68. package/generator/pygen/codegen/models/list_type.py +6 -6
  69. package/generator/pygen/codegen/models/lro_operation.py +1 -1
  70. package/generator/pygen/codegen/models/operation.py +16 -16
  71. package/generator/pygen/codegen/models/operation_group.py +12 -6
  72. package/generator/pygen/codegen/models/paging_operation.py +4 -4
  73. package/generator/pygen/codegen/models/parameter.py +8 -8
  74. package/generator/pygen/codegen/models/property.py +1 -1
  75. package/generator/pygen/codegen/models/request_builder.py +2 -2
  76. package/generator/pygen/codegen/models/request_builder_parameter.py +2 -2
  77. package/generator/pygen/codegen/models/response.py +3 -3
  78. package/generator/pygen/codegen/serializers/__init__.py +27 -28
  79. package/generator/pygen/codegen/serializers/builder_serializer.py +31 -31
  80. package/generator/pygen/codegen/serializers/client_serializer.py +6 -5
  81. package/generator/pygen/codegen/serializers/general_serializer.py +4 -4
  82. package/generator/pygen/codegen/serializers/metadata_serializer.py +1 -1
  83. package/generator/pygen/codegen/serializers/model_serializer.py +1 -1
  84. package/generator/pygen/codegen/serializers/operations_init_serializer.py +6 -2
  85. package/generator/pygen/codegen/serializers/sample_serializer.py +1 -1
  86. package/generator/pygen/codegen/serializers/test_serializer.py +5 -5
  87. package/generator/pygen/codegen/templates/config.py.jinja2 +1 -1
  88. package/generator/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  89. package/generator/pygen/codegen/templates/conftest.py.jinja2 +1 -1
  90. package/generator/pygen/codegen/templates/init.py.jinja2 +1 -1
  91. package/generator/pygen/codegen/templates/metadata.json.jinja2 +2 -2
  92. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +2 -2
  93. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +1 -1
  94. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +1 -1
  95. package/generator/pygen/codegen/templates/operation_tools.jinja2 +1 -1
  96. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -0
  97. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +1 -1
  98. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +38 -7
  99. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  100. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +9 -9
  101. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +1 -1
  102. package/generator/pygen/codegen/templates/sample.py.jinja2 +1 -1
  103. package/generator/pygen/codegen/templates/test.py.jinja2 +6 -6
  104. package/generator/pygen/codegen/templates/version.py.jinja2 +1 -1
  105. package/generator/pygen/preprocess/__init__.py +1 -1
  106. package/generator/pygen/utils.py +4 -0
  107. package/generator/test/unittests/test_optional_return_type.py +5 -5
  108. package/generator/test/unittests/test_parameter_ordering.py +5 -5
  109. package/generator/test/unittests/test_sort_schema.py +4 -4
  110. package/package.json +1 -1
@@ -326,7 +326,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]):
326
326
 
327
327
  if (
328
328
  isinstance(body_param.type, (ListType, DictionaryType))
329
- and self.code_model.options["models_mode"] == "msrest"
329
+ and self.code_model.options["models-mode"] == "msrest"
330
330
  ):
331
331
  return template
332
332
 
@@ -351,7 +351,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]):
351
351
  )
352
352
  for idx in range(
353
353
  min(
354
- self.code_model.options["polymorphic_examples"],
354
+ self.code_model.options["polymorphic-examples"],
355
355
  len(polymorphic_subtypes),
356
356
  )
357
357
  ):
@@ -494,7 +494,7 @@ class RequestBuilderSerializer(_BuilderBaseSerializer[RequestBuilderType]):
494
494
  return retval
495
495
 
496
496
  def construct_url(self, builder: RequestBuilderType) -> str:
497
- if any(o for o in ["low_level_client", "version_tolerant"] if self.code_model.options.get(o)):
497
+ if any(o for o in ["low-level-client", "version-tolerant"] if self.code_model.options.get(o)):
498
498
  url_value = _escape_str(builder.url)
499
499
  else:
500
500
  url_value = f'kwargs.pop("template_url", {_escape_str(builder.url)})'
@@ -522,7 +522,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
522
522
  return "response"
523
523
 
524
524
  def example_template(self, builder: OperationType) -> List[str]:
525
- if self.code_model.options["models_mode"] in ("msrest", "dpg"):
525
+ if self.code_model.options["models-mode"] in ("msrest", "dpg"):
526
526
  return []
527
527
  retval = super().example_template(builder)
528
528
  for response in builder.responses:
@@ -540,7 +540,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
540
540
  )
541
541
  for idx in range(
542
542
  min(
543
- self.code_model.options["polymorphic_examples"],
543
+ self.code_model.options["polymorphic-examples"],
544
544
  len(polymorphic_subtypes),
545
545
  )
546
546
  ):
@@ -559,7 +559,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
559
559
  def make_pipeline_call(self, builder: OperationType) -> List[str]:
560
560
  retval = []
561
561
  type_ignore = self.async_mode and builder.group_name == "" # is in a mixin
562
- if builder.stream_value is True and not self.code_model.options["version_tolerant"]:
562
+ if builder.stream_value is True and not self.code_model.options["version-tolerant"]:
563
563
  retval.append("_decompress = kwargs.pop('decompress', True)")
564
564
  pylint_disable = " # pylint: disable=protected-access" if self.code_model.is_azure_flavor else ""
565
565
  retval.extend(
@@ -688,9 +688,9 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
688
688
  send_xml = builder.parameters.body_parameter.type.is_xml
689
689
  xml_serialization_ctxt = body_param.type.xml_serialization_ctxt if send_xml else None
690
690
  ser_ctxt_name = "serialization_ctxt"
691
- if xml_serialization_ctxt and self.code_model.options["models_mode"]:
691
+ if xml_serialization_ctxt and self.code_model.options["models-mode"]:
692
692
  retval.append(f'{ser_ctxt_name} = {{"xml": {{{xml_serialization_ctxt}}}}}')
693
- if self.code_model.options["models_mode"] == "msrest":
693
+ if self.code_model.options["models-mode"] == "msrest":
694
694
  is_xml_cmd = _xml_config(send_xml, builder.parameters.body_parameter.content_types)
695
695
  serialization_ctxt_cmd = f", {ser_ctxt_name}={ser_ctxt_name}" if xml_serialization_ctxt else ""
696
696
  serialization_type = body_param.type.serialization_type(serialize_namespace=self.serialize_namespace)
@@ -698,7 +698,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
698
698
  f"_{body_kwarg_name} = self._serialize.body({body_param.client_name}, "
699
699
  f"'{serialization_type}'{is_xml_cmd}{serialization_ctxt_cmd})"
700
700
  )
701
- elif self.code_model.options["models_mode"] == "dpg":
701
+ elif self.code_model.options["models-mode"] == "dpg":
702
702
  if json_serializable(body_param.default_content_type):
703
703
  if hasattr(body_param.type, "encode") and body_param.type.encode: # type: ignore
704
704
  create_body_call = (
@@ -812,7 +812,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
812
812
  is_next_request: bool = False,
813
813
  ) -> List[str]:
814
814
  retval: List[str] = []
815
- if self.code_model.options["builders_visibility"] == "embedded":
815
+ if self.code_model.options["builders-visibility"] == "embedded":
816
816
  request_path_name = request_builder.name
817
817
  else:
818
818
  group_name = request_builder.group_name
@@ -873,7 +873,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
873
873
  if builder.parameters.path:
874
874
  retval.extend(self.serialize_path(builder))
875
875
  url_to_format = "_request.url"
876
- if self.code_model.options["version_tolerant"] and template_url:
876
+ if self.code_model.options["version-tolerant"] and template_url:
877
877
  url_to_format = template_url
878
878
  retval.append(
879
879
  "_request.url = self._client.format_url({}{})".format(
@@ -948,7 +948,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
948
948
  deserialized = f"{'await ' if self.async_mode else ''}response.read()"
949
949
  else:
950
950
  stream_logic = False
951
- if self.code_model.options["version_tolerant"]:
951
+ if self.code_model.options["version-tolerant"]:
952
952
  deserialized = "response.iter_bytes()"
953
953
  else:
954
954
  deserialized = (
@@ -959,13 +959,13 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
959
959
  pylint_disable = ""
960
960
  if isinstance(response.type, ModelType) and response.type.internal:
961
961
  pylint_disable = " # pylint: disable=protected-access"
962
- if self.code_model.options["models_mode"] == "msrest":
962
+ if self.code_model.options["models-mode"] == "msrest":
963
963
  deserialize_code.append("deserialized = self._deserialize(")
964
964
  serialization_type = response.serialization_type(serialize_namespace=self.serialize_namespace)
965
965
  deserialize_code.append(f" '{serialization_type}',{pylint_disable}")
966
966
  deserialize_code.append(" pipeline_response.http_response")
967
967
  deserialize_code.append(")")
968
- elif self.code_model.options["models_mode"] == "dpg":
968
+ elif self.code_model.options["models-mode"] == "dpg":
969
969
  if builder.has_stream_response:
970
970
  deserialize_code.append("deserialized = response.content")
971
971
  else:
@@ -1019,7 +1019,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1019
1019
  retval.extend([f" {l}" for l in response_read])
1020
1020
  retval.append(" map_error(status_code=response.status_code, response=response, error_map=error_map)")
1021
1021
  error_model = ""
1022
- if builder.non_default_errors and self.code_model.options["models_mode"]:
1022
+ if builder.non_default_errors and self.code_model.options["models-mode"]:
1023
1023
  error_model = ", model=error"
1024
1024
  condition = "if"
1025
1025
  retval.append(" error = None")
@@ -1031,7 +1031,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1031
1031
  type_annotation = e.type.type_annotation( # type: ignore
1032
1032
  is_operation_file=True, skip_quote=True, serialize_namespace=self.serialize_namespace
1033
1033
  )
1034
- if self.code_model.options["models_mode"] == "dpg":
1034
+ if self.code_model.options["models-mode"] == "dpg":
1035
1035
  retval.append(f" error = _failsafe_deserialize({type_annotation}, response.json())")
1036
1036
  else:
1037
1037
  retval.append(
@@ -1051,7 +1051,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1051
1051
  " raise {}(response=response{}{})".format(
1052
1052
  status_code_error_map[cast(int, status_code)],
1053
1053
  error_model,
1054
- (", error_format=ARMErrorFormat" if self.code_model.options["azure_arm"] else ""),
1054
+ (", error_format=ARMErrorFormat" if self.code_model.options["azure-arm"] else ""),
1055
1055
  )
1056
1056
  )
1057
1057
  condition = "if"
@@ -1065,7 +1065,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1065
1065
  type_annotation = e.type.type_annotation( # type: ignore
1066
1066
  is_operation_file=True, skip_quote=True, serialize_namespace=self.serialize_namespace
1067
1067
  )
1068
- if self.code_model.options["models_mode"] == "dpg":
1068
+ if self.code_model.options["models-mode"] == "dpg":
1069
1069
  if xml_serializable(str(e.default_content_type)):
1070
1070
  retval.append(
1071
1071
  f" error = _failsafe_deserialize_xml({type_annotation}, response.text())"
@@ -1079,12 +1079,12 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1079
1079
  )
1080
1080
  condition = "elif"
1081
1081
  # default error handling
1082
- if builder.default_error_deserialization and self.code_model.options["models_mode"]:
1082
+ if builder.default_error_deserialization and self.code_model.options["models-mode"]:
1083
1083
  error_model = ", model=error"
1084
1084
  indent = " " if builder.non_default_errors else " "
1085
1085
  if builder.non_default_errors:
1086
1086
  retval.append(" else:")
1087
- if self.code_model.options["models_mode"] == "dpg":
1087
+ if self.code_model.options["models-mode"] == "dpg":
1088
1088
  retval.append(
1089
1089
  f"{indent}error = _failsafe_deserialize({builder.default_error_deserialization}, response.json())"
1090
1090
  )
@@ -1096,7 +1096,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1096
1096
  retval.append(
1097
1097
  " raise HttpResponseError(response=response{}{})".format(
1098
1098
  error_model,
1099
- (", error_format=ARMErrorFormat" if self.code_model.options["azure_arm"] else ""),
1099
+ (", error_format=ARMErrorFormat" if self.code_model.options["azure-arm"] else ""),
1100
1100
  )
1101
1101
  )
1102
1102
  return retval
@@ -1144,7 +1144,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1144
1144
  else:
1145
1145
  retval.extend(self.response_headers_and_deserialization(builder, builder.responses[0]))
1146
1146
  retval.append("")
1147
- if builder.has_optional_return_type or self.code_model.options["models_mode"]:
1147
+ if builder.has_optional_return_type or self.code_model.options["models-mode"]:
1148
1148
  deserialized = "deserialized"
1149
1149
  else:
1150
1150
  deserialized = f"cast({builder.response_type_annotation(async_mode=self.async_mode)}, deserialized)"
@@ -1161,7 +1161,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1161
1161
  ):
1162
1162
  retval.append("")
1163
1163
  retval.append(f"return {deserialized} # type: ignore")
1164
- if builder.request_builder.method == "HEAD" and self.code_model.options["head_as_boolean"]:
1164
+ if builder.request_builder.method == "HEAD" and self.code_model.options["head-as-boolean"]:
1165
1165
  retval.append("return 200 <= response.status_code <= 299")
1166
1166
  return retval
1167
1167
 
@@ -1180,7 +1180,7 @@ class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
1180
1180
 
1181
1181
  def error_map(self, builder: OperationType) -> List[str]:
1182
1182
  retval = ["error_map: MutableMapping = {"]
1183
- if builder.non_default_errors and self.code_model.options["models_mode"]:
1183
+ if builder.non_default_errors and self.code_model.options["models-mode"]:
1184
1184
  # TODO: we should decide whether to add the build-in error map when there is a customized default error type
1185
1185
  if self._need_specific_error_map(401, builder):
1186
1186
  retval.append(" 401: ClientAuthenticationError,")
@@ -1326,7 +1326,7 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
1326
1326
  retval = [f"{'async ' if self.async_mode else ''}def extract_data(pipeline_response):"]
1327
1327
  response = builder.responses[0]
1328
1328
  deserialized = "pipeline_response.http_response.json()"
1329
- if self.code_model.options["models_mode"] == "msrest":
1329
+ if self.code_model.options["models-mode"] == "msrest":
1330
1330
  suffix = ".http_response" if hasattr(builder, "initial_operation") else ""
1331
1331
  deserialize_type = response.serialization_type(serialize_namespace=self.serialize_namespace)
1332
1332
  pylint_disable = " # pylint: disable=protected-access"
@@ -1337,13 +1337,13 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
1337
1337
  f"self._deserialize(\n {deserialize_type},{pylint_disable}\n pipeline_response{suffix}\n)"
1338
1338
  )
1339
1339
  retval.append(f" deserialized = {deserialized}")
1340
- elif self.code_model.options["models_mode"] == "dpg":
1340
+ elif self.code_model.options["models-mode"] == "dpg":
1341
1341
  # we don't want to generate paging models for DPG
1342
1342
  retval.append(f" deserialized = {deserialized}")
1343
1343
  else:
1344
1344
  retval.append(f" deserialized = {deserialized}")
1345
1345
  item_name = builder.item_name
1346
- if self.code_model.options["models_mode"] == "msrest":
1346
+ if self.code_model.options["models-mode"] == "msrest":
1347
1347
  access = f".{item_name}"
1348
1348
  else:
1349
1349
  item_name_array = item_name.split(".")
@@ -1351,7 +1351,7 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
1351
1351
  "".join([f'.get("{i}", {{}})' for i in item_name_array[:-1]]) + f'.get("{item_name_array[-1]}", [])'
1352
1352
  )
1353
1353
  list_of_elem_deserialized = ""
1354
- if self.code_model.options["models_mode"] == "dpg":
1354
+ if self.code_model.options["models-mode"] == "dpg":
1355
1355
  item_type = builder.item_type.type_annotation(
1356
1356
  is_operation_file=True, serialize_namespace=self.serialize_namespace
1357
1357
  )
@@ -1377,7 +1377,7 @@ class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
1377
1377
  next_link_name = builder.next_link_name
1378
1378
  if not next_link_name:
1379
1379
  cont_token_property = "None"
1380
- elif self.code_model.options["models_mode"] == "msrest":
1380
+ elif self.code_model.options["models-mode"] == "msrest":
1381
1381
  cont_token_property = f"deserialized.{next_link_name} or None"
1382
1382
  else:
1383
1383
  cont_token_property = f'deserialized.get("{next_link_name}") or None'
@@ -1498,8 +1498,8 @@ class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
1498
1498
  if builder.lro_response.headers:
1499
1499
  retval.append(" response_headers = {}")
1500
1500
  if (
1501
- not self.code_model.options["models_mode"]
1502
- or self.code_model.options["models_mode"] == "dpg"
1501
+ not self.code_model.options["models-mode"]
1502
+ or self.code_model.options["models-mode"] == "dpg"
1503
1503
  or builder.lro_response.headers
1504
1504
  ):
1505
1505
  retval.append(" response = pipeline_response.http_response")
@@ -50,7 +50,8 @@ class ClientSerializer:
50
50
  class_name = self.client.name
51
51
  base_class = ""
52
52
  if self.client.has_mixin:
53
- base_class = f"{class_name}OperationsMixin"
53
+ prefix = "" if self.client.code_model.options["multiapi"] else "_"
54
+ base_class = f"{prefix}{class_name}OperationsMixin"
54
55
  pylint_disable = self.client.pylint_disable()
55
56
  if base_class:
56
57
  return f"class {class_name}({base_class}):{pylint_disable}"
@@ -137,7 +138,7 @@ class ClientSerializer:
137
138
  if not self.client.code_model.is_legacy and self.client.request_id_header_name:
138
139
  result.append(f'kwargs["request_id_header_name"] = "{self.client.request_id_header_name}"')
139
140
  policies = build_policies(
140
- self.client.code_model.options["azure_arm"],
141
+ self.client.code_model.options["azure-arm"],
141
142
  async_mode,
142
143
  is_azure_flavor=self.client.code_model.is_azure_flavor,
143
144
  tracing=self.client.code_model.options["tracing"],
@@ -161,7 +162,7 @@ class ClientSerializer:
161
162
  return f"{{k: v for k, v in {models_dict_name}.__dict__.items() if isinstance(v, type)}}"
162
163
  return "{}"
163
164
 
164
- is_msrest_model = self.client.code_model.options["models_mode"] == "msrest"
165
+ is_msrest_model = self.client.code_model.options["models-mode"] == "msrest"
165
166
  if is_msrest_model:
166
167
  add_private_models = len(self.client.code_model.model_types) != len(
167
168
  self.client.code_model.public_model_types
@@ -177,7 +178,7 @@ class ClientSerializer:
177
178
  client_models_str = "client_models" if is_msrest_model else ""
178
179
  retval.append(f"self._serialize = Serializer({client_models_str})")
179
180
  retval.append(f"self._deserialize = Deserializer({client_models_str})")
180
- if not self.client.code_model.options["client_side_validation"]:
181
+ if not self.client.code_model.options["client-side-validation"]:
181
182
  retval.append("self._serialize.client_side_validation = False")
182
183
  operation_groups = [og for og in self.client.operation_groups if not og.is_mixin]
183
184
  for og in operation_groups:
@@ -252,7 +253,7 @@ class ClientSerializer:
252
253
  rest_library = f"{self.client.code_model.core_library}.rest"
253
254
  retval = ['"""Runs the network request through the client\'s chained policies.']
254
255
  retval.append("")
255
- if self.client.code_model.options["builders_visibility"] != "embedded":
256
+ if self.client.code_model.options["builders-visibility"] != "embedded":
256
257
  retval.extend(self._request_builder_example(async_mode))
257
258
  else:
258
259
  retval.extend(self._rest_request_example(async_mode))
@@ -39,7 +39,7 @@ class GeneralSerializer(BaseSerializer):
39
39
  "MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
40
40
  "MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
41
41
  }
42
- params.update(self.code_model.options)
42
+ params.update({"options": self.code_model.options})
43
43
  return template.render(code_model=self.code_model, **params)
44
44
 
45
45
  def serialize_package_file(self, template_name: str, **kwargs: Any) -> str:
@@ -47,12 +47,12 @@ class GeneralSerializer(BaseSerializer):
47
47
  package_parts = (
48
48
  self.code_model.namespace.split(".")[:-1]
49
49
  if self.code_model.is_tsp
50
- else (self.code_model.options["package_name"] or "").split("-")[:-1]
50
+ else (self.code_model.options.get("package-name", "")).split("-")[:-1]
51
51
  )
52
52
  token_credential = any(
53
53
  c for c in self.code_model.clients if isinstance(getattr(c.credential, "type", None), TokenCredentialType)
54
54
  )
55
- version = self.code_model.options["package_version"]
55
+ version = self.code_model.options.get("package-version", "")
56
56
  if any(x in version for x in ["a", "b", "rc"]) or version[0] == "0":
57
57
  dev_status = "4 - Beta"
58
58
  else:
@@ -68,7 +68,7 @@ class GeneralSerializer(BaseSerializer):
68
68
  "MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
69
69
  "MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
70
70
  }
71
- params.update(self.code_model.options)
71
+ params.update({"options": self.code_model.options})
72
72
  params.update(kwargs)
73
73
  return template.render(file_import=FileImport(self.code_model), **params)
74
74
 
@@ -158,7 +158,7 @@ class MetadataSerializer(BaseSerializer):
158
158
  chosen_version, total_api_version_list = self._choose_api_version()
159
159
 
160
160
  # setting to true, because for multiapi we always generate with a version file with version 0.1.0
161
- self.code_model.options["package_version"] = "0.1.0"
161
+ self.code_model.options["package-version"] = "0.1.0"
162
162
  template = self.env.get_template("metadata.json.jinja2")
163
163
 
164
164
  client_serialize_namespace = self.code_model.get_serialize_namespace(self.client_namespace, async_mode=False)
@@ -164,7 +164,7 @@ class MsrestModelSerializer(_ModelSerializer):
164
164
  def declare_model(self, model: ModelType) -> str:
165
165
  basename = (
166
166
  "msrest.serialization.Model"
167
- if self.code_model.options["client_side_validation"]
167
+ if self.code_model.options["client-side-validation"]
168
168
  else "_serialization.Model"
169
169
  )
170
170
  if model.parents:
@@ -24,9 +24,13 @@ class OperationsInitSerializer:
24
24
 
25
25
  def operation_group_imports(self) -> List[str]:
26
26
  def _get_filename(operation_group: OperationGroup) -> str:
27
- return "_operations" if self.code_model.options["combine_operation_files"] else operation_group.filename
27
+ return "_operations" if self.code_model.options["combine-operation-files"] else operation_group.filename
28
28
 
29
- return [f"from .{_get_filename(og)} import {og.class_name} # type: ignore" for og in self.operation_groups]
29
+ return [
30
+ f"from .{_get_filename(og)} import {og.class_name} # type: ignore"
31
+ for og in self.operation_groups
32
+ if not og.is_mixin or self.code_model.options["multiapi"]
33
+ ]
30
34
 
31
35
  def serialize(self) -> str:
32
36
  operation_group_init_template = self.env.get_template("operations_folder_init.py.jinja2")
@@ -147,7 +147,7 @@ class SampleSerializer(BaseSerializer):
147
147
  name = self.sample.get("x-ms-original-file", "")
148
148
  if "specification" in name:
149
149
  return "specification" + name.split("specification")[-1]
150
- return name if self.code_model.options["from_typespec"] else ""
150
+ return name if self.code_model.options["from-typespec"] else ""
151
151
 
152
152
  def serialize(self) -> str:
153
153
  operation_result, return_var = self._operation_result()
@@ -54,13 +54,13 @@ class TestName:
54
54
 
55
55
  @property
56
56
  def preparer_name(self) -> str:
57
- if self.code_model.options["azure_arm"]:
57
+ if self.code_model.options["azure-arm"]:
58
58
  return "RandomNameResourceGroupPreparer"
59
59
  return self.prefix + "Preparer"
60
60
 
61
61
  @property
62
62
  def base_test_class_name(self) -> str:
63
- if self.code_model.options["azure_arm"]:
63
+ if self.code_model.options["azure-arm"]:
64
64
  return "AzureMgmtRecordedTestCase"
65
65
  return f"{self.client_name}TestBase{self.async_suffix_capt}"
66
66
 
@@ -196,12 +196,12 @@ class TestSerializer(TestGeneralSerializer):
196
196
  test_name = TestName(self.code_model, self.client.name, async_mode=self.async_mode)
197
197
  async_suffix = "_async" if self.async_mode else ""
198
198
  imports.add_submodule_import(
199
- "devtools_testutils" if self.code_model.options["azure_arm"] else "testpreparer" + async_suffix,
199
+ "devtools_testutils" if self.code_model.options["azure-arm"] else "testpreparer" + async_suffix,
200
200
  test_name.base_test_class_name,
201
201
  ImportType.LOCAL,
202
202
  )
203
203
  imports.add_submodule_import(
204
- "devtools_testutils" if self.code_model.options["azure_arm"] else "testpreparer",
204
+ "devtools_testutils" if self.code_model.options["azure-arm"] else "testpreparer",
205
205
  test_name.preparer_name,
206
206
  ImportType.LOCAL,
207
207
  )
@@ -210,7 +210,7 @@ class TestSerializer(TestGeneralSerializer):
210
210
  "recorded_by_proxy" + async_suffix,
211
211
  ImportType.LOCAL,
212
212
  )
213
- if self.code_model.options["azure_arm"]:
213
+ if self.code_model.options["azure-arm"]:
214
214
  self.add_import_client(imports)
215
215
  return FileImportSerializer(imports, self.async_mode)
216
216
 
@@ -46,7 +46,7 @@ class {{ client.name }}Configuration: {{ client.config.pylint_disable() }}
46
46
  self.proxy_policy = kwargs.get('proxy_policy') or policies.ProxyPolicy(**kwargs)
47
47
  self.logging_policy = kwargs.get('logging_policy') or policies.NetworkTraceLoggingPolicy(**kwargs)
48
48
  {% if code_model.is_azure_flavor %}
49
- self.http_logging_policy = kwargs.get('http_logging_policy') or {{ "ARM" if client.code_model.options['azure_arm'] else "policies." }}HttpLoggingPolicy(**kwargs)
49
+ self.http_logging_policy = kwargs.get('http_logging_policy') or {{ "ARM" if client.code_model.options["azure-arm"] else "policies." }}HttpLoggingPolicy(**kwargs)
50
50
  self.custom_hook_policy = kwargs.get('custom_hook_policy') or policies.CustomHookPolicy(**kwargs)
51
51
  self.redirect_policy = kwargs.get('redirect_policy') or policies.{{ keywords.async_class }}RedirectPolicy(**kwargs)
52
52
  {% endif %}
@@ -8,7 +8,7 @@
8
8
 
9
9
  {{ imports }}
10
10
 
11
- {% if not code_model.options['package_version'] %}
11
+ {% if not code_model.options.get("package-version") %}
12
12
  VERSION = "unknown"
13
13
  {% endif %}
14
14
 
@@ -13,7 +13,7 @@ load_dotenv()
13
13
  @pytest.fixture(scope="session", autouse=True)
14
14
  def add_sanitizers(test_proxy):
15
15
  {% for test_name in test_names %}
16
- {% set prefix_upper = "AZURE" if code_model.options["azure_arm"] else test_name.prefix|upper %}
16
+ {% set prefix_upper = "AZURE" if code_model.options["azure-arm"] else test_name.prefix|upper %}
17
17
  {% set prefix_lower = test_name.prefix|lower %}
18
18
  {{ prefix_lower }}_subscription_id = os.environ.get("{{ prefix_upper }}_SUBSCRIPTION_ID", "00000000-0000-0000-0000-000000000000")
19
19
  {{ prefix_lower }}_tenant_id = os.environ.get("{{ prefix_upper }}_TENANT_ID", "00000000-0000-0000-0000-000000000000")
@@ -9,7 +9,7 @@
9
9
  from .{{ client.filename }} import {{ client.name }} # type: ignore
10
10
  {% endfor %}
11
11
  {% endif %}
12
- {% if not async_mode and code_model.options['package_version']%}
12
+ {% if not async_mode and code_model.options.get("package-version") %}
13
13
  from {{ code_model.get_relative_import_path(serialize_namespace, module_name="_version") }} import VERSION
14
14
 
15
15
  __version__ = VERSION
@@ -9,9 +9,9 @@
9
9
  "description": {{ client.description | tojson }},
10
10
  "host_value": {{ (client.parameters.host.client_default_value_declaration if not client.has_parameterized_host else None) | tojson }},
11
11
  "parameterized_host_template": {{ (keywords.escape_str(client.url) if client.has_parameterized_host else None) | tojson }},
12
- "azure_arm": {{ client.code_model.options["azure_arm"] | tojson }},
12
+ "azure_arm": {{ client.code_model.options["azure-arm"] | tojson }},
13
13
  "has_public_lro_operations": {{ client.has_public_lro_operations | tojson }},
14
- "client_side_validation": {{ client.code_model.options["client_side_validation"] | tojson }},
14
+ "client-side-validation": {{ client.code_model.options["client-side-validation"] | tojson }},
15
15
  "sync_imports": {{ sync_client_imports | tojson }},
16
16
  "async_imports": {{ async_client_imports | tojson }}
17
17
  },
@@ -29,7 +29,7 @@
29
29
  {% endif %}
30
30
  {% endfor %}
31
31
 
32
- {% if code_model.options["models_mode"] == "dpg" and model.flattened_property %}
32
+ {% if code_model.options["models-mode"] == "dpg" and model.flattened_property %}
33
33
  __flattened_items = ["{{ model.flattened_items|join('\", \"') }}"]
34
34
  {% endif %}
35
35
 
@@ -65,7 +65,7 @@
65
65
  {% for initialize_property in initialize_properties %}
66
66
  {{ initialize_property }}
67
67
  {% endfor %}
68
- {% if code_model.options["models_mode"] == "dpg" and model.flattened_property %}
68
+ {% if code_model.options["models-mode"] == "dpg" and model.flattened_property %}
69
69
  {% set flattened_property_attr = model.flattened_property.client_name %}
70
70
 
71
71
  def __getattr__(self, name: str) -> Any:
@@ -25,7 +25,7 @@ class {{ operation_group.class_name }}: {{ operation_group.pylint_disable() }}
25
25
  :attr:`{{ operation_group.property_name }}` attribute.
26
26
  """
27
27
 
28
- {% if code_model.public_model_types and code_model.options["models_mode"] == "msrest" %}
28
+ {% if code_model.public_model_types and code_model.options["models-mode"] == "msrest" %}
29
29
  models = _models
30
30
 
31
31
  {% endif %}
@@ -6,7 +6,7 @@
6
6
  {% endif %}
7
7
  {{ imports }}
8
8
  {{ unset }}
9
- {% if code_model.options["builders_visibility"] == "embedded" and not async_mode %}
9
+ {% if code_model.options["builders-visibility"] == "embedded" and not async_mode %}
10
10
  {% if need_declare_serializer %}
11
11
  {{ op_tools.declare_serializer(code_model) }}
12
12
  {% endif %}
@@ -61,7 +61,7 @@ Example:
61
61
  {% macro declare_serializer(code_model) %}
62
62
  {% if code_model.has_non_abstract_operations %}
63
63
  _SERIALIZER = Serializer()
64
- {% if not code_model.options["client_side_validation"] %}
64
+ {% if not code_model.options["client-side-validation"] %}
65
65
  _SERIALIZER.client_side_validation = False
66
66
  {% endif %}
67
67
  {% endif %}
@@ -10,7 +10,9 @@
10
10
  {{ keywords.patch_imports() }}
11
11
  __all__ = [
12
12
  {% for operation_group in operation_groups %}
13
+ {% if not operation_group.is_mixin or code_model.options["multiapi"] %}
13
14
  '{{ operation_group.class_name }}',
15
+ {% endif %}
14
16
  {% endfor %}
15
17
  ]
16
18
  {{ keywords.extend_all }}
@@ -3,7 +3,7 @@ include LICENSE
3
3
  {% if code_model.is_tsp %}
4
4
  include {{ code_model.namespace.replace('.', '/') }}/py.typed
5
5
  {% else %}
6
- include {{ package_name.replace('-', '/') }}/py.typed
6
+ include {{ options.get("package-name", "").replace('-', '/') }}/py.typed
7
7
  {% endif %}
8
8
  recursive-include tests *.py
9
9
  recursive-include samples *.py *.md
@@ -1,8 +1,8 @@
1
1
  {% if code_model.is_azure_flavor %}
2
- {% if package_mode == "mgmtplane" %}
2
+ {% if options["package-mode"] == "mgmtplane" %}
3
3
  # Microsoft Azure SDK for Python
4
4
 
5
- This is the Microsoft {{package_pprint_name}} Client Library.
5
+ This is the Microsoft {{options["package-pprint-name"]}} Client Library.
6
6
  This package has been tested with Python 3.9+.
7
7
  For a more complete view of Azure libraries, see the [azure sdk python release](https://aka.ms/azsdk/python/all).
8
8
 
@@ -11,7 +11,7 @@ For a more complete view of Azure libraries, see the [azure sdk python release](
11
11
  To learn how to use this package, see the [quickstart guide](https://aka.ms/azsdk/python/mgmt)
12
12
 
13
13
  For docs and references, see [Python SDK References](https://docs.microsoft.com/python/api/overview/azure)
14
- Code samples for this package can be found at [{{package_pprint_name}}](https://docs.microsoft.com/samples/browse/?languages=python&term=Getting%20started%20-%20Managing&terms=Getting%20started%20-%20Managing) on docs.microsoft.com.
14
+ Code samples for this package can be found at [{{options["package-pprint-name"]}}](https://docs.microsoft.com/samples/browse/?languages=python&term=Getting%20started%20-%20Managing&terms=Getting%20started%20-%20Managing) on docs.microsoft.com.
15
15
  Additional code samples for different Azure services are available at [Samples Repo](https://aka.ms/azsdk/python/mgmt/samples)
16
16
 
17
17
  # Provide Feedback
@@ -21,9 +21,9 @@ If you encounter any bugs or have suggestions, please file an issue in the
21
21
  section of the project.
22
22
 
23
23
 
24
- ![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-python%2F{{package_name}}%2FREADME.png)
24
+ ![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-python%2F{{options["package-name"]}}%2FREADME.png)
25
25
  {% else %}
26
- # {{ package_pprint_name }} client library for Python
26
+ # {{ options["package-pprint-name"] }} client library for Python
27
27
  <!-- write necessary description of service -->
28
28
 
29
29
  ## Getting started
@@ -31,14 +31,14 @@ section of the project.
31
31
  ### Install the package
32
32
 
33
33
  ```bash
34
- python -m pip install {{ package_name }}
34
+ python -m pip install {{ options["package-name"] }}
35
35
  ```
36
36
 
37
37
  #### Prequisites
38
38
 
39
39
  - Python 3.9 or later is required to use this package.
40
40
  - You need an [Azure subscription][azure_sub] to use this package.
41
- - An existing {{ package_pprint_name }} instance.
41
+ - An existing {{ options["package-pprint-name"] }} instance.
42
42
 
43
43
  {% if token_credential and client_name %}
44
44
  #### Create with an Azure Active Directory Credential
@@ -104,4 +104,35 @@ additional questions or comments.
104
104
  [pip]: https://pypi.org/project/pip/
105
105
  [azure_sub]: https://azure.microsoft.com/free/
106
106
  {% endif %}
107
+ {% else %}
108
+ # Overview
109
+
110
+ This package is generated by `@typespec/http-client-python` with Typespec.
111
+
112
+ ## Getting started
113
+
114
+ ### Prequisites
115
+
116
+ - Python 3.9 or later is required to use this package.
117
+
118
+ ### Install the package
119
+
120
+ Step into folder where setup.py is then run:
121
+
122
+ ```bash
123
+ pip install -e .
124
+ ```
125
+
126
+ ### Examples
127
+
128
+ ```python
129
+ >>> from {{ code_model.namespace }} import {{ client_name }}
130
+ >>> from {{ code_model.core_library }}.exceptions import HttpResponseError
131
+
132
+ >>> client = {{ client_name }}(endpoint='<endpoint>')
133
+ >>> try:
134
+ <!-- write code here -->
135
+ except HttpResponseError as e:
136
+ print('service responds error: {}'.format(e.response.json()))
137
+ ```
107
138
  {% endif %}
@@ -3,7 +3,7 @@
3
3
  {% if token_credential %}
4
4
  ../../identity/azure-identity
5
5
  {% endif -%}
6
- {% if azure_arm %}
6
+ {% if options["azure-arm"] %}
7
7
  ../../core/azure-mgmt-core
8
8
  {% endif %}
9
9
  aiohttp