@autorest/python 6.2.9 → 6.2.10

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.
@@ -96,6 +96,7 @@ KNOWN_TYPES: Dict[str, Dict[str, Any]] = {
96
96
  "string": {"type": "string"},
97
97
  "binary": {"type": "binary"},
98
98
  "anydict": {"type": "dict", "elementType": {"type": "any"}},
99
+ "any-object": {"type": "any-object"},
99
100
  }
100
101
 
101
102
  JSON_REGEXP = re.compile(r"^(application|text)/(.+\+)?json$")
@@ -70,6 +70,12 @@ def _validate_code_model_options(options: Dict[str, Any]) -> None:
70
70
  "Can not generate version tolerant with --client-side-validation. "
71
71
  )
72
72
 
73
+ if not (options["azure_arm"] or options["version_tolerant"]):
74
+ _LOGGER.warning(
75
+ "You are generating with options that would not allow the SDK to be shipped as an official Azure SDK. "
76
+ "Please read https://aka.ms/azsdk/dpcodegen for more details."
77
+ )
78
+
73
79
 
74
80
  _LOGGER = logging.getLogger(__name__)
75
81
 
@@ -192,3 +192,7 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
192
192
  def serialization_constraints(self) -> List[str]:
193
193
  """Whether there are any serialization constraints when serializing this type."""
194
194
  return []
195
+
196
+ @property
197
+ def type_description(self) -> str:
198
+ return self.type # type: ignore
@@ -51,12 +51,8 @@ class CombinedType(BaseType):
51
51
  self, *, is_operation_file: bool # pylint: disable=unused-argument
52
52
  ) -> str:
53
53
  if len(self.types) == 2:
54
- return (
55
- f"Is either a {self.types[0].type} type or a {self.types[1].type} type."
56
- )
57
- return (
58
- f"Is one of the following types: {', '.join([t.type for t in self.types])}"
59
- )
54
+ return f"Is either a {self.types[0].type_description} type or a {self.types[1].type_description} type."
55
+ return f"Is one of the following types: {', '.join([t.type_description for t in self.types])}"
60
56
 
61
57
  def docstring_text(self, **kwargs: Any) -> str:
62
58
  return " or ".join(t.docstring_text(**kwargs) for t in self.types)
@@ -5,7 +5,6 @@
5
5
  # --------------------------------------------------------------------------
6
6
  import abc
7
7
  from enum import Enum, auto
8
- import re
9
8
 
10
9
  from typing import (
11
10
  Dict,
@@ -22,8 +21,6 @@ from .imports import FileImport, ImportType
22
21
  from .base import BaseModel
23
22
  from .base import BaseType
24
23
  from .constant_type import ConstantType
25
- from .model_type import ModelType
26
- from .combined_type import CombinedType
27
24
  from .utils import add_to_description
28
25
 
29
26
  if TYPE_CHECKING:
@@ -254,40 +251,6 @@ class BodyParameter(_BodyParameterBase):
254
251
  type=code_model.lookup_type(id(yaml_data["type"])),
255
252
  )
256
253
 
257
- def type_annotation(self, **kwargs: Any) -> str:
258
- annotation = super().type_annotation(**kwargs)
259
- model_seq = BodyParameter.get_model_seq(self.type)
260
- if self.code_model.options["models_mode"] == "dpg" and model_seq >= 0:
261
- pattern = re.compile(r"Union\[.*\]")
262
- union_content = (
263
- annotation[6:-1] if pattern.match(annotation) else annotation
264
- )
265
- items = union_content.split(", ")
266
- items.insert(model_seq + 1, "JSON")
267
- annotation = f'Union[{", ".join(items)}]'
268
- return annotation
269
-
270
- def docstring_type(self, **kwargs: Any) -> str:
271
- docstring = super().docstring_type(**kwargs)
272
- model_seq = BodyParameter.get_model_seq(self.type)
273
- if self.code_model.options["models_mode"] == "dpg" and model_seq >= 0:
274
- items = docstring.split(" or ")
275
- items.insert(model_seq + 1, "JSON")
276
- docstring = " or ".join(items)
277
- return docstring
278
-
279
- @staticmethod
280
- def get_model_seq(t: BaseType):
281
- if isinstance(t, ModelType):
282
- return 0
283
- if isinstance(t, CombinedType):
284
- sub_num = len(t.types)
285
- for i in range(sub_num):
286
- sub_seq = BodyParameter.get_model_seq(t.types[i])
287
- if sub_seq >= 0:
288
- return i + sub_seq
289
- return -1
290
-
291
254
 
