@azure-tools/typespec-python 0.33.0 → 0.35.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/dist/scripts/eng/lint.d.ts.map +1 -1
  2. package/dist/scripts/eng/lint.js +18 -1
  3. package/dist/scripts/eng/lint.js.map +1 -1
  4. package/dist/src/emitter.d.ts +0 -2
  5. package/dist/src/emitter.d.ts.map +1 -1
  6. package/dist/src/emitter.js +2 -102
  7. package/dist/src/emitter.js.map +1 -1
  8. package/dist/src/index.d.ts +1 -1
  9. package/dist/src/index.d.ts.map +1 -1
  10. package/dist/src/index.js +1 -1
  11. package/dist/src/index.js.map +1 -1
  12. package/generator/dev_requirements.txt +10 -3
  13. package/package.json +14 -11
  14. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  15. package/scripts/eng/lint.ts +17 -1
  16. package/scripts/eng/pylintrc +2 -1
  17. package/scripts/install.py +0 -1
  18. package/dist/src/code-model.d.ts +0 -4
  19. package/dist/src/code-model.d.ts.map +0 -1
  20. package/dist/src/code-model.js +0 -190
  21. package/dist/src/code-model.js.map +0 -1
  22. package/dist/src/external-process.d.ts +0 -20
  23. package/dist/src/external-process.d.ts.map +0 -1
  24. package/dist/src/external-process.js +0 -44
  25. package/dist/src/external-process.js.map +0 -1
  26. package/dist/src/http.d.ts +0 -7
  27. package/dist/src/http.d.ts.map +0 -1
  28. package/dist/src/http.js +0 -266
  29. package/dist/src/http.js.map +0 -1
  30. package/dist/src/types.d.ts +0 -36
  31. package/dist/src/types.d.ts.map +0 -1
  32. package/dist/src/types.js +0 -489
  33. package/dist/src/types.js.map +0 -1
  34. package/dist/src/utils.d.ts +0 -26
  35. package/dist/src/utils.d.ts.map +0 -1
  36. package/dist/src/utils.js +0 -151
  37. package/dist/src/utils.js.map +0 -1
  38. package/generator/LICENSE +0 -21
  39. package/generator/README.md +0 -1
  40. package/generator/pygen/__init__.py +0 -107
  41. package/generator/pygen/_version.py +0 -7
  42. package/generator/pygen/black.py +0 -69
  43. package/generator/pygen/codegen/__init__.py +0 -338
  44. package/generator/pygen/codegen/_utils.py +0 -16
  45. package/generator/pygen/codegen/models/__init__.py +0 -204
  46. package/generator/pygen/codegen/models/base.py +0 -186
  47. package/generator/pygen/codegen/models/base_builder.py +0 -119
  48. package/generator/pygen/codegen/models/client.py +0 -430
  49. package/generator/pygen/codegen/models/code_model.py +0 -237
  50. package/generator/pygen/codegen/models/combined_type.py +0 -149
  51. package/generator/pygen/codegen/models/constant_type.py +0 -129
  52. package/generator/pygen/codegen/models/credential_types.py +0 -214
  53. package/generator/pygen/codegen/models/dictionary_type.py +0 -127
  54. package/generator/pygen/codegen/models/enum_type.py +0 -238
  55. package/generator/pygen/codegen/models/imports.py +0 -291
  56. package/generator/pygen/codegen/models/list_type.py +0 -143
  57. package/generator/pygen/codegen/models/lro_operation.py +0 -142
  58. package/generator/pygen/codegen/models/lro_paging_operation.py +0 -32
  59. package/generator/pygen/codegen/models/model_type.py +0 -362
  60. package/generator/pygen/codegen/models/operation.py +0 -530
  61. package/generator/pygen/codegen/models/operation_group.py +0 -184
  62. package/generator/pygen/codegen/models/paging_operation.py +0 -155
  63. package/generator/pygen/codegen/models/parameter.py +0 -412
  64. package/generator/pygen/codegen/models/parameter_list.py +0 -387
  65. package/generator/pygen/codegen/models/primitive_types.py +0 -659
  66. package/generator/pygen/codegen/models/property.py +0 -171
  67. package/generator/pygen/codegen/models/request_builder.py +0 -189
  68. package/generator/pygen/codegen/models/request_builder_parameter.py +0 -115
  69. package/generator/pygen/codegen/models/response.py +0 -348
  70. package/generator/pygen/codegen/models/utils.py +0 -23
  71. package/generator/pygen/codegen/serializers/__init__.py +0 -574
  72. package/generator/pygen/codegen/serializers/base_serializer.py +0 -21
  73. package/generator/pygen/codegen/serializers/builder_serializer.py +0 -1513
  74. package/generator/pygen/codegen/serializers/client_serializer.py +0 -295
  75. package/generator/pygen/codegen/serializers/enum_serializer.py +0 -15
  76. package/generator/pygen/codegen/serializers/general_serializer.py +0 -213
  77. package/generator/pygen/codegen/serializers/import_serializer.py +0 -127
  78. package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -198
  79. package/generator/pygen/codegen/serializers/model_init_serializer.py +0 -33
  80. package/generator/pygen/codegen/serializers/model_serializer.py +0 -300
  81. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +0 -89
  82. package/generator/pygen/codegen/serializers/operations_init_serializer.py +0 -44
  83. package/generator/pygen/codegen/serializers/parameter_serializer.py +0 -221
  84. package/generator/pygen/codegen/serializers/patch_serializer.py +0 -19
  85. package/generator/pygen/codegen/serializers/request_builders_serializer.py +0 -52
  86. package/generator/pygen/codegen/serializers/sample_serializer.py +0 -168
  87. package/generator/pygen/codegen/serializers/test_serializer.py +0 -293
  88. package/generator/pygen/codegen/serializers/types_serializer.py +0 -31
  89. package/generator/pygen/codegen/serializers/utils.py +0 -68
  90. package/generator/pygen/codegen/templates/client.py.jinja2 +0 -37
  91. package/generator/pygen/codegen/templates/client_container.py.jinja2 +0 -12
  92. package/generator/pygen/codegen/templates/config.py.jinja2 +0 -73
  93. package/generator/pygen/codegen/templates/config_container.py.jinja2 +0 -16
  94. package/generator/pygen/codegen/templates/conftest.py.jinja2 +0 -28
  95. package/generator/pygen/codegen/templates/enum.py.jinja2 +0 -13
  96. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +0 -10
  97. package/generator/pygen/codegen/templates/init.py.jinja2 +0 -24
  98. package/generator/pygen/codegen/templates/keywords.jinja2 +0 -19
  99. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +0 -16
  100. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +0 -18
  101. package/generator/pygen/codegen/templates/macros.jinja2 +0 -12
  102. package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
  103. package/generator/pygen/codegen/templates/model_base.py.jinja2 +0 -1158
  104. package/generator/pygen/codegen/templates/model_container.py.jinja2 +0 -13
  105. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +0 -98
  106. package/generator/pygen/codegen/templates/model_init.py.jinja2 +0 -28
  107. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +0 -92
  108. package/generator/pygen/codegen/templates/operation.py.jinja2 +0 -21
  109. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +0 -75
  110. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +0 -20
  111. package/generator/pygen/codegen/templates/operation_tools.jinja2 +0 -81
  112. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +0 -17
  113. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +0 -6
  114. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +0 -21
  115. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +0 -8
  116. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +0 -107
  117. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +0 -9
  118. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +0 -108
  119. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +0 -21
  120. package/generator/pygen/codegen/templates/patch.py.jinja2 +0 -19
  121. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +0 -1
  122. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +0 -28
  123. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +0 -10
  124. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +0 -12
  125. package/generator/pygen/codegen/templates/sample.py.jinja2 +0 -44
  126. package/generator/pygen/codegen/templates/serialization.py.jinja2 +0 -2115
  127. package/generator/pygen/codegen/templates/test.py.jinja2 +0 -50
  128. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +0 -26
  129. package/generator/pygen/codegen/templates/types.py.jinja2 +0 -8
  130. package/generator/pygen/codegen/templates/validation.py.jinja2 +0 -38
  131. package/generator/pygen/codegen/templates/vendor.py.jinja2 +0 -96
  132. package/generator/pygen/codegen/templates/version.py.jinja2 +0 -4
  133. package/generator/pygen/m2r.py +0 -65
  134. package/generator/pygen/postprocess/__init__.py +0 -183
  135. package/generator/pygen/postprocess/get_all.py +0 -19
  136. package/generator/pygen/postprocess/venvtools.py +0 -75
  137. package/generator/pygen/preprocess/__init__.py +0 -509
  138. package/generator/pygen/preprocess/helpers.py +0 -27
  139. package/generator/pygen/preprocess/python_mappings.py +0 -224
  140. package/generator/pygen/utils.py +0 -160
  141. package/generator/pygen.egg-info/PKG-INFO +0 -25
  142. package/generator/pygen.egg-info/SOURCES.txt +0 -66
  143. package/generator/pygen.egg-info/dependency_links.txt +0 -1
  144. package/generator/pygen.egg-info/requires.txt +0 -4
  145. package/generator/pygen.egg-info/top_level.txt +0 -1
  146. package/generator/setup.py +0 -55
