@autorest/python 6.38.1 → 6.39.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/README.md +2 -27
- package/autorest/codegen.py +0 -1
- package/autorest/jsonrpc/server.py +0 -3
- package/generator/build/lib/pygen/__init__.py +14 -23
- package/generator/build/lib/pygen/codegen/__init__.py +4 -4
- package/generator/build/lib/pygen/codegen/models/__init__.py +2 -2
- package/generator/build/lib/pygen/codegen/models/base.py +9 -12
- package/generator/build/lib/pygen/codegen/models/base_builder.py +4 -6
- package/generator/build/lib/pygen/codegen/models/client.py +61 -102
- package/generator/build/lib/pygen/codegen/models/code_model.py +29 -29
- package/generator/build/lib/pygen/codegen/models/combined_type.py +7 -7
- package/generator/build/lib/pygen/codegen/models/constant_type.py +4 -11
- package/generator/build/lib/pygen/codegen/models/credential_types.py +9 -11
- package/generator/build/lib/pygen/codegen/models/dictionary_type.py +7 -8
- package/generator/build/lib/pygen/codegen/models/enum_type.py +7 -7
- package/generator/build/lib/pygen/codegen/models/imports.py +24 -29
- package/generator/build/lib/pygen/codegen/models/list_type.py +15 -14
- package/generator/build/lib/pygen/codegen/models/lro_operation.py +6 -6
- package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/build/lib/pygen/codegen/models/model_type.py +11 -11
- package/generator/build/lib/pygen/codegen/models/operation.py +26 -56
- package/generator/build/lib/pygen/codegen/models/operation_group.py +11 -22
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +15 -19
- package/generator/build/lib/pygen/codegen/models/parameter.py +12 -21
- package/generator/build/lib/pygen/codegen/models/parameter_list.py +37 -39
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +24 -18
- package/generator/build/lib/pygen/codegen/models/property.py +10 -10
- package/generator/build/lib/pygen/codegen/models/request_builder.py +7 -8
- package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +3 -3
- package/generator/build/lib/pygen/codegen/models/response.py +15 -40
- package/generator/build/lib/pygen/codegen/models/utils.py +2 -2
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +26 -42
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +103 -100
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +22 -25
- package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +2 -2
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +49 -61
- package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +6 -7
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +15 -17
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
- package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -6
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +28 -18
- package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +9 -14
- package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +7 -7
- package/generator/build/lib/pygen/codegen/serializers/utils.py +2 -2
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +30 -24
- package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
- package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
- package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +11 -13
- package/generator/build/lib/pygen/codegen/templates/utils.py.jinja2 +6 -6
- package/generator/build/lib/pygen/preprocess/__init__.py +47 -30
- package/generator/build/lib/pygen/preprocess/helpers.py +2 -2
- package/generator/build/lib/pygen/utils.py +6 -6
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/__init__.py +14 -23
- package/generator/pygen/codegen/__init__.py +4 -4
- package/generator/pygen/codegen/models/__init__.py +2 -2
- package/generator/pygen/codegen/models/base.py +9 -12
- package/generator/pygen/codegen/models/base_builder.py +4 -6
- package/generator/pygen/codegen/models/client.py +61 -102
- package/generator/pygen/codegen/models/code_model.py +29 -29
- package/generator/pygen/codegen/models/combined_type.py +7 -7
- package/generator/pygen/codegen/models/constant_type.py +4 -11
- package/generator/pygen/codegen/models/credential_types.py +9 -11
- package/generator/pygen/codegen/models/dictionary_type.py +7 -8
- package/generator/pygen/codegen/models/enum_type.py +7 -7
- package/generator/pygen/codegen/models/imports.py +24 -29
- package/generator/pygen/codegen/models/list_type.py +15 -14
- package/generator/pygen/codegen/models/lro_operation.py +6 -6
- package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/pygen/codegen/models/model_type.py +11 -11
- package/generator/pygen/codegen/models/operation.py +26 -56
- package/generator/pygen/codegen/models/operation_group.py +11 -22
- package/generator/pygen/codegen/models/paging_operation.py +15 -19
- package/generator/pygen/codegen/models/parameter.py +12 -21
- package/generator/pygen/codegen/models/parameter_list.py +37 -39
- package/generator/pygen/codegen/models/primitive_types.py +24 -18
- package/generator/pygen/codegen/models/property.py +10 -10
- package/generator/pygen/codegen/models/request_builder.py +7 -8
- package/generator/pygen/codegen/models/request_builder_parameter.py +3 -3
- package/generator/pygen/codegen/models/response.py +15 -40
- package/generator/pygen/codegen/models/utils.py +2 -2
- package/generator/pygen/codegen/serializers/__init__.py +26 -42
- package/generator/pygen/codegen/serializers/builder_serializer.py +103 -100
- package/generator/pygen/codegen/serializers/client_serializer.py +22 -25
- package/generator/pygen/codegen/serializers/enum_serializer.py +2 -2
- package/generator/pygen/codegen/serializers/general_serializer.py +49 -61
- package/generator/pygen/codegen/serializers/import_serializer.py +6 -7
- package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/model_serializer.py +15 -17
- package/generator/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
- package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -6
- package/generator/pygen/codegen/serializers/parameter_serializer.py +28 -18
- package/generator/pygen/codegen/serializers/patch_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/request_builders_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/sample_serializer.py +9 -14
- package/generator/pygen/codegen/serializers/test_serializer.py +7 -7
- package/generator/pygen/codegen/serializers/utils.py +2 -2
- package/generator/pygen/codegen/templates/model_base.py.jinja2 +30 -24
- package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
- package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
- package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
- package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
- package/generator/pygen/codegen/templates/patch.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/serialization.py.jinja2 +11 -13
- package/generator/pygen/codegen/templates/utils.py.jinja2 +6 -6
- package/generator/pygen/preprocess/__init__.py +47 -30
- package/generator/pygen/preprocess/helpers.py +2 -2
- package/generator/pygen/utils.py +6 -6
- package/generator/pygen.egg-info/SOURCES.txt +0 -2
- package/package.json +2 -2
- package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
- package/autorest/multiapi/__init__.py +0 -185
- package/autorest/multiapi/models/__init__.py +0 -16
- package/autorest/multiapi/models/client.py +0 -68
- package/autorest/multiapi/models/code_model.py +0 -142
- package/autorest/multiapi/models/config.py +0 -24
- package/autorest/multiapi/models/constant_global_parameter.py +0 -11
- package/autorest/multiapi/models/global_parameter.py +0 -34
- package/autorest/multiapi/models/global_parameters.py +0 -53
- package/autorest/multiapi/models/imports.py +0 -181
- package/autorest/multiapi/models/mixin_operation.py +0 -38
- package/autorest/multiapi/models/operation_group.py +0 -29
- package/autorest/multiapi/models/operation_mixin_group.py +0 -89
- package/autorest/multiapi/serializers/__init__.py +0 -145
- package/autorest/multiapi/serializers/import_serializer.py +0 -181
- package/autorest/multiapi/templates/multiapi_config.py.jinja2 +0 -89
- package/autorest/multiapi/templates/multiapi_init.py.jinja2 +0 -22
- package/autorest/multiapi/templates/multiapi_models.py.jinja2 +0 -9
- package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +0 -39
- package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +0 -163
- package/autorest/multiapi/templates/multiapi_version.py.jinja2 +0 -8
- package/autorest/multiapi/utils.py +0 -51
- package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +0 -216
- package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +0 -167
- package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -216
- package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Optional, Any, TYPE_CHECKING, Union
|
|
7
7
|
|
|
8
8
|
from .base import BaseModel
|
|
9
9
|
from .base import BaseType
|
|
@@ -21,7 +21,7 @@ if TYPE_CHECKING:
|
|
|
21
21
|
class ResponseHeader(BaseModel):
|
|
22
22
|
def __init__(
|
|
23
23
|
self,
|
|
24
|
-
yaml_data:
|
|
24
|
+
yaml_data: dict[str, Any],
|
|
25
25
|
code_model: "CodeModel",
|
|
26
26
|
type: BaseType,
|
|
27
27
|
) -> None:
|
|
@@ -33,7 +33,7 @@ class ResponseHeader(BaseModel):
|
|
|
33
33
|
return self.type.serialization_type(**kwargs)
|
|
34
34
|
|
|
35
35
|
@classmethod
|
|
36
|
-
def from_yaml(cls, yaml_data:
|
|
36
|
+
def from_yaml(cls, yaml_data: dict[str, Any], code_model: "CodeModel") -> "ResponseHeader":
|
|
37
37
|
from . import build_type
|
|
38
38
|
|
|
39
39
|
return cls(
|
|
@@ -46,14 +46,14 @@ class ResponseHeader(BaseModel):
|
|
|
46
46
|
class Response(BaseModel):
|
|
47
47
|
def __init__(
|
|
48
48
|
self,
|
|
49
|
-
yaml_data:
|
|
49
|
+
yaml_data: dict[str, Any],
|
|
50
50
|
code_model: "CodeModel",
|
|
51
51
|
*,
|
|
52
|
-
headers: Optional[
|
|
52
|
+
headers: Optional[list[ResponseHeader]] = None,
|
|
53
53
|
type: Optional[BaseType] = None,
|
|
54
54
|
) -> None:
|
|
55
55
|
super().__init__(yaml_data=yaml_data, code_model=code_model)
|
|
56
|
-
self.status_codes:
|
|
56
|
+
self.status_codes: list[Union[int, str, list[int]]] = yaml_data["statusCodes"]
|
|
57
57
|
self.headers = headers or []
|
|
58
58
|
self.type = type
|
|
59
59
|
self.nullable = yaml_data.get("nullable")
|
|
@@ -66,7 +66,7 @@ class Response(BaseModel):
|
|
|
66
66
|
return "".join([f'.get("{field}", {{}})' for field in field.split(".")])
|
|
67
67
|
return ""
|
|
68
68
|
|
|
69
|
-
def get_polymorphic_subtypes(self, polymorphic_subtypes:
|
|
69
|
+
def get_polymorphic_subtypes(self, polymorphic_subtypes: list["ModelType"]) -> None:
|
|
70
70
|
if self.type:
|
|
71
71
|
self.type.get_polymorphic_subtypes(polymorphic_subtypes)
|
|
72
72
|
|
|
@@ -111,7 +111,7 @@ class Response(BaseModel):
|
|
|
111
111
|
return f"{self.type.docstring_type(**kwargs)} or None"
|
|
112
112
|
return self.type.docstring_type(**kwargs) if self.type else "None"
|
|
113
113
|
|
|
114
|
-
def
|
|
114
|
+
def imports(self, **kwargs: Any) -> FileImport:
|
|
115
115
|
file_import = FileImport(self.code_model)
|
|
116
116
|
if self.type:
|
|
117
117
|
file_import.merge(self.type.imports(**kwargs))
|
|
@@ -127,12 +127,6 @@ class Response(BaseModel):
|
|
|
127
127
|
)
|
|
128
128
|
return file_import
|
|
129
129
|
|
|
130
|
-
def imports(self, **kwargs: Any) -> FileImport:
|
|
131
|
-
return self._imports_shared(**kwargs)
|
|
132
|
-
|
|
133
|
-
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
134
|
-
return self._imports_shared(**kwargs)
|
|
135
|
-
|
|
136
130
|
def _get_import_type(self, input_path: str) -> ImportType:
|
|
137
131
|
# helper function to return imports for responses based off
|
|
138
132
|
# of whether we're importing from the core library, or users
|
|
@@ -140,7 +134,7 @@ class Response(BaseModel):
|
|
|
140
134
|
return ImportType.SDKCORE if self.code_model.core_library.split(".")[0] in input_path else ImportType.THIRDPARTY
|
|
141
135
|
|
|
142
136
|
@classmethod
|
|
143
|
-
def from_yaml(cls, yaml_data:
|
|
137
|
+
def from_yaml(cls, yaml_data: dict[str, Any], code_model: "CodeModel") -> "Response":
|
|
144
138
|
type = code_model.lookup_type(id(yaml_data["type"])) if yaml_data.get("type") else None
|
|
145
139
|
# use ByteIteratorType if we are returning a binary type
|
|
146
140
|
default_content_type = yaml_data.get("defaultContentType", "application/json")
|
|
@@ -170,7 +164,7 @@ class PagingResponse(Response):
|
|
|
170
164
|
or f"{self.code_model.core_library}.{default_paging_submodule}.AsyncItemPaged"
|
|
171
165
|
)
|
|
172
166
|
|
|
173
|
-
def get_polymorphic_subtypes(self, polymorphic_subtypes:
|
|
167
|
+
def get_polymorphic_subtypes(self, polymorphic_subtypes: list["ModelType"]) -> None:
|
|
174
168
|
return self.item_type.get_polymorphic_subtypes(polymorphic_subtypes)
|
|
175
169
|
|
|
176
170
|
def get_json_template_representation(self) -> Any:
|
|
@@ -198,17 +192,13 @@ class PagingResponse(Response):
|
|
|
198
192
|
def docstring_type(self, **kwargs: Any) -> str:
|
|
199
193
|
return f"~{self.get_pager_path(kwargs['async_mode'])}[{self.item_type.docstring_type(**kwargs)}]"
|
|
200
194
|
|
|
201
|
-
def
|
|
202
|
-
file_import = super().
|
|
195
|
+
def imports(self, **kwargs: Any) -> FileImport:
|
|
196
|
+
file_import = super().imports(**kwargs)
|
|
203
197
|
async_mode = kwargs.get("async_mode", False)
|
|
204
198
|
pager = self.get_pager(async_mode)
|
|
205
199
|
pager_path = self.get_pager_import_path(async_mode)
|
|
206
200
|
|
|
207
201
|
file_import.add_submodule_import(pager_path, pager, self._get_import_type(pager_path))
|
|
208
|
-
return file_import
|
|
209
|
-
|
|
210
|
-
def imports(self, **kwargs: Any) -> FileImport:
|
|
211
|
-
file_import = self._imports_shared(**kwargs)
|
|
212
202
|
async_mode = kwargs.get("async_mode")
|
|
213
203
|
if async_mode:
|
|
214
204
|
file_import.add_submodule_import(
|
|
@@ -219,9 +209,6 @@ class PagingResponse(Response):
|
|
|
219
209
|
|
|
220
210
|
return file_import
|
|
221
211
|
|
|
222
|
-
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
223
|
-
return self._imports_shared(**kwargs)
|
|
224
|
-
|
|
225
212
|
|
|
226
213
|
class LROResponse(Response):
|
|
227
214
|
def get_poller_path(self, async_mode: bool) -> str:
|
|
@@ -270,16 +257,12 @@ class LROResponse(Response):
|
|
|
270
257
|
base_description += "either "
|
|
271
258
|
return base_description + super_text
|
|
272
259
|
|
|
273
|
-
def
|
|
274
|
-
file_import = super().
|
|
260
|
+
def imports(self, **kwargs: Any) -> FileImport:
|
|
261
|
+
file_import = super().imports(**kwargs)
|
|
275
262
|
async_mode = kwargs["async_mode"]
|
|
276
263
|
poller_import_path = ".".join(self.get_poller_path(async_mode).split(".")[:-1])
|
|
277
264
|
poller = self.get_poller(async_mode)
|
|
278
265
|
file_import.add_submodule_import(poller_import_path, poller, self._get_import_type(poller_import_path))
|
|
279
|
-
return file_import
|
|
280
|
-
|
|
281
|
-
def imports(self, **kwargs: Any) -> FileImport:
|
|
282
|
-
file_import = self._imports_shared(**kwargs)
|
|
283
266
|
async_mode = kwargs["async_mode"]
|
|
284
267
|
|
|
285
268
|
default_polling_method_import_path = ".".join(self.get_polling_method_path(async_mode).split(".")[:-1])
|
|
@@ -306,9 +289,6 @@ class LROResponse(Response):
|
|
|
306
289
|
)
|
|
307
290
|
return file_import
|
|
308
291
|
|
|
309
|
-
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
310
|
-
return self._imports_shared(**kwargs)
|
|
311
|
-
|
|
312
292
|
|
|
313
293
|
class LROPagingResponse(LROResponse, PagingResponse):
|
|
314
294
|
def type_annotation(self, **kwargs: Any) -> str:
|
|
@@ -325,18 +305,13 @@ class LROPagingResponse(LROResponse, PagingResponse):
|
|
|
325
305
|
base_description += "either "
|
|
326
306
|
return base_description + Response.docstring_text(self)
|
|
327
307
|
|
|
328
|
-
def imports_for_multiapi(self, **kwargs: Any) -> FileImport:
|
|
329
|
-
file_import = LROResponse.imports_for_multiapi(self, **kwargs)
|
|
330
|
-
file_import.merge(PagingResponse.imports_for_multiapi(self, **kwargs))
|
|
331
|
-
return file_import
|
|
332
|
-
|
|
333
308
|
def imports(self, **kwargs: Any) -> FileImport:
|
|
334
309
|
file_import = LROResponse.imports(self, **kwargs)
|
|
335
310
|
file_import.merge(PagingResponse.imports(self, **kwargs))
|
|
336
311
|
return file_import
|
|
337
312
|
|
|
338
313
|
|
|
339
|
-
def get_response(yaml_data:
|
|
314
|
+
def get_response(yaml_data: dict[str, Any], code_model: "CodeModel") -> Response:
|
|
340
315
|
if yaml_data["discriminator"] == "lropaging":
|
|
341
316
|
return LROPagingResponse.from_yaml(yaml_data, code_model)
|
|
342
317
|
if yaml_data["discriminator"] == "lro":
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
|
-
from typing import TypeVar
|
|
6
|
+
from typing import TypeVar
|
|
7
7
|
|
|
8
8
|
from enum import Enum
|
|
9
9
|
|
|
10
10
|
T = TypeVar("T")
|
|
11
|
-
OrderedSet =
|
|
11
|
+
OrderedSet = dict[T, None]
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def add_to_description(description: str, entry: str) -> str:
|
|
@@ -7,7 +7,7 @@ import logging
|
|
|
7
7
|
import json
|
|
8
8
|
from collections import namedtuple
|
|
9
9
|
import re
|
|
10
|
-
from typing import
|
|
10
|
+
from typing import Any, Optional, Union
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
from packaging.version import parse as parse_version
|
|
13
13
|
from jinja2 import PackageLoader, Environment, FileSystemLoader, StrictUndefined
|
|
@@ -28,7 +28,6 @@ from .model_init_serializer import ModelInitSerializer
|
|
|
28
28
|
from .model_serializer import DpgModelSerializer, MsrestModelSerializer
|
|
29
29
|
from .operations_init_serializer import OperationsInitSerializer
|
|
30
30
|
from .operation_groups_serializer import OperationGroupsSerializer
|
|
31
|
-
from .metadata_serializer import MetadataSerializer
|
|
32
31
|
from .request_builders_serializer import RequestBuildersSerializer
|
|
33
32
|
from .patch_serializer import PatchSerializer
|
|
34
33
|
from .sample_serializer import SampleSerializer
|
|
@@ -99,7 +98,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
99
98
|
return self.code_model.options["show-operations"] and bool(self.code_model.has_operations)
|
|
100
99
|
|
|
101
100
|
@property
|
|
102
|
-
def serialize_loop(self) ->
|
|
101
|
+
def serialize_loop(self) -> list[AsyncInfo]:
|
|
103
102
|
sync_loop = AsyncInfo(async_mode=False, async_path="")
|
|
104
103
|
async_loop = AsyncInfo(async_mode=True, async_path="aio/")
|
|
105
104
|
return [sync_loop, async_loop] if self.has_aio_folder else [sync_loop]
|
|
@@ -151,7 +150,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
151
150
|
# write apiview-properties.json
|
|
152
151
|
if self.code_model.options.get("emit-cross-language-definition-file"):
|
|
153
152
|
self.write_file(
|
|
154
|
-
|
|
153
|
+
self._root_of_sdk / Path("apiview-properties.json"),
|
|
155
154
|
general_serializer.serialize_cross_language_definition_file(),
|
|
156
155
|
)
|
|
157
156
|
|
|
@@ -165,7 +164,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
165
164
|
# add _metadata.json
|
|
166
165
|
if self.code_model.metadata:
|
|
167
166
|
self.write_file(
|
|
168
|
-
|
|
167
|
+
self._root_of_sdk / "_metadata.json",
|
|
169
168
|
json.dumps(self.code_model.metadata, indent=2),
|
|
170
169
|
)
|
|
171
170
|
elif client_namespace_type.clients:
|
|
@@ -205,8 +204,6 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
205
204
|
self._serialize_and_write_operations_folder(
|
|
206
205
|
client_namespace_type.operation_groups, env=env, namespace=client_namespace
|
|
207
206
|
)
|
|
208
|
-
if self.code_model.options["multiapi"]:
|
|
209
|
-
self._serialize_and_write_metadata(env=env, namespace=client_namespace)
|
|
210
207
|
|
|
211
208
|
# if there are only operations under this namespace, we need to add general __init__.py into `aio` folder
|
|
212
209
|
# to make sure all generated files could be packed into .zip/.whl/.tgz package
|
|
@@ -216,11 +213,17 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
216
213
|
general_serializer.serialize_pkgutil_init_file(),
|
|
217
214
|
)
|
|
218
215
|
|
|
219
|
-
|
|
216
|
+
# path where README.md is
|
|
217
|
+
@property
|
|
218
|
+
def _root_of_sdk(self) -> Path:
|
|
220
219
|
root_of_sdk = Path(".")
|
|
221
220
|
if self.code_model.options["no-namespace-folders"]:
|
|
222
221
|
compensation = Path("../" * (self.code_model.namespace.count(".") + 1))
|
|
223
222
|
root_of_sdk = root_of_sdk / compensation
|
|
223
|
+
return root_of_sdk
|
|
224
|
+
|
|
225
|
+
def _serialize_and_write_package_files(self) -> None:
|
|
226
|
+
root_of_sdk = self._root_of_sdk
|
|
224
227
|
if self.code_model.options["package-mode"] in VALID_PACKAGE_MODE:
|
|
225
228
|
env = Environment(
|
|
226
229
|
loader=PackageLoader("pygen.codegen", "templates/packaging_templates"),
|
|
@@ -247,15 +250,15 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
247
250
|
if not self.code_model.is_azure_flavor and template_name == "dev_requirements.txt.jinja2":
|
|
248
251
|
continue
|
|
249
252
|
file = template_name.replace(".jinja2", "")
|
|
250
|
-
|
|
251
|
-
if not self.read_file(
|
|
253
|
+
output_file = root_of_sdk / file
|
|
254
|
+
if not self.read_file(output_file) or file in _REGENERATE_FILES:
|
|
252
255
|
if self.keep_version_file and file == "setup.py" and not self.code_model.options["azure-arm"]:
|
|
253
256
|
# don't regenerate setup.py file if the version file is more up to date for data-plane
|
|
254
257
|
continue
|
|
255
|
-
|
|
258
|
+
file_content = self.read_file(output_file) if file == "pyproject.toml" else ""
|
|
256
259
|
self.write_file(
|
|
257
|
-
|
|
258
|
-
serializer.serialize_package_file(template_name,
|
|
260
|
+
output_file,
|
|
261
|
+
serializer.serialize_package_file(template_name, file_content, **params),
|
|
259
262
|
)
|
|
260
263
|
|
|
261
264
|
def _keep_patch_file(self, path_file: Path, env: Environment):
|
|
@@ -268,7 +271,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
268
271
|
)
|
|
269
272
|
|
|
270
273
|
def _serialize_and_write_models_folder(
|
|
271
|
-
self, env: Environment, namespace: str, models:
|
|
274
|
+
self, env: Environment, namespace: str, models: list[ModelType], enums: list[EnumType]
|
|
272
275
|
) -> None:
|
|
273
276
|
# Write the models folder
|
|
274
277
|
models_path = self.code_model.get_generation_dir(namespace) / "models"
|
|
@@ -311,7 +314,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
311
314
|
self,
|
|
312
315
|
env: Environment,
|
|
313
316
|
rest_path: Path,
|
|
314
|
-
request_builders:
|
|
317
|
+
request_builders: list[Union[RequestBuilder, OverloadedRequestBuilder]],
|
|
315
318
|
) -> None:
|
|
316
319
|
group_name = request_builders[0].group_name
|
|
317
320
|
output_path = rest_path / Path(group_name) if group_name else rest_path
|
|
@@ -336,7 +339,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
336
339
|
)
|
|
337
340
|
|
|
338
341
|
def _serialize_and_write_operations_folder(
|
|
339
|
-
self, operation_groups:
|
|
342
|
+
self, operation_groups: list[OperationGroup], env: Environment, namespace: str
|
|
340
343
|
) -> None:
|
|
341
344
|
operations_folder_name = self.code_model.operations_folder_name(namespace)
|
|
342
345
|
generation_path = self.code_model.get_generation_dir(namespace)
|
|
@@ -405,7 +408,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
405
408
|
def _serialize_client_and_config_files(
|
|
406
409
|
self,
|
|
407
410
|
namespace: str,
|
|
408
|
-
clients:
|
|
411
|
+
clients: list[Client],
|
|
409
412
|
env: Environment,
|
|
410
413
|
) -> None:
|
|
411
414
|
generation_path = self.code_model.get_generation_dir(namespace)
|
|
@@ -482,11 +485,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
482
485
|
|
|
483
486
|
# write the empty py.typed file
|
|
484
487
|
pytyped_value = "# Marker file for PEP 561."
|
|
485
|
-
|
|
486
|
-
if self.code_model.options["multiapi"]:
|
|
487
|
-
self.write_file(self.code_model.get_generation_dir(namespace) / Path("py.typed"), pytyped_value)
|
|
488
|
-
else:
|
|
489
|
-
self.write_file(root_dir / Path("py.typed"), pytyped_value)
|
|
488
|
+
self.write_file(root_dir / Path("py.typed"), pytyped_value)
|
|
490
489
|
|
|
491
490
|
# write _validation.py
|
|
492
491
|
if any(og for client in self.code_model.clients for og in client.operation_groups if og.need_validation):
|
|
@@ -502,40 +501,29 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
502
501
|
TypesSerializer(code_model=self.code_model, env=env).serialize(),
|
|
503
502
|
)
|
|
504
503
|
|
|
505
|
-
def _serialize_and_write_metadata(self, env: Environment, namespace: str) -> None:
|
|
506
|
-
metadata_serializer = MetadataSerializer(self.code_model, env)
|
|
507
|
-
self.write_file(
|
|
508
|
-
self.code_model.get_generation_dir(namespace) / Path("_metadata.json"), metadata_serializer.serialize()
|
|
509
|
-
)
|
|
510
|
-
|
|
511
504
|
# pylint: disable=line-too-long
|
|
512
505
|
@property
|
|
513
506
|
def sample_additional_folder(self) -> Path:
|
|
514
507
|
# For special package, we need to additional folder when generate samples.
|
|
515
|
-
# For example, azure-mgmt-resource is combined by multiple modules, and each module is
|
|
508
|
+
# For example, azure-mgmt-resource is combined by multiple modules, and each module is a package.
|
|
516
509
|
# one of namespace is "azure.mgmt.resource.resources.v2020_01_01", then additional folder is "resources"
|
|
517
510
|
# so that we could avoid conflict when generate samples.
|
|
518
511
|
# python config: https://github.com/Azure/azure-rest-api-specs/blob/main/specification/resources/resource-manager/readme.python.md
|
|
519
512
|
# generated SDK: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/resources/azure-mgmt-resource/generated_samples
|
|
520
|
-
namespace_config = get_namespace_config(self.code_model.namespace
|
|
513
|
+
namespace_config = get_namespace_config(self.code_model.namespace)
|
|
521
514
|
num_of_namespace = namespace_config.count(".") + 1
|
|
522
515
|
num_of_package_namespace = (
|
|
523
|
-
get_namespace_from_package_name(self.code_model.options.get("
|
|
516
|
+
get_namespace_from_package_name(self.code_model.options.get("package-name", "")).count(".") + 1
|
|
524
517
|
)
|
|
525
518
|
if num_of_namespace > num_of_package_namespace:
|
|
526
519
|
return Path("/".join(namespace_config.split(".")[num_of_package_namespace:]))
|
|
527
520
|
return Path("")
|
|
528
521
|
|
|
529
522
|
def _serialize_and_write_sample(self, env: Environment):
|
|
530
|
-
out_path =
|
|
523
|
+
out_path = self._root_of_sdk / "generated_samples"
|
|
531
524
|
for client in self.code_model.clients:
|
|
532
525
|
for op_group in client.operation_groups:
|
|
533
526
|
for operation in op_group.operations:
|
|
534
|
-
if (
|
|
535
|
-
self.code_model.options["multiapi"]
|
|
536
|
-
and operation.api_versions[0] != self.code_model.options["default-api-version"]
|
|
537
|
-
):
|
|
538
|
-
continue
|
|
539
527
|
samples = operation.yaml_data.get("samples")
|
|
540
528
|
if not samples or operation.name.startswith("_"):
|
|
541
529
|
continue
|
|
@@ -561,7 +549,7 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
561
549
|
|
|
562
550
|
def _serialize_and_write_test(self, env: Environment):
|
|
563
551
|
self.code_model.for_test = True
|
|
564
|
-
out_path =
|
|
552
|
+
out_path = self._root_of_sdk / "generated_tests"
|
|
565
553
|
general_serializer = TestGeneralSerializer(code_model=self.code_model, env=env)
|
|
566
554
|
self.write_file(out_path / "conftest.py", general_serializer.serialize_conftest())
|
|
567
555
|
if not self.code_model.options["azure-arm"]:
|
|
@@ -575,10 +563,6 @@ class JinjaSerializer(ReaderAndWriter):
|
|
|
575
563
|
|
|
576
564
|
for client in self.code_model.clients:
|
|
577
565
|
for og in client.operation_groups:
|
|
578
|
-
if self.code_model.options["multiapi"] and any(
|
|
579
|
-
o.api_versions[0] != self.code_model.options["default-api-version"] for o in og.operations
|
|
580
|
-
):
|
|
581
|
-
continue
|
|
582
566
|
test_serializer = TestSerializer(self.code_model, env, client=client, operation_group=og)
|
|
583
567
|
for async_mode in (True, False):
|
|
584
568
|
try:
|