@autorest/python 6.38.1 → 6.39.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 (146) hide show
  1. package/README.md +2 -27
  2. package/autorest/codegen.py +0 -1
  3. package/autorest/jsonrpc/server.py +0 -3
  4. package/generator/build/lib/pygen/__init__.py +14 -23
  5. package/generator/build/lib/pygen/codegen/__init__.py +4 -4
  6. package/generator/build/lib/pygen/codegen/models/__init__.py +2 -2
  7. package/generator/build/lib/pygen/codegen/models/base.py +9 -12
  8. package/generator/build/lib/pygen/codegen/models/base_builder.py +4 -6
  9. package/generator/build/lib/pygen/codegen/models/client.py +61 -102
  10. package/generator/build/lib/pygen/codegen/models/code_model.py +29 -29
  11. package/generator/build/lib/pygen/codegen/models/combined_type.py +7 -7
  12. package/generator/build/lib/pygen/codegen/models/constant_type.py +4 -11
  13. package/generator/build/lib/pygen/codegen/models/credential_types.py +9 -11
  14. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +7 -8
  15. package/generator/build/lib/pygen/codegen/models/enum_type.py +7 -7
  16. package/generator/build/lib/pygen/codegen/models/imports.py +24 -29
  17. package/generator/build/lib/pygen/codegen/models/list_type.py +15 -14
  18. package/generator/build/lib/pygen/codegen/models/lro_operation.py +6 -6
  19. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
  20. package/generator/build/lib/pygen/codegen/models/model_type.py +11 -11
  21. package/generator/build/lib/pygen/codegen/models/operation.py +26 -56
  22. package/generator/build/lib/pygen/codegen/models/operation_group.py +11 -22
  23. package/generator/build/lib/pygen/codegen/models/paging_operation.py +15 -19
  24. package/generator/build/lib/pygen/codegen/models/parameter.py +12 -21
  25. package/generator/build/lib/pygen/codegen/models/parameter_list.py +37 -39
  26. package/generator/build/lib/pygen/codegen/models/primitive_types.py +24 -18
  27. package/generator/build/lib/pygen/codegen/models/property.py +10 -10
  28. package/generator/build/lib/pygen/codegen/models/request_builder.py +7 -8
  29. package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +3 -3
  30. package/generator/build/lib/pygen/codegen/models/response.py +15 -40
  31. package/generator/build/lib/pygen/codegen/models/utils.py +2 -2
  32. package/generator/build/lib/pygen/codegen/serializers/__init__.py +26 -42
  33. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +103 -100
  34. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +22 -25
  35. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +2 -2
  36. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +49 -61
  37. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +6 -7
  38. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -2
  39. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +15 -17
  40. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
  41. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -6
  42. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +28 -18
  43. package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +1 -2
  44. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +1 -2
  45. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +9 -14
  46. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +7 -7
  47. package/generator/build/lib/pygen/codegen/serializers/utils.py +2 -2
  48. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +30 -24
  49. package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
  50. package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
  51. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
  52. package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
  53. package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  54. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
  55. package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +1 -1
  56. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +11 -13
  57. package/generator/build/lib/pygen/codegen/templates/utils.py.jinja2 +6 -6
  58. package/generator/build/lib/pygen/preprocess/__init__.py +47 -30
  59. package/generator/build/lib/pygen/preprocess/helpers.py +2 -2
  60. package/generator/build/lib/pygen/utils.py +6 -6
  61. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  62. package/generator/pygen/__init__.py +14 -23
  63. package/generator/pygen/codegen/__init__.py +4 -4
  64. package/generator/pygen/codegen/models/__init__.py +2 -2
  65. package/generator/pygen/codegen/models/base.py +9 -12
  66. package/generator/pygen/codegen/models/base_builder.py +4 -6
  67. package/generator/pygen/codegen/models/client.py +61 -102
  68. package/generator/pygen/codegen/models/code_model.py +29 -29
  69. package/generator/pygen/codegen/models/combined_type.py +7 -7
  70. package/generator/pygen/codegen/models/constant_type.py +4 -11
  71. package/generator/pygen/codegen/models/credential_types.py +9 -11
  72. package/generator/pygen/codegen/models/dictionary_type.py +7 -8
  73. package/generator/pygen/codegen/models/enum_type.py +7 -7
  74. package/generator/pygen/codegen/models/imports.py +24 -29
  75. package/generator/pygen/codegen/models/list_type.py +15 -14
  76. package/generator/pygen/codegen/models/lro_operation.py +6 -6
  77. package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
  78. package/generator/pygen/codegen/models/model_type.py +11 -11
  79. package/generator/pygen/codegen/models/operation.py +26 -56
  80. package/generator/pygen/codegen/models/operation_group.py +11 -22
  81. package/generator/pygen/codegen/models/paging_operation.py +15 -19
  82. package/generator/pygen/codegen/models/parameter.py +12 -21
  83. package/generator/pygen/codegen/models/parameter_list.py +37 -39
  84. package/generator/pygen/codegen/models/primitive_types.py +24 -18
  85. package/generator/pygen/codegen/models/property.py +10 -10
  86. package/generator/pygen/codegen/models/request_builder.py +7 -8
  87. package/generator/pygen/codegen/models/request_builder_parameter.py +3 -3
  88. package/generator/pygen/codegen/models/response.py +15 -40
  89. package/generator/pygen/codegen/models/utils.py +2 -2
  90. package/generator/pygen/codegen/serializers/__init__.py +26 -42
  91. package/generator/pygen/codegen/serializers/builder_serializer.py +103 -100
  92. package/generator/pygen/codegen/serializers/client_serializer.py +22 -25
  93. package/generator/pygen/codegen/serializers/enum_serializer.py +2 -2
  94. package/generator/pygen/codegen/serializers/general_serializer.py +49 -61
  95. package/generator/pygen/codegen/serializers/import_serializer.py +6 -7
  96. package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -2
  97. package/generator/pygen/codegen/serializers/model_serializer.py +15 -17
  98. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
  99. package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -6
  100. package/generator/pygen/codegen/serializers/parameter_serializer.py +28 -18
  101. package/generator/pygen/codegen/serializers/patch_serializer.py +1 -2
  102. package/generator/pygen/codegen/serializers/request_builders_serializer.py +1 -2
  103. package/generator/pygen/codegen/serializers/sample_serializer.py +9 -14
  104. package/generator/pygen/codegen/serializers/test_serializer.py +7 -7
  105. package/generator/pygen/codegen/serializers/utils.py +2 -2
  106. package/generator/pygen/codegen/templates/model_base.py.jinja2 +30 -24
  107. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
  108. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
  109. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
  110. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
  111. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  112. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
  113. package/generator/pygen/codegen/templates/patch.py.jinja2 +1 -1
  114. package/generator/pygen/codegen/templates/serialization.py.jinja2 +11 -13
  115. package/generator/pygen/codegen/templates/utils.py.jinja2 +6 -6
  116. package/generator/pygen/preprocess/__init__.py +47 -30
  117. package/generator/pygen/preprocess/helpers.py +2 -2
  118. package/generator/pygen/utils.py +6 -6
  119. package/generator/pygen.egg-info/SOURCES.txt +0 -2
  120. package/package.json +2 -2
  121. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  122. package/autorest/multiapi/__init__.py +0 -185
  123. package/autorest/multiapi/models/__init__.py +0 -16
  124. package/autorest/multiapi/models/client.py +0 -68
  125. package/autorest/multiapi/models/code_model.py +0 -142
  126. package/autorest/multiapi/models/config.py +0 -24
  127. package/autorest/multiapi/models/constant_global_parameter.py +0 -11
  128. package/autorest/multiapi/models/global_parameter.py +0 -34
  129. package/autorest/multiapi/models/global_parameters.py +0 -53
  130. package/autorest/multiapi/models/imports.py +0 -181
  131. package/autorest/multiapi/models/mixin_operation.py +0 -38
  132. package/autorest/multiapi/models/operation_group.py +0 -29
  133. package/autorest/multiapi/models/operation_mixin_group.py +0 -89
  134. package/autorest/multiapi/serializers/__init__.py +0 -145
  135. package/autorest/multiapi/serializers/import_serializer.py +0 -181
  136. package/autorest/multiapi/templates/multiapi_config.py.jinja2 +0 -89
  137. package/autorest/multiapi/templates/multiapi_init.py.jinja2 +0 -22
  138. package/autorest/multiapi/templates/multiapi_models.py.jinja2 +0 -9
  139. package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +0 -39
  140. package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +0 -163
  141. package/autorest/multiapi/templates/multiapi_version.py.jinja2 +0 -8
  142. package/autorest/multiapi/utils.py +0 -51
  143. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +0 -216
  144. package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +0 -167
  145. package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -216
  146. package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