@@ -1,142 +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 typing import Any, Dict, Optional, List, TYPE_CHECKING, TypeVar, Union
7
- from .imports import FileImport
8
- from .operation import OperationBase, Operation
9
- from .response import LROPagingResponse, LROResponse, Response
10
- from .imports import ImportType, TypingSection
11
- from .request_builder import RequestBuilder
12
- from .parameter_list import ParameterList
13
-
14
- if TYPE_CHECKING:
15
- from .code_model import CodeModel
16
- from .client import Client
17
- from . import OperationType
18
-
19
- LROResponseType = TypeVar("LROResponseType", bound=Union[LROResponse, LROPagingResponse])
20
-
21
-
22
- class LROOperationBase(OperationBase[LROResponseType]):
23
- def __init__(
24
- self,
25
- yaml_data: Dict[str, Any],
26
- code_model: "CodeModel",
27
- client: "Client",
28
- name: str,
29
- request_builder: RequestBuilder,
30
- parameters: ParameterList,
31
- responses: List[LROResponseType],
32
- exceptions: List[Response],
33
- *,
34
- overloads: Optional[List[Operation]] = None,
35
- ) -> None:
36
- super().__init__(
37
- code_model=code_model,
38
- client=client,
39
- yaml_data=yaml_data,
40
- name=name,
41
- request_builder=request_builder,
42
- parameters=parameters,
43
- responses=responses,
44
- exceptions=exceptions,
45
- overloads=overloads,
46
- )
47
- if not self.name.lstrip("_").startswith("begin"):
48
- self.name = ("_begin" if self.internal else "begin_") + self.name
49
- self.lro_options: Dict[str, Any] = self.yaml_data.get("lroOptions", {})
50
- self._initial_operation: Optional["OperationType"] = None
51
-
52
- @property
53
- def initial_operation(self) -> "OperationType":
54
- if not self._initial_operation:
55
- raise ValueError("You need to first call client.link_lro_initial_operations before accessing")
56
- return self._initial_operation
57
-
58
- @initial_operation.setter
59
- def initial_operation(self, val: "OperationType") -> None:
60
- self._initial_operation = val
61
-
62
- @property
63
- def operation_type(self) -> str:
64
- return "lro"
65
-
66
- @property
67
- def has_optional_return_type(self) -> bool:
68
- return False
69
-
70
- @property
71
- def lro_response(self) -> Optional[LROResponseType]:
72
- responses_with_bodies = [r for r in self.responses if r.type]
73
- num_response_schemas = {id(r.type.yaml_data) for r in responses_with_bodies if r.type}
74
- response = None
75
- if len(num_response_schemas) > 1:
76
- # choose the response that has a status code of 200
77
- try:
78
- response = next(r for r in responses_with_bodies if 200 in r.status_codes)
79
- except StopIteration as exc:
80
- raise ValueError(
81
- "Your swagger is invalid because you have multiple response schemas for LRO"
82
- + f" method {self.name} and none of them have a 200 status code."
83
- ) from exc
84
-
85
- elif num_response_schemas:
86
- response = responses_with_bodies[0]
87
- return response
88
-
89
- def response_type_annotation(self, **kwargs) -> str:
90
- lro_response = self.lro_response or next(iter(self.responses), None)
91
- if lro_response:
92
- return lro_response.type_annotation(**kwargs)
93
- return "None"
94
-
95
- def cls_type_annotation(self, *, async_mode: bool) -> str:
96
- """We don't want the poller to show up in ClsType, so we call super() on resposne type annotation"""
97
- return f"ClsType[{Response.type_annotation(self.responses[0], async_mode=async_mode)}]"
98
-
99
- def get_poller_with_response_type(self, async_mode: bool) -> str:
100
- return self.response_type_annotation(async_mode=async_mode)
101
-
102
- def get_poller(self, async_mode: bool) -> str:
103
- return self.responses[0].get_poller(async_mode)
104
-
105
- def get_polling_method(self, async_mode: bool) -> str:
106
- return self.responses[0].get_polling_method(async_mode)
107
-
108
- def get_base_polling_method(self, async_mode: bool) -> str:
109
- return self.responses[0].get_base_polling_method(async_mode)
110
-
111
- def get_base_polling_method_path(self, async_mode: bool) -> str:
112
- return self.responses[0].get_base_polling_method_path(async_mode)
113
-
114
- def get_no_polling_method(self, async_mode: bool) -> str:
115
- return self.responses[0].get_no_polling_method(async_mode)
116
-
117
- def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
118
- file_import = super().imports(async_mode, **kwargs)
119
- if self.abstract:
120
- return file_import
121
- if async_mode and self.code_model.options["tracing"] and self.want_tracing:
122
- file_import.add_submodule_import(
123
- "azure.core.tracing.decorator_async",
124
- "distributed_trace_async",
125
- ImportType.SDKCORE,
126
- )
127
- if (
128
- self.code_model.options["models_mode"] == "dpg"
129
- and self.lro_response
130
- and self.lro_response.type
131
- and self.lro_response.type.type == "model"
132
- ):
133
- # used in the case if initial operation returns none
134
- # but final call returns a model
135
- relative_path = "..." if async_mode else ".."
136
- file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
137
- file_import.add_submodule_import("typing", "Union", ImportType.STDLIB, TypingSection.CONDITIONAL)
138
- file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
139
- return file_import
140
-
141
-
142
- class LROOperation(LROOperationBase[LROResponse]): ...
@@ -1,32 +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 typing import Any
7
- from .imports import FileImport
8
- from .lro_operation import LROOperationBase
9
- from .paging_operation import PagingOperationBase
10
- from .response import LROPagingResponse, Response
11
-
12
-
13
- class LROPagingOperation(LROOperationBase[LROPagingResponse], PagingOperationBase[LROPagingResponse]):
14
- @property
15
- def success_status_codes(self):
16
- """The list of all successfull status code."""
17
- return [200]
18
-
19
- @property
20
- def operation_type(self) -> str:
21
- return "lropaging"
22
-
23
- def cls_type_annotation(self, *, async_mode: bool) -> str:
24
- return f"ClsType[{Response.type_annotation(self.responses[0], async_mode=async_mode)}]"
25
-
26
- def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
27
- lro_imports = LROOperationBase.imports(self, async_mode, **kwargs)
28
- paging_imports = PagingOperationBase.imports(self, async_mode, **kwargs)
29
-
30
- file_import = lro_imports
31
- file_import.merge(paging_imports)
32
- return file_import
@@ -1,362 +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 enum import Enum
7
- from collections import OrderedDict
8
- from typing import Any, Dict, List, Optional, TYPE_CHECKING, cast
9
- import sys
10
- from .utils import (
11
- add_to_pylint_disable,
12
- NAME_LENGTH_LIMIT,
13
- )
14
- from .base import BaseType
15
- from .constant_type import ConstantType
16
- from .property import Property
17
- from .imports import FileImport, ImportType, TypingSection
18
-
19
- if sys.version_info >= (3, 8):
20
- from typing import Literal
21
- else:
22
- from typing_extensions import Literal # type: ignore
23
-
24
- if TYPE_CHECKING:
25
- from .code_model import CodeModel
26
-
27
-
28
- class UsageFlags(Enum):
29
- Default = 0
30
- Input = 2
31
- Output = 4
32
- ApiVersionEnum = 8
33
- JsonMergePatch = 16
34
- MultipartFormData = 32
35
- Spread = 64
36
- Error = 128
37
- Json = 256
38
- Xml = 512
39
-
40
-
41
- def _get_properties(type: "ModelType", properties: List[Property]) -> List[Property]:
42
- for parent in type.parents:
43
- # here we're adding the properties from our parents
44
-
45
- # need to make sure that the properties we choose from our parent also don't contain
46
- # any of our own properties
47
- property_names = set([p.client_name for p in properties] + [p.client_name for p in type.properties])
48
- chosen_parent_properties = [p for p in parent.properties if p.client_name not in property_names]
49
- properties = _get_properties(parent, chosen_parent_properties) + properties
50
- return properties
51
-
52
-
53
- class ModelType(BaseType): # pylint: disable=too-many-instance-attributes, too-many-public-methods
54
- """Represents a class ready to be serialized in Python.
55
-
56
- :param str name: The name of the class.
57
- :param str description: The description of the class.
58
- :param properties: the optional properties of the class.
59
- :type properties: dict(str, str)
60
- """
61
-
62
- base: Literal["msrest", "dpg", "json"]
63
-
64
- def __init__(
65
- self,
66
- yaml_data: Dict[str, Any],
67
- code_model: "CodeModel",
68
- *,
69
- properties: Optional[List[Property]] = None,
70
- parents: Optional[List["ModelType"]] = None,
71
- discriminated_subtypes: Optional[Dict[str, "ModelType"]] = None,
72
- ) -> None:
73
- super().__init__(yaml_data=yaml_data, code_model=code_model)
74
- self.name: str = self.yaml_data["name"]
75
- self.max_properties: Optional[int] = self.yaml_data.get("maxProperties")
76
- self.min_properties: Optional[int] = self.yaml_data.get("minProperties")
77
- self.properties = properties or []
78
- self.parents = parents or []
79
- self.discriminated_subtypes = discriminated_subtypes or {}
80
- self.discriminator_value: Optional[str] = self.yaml_data.get("discriminatorValue")
81
- self._created_json_template_representation = False
82
- self._got_polymorphic_subtypes = False
83
- self.internal: bool = self.yaml_data.get("internal", False)
84
- self.snake_case_name: str = self.yaml_data["snakeCaseName"]
85
- self.cross_language_definition_id: Optional[str] = self.yaml_data.get("crossLanguageDefinitionId")
86
- self.usage: int = self.yaml_data.get("usage", UsageFlags.Input.value | UsageFlags.Output.value)
87
-
88
- @property
89
- def is_usage_output(self) -> bool:
90
- return bool(self.usage & UsageFlags.Output.value)
91
-
92
- @property
93
- def flattened_property(self) -> Optional[Property]:
94
- try:
95
- return next(p for p in self.properties if p.flatten)
96
- except StopIteration:
97
- return None
98
-
99
- @property
100
- def flattened_items(self) -> List[str]:
101
- return [
102
- item.client_name
103
- for prop in self.properties
104
- if isinstance(prop.type, ModelType) and prop.flatten
105
- for item in prop.type.properties
106
- ]
107
-
108
- @property
109
- def is_form_data(self) -> bool:
110
- return any(p.is_multipart_file_input for p in self.properties)
111
-
112
- @property
113
- def is_xml(self) -> bool:
114
- return self.yaml_data.get("isXml", False)
115
-
116
- @property
117
- def msrest_deserialization_key(self) -> str:
118
- return self.name
119
-
120
- @property
121
- def is_polymorphic(self) -> bool:
122
- return any(p.is_polymorphic for p in self.properties)
123
-
124
- def description(self, *, is_operation_file: bool = False) -> str:
125
- return "" if is_operation_file else self.yaml_data.get("description", self.name)
126
-
127
- def get_declaration(self, value: Any) -> str:
128
- return f"{self.name}()"
129
-
130
- def __repr__(self) -> str:
131
- return f"<{self.__class__.__name__} {self.name}>"
132
-
133
- @property
134
- def xml_serialization_ctxt(self) -> Optional[str]:
135
- # object schema contains _xml_map, they don't need serialization context
136
- return ""
137
-
138
- @property
139
- def xml_map_content(self) -> Optional[str]:
140
- # This is NOT an error on the super call, we use the serialization context for "xml_map",
141
- # but we don't want to write a serialization context for an object.
142
- return super().xml_serialization_ctxt
143
-
144
- @property
145
- def discriminated_subtypes_name_mapping(self) -> Dict[str, str]:
146
- return {k: v.name for k, v in self.discriminated_subtypes.items()}
147
-
148
- def get_json_template_representation(
149
- self,
150
- *,
151
- client_default_value_declaration: Optional[str] = None,
152
- ) -> Any:
153
- if self._created_json_template_representation:
154
- return "..." # do this to avoid loop
155
- self._created_json_template_representation = True
156
- if self.discriminated_subtypes:
157
- # we will instead print the discriminated subtypes
158
- self._created_json_template_representation = False
159
- return f'"{self.snake_case_name}"' if self.code_model.for_test else self.snake_case_name
160
-
161
- # don't add additional properties, because there's not really a concept of
162
- # additional properties in the template
163
- representation = {
164
- f'"{prop.wire_name}"': prop.get_json_template_representation(
165
- client_default_value_declaration=client_default_value_declaration,
166
- )
167
- for prop in [
168
- p for p in self.properties if not (p.is_discriminator or p.client_name == "additional_properties")
169
- ]
170
- }
171
- if self.discriminator and self.discriminator_value:
172
- representation[f'"{self.discriminator.wire_name}"'] = f'"{self.discriminator_value}"'
173
-
174
- # once we've finished, we want to reset created_json_template_representation to false
175
- # so we can call it again
176
- self._created_json_template_representation = False
177
- optional_keys = [f'"{p.wire_name}"' for p in self.properties if getattr(p, "optional", False)]
178
- return OrderedDict(
179
- sorted(
180
- representation.items(),
181
- key=lambda item: f"{1 if item[0] in optional_keys else 0}{item[0]}",
182
- )
183
- )
184
-
185
- def get_polymorphic_subtypes(self, polymorphic_subtypes: List["ModelType"]) -> None:
186
- is_polymorphic_subtype = self.discriminator_value and not self.discriminated_subtypes
187
- if self._got_polymorphic_subtypes:
188
- return
189
- self._got_polymorphic_subtypes = True
190
- if self.name not in (m.name for m in polymorphic_subtypes) and is_polymorphic_subtype:
191
- polymorphic_subtypes.append(self)
192
- for discriminated_subtype in self.discriminated_subtypes.values():
193
- discriminated_subtype.get_polymorphic_subtypes(polymorphic_subtypes)
194
- for property in self.properties:
195
- property.get_polymorphic_subtypes(polymorphic_subtypes)
196
- self._got_polymorphic_subtypes = False
197
-
198
- @classmethod
199
- def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel") -> "ModelType":
200
- raise ValueError(
201
- "You shouldn't call from_yaml for ModelType to avoid recursion. "
202
- "Please initial a blank ModelType, then call .fill_instance_from_yaml on the created type."
203
- )
204
-
205
- def fill_instance_from_yaml(self, yaml_data: Dict[str, Any], code_model: "CodeModel") -> None:
206
- from . import build_type
207
-
208
- self.parents = [cast(ModelType, build_type(bm, code_model)) for bm in yaml_data.get("parents", [])]
209
- properties = [Property.from_yaml(p, code_model) for p in yaml_data["properties"]]
210
- self.properties = _get_properties(self, properties)
211
- # checking to see if this is a polymorphic class
212
- self.discriminated_subtypes = {
213
- k: cast(ModelType, build_type(v, code_model))
214
- for k, v in self.yaml_data.get("discriminatedSubtypes", {}).items()
215
- }
216
-
217
- @property
218
- def has_readonly_or_constant_property(self) -> bool:
219
- return any(x.readonly or x.constant or x.visibility == ["read"] for x in self.properties)
220
-
221
- @property
222
- def discriminator(self) -> Optional[Property]:
223
- try:
224
- return next(p for p in self.properties if p.is_discriminator)
225
- except StopIteration:
226
- return None
227
-
228
- @property
229
- def discriminator_property(self) -> Optional[Property]:
230
- try:
231
- return next(
232
- p
233
- for p in self.properties
234
- if p.is_discriminator and isinstance(p.type, ConstantType) and p.type.value == self.discriminator_value
235
- )
236
- except StopIteration:
237
- return None
238
-
239
- @property
240
- def pylint_disable(self) -> str:
241
- retval: str = ""
242
- if len(self.properties) > 10:
243
- retval = add_to_pylint_disable(retval, "too-many-instance-attributes")
244
- if len(self.name) > NAME_LENGTH_LIMIT:
245
- retval = add_to_pylint_disable(retval, "name-too-long")
246
- return retval
247
-
248
- @property
249
- def init_pylint_disable(self) -> str:
250
- retval: str = ""
251
- if len(self.properties) > 23:
252
- retval = add_to_pylint_disable(retval, "too-many-locals")
253
- return retval
254
-
255
-
256
- class JSONModelType(ModelType):
257
- base = "json"
258
-
259
- def type_annotation(self, **kwargs: Any) -> str:
260
- return "ET.Element" if self.is_xml else "JSON"
261
-
262
- @property
263
- def serialization_type(self) -> str:
264
- return "object"
265
-
266
- def docstring_type(self, **kwargs: Any) -> str:
267
- return "ET.Element" if self.is_xml else "JSON"
268
-
269
- def docstring_text(self, **kwargs: Any) -> str:
270
- return "XML Element" if self.is_xml else "JSON object"
271
-
272
- @property
273
- def instance_check_template(self) -> str:
274
- return "isinstance({}, MutableMapping)"
275
-
276
- def imports(self, **kwargs: Any) -> FileImport:
277
- file_import = FileImport(self.code_model)
278
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
279
- file_import.define_mutable_mapping_type()
280
- if self.is_xml:
281
- file_import.add_submodule_import("xml.etree", "ElementTree", ImportType.STDLIB, alias="ET")
282
- return file_import
283
-
284
-
285
- class GeneratedModelType(ModelType):
286
- def type_annotation(self, **kwargs: Any) -> str:
287
- is_operation_file = kwargs.pop("is_operation_file", False)
288
- skip_quote = kwargs.get("skip_quote", False)
289
- module_name = "_models." if kwargs.get("need_module_name", True) else ""
290
- file_name = f"{self.code_model.models_filename}." if self.internal else ""
291
- retval = module_name + file_name + self.name
292
- return retval if is_operation_file or skip_quote else f'"{retval}"'
293
-
294
- def docstring_type(self, **kwargs: Any) -> str:
295
- return f"~{self.code_model.namespace}.models.{self.type_annotation(need_module_name=False, skip_quote=True)}"
296
-
297
- def docstring_text(self, **kwargs: Any) -> str:
298
- return self.name
299
-
300
- @property
301
- def type_description(self) -> str:
302
- return self.name
303
-
304
- def imports(self, **kwargs: Any) -> FileImport:
305
- file_import = super().imports(**kwargs)
306
- relative_path = kwargs.pop("relative_path", None)
307
- if relative_path:
308
- # add import for models in operations or _types file
309
- file_import.add_submodule_import(
310
- relative_path,
311
- "models",
312
- ImportType.LOCAL,
313
- alias="_models",
314
- typing_section=(TypingSection.TYPING if kwargs.get("model_typing") else TypingSection.REGULAR),
315
- )
316
- if self.is_form_data:
317
- file_import.add_submodule_import(
318
- relative_path,
319
- "_model_base",
320
- ImportType.LOCAL,
321
- typing_section=(TypingSection.TYPING if kwargs.get("model_typing") else TypingSection.REGULAR),
322
- )
323
- return file_import
324
-
325
-
326
- class MsrestModelType(GeneratedModelType):
327
- base = "msrest"
328
-
329
- @property
330
- def serialization_type(self) -> str:
331
- return self.type_annotation(skip_quote=True) if self.internal else self.name
332
-
333
- @property
334
- def instance_check_template(self) -> str:
335
- return "isinstance({}, msrest.Model)"
336
-
337
- def imports(self, **kwargs: Any) -> FileImport:
338
- file_import = super().imports(**kwargs)
339
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
340
- return file_import
341
-
342
-
343
- class DPGModelType(GeneratedModelType):
344
- base = "dpg"
345
-
346
- @property
347
- def serialization_type(self) -> str:
348
- return (
349
- self.type_annotation(skip_quote=True)
350
- if self.internal
351
- else self.type_annotation(need_module_name=False, skip_quote=True)
352
- )
353
-
354
- @property
355
- def instance_check_template(self) -> str:
356
- return "isinstance({}, _model_base.Model)"
357
-
358
- def imports(self, **kwargs: Any) -> FileImport:
359
- file_import = super().imports(**kwargs)
360
- if self.flattened_property:
361
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
362
- return file_import