@azure-tools/typespec-python 0.33.0 → 0.34.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 (147) hide show
  1. package/dist/scripts/copy-scripts.d.ts +2 -0
  2. package/dist/scripts/copy-scripts.d.ts.map +1 -0
  3. package/dist/scripts/copy-scripts.js +24 -0
  4. package/dist/scripts/copy-scripts.js.map +1 -0
  5. package/dist/src/emitter.d.ts +0 -2
  6. package/dist/src/emitter.d.ts.map +1 -1
  7. package/dist/src/emitter.js +2 -102
  8. package/dist/src/emitter.js.map +1 -1
  9. package/dist/src/index.d.ts +1 -1
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js +1 -1
  12. package/dist/src/index.js.map +1 -1
  13. package/package.json +14 -11
  14. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  15. package/scripts/copy-scripts.ts +26 -0
  16. package/scripts/eng/pylintrc +2 -1
  17. package/dist/src/code-model.d.ts +0 -4
  18. package/dist/src/code-model.d.ts.map +0 -1
  19. package/dist/src/code-model.js +0 -190
  20. package/dist/src/code-model.js.map +0 -1
  21. package/dist/src/external-process.d.ts +0 -20
  22. package/dist/src/external-process.d.ts.map +0 -1
  23. package/dist/src/external-process.js +0 -44
  24. package/dist/src/external-process.js.map +0 -1
  25. package/dist/src/http.d.ts +0 -7
  26. package/dist/src/http.d.ts.map +0 -1
  27. package/dist/src/http.js +0 -266
  28. package/dist/src/http.js.map +0 -1
  29. package/dist/src/types.d.ts +0 -36
  30. package/dist/src/types.d.ts.map +0 -1
  31. package/dist/src/types.js +0 -489
  32. package/dist/src/types.js.map +0 -1
  33. package/dist/src/utils.d.ts +0 -26
  34. package/dist/src/utils.d.ts.map +0 -1
  35. package/dist/src/utils.js +0 -151
  36. package/dist/src/utils.js.map +0 -1
  37. package/generator/LICENSE +0 -21
  38. package/generator/README.md +0 -1
  39. package/generator/dev_requirements.txt +0 -5
  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/requirements.txt +0 -12
  147. package/generator/setup.py +0 -55
