@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,530 +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 itertools import chain
7
- from typing import (
8
- Dict,
9
- List,
10
- Any,
11
- Optional,
12
- Union,
13
- TYPE_CHECKING,
14
- Generic,
15
- TypeVar,
16
- cast,
17
- Sequence,
18
- )
19
-
20
- from .request_builder_parameter import RequestBuilderParameter
21
-
22
- from .utils import OrderedSet, add_to_pylint_disable, NAME_LENGTH_LIMIT
23
- from .base_builder import BaseBuilder
24
- from .imports import FileImport, ImportType, TypingSection
25
- from .response import (
26
- Response,
27
- PagingResponse,
28
- LROResponse,
29
- LROPagingResponse,
30
- get_response,
31
- )
32
- from .parameter import (
33
- BodyParameter,
34
- Parameter,
35
- ParameterLocation,
36
- )
37
- from .parameter_list import ParameterList
38
- from .model_type import ModelType
39
- from .base import BaseType
40
- from .request_builder import OverloadedRequestBuilder, RequestBuilder
41
- from ...utils import xml_serializable, json_serializable
42
-
43
- if TYPE_CHECKING:
44
- from .code_model import CodeModel
45
- from .client import Client
46
- from . import OperationType
47
-
48
- ResponseType = TypeVar(
49
- "ResponseType",
50
- bound=Union[Response, PagingResponse, LROResponse, LROPagingResponse],
51
- )
52
-
53
-
54
- def is_internal(target: Optional[BaseType]) -> bool:
55
- return isinstance(target, ModelType) and target.base == "dpg" and target.internal
56
-
57
-
58
- class OperationBase( # pylint: disable=too-many-public-methods,too-many-instance-attributes
59
- Generic[ResponseType], BaseBuilder[ParameterList, List["Operation"]]
60
- ):
61
- def __init__(
62
- self,
63
- yaml_data: Dict[str, Any],
64
- code_model: "CodeModel",
65
- client: "Client",
66
- name: str,
67
- request_builder: Union[RequestBuilder, OverloadedRequestBuilder],
68
- parameters: ParameterList,
69
- responses: List[ResponseType],
70
- exceptions: List[Response],
71
- *,
72
- overloads: Optional[List["Operation"]] = None,
73
- ) -> None:
74
- super().__init__(
75
- code_model=code_model,
76
- client=client,
77
- yaml_data=yaml_data,
78
- name=name,
79
- parameters=parameters,
80
- overloads=overloads,
81
- )
82
- self.overloads: List["Operation"] = overloads or []
83
- self.responses = responses
84
- self.request_builder = request_builder
85
- self.deprecated = False
86
- self.exceptions = exceptions
87
- self.is_lro_initial_operation: bool = self.yaml_data.get("isLroInitialOperation", False)
88
- self.include_documentation: bool = not self.is_lro_initial_operation
89
- self.internal: bool = self.yaml_data.get("internal", False)
90
- if self.internal:
91
- self.name = "_" + self.name
92
- self.has_etag: bool = self.yaml_data.get("hasEtag", False)
93
- self.cross_language_definition_id: Optional[str] = self.yaml_data.get("crossLanguageDefinitionId")
94
-
95
- @property
96
- def stream_value(self) -> Union[str, bool]:
97
- return (
98
- f'kwargs.pop("stream", {self.has_stream_response})'
99
- if self.expose_stream_keyword and self.has_response_body
100
- else self.has_stream_response
101
- )
102
-
103
- @property
104
- def has_form_data_body(self):
105
- return self.parameters.has_form_data_body
106
-
107
- @property
108
- def expose_stream_keyword(self) -> bool:
109
- return self.yaml_data.get("exposeStreamKeyword", False)
110
-
111
- @property
112
- def operation_type(self) -> str:
113
- return "operation"
114
-
115
- @property
116
- def has_optional_return_type(self) -> bool:
117
- """Has optional return type if there are multiple successful response types where some have
118
- bodies and some are None
119
- """
120
- # means if we have at least one successful response with a body and one without
121
- successful_response_with_body = any(r for r in self.responses if r.type)
122
- successful_response_without_body = any(r for r in self.responses if not r.type)
123
- return successful_response_with_body and successful_response_without_body
124
-
125
- def response_type_annotation(self, **kwargs) -> str:
126
- if self.code_model.options["head_as_boolean"] and self.request_builder.method.lower() == "head":
127
- return "bool"
128
- response_type_annotations: OrderedSet[str] = {
129
- response.type_annotation(**kwargs): None for response in self.responses if response.type
130
- }
131
- response_str = ", ".join(response_type_annotations.keys())
132
- if len(response_type_annotations) > 1:
133
- return f"Union[{response_str}]"
134
- if self.has_optional_return_type:
135
- return f"Optional[{response_str}]"
136
- if self.responses:
137
- return self.responses[0].type_annotation(**kwargs)
138
- return "None"
139
-
140
- @property
141
- def pylint_disable(self) -> str:
142
- retval: str = ""
143
- if self.response_type_annotation(async_mode=False) == "None":
144
- # doesn't matter if it's async or not
145
- retval = add_to_pylint_disable(retval, "inconsistent-return-statements")
146
- try:
147
- if any(is_internal(r.type) for r in self.responses) or is_internal(self.parameters.body_parameter.type):
148
- retval = add_to_pylint_disable(retval, "protected-access")
149
- except ValueError:
150
- pass
151
- if len(self.name) > NAME_LENGTH_LIMIT:
152
- retval = add_to_pylint_disable(retval, "name-too-long")
153
- return retval
154
-
155
- def cls_type_annotation(self, *, async_mode: bool) -> str:
156
- if self.request_builder.method.lower() == "head" and self.code_model.options["head_as_boolean"]:
157
- return "ClsType[None]"
158
- return f"ClsType[{self.response_type_annotation(async_mode=async_mode)}]"
159
-
160
- def _response_docstring_helper(self, attr_name: str, **kwargs: Any) -> str:
161
- responses_with_body = [r for r in self.responses if r.type]
162
- if self.request_builder.method.lower() == "head" and self.code_model.options["head_as_boolean"]:
163
- return "bool"
164
- if responses_with_body:
165
- response_docstring_values: OrderedSet[str] = {
166
- getattr(response, attr_name)(**kwargs): None for response in responses_with_body
167
- }
168
- retval = " or ".join(response_docstring_values.keys())
169
- if self.has_optional_return_type:
170
- retval += " or None"
171
- return retval
172
- if self.responses:
173
- return getattr(self.responses[0], attr_name)(**kwargs)
174
- return "None"
175
-
176
- def response_docstring_text(self, **kwargs) -> str:
177
- retval = self._response_docstring_helper("docstring_text", **kwargs)
178
- if not self.code_model.options["version_tolerant"]:
179
- retval += " or the result of cls(response)"
180
- if self.code_model.options["models_mode"] == "dpg" and any(
181
- isinstance(r.type, ModelType) for r in self.responses
182
- ):
183
- r = next(r for r in self.responses if isinstance(r.type, ModelType))
184
- item_type = getattr(r, "item_type", getattr(r, "type"))
185
- if item_type:
186
- type_name = item_type.docstring_text(**kwargs)
187
- retval += f". The {type_name} is compatible with MutableMapping"
188
- return retval
189
-
190
- def response_docstring_type(self, **kwargs) -> str:
191
- return self._response_docstring_helper("docstring_type", **kwargs)
192
-
193
- @property
194
- def has_response_body(self) -> bool:
195
- """Tell if at least one response has a body."""
196
- return any(response.type for response in self.responses)
197
-
198
- @property
199
- def any_response_has_headers(self) -> bool:
200
- return any(response.headers for response in self.responses)
201
-
202
- @property
203
- def default_error_deserialization(self) -> Optional[str]:
204
- default_exceptions = [e for e in self.exceptions if "default" in e.status_codes and e.type]
205
- if not default_exceptions:
206
- return None
207
- excep_schema = default_exceptions[0].type
208
- if isinstance(excep_schema, ModelType):
209
- return excep_schema.type_annotation(skip_quote=True)
210
- # in this case, it's just an AnyType
211
- return "'object'"
212
-
213
- @property
214
- def non_default_errors(self) -> List[Response]:
215
- return [e for e in self.exceptions if "default" not in e.status_codes]
216
-
217
- @property
218
- def non_default_error_status_codes(self) -> List[Union[str, int]]:
219
- """Actually returns all of the status codes from exceptions (besides default)"""
220
- return list(chain.from_iterable([error.status_codes for error in self.non_default_errors]))
221
-
222
- def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport: # pylint: disable=unused-argument
223
- file_import = FileImport(self.code_model)
224
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
225
-
226
- response_types = [r.type_annotation(async_mode=async_mode, operation=self) for r in self.responses if r.type]
227
- if len(set(response_types)) > 1:
228
- file_import.add_submodule_import("typing", "Union", ImportType.STDLIB, TypingSection.CONDITIONAL)
229
- if self.added_on:
230
- file_import.add_submodule_import(
231
- f"{'.' if async_mode else ''}.._validation",
232
- "api_version_validation",
233
- ImportType.LOCAL,
234
- )
235
- return file_import
236
-
237
- def imports_for_multiapi(self, async_mode: bool, **kwargs: Any) -> FileImport:
238
- if self.abstract:
239
- return FileImport(self.code_model)
240
- file_import = self._imports_shared(async_mode, **kwargs)
241
- for param in self.parameters.method:
242
- file_import.merge(
243
- param.imports_for_multiapi(
244
- async_mode,
245
- operation=self,
246
- **kwargs,
247
- )
248
- )
249
- for response in self.responses:
250
- file_import.merge(response.imports_for_multiapi(async_mode=async_mode, operation=self, **kwargs))
251
- if self.code_model.options["models_mode"]:
252
- for exception in self.exceptions:
253
- file_import.merge(exception.imports_for_multiapi(async_mode=async_mode, operation=self, **kwargs))
254
- return file_import
255
-
256
- @staticmethod
257
- def has_kwargs_to_pop_with_default(
258
- kwargs_to_pop: List[
259
- Union[
260
- Parameter,
261
- RequestBuilderParameter,
262
- BodyParameter,
263
- ]
264
- ],
265
- location: ParameterLocation,
266
- ) -> bool:
267
- return any(
268
- (kwarg.client_default_value or kwarg.optional) and kwarg.location == location for kwarg in kwargs_to_pop
269
- )
270
-
271
- @property
272
- def need_validation(self) -> bool:
273
- """Whether we need parameter / operation validation. For API version."""
274
- return bool(self.added_on) or any(p for p in self.parameters if p.added_on)
275
-
276
- def get_request_builder_import(
277
- self,
278
- request_builder: Union[RequestBuilder, OverloadedRequestBuilder],
279
- async_mode: bool,
280
- ) -> FileImport:
281
- """Helper method to get a request builder import."""
282
- file_import = FileImport(self.code_model)
283
- if self.code_model.options["builders_visibility"] != "embedded":
284
- group_name = request_builder.group_name
285
- rest_import_path = "..." if async_mode else ".."
286
- if group_name:
287
- file_import.add_submodule_import(
288
- f"{rest_import_path}{self.code_model.rest_layer_name}",
289
- group_name,
290
- import_type=ImportType.LOCAL,
291
- alias=f"rest_{group_name}",
292
- )
293
- else:
294
- file_import.add_submodule_import(
295
- rest_import_path,
296
- self.code_model.rest_layer_name,
297
- import_type=ImportType.LOCAL,
298
- alias="rest",
299
- )
300
- if self.code_model.options["builders_visibility"] == "embedded" and async_mode:
301
- file_import.add_submodule_import(
302
- f"...{self.code_model.operations_folder_name}.{self.filename}",
303
- request_builder.name,
304
- import_type=ImportType.LOCAL,
305
- )
306
- return file_import
307
-
308
- def imports( # pylint: disable=too-many-branches, disable=too-many-statements
309
- self, async_mode: bool, **kwargs: Any
310
- ) -> FileImport:
311
- if self.abstract:
312
- return FileImport(self.code_model)
313
- file_import = self._imports_shared(async_mode, **kwargs)
314
-
315
- for param in self.parameters.method:
316
- file_import.merge(
317
- param.imports(
318
- async_mode,
319
- operation=self,
320
- **kwargs,
321
- )
322
- )
323
- for response in self.responses:
324
- file_import.merge(response.imports(async_mode=async_mode, operation=self, **kwargs))
325
- if self.code_model.options["models_mode"]:
326
- for exception in self.exceptions:
327
- file_import.merge(exception.imports(async_mode=async_mode, **kwargs))
328
-
329
- if self.parameters.has_body and self.parameters.body_parameter.flattened:
330
- file_import.merge(self.parameters.body_parameter.type.imports(operation=self, **kwargs))
331
- if not async_mode:
332
- for param in self.parameters.headers:
333
- if param.wire_name.lower() == "repeatability-request-id":
334
- file_import.add_import("uuid", ImportType.STDLIB)
335
- elif param.wire_name.lower() == "repeatability-first-sent":
336
- file_import.add_import("datetime", ImportType.STDLIB)
337
-
338
- # Exceptions
339
- errors = [
340
- "map_error",
341
- "HttpResponseError",
342
- "ClientAuthenticationError",
343
- "ResourceNotFoundError",
344
- "ResourceExistsError",
345
- "ResourceNotModifiedError",
346
- ]
347
- if self.stream_value:
348
- errors.extend(["StreamConsumedError", "StreamClosedError"])
349
- for error in errors:
350
- file_import.add_submodule_import("exceptions", error, ImportType.SDKCORE)
351
- if self.code_model.options["azure_arm"]:
352
- file_import.add_submodule_import("azure.mgmt.core.exceptions", "ARMErrorFormat", ImportType.SDKCORE)
353
- file_import.add_submodule_import(
354
- "typing",
355
- "Type",
356
- ImportType.STDLIB,
357
- )
358
- file_import.add_mutable_mapping_import()
359
- if self.non_default_error_status_codes:
360
- file_import.add_submodule_import(
361
- "typing",
362
- "cast",
363
- ImportType.STDLIB,
364
- )
365
-
366
- if self.has_kwargs_to_pop_with_default(
367
- self.parameters.kwargs_to_pop, ParameterLocation.HEADER # type: ignore
368
- ) or self.has_kwargs_to_pop_with_default(
369
- self.parameters.kwargs_to_pop, ParameterLocation.QUERY # type: ignore
370
- ):
371
- file_import.add_submodule_import(
372
- "utils",
373
- "case_insensitive_dict",
374
- ImportType.SDKCORE,
375
- )
376
- if self.deprecated:
377
- file_import.add_import("warnings", ImportType.STDLIB)
378
-
379
- relative_path = "..." if async_mode else ".."
380
- if self.has_etag:
381
- file_import.add_submodule_import(
382
- "exceptions",
383
- "ResourceModifiedError",
384
- ImportType.SDKCORE,
385
- )
386
- if not async_mode:
387
- file_import.add_submodule_import(f"{relative_path}_vendor", "prep_if_match", ImportType.LOCAL)
388
- file_import.add_submodule_import(f"{relative_path}_vendor", "prep_if_none_match", ImportType.LOCAL)
389
- if async_mode:
390
- file_import.add_submodule_import(
391
- "rest",
392
- "AsyncHttpResponse",
393
- ImportType.SDKCORE,
394
- )
395
- else:
396
- file_import.add_submodule_import(
397
- "rest",
398
- "HttpResponse",
399
- ImportType.SDKCORE,
400
- )
401
- if self.code_model.options["builders_visibility"] == "embedded" and not async_mode:
402
- file_import.merge(self.request_builder.imports())
403
- file_import.add_submodule_import(
404
- f"{'' if self.code_model.is_azure_flavor else 'runtime.'}pipeline",
405
- "PipelineResponse",
406
- ImportType.SDKCORE,
407
- )
408
- file_import.add_submodule_import("rest", "HttpRequest", ImportType.SDKCORE)
409
- file_import.add_submodule_import("typing", "Callable", ImportType.STDLIB, TypingSection.CONDITIONAL)
410
- file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB, TypingSection.CONDITIONAL)
411
- file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB, TypingSection.CONDITIONAL)
412
- file_import.add_submodule_import("typing", "TypeVar", ImportType.STDLIB, TypingSection.CONDITIONAL)
413
- if self.code_model.options["tracing"] and self.want_tracing and not async_mode:
414
- file_import.add_submodule_import(
415
- "azure.core.tracing.decorator",
416
- "distributed_trace",
417
- ImportType.SDKCORE,
418
- )
419
- file_import.merge(self.get_request_builder_import(self.request_builder, async_mode))
420
- if self.overloads:
421
- file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
422
- if self.code_model.options["models_mode"] == "dpg":
423
- if self.parameters.has_body:
424
- if self.has_form_data_body:
425
- file_import.add_submodule_import(relative_path, "_model_base", ImportType.LOCAL)
426
- elif xml_serializable(self.parameters.body_parameter.default_content_type):
427
- file_import.add_submodule_import(
428
- f"{relative_path}_model_base",
429
- "_get_element",
430
- ImportType.LOCAL,
431
- )
432
- elif json_serializable(self.parameters.body_parameter.default_content_type):
433
- file_import.add_submodule_import(
434
- f"{relative_path}_model_base",
435
- "SdkJSONEncoder",
436
- ImportType.LOCAL,
437
- )
438
- file_import.add_import("json", ImportType.STDLIB)
439
- if any(xml_serializable(str(r.default_content_type)) for r in self.responses):
440
- file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize_xml", ImportType.LOCAL)
441
- elif any(r.type for r in self.responses):
442
- file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
443
- if self.default_error_deserialization or self.non_default_errors:
444
- file_import.add_submodule_import(f"{relative_path}_model_base", "_deserialize", ImportType.LOCAL)
445
- return file_import
446
-
447
- def get_response_from_status(self, status_code: Optional[Union[str, int]]) -> ResponseType:
448
- try:
449
- return next(r for r in self.responses if status_code in r.status_codes)
450
- except StopIteration as exc:
451
- raise ValueError(f"Incorrect status code {status_code}, operation {self.name}") from exc
452
-
453
- @property
454
- def success_status_codes(self) -> Sequence[Union[str, int]]:
455
- """The list of all successfull status code."""
456
- return sorted([code for response in self.responses for code in response.status_codes])
457
-
458
- @property
459
- def filename(self) -> str:
460
- basename = self.group_name
461
- if basename == "":
462
- # in a mixin
463
- basename = self.code_model.clients[0].legacy_filename
464
-
465
- if basename == "operations" or self.code_model.options["combine_operation_files"]:
466
- return "_operations"
467
- return f"_{basename}_operations"
468
-
469
- @property
470
- def has_stream_response(self) -> bool:
471
- return any(r.is_stream_response for r in self.responses)
472
-
473
- @classmethod
474
- def get_request_builder(cls, yaml_data: Dict[str, Any], client: "Client"):
475
- return client.lookup_request_builder(id(yaml_data))
476
-
477
- @classmethod
478
- def from_yaml(
479
- cls,
480
- yaml_data: Dict[str, Any],
481
- code_model: "CodeModel",
482
- client: "Client",
483
- ):
484
- name = yaml_data["name"]
485
- request_builder = cls.get_request_builder(yaml_data, client)
486
- responses = [cast(ResponseType, get_response(r, code_model)) for r in yaml_data["responses"]]
487
- exceptions = [Response.from_yaml(e, code_model) for e in yaml_data["exceptions"]]
488
- parameter_list = ParameterList.from_yaml(yaml_data, code_model)
489
- overloads = [cls.from_yaml(overload, code_model, client) for overload in yaml_data.get("overloads", [])]
490
-
491
- return cls(
492
- yaml_data=yaml_data,
493
- code_model=code_model,
494
- client=client,
495
- request_builder=request_builder,
496
- name=name,
497
- parameters=parameter_list,
498
- overloads=overloads,
499
- responses=responses,
500
- exceptions=exceptions,
501
- )
502
-
503
-
504
- class Operation(OperationBase[Response]):
505
- def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
506
- file_import = super().imports(async_mode, **kwargs)
507
- if self.abstract:
508
- return file_import
509
- if async_mode and self.code_model.options["tracing"] and self.want_tracing:
510
- file_import.add_submodule_import(
511
- "azure.core.tracing.decorator_async",
512
- "distributed_trace_async",
513
- ImportType.SDKCORE,
514
- )
515
- if self.has_response_body and not self.has_optional_return_type and not self.code_model.options["models_mode"]:
516
- file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
517
-
518
- return file_import
519
-
520
-
521
- def get_operation(yaml_data: Dict[str, Any], code_model: "CodeModel", client: "Client") -> "OperationType":
522
- if yaml_data["discriminator"] == "lropaging":
523
- from .lro_paging_operation import LROPagingOperation as OperationCls
524
- elif yaml_data["discriminator"] == "lro":
525
- from .lro_operation import LROOperation as OperationCls # type: ignore
526
- elif yaml_data["discriminator"] == "paging":
527
- from .paging_operation import PagingOperation as OperationCls # type: ignore
528
- else:
529
- from . import Operation as OperationCls # type: ignore
530
- return OperationCls.from_yaml(yaml_data, code_model, client)