@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
|
@@ -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:
|