@@ -1,1513 +0,0 @@
1
- # pylint: disable=too-many-lines
2
- # -------------------------------------------------------------------------
3
- # Copyright (c) Microsoft Corporation. All rights reserved.
4
- # Licensed under the MIT License. See License.txt in the project root for
5
- # license information.
6
- # --------------------------------------------------------------------------
7
- from abc import abstractmethod
8
- from collections import defaultdict
9
- from typing import Generic, List, Type, TypeVar, Dict, Union, Optional, cast
10
-
11
- from ..models import (
12
- Operation,
13
- PagingOperation,
14
- CodeModel,
15
- LROOperation,
16
- LROPagingOperation,
17
- ModelType,
18
- DictionaryType,
19
- ListType,
20
- RequestBuilder,
21
- ParameterLocation,
22
- Response,
23
- BinaryType,
24
- BodyParameter,
25
- ParameterMethodLocation,
26
- OverloadedRequestBuilder,
27
- Property,
28
- RequestBuilderType,
29
- CombinedType,
30
- JSONModelType,
31
- DPGModelType,
32
- ParameterListType,
33
- ByteArraySchema,
34
- )
35
- from .parameter_serializer import ParameterSerializer, PopKwargType
36
- from ..models.parameter_list import ParameterType
37
- from . import utils
38
- from ...utils import xml_serializable, json_serializable
39
-
40
- T = TypeVar("T")
41
- OrderedSet = Dict[T, None]
42
-
43
- BuilderType = TypeVar(
44
- "BuilderType",
45
- bound=Union[
46
- RequestBuilder,
47
- Operation,
48
- PagingOperation,
49
- LROOperation,
50
- LROPagingOperation,
51
- OverloadedRequestBuilder,
52
- ],
53
- )
54
- OperationType = TypeVar(
55
- "OperationType",
56
- bound=Union[Operation, PagingOperation, LROOperation, LROPagingOperation],
57
- )
58
-
59
-
60
- def _all_same(data: List[List[str]]) -> bool:
61
- return len(data) > 1 and all(sorted(data[0]) == sorted(data[i]) for i in range(1, len(data)))
62
-
63
-
64
- def _need_type_ignore(builder: OperationType) -> bool:
65
- for excep in builder.non_default_errors:
66
- for status_code in excep.status_codes:
67
- if status_code in (401, 404, 409, 304):
68
- return True
69
- return False
70
-
71
-
72
- def _xml_config(send_xml: bool, content_types: List[str]) -> str:
73
- if not (send_xml and "xml" in str(content_types)):
74
- return ""
75
- if len(content_types) == 1:
76
- return ", is_xml=True"
77
- return ", is_xml='xml' in str(content_type)"
78
-
79
-
80
- def _escape_str(input_str: str) -> str:
81
- replace = input_str.replace("'", "\\'")
82
- return f'"{replace}"'
83
-
84
-
85
- def _get_polymorphic_subtype_template(polymorphic_subtype: ModelType) -> List[str]:
86
- retval: List[str] = []
87
- retval.append("")
88
- retval.append(f'# JSON input template for discriminator value "{polymorphic_subtype.discriminator_value}":')
89
- subtype_template = utils.json_dumps_template(
90
- polymorphic_subtype.get_json_template_representation(),
91
- )
92
-
93
- def _get_polymorphic_parent(
94
- polymorphic_subtype: Optional[ModelType],
95
- ) -> Optional[ModelType]:
96
- if not polymorphic_subtype:
97
- return None
98
- try:
99
- return next(p for p in polymorphic_subtype.parents if p.discriminated_subtypes)
100
- except StopIteration:
101
- return None
102
-
103
- polymorphic_parent = _get_polymorphic_parent(polymorphic_subtype)
104
- while _get_polymorphic_parent(polymorphic_parent):
105
- polymorphic_parent = _get_polymorphic_parent(polymorphic_parent)
106
- retval.extend(f"{cast(ModelType, polymorphic_parent).snake_case_name} = {subtype_template}".splitlines())
107
- return retval
108
-
109
-
110
- def _serialize_grouped_body(builder: BuilderType) -> List[str]:
111
- retval: List[str] = []
112
- for grouped_parameter in builder.parameters.grouped:
113
- retval.append(f"{grouped_parameter.client_name} = None")
114
- groupers = [p for p in builder.parameters if p.grouper]
115
- for grouper in groupers:
116
- retval.append(f"if {grouper.client_name} is not None:")
117
- retval.extend(
118
- [
119
- f" {parameter} = {grouper.client_name}.{property}"
120
- for property, parameter in grouper.property_to_parameter_name.items()
121
- ]
122
- )
123
- return retval
124
-
125
-
126
- def _serialize_flattened_body(body_parameter: BodyParameter) -> List[str]:
127
- retval: List[str] = []
128
- if not body_parameter.property_to_parameter_name:
129
- raise ValueError("This method can't be called if the operation doesn't need parameter flattening")
130
-
131
- parameter_string = ", ".join(
132
- f"{property_name}={parameter_name}"
133
- for property_name, parameter_name in body_parameter.property_to_parameter_name.items()
134
- )
135
- model_type = cast(ModelType, body_parameter.type)
136
- retval.append(f"{body_parameter.client_name} = _models.{model_type.name}({parameter_string})")
137
- return retval
138
-
139
-
140
- def _serialize_json_model_body(body_parameter: BodyParameter, parameters: List[ParameterType]) -> List[str]:
141
- retval: List[str] = []
142
- if not body_parameter.property_to_parameter_name:
143
- raise ValueError("This method can't be called if the operation doesn't need parameter flattening")
144
-
145
- retval.append(f"if {body_parameter.client_name} is _Unset:")
146
- for p in parameters:
147
- if p.client_default_value is None and not p.optional and p.default_to_unset_sentinel:
148
- retval.append(f" if {p.client_name} is _Unset:")
149
- retval.append(f" raise TypeError('missing required argument: {p.client_name}')")
150
- parameter_string = ", \n".join(
151
- f'"{property_name}": {parameter_name}'
152
- for property_name, parameter_name in body_parameter.property_to_parameter_name.items()
153
- )
154
- model_type = cast(ModelType, body_parameter.type)
155
- if isinstance(model_type, CombinedType) and model_type.target_model_subtype((JSONModelType,)):
156
- model_type = model_type.target_model_subtype((JSONModelType,))
157
- retval.append(f" {body_parameter.client_name} = {{{parameter_string}}}")
158
- retval.append(f" {body_parameter.client_name} = {{")
159
- retval.append(f" k: v for k, v in {body_parameter.client_name}.items() if v is not None")
160
- retval.append(" }")
161
- return retval
162
-
163
-
164
- def _serialize_multipart_body(builder: BuilderType) -> List[str]:
165
- retval: List[str] = []
166
- body_param = builder.parameters.body_parameter
167
- # we have to construct our form data before passing to the request as well
168
- retval.append("# Construct form data")
169
- retval.append(f"_{body_param.client_name} = {{")
170
- for param in body_param.entries:
171
- retval.append(f' "{param.wire_name}": {param.client_name},')
172
- retval.append("}")
173
- return retval
174
-
175
-
176
- def _get_json_response_template_to_status_codes(
177
- builder: OperationType,
178
- ) -> Dict[str, List[str]]:
179
- retval = defaultdict(list)
180
- for response in builder.responses:
181
- json_template = response.get_json_template_representation()
182
- if not json_template:
183
- continue
184
- status_codes = [str(status_code) for status_code in response.status_codes]
185
- response_json = utils.json_dumps_template(json_template)
186
- retval[response_json].extend(status_codes)
187
- return retval
188
-
189
-
190
- def _api_version_validation(builder: OperationType) -> str:
191
- if builder.is_overload:
192
- return ""
193
- retval: List[str] = []
194
- if builder.added_on:
195
- retval.append(f' method_added_on="{builder.added_on}",')
196
- params_added_on = defaultdict(list)
197
- for parameter in builder.parameters:
198
- if parameter.added_on:
199
- params_added_on[parameter.added_on].append(parameter.client_name)
200
- if params_added_on:
201
- retval.append(f" params_added_on={dict(params_added_on)},")
202
- if retval:
203
- retval_str = "\n".join(retval)
204
- return f"@api_version_validation(\n{retval_str}\n){builder.pylint_disable}"
205
- return ""
206
-
207
-
208
- def is_json_model_type(parameters: ParameterListType) -> bool:
209
- return (
210
- parameters.has_body
211
- and parameters.body_parameter.has_json_model_type
212
- and any(p.in_flattened_body for p in parameters.parameters)
213
- )
214
-
215
-
216
- class _BuilderBaseSerializer(Generic[BuilderType]):
217
- def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
218
- self.code_model = code_model
219
- self.async_mode = async_mode
220
- self.parameter_serializer = ParameterSerializer()
221
-
222
- @property
223
- @abstractmethod
224
- def _need_self_param(self) -> bool: ...
225
-
226
- @property
227
- @abstractmethod
228
- def _function_def(self) -> str:
229
- """The def keyword for the builder we're serializing, i.e. 'def' or 'async def'"""
230
-
231
- @property
232
- @abstractmethod
233
- def _call_method(self) -> str:
234
- """How to call network calls. Await if we have to await network calls"""
235
-
236
- @property
237
- @abstractmethod
238
- def serializer_name(self) -> str:
239
- """Name of serializer"""
240
-
241
- @abstractmethod
242
- def response_docstring(self, builder: BuilderType) -> List[str]:
243
- """Response portion of the docstring"""
244
-
245
- def decorators(self, builder: BuilderType) -> List[str]:
246
- """Decorators for the method"""
247
- retval: List[str] = []
248
- if builder.is_overload:
249
- return ["@overload"]
250
- if self.code_model.options["tracing"] and builder.want_tracing:
251
- retval.append(f"@distributed_trace{'_async' if self.async_mode else ''}")
252
- return retval
253
-
254
- def _method_signature(self, builder: BuilderType) -> str:
255
- return self.parameter_serializer.serialize_method(
256
- function_def=self._function_def,
257
- method_name=builder.name,
258
- need_self_param=self._need_self_param,
259
- method_param_signatures=builder.method_signature(self.async_mode),
260
- pylint_disable=builder.pylint_disable,
261
- )
262
-
263
- def method_signature_and_response_type_annotation(
264
- self, builder: BuilderType, *, want_decorators: Optional[bool] = True
265
- ) -> str:
266
- response_type_annotation = builder.response_type_annotation(async_mode=self.async_mode)
267
- method_signature = self._method_signature(builder)
268
- decorators = self.decorators(builder)
269
- decorators_str = ""
270
- if decorators and want_decorators:
271
- decorators_str = "\n".join(decorators) + "\n"
272
- return decorators_str + utils.method_signature_and_response_type_annotation_template(
273
- method_signature=method_signature,
274
- response_type_annotation=response_type_annotation,
275
- )
276
-
277
- def description_and_summary(self, builder: BuilderType) -> List[str]:
278
- description_list: List[str] = []
279
- description_list.append(f"{builder.summary.strip() if builder.summary else builder.description.strip()}")
280
- if builder.summary and builder.description:
281
- description_list.append("")
282
- description_list.append(builder.description.strip())
283
- description_list.append("")
284
- return description_list
285
-
286
- @staticmethod
287
- def line_too_long(docs: List[str], indentation: int = 0) -> bool:
288
- return any(len(line) > (120 - indentation) for line in docs)
289
-
290
- def example_template(self, builder: BuilderType) -> List[str]:
291
- template = []
292
- if builder.abstract:
293
- return []
294
- if self._json_input_example_template(builder):
295
- template.append("")
296
- template += self._json_input_example_template(builder)
297
- return template
298
-
299
- def param_description(self, builder: BuilderType) -> List[str]:
300
- description_list: List[str] = []
301
- for param in builder.parameters.method:
302
- if (
303
- not param.in_docstring
304
- or param.hide_in_operation_signature
305
- or param.method_location == ParameterMethodLocation.KWARG
306
- ):
307
- continue
308
- description_list.extend(
309
- f":{param.description_keyword} {param.client_name}: {param.description}".replace("\n", "\n ").split(
310
- "\n"
311
- )
312
- )
313
- docstring_type = param.docstring_type(
314
- async_mode=self.async_mode,
315
- )
316
- description_list.append(f":{param.docstring_type_keyword} {param.client_name}: {docstring_type}")
317
- return description_list
318
-
319
- def param_description_and_response_docstring(self, builder: BuilderType) -> List[str]:
320
- if builder.abstract:
321
- return []
322
- return self.param_description(builder) + self.response_docstring(builder)
323
-
324
- @property
325
- @abstractmethod
326
- def _json_response_template_name(self) -> str: ...
327
-
328
- def _json_input_example_template(self, builder: BuilderType) -> List[str]:
329
- template: List[str] = []
330
- if not builder.parameters.has_body or builder.parameters.body_parameter.flattened:
331
- # No input template if now body parameter
332
- return template
333
-
334
- body_param = builder.parameters.body_parameter
335
- if not isinstance(body_param.type, (ListType, DictionaryType, ModelType, CombinedType)):
336
- return template
337
-
338
- if (
339
- isinstance(body_param.type, (ListType, DictionaryType))
340
- and self.code_model.options["models_mode"] == "msrest"
341
- ):
342
- return template
343
-
344
- if isinstance(body_param.type, ModelType) and body_param.type.base == "msrest":
345
- return template
346
-
347
- json_type = body_param.type
348
- if isinstance(body_param.type, CombinedType):
349
- target_model_type = body_param.type.target_model_subtype((JSONModelType, DPGModelType))
350
- if target_model_type is None:
351
- return template
352
- json_type = target_model_type
353
-
354
- polymorphic_subtypes: List[ModelType] = []
355
- json_type.get_polymorphic_subtypes(polymorphic_subtypes)
356
- if polymorphic_subtypes:
357
- # we just assume one kind of polymorphic body for input
358
- discriminator_name = cast(Property, polymorphic_subtypes[0].discriminator).wire_name
359
- template.append(
360
- "# The input is polymorphic. The following are possible polymorphic "
361
- f'inputs based off discriminator "{discriminator_name}":'
362
- )
363
- for idx in range(
364
- min(
365
- self.code_model.options["polymorphic_examples"],
366
- len(polymorphic_subtypes),
367
- )
368
- ):
369
- template.extend(_get_polymorphic_subtype_template(polymorphic_subtypes[idx]))
370
- template.append("")
371
- template.append("# JSON input template you can fill out and use as your body input.")
372
- json_template = utils.json_dumps_template(
373
- json_type.get_json_template_representation(),
374
- )
375
- template.extend(f"{builder.parameters.body_parameter.client_name} = {json_template}".splitlines())
376
- return template
377
-
378
- def serialize_path(self, builder: BuilderType) -> List[str]:
379
- return self.parameter_serializer.serialize_path(builder.parameters.path, self.serializer_name)
380
-
381
- @property
382
- def pipeline_name(self) -> str:
383
- return f"{'_' if self.code_model.is_azure_flavor else ''}pipeline"
384
-
385
-
386
- ############################## REQUEST BUILDERS ##############################
387
-
388
-
389
- class RequestBuilderSerializer(_BuilderBaseSerializer[RequestBuilderType]):
390
- def description_and_summary(self, builder: RequestBuilderType) -> List[str]:
391
- retval = super().description_and_summary(builder)
392
- retval += [
393
- "See https://aka.ms/azsdk/dpcodegen/python/send_request for how to incorporate this "
394
- "request builder into your code flow.",
395
- "",
396
- ]
397
- return retval
398
-
399
- @property
400
- def _call_method(self) -> str:
401
- return ""
402
-
403
- @property
404
- def serializer_name(self) -> str:
405
- return "_SERIALIZER"
406
-
407
- @property
408
- def _json_response_template_name(self) -> str:
409
- return "response.json()"
410
-
411
- @staticmethod
412
- def declare_non_inputtable_headers_queries(
413
- builder: RequestBuilderType,
414
- ) -> List[str]:
415
- def _get_value(param):
416
- declaration = param.get_declaration() if param.constant else None
417
- if param.location in [ParameterLocation.HEADER, ParameterLocation.QUERY]:
418
- kwarg_dict = "headers" if param.location == ParameterLocation.HEADER else "params"
419
- return f"_{kwarg_dict}.pop('{param.wire_name}', {declaration})"
420
- return declaration
421
-
422
- return [
423
- f"{p.client_name} = {_get_value(p)}"
424
- for p in (builder.parameters.headers + builder.parameters.query)
425
- if not p.in_method_signature
426
- ]
427
-
428
- @property
429
- def _function_def(self) -> str:
430
- return "def"
431
-
432
- @property
433
- def _need_self_param(self) -> bool:
434
- return False
435
-
436
- def response_docstring(self, builder: RequestBuilderType) -> List[str]:
437
- request_full_path = f"{self.code_model.core_library}.rest.HttpRequest"
438
- response_str = (
439
- f":return: Returns an :class:`~{request_full_path}` that you will pass to the client's "
440
- + "`send_request` method. See https://aka.ms/azsdk/dpcodegen/python/send_request for how to "
441
- + "incorporate this response into your code flow."
442
- )
443
- rtype_str = f":rtype: ~{request_full_path}"
444
- return [response_str, rtype_str]
445
-
446
- def pop_kwargs_from_signature(self, builder: RequestBuilderType) -> List[str]:
447
- return self.parameter_serializer.pop_kwargs_from_signature(
448
- builder.parameters.kwargs_to_pop,
449
- check_kwarg_dict=True,
450
- pop_headers_kwarg=(PopKwargType.CASE_INSENSITIVE if bool(builder.parameters.headers) else PopKwargType.NO),
451
- pop_params_kwarg=(PopKwargType.CASE_INSENSITIVE if bool(builder.parameters.query) else PopKwargType.NO),
452
- )
453
-
454
- @staticmethod
455
- def create_http_request(builder: RequestBuilderType) -> List[str]:
456
- retval = ["return HttpRequest("]
457
- retval.append(f' method="{builder.method}",')
458
- retval.append(" url=_url,")
459
- if builder.parameters.query:
460
- retval.append(" params=_params,")
461
- if builder.parameters.headers:
462
- retval.append(" headers=_headers,")
463
- if builder.parameters.has_body and builder.parameters.body_parameter.in_method_signature:
464
- body_param = builder.parameters.body_parameter
465
- if body_param.constant or body_param.method_location != ParameterMethodLocation.KWARG:
466
- # we only need to pass it through if it's not a kwarg or it's a popped kwarg
467
- retval.append(
468
- f" {builder.parameters.body_parameter.client_name}="
469
- f"{builder.parameters.body_parameter.client_name},"
470
- )
471
- retval.append(" **kwargs")
472
- retval.append(")")
473
- return retval
474
-
475
- def serialize_headers(self, builder: RequestBuilderType) -> List[str]:
476
- headers = [
477
- h
478
- for h in builder.parameters.headers
479
- if not builder.has_form_data_body or h.wire_name.lower() != "content-type"
480
- ]
481
- retval = ["# Construct headers"] if headers else []
482
- for header in headers:
483
- retval.extend(
484
- self.parameter_serializer.serialize_query_header(
485
- header,
486
- "headers",
487
- self.serializer_name,
488
- self.code_model.is_legacy,
489
- )
490
- )
491
- return retval
492
-
493
- def serialize_query(self, builder: RequestBuilderType) -> List[str]:
494
- retval = ["# Construct parameters"]
495
- for parameter in builder.parameters.query:
496
- retval.extend(
497
- self.parameter_serializer.serialize_query_header(
498
- parameter,
499
- "params",
500
- self.serializer_name,
501
- self.code_model.is_legacy,
502
- )
503
- )
504
- return retval
505
-
506
- def construct_url(self, builder: RequestBuilderType) -> str:
507
- if any(o for o in ["low_level_client", "version_tolerant"] if self.code_model.options.get(o)):
508
- url_value = _escape_str(builder.url)
509
- else:
510
- url_value = f'kwargs.pop("template_url", {_escape_str(builder.url)})'
511
- return f"_url = {url_value}{' # pylint: disable=line-too-long' if len(url_value) > 114 else ''}"
512
-
513
-
514
- ############################## NORMAL OPERATIONS ##############################
515
-
516
-
517
- class _OperationSerializer(_BuilderBaseSerializer[OperationType]):
518
- def description_and_summary(self, builder: OperationType) -> List[str]:
519
- retval = super().description_and_summary(builder)
520
- if builder.deprecated:
521
- retval.append(".. warning::")
522
- retval.append(" This method is deprecated")
523
- retval.append("")
524
- if builder.external_docs and builder.external_docs.get("url"):
525
- retval.append(".. seealso::")
526
- retval.append(f" - {builder.external_docs['url']}")
527
- retval.append("")
528
- return retval
529
-
530
- @property
531
- def _json_response_template_name(self) -> str:
532
- return "response"
533
-
534
- def example_template(self, builder: OperationType) -> List[str]:
535
- if self.code_model.options["models_mode"] in ("msrest", "dpg"):
536
- return []
537
- retval = super().example_template(builder)
538
- for response in builder.responses:
539
- polymorphic_subtypes: List[ModelType] = []
540
- if not response.type:
541
- continue
542
- response.get_polymorphic_subtypes(polymorphic_subtypes)
543
- if polymorphic_subtypes:
544
- # we just assume one kind of polymorphic body for input
545
- discriminator_name = cast(Property, polymorphic_subtypes[0].discriminator).wire_name
546
- retval.append("")
547
- retval.append(
548
- "# The response is polymorphic. The following are possible polymorphic "
549
- f'responses based off discriminator "{discriminator_name}":'
550
- )
551
- for idx in range(
552
- min(
553
- self.code_model.options["polymorphic_examples"],
554
- len(polymorphic_subtypes),
555
- )
556
- ):
557
- retval.extend(_get_polymorphic_subtype_template(polymorphic_subtypes[idx]))
558
-
559
- if _get_json_response_template_to_status_codes(builder):
560
- retval.append("")
561
- for (
562
- response_body,
563
- status_codes,
564
- ) in _get_json_response_template_to_status_codes(builder).items():
565
- retval.append("# response body for status code(s): {}".format(", ".join(status_codes)))
566
- retval.extend(f"{self._json_response_template_name} == {response_body}".splitlines())
567
- return retval
568
-
569
- def make_pipeline_call(self, builder: OperationType) -> List[str]:
570
- retval = []
571
- type_ignore = self.async_mode and builder.group_name == "" # is in a mixin
572
- if builder.stream_value is True and not self.code_model.options["version_tolerant"]:
573
- retval.append("_decompress = kwargs.pop('decompress', True)")
574
- retval.extend(
575
- [
576
- f"_stream = {builder.stream_value}",
577
- f"pipeline_response: PipelineResponse = {self._call_method}self._client.{self.pipeline_name}.run( "
578
- + f"{'# type: ignore' if type_ignore else ''} # pylint: disable=protected-access",
579
- " _request,",
580
- " stream=_stream,",
581
- " **kwargs",
582
- ")",
583
- ]
584
- )
585
- return retval
586
-
587
- @property
588
- def _function_def(self) -> str:
589
- return "async def" if self.async_mode else "def"
590
-
591
- @property
592
- def _need_self_param(self) -> bool:
593
- return True
594
-
595
- @property
596
- def serializer_name(self) -> str:
597
- return "self._serialize"
598
-
599
- def decorators(self, builder: OperationType) -> List[str]:
600
- """Decorators for the method"""
601
- retval = super().decorators(builder)
602
- if _api_version_validation(builder):
603
- retval.append(_api_version_validation(builder))
604
- return retval
605
-
606
- def pop_kwargs_from_signature(self, builder: OperationType) -> List[str]:
607
- kwargs_to_pop = builder.parameters.kwargs_to_pop
608
- kwargs = self.parameter_serializer.pop_kwargs_from_signature(
609
- kwargs_to_pop,
610
- check_kwarg_dict=True,
611
- pop_headers_kwarg=(
612
- PopKwargType.CASE_INSENSITIVE
613
- if builder.has_kwargs_to_pop_with_default(kwargs_to_pop, ParameterLocation.HEADER) # type: ignore
614
- else PopKwargType.SIMPLE
615
- ),
616
- pop_params_kwarg=(
617
- PopKwargType.CASE_INSENSITIVE
618
- if builder.has_kwargs_to_pop_with_default(kwargs_to_pop, ParameterLocation.QUERY) # type: ignore
619
- else PopKwargType.SIMPLE
620
- ),
621
- check_client_input=not self.code_model.options["multiapi"],
622
- operation_name=f"('{builder.name}')" if builder.group_name == "" else "",
623
- )
624
- for p in builder.parameters.parameters:
625
- if p.hide_in_operation_signature:
626
- kwargs.append(f'{p.client_name} = kwargs.pop("{p.client_name}", None)')
627
- cls_annotation = builder.cls_type_annotation(async_mode=self.async_mode)
628
- pylint_disable = ""
629
- if any(x.startswith("_") for x in cls_annotation.split(".")):
630
- pylint_disable = " # pylint: disable=protected-access"
631
- kwargs.append(f"cls: {cls_annotation} = kwargs.pop({pylint_disable}\n 'cls', None\n)")
632
- return kwargs
633
-
634
- def response_docstring(self, builder: OperationType) -> List[str]:
635
- response_str = f":return: {builder.response_docstring_text(async_mode=self.async_mode)}"
636
- rtype_str = f":rtype: {builder.response_docstring_type(async_mode=self.async_mode)}"
637
- return [
638
- response_str,
639
- rtype_str,
640
- f":raises ~{self.code_model.core_library}.exceptions.HttpResponseError:",
641
- ]
642
-
643
- def _serialize_body_parameter(self, builder: OperationType) -> List[str]:
644
- """We need to serialize params if they're not meant to be streamed in.
645
-
646
- This function serializes the body params that need to be serialized.
647
- """
648
- retval: List[str] = []
649
- body_param = builder.parameters.body_parameter
650
- if body_param.is_form_data:
651
- model_type = cast(
652
- ModelType,
653
- (
654
- body_param.type.target_model_subtype((JSONModelType, DPGModelType))
655
- if isinstance(body_param.type, CombinedType)
656
- else body_param.type
657
- ),
658
- )
659
- file_fields = [p.wire_name for p in model_type.properties if p.is_multipart_file_input]
660
- data_fields = [p.wire_name for p in model_type.properties if not p.is_multipart_file_input]
661
- retval.extend(
662
- [
663
- "_body = (",
664
- f" {body_param.client_name}.as_dict()",
665
- f" if isinstance({body_param.client_name}, _model_base.Model) else",
666
- f" {body_param.client_name}",
667
- ")",
668
- f"_file_fields: List[str] = {file_fields}",
669
- f"_data_fields: List[str] = {data_fields}",
670
- "_files, _data = prepare_multipart_form_data(_body, _file_fields, _data_fields)",
671
- ]
672
- )
673
- return retval
674
-
675
- body_kwarg_name = builder.request_builder.parameters.body_parameter.client_name
676
- send_xml = builder.parameters.body_parameter.type.is_xml
677
- xml_serialization_ctxt = body_param.type.xml_serialization_ctxt if send_xml else None
678
- ser_ctxt_name = "serialization_ctxt"
679
- if xml_serialization_ctxt and self.code_model.options["models_mode"]:
680
- retval.append(f'{ser_ctxt_name} = {{"xml": {{{xml_serialization_ctxt}}}}}')
681
- if self.code_model.options["models_mode"] == "msrest":
682
- is_xml_cmd = _xml_config(send_xml, builder.parameters.body_parameter.content_types)
683
- serialization_ctxt_cmd = f", {ser_ctxt_name}={ser_ctxt_name}" if xml_serialization_ctxt else ""
684
- create_body_call = (
685
- f"_{body_kwarg_name} = self._serialize.body({body_param.client_name}, "
686
- f"'{body_param.type.serialization_type}'{is_xml_cmd}{serialization_ctxt_cmd})"
687
- )
688
- elif self.code_model.options["models_mode"] == "dpg":
689
- if json_serializable(body_param.default_content_type):
690
- if hasattr(body_param.type, "encode") and body_param.type.encode: # type: ignore
691
- create_body_call = (
692
- f"_{body_kwarg_name} = json.dumps({body_param.client_name}, "
693
- "cls=SdkJSONEncoder, exclude_readonly=True, "
694
- f"format='{body_param.type.encode}') # type: ignore" # type: ignore
695
- )
696
- else:
697
- create_body_call = (
698
- f"_{body_kwarg_name} = json.dumps({body_param.client_name}, "
699
- "cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore"
700
- )
701
- elif xml_serializable(body_param.default_content_type):
702
- create_body_call = f"_{body_kwarg_name} = _get_element({body_param.client_name})"
703
- else:
704
- create_body_call = f"_{body_kwarg_name} = {body_param.client_name}"
705
- else:
706
- create_body_call = f"_{body_kwarg_name} = {body_param.client_name}"
707
- if body_param.optional:
708
- retval.append(f"if {body_param.client_name} is not None:")
709
- retval.append(" " + create_body_call)
710
- retval.append("else:")
711
- retval.append(f" _{body_kwarg_name} = None")
712
- else:
713
- retval.append(create_body_call)
714
- return retval
715
-
716
- def _create_body_parameter(
717
- self,
718
- builder: OperationType,
719
- ) -> List[str]:
720
- """Create the body parameter before we pass it as either json or content to the request builder"""
721
- retval = []
722
- body_param = builder.parameters.body_parameter
723
- if body_param.entries:
724
- return _serialize_multipart_body(builder)
725
- body_kwarg_name = builder.request_builder.parameters.body_parameter.client_name
726
- body_param_type = body_param.type
727
- if isinstance(body_param_type, BinaryType) or (
728
- isinstance(body_param.type, ByteArraySchema) and body_param.default_content_type != "application/json"
729
- ):
730
- retval.append(f"_{body_kwarg_name} = {body_param.client_name}")
731
- if (
732
- not body_param.default_content_type
733
- and not next(p for p in builder.parameters if p.wire_name.lower() == "content-type").optional
734
- ):
735
- content_types = "'" + "', '".join(body_param.content_types) + "'"
736
- retval.extend(
737
- [
738
- "if not content_type:",
739
- f' raise TypeError("Missing required keyword-only argument: content_type. '
740
- f'Known values are:" + "{content_types}")',
741
- ]
742
- )
743
- else:
744
- retval.extend(self._serialize_body_parameter(builder))
745
- return retval
746
-
747
- def _initialize_overloads(self, builder: OperationType, is_paging: bool = False) -> List[str]:
748
- retval: List[str] = []
749
- # For paging, we put body parameter in local place outside `prepare_request`
750
- if is_paging:
751
- return retval
752
- same_content_type = len(set(o.parameters.body_parameter.default_content_type for o in builder.overloads)) == 1
753
- if same_content_type:
754
- default_content_type = builder.overloads[0].parameters.body_parameter.default_content_type
755
- retval.append(f'content_type = content_type or "{default_content_type}"')
756
- client_names = [
757
- overload.request_builder.parameters.body_parameter.client_name for overload in builder.overloads
758
- ]
759
- for v in sorted(set(client_names), key=client_names.index):
760
- retval.append(f"_{v} = None")
761
- try:
762
- # if there is a binary overload, we do a binary check first.
763
- binary_overload = cast(
764
- OperationType,
765
- next((o for o in builder.overloads if isinstance(o.parameters.body_parameter.type, BinaryType))),
766
- )
767
- binary_body_param = binary_overload.parameters.body_parameter
768
- retval.append(f"if {binary_body_param.type.instance_check_template.format(binary_body_param.client_name)}:")
769
- if binary_body_param.default_content_type and not same_content_type:
770
- retval.append(f' content_type = content_type or "{binary_body_param.default_content_type}"')
771
- retval.extend(f" {l}" for l in self._create_body_parameter(binary_overload))
772
- retval.append("else:")
773
- other_overload = cast(
774
- OperationType,
775
- next((o for o in builder.overloads if not isinstance(o.parameters.body_parameter.type, BinaryType))),
776
- )
777
- retval.extend(f" {l}" for l in self._create_body_parameter(other_overload))
778
- if other_overload.parameters.body_parameter.default_content_type and not same_content_type:
779
- retval.append(
780
- " content_type = content_type or "
781
- f'"{other_overload.parameters.body_parameter.default_content_type}"'
782
- )
783
- except StopIteration:
784
- for idx, overload in enumerate(builder.overloads):
785
- if_statement = "if" if idx == 0 else "elif"
786
- body_param = overload.parameters.body_parameter
787
- retval.append(
788
- f"{if_statement} {body_param.type.instance_check_template.format(body_param.client_name)}:"
789
- )
790
- if body_param.default_content_type and not same_content_type:
791
- retval.append(f' content_type = content_type or "{body_param.default_content_type}"')
792
- retval.extend(f" {l}" for l in self._create_body_parameter(cast(OperationType, overload)))
793
- return retval
794
-
795
- def _create_request_builder_call(
796
- self,
797
- builder: OperationType,
798
- request_builder: RequestBuilderType,
799
- is_next_request: bool = False,
800
- ) -> List[str]:
801
- retval: List[str] = []
802
- if self.code_model.options["builders_visibility"] == "embedded":
803
- request_path_name = request_builder.name
804
- else:
805
- group_name = request_builder.group_name
806
- request_path_name = "rest{}.{}".format(
807
- ("_" + group_name) if group_name else "",
808
- request_builder.name,
809
- )
810
- retval.append(f"_request = {request_path_name}(")
811
- for parameter in request_builder.parameters.method:
812
- if parameter.location == ParameterLocation.BODY:
813
- # going to pass in body later based off of overloads
814
- continue
815
- if (
816
- is_next_request
817
- and builder.operation_type == "paging"
818
- and not bool(builder.next_request_builder) # type: ignore
819
- and parameter.location == ParameterLocation.QUERY
820
- ):
821
- # if we don't want to reformat query parameters for next link calls
822
- # in paging operations with a single swagger operation defintion,
823
- # we skip passing query params when building the next request
824
- continue
825
- type_ignore = (
826
- parameter.grouped_by
827
- and parameter.client_default_value is not None
828
- and next(p for p in builder.parameters if p.grouper and p.client_name == parameter.grouped_by).optional
829
- )
830
- retval.append(
831
- f" {parameter.client_name}={parameter.name_in_high_level_operation},"
832
- f"{' # type: ignore' if type_ignore else ''}"
833
- )
834
- if builder.parameters.has_body and builder.parameters.body_parameter.entries:
835
- # this is for legacy
836
- client_name = builder.parameters.body_parameter.client_name
837
- retval.append(f" {client_name}=_{client_name},")
838
- elif request_builder.has_form_data_body:
839
- retval.append(" files=_files,")
840
- retval.append(" data=_data,")
841
- elif request_builder.overloads:
842
- seen_body_params = set()
843
- for overload in request_builder.overloads:
844
- body_param = overload.parameters.body_parameter
845
- if body_param.client_name in seen_body_params:
846
- continue
847
- seen_body_params.add(body_param.client_name)
848
-
849
- retval.append(f" {body_param.client_name}={body_param.name_in_high_level_operation},")
850
- elif request_builder.parameters.has_body:
851
- body_param = request_builder.parameters.body_parameter
852
- retval.append(f" {body_param.client_name}={body_param.name_in_high_level_operation},")
853
- retval.append(" headers=_headers,")
854
- retval.append(" params=_params,")
855
- retval.append(")")
856
- return retval
857
-
858
- def _postprocess_http_request(self, builder: OperationType, template_url: Optional[str] = None) -> List[str]:
859
- retval: List[str] = []
860
- if builder.parameters.path:
861
- retval.extend(self.serialize_path(builder))
862
- url_to_format = "_request.url"
863
- if self.code_model.options["version_tolerant"] and template_url:
864
- url_to_format = template_url
865
- retval.append(
866
- "_request.url = self._client.format_url({}{})".format(
867
- url_to_format,
868
- ", **path_format_arguments" if builder.parameters.path else "",
869
- )
870
- )
871
- return retval
872
-
873
- def _call_request_builder_helper(
874
- self,
875
- builder: OperationType,
876
- request_builder: RequestBuilderType,
877
- template_url: Optional[str] = None,
878
- is_next_request: bool = False,
879
- is_paging: bool = False,
880
- ) -> List[str]:
881
- retval = []
882
- if builder.parameters.grouped:
883
- # request builders don't allow grouped parameters, so we group them before making the call
884
- retval.extend(_serialize_grouped_body(builder))
885
- if builder.parameters.has_body and builder.parameters.body_parameter.flattened:
886
- # unflatten before passing to request builder as well
887
- retval.extend(_serialize_flattened_body(builder.parameters.body_parameter))
888
- if is_json_model_type(builder.parameters):
889
- retval.extend(_serialize_json_model_body(builder.parameters.body_parameter, builder.parameters.parameters))
890
- if builder.has_form_data_body:
891
- retval.extend(self._create_body_parameter(builder))
892
- elif builder.overloads:
893
- # we are only dealing with two overloads. If there are three, we generate an abstract operation
894
- retval.extend(self._initialize_overloads(builder, is_paging=is_paging))
895
- elif builder.parameters.has_body:
896
- # non-overloaded body
897
- retval.extend(self._create_body_parameter(builder))
898
- retval.append("")
899
- retval.extend(self._create_request_builder_call(builder, request_builder, is_next_request))
900
- retval.extend(self._postprocess_http_request(builder, template_url))
901
- return retval
902
-
903
- def call_request_builder(self, builder: OperationType, is_paging: bool = False) -> List[str]:
904
- return self._call_request_builder_helper(builder, builder.request_builder, is_paging=is_paging)
905
-
906
- def response_headers_and_deserialization(
907
- self,
908
- builder: OperationType,
909
- response: Response,
910
- ) -> List[str]:
911
- return self.response_headers(response) + self.response_deserialization(builder, response)
912
-
913
- def response_headers(self, response: Response) -> List[str]:
914
- retval: List[str] = [
915
- (
916
- f"response_headers['{response_header.wire_name}']=self._deserialize("
917
- f"'{response_header.serialization_type}', response.headers.get('{response_header.wire_name}'))"
918
- )
919
- for response_header in response.headers
920
- ]
921
- if response.headers:
922
- retval.append("")
923
- return retval
924
-
925
- def response_deserialization(
926
- self,
927
- builder: OperationType,
928
- response: Response,
929
- ) -> List[str]:
930
- retval: List[str] = []
931
- deserialize_code: List[str] = []
932
- stream_logic = True
933
- if builder.has_stream_response:
934
- if isinstance(response.type, ByteArraySchema):
935
- deserialized = f"{'await ' if self.async_mode else ''}response.read()"
936
- else:
937
- stream_logic = False
938
- if self.code_model.options["version_tolerant"]:
939
- deserialized = "response.iter_bytes()"
940
- else:
941
- deserialized = (
942
- f"response.stream_download(self._client.{self.pipeline_name}, decompress=_decompress)"
943
- )
944
- deserialize_code.append(f"deserialized = {deserialized}")
945
- elif response.type:
946
- pylint_disable = ""
947
- if isinstance(response.type, ModelType) and response.type.internal:
948
- pylint_disable = " # pylint: disable=protected-access"
949
- if self.code_model.options["models_mode"] == "msrest":
950
- deserialize_code.append("deserialized = self._deserialize(")
951
- deserialize_code.append(f" '{response.serialization_type}',{pylint_disable}")
952
- deserialize_code.append(" pipeline_response.http_response")
953
- deserialize_code.append(")")
954
- elif self.code_model.options["models_mode"] == "dpg":
955
- if builder.has_stream_response:
956
- deserialize_code.append("deserialized = response.content")
957
- else:
958
- format_filed = (
959
- f', format="{response.type.encode}"'
960
- if isinstance(response.type, ByteArraySchema)
961
- and response.default_content_type == "application/json"
962
- else ""
963
- )
964
- response_attr = "json" if json_serializable(str(response.default_content_type)) else "text"
965
- deserialize_func = "_deserialize"
966
- if xml_serializable(str(response.default_content_type)):
967
- deserialize_func = "_deserialize_xml"
968
- deserialize_code.append(f"deserialized = {deserialize_func}(")
969
- deserialize_code.append(
970
- f" {response.type.type_annotation(is_operation_file=True)},{pylint_disable}"
971
- )
972
- deserialize_code.append(f" response.{response_attr}(){response.result_property}{format_filed}")
973
- deserialize_code.append(")")
974
-
975
- else:
976
- deserialized_value = "ET.fromstring(response.text())" if response.type.is_xml else "response.json()"
977
- deserialize_code.append("if response.content:")
978
- deserialize_code.append(f" deserialized = {deserialized_value}")
979
- deserialize_code.append("else:")
980
- deserialize_code.append(" deserialized = None")
981
- if len(deserialize_code) > 0:
982
- if builder.expose_stream_keyword and stream_logic:
983
- retval.append("if _stream:")
984
- retval.append(" deserialized = response.iter_bytes()")
985
- retval.append("else:")
986
- retval.extend([f" {dc}" for dc in deserialize_code])
987
- else:
988
- retval.extend(deserialize_code)
989
- return retval
990
-
991
- def handle_error_response(self, builder: OperationType) -> List[str]:
992
- async_await = "await " if self.async_mode else ""
993
- retval = [f"if response.status_code not in {str(builder.success_status_codes)}:"]
994
- response_read = [
995
- " try:",
996
- f" {async_await}response.read() # Load the body in memory and close the socket",
997
- " except (StreamConsumedError, StreamClosedError):",
998
- " pass",
999
- ]
1000
- if builder.stream_value is True: # _stream is True so no need to judge it
1001
- retval.extend(response_read)
1002
- elif isinstance(builder.stream_value, str): # _stream is not sure, so we need to judge it
1003
- retval.append(" if _stream:")
1004
- retval.extend([f" {l}" for l in response_read])
1005
- type_ignore = " # type: ignore" if _need_type_ignore(builder) else ""
1006
- retval.append(
1007
- f" map_error(status_code=response.status_code, response=response, error_map=error_map){type_ignore}"
1008
- )
1009
- error_model = ""
1010
- if builder.default_error_deserialization and self.code_model.options["models_mode"]:
1011
- if self.code_model.options["models_mode"] == "dpg":
1012
- retval.append(f" error = _deserialize({builder.default_error_deserialization}, response.json())")
1013
- else:
1014
- retval.append(
1015
- f" error = self._deserialize.failsafe_deserialize({builder.default_error_deserialization}, "
1016
- "pipeline_response)"
1017
- )
1018
- error_model = ", model=error"
1019
- retval.append(
1020
- " raise HttpResponseError(response=response{}{})".format(
1021
- error_model,
1022
- (", error_format=ARMErrorFormat" if self.code_model.options["azure_arm"] else ""),
1023
- )
1024
- )
1025
- return retval
1026
-
1027
- def handle_response(self, builder: OperationType) -> List[str]:
1028
- retval: List[str] = ["response = pipeline_response.http_response"]
1029
- retval.append("")
1030
- retval.extend(self.handle_error_response(builder))
1031
- retval.append("")
1032
- if builder.has_optional_return_type:
1033
- retval.append("deserialized = None")
1034
- if builder.any_response_has_headers:
1035
- retval.append("response_headers = {}")
1036
- if builder.has_response_body or builder.any_response_has_headers: # pylint: disable=too-many-nested-blocks
1037
- if len(builder.responses) > 1:
1038
- status_codes, res_headers, res_deserialization = [], [], []
1039
- for status_code in builder.success_status_codes:
1040
- response = builder.get_response_from_status(status_code)
1041
- if response.headers or response.type:
1042
- status_codes.append(status_code)
1043
- res_headers.append(self.response_headers(response))
1044
- res_deserialization.append(self.response_deserialization(builder, response))
1045
-
1046
- is_headers_same = _all_same(res_headers)
1047
- is_deserialization_same = _all_same(res_deserialization)
1048
- if is_deserialization_same:
1049
- if is_headers_same:
1050
- retval.extend(res_headers[0])
1051
- retval.extend(res_deserialization[0])
1052
- retval.append("")
1053
- else:
1054
- for status_code, headers in zip(status_codes, res_headers):
1055
- if headers:
1056
- retval.append(f"if response.status_code == {status_code}:")
1057
- retval.extend([f" {line}" for line in headers])
1058
- retval.append("")
1059
- retval.extend(res_deserialization[0])
1060
- retval.append("")
1061
- else:
1062
- for status_code, headers, deserialization in zip(status_codes, res_headers, res_deserialization):
1063
- retval.append(f"if response.status_code == {status_code}:")
1064
- retval.extend([f" {line}" for line in headers])
1065
- retval.extend([f" {line}" for line in deserialization])
1066
- retval.append("")
1067
- else:
1068
- retval.extend(self.response_headers_and_deserialization(builder, builder.responses[0]))
1069
- retval.append("")
1070
- if builder.has_optional_return_type or self.code_model.options["models_mode"]:
1071
- deserialized = "deserialized"
1072
- else:
1073
- deserialized = f"cast({builder.response_type_annotation(async_mode=self.async_mode)}, deserialized)"
1074
- retval.append("if cls:")
1075
- retval.append(
1076
- " return cls(pipeline_response, {}, {}){}".format(
1077
- deserialized if builder.has_response_body else "None",
1078
- "response_headers" if builder.any_response_has_headers else "{}",
1079
- " # type: ignore",
1080
- )
1081
- )
1082
- if builder.has_response_body and any(
1083
- response.is_stream_response or response.type for response in builder.responses
1084
- ):
1085
- retval.append("")
1086
- retval.append(f"return {deserialized} # type: ignore")
1087
- if builder.request_builder.method == "HEAD" and self.code_model.options["head_as_boolean"]:
1088
- retval.append("return 200 <= response.status_code <= 299")
1089
- return retval
1090
-
1091
- def error_map(self, builder: OperationType) -> List[str]:
1092
- retval = [
1093
- "error_map: MutableMapping[int, Type[HttpResponseError]] = { # pylint: disable=unsubscriptable-object"
1094
- ]
1095
- if builder.non_default_errors:
1096
- if not 401 in builder.non_default_error_status_codes:
1097
- retval.append(" 401: ClientAuthenticationError,")
1098
- if not 404 in builder.non_default_error_status_codes:
1099
- retval.append(" 404: ResourceNotFoundError,")
1100
- if not 409 in builder.non_default_error_status_codes:
1101
- retval.append(" 409: ResourceExistsError,")
1102
- if not 304 in builder.non_default_error_status_codes:
1103
- retval.append(" 304: ResourceNotModifiedError,")
1104
- for excep in builder.non_default_errors:
1105
- error_model_str = ""
1106
- if isinstance(excep.type, ModelType):
1107
- if self.code_model.options["models_mode"] == "msrest":
1108
- error_model_str = (
1109
- f", model=self._deserialize(" f"_models.{excep.type.serialization_type}, response)"
1110
- )
1111
- elif self.code_model.options["models_mode"] == "dpg":
1112
- error_model_str = f", model=_deserialize(_models.{excep.type.name}, response.json())"
1113
- error_format_str = ", error_format=ARMErrorFormat" if self.code_model.options["azure_arm"] else ""
1114
- for status_code in excep.status_codes:
1115
- if status_code == 401:
1116
- retval.append(
1117
- " 401: cast(Type[HttpResponseError], "
1118
- "lambda response: ClientAuthenticationError(response=response"
1119
- f"{error_model_str}{error_format_str})),"
1120
- )
1121
- elif status_code == 404:
1122
- retval.append(
1123
- " 404: cast(Type[HttpResponseError], "
1124
- "lambda response: ResourceNotFoundError(response=response"
1125
- f"{error_model_str}{error_format_str})),"
1126
- )
1127
- elif status_code == 409:
1128
- retval.append(
1129
- " 409: cast(Type[HttpResponseError], "
1130
- "lambda response: ResourceExistsError(response=response"
1131
- f"{error_model_str}{error_format_str})),"
1132
- )
1133
- elif status_code == 304:
1134
- retval.append(
1135
- " 304: cast(Type[HttpResponseError], "
1136
- "lambda response: ResourceNotModifiedError(response=response"
1137
- f"{error_model_str}{error_format_str})),"
1138
- )
1139
- elif not error_model_str and not error_format_str:
1140
- retval.append(f" {status_code}: HttpResponseError,")
1141
- else:
1142
- retval.append(
1143
- f" {status_code}: cast(Type[HttpResponseError], "
1144
- "lambda response: HttpResponseError(response=response"
1145
- f"{error_model_str}{error_format_str})),"
1146
- )
1147
- else:
1148
- retval.append(
1149
- " 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError, "
1150
- "304: ResourceNotModifiedError"
1151
- )
1152
- retval.append("}")
1153
- if builder.has_etag:
1154
- retval.extend(
1155
- [
1156
- "if match_condition == MatchConditions.IfNotModified:",
1157
- " error_map[412] = ResourceModifiedError",
1158
- "elif match_condition == MatchConditions.IfPresent:",
1159
- " error_map[412] = ResourceNotFoundError",
1160
- "elif match_condition == MatchConditions.IfMissing:",
1161
- " error_map[412] = ResourceExistsError",
1162
- ]
1163
- )
1164
- retval.append("error_map.update(kwargs.pop('error_map', {}) or {})")
1165
- return retval
1166
-
1167
- @property
1168
- def _call_method(self) -> str:
1169
- return "await " if self.async_mode else ""
1170
-
1171
-
1172
- class OperationSerializer(_OperationSerializer[Operation]): ...
1173
-
1174
-
1175
- ############################## PAGING OPERATIONS ##############################
1176
-
1177
- PagingOperationType = TypeVar("PagingOperationType", bound=Union[PagingOperation, LROPagingOperation])
1178
-
1179
-
1180
- class _PagingOperationSerializer(_OperationSerializer[PagingOperationType]):
1181
- def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
1182
- # for pylint reasons need to redefine init
1183
- # probably because inheritance is going too deep
1184
- super().__init__(code_model, async_mode)
1185
- self.code_model = code_model
1186
- self.async_mode = async_mode
1187
- self.parameter_serializer = ParameterSerializer()
1188
-
1189
- def serialize_path(self, builder: PagingOperationType) -> List[str]:
1190
- return self.parameter_serializer.serialize_path(builder.parameters.path, self.serializer_name)
1191
-
1192
- def decorators(self, builder: PagingOperationType) -> List[str]:
1193
- """Decorators for the method"""
1194
- retval: List[str] = []
1195
- if builder.is_overload:
1196
- return ["@overload"]
1197
- if self.code_model.options["tracing"] and builder.want_tracing:
1198
- retval.append("@distributed_trace")
1199
- if _api_version_validation(builder):
1200
- retval.append(_api_version_validation(builder))
1201
- return retval
1202
-
1203
- def call_next_link_request_builder(self, builder: PagingOperationType) -> List[str]:
1204
- if builder.next_request_builder:
1205
- request_builder = builder.next_request_builder
1206
- template_url = None
1207
- else:
1208
- request_builder = builder.request_builder
1209
- template_url = "next_link"
1210
-
1211
- request_builder = builder.next_request_builder or builder.request_builder
1212
- if builder.next_request_builder:
1213
- return self._call_request_builder_helper(
1214
- builder,
1215
- request_builder,
1216
- template_url=template_url,
1217
- is_next_request=True,
1218
- )
1219
- retval: List[str] = []
1220
- query_str = ""
1221
- next_link_str = "next_link"
1222
- try:
1223
- api_version_param = next(
1224
- p for p in builder.client.parameters if p.is_api_version and p.location == ParameterLocation.QUERY
1225
- )
1226
- retval.append("# make call to next link with the client's api-version")
1227
- retval.append("_parsed_next_link = urllib.parse.urlparse(next_link)")
1228
- retval.extend(
1229
- [
1230
- "_next_request_params = case_insensitive_dict({",
1231
- " key: [urllib.parse.quote(v) for v in value]"
1232
- " for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items()"
1233
- "})",
1234
- ]
1235
- )
1236
- api_version = (
1237
- "self._api_version"
1238
- if self.code_model.options["multiapi"] and builder.group_name
1239
- else api_version_param.full_client_name
1240
- )
1241
- retval.append(f'_next_request_params["api-version"] = {api_version}')
1242
- query_str = ", params=_next_request_params"
1243
- next_link_str = "urllib.parse.urljoin(next_link, _parsed_next_link.path)"
1244
- except StopIteration:
1245
- pass
1246
-
1247
- retval.append(f'_request = HttpRequest("GET", {next_link_str}{query_str})')
1248
- retval.extend(self._postprocess_http_request(builder, "_request.url"))
1249
-
1250
- return retval
1251
-
1252
- def _prepare_request_callback(self, builder: PagingOperationType) -> List[str]:
1253
- retval = self._initialize_overloads(builder)
1254
- retval.append("def prepare_request(next_link=None):")
1255
- retval.append(" if not next_link:")
1256
- retval.extend([f" {line}" for line in self.call_request_builder(builder, is_paging=True)])
1257
- retval.append("")
1258
- retval.append(" else:")
1259
- retval.extend([f" {line}" for line in self.call_next_link_request_builder(builder)])
1260
- if not builder.next_request_builder and self.code_model.is_legacy:
1261
- retval.append(' _request.method = "GET"')
1262
- else:
1263
- retval.append("")
1264
- retval.append(" return _request")
1265
- return retval
1266
-
1267
- @property
1268
- def _function_def(self) -> str:
1269
- return "def"
1270
-
1271
- def _extract_data_callback(self, builder: PagingOperationType) -> List[str]:
1272
- retval = [f"{'async ' if self.async_mode else ''}def extract_data(pipeline_response):"]
1273
- response = builder.responses[0]
1274
- deserialized = "pipeline_response.http_response.json()"
1275
- if self.code_model.options["models_mode"] == "msrest":
1276
- suffix = ".http_response" if hasattr(builder, "initial_operation") else ""
1277
- deserialize_type = response.serialization_type
1278
- pylint_disable = " # pylint: disable=protected-access"
1279
- if isinstance(response.type, ModelType) and not response.type.internal:
1280
- deserialize_type = f'"{response.serialization_type}"'
1281
- pylint_disable = ""
1282
- deserialized = (
1283
- f"self._deserialize(\n {deserialize_type},{pylint_disable}\n pipeline_response{suffix}\n)"
1284
- )
1285
- retval.append(f" deserialized = {deserialized}")
1286
- elif self.code_model.options["models_mode"] == "dpg":
1287
- # we don't want to generate paging models for DPG
1288
- retval.append(f" deserialized = {deserialized}")
1289
- else:
1290
- retval.append(f" deserialized = {deserialized}")
1291
- item_name = builder.item_name
1292
- access = f".{item_name}" if self.code_model.options["models_mode"] == "msrest" else f'["{item_name}"]'
1293
- list_of_elem_deserialized = ""
1294
- if self.code_model.options["models_mode"] == "dpg":
1295
- item_type = builder.item_type.type_annotation(is_operation_file=True)
1296
- list_of_elem_deserialized = f"_deserialize({item_type}, deserialized{access})"
1297
- else:
1298
- list_of_elem_deserialized = f"deserialized{access}"
1299
- retval.append(f" list_of_elem = {list_of_elem_deserialized}")
1300
- retval.append(" if cls:")
1301
- retval.append(" list_of_elem = cls(list_of_elem) # type: ignore")
1302
-
1303
- continuation_token_name = builder.continuation_token_name
1304
- if not continuation_token_name:
1305
- cont_token_property = "None"
1306
- elif self.code_model.options["models_mode"] == "msrest":
1307
- cont_token_property = f"deserialized.{continuation_token_name} or None"
1308
- else:
1309
- cont_token_property = f'deserialized.get("{continuation_token_name}") or None'
1310
- list_type = "AsyncList" if self.async_mode else "iter"
1311
- retval.append(f" return {cont_token_property}, {list_type}(list_of_elem)")
1312
- return retval
1313
-
1314
- def _get_next_callback(self, builder: PagingOperationType) -> List[str]:
1315
- retval = [f"{'async ' if self.async_mode else ''}def get_next(next_link=None):"]
1316
- retval.append(" _request = prepare_request(next_link)")
1317
- retval.append("")
1318
- retval.extend([f" {l}" for l in self.make_pipeline_call(builder)])
1319
- retval.append(" response = pipeline_response.http_response")
1320
- retval.append("")
1321
- retval.extend([f" {line}" for line in self.handle_error_response(builder)])
1322
- retval.append("")
1323
- retval.append(" return pipeline_response")
1324
- return retval
1325
-
1326
- def set_up_params_for_pager(self, builder: PagingOperationType) -> List[str]:
1327
- retval = []
1328
- retval.extend(self.error_map(builder))
1329
- retval.extend(self._prepare_request_callback(builder))
1330
- retval.append("")
1331
- retval.extend(self._extract_data_callback(builder))
1332
- retval.append("")
1333
- retval.extend(self._get_next_callback(builder))
1334
- return retval
1335
-
1336
-
1337
- class PagingOperationSerializer(_PagingOperationSerializer[PagingOperation]): ...
1338
-
1339
-
1340
- ############################## LRO OPERATIONS ##############################
1341
-
1342
- LROOperationType = TypeVar("LROOperationType", bound=Union[LROOperation, LROPagingOperation])
1343
-
1344
-
1345
- class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
1346
- def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
1347
- # for pylint reasons need to redefine init
1348
- # probably because inheritance is going too deep
1349
- super().__init__(code_model, async_mode)
1350
- self.code_model = code_model
1351
- self.async_mode = async_mode
1352
- self.parameter_serializer = ParameterSerializer()
1353
-
1354
- def serialize_path(self, builder: LROOperationType) -> List[str]:
1355
- return self.parameter_serializer.serialize_path(builder.parameters.path, self.serializer_name)
1356
-
1357
- def initial_call(self, builder: LROOperationType) -> List[str]:
1358
- retval = [
1359
- f"polling: Union[bool, {builder.get_base_polling_method(self.async_mode)}] = kwargs.pop('polling', True)",
1360
- ]
1361
- retval.append("lro_delay = kwargs.pop(")
1362
- retval.append(" 'polling_interval',")
1363
- retval.append(" self._config.polling_interval")
1364
- retval.append(")")
1365
- retval.append("cont_token: Optional[str] = kwargs.pop('continuation_token', None)")
1366
- retval.append("if cont_token is None:")
1367
- retval.append(
1368
- f" raw_result = {self._call_method}self.{builder.initial_operation.name}("
1369
- f"{'' if any(rsp.type for rsp in builder.initial_operation.responses) else ' # type: ignore'}"
1370
- )
1371
- retval.extend(
1372
- [f" {parameter.client_name}={parameter.client_name}," for parameter in builder.parameters.method]
1373
- )
1374
- retval.append(" cls=lambda x,y,z: x,")
1375
- retval.append(" headers=_headers,")
1376
- retval.append(" params=_params,")
1377
- retval.append(" **kwargs")
1378
- retval.append(" )")
1379
- retval.append(f" {'await ' if self.async_mode else ''}raw_result.http_response.read() # type: ignore")
1380
-
1381
- retval.append("kwargs.pop('error_map', None)")
1382
- return retval
1383
-
1384
- def return_lro_poller(self, builder: LROOperationType) -> List[str]:
1385
- retval = []
1386
- lro_options_str = (
1387
- "lro_options={'final-state-via': '" + builder.lro_options["final-state-via"] + "'},"
1388
- if builder.lro_options
1389
- else ""
1390
- )
1391
- path_format_arguments_str = ""
1392
- if builder.parameters.path:
1393
- path_format_arguments_str = "path_format_arguments=path_format_arguments,"
1394
- retval.extend(self.serialize_path(builder))
1395
- retval.append("")
1396
- retval.extend(
1397
- [
1398
- "if polling is True:",
1399
- f" polling_method: {builder.get_base_polling_method(self.async_mode)} "
1400
- + f"= cast({builder.get_base_polling_method(self.async_mode)}, "
1401
- f"{builder.get_polling_method(self.async_mode)}(",
1402
- " lro_delay,",
1403
- f" {lro_options_str}",
1404
- f" {path_format_arguments_str}",
1405
- " **kwargs",
1406
- "))",
1407
- ]
1408
- )
1409
- retval.append(
1410
- f"elif polling is False: polling_method = cast({builder.get_base_polling_method(self.async_mode)}, "
1411
- f"{builder.get_no_polling_method(self.async_mode)}())"
1412
- )
1413
- retval.append("else: polling_method = polling")
1414
- retval.append("if cont_token:")
1415
- retval.append(f" return {builder.get_poller_with_response_type(self.async_mode)}.from_continuation_token(")
1416
- retval.append(" polling_method=polling_method,")
1417
- retval.append(" continuation_token=cont_token,")
1418
- retval.append(" client=self._client,")
1419
- retval.append(" deserialization_callback=get_long_running_output")
1420
- retval.append(" )")
1421
- retval.append(f"return {builder.get_poller_with_response_type(self.async_mode)}(")
1422
- retval.append(" self._client, raw_result, get_long_running_output, polling_method # type: ignore")
1423
- retval.append(" )")
1424
- return retval
1425
-
1426
- def get_long_running_output(self, builder: LROOperationType) -> List[str]:
1427
- pylint_disable = ""
1428
- if not builder.lro_response:
1429
- pylint_disable = " # pylint: disable=inconsistent-return-statements"
1430
- retval = [f"def get_long_running_output(pipeline_response):{pylint_disable}"]
1431
- if builder.lro_response:
1432
- if builder.lro_response.headers:
1433
- retval.append(" response_headers = {}")
1434
- if (
1435
- not self.code_model.options["models_mode"]
1436
- or self.code_model.options["models_mode"] == "dpg"
1437
- or builder.lro_response.headers
1438
- ):
1439
- retval.append(" response = pipeline_response.http_response")
1440
- retval.extend(
1441
- [f" {line}" for line in self.response_headers_and_deserialization(builder, builder.lro_response)]
1442
- )
1443
- retval.append(" if cls:")
1444
- retval.append(
1445
- " return cls(pipeline_response, {}, {}){}".format(
1446
- ("deserialized" if builder.lro_response and builder.lro_response.type else "None"),
1447
- ("response_headers" if builder.lro_response and builder.lro_response.headers else "{}"),
1448
- " # type: ignore",
1449
- )
1450
- )
1451
- if builder.lro_response and builder.lro_response.type:
1452
- retval.append(" return deserialized")
1453
- return retval
1454
-
1455
-
1456
- class LROOperationSerializer(_LROOperationSerializer[LROOperation]): ...
1457
-
1458
-
1459
- ############################## LRO PAGING OPERATIONS ##############################
1460
-
1461
-
1462
- class LROPagingOperationSerializer(
1463
- _LROOperationSerializer[LROPagingOperation],
1464
- _PagingOperationSerializer[LROPagingOperation],
1465
- ):
1466
- @property
1467
- def _call_method(self) -> str:
1468
- return "await " if self.async_mode else ""
1469
-
1470
- @property
1471
- def _function_def(self) -> str:
1472
- return "async def" if self.async_mode else "def"
1473
-
1474
- def get_long_running_output(self, builder: LROPagingOperation) -> List[str]:
1475
- retval = ["def get_long_running_output(pipeline_response):"]
1476
- retval.append(f" {self._function_def} internal_get_next(next_link=None):")
1477
- retval.append(" if next_link is None:")
1478
- retval.append(" return pipeline_response")
1479
- retval.append(f" return {self._call_method}get_next(next_link)")
1480
- retval.append("")
1481
- retval.append(f" return {builder.get_pager(self.async_mode)}(")
1482
- retval.append(" internal_get_next, extract_data")
1483
- retval.append(" )")
1484
- return retval
1485
-
1486
- def decorators(self, builder: LROPagingOperation) -> List[str]:
1487
- """Decorators for the method"""
1488
- return _LROOperationSerializer.decorators(self, builder) # type: ignore
1489
-
1490
-
1491
- def get_operation_serializer(
1492
- builder: Operation,
1493
- code_model,
1494
- async_mode: bool,
1495
- ) -> Union[
1496
- OperationSerializer,
1497
- PagingOperationSerializer,
1498
- LROOperationSerializer,
1499
- LROPagingOperationSerializer,
1500
- ]:
1501
- retcls: Union[
1502
- Type[OperationSerializer],
1503
- Type[PagingOperationSerializer],
1504
- Type[LROOperationSerializer],
1505
- Type[LROPagingOperationSerializer],
1506
- ] = OperationSerializer
1507
- if builder.operation_type == "lropaging":
1508
- retcls = LROPagingOperationSerializer
1509
- elif builder.operation_type == "lro":
1510
- retcls = LROOperationSerializer
1511
- elif builder.operation_type == "paging":
1512
- retcls = PagingOperationSerializer
1513
- return retcls(code_model, async_mode)