@typespec/http-client-python 0.4.3 → 0.5.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.
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +85 -24
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/lib.d.ts +1 -0
- package/dist/emitter/lib.d.ts.map +1 -1
- package/dist/emitter/lib.js +1 -0
- package/dist/emitter/lib.js.map +1 -1
- package/dist/emitter/run-python3.d.ts +2 -0
- package/dist/emitter/run-python3.d.ts.map +1 -0
- package/dist/emitter/run-python3.js +19 -0
- package/dist/emitter/run-python3.js.map +1 -0
- package/dist/emitter/system-requirements.d.ts +17 -0
- package/dist/emitter/system-requirements.d.ts.map +1 -0
- package/dist/emitter/system-requirements.js +167 -0
- package/dist/emitter/system-requirements.js.map +1 -0
- package/emitter/src/emitter.ts +88 -23
- package/emitter/src/lib.ts +2 -0
- package/emitter/src/run-python3.ts +20 -0
- package/emitter/src/system-requirements.ts +261 -0
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate.ts +16 -4
- package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
- package/eng/scripts/setup/build.ts +16 -0
- package/eng/scripts/setup/build_pygen_wheel.py +40 -0
- package/eng/scripts/setup/install.py +9 -3
- package/eng/scripts/setup/install.ts +32 -0
- package/eng/scripts/setup/prepare.py +3 -1
- package/eng/scripts/setup/prepare.ts +11 -0
- package/eng/scripts/setup/run-python3.ts +1 -6
- package/generator/build/lib/pygen/__init__.py +107 -0
- package/generator/build/lib/pygen/_version.py +7 -0
- package/generator/build/lib/pygen/black.py +71 -0
- package/generator/build/lib/pygen/codegen/__init__.py +357 -0
- package/generator/build/lib/pygen/codegen/_utils.py +17 -0
- package/generator/build/lib/pygen/codegen/models/__init__.py +204 -0
- package/generator/build/lib/pygen/codegen/models/base.py +186 -0
- package/generator/build/lib/pygen/codegen/models/base_builder.py +118 -0
- package/generator/build/lib/pygen/codegen/models/client.py +435 -0
- package/generator/build/lib/pygen/codegen/models/code_model.py +237 -0
- package/generator/build/lib/pygen/codegen/models/combined_type.py +149 -0
- package/generator/build/lib/pygen/codegen/models/constant_type.py +129 -0
- package/generator/build/lib/pygen/codegen/models/credential_types.py +214 -0
- package/generator/build/lib/pygen/codegen/models/dictionary_type.py +127 -0
- package/generator/build/lib/pygen/codegen/models/enum_type.py +238 -0
- package/generator/build/lib/pygen/codegen/models/imports.py +291 -0
- package/generator/build/lib/pygen/codegen/models/list_type.py +143 -0
- package/generator/build/lib/pygen/codegen/models/lro_operation.py +142 -0
- package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +32 -0
- package/generator/build/lib/pygen/codegen/models/model_type.py +357 -0
- package/generator/build/lib/pygen/codegen/models/operation.py +509 -0
- package/generator/build/lib/pygen/codegen/models/operation_group.py +184 -0
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +155 -0
- package/generator/build/lib/pygen/codegen/models/parameter.py +412 -0
- package/generator/build/lib/pygen/codegen/models/parameter_list.py +387 -0
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +659 -0
- package/generator/build/lib/pygen/codegen/models/property.py +170 -0
- package/generator/build/lib/pygen/codegen/models/request_builder.py +189 -0
- package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +115 -0
- package/generator/build/lib/pygen/codegen/models/response.py +348 -0
- package/generator/build/lib/pygen/codegen/models/utils.py +21 -0
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +574 -0
- package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +21 -0
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +1533 -0
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +294 -0
- package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +15 -0
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +213 -0
- package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +126 -0
- package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +198 -0
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +33 -0
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +335 -0
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
- package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +44 -0
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +221 -0
- package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +19 -0
- package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +52 -0
- package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +168 -0
- package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +292 -0
- package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +31 -0
- package/generator/build/lib/pygen/codegen/serializers/utils.py +68 -0
- package/generator/build/lib/pygen/codegen/templates/client.py.jinja2 +37 -0
- package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +12 -0
- package/generator/build/lib/pygen/codegen/templates/config.py.jinja2 +73 -0
- package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +16 -0
- package/generator/build/lib/pygen/codegen/templates/conftest.py.jinja2 +28 -0
- package/generator/build/lib/pygen/codegen/templates/enum.py.jinja2 +13 -0
- package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
- package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +24 -0
- package/generator/build/lib/pygen/codegen/templates/keywords.jinja2 +27 -0
- package/generator/build/lib/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
- package/generator/build/lib/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
- package/generator/build/lib/pygen/codegen/templates/macros.jinja2 +12 -0
- package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +167 -0
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +1174 -0
- package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +15 -0
- package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +97 -0
- package/generator/build/lib/pygen/codegen/templates/model_init.py.jinja2 +33 -0
- package/generator/build/lib/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
- package/generator/build/lib/pygen/codegen/templates/operation.py.jinja2 +21 -0
- package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
- package/generator/build/lib/pygen/codegen/templates/operation_groups_container.py.jinja2 +19 -0
- package/generator/build/lib/pygen/codegen/templates/operation_tools.jinja2 +81 -0
- package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
- package/generator/build/lib/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
- package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +19 -0
- package/generator/build/lib/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
- package/generator/build/lib/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
- package/generator/build/lib/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
- package/generator/build/lib/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
- package/generator/build/lib/pygen/codegen/templates/sample.py.jinja2 +44 -0
- package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +2117 -0
- package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +50 -0
- package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
- package/generator/build/lib/pygen/codegen/templates/types.py.jinja2 +7 -0
- package/generator/build/lib/pygen/codegen/templates/validation.py.jinja2 +38 -0
- package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +96 -0
- package/generator/build/lib/pygen/codegen/templates/version.py.jinja2 +4 -0
- package/generator/build/lib/pygen/m2r.py +65 -0
- package/generator/build/lib/pygen/preprocess/__init__.py +515 -0
- package/generator/build/lib/pygen/preprocess/helpers.py +27 -0
- package/generator/build/lib/pygen/preprocess/python_mappings.py +226 -0
- package/generator/build/lib/pygen/utils.py +163 -0
- package/generator/component-detection-pip-report.json +134 -0
- package/generator/dev_requirements.txt +0 -1
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/m2r.py +1 -1
- package/generator/pygen.egg-info/PKG-INFO +7 -4
- package/generator/pygen.egg-info/requires.txt +7 -4
- package/generator/requirements.txt +5 -10
- package/generator/setup.py +7 -4
- package/generator/test/azure/requirements.txt +2 -0
- package/generator/test/generic_mock_api_tests/unittests/test_m2r.py +10 -0
- package/generator/test/unbranded/requirements.txt +2 -0
- package/package.json +6 -5
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
# -------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
+
# license information.
|
|
5
|
+
# --------------------------------------------------------------------------
|
|
6
|
+
from typing import Dict, Optional, List, Any, TYPE_CHECKING, Union
|
|
7
|
+
|
|
8
|
+
from .base import BaseModel
|
|
9
|
+
from .base import BaseType
|
|
10
|
+
from .imports import FileImport, ImportType, TypingSection
|
|
11
|
+
from .primitive_types import BinaryType, BinaryIteratorType, ByteArraySchema
|
|
12
|
+
from .dictionary_type import DictionaryType
|
|
13
|
+
from .list_type import ListType
|
|
14
|
+
from .model_type import ModelType
|
|
15
|
+
from .combined_type import CombinedType
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from .code_model import CodeModel
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ResponseHeader(BaseModel):
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
yaml_data: Dict[str, Any],
|
|
25
|
+
code_model: "CodeModel",
|
|
26
|
+
type: BaseType,
|
|
27
|
+
) -> None:
|
|
28
|
+
super().__init__(yaml_data, code_model)
|
|
29
|
+
self.wire_name: str = yaml_data["wireName"]
|
|
30
|
+
self.type = type
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def serialization_type(self) -> str:
|
|
34
|
+
return self.type.serialization_type
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel") -> "ResponseHeader":
|
|
38
|
+
from . import build_type
|
|
39
|
+
|
|
40
|
+
return cls(
|
|
41
|
+
yaml_data=yaml_data,
|
|
42
|
+
code_model=code_model,
|
|
43
|
+
type=build_type(yaml_data["type"], code_model),
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class Response(BaseModel):
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
yaml_data: Dict[str, Any],
|
|
51
|
+
code_model: "CodeModel",
|
|
52
|
+
*,
|
|
53
|
+
headers: Optional[List[ResponseHeader]] = None,
|
|
54
|
+
type: Optional[BaseType] = None,
|
|
55
|
+
) -> None:
|
|
56
|
+
super().__init__(yaml_data=yaml_data, code_model=code_model)
|
|
57
|
+
self.status_codes: List[Union[int, str, List[int]]] = yaml_data["statusCodes"]
|
|
58
|
+
self.headers = headers or []
|
|
59
|
+
self.type = type
|
|
60
|
+
self.nullable = yaml_data.get("nullable")
|
|
61
|
+
self.default_content_type = yaml_data.get("defaultContentType")
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def result_property(self) -> str:
|
|
65
|
+
field = self.yaml_data.get("resultProperty")
|
|
66
|
+
if field:
|
|
67
|
+
return f'.get("{field}")'
|
|
68
|
+
return ""
|
|
69
|
+
|
|
70
|
+
def get_polymorphic_subtypes(self, polymorphic_subtypes: List["ModelType"]) -> None:
|
|
71
|
+
if self.type:
|
|
72
|
+
self.type.get_polymorphic_subtypes(polymorphic_subtypes)
|
|
73
|
+
|
|
74
|
+
def get_json_template_representation(self) -> Any:
|
|
75
|
+
if not self.type:
|
|
76
|
+
return None
|
|
77
|
+
if not isinstance(self.type, (DictionaryType, ListType, ModelType)):
|
|
78
|
+
return None
|
|
79
|
+
return self.type.get_json_template_representation()
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def is_stream_response(self) -> bool:
|
|
83
|
+
"""Is the response expected to be streamable, like a download."""
|
|
84
|
+
retval = isinstance(self.type, BinaryIteratorType) or (
|
|
85
|
+
isinstance(self.type, ByteArraySchema)
|
|
86
|
+
and bool(self.default_content_type)
|
|
87
|
+
and self.default_content_type != "application/json"
|
|
88
|
+
)
|
|
89
|
+
return retval
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def serialization_type(self) -> str:
|
|
93
|
+
if self.type:
|
|
94
|
+
return self.type.serialization_type
|
|
95
|
+
return "None"
|
|
96
|
+
|
|
97
|
+
def type_annotation(self, **kwargs: Any) -> str:
|
|
98
|
+
if self.type:
|
|
99
|
+
kwargs["is_operation_file"] = True
|
|
100
|
+
type_annotation = self.type.type_annotation(**kwargs)
|
|
101
|
+
if self.nullable:
|
|
102
|
+
return f"Optional[{type_annotation}]"
|
|
103
|
+
return type_annotation
|
|
104
|
+
return "None"
|
|
105
|
+
|
|
106
|
+
def docstring_text(self, **kwargs: Any) -> str:
|
|
107
|
+
if self.nullable and self.type:
|
|
108
|
+
return f"{self.type.docstring_text(**kwargs)} or None"
|
|
109
|
+
return self.type.docstring_text(**kwargs) if self.type else "None"
|
|
110
|
+
|
|
111
|
+
def docstring_type(self, **kwargs: Any) -> str:
|
|
112
|
+
if self.nullable and self.type:
|
|
113
|
+
return f"{self.type.docstring_type(**kwargs)} or None"
|
|
114
|
+
return self.type.docstring_type(**kwargs) if self.type else "None"
|
|
115
|
+
|
|
116
|
+
def _imports_shared(self, **kwargs: Any) -> FileImport:
|
|
117
|
+
file_import = FileImport(self.code_model)
|
|
118
|
+
if self.type:
|
|
119
|
+
file_import.merge(self.type.imports(**kwargs))
|
|
120
|
+
if self.nullable:
|
|
121
|
+
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
122
|
+
if isinstance(self.type, CombinedType) and self.type.name:
|
|
123
|
+
async_mode = kwargs.get("async_mode", False)
|
|
124
|
+
file_import.add_submodule_import(
|
|
125
|
+
"..." if async_mode else "..",
|
|
126
|
+
"_types",
|
|
127
|
+
ImportType.LOCAL,
|
|
128
|
+
TypingSection.TYPING,
|
|
129
|
+
)
|
|
130
|
+
return file_import
|
|
131
|
+
|
|
132
|
+
def imports(self, **kwargs: Any) -> FileImport:
|
|
133
|
+
return self._imports_shared(**kwargs)
|
|
134
|
+
|
|
135
|
+
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
136
|
+
return self._imports_shared(**kwargs)
|
|
137
|
+
|
|
138
|
+
def _get_import_type(self, input_path: str) -> ImportType:
|
|
139
|
+
# helper function to return imports for responses based off
|
|
140
|
+
# of whether we're importing from the core library, or users
|
|
141
|
+
# are customizing responses
|
|
142
|
+
return ImportType.SDKCORE if self.code_model.core_library.split(".")[0] in input_path else ImportType.THIRDPARTY
|
|
143
|
+
|
|
144
|
+
@classmethod
|
|
145
|
+
def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel") -> "Response":
|
|
146
|
+
type = code_model.lookup_type(id(yaml_data["type"])) if yaml_data.get("type") else None
|
|
147
|
+
# use ByteIteratorType if we are returning a binary type
|
|
148
|
+
default_content_type = yaml_data.get("defaultContentType", "application/json")
|
|
149
|
+
if isinstance(type, BinaryType) or (
|
|
150
|
+
isinstance(type, ByteArraySchema) and default_content_type != "application/json"
|
|
151
|
+
):
|
|
152
|
+
type = BinaryIteratorType(type.yaml_data, type.code_model)
|
|
153
|
+
return cls(
|
|
154
|
+
yaml_data=yaml_data,
|
|
155
|
+
code_model=code_model,
|
|
156
|
+
headers=[ResponseHeader.from_yaml(header, code_model) for header in yaml_data["headers"]],
|
|
157
|
+
type=type,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
def __repr__(self) -> str:
|
|
161
|
+
return f"<{self.__class__.__name__} {self.status_codes}>"
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class PagingResponse(Response):
|
|
165
|
+
def __init__(self, *args, **kwargs) -> None:
|
|
166
|
+
super().__init__(*args, **kwargs)
|
|
167
|
+
self.item_type = self.code_model.lookup_type(id(self.yaml_data["itemType"]))
|
|
168
|
+
self.pager_sync: str = self.yaml_data.get("pagerSync") or f"{self.code_model.core_library}.paging.ItemPaged"
|
|
169
|
+
default_paging_submodule = f"{'async_' if self.code_model.is_azure_flavor else ''}paging"
|
|
170
|
+
self.pager_async: str = (
|
|
171
|
+
self.yaml_data.get("pagerAsync")
|
|
172
|
+
or f"{self.code_model.core_library}.{default_paging_submodule}.AsyncItemPaged"
|
|
173
|
+
)
|
|
174
|
+
|
|
175
|
+
def get_polymorphic_subtypes(self, polymorphic_subtypes: List["ModelType"]) -> None:
|
|
176
|
+
return self.item_type.get_polymorphic_subtypes(polymorphic_subtypes)
|
|
177
|
+
|
|
178
|
+
def get_json_template_representation(self) -> Any:
|
|
179
|
+
return self.item_type.get_json_template_representation()
|
|
180
|
+
|
|
181
|
+
def get_pager_import_path(self, async_mode: bool) -> str:
|
|
182
|
+
return ".".join(self.get_pager_path(async_mode).split(".")[:-1])
|
|
183
|
+
|
|
184
|
+
def get_pager_path(self, async_mode: bool) -> str:
|
|
185
|
+
return self.pager_async if async_mode else self.pager_sync
|
|
186
|
+
|
|
187
|
+
def get_pager(self, async_mode: bool) -> str:
|
|
188
|
+
return self.get_pager_path(async_mode).split(".")[-1]
|
|
189
|
+
|
|
190
|
+
def type_annotation(self, **kwargs: Any) -> str:
|
|
191
|
+
iterable = "AsyncIterable" if kwargs["async_mode"] else "Iterable"
|
|
192
|
+
return f"{iterable}[{self.item_type.type_annotation(**kwargs)}]"
|
|
193
|
+
|
|
194
|
+
def docstring_text(self, **kwargs: Any) -> str:
|
|
195
|
+
base_description = "An iterator like instance of "
|
|
196
|
+
if not self.code_model.options["version_tolerant"]:
|
|
197
|
+
base_description += "either "
|
|
198
|
+
return base_description + self.item_type.docstring_text(**kwargs)
|
|
199
|
+
|
|
200
|
+
def docstring_type(self, **kwargs: Any) -> str:
|
|
201
|
+
return f"~{self.get_pager_path(kwargs['async_mode'])}[{self.item_type.docstring_type(**kwargs)}]"
|
|
202
|
+
|
|
203
|
+
def _imports_shared(self, **kwargs: Any) -> FileImport:
|
|
204
|
+
file_import = super()._imports_shared(**kwargs)
|
|
205
|
+
async_mode = kwargs.get("async_mode", False)
|
|
206
|
+
pager = self.get_pager(async_mode)
|
|
207
|
+
pager_path = self.get_pager_import_path(async_mode)
|
|
208
|
+
|
|
209
|
+
file_import.add_submodule_import(pager_path, pager, self._get_import_type(pager_path))
|
|
210
|
+
return file_import
|
|
211
|
+
|
|
212
|
+
def imports(self, **kwargs: Any) -> FileImport:
|
|
213
|
+
file_import = self._imports_shared(**kwargs)
|
|
214
|
+
async_mode = kwargs.get("async_mode")
|
|
215
|
+
if async_mode:
|
|
216
|
+
file_import.add_submodule_import(
|
|
217
|
+
f"{'async_' if self.code_model.is_azure_flavor else ''}paging",
|
|
218
|
+
"AsyncList",
|
|
219
|
+
ImportType.SDKCORE,
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
return file_import
|
|
223
|
+
|
|
224
|
+
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
225
|
+
return self._imports_shared(**kwargs)
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
class LROResponse(Response):
|
|
229
|
+
def get_poller_path(self, async_mode: bool) -> str:
|
|
230
|
+
return self.yaml_data["pollerAsync"] if async_mode else self.yaml_data["pollerSync"]
|
|
231
|
+
|
|
232
|
+
def get_poller(self, async_mode: bool) -> str:
|
|
233
|
+
"""Get the name of the poller. Default is LROPoller / AsyncLROPoller"""
|
|
234
|
+
return self.get_poller_path(async_mode).split(".")[-1]
|
|
235
|
+
|
|
236
|
+
def get_polling_method_path(self, async_mode: bool) -> str:
|
|
237
|
+
"""Get the full name of the poller path. Default are the azure core pollers"""
|
|
238
|
+
return self.yaml_data["pollingMethodAsync"] if async_mode else self.yaml_data["pollingMethodSync"]
|
|
239
|
+
|
|
240
|
+
def get_polling_method(self, async_mode: bool) -> str:
|
|
241
|
+
"""Get the default pollint method"""
|
|
242
|
+
return self.get_polling_method_path(async_mode).split(".")[-1]
|
|
243
|
+
|
|
244
|
+
@staticmethod
|
|
245
|
+
def get_no_polling_method_path(async_mode: bool) -> str:
|
|
246
|
+
"""Get the path of the default of no polling method"""
|
|
247
|
+
return f"azure.core.polling.{'Async' if async_mode else ''}NoPolling"
|
|
248
|
+
|
|
249
|
+
def get_no_polling_method(self, async_mode: bool) -> str:
|
|
250
|
+
"""Get the default no polling method"""
|
|
251
|
+
return self.get_no_polling_method_path(async_mode).split(".")[-1]
|
|
252
|
+
|
|
253
|
+
@staticmethod
|
|
254
|
+
def get_base_polling_method_path(async_mode: bool) -> str:
|
|
255
|
+
"""Get the base polling method path. Used in docstrings and type annotations."""
|
|
256
|
+
return f"azure.core.polling.{'Async' if async_mode else ''}PollingMethod"
|
|
257
|
+
|
|
258
|
+
def get_base_polling_method(self, async_mode: bool) -> str:
|
|
259
|
+
"""Get the base polling method."""
|
|
260
|
+
return self.get_base_polling_method_path(async_mode).split(".")[-1]
|
|
261
|
+
|
|
262
|
+
def type_annotation(self, **kwargs: Any) -> str:
|
|
263
|
+
return f"{self.get_poller(kwargs.get('async_mode', False))}[{super().type_annotation(**kwargs)}]"
|
|
264
|
+
|
|
265
|
+
def docstring_type(self, **kwargs: Any) -> str:
|
|
266
|
+
return f"~{self.get_poller_path(kwargs.get('async_mode', False))}[{super().docstring_type(**kwargs)}]"
|
|
267
|
+
|
|
268
|
+
def docstring_text(self, **kwargs) -> str:
|
|
269
|
+
super_text = super().docstring_text(**kwargs)
|
|
270
|
+
base_description = f"An instance of {self.get_poller(kwargs.get('async_mode', False))} that returns "
|
|
271
|
+
if not self.code_model.options["version_tolerant"]:
|
|
272
|
+
base_description += "either "
|
|
273
|
+
return base_description + super_text
|
|
274
|
+
|
|
275
|
+
def _imports_shared(self, **kwargs: Any) -> FileImport:
|
|
276
|
+
file_import = super()._imports_shared(**kwargs)
|
|
277
|
+
async_mode = kwargs["async_mode"]
|
|
278
|
+
poller_import_path = ".".join(self.get_poller_path(async_mode).split(".")[:-1])
|
|
279
|
+
poller = self.get_poller(async_mode)
|
|
280
|
+
file_import.add_submodule_import(poller_import_path, poller, self._get_import_type(poller_import_path))
|
|
281
|
+
return file_import
|
|
282
|
+
|
|
283
|
+
def imports(self, **kwargs: Any) -> FileImport:
|
|
284
|
+
file_import = self._imports_shared(**kwargs)
|
|
285
|
+
async_mode = kwargs["async_mode"]
|
|
286
|
+
|
|
287
|
+
default_polling_method_import_path = ".".join(self.get_polling_method_path(async_mode).split(".")[:-1])
|
|
288
|
+
default_polling_method = self.get_polling_method(async_mode)
|
|
289
|
+
file_import.add_submodule_import(
|
|
290
|
+
default_polling_method_import_path,
|
|
291
|
+
default_polling_method,
|
|
292
|
+
self._get_import_type(default_polling_method_import_path),
|
|
293
|
+
)
|
|
294
|
+
default_no_polling_method_import_path = ".".join(self.get_no_polling_method_path(async_mode).split(".")[:-1])
|
|
295
|
+
default_no_polling_method = self.get_no_polling_method(async_mode)
|
|
296
|
+
file_import.add_submodule_import(
|
|
297
|
+
default_no_polling_method_import_path,
|
|
298
|
+
default_no_polling_method,
|
|
299
|
+
self._get_import_type(default_no_polling_method_import_path),
|
|
300
|
+
)
|
|
301
|
+
|
|
302
|
+
base_polling_method_import_path = ".".join(self.get_base_polling_method_path(async_mode).split(".")[:-1])
|
|
303
|
+
base_polling_method = self.get_base_polling_method(async_mode)
|
|
304
|
+
file_import.add_submodule_import(
|
|
305
|
+
base_polling_method_import_path,
|
|
306
|
+
base_polling_method,
|
|
307
|
+
self._get_import_type(base_polling_method_import_path),
|
|
308
|
+
)
|
|
309
|
+
return file_import
|
|
310
|
+
|
|
311
|
+
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
312
|
+
return self._imports_shared(**kwargs)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
class LROPagingResponse(LROResponse, PagingResponse):
|
|
316
|
+
def type_annotation(self, **kwargs: Any) -> str:
|
|
317
|
+
paging_type_annotation = PagingResponse.type_annotation(self, **kwargs)
|
|
318
|
+
return f"{self.get_poller(kwargs.get('async_mode', False))}[{paging_type_annotation}]"
|
|
319
|
+
|
|
320
|
+
def docstring_type(self, **kwargs: Any) -> str:
|
|
321
|
+
paging_docstring_type = PagingResponse.docstring_type(self, **kwargs)
|
|
322
|
+
return f"~{self.get_poller_path(kwargs.get('async_mode', False))}[{paging_docstring_type}]"
|
|
323
|
+
|
|
324
|
+
def docstring_text(self, **kwargs) -> str:
|
|
325
|
+
base_description = "An instance of LROPoller that returns an iterator like instance of "
|
|
326
|
+
if not self.code_model.options["version_tolerant"]:
|
|
327
|
+
base_description += "either "
|
|
328
|
+
return base_description + Response.docstring_text(self)
|
|
329
|
+
|
|
330
|
+
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
331
|
+
file_import = LROResponse.imports_for_multiapi(self, **kwargs)
|
|
332
|
+
file_import.merge(PagingResponse.imports_for_multiapi(self, **kwargs))
|
|
333
|
+
return file_import
|
|
334
|
+
|
|
335
|
+
def imports(self, **kwargs: Any) -> FileImport:
|
|
336
|
+
file_import = LROResponse.imports(self, **kwargs)
|
|
337
|
+
file_import.merge(PagingResponse.imports(self, **kwargs))
|
|
338
|
+
return file_import
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def get_response(yaml_data: Dict[str, Any], code_model: "CodeModel") -> Response:
|
|
342
|
+
if yaml_data["discriminator"] == "lropaging":
|
|
343
|
+
return LROPagingResponse.from_yaml(yaml_data, code_model)
|
|
344
|
+
if yaml_data["discriminator"] == "lro":
|
|
345
|
+
return LROResponse.from_yaml(yaml_data, code_model)
|
|
346
|
+
if yaml_data["discriminator"] == "paging":
|
|
347
|
+
return PagingResponse.from_yaml(yaml_data, code_model)
|
|
348
|
+
return Response.from_yaml(yaml_data, code_model)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -------------------------------------------------------------------------
|
|
2
|
+
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
+
# license information.
|
|
5
|
+
# --------------------------------------------------------------------------
|
|
6
|
+
from typing import TypeVar, Dict
|
|
7
|
+
|
|
8
|
+
T = TypeVar("T")
|
|
9
|
+
OrderedSet = Dict[T, None]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def add_to_description(description: str, entry: str) -> str:
|
|
13
|
+
if description:
|
|
14
|
+
return f"{description} {entry}"
|
|
15
|
+
return entry
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def add_to_pylint_disable(curr_str: str, entry: str) -> str:
|
|
19
|
+
if curr_str:
|
|
20
|
+
return f"{curr_str},{entry}"
|
|
21
|
+
return f" # pylint: disable={entry}"
|