@@ -17,7 +17,6 @@ import re
17
17
  import sys
18
18
  import codecs
19
19
  from typing import (
20
- Dict,
21
20
  Any,
22
21
  cast,
23
22
  Optional,
@@ -27,7 +26,6 @@ from typing import (
27
26
  Mapping,
28
27
  Callable,
29
28
  MutableMapping,
30
- List,
31
29
  )
32
30
 
33
31
  try:
@@ -225,12 +223,12 @@ class Model:
225
223
  serialization and deserialization.
226
224
  """
227
225
 
228
- _subtype_map: Dict[str, Dict[str, Any]] = {}
229
- _attribute_map: Dict[str, Dict[str, Any]] = {}
230
- _validation: Dict[str, Dict[str, Any]] = {}
226
+ _subtype_map: dict[str, dict[str, Any]] = {}
227
+ _attribute_map: dict[str, dict[str, Any]] = {}
228
+ _validation: dict[str, dict[str, Any]] = {}
231
229
 
232
230
  def __init__(self, **kwargs: Any) -> None:
233
- self.additional_properties: Optional[Dict[str, Any]] = {}
231
+ self.additional_properties: Optional[dict[str, Any]] = {}
234
232
  for k in kwargs: # pylint: disable=consider-using-dict-items
235
233
  if k not in self._attribute_map:
236
234
  _LOGGER.warning("%s is not a known attribute of class %s and will be ignored", k, self.__class__)
@@ -307,7 +305,7 @@ class Model:
307
305
  def as_dict(
308
306
  self,
309
307
  keep_readonly: bool = True,
310
- key_transformer: Callable[[str, Dict[str, Any], Any], Any] = attribute_transformer,
308
+ key_transformer: Callable[[str, dict[str, Any], Any], Any] = attribute_transformer,
311
309
  **kwargs: Any
312
310
  ) -> JSON:
313
311
  """Return a dict that can be serialized using json.dump.
@@ -376,7 +374,7 @@ class Model:
376
374
  def from_dict(
377
375
  cls,
378
376
  data: Any,
379
- key_extractors: Optional[Callable[[str, Dict[str, Any], Any], Any]] = None,
377
+ key_extractors: Optional[Callable[[str, dict[str, Any], Any], Any]] = None,
380
378
  content_type: Optional[str] = None,
381
379
  ) -> Self:
382
380
  """Parse a dict using given key extractor return a model.
@@ -410,7 +408,7 @@ class Model:
410
408
  return {}
411
409
  result = dict(cls._subtype_map[key])
412
410
  for valuetype in cls._subtype_map[key].values():
413
- result.update(objects[valuetype]._flatten_subtype(key, objects)) # pylint: disable=protected-access
411
+ result |= objects[valuetype]._flatten_subtype(key, objects) # pylint: disable=protected-access
414
412
  return result
415
413
 
416
414
  @classmethod
@@ -524,7 +522,7 @@ class Serializer: # pylint: disable=too-many-public-methods
524
522
  "[]": self.serialize_iter,
525
523
  "{}": self.serialize_dict,
526
524
  }
527
- self.dependencies: Dict[str, type] = dict(classes) if classes else {}
525
+ self.dependencies: dict[str, type] = dict(classes) if classes else {}
528
526
  self.key_transformer = full_restapi_key_transformer
529
527
  self.client_side_validation = True
530
528
 
@@ -575,7 +573,7 @@ class Serializer: # pylint: disable=too-many-public-methods
575
573
 
576
574
  if attr_name == "additional_properties" and attr_desc["key"] == "":
577
575
  if target_obj.additional_properties is not None:
578
- serialized.update(target_obj.additional_properties)
576
+ serialized |= target_obj.additional_properties
579
577
  continue
580
578
  try:
581
579
 
@@ -1180,7 +1178,7 @@ def rest_key_extractor(attr, attr_desc, data): # pylint: disable=unused-argumen
1180
1178
 
1181
1179
  while "." in key:
1182
1180
  # Need the cast, as for some reasons "split" is typed as list[str | Any]
1183
- dict_keys = cast(List[str], _FLATTEN.split(key))
1181
+ dict_keys = cast(list[str], _FLATTEN.split(key))
1184
1182
  if len(dict_keys) == 1:
1185
1183
  key = _decode_attribute_map_key(dict_keys[0])
1186
1184
  break
@@ -1382,7 +1380,7 @@ class Deserializer:
1382
1380
  "duration": (isodate.Duration, datetime.timedelta),
1383
1381
  "iso-8601": (datetime.datetime),
1384
1382
  }
1385
- self.dependencies: Dict[str, type] = dict(classes) if classes else {}
1383
+ self.dependencies: dict[str, type] = dict(classes) if classes else {}
1386
1384
  self.key_extractors = [rest_key_extractor, xml_key_extractor]
1387
1385
  # Additional properties only works if the "rest_key_extractor" is used to
1388
1386
  # extract the keys. Making it to work whatever the key extractor is too much
@@ -66,9 +66,9 @@ FileType = Union[
66
66
  # file (or bytes)
67
67
  FileContent,
68
68
  # (filename, file (or bytes))
69
- Tuple[Optional[str], FileContent],
69
+ tuple[Optional[str], FileContent],
70
70
  # (filename, file (or bytes), content_type)
71
- Tuple[Optional[str], FileContent, Optional[str]],
71
+ tuple[Optional[str], FileContent, Optional[str]],
72
72
  ]
73
73
 
74
74
  def serialize_multipart_data_entry(data_entry: Any) -> Any:
@@ -77,10 +77,10 @@ def serialize_multipart_data_entry(data_entry: Any) -> Any:
77
77
  return data_entry
78
78
 
79
79
  def prepare_multipart_form_data(
80
- body: Mapping[str, Any], multipart_fields: List[str], data_fields: List[str]
81
- ) -> Tuple[List[FileType], Dict[str, Any]]:
82
- files: List[FileType] = []
83
- data: Dict[str, Any] = {}
80
+ body: Mapping[str, Any], multipart_fields: list[str], data_fields: list[str]
81
+ ) -> tuple[list[FileType], dict[str, Any]]:
82
+ files: list[FileType] = []
83
+ data: dict[str, Any] = {}
84
84
  for multipart_field in multipart_fields:
85
85
  multipart_entry = body.get(multipart_field)
86
86
  if isinstance(multipart_entry, list):
@@ -5,7 +5,7 @@
5
5
  # --------------------------------------------------------------------------
6
6
  """The preprocessing autorest plugin."""
7
7
  import copy
8
- from typing import Callable, Dict, Any, List, Optional
8
+ from typing import Callable, Any, Optional
9
9
 
10
10
  from ..utils import to_snake_case, extract_original_name
11
11
  from .helpers import (
@@ -26,8 +26,8 @@ from ..utils import (
26
26
 
27
27
 
28
28
  def update_overload_section(
29
- overload: Dict[str, Any],
30
- yaml_data: Dict[str, Any],
29
+ overload: dict[str, Any],
30
+ yaml_data: dict[str, Any],
31
31
  section: str,
32
32
  ):
33
33
  try:
@@ -42,7 +42,7 @@ def update_overload_section(
42
42
  raise ValueError(overload["name"]) from exc
43
43
 
44
44
 
45
- def add_overload(yaml_data: Dict[str, Any], body_type: Dict[str, Any], for_flatten_params=False):
45
+ def add_overload(yaml_data: dict[str, Any], body_type: dict[str, Any], for_flatten_params=False):
46
46
  overload = copy.deepcopy(yaml_data)
47
47
  overload["isOverload"] = True
48
48
  overload["bodyParameter"]["type"] = body_type
@@ -80,7 +80,7 @@ def add_overload(yaml_data: Dict[str, Any], body_type: Dict[str, Any], for_flatt
80
80
  return overload
81
81
 
82
82
 
83
- def add_overloads_for_body_param(yaml_data: Dict[str, Any]) -> None:
83
+ def add_overloads_for_body_param(yaml_data: dict[str, Any]) -> None:
84
84
  """If we added a body parameter type, add overloads for that type"""
85
85
  body_parameter = yaml_data["bodyParameter"]
86
86
  if not (
@@ -121,7 +121,7 @@ def update_operation_group_class_name(prefix: str, class_name: str) -> str:
121
121
  return class_name + "Operations"
122
122
 
123
123
 
124
- def update_paging_response(yaml_data: Dict[str, Any]) -> None:
124
+ def update_paging_response(yaml_data: dict[str, Any]) -> None:
125
125
  yaml_data["discriminator"] = "paging"
126
126
 
127
127
 
@@ -148,23 +148,35 @@ HEADERS_CONVERT_IN_METHOD = {
148
148
  },
149
149
  },
150
150
  }
151
+ CLOUD_SETTING = {
152
+ "optional": True,
153
+ "description": "The cloud setting for which to get the ARM endpoint.",
154
+ "clientName": "cloud_setting",
155
+ "implementation": "Client",
156
+ "location": "keyword",
157
+ "type": {
158
+ "type": "sdkcore",
159
+ "name": "AzureClouds",
160
+ "isTypingOnly": True,
161
+ },
162
+ }
151
163
 
152
164
 
153
- def get_wire_name_lower(parameter: Dict[str, Any]) -> str:
165
+ def get_wire_name_lower(parameter: dict[str, Any]) -> str:
154
166
  return (parameter.get("wireName") or "").lower()
155
167
 
156
168
 
157
- def headers_convert(yaml_data: Dict[str, Any], replace_data: Any) -> None:
169
+ def headers_convert(yaml_data: dict[str, Any], replace_data: Any) -> None:
158
170
  if isinstance(replace_data, dict):
159
171
  for k, v in replace_data.items():
160
172
  yaml_data[k] = v
161
173
 
162
174
 
163
- def has_json_content_type(yaml_data: Dict[str, Any]) -> bool:
175
+ def has_json_content_type(yaml_data: dict[str, Any]) -> bool:
164
176
  return any(ct for ct in yaml_data.get("contentTypes", []) if JSON_REGEXP.match(ct))
165
177
 
166
178
 
167
- def has_multi_part_content_type(yaml_data: Dict[str, Any]) -> bool:
179
+ def has_multi_part_content_type(yaml_data: dict[str, Any]) -> bool:
168
180
  return any(ct for ct in yaml_data.get("contentTypes", []) if ct == "multipart/form-data")
169
181
 
170
182
 
@@ -189,8 +201,8 @@ class PreProcessPlugin(YamlUpdatePlugin):
189
201
 
190
202
  def add_body_param_type(
191
203
  self,
192
- code_model: Dict[str, Any],
193
- body_parameter: Dict[str, Any],
204
+ code_model: dict[str, Any],
205
+ body_parameter: dict[str, Any],
194
206
  ):
195
207
  # only add overload for special content type
196
208
  if ( # pylint: disable=too-many-boolean-expressions
@@ -231,7 +243,7 @@ class PreProcessPlugin(YamlUpdatePlugin):
231
243
  return name_prefix + name + pad_type
232
244
  return name_prefix + name
233
245
 
234
- def update_types(self, yaml_data: List[Dict[str, Any]]) -> None:
246
+ def update_types(self, yaml_data: list[dict[str, Any]]) -> None:
235
247
  for type in yaml_data:
236
248
  for property in type.get("properties", []):
237
249
  property["description"] = update_description(property.get("description", ""))
@@ -268,8 +280,9 @@ class PreProcessPlugin(YamlUpdatePlugin):
268
280
  for v in HEADERS_CONVERT_IN_METHOD.values():
269
281
  if isinstance(v, dict) and "type" in v:
270
282
  yaml_data.append(v["type"])
283
+ yaml_data.append(CLOUD_SETTING["type"]) # type: ignore
271
284
 
272
- def update_client(self, yaml_data: Dict[str, Any]) -> None:
285
+ def update_client(self, yaml_data: dict[str, Any]) -> None:
273
286
  yaml_data["description"] = update_description(yaml_data["description"], default_description=yaml_data["name"])
274
287
  yaml_data["legacyFilename"] = to_snake_case(yaml_data["name"].replace(" ", "_"))
275
288
  parameters = yaml_data["parameters"]
@@ -325,7 +338,11 @@ class PreProcessPlugin(YamlUpdatePlugin):
325
338
  o["hasEtag"] = True
326
339
  yaml_data["hasEtag"] = True
327
340
 
328
- def get_operation_updater(self, yaml_data: Dict[str, Any]) -> Callable[[Dict[str, Any], Dict[str, Any]], None]:
341
+ # add client signature cloud_setting for arm
342
+ if self.azure_arm and yaml_data["parameters"]:
343
+ yaml_data["parameters"].append(CLOUD_SETTING)
344
+
345
+ def get_operation_updater(self, yaml_data: dict[str, Any]) -> Callable[[dict[str, Any], dict[str, Any]], None]:
329
346
  if yaml_data["discriminator"] == "lropaging":
330
347
  return self.update_lro_paging_operation
331
348
  if yaml_data["discriminator"] == "lro":
@@ -334,7 +351,7 @@ class PreProcessPlugin(YamlUpdatePlugin):
334
351
  return self.update_paging_operation
335
352
  return self.update_operation
336
353
 
337
- def update_parameter(self, yaml_data: Dict[str, Any]) -> None:
354
+ def update_parameter(self, yaml_data: dict[str, Any]) -> None:
338
355
  yaml_data["description"] = update_description(yaml_data.get("description", ""))
339
356
  if not (yaml_data["location"] == "header" and yaml_data["clientName"] in ("content_type", "accept")):
340
357
  yaml_data["clientName"] = self.pad_reserved_words(yaml_data["clientName"].lower(), PadType.PARAMETER)
@@ -358,8 +375,8 @@ class PreProcessPlugin(YamlUpdatePlugin):
358
375
 
359
376
  def update_operation(
360
377
  self,
361
- code_model: Dict[str, Any],
362
- yaml_data: Dict[str, Any],
378
+ code_model: dict[str, Any],
379
+ yaml_data: dict[str, Any],
363
380
  *,
364
381
  is_overload: bool = False,
365
382
  ) -> None:
@@ -390,7 +407,7 @@ class PreProcessPlugin(YamlUpdatePlugin):
390
407
  self.add_body_param_type(code_model, body_parameter)
391
408
  add_overloads_for_body_param(yaml_data)
392
409
 
393
- def _update_lro_operation_helper(self, yaml_data: Dict[str, Any]) -> None:
410
+ def _update_lro_operation_helper(self, yaml_data: dict[str, Any]) -> None:
394
411
  for response in yaml_data.get("responses", []):
395
412
  response["discriminator"] = "lro"
396
413
  response["pollerSync"] = response.get("pollerSync") or "azure.core.polling.LROPoller"
@@ -410,10 +427,10 @@ class PreProcessPlugin(YamlUpdatePlugin):
410
427
 
411
428
  def update_lro_paging_operation(
412
429
  self,
413
- code_model: Dict[str, Any],
414
- yaml_data: Dict[str, Any],
430
+ code_model: dict[str, Any],
431
+ yaml_data: dict[str, Any],
415
432
  is_overload: bool = False,
416
- item_type: Optional[Dict[str, Any]] = None,
433
+ item_type: Optional[dict[str, Any]] = None,
417
434
  ) -> None:
418
435
  self.update_lro_operation(code_model, yaml_data, is_overload=is_overload)
419
436
  self.update_paging_operation(code_model, yaml_data, is_overload=is_overload, item_type=item_type)
@@ -430,11 +447,11 @@ class PreProcessPlugin(YamlUpdatePlugin):
430
447
 
431
448
  def update_lro_operation(
432
449
  self,
433
- code_model: Dict[str, Any],
434
- yaml_data: Dict[str, Any],
450
+ code_model: dict[str, Any],
451
+ yaml_data: dict[str, Any],
435
452
  is_overload: bool = False,
436
453
  ) -> None:
437
- def convert_initial_operation_response_type(data: Dict[str, Any]) -> None:
454
+ def convert_initial_operation_response_type(data: dict[str, Any]) -> None:
438
455
  for response in data.get("responses", []):
439
456
  response["type"] = KNOWN_TYPES["binary"]
440
457
 
@@ -449,10 +466,10 @@ class PreProcessPlugin(YamlUpdatePlugin):
449
466
 
450
467
  def update_paging_operation(
451
468
  self,
452
- code_model: Dict[str, Any],
453
- yaml_data: Dict[str, Any],
469
+ code_model: dict[str, Any],
470
+ yaml_data: dict[str, Any],
454
471
  is_overload: bool = False,
455
- item_type: Optional[Dict[str, Any]] = None,
472
+ item_type: Optional[dict[str, Any]] = None,
456
473
  ) -> None:
457
474
  self.update_operation(code_model, yaml_data, is_overload=is_overload)
458
475
  item_type = item_type or yaml_data["itemType"]["elementType"]
@@ -470,7 +487,7 @@ class PreProcessPlugin(YamlUpdatePlugin):
470
487
  for overload in yaml_data.get("overloads", []):
471
488
  self.update_paging_operation(code_model, overload, is_overload=True, item_type=item_type)
472
489
 
473
- def update_operation_groups(self, code_model: Dict[str, Any], client: Dict[str, Any]) -> None:
490
+ def update_operation_groups(self, code_model: dict[str, Any], client: dict[str, Any]) -> None:
474
491
  operation_groups_yaml_data = client.get("operationGroups", [])
475
492
  for operation_group in operation_groups_yaml_data:
476
493
  operation_group["identifyName"] = self.pad_reserved_words(
@@ -491,7 +508,7 @@ class PreProcessPlugin(YamlUpdatePlugin):
491
508
  if operation_group.get("operationGroups"):
492
509
  self.update_operation_groups(code_model, operation_group)
493
510
 
494
- def update_yaml(self, yaml_data: Dict[str, Any]) -> None:
511
+ def update_yaml(self, yaml_data: dict[str, Any]) -> None:
495
512
  """Convert in place the YAML str."""
496
513
  self.update_types(yaml_data["types"])
497
514
  yaml_data["types"] += KNOWN_TYPES.values()
@@ -4,14 +4,14 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
  import re
7
- from typing import Any, Dict
7
+ from typing import Any
8
8
  from .python_mappings import (
9
9
  REDEFINED_BUILTINS,
10
10
  BUILTIN_PACKAGES,
11
11
  )
12
12
 
13
13
 
14
- def add_redefined_builtin_info(name: str, yaml_data: Dict[str, Any]) -> None:
14
+ def add_redefined_builtin_info(name: str, yaml_data: dict[str, Any]) -> None:
15
15
  if name in REDEFINED_BUILTINS:
16
16
  yaml_data["pylintDisable"] = "redefined-builtin"
17
17
 
@@ -3,7 +3,7 @@
3
3
  # Licensed under the MIT License. See License.txt in the project root for
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
- from typing import Any, Dict, Tuple, List
6
+ from typing import Any
7
7
  import re
8
8
  import argparse
9
9
 
@@ -12,7 +12,7 @@ TYPESPEC_PACKAGE_MODE = ["azure-mgmt", "azure-dataplane", "generic"]
12
12
  VALID_PACKAGE_MODE = SWAGGER_PACKAGE_MODE + TYPESPEC_PACKAGE_MODE
13
13
 
14
14
 
15
- def update_enum_value(name: str, value: Any, description: str, enum_type: Dict[str, Any]) -> Dict[str, Any]:
15
+ def update_enum_value(name: str, value: Any, description: str, enum_type: dict[str, Any]) -> dict[str, Any]:
16
16
  return {
17
17
  "name": name,
18
18
  "type": "enumvalue",
@@ -49,7 +49,7 @@ def to_snake_case(name: str) -> str:
49
49
 
50
50
  def parse_args(
51
51
  need_tsp_file: bool = True,
52
- ) -> Tuple[argparse.Namespace, Dict[str, Any]]:
52
+ ) -> tuple[argparse.Namespace, dict[str, Any]]:
53
53
  parser = argparse.ArgumentParser(
54
54
  description="Run mypy against target folder. Add a local custom plugin to the path prior to execution. "
55
55
  )
@@ -92,7 +92,7 @@ def parse_args(
92
92
  return args, unknown_args_ret
93
93
 
94
94
 
95
- def get_body_type_for_description(body_parameter: Dict[str, Any]) -> str:
95
+ def get_body_type_for_description(body_parameter: dict[str, Any]) -> str:
96
96
  if body_parameter["type"]["type"] == "binary":
97
97
  return "binary"
98
98
  if body_parameter["type"]["type"] == "string":
@@ -101,7 +101,7 @@ def get_body_type_for_description(body_parameter: Dict[str, Any]) -> str:
101
101
 
102
102
 
103
103
  # used if we want to get a string / binary type etc
104
- KNOWN_TYPES: Dict[str, Dict[str, Any]] = {
104
+ KNOWN_TYPES: dict[str, dict[str, Any]] = {
105
105
  "string": {"type": "string"},
106
106
  "binary": {"type": "binary"},
107
107
  "anydict": {"type": "dict", "elementType": {"type": "any"}},
@@ -118,7 +118,7 @@ def build_policies(
118
118
  *,
119
119
  is_azure_flavor: bool = False,
120
120
  tracing: bool = True,
121
- ) -> List[str]:
121
+ ) -> list[str]:
122
122
  if is_azure_flavor:
123
123
  # for Azure
124
124
  async_prefix = "Async" if async_mode else ""
@@ -46,7 +46,6 @@ pygen/codegen/serializers/client_serializer.py
46
46
  pygen/codegen/serializers/enum_serializer.py
47
47
  pygen/codegen/serializers/general_serializer.py
48
48
  pygen/codegen/serializers/import_serializer.py
49
- pygen/codegen/serializers/metadata_serializer.py
50
49
  pygen/codegen/serializers/model_init_serializer.py
51
50
  pygen/codegen/serializers/model_serializer.py
52
51
  pygen/codegen/serializers/operation_groups_serializer.py
@@ -70,7 +69,6 @@ pygen/codegen/templates/keywords.jinja2
70
69
  pygen/codegen/templates/lro_operation.py.jinja2
71
70
  pygen/codegen/templates/lro_paging_operation.py.jinja2
72
71
  pygen/codegen/templates/macros.jinja2
73
- pygen/codegen/templates/metadata.json.jinja2
74
72
  pygen/codegen/templates/model_base.py.jinja2
75
73
  pygen/codegen/templates/model_container.py.jinja2
76
74
  pygen/codegen/templates/model_dpg.py.jinja2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autorest/python",
3
- "version": "6.38.1",
3
+ "version": "6.39.0",
4
4
  "description": "The Python extension for generators in AutoRest.",
5
5
  "main": "index.js",
6
6
  "repository": {
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "homepage": "https://github.com/Azure/autorest.python/blob/main/README.md",
21
21
  "dependencies": {
22
- "@typespec/http-client-python": "~0.15.1",
22
+ "@typespec/http-client-python": "~0.16.0",
23
23
  "@autorest/system-requirements": "~1.0.2",
24
24
  "fs-extra": "~11.2.0",
25
25
  "tsx": "~4.19.1"
@@ -1,185 +0,0 @@
1
- # -------------------------------------------------------------------------
2
- # Copyright (c) Microsoft Corporation. All rights reserved.
3
- # Licensed under the MIT License. See License.txt in the project root for
4
- # license information.
5
- # --------------------------------------------------------------------------
6
- import sys
7
- import logging
8
- import json
9
-
10
- from collections import defaultdict
11
- from pathlib import Path
12
- from typing import Dict, List, Optional, cast, Any
13
- from pygen import Plugin, ReaderAndWriter
14
-
15
- from .serializers import MultiAPISerializer, MultiAPISerializerAutorest
16
- from .models import CodeModel
17
- from .utils import _get_default_api_version_from_list
18
-
19
- from .. import PluginAutorest, ReaderAndWriterAutorest
20
-
21
- _LOGGER = logging.getLogger(__name__)
22
-
23
-
24
- class MultiApiScriptPlugin(Plugin): # pylint: disable=abstract-method
25
- def process(self) -> bool:
26
- return self.generator.process()
27
-
28
- @property
29
- def generator(self) -> "MultiAPI":
30
- return MultiAPI(
31
- input_package_name=self.options.get("package-name"),
32
- output_folder=self.options["output-folder"],
33
- user_specified_default_api=self.options.get("default-api"),
34
- no_async=self.options.get("no-async", False),
35
- )
36
-
37
-
38
- class MultiApiScriptPluginAutorest(MultiApiScriptPlugin, PluginAutorest):
39
- @property
40
- def generator(self) -> "MultiAPI":
41
- return MultiAPIAutorest(
42
- autorestapi=self._autorestapi,
43
- input_package_name=self.options.get("package-name"),
44
- output_folder=self.output_folder,
45
- user_specified_default_api=self.options.get("default-api"),
46
- no_async=self.options.get("no-async", False),
47
- )
48
-
49
- def get_options(self) -> Dict[str, Any]:
50
- options = {
51
- "package-name": self._autorestapi.get_value("package-name"),
52
- "default-api": self._autorestapi.get_value("default-api"),
53
- "no-async": self._autorestapi.get_value("no-async"),
54
- }
55
- return {k: v for k, v in options.items() if v is not None}
56
-
57
-
58
- class MultiAPI(ReaderAndWriter): # pylint: disable=abstract-method
59
- def __init__(
60
- self,
61
- *,
62
- input_package_name: Optional[str] = None,
63
- output_folder: str,
64
- no_async: Optional[bool] = False,
65
- user_specified_default_api: Optional[str] = None,
66
- **kwargs: Any,
67
- ) -> None:
68
- super().__init__(output_folder=Path(output_folder).resolve(), **kwargs)
69
- if input_package_name is None:
70
- raise ValueError("package-name is required, either provide it as args or check your readme configuration")
71
- self.input_package_name = input_package_name
72
- _LOGGER.debug("Received package name %s", input_package_name)
73
- _LOGGER.debug("Received output-folder %s", output_folder)
74
- self.output_package_name: str = ""
75
- self.no_async = no_async
76
- self.user_specified_default_api = user_specified_default_api
77
-
78
- @property
79
- def default_api_version(self) -> str:
80
- return _get_default_api_version_from_list(
81
- self.mod_to_api_version,
82
- [p.name for p in self.paths_to_versions],
83
- self.preview_mode,
84
- self.user_specified_default_api,
85
- )
86
-
87
- @property
88
- def default_version_metadata(self) -> Dict[str, Any]:
89
- # get client name from default api version
90
- path_to_default_version = Path()
91
- for path_to_version in self.paths_to_versions:
92
- if self.default_api_version.replace("-", "_") == path_to_version.stem:
93
- path_to_default_version = path_to_version
94
- break
95
- return json.loads(self.read_file(path_to_default_version / "_metadata.json"))
96
-
97
- @property
98
- def module_name(self) -> str:
99
- """From a syntax like package_name#submodule, build a package name
100
- and complete module name.
101
- """
102
- split_package_name = self.input_package_name.split("#")
103
- package_name = split_package_name[0]
104
- module_name = package_name.replace("-", ".")
105
- if len(split_package_name) >= 2:
106
- module_name = ".".join([module_name, split_package_name[1]])
107
- self.output_package_name = package_name
108
- else:
109
- self.output_package_name = self.input_package_name
110
- return module_name
111
-
112
- @property
113
- def preview_mode(self) -> bool:
114
- # If True, means the auto-profile will consider preview versions.
115
- # If not, if it exists a stable API version for a global or RT, will always be used
116
- return cast(
117
- bool,
118
- self.user_specified_default_api and "preview" in self.user_specified_default_api,
119
- )
120
-
121
- @property
122
- def paths_to_versions(self) -> List[Path]:
123
- paths_to_versions = []
124
- directory = [x for x in self.output_folder.iterdir() if x.is_dir()]
125
- directory.sort()
126
- for child in directory:
127
- child_dir = (self.output_folder / child).resolve()
128
- if Path(child_dir / "_metadata.json") in child_dir.iterdir():
129
- paths_to_versions.append(Path(child.stem))
130
- return paths_to_versions
131
-
132
- @property
133
- def version_path_to_metadata(self) -> Dict[Path, Dict[str, Any]]:
134
- return {
135
- version_path: json.loads(self.read_file(version_path / "_metadata.json"))
136
- for version_path in self.paths_to_versions
137
- }
138
-
139
- @property
140
- def mod_to_api_version(self) -> Dict[str, str]:
141
- mod_to_api_version: Dict[str, str] = defaultdict(str)
142
- for version_path in self.paths_to_versions:
143
- metadata_json = json.loads(self.read_file(version_path / "_metadata.json"))
144
- version = metadata_json["chosen_version"]
145
- total_api_version_list = metadata_json["total_api_version_list"]
146
- if not version:
147
- if total_api_version_list:
148
- sys.exit(f"Unable to match {total_api_version_list} to label {version_path.stem}")
149
- else:
150
- sys.exit(f"Unable to extract api version of {version_path.stem}")
151
- mod_to_api_version[version_path.name] = version
152
- return mod_to_api_version
153
-
154
- @property
155
- def serializer(self) -> MultiAPISerializer:
156
- return MultiAPISerializer()
157
-
158
- def process(self) -> bool:
159
- _LOGGER.info("Generating multiapi client")
160
-
161
- code_model = CodeModel(
162
- module_name=self.module_name,
163
- package_name=self.output_package_name,
164
- default_api_version=self.default_api_version,
165
- preview_mode=self.preview_mode,
166
- default_version_metadata=self.default_version_metadata,
167
- mod_to_api_version=self.mod_to_api_version,
168
- version_path_to_metadata=self.version_path_to_metadata,
169
- user_specified_default_api=self.user_specified_default_api,
170
- )
171
-
172
- multiapi_serializer = self.serializer
173
- multiapi_serializer.serialize(code_model, self.no_async)
174
-
175
- _LOGGER.info("Done!")
176
- return True
177
-
178
-
179
- class MultiAPIAutorest(MultiAPI, ReaderAndWriterAutorest):
180
- def __init__(self, **kwargs: Any) -> None:
181
- super().__init__(**kwargs)
182
-
183
- @property
184
- def serializer(self) -> MultiAPISerializer:
185
- return MultiAPISerializerAutorest(self._autorestapi, output_folder=self.output_folder)
@@ -1,16 +0,0 @@
1
- # -------------------------------------------------------------------------
2
- # Copyright (c) Microsoft Corporation. All rights reserved.
3
- # Licensed under the MIT License. See License.txt in the project root for
4
- # license information.
5
- # --------------------------------------------------------------------------
6
- from .code_model import CodeModel
7
- from .imports import ImportType, FileImport, TypingSection
8
- from .global_parameter import GlobalParameter
9
-
10
- __all__ = [
11
- "CodeModel",
12
- "FileImport",
13
- "ImportType",
14
- "TypingSection",
15
- "GlobalParameter",
16
- ]