292
255
  EntryBodyParameterType = TypeVar(
293
256
  "EntryBodyParameterType", bound=Union[BodyParameter, "RequestBuilderBodyParameter"]
@@ -199,6 +199,10 @@ class AnyObjectType(PrimitiveType):
199
199
  file_import.define_mutable_mapping_type()
200
200
  return file_import
201
201
 
202
+ @property
203
+ def type_description(self) -> str:
204
+ return "JSON"
205
+
202
206
 
203
207
  class NumberType(PrimitiveType): # pylint: disable=abstract-method
204
208
  def __init__(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
@@ -18,6 +18,7 @@ from azure.core.utils._utils import _FixedOffset
18
18
  from collections.abc import MutableMapping
19
19
  from azure.core.exceptions import DeserializationError
20
20
  from azure.core import CaseInsensitiveEnumMeta
21
+ from azure.core.pipeline import PipelineResponse
21
22
  import copy
22
23
 
23
24
  _LOGGER = logging.getLogger(__name__)
@@ -253,9 +254,11 @@ _DESERIALIZE_MAPPING = {
253
254
 
254
255
 
255
256
  def _get_model(module_name: str, model_name: str):
257
+ models = {k: v for k, v in sys.modules[module_name].__dict__.items() if isinstance(v, type)}
256
258
  module_end = module_name.rsplit(".", 1)[0]
257
259
  module = sys.modules[module_end]
258
- models = {k: v for k, v in module.__dict__.items() if isinstance(v, type)}
260
+ models.update({k: v for k, v in module.__dict__.items() if isinstance(v, type)})
261
+ model_name = model_name.split(".")[-1]
259
262
  if model_name not in models:
260
263
  return model_name
261
264
  return models[model_name]
@@ -485,7 +488,7 @@ def _get_deserialize_callable_from_annotation(
485
488
  def _deserialize_with_union(union_annotation: typing._GenericAlias, obj):
486
489
  for t in union_annotation.__args__:
487
490
  try:
488
- return _deserialize(t, obj)
491
+ return _deserialize(t, obj, module)
489
492
  except DeserializationError:
490
493
  pass
491
494
  raise DeserializationError()
@@ -532,7 +535,7 @@ def _get_deserialize_callable_from_annotation(
532
535
  if obj is None:
533
536
  return obj
534
537
  return {
535
- _deserialize(key_deserializer, k): _deserialize(value_deserializer, v) for k, v in obj.items()
538
+ _deserialize(key_deserializer, k, module): _deserialize(value_deserializer, v, module) for k, v in obj.items()
536
539
  }
537
540
 
538
541
  return functools.partial(
@@ -552,7 +555,7 @@ def _get_deserialize_callable_from_annotation(
552
555
  if obj is None:
553
556
  return obj
554
557
  return type(obj)(
555
- _deserialize(deserializer, entry) for entry, deserializer in zip(obj, entry_deserializers)
558
+ _deserialize(deserializer, entry, module) for entry, deserializer in zip(obj, entry_deserializers)
556
559
  )
557
560
 
558
561
  entry_deserializers = [
@@ -567,7 +570,7 @@ def _get_deserialize_callable_from_annotation(
567
570
  ):
568
571
  if obj is None:
569
572
  return obj
570
- return type(obj)(_deserialize(deserializer, entry) for entry in obj)
573
+ return type(obj)(_deserialize(deserializer, entry, module) for entry in obj)
571
574
 
572
575
  return functools.partial(_deserialize_sequence, deserializer)
573
576
  except (TypeError, IndexError, AttributeError, SyntaxError):
@@ -606,8 +609,10 @@ def _deserialize_with_callable(deserializer: typing.Optional[typing.Callable[[ty
606
609
  raise DeserializationError() from e
607
610
 
608
611
 
609
- def _deserialize(deserializer: typing.Optional[typing.Callable[[typing.Any], typing.Any]], value: typing.Any):
610
- deserializer = _get_deserialize_callable_from_annotation(deserializer, "")
612
+ def _deserialize(deserializer: typing.Optional[typing.Callable[[typing.Any], typing.Any]], value: typing.Any, module: str = ""):
613
+ if isinstance(value, PipelineResponse):
614
+ value = value.http_response.json()
615
+ deserializer = _get_deserialize_callable_from_annotation(deserializer, module)
611
616
  return _deserialize_with_callable(deserializer, value)
612
617
 
613
618
  class _RestField:
@@ -20,7 +20,11 @@ from .. import YamlUpdatePlugin, YamlUpdatePluginAutorest
20
20
  from .._utils import parse_args, get_body_type_for_description, JSON_REGEXP, KNOWN_TYPES
21
21
 
22
22
 
23
- def add_body_param_type(code_model: Dict[str, Any], body_parameter: Dict[str, Any]):
23
+ def add_body_param_type(
24
+ code_model: Dict[str, Any],
25
+ body_parameter: Dict[str, Any],
26
+ models_mode: Optional[str],
27
+ ):
24
28
  if (
25
29
  body_parameter
26
30
  and body_parameter["type"]["type"] in ("model", "dict", "list")
@@ -30,10 +34,13 @@ def add_body_param_type(code_model: Dict[str, Any], body_parameter: Dict[str, An
30
34
  and not body_parameter["type"].get("xmlMetadata")
31
35
  and not any(t for t in ["flattened", "groupedBy"] if body_parameter.get(t))
32
36
  ):
37
+ origin_type = body_parameter["type"]["type"]
33
38
  body_parameter["type"] = {
34
39
  "type": "combined",
35
40
  "types": [body_parameter["type"], KNOWN_TYPES["binary"]],
36
41
  }
42
+ if origin_type == "model" and models_mode == "dpg":
43
+ body_parameter["type"]["types"].insert(1, KNOWN_TYPES["any-object"])
37
44
  code_model["types"].append(body_parameter["type"])
38
45
 
39
46
 
@@ -203,6 +210,12 @@ class PreProcessPlugin(YamlUpdatePlugin): # pylint: disable=abstract-method
203
210
  def version_tolerant(self) -> bool:
204
211
  return self.options.get("version-tolerant", True)
205
212
 
213
+ @property
214
+ def models_mode(self) -> Optional[str]:
215
+ return self.options.get(
216
+ "models-mode", "dpg" if self.options.get("cadl_file") else None
217
+ )
218
+
206
219
  def get_operation_updater(
207
220
  self, yaml_data: Dict[str, Any]
208
221
  ) -> Callable[[Dict[str, Any], Dict[str, Any]], None]:
@@ -244,7 +257,7 @@ class PreProcessPlugin(YamlUpdatePlugin): # pylint: disable=abstract-method
244
257
  response["discriminator"] = "operation"
245
258
  if body_parameter and not is_overload:
246
259
  # if we have a JSON body, we add a binary overload
247
- add_body_param_type(code_model, body_parameter)
260
+ add_body_param_type(code_model, body_parameter, self.models_mode)
248
261
  add_overloads_for_body_param(yaml_data)
249
262
 
250
263
  def _update_lro_operation_helper(self, yaml_data: Dict[str, Any]) -> None:
@@ -375,6 +388,7 @@ class PreProcessPluginAutorest(YamlUpdatePluginAutorest, PreProcessPlugin):
375
388
  options = {
376
389
  "version-tolerant": self._autorestapi.get_boolean_value("version-tolerant"),
377
390
  "azure-arm": self._autorestapi.get_boolean_value("azure-arm"),
391
+ "models-mode": self._autorestapi.get_value("models-mode"),
378
392
  }
379
393
  return {k: v for k, v in options.items() if v is not None}
380
394
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autorest/python",
3
- "version": "6.2.9",
3
+ "version": "6.2.10",
4
4
  "description": "The Python extension for generators in AutoRest.",
5
5
  "repository": {
6
6
  "type": "git",