@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 cast
|
|
7
7
|
|
|
8
8
|
from . import utils
|
|
9
9
|
from ..models import Client, ParameterMethodLocation, Parameter, ParameterLocation
|
|
@@ -38,7 +38,7 @@ class ClientSerializer:
|
|
|
38
38
|
response_type_annotation="None",
|
|
39
39
|
)
|
|
40
40
|
|
|
41
|
-
def pop_kwargs_from_signature(self) ->
|
|
41
|
+
def pop_kwargs_from_signature(self) -> list[str]:
|
|
42
42
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
43
43
|
self.client.parameters.kwargs_to_pop,
|
|
44
44
|
check_kwarg_dict=False,
|
|
@@ -50,15 +50,15 @@ class ClientSerializer:
|
|
|
50
50
|
class_name = self.client.name
|
|
51
51
|
base_class = ""
|
|
52
52
|
if self.client.has_mixin:
|
|
53
|
-
prefix = "
|
|
53
|
+
prefix = "_"
|
|
54
54
|
base_class = f"{prefix}{class_name}OperationsMixin"
|
|
55
55
|
pylint_disable = self.client.pylint_disable()
|
|
56
56
|
if base_class:
|
|
57
57
|
return f"class {class_name}({base_class}):{pylint_disable}"
|
|
58
58
|
return f"class {class_name}:{pylint_disable}"
|
|
59
59
|
|
|
60
|
-
def property_descriptions(self, async_mode: bool) ->
|
|
61
|
-
retval:
|
|
60
|
+
def property_descriptions(self, async_mode: bool) -> list[str]:
|
|
61
|
+
retval: list[str] = []
|
|
62
62
|
operations_folder = ".aio.operations." if async_mode else ".operations."
|
|
63
63
|
for og in [og for og in self.client.operation_groups if not og.is_mixin]:
|
|
64
64
|
retval.append(f":ivar {og.property_name}: {og.class_name} operations")
|
|
@@ -78,7 +78,7 @@ class ClientSerializer:
|
|
|
78
78
|
retval.append('"""')
|
|
79
79
|
return retval
|
|
80
80
|
|
|
81
|
-
def initialize_config(self) ->
|
|
81
|
+
def initialize_config(self) -> list[str]:
|
|
82
82
|
retval = []
|
|
83
83
|
additional_signatures = []
|
|
84
84
|
if self.client.need_cloud_setting:
|
|
@@ -86,7 +86,7 @@ class ClientSerializer:
|
|
|
86
86
|
endpoint_parameter = cast(Parameter, self.client.endpoint_parameter)
|
|
87
87
|
retval.extend(
|
|
88
88
|
[
|
|
89
|
-
|
|
89
|
+
"_cloud = cloud_setting or settings.current.azure_cloud # type: ignore",
|
|
90
90
|
"_endpoints = get_arm_endpoints(_cloud)",
|
|
91
91
|
f"if not {endpoint_parameter.client_name}:",
|
|
92
92
|
f' {endpoint_parameter.client_name} = _endpoints["resource_manager"]',
|
|
@@ -124,7 +124,7 @@ class ClientSerializer:
|
|
|
124
124
|
def should_init_super(self) -> bool:
|
|
125
125
|
return any(og for og in self.client.operation_groups if og.is_mixin and og.has_abstract_operations)
|
|
126
126
|
|
|
127
|
-
def initialize_pipeline_client(self, async_mode: bool) ->
|
|
127
|
+
def initialize_pipeline_client(self, async_mode: bool) -> list[str]:
|
|
128
128
|
result = []
|
|
129
129
|
pipeline_client_name = self.client.pipeline_class(async_mode)
|
|
130
130
|
endpoint_name = "base_url" if self.client.code_model.is_azure_flavor else "endpoint"
|
|
@@ -154,7 +154,7 @@ class ClientSerializer:
|
|
|
154
154
|
)
|
|
155
155
|
return result
|
|
156
156
|
|
|
157
|
-
def serializers_and_operation_groups_properties(self) ->
|
|
157
|
+
def serializers_and_operation_groups_properties(self) -> list[str]:
|
|
158
158
|
retval = []
|
|
159
159
|
|
|
160
160
|
def _get_client_models_value(models_dict_name: str) -> str:
|
|
@@ -169,12 +169,12 @@ class ClientSerializer:
|
|
|
169
169
|
)
|
|
170
170
|
model_dict_name = f"_models.{self.client.code_model.models_filename}" if add_private_models else "_models"
|
|
171
171
|
retval.append(
|
|
172
|
-
f"client_models{':
|
|
172
|
+
f"client_models{': dict[str, Any]' if not self.client.code_model.model_types else ''}"
|
|
173
173
|
f" = {_get_client_models_value(model_dict_name)}"
|
|
174
174
|
)
|
|
175
175
|
if add_private_models and self.client.code_model.model_types:
|
|
176
176
|
update_dict = "{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}"
|
|
177
|
-
retval.append(f"client_models
|
|
177
|
+
retval.append(f"client_models |= {update_dict}")
|
|
178
178
|
client_models_str = "client_models" if is_msrest_model else ""
|
|
179
179
|
retval.append(f"self._serialize = Serializer({client_models_str})")
|
|
180
180
|
retval.append(f"self._deserialize = Deserializer({client_models_str})")
|
|
@@ -182,10 +182,7 @@ class ClientSerializer:
|
|
|
182
182
|
retval.append("self._serialize.client_side_validation = False")
|
|
183
183
|
operation_groups = [og for og in self.client.operation_groups if not og.is_mixin]
|
|
184
184
|
for og in operation_groups:
|
|
185
|
-
|
|
186
|
-
api_version = f", '{og.api_versions[0]}'" if og.api_versions else ", None"
|
|
187
|
-
else:
|
|
188
|
-
api_version = ""
|
|
185
|
+
api_version = ""
|
|
189
186
|
retval.extend(
|
|
190
187
|
[
|
|
191
188
|
f"self.{og.property_name} = {og.class_name}(",
|
|
@@ -213,13 +210,13 @@ class ClientSerializer:
|
|
|
213
210
|
response_type_annotation=("Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse"),
|
|
214
211
|
)
|
|
215
212
|
|
|
216
|
-
def _example_make_call(self, async_mode: bool) ->
|
|
213
|
+
def _example_make_call(self, async_mode: bool) -> list[str]:
|
|
217
214
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
218
215
|
retval = [f">>> response = {'await ' if async_mode else ''}client.{self.client.send_request_name}(request)"]
|
|
219
216
|
retval.append(f"<{http_response}: 200 OK>")
|
|
220
217
|
return retval
|
|
221
218
|
|
|
222
|
-
def _request_builder_example(self, async_mode: bool) ->
|
|
219
|
+
def _request_builder_example(self, async_mode: bool) -> list[str]:
|
|
223
220
|
retval = [
|
|
224
221
|
"We have helper methods to create requests specific to this service in "
|
|
225
222
|
+ f"`{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}`."
|
|
@@ -242,14 +239,14 @@ class ClientSerializer:
|
|
|
242
239
|
retval.extend(self._example_make_call(async_mode))
|
|
243
240
|
return retval
|
|
244
241
|
|
|
245
|
-
def _rest_request_example(self, async_mode: bool) ->
|
|
242
|
+
def _rest_request_example(self, async_mode: bool) -> list[str]:
|
|
246
243
|
retval = [f">>> from {self.client.code_model.core_library}.rest import HttpRequest"]
|
|
247
244
|
retval.append('>>> request = HttpRequest("GET", "https://www.example.org/")')
|
|
248
245
|
retval.append("<HttpRequest [GET], url: 'https://www.example.org/'>")
|
|
249
246
|
retval.extend(self._example_make_call(async_mode))
|
|
250
247
|
return retval
|
|
251
248
|
|
|
252
|
-
def send_request_description(self, async_mode: bool) ->
|
|
249
|
+
def send_request_description(self, async_mode: bool) -> list[str]:
|
|
253
250
|
rest_library = f"{self.client.code_model.core_library}.rest"
|
|
254
251
|
retval = ['"""Runs the network request through the client\'s chained policies.']
|
|
255
252
|
retval.append("")
|
|
@@ -269,7 +266,7 @@ class ClientSerializer:
|
|
|
269
266
|
retval.append('"""')
|
|
270
267
|
return retval
|
|
271
268
|
|
|
272
|
-
def serialize_path(self) ->
|
|
269
|
+
def serialize_path(self) -> list[str]:
|
|
273
270
|
return self.parameter_serializer.serialize_path(self.client.parameters.path, "self._serialize")
|
|
274
271
|
|
|
275
272
|
|
|
@@ -294,7 +291,7 @@ class ConfigSerializer:
|
|
|
294
291
|
response_type_annotation="None",
|
|
295
292
|
)
|
|
296
293
|
|
|
297
|
-
def pop_kwargs_from_signature(self) ->
|
|
294
|
+
def pop_kwargs_from_signature(self) -> list[str]:
|
|
298
295
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
299
296
|
self.client.config.parameters.kwargs_to_pop,
|
|
300
297
|
check_kwarg_dict=False,
|
|
@@ -302,22 +299,22 @@ class ConfigSerializer:
|
|
|
302
299
|
pop_params_kwarg=PopKwargType.NO,
|
|
303
300
|
)
|
|
304
301
|
|
|
305
|
-
def set_constants(self) ->
|
|
302
|
+
def set_constants(self) -> list[str]:
|
|
306
303
|
return [
|
|
307
304
|
f"self.{p.client_name} = {p.client_default_value_declaration}"
|
|
308
305
|
for p in self.client.config.parameters.constant
|
|
309
306
|
if p not in self.client.config.parameters.method
|
|
310
307
|
]
|
|
311
308
|
|
|
312
|
-
def check_required_parameters(self) ->
|
|
309
|
+
def check_required_parameters(self) -> list[str]:
|
|
313
310
|
return [
|
|
314
311
|
f"if {p.client_name} is None:\n" f" raise ValueError(\"Parameter '{p.client_name}' must not be None.\")"
|
|
315
312
|
for p in self.client.config.parameters.method
|
|
316
313
|
if not (p.optional or p.constant)
|
|
317
314
|
]
|
|
318
315
|
|
|
319
|
-
def property_descriptions(self, async_mode: bool) ->
|
|
320
|
-
retval:
|
|
316
|
+
def property_descriptions(self, async_mode: bool) -> list[str]:
|
|
317
|
+
retval: list[str] = []
|
|
321
318
|
for p in self.client.config.parameters.method:
|
|
322
319
|
retval.append(f":{p.description_keyword} {p.client_name}: {p.description}")
|
|
323
320
|
retval.append(f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}")
|
|
@@ -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 Optional
|
|
6
|
+
from typing import Optional
|
|
7
7
|
from jinja2 import Environment
|
|
8
8
|
from .base_serializer import BaseSerializer
|
|
9
9
|
from ..models import FileImport, CodeModel, EnumType
|
|
@@ -17,7 +17,7 @@ class EnumSerializer(BaseSerializer):
|
|
|
17
17
|
env: Environment,
|
|
18
18
|
async_mode: bool = False,
|
|
19
19
|
*,
|
|
20
|
-
enums:
|
|
20
|
+
enums: list[EnumType],
|
|
21
21
|
client_namespace: Optional[str] = None
|
|
22
22
|
):
|
|
23
23
|
super().__init__(code_model, env, async_mode=async_mode, client_namespace=client_namespace)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
import json
|
|
7
|
-
from typing import Any
|
|
7
|
+
from typing import Any
|
|
8
8
|
import re
|
|
9
9
|
import tomli as tomllib
|
|
10
10
|
from packaging.version import parse as parse_version
|
|
@@ -19,9 +19,6 @@ from ..models.utils import NamespaceType
|
|
|
19
19
|
from .client_serializer import ClientSerializer, ConfigSerializer
|
|
20
20
|
from .base_serializer import BaseSerializer
|
|
21
21
|
|
|
22
|
-
if TYPE_CHECKING:
|
|
23
|
-
from pathlib import Path
|
|
24
|
-
|
|
25
22
|
VERSION_MAP = {
|
|
26
23
|
"msrest": "0.7.1",
|
|
27
24
|
"isodate": "0.6.1",
|
|
@@ -45,7 +42,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
45
42
|
"MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
|
|
46
43
|
"MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
|
|
47
44
|
}
|
|
48
|
-
params
|
|
45
|
+
params |= {"options": self.code_model.options}
|
|
49
46
|
return template.render(code_model=self.code_model, **params)
|
|
50
47
|
|
|
51
48
|
def _extract_min_dependency(self, s):
|
|
@@ -60,19 +57,20 @@ class GeneralSerializer(BaseSerializer):
|
|
|
60
57
|
m = re.search(r"[>=]=?([\d.]+(?:[a-z]+\d+)?)", s)
|
|
61
58
|
return parse_version(m.group(1)) if m else parse_version("0")
|
|
62
59
|
|
|
63
|
-
def _keep_pyproject_fields(self,
|
|
60
|
+
def _keep_pyproject_fields(self, file_content: str) -> dict:
|
|
64
61
|
# Load the pyproject.toml file if it exists and extract fields to keep.
|
|
65
62
|
result: dict = {"KEEP_FIELDS": {}}
|
|
66
63
|
try:
|
|
67
|
-
|
|
68
|
-
loaded_pyproject_toml = tomllib.load(f)
|
|
64
|
+
loaded_pyproject_toml = tomllib.loads(file_content)
|
|
69
65
|
except Exception: # pylint: disable=broad-except
|
|
70
66
|
# If parsing the pyproject.toml fails, we assume the it does not exist or is incorrectly formatted.
|
|
71
67
|
return result
|
|
72
68
|
|
|
73
|
-
# Keep azure-sdk-build configuration
|
|
69
|
+
# Keep "azure-sdk-build" and "packaging" configuration
|
|
74
70
|
if "tool" in loaded_pyproject_toml and "azure-sdk-build" in loaded_pyproject_toml["tool"]:
|
|
75
71
|
result["KEEP_FIELDS"]["tool.azure-sdk-build"] = loaded_pyproject_toml["tool"]["azure-sdk-build"]
|
|
72
|
+
if "packaging" in loaded_pyproject_toml:
|
|
73
|
+
result["KEEP_FIELDS"]["packaging"] = loaded_pyproject_toml["packaging"]
|
|
76
74
|
|
|
77
75
|
# Process dependencies
|
|
78
76
|
if "project" in loaded_pyproject_toml:
|
|
@@ -106,12 +104,12 @@ class GeneralSerializer(BaseSerializer):
|
|
|
106
104
|
|
|
107
105
|
return result
|
|
108
106
|
|
|
109
|
-
def serialize_package_file(self, template_name: str,
|
|
107
|
+
def serialize_package_file(self, template_name: str, file_content: str, **kwargs: Any) -> str:
|
|
110
108
|
template = self.env.get_template(template_name)
|
|
111
109
|
|
|
112
110
|
# Add fields to keep from an existing pyproject.toml
|
|
113
111
|
if template_name == "pyproject.toml.jinja2":
|
|
114
|
-
params = self._keep_pyproject_fields(
|
|
112
|
+
params = self._keep_pyproject_fields(file_content)
|
|
115
113
|
else:
|
|
116
114
|
params = {}
|
|
117
115
|
|
|
@@ -128,28 +126,26 @@ class GeneralSerializer(BaseSerializer):
|
|
|
128
126
|
dev_status = "4 - Beta"
|
|
129
127
|
else:
|
|
130
128
|
dev_status = "5 - Production/Stable"
|
|
131
|
-
params
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
params.update({"options": self.code_model.options})
|
|
145
|
-
params.update(kwargs)
|
|
129
|
+
params |= {
|
|
130
|
+
"code_model": self.code_model,
|
|
131
|
+
"dev_status": dev_status,
|
|
132
|
+
"token_credential": token_credential,
|
|
133
|
+
"pkgutil_names": [".".join(package_parts[: i + 1]) for i in range(len(package_parts))],
|
|
134
|
+
"init_names": ["/".join(package_parts[: i + 1]) + "/__init__.py" for i in range(len(package_parts))],
|
|
135
|
+
"client_name": self.code_model.clients[0].name if self.code_model.clients else "",
|
|
136
|
+
"VERSION_MAP": VERSION_MAP,
|
|
137
|
+
"MIN_PYTHON_VERSION": MIN_PYTHON_VERSION,
|
|
138
|
+
"MAX_PYTHON_VERSION": MAX_PYTHON_VERSION,
|
|
139
|
+
}
|
|
140
|
+
params |= {"options": self.code_model.options}
|
|
141
|
+
params |= kwargs
|
|
146
142
|
return template.render(file_import=FileImport(self.code_model), **params)
|
|
147
143
|
|
|
148
144
|
def serialize_pkgutil_init_file(self) -> str:
|
|
149
145
|
template = self.env.get_template("pkgutil_init.py.jinja2")
|
|
150
146
|
return template.render()
|
|
151
147
|
|
|
152
|
-
def serialize_init_file(self, clients:
|
|
148
|
+
def serialize_init_file(self, clients: list[Client]) -> str:
|
|
153
149
|
template = self.env.get_template("init.py.jinja2")
|
|
154
150
|
return template.render(
|
|
155
151
|
code_model=self.code_model,
|
|
@@ -158,7 +154,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
158
154
|
serialize_namespace=self.serialize_namespace,
|
|
159
155
|
)
|
|
160
156
|
|
|
161
|
-
def serialize_service_client_file(self, clients:
|
|
157
|
+
def serialize_service_client_file(self, clients: list[Client]) -> str:
|
|
162
158
|
template = self.env.get_template("client_container.py.jinja2")
|
|
163
159
|
|
|
164
160
|
imports = FileImport(self.code_model)
|
|
@@ -208,13 +204,10 @@ class GeneralSerializer(BaseSerializer):
|
|
|
208
204
|
)
|
|
209
205
|
if self.code_model.need_utils_form_data(self.async_mode, self.client_namespace):
|
|
210
206
|
file_import.add_submodule_import("typing", "IO", ImportType.STDLIB)
|
|
211
|
-
file_import.add_submodule_import("typing", "Tuple", ImportType.STDLIB)
|
|
212
207
|
file_import.add_submodule_import("typing", "Union", ImportType.STDLIB)
|
|
213
208
|
file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
|
|
214
209
|
file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
|
|
215
|
-
file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
|
|
216
210
|
file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
|
|
217
|
-
file_import.add_submodule_import("typing", "List", ImportType.STDLIB)
|
|
218
211
|
file_import.add_submodule_import(
|
|
219
212
|
".._utils.model_base",
|
|
220
213
|
"SdkJSONEncoder",
|
|
@@ -237,7 +230,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
237
230
|
client_namespace=self.client_namespace,
|
|
238
231
|
)
|
|
239
232
|
|
|
240
|
-
def serialize_config_file(self, clients:
|
|
233
|
+
def serialize_config_file(self, clients: list[Client]) -> str:
|
|
241
234
|
template = self.env.get_template("config_container.py.jinja2")
|
|
242
235
|
imports = FileImport(self.code_model)
|
|
243
236
|
for client in self.code_model.clients:
|
|
@@ -280,40 +273,35 @@ class GeneralSerializer(BaseSerializer):
|
|
|
280
273
|
f"{model.client_namespace}.models.{model.name}": model.cross_language_definition_id
|
|
281
274
|
for model in self.code_model.public_model_types
|
|
282
275
|
}
|
|
283
|
-
cross_langauge_def_dict
|
|
284
|
-
{
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
)
|
|
276
|
+
cross_langauge_def_dict |= {
|
|
277
|
+
f"{self.code_model.namespace}.models.{enum.name}": enum.cross_language_definition_id
|
|
278
|
+
for enum in self.code_model.enums
|
|
279
|
+
if not enum.internal
|
|
280
|
+
}
|
|
281
|
+
|
|
290
282
|
for client in self.code_model.clients:
|
|
291
283
|
for operation_group in client.operation_groups:
|
|
292
284
|
for operation in operation_group.operations:
|
|
293
285
|
if operation.name.startswith("_"):
|
|
294
286
|
continue
|
|
295
|
-
cross_langauge_def_dict
|
|
296
|
-
{
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
)
|
|
314
|
-
+ f"{operation.name}": operation.cross_language_definition_id
|
|
315
|
-
}
|
|
316
|
-
)
|
|
287
|
+
cross_langauge_def_dict |= {
|
|
288
|
+
f"{self.code_model.namespace}."
|
|
289
|
+
+ (
|
|
290
|
+
f"{client.name}."
|
|
291
|
+
if operation_group.is_mixin
|
|
292
|
+
else f"operations.{operation_group.class_name}."
|
|
293
|
+
)
|
|
294
|
+
+ f"{operation.name}": operation.cross_language_definition_id
|
|
295
|
+
}
|
|
296
|
+
cross_langauge_def_dict |= {
|
|
297
|
+
f"{self.code_model.namespace}.aio."
|
|
298
|
+
+ (
|
|
299
|
+
f"{client.name}."
|
|
300
|
+
if operation_group.is_mixin
|
|
301
|
+
else f"operations.{operation_group.class_name}."
|
|
302
|
+
)
|
|
303
|
+
+ f"{operation.name}": operation.cross_language_definition_id
|
|
304
|
+
}
|
|
317
305
|
return json.dumps(
|
|
318
306
|
{
|
|
319
307
|
"CrossLanguagePackageId": self.code_model.cross_language_package_id,
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
# license information.
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
from copy import deepcopy
|
|
7
|
-
from typing import List
|
|
8
7
|
from ..models.imports import (
|
|
9
8
|
ImportType,
|
|
10
9
|
FileImport,
|
|
@@ -14,7 +13,7 @@ from ..models.imports import (
|
|
|
14
13
|
)
|
|
15
14
|
|
|
16
15
|
|
|
17
|
-
def _serialize_package(imports:
|
|
16
|
+
def _serialize_package(imports: list[ImportModel], delimiter: str) -> str:
|
|
18
17
|
buffer = []
|
|
19
18
|
if any(i for i in imports if i.submodule_name is None):
|
|
20
19
|
buffer.append(f"import {imports[0].module_name}{f' as {imports[0].alias}' if imports[0].alias else ''}")
|
|
@@ -47,7 +46,7 @@ def _serialize_versioned_package(i: ImportModel, delimiter: str) -> str:
|
|
|
47
46
|
return delimiter.join(buffer)
|
|
48
47
|
|
|
49
48
|
|
|
50
|
-
def _serialize_import_type(imports:
|
|
49
|
+
def _serialize_import_type(imports: list[ImportModel], delimiter: str) -> str:
|
|
51
50
|
"""Serialize a given import type."""
|
|
52
51
|
import_list = []
|
|
53
52
|
for module_name in sorted(set(i.module_name for i in imports)):
|
|
@@ -60,7 +59,7 @@ def _serialize_import_type(imports: List[ImportModel], delimiter: str) -> str:
|
|
|
60
59
|
return delimiter.join(import_list)
|
|
61
60
|
|
|
62
61
|
|
|
63
|
-
def _get_import_clauses(imports:
|
|
62
|
+
def _get_import_clauses(imports: list[ImportModel], delimiter: str) -> list[str]:
|
|
64
63
|
import_clause = []
|
|
65
64
|
for import_type in ImportType:
|
|
66
65
|
imports_with_import_type = [i for i in imports if i.import_type == import_type]
|
|
@@ -91,15 +90,15 @@ class FileImportSerializer:
|
|
|
91
90
|
self.file_import.add_submodule_import("typing", "TYPE_CHECKING", ImportType.STDLIB)
|
|
92
91
|
|
|
93
92
|
def get_typing_definitions(self) -> str:
|
|
94
|
-
def declare_definition(type_name: str, type_definition: TypeDefinition) ->
|
|
95
|
-
ret:
|
|
93
|
+
def declare_definition(type_name: str, type_definition: TypeDefinition) -> list[str]:
|
|
94
|
+
ret: list[str] = []
|
|
96
95
|
definition_value = type_definition.async_definition if self.async_mode else type_definition.sync_definition
|
|
97
96
|
ret.append("{} = {}".format(type_name, definition_value))
|
|
98
97
|
return ret
|
|
99
98
|
|
|
100
99
|
if not self.file_import.type_definitions:
|
|
101
100
|
return ""
|
|
102
|
-
declarations:
|
|
101
|
+
declarations: list[str] = [""]
|
|
103
102
|
for type_name, value in self.file_import.type_definitions.items():
|
|
104
103
|
declarations.extend(declare_definition(type_name, value))
|
|
105
104
|
return "\n".join(declarations)
|
|
@@ -3,14 +3,13 @@
|
|
|
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 List
|
|
7
6
|
from jinja2 import Environment
|
|
8
7
|
from ..models import CodeModel, ModelType, EnumType
|
|
9
8
|
|
|
10
9
|
|
|
11
10
|
class ModelInitSerializer:
|
|
12
11
|
def __init__(
|
|
13
|
-
self, code_model: CodeModel, env: Environment, *, models:
|
|
12
|
+
self, code_model: CodeModel, env: Environment, *, models: list[ModelType], enums: list[EnumType]
|
|
14
13
|
) -> None:
|
|
15
14
|
self.code_model = code_model
|
|
16
15
|
self.env = env
|
|
@@ -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
|
|
7
7
|
from abc import ABC, abstractmethod
|
|
8
8
|
|
|
9
9
|
from ..models import ModelType, Property, ConstantType, EnumValue
|
|
@@ -13,8 +13,8 @@ from .base_serializer import BaseSerializer
|
|
|
13
13
|
from ..models.utils import NamespaceType
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
def _documentation_string(prop: Property, description_keyword: str, docstring_type_keyword: str) ->
|
|
17
|
-
retval:
|
|
16
|
+
def _documentation_string(prop: Property, description_keyword: str, docstring_type_keyword: str) -> list[str]:
|
|
17
|
+
retval: list[str] = []
|
|
18
18
|
sphinx_prefix = f":{description_keyword} {prop.client_name}:"
|
|
19
19
|
description = prop.description(is_operation_file=False).replace("\\", "\\\\")
|
|
20
20
|
retval.append(f"{sphinx_prefix} {description}" if description else sphinx_prefix)
|
|
@@ -24,7 +24,7 @@ def _documentation_string(prop: Property, description_keyword: str, docstring_ty
|
|
|
24
24
|
|
|
25
25
|
class _ModelSerializer(BaseSerializer, ABC):
|
|
26
26
|
def __init__(
|
|
27
|
-
self, code_model, env, async_mode=False, *, models:
|
|
27
|
+
self, code_model, env, async_mode=False, *, models: list[ModelType], client_namespace: Optional[str] = None
|
|
28
28
|
):
|
|
29
29
|
super().__init__(code_model, env, async_mode, client_namespace=client_namespace)
|
|
30
30
|
self.models = models
|
|
@@ -51,15 +51,15 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
51
51
|
return s.replace(".", "\\\\.")
|
|
52
52
|
|
|
53
53
|
@staticmethod
|
|
54
|
-
def input_documentation_string(prop: Property) ->
|
|
54
|
+
def input_documentation_string(prop: Property) -> list[str]:
|
|
55
55
|
# building the param line of the property doc
|
|
56
56
|
return _documentation_string(prop, "keyword", "paramtype")
|
|
57
57
|
|
|
58
58
|
@staticmethod
|
|
59
|
-
def variable_documentation_string(prop: Property) ->
|
|
59
|
+
def variable_documentation_string(prop: Property) -> list[str]:
|
|
60
60
|
return _documentation_string(prop, "ivar", "vartype")
|
|
61
61
|
|
|
62
|
-
def super_call(self, model: ModelType) ->
|
|
62
|
+
def super_call(self, model: ModelType) -> list[str]:
|
|
63
63
|
return [f"super().__init__({self.properties_to_pass_to_super(model)})"]
|
|
64
64
|
|
|
65
65
|
@staticmethod
|
|
@@ -91,7 +91,7 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
91
91
|
def _init_line_parameters(model: ModelType):
|
|
92
92
|
return [p for p in model.properties if not p.readonly and not p.is_discriminator and not p.constant]
|
|
93
93
|
|
|
94
|
-
def init_line(self, model: ModelType) ->
|
|
94
|
+
def init_line(self, model: ModelType) -> list[str]:
|
|
95
95
|
init_properties_declaration = []
|
|
96
96
|
init_line_parameters = self._init_line_parameters(model)
|
|
97
97
|
init_line_parameters.sort(key=lambda x: x.optional)
|
|
@@ -113,12 +113,12 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
113
113
|
return ", ".join(properties_to_pass_to_super)
|
|
114
114
|
|
|
115
115
|
@abstractmethod
|
|
116
|
-
def initialize_properties(self, model: ModelType) ->
|
|
116
|
+
def initialize_properties(self, model: ModelType) -> list[str]: ...
|
|
117
117
|
|
|
118
118
|
def need_init(self, model: ModelType) -> bool:
|
|
119
119
|
return bool(self.init_line(model) or model.discriminator)
|
|
120
120
|
|
|
121
|
-
def pylint_disable_items(self, model: ModelType) ->
|
|
121
|
+
def pylint_disable_items(self, model: ModelType) -> list[str]:
|
|
122
122
|
if model.flattened_property or self.initialize_properties(model):
|
|
123
123
|
return [""]
|
|
124
124
|
if any(p for p in model.properties if p.is_discriminator and model.discriminator_value):
|
|
@@ -172,7 +172,7 @@ class MsrestModelSerializer(_ModelSerializer):
|
|
|
172
172
|
return f"class {model.name}({basename}):{model.pylint_disable()}"
|
|
173
173
|
|
|
174
174
|
@staticmethod
|
|
175
|
-
def get_properties_to_initialize(model: ModelType) ->
|
|
175
|
+
def get_properties_to_initialize(model: ModelType) -> list[Property]:
|
|
176
176
|
if model.parents:
|
|
177
177
|
properties_to_initialize = list(
|
|
178
178
|
{
|
|
@@ -186,7 +186,7 @@ class MsrestModelSerializer(_ModelSerializer):
|
|
|
186
186
|
properties_to_initialize = model.properties
|
|
187
187
|
return properties_to_initialize
|
|
188
188
|
|
|
189
|
-
def initialize_properties(self, model: ModelType) ->
|
|
189
|
+
def initialize_properties(self, model: ModelType) -> list[str]:
|
|
190
190
|
init_args = []
|
|
191
191
|
for prop in self.get_properties_to_initialize(model):
|
|
192
192
|
if prop.is_discriminator:
|
|
@@ -215,7 +215,7 @@ class MsrestModelSerializer(_ModelSerializer):
|
|
|
215
215
|
|
|
216
216
|
|
|
217
217
|
class DpgModelSerializer(_ModelSerializer):
|
|
218
|
-
def super_call(self, model: ModelType) ->
|
|
218
|
+
def super_call(self, model: ModelType) -> list[str]:
|
|
219
219
|
super_call = f"super().__init__({self.properties_to_pass_to_super(model)})"
|
|
220
220
|
if model.flattened_property:
|
|
221
221
|
return [
|
|
@@ -264,8 +264,6 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
264
264
|
parent.name,
|
|
265
265
|
ImportType.LOCAL,
|
|
266
266
|
)
|
|
267
|
-
if model.is_polymorphic:
|
|
268
|
-
file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
|
|
269
267
|
if self.need_init(model):
|
|
270
268
|
file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
|
|
271
269
|
file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
|
|
@@ -281,7 +279,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
281
279
|
return f"class {model.name}({basename}):{model.pylint_disable()}"
|
|
282
280
|
|
|
283
281
|
@staticmethod
|
|
284
|
-
def get_properties_to_declare(model: ModelType) ->
|
|
282
|
+
def get_properties_to_declare(model: ModelType) -> list[Property]:
|
|
285
283
|
if model.parents:
|
|
286
284
|
parent_properties = [p for bm in model.parents for p in bm.properties]
|
|
287
285
|
properties_to_declare = [
|
|
@@ -328,7 +326,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
328
326
|
generated_code = f'{prop.client_name}: {type_annotation} = {field}({", ".join(args)})'
|
|
329
327
|
return f"{generated_code}{type_ignore}"
|
|
330
328
|
|
|
331
|
-
def initialize_properties(self, model: ModelType) ->
|
|
329
|
+
def initialize_properties(self, model: ModelType) -> list[str]:
|
|
332
330
|
init_args = []
|
|
333
331
|
for prop in self.get_properties_to_declare(model):
|
|
334
332
|
if prop.constant and not prop.is_base_discriminator:
|
|
@@ -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 Optional,
|
|
6
|
+
from typing import Optional, Union
|
|
7
7
|
import functools
|
|
8
8
|
from jinja2 import Environment
|
|
9
9
|
|
|
@@ -27,7 +27,7 @@ class OperationGroupsSerializer(BaseSerializer):
|
|
|
27
27
|
def __init__(
|
|
28
28
|
self,
|
|
29
29
|
code_model: CodeModel,
|
|
30
|
-
operation_groups:
|
|
30
|
+
operation_groups: list[OperationGroup],
|
|
31
31
|
env: Environment,
|
|
32
32
|
async_mode: bool,
|
|
33
33
|
*,
|
|
@@ -39,7 +39,7 @@ class OperationGroupsSerializer(BaseSerializer):
|
|
|
39
39
|
|
|
40
40
|
def _get_request_builders(
|
|
41
41
|
self, operation_group: OperationGroup
|
|
42
|
-
) ->
|
|
42
|
+
) -> list[Union[OverloadedRequestBuilder, RequestBuilder]]:
|
|
43
43
|
return [
|
|
44
44
|
r
|
|
45
45
|
for r in operation_group.client.request_builders
|