@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
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
import sys
|
|
7
|
-
import json
|
|
8
|
-
import re
|
|
9
|
-
from typing import Any, Dict, List
|
|
10
|
-
from pathlib import Path
|
|
11
|
-
from .imports import FileImport, TypingSection, ImportType
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def _extract_version(metadata_json: Dict[str, Any], version_path: Path) -> str:
|
|
15
|
-
version = metadata_json["chosen_version"]
|
|
16
|
-
total_api_version_list = metadata_json["total_api_version_list"]
|
|
17
|
-
if not version:
|
|
18
|
-
if total_api_version_list:
|
|
19
|
-
sys.exit(f"Unable to match {total_api_version_list} to label {version_path.stem}")
|
|
20
|
-
else:
|
|
21
|
-
sys.exit(f"Unable to extract api version of {version_path.stem}")
|
|
22
|
-
return version
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class Client:
|
|
26
|
-
def __init__(
|
|
27
|
-
self,
|
|
28
|
-
azure_arm: bool,
|
|
29
|
-
default_version_metadata: Dict[str, Any],
|
|
30
|
-
version_path_to_metadata: Dict[Path, Dict[str, Any]],
|
|
31
|
-
):
|
|
32
|
-
self.name = default_version_metadata["client"]["name"]
|
|
33
|
-
self.pipeline_client = "ARMPipelineClient" if azure_arm else "PipelineClient"
|
|
34
|
-
self.filename = default_version_metadata["client"]["filename"]
|
|
35
|
-
self.host_value = default_version_metadata["client"]["host_value"]
|
|
36
|
-
self.description = default_version_metadata["client"]["description"]
|
|
37
|
-
self.client_side_validation = default_version_metadata["client"]["client-side-validation"]
|
|
38
|
-
self.default_version_metadata = default_version_metadata
|
|
39
|
-
self.version_path_to_metadata = version_path_to_metadata
|
|
40
|
-
|
|
41
|
-
def imports(self, async_mode: bool) -> FileImport:
|
|
42
|
-
imports_to_load = "async_imports" if async_mode else "sync_imports"
|
|
43
|
-
file_import = FileImport(json.loads(self.default_version_metadata["client"][imports_to_load]))
|
|
44
|
-
local_imports = file_import.imports.get(TypingSection.REGULAR, {}).get(ImportType.LOCAL, {})
|
|
45
|
-
for key in local_imports:
|
|
46
|
-
if re.search("^\\.*_utils.serialization$", key):
|
|
47
|
-
relative_path = ".." if async_mode else "."
|
|
48
|
-
local_imports[f"{relative_path}_serialization"] = local_imports.pop(key)
|
|
49
|
-
break
|
|
50
|
-
return file_import
|
|
51
|
-
|
|
52
|
-
@property
|
|
53
|
-
def parameterized_host_template_to_api_version(self) -> Dict[str, List[str]]:
|
|
54
|
-
parameterized_host_template_to_api_version: Dict[str, List[str]] = {}
|
|
55
|
-
for version_path, metadata_json in self.version_path_to_metadata.items():
|
|
56
|
-
parameterized_host_template = metadata_json["client"]["parameterized_host_template"]
|
|
57
|
-
version = _extract_version(metadata_json, version_path)
|
|
58
|
-
parameterized_host_template_to_api_version.setdefault(parameterized_host_template, []).append(version)
|
|
59
|
-
return parameterized_host_template_to_api_version
|
|
60
|
-
|
|
61
|
-
@property
|
|
62
|
-
def has_public_lro_operations(self) -> bool:
|
|
63
|
-
has_public_lro_operations = False
|
|
64
|
-
for _, metadata_json in self.version_path_to_metadata.items():
|
|
65
|
-
current_client_has_public_lro_operations = metadata_json["client"]["has_public_lro_operations"]
|
|
66
|
-
if current_client_has_public_lro_operations:
|
|
67
|
-
has_public_lro_operations = True
|
|
68
|
-
return has_public_lro_operations
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
|
|
7
|
-
from typing import Any, Dict, List, Optional
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from .client import Client
|
|
10
|
-
from .config import Config
|
|
11
|
-
from .operation_group import OperationGroup
|
|
12
|
-
from .operation_mixin_group import OperationMixinGroup
|
|
13
|
-
from .global_parameters import GlobalParameters
|
|
14
|
-
from ..utils import _get_default_api_version_from_list
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class CodeModel: # pylint: disable=too-many-instance-attributes
|
|
18
|
-
def __init__(
|
|
19
|
-
self,
|
|
20
|
-
module_name: str,
|
|
21
|
-
package_name: str,
|
|
22
|
-
default_api_version: str,
|
|
23
|
-
preview_mode: bool,
|
|
24
|
-
default_version_metadata: Dict[str, Any],
|
|
25
|
-
mod_to_api_version: Dict[str, str],
|
|
26
|
-
version_path_to_metadata: Dict[Path, Dict[str, Any]],
|
|
27
|
-
user_specified_default_api: Optional[str] = None,
|
|
28
|
-
):
|
|
29
|
-
self.module_name = module_name
|
|
30
|
-
self.package_name = package_name
|
|
31
|
-
self.mod_to_api_version = mod_to_api_version
|
|
32
|
-
self.default_api_version = default_api_version
|
|
33
|
-
self.preview_mode = preview_mode
|
|
34
|
-
self.azure_arm = default_version_metadata["client"]["azure_arm"]
|
|
35
|
-
self.default_version_metadata = default_version_metadata
|
|
36
|
-
self.version_path_to_metadata = version_path_to_metadata
|
|
37
|
-
self.client = Client(self.azure_arm, default_version_metadata, version_path_to_metadata)
|
|
38
|
-
self.config = Config(default_version_metadata)
|
|
39
|
-
self.operation_mixin_group = OperationMixinGroup(version_path_to_metadata, default_api_version)
|
|
40
|
-
self.global_parameters = GlobalParameters(default_version_metadata["global_parameters"])
|
|
41
|
-
self.user_specified_default_api = user_specified_default_api
|
|
42
|
-
self.options: Dict[str, Any] = {"flavor": "azure", "company_name": "Microsoft"}
|
|
43
|
-
self.core_library = "azure.core"
|
|
44
|
-
|
|
45
|
-
@property
|
|
46
|
-
def operation_groups(self) -> List[OperationGroup]:
|
|
47
|
-
operation_groups: List[OperationGroup] = []
|
|
48
|
-
for version_path, metadata_json in self.version_path_to_metadata.items():
|
|
49
|
-
if not metadata_json.get("operation_groups"):
|
|
50
|
-
continue
|
|
51
|
-
operation_groups_metadata = metadata_json["operation_groups"]
|
|
52
|
-
for (
|
|
53
|
-
operation_group_name,
|
|
54
|
-
operation_group_class_name,
|
|
55
|
-
) in operation_groups_metadata.items():
|
|
56
|
-
try:
|
|
57
|
-
operation_group = [og for og in operation_groups if og.name == operation_group_name][0]
|
|
58
|
-
except IndexError:
|
|
59
|
-
operation_group = OperationGroup(operation_group_name)
|
|
60
|
-
operation_groups.append(operation_group)
|
|
61
|
-
operation_group.append_available_api(version_path.name)
|
|
62
|
-
operation_group.append_api_class_name_pair(version_path.name, operation_group_class_name)
|
|
63
|
-
operation_groups.sort(key=lambda x: x.name)
|
|
64
|
-
return operation_groups
|
|
65
|
-
|
|
66
|
-
@property
|
|
67
|
-
def host_variable_name(self) -> str:
|
|
68
|
-
if self.client.parameterized_host_template_to_api_version:
|
|
69
|
-
return "base_url"
|
|
70
|
-
params = self.global_parameters.parameters + self.global_parameters.service_client_specific_global_parameters
|
|
71
|
-
try:
|
|
72
|
-
return next(p for p in params if p.name in ["endpoint", "base_url"]).name
|
|
73
|
-
except StopIteration:
|
|
74
|
-
return "_endpoint"
|
|
75
|
-
|
|
76
|
-
@property
|
|
77
|
-
def last_rt_list(self) -> Dict[str, str]:
|
|
78
|
-
"""Build the a mapping RT => API version if RT doesn't exist in latest detected API version.
|
|
79
|
-
|
|
80
|
-
Example:
|
|
81
|
-
last_rt_list = {
|
|
82
|
-
'check_dns_name_availability': '2018-05-01'
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
There is one subtle scenario if PREVIEW mode is disabled:
|
|
86
|
-
- RT1 available on 2019-05-01 and 2019-06-01-preview
|
|
87
|
-
- RT2 available on 2019-06-01-preview
|
|
88
|
-
- RT3 available on 2019-07-01-preview
|
|
89
|
-
|
|
90
|
-
Then, if I put "RT2: 2019-06-01-preview" in the list, this means I have to make
|
|
91
|
-
"2019-06-01-preview" the default for models loading (otherwise "RT2: 2019-06-01-preview" won't work).
|
|
92
|
-
But this likely breaks RT1 default operations at "2019-05-01", with default models at "2019-06-01-preview"
|
|
93
|
-
since "models" are shared for the entire set of operations groups (I wished models would be split by
|
|
94
|
-
operation groups, but meh, that's not the case)
|
|
95
|
-
|
|
96
|
-
So, until we have a smarter Autorest to deal with that, only preview RTs which do not share models with
|
|
97
|
-
a stable RT can be added to this map. In this case, RT2 is out, RT3 is in.
|
|
98
|
-
"""
|
|
99
|
-
|
|
100
|
-
def there_is_a_rt_that_contains_api_version(rt_dict, api_version):
|
|
101
|
-
"Test in the given api_version is is one of those RT."
|
|
102
|
-
for rt_api_version in rt_dict.values():
|
|
103
|
-
if api_version in rt_api_version:
|
|
104
|
-
return True
|
|
105
|
-
return False
|
|
106
|
-
|
|
107
|
-
last_rt_list = {}
|
|
108
|
-
|
|
109
|
-
# First let's map operation groups to their available APIs
|
|
110
|
-
versioned_dict = {
|
|
111
|
-
operation_group.name: operation_group.available_apis for operation_group in self.operation_groups
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
# Now let's also include mixins to their available APIs
|
|
115
|
-
versioned_dict.update(
|
|
116
|
-
{
|
|
117
|
-
mixin_operation.name: mixin_operation.available_apis
|
|
118
|
-
for mixin_operation in self.operation_mixin_group.mixin_operations
|
|
119
|
-
}
|
|
120
|
-
)
|
|
121
|
-
for operation, api_versions_list in versioned_dict.items():
|
|
122
|
-
local_default_api_version = _get_default_api_version_from_list(
|
|
123
|
-
self.mod_to_api_version,
|
|
124
|
-
api_versions_list,
|
|
125
|
-
self.preview_mode,
|
|
126
|
-
self.user_specified_default_api,
|
|
127
|
-
)
|
|
128
|
-
if local_default_api_version == self.default_api_version:
|
|
129
|
-
continue
|
|
130
|
-
# If some others RT contains "local_default_api_version", and
|
|
131
|
-
# if it's greater than the future default, danger, don't profile it
|
|
132
|
-
if (
|
|
133
|
-
there_is_a_rt_that_contains_api_version(versioned_dict, local_default_api_version)
|
|
134
|
-
and local_default_api_version > self.default_api_version
|
|
135
|
-
):
|
|
136
|
-
continue
|
|
137
|
-
last_rt_list[operation] = local_default_api_version
|
|
138
|
-
return last_rt_list
|
|
139
|
-
|
|
140
|
-
@property
|
|
141
|
-
def default_models(self):
|
|
142
|
-
return sorted({self.default_api_version} | {versions for _, versions in self.last_rt_list.items()})
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
import json
|
|
7
|
-
from typing import Any, Dict
|
|
8
|
-
from .imports import FileImport
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class Config:
|
|
12
|
-
def __init__(self, default_version_metadata: Dict[str, Any]):
|
|
13
|
-
self.credential = default_version_metadata["config"]["credential"]
|
|
14
|
-
self.credential_scopes = default_version_metadata["config"]["credential_scopes"]
|
|
15
|
-
self.default_version_metadata = default_version_metadata
|
|
16
|
-
|
|
17
|
-
def imports(self, async_mode: bool) -> FileImport:
|
|
18
|
-
imports_to_load = "async_imports" if async_mode else "sync_imports"
|
|
19
|
-
return FileImport(json.loads(self.default_version_metadata["config"][imports_to_load]))
|
|
20
|
-
|
|
21
|
-
def credential_call(self, async_mode: bool) -> str:
|
|
22
|
-
if async_mode:
|
|
23
|
-
return self.default_version_metadata["config"]["credential_call_async"]
|
|
24
|
-
return self.default_version_metadata["config"]["credential_call_sync"]
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class ConstantGlobalParameter:
|
|
9
|
-
def __init__(self, name: str, value: str):
|
|
10
|
-
self.name = name
|
|
11
|
-
self.value = value
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
from typing import Any, Dict
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class GlobalParameter:
|
|
10
|
-
def __init__(
|
|
11
|
-
self,
|
|
12
|
-
name: str,
|
|
13
|
-
global_parameter_metadata_sync: Dict[str, Any],
|
|
14
|
-
global_parameter_metadata_async: Dict[str, Any],
|
|
15
|
-
):
|
|
16
|
-
self.name = name
|
|
17
|
-
self.global_parameter_metadata_sync = global_parameter_metadata_sync
|
|
18
|
-
self.global_parameter_metadata_async = global_parameter_metadata_async
|
|
19
|
-
self.required = global_parameter_metadata_sync["required"]
|
|
20
|
-
self.method_location = global_parameter_metadata_sync["method_location"]
|
|
21
|
-
|
|
22
|
-
def _global_parameter_metadata(self, async_mode: bool) -> Dict[str, Any]:
|
|
23
|
-
if async_mode:
|
|
24
|
-
return self.global_parameter_metadata_async
|
|
25
|
-
return self.global_parameter_metadata_sync
|
|
26
|
-
|
|
27
|
-
def signature(self, async_mode: bool) -> str:
|
|
28
|
-
return self._global_parameter_metadata(async_mode)["signature"]
|
|
29
|
-
|
|
30
|
-
def description(self, async_mode: bool) -> str:
|
|
31
|
-
return self._global_parameter_metadata(async_mode)["description"]
|
|
32
|
-
|
|
33
|
-
def docstring_type(self, async_mode: bool) -> str:
|
|
34
|
-
return self._global_parameter_metadata(async_mode)["docstring_type"]
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
from typing import Any, Dict, List
|
|
7
|
-
from .global_parameter import GlobalParameter
|
|
8
|
-
from .constant_global_parameter import ConstantGlobalParameter
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def _convert_global_parameters(sync_metadata, async_metadata):
|
|
12
|
-
global_parameters = [
|
|
13
|
-
GlobalParameter(
|
|
14
|
-
name=parameter_name,
|
|
15
|
-
global_parameter_metadata_sync=gp_sync,
|
|
16
|
-
global_parameter_metadata_async=async_metadata[parameter_name],
|
|
17
|
-
)
|
|
18
|
-
for parameter_name, gp_sync in sync_metadata.items()
|
|
19
|
-
]
|
|
20
|
-
return global_parameters
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class GlobalParameters:
|
|
24
|
-
def __init__(
|
|
25
|
-
self,
|
|
26
|
-
global_parameters_metadata: Dict[str, Any],
|
|
27
|
-
):
|
|
28
|
-
self.call = global_parameters_metadata["call"]
|
|
29
|
-
self.global_parameters_metadata = global_parameters_metadata
|
|
30
|
-
|
|
31
|
-
@property
|
|
32
|
-
def service_client_specific_global_parameters(self) -> List[GlobalParameter]:
|
|
33
|
-
"""Return global params specific to multiapi service client + config
|
|
34
|
-
api_version, endpoint (re-adding it in specific are), and profile
|
|
35
|
-
"""
|
|
36
|
-
service_client_params_sync = self.global_parameters_metadata["service_client_specific"]["sync"]
|
|
37
|
-
service_client_params_async = self.global_parameters_metadata["service_client_specific"]["async"]
|
|
38
|
-
|
|
39
|
-
return _convert_global_parameters(service_client_params_sync, service_client_params_async)
|
|
40
|
-
|
|
41
|
-
@property
|
|
42
|
-
def parameters(self) -> List[GlobalParameter]:
|
|
43
|
-
global_parameters_metadata_sync = self.global_parameters_metadata["sync"]
|
|
44
|
-
global_parameters_metadata_async = self.global_parameters_metadata["async"]
|
|
45
|
-
|
|
46
|
-
return _convert_global_parameters(global_parameters_metadata_sync, global_parameters_metadata_async)
|
|
47
|
-
|
|
48
|
-
@property
|
|
49
|
-
def constant_parameters(self) -> List[ConstantGlobalParameter]:
|
|
50
|
-
return [
|
|
51
|
-
ConstantGlobalParameter(constant_name, constant_value)
|
|
52
|
-
for constant_name, constant_value in self.global_parameters_metadata["constant"].items()
|
|
53
|
-
]
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
from enum import Enum
|
|
7
|
-
from typing import Dict, Optional, Set, Union, Tuple, cast
|
|
8
|
-
from ..utils import convert_list_to_tuple
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
class ImportType(str, Enum):
|
|
12
|
-
STDLIB = "stdlib"
|
|
13
|
-
THIRDPARTY = "thirdparty"
|
|
14
|
-
SDKCORE = "sdkcore"
|
|
15
|
-
LOCAL = "local"
|
|
16
|
-
BYVERSION = "by_version"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class TypingSection(str, Enum):
|
|
20
|
-
REGULAR = "regular" # this import is always a typing import
|
|
21
|
-
CONDITIONAL = "conditional" # is a typing import when we're dealing with files that py2 will use, else regular
|
|
22
|
-
TYPING = "typing" # never a typing import
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class FileImport:
|
|
26
|
-
def __init__(
|
|
27
|
-
self,
|
|
28
|
-
imports: Optional[
|
|
29
|
-
Dict[
|
|
30
|
-
TypingSection,
|
|
31
|
-
Dict[
|
|
32
|
-
ImportType,
|
|
33
|
-
Dict[
|
|
34
|
-
str,
|
|
35
|
-
Set[
|
|
36
|
-
Optional[
|
|
37
|
-
Union[
|
|
38
|
-
str,
|
|
39
|
-
Tuple[
|
|
40
|
-
str,
|
|
41
|
-
str,
|
|
42
|
-
],
|
|
43
|
-
Tuple[
|
|
44
|
-
str,
|
|
45
|
-
Optional[str],
|
|
46
|
-
Tuple[Tuple[Tuple[int, int], str, Optional[str]]],
|
|
47
|
-
],
|
|
48
|
-
]
|
|
49
|
-
]
|
|
50
|
-
],
|
|
51
|
-
],
|
|
52
|
-
],
|
|
53
|
-
]
|
|
54
|
-
] = None,
|
|
55
|
-
) -> None:
|
|
56
|
-
# Basic implementation
|
|
57
|
-
# First level dict: TypingSection
|
|
58
|
-
# Second level dict: ImportType
|
|
59
|
-
# Third level dict: the package name.
|
|
60
|
-
# Fourth level set: None if this import is a "import", the name to import if it's a "from"
|
|
61
|
-
self._imports: Dict[
|
|
62
|
-
TypingSection,
|
|
63
|
-
Dict[
|
|
64
|
-
ImportType,
|
|
65
|
-
Dict[
|
|
66
|
-
str,
|
|
67
|
-
Set[
|
|
68
|
-
Optional[
|
|
69
|
-
Union[
|
|
70
|
-
str,
|
|
71
|
-
Tuple[
|
|
72
|
-
str,
|
|
73
|
-
str,
|
|
74
|
-
],
|
|
75
|
-
Tuple[
|
|
76
|
-
str,
|
|
77
|
-
Optional[str],
|
|
78
|
-
Tuple[Tuple[Tuple[int, int], str, Optional[str]]],
|
|
79
|
-
],
|
|
80
|
-
]
|
|
81
|
-
]
|
|
82
|
-
],
|
|
83
|
-
],
|
|
84
|
-
],
|
|
85
|
-
] = (
|
|
86
|
-
imports or {}
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
def _add_import(
|
|
90
|
-
self,
|
|
91
|
-
from_section: str,
|
|
92
|
-
import_type: ImportType,
|
|
93
|
-
name_import: Optional[
|
|
94
|
-
Union[
|
|
95
|
-
str,
|
|
96
|
-
Tuple[
|
|
97
|
-
str,
|
|
98
|
-
str,
|
|
99
|
-
],
|
|
100
|
-
Tuple[
|
|
101
|
-
str,
|
|
102
|
-
Optional[str],
|
|
103
|
-
Tuple[Tuple[Tuple[int, int], str, Optional[str]]],
|
|
104
|
-
],
|
|
105
|
-
]
|
|
106
|
-
] = None,
|
|
107
|
-
typing_section: TypingSection = TypingSection.REGULAR,
|
|
108
|
-
) -> None:
|
|
109
|
-
name_input = cast(
|
|
110
|
-
Optional[
|
|
111
|
-
Union[
|
|
112
|
-
str,
|
|
113
|
-
Tuple[
|
|
114
|
-
str,
|
|
115
|
-
str,
|
|
116
|
-
],
|
|
117
|
-
Tuple[
|
|
118
|
-
str,
|
|
119
|
-
Optional[str],
|
|
120
|
-
Tuple[Tuple[Tuple[int, int], str, Optional[str]]],
|
|
121
|
-
],
|
|
122
|
-
]
|
|
123
|
-
],
|
|
124
|
-
convert_list_to_tuple(name_import),
|
|
125
|
-
)
|
|
126
|
-
target_values = (
|
|
127
|
-
self._imports.setdefault(typing_section, {}).setdefault(import_type, {}).setdefault(from_section, set())
|
|
128
|
-
)
|
|
129
|
-
if isinstance(target_values, list):
|
|
130
|
-
if name_input not in target_values:
|
|
131
|
-
target_values.append(name_input)
|
|
132
|
-
else:
|
|
133
|
-
target_values.add(name_input)
|
|
134
|
-
|
|
135
|
-
def add_submodule_import(
|
|
136
|
-
self,
|
|
137
|
-
from_section: str,
|
|
138
|
-
name_import: str,
|
|
139
|
-
import_type: ImportType,
|
|
140
|
-
typing_section: TypingSection = TypingSection.REGULAR,
|
|
141
|
-
) -> None:
|
|
142
|
-
"""Add an import to this import block."""
|
|
143
|
-
self._add_import(from_section, import_type, name_import, typing_section)
|
|
144
|
-
|
|
145
|
-
@property
|
|
146
|
-
def imports(
|
|
147
|
-
self,
|
|
148
|
-
) -> Dict[
|
|
149
|
-
TypingSection,
|
|
150
|
-
Dict[
|
|
151
|
-
ImportType,
|
|
152
|
-
Dict[
|
|
153
|
-
str,
|
|
154
|
-
Set[
|
|
155
|
-
Optional[
|
|
156
|
-
Union[
|
|
157
|
-
str,
|
|
158
|
-
Tuple[
|
|
159
|
-
str,
|
|
160
|
-
str,
|
|
161
|
-
],
|
|
162
|
-
Tuple[
|
|
163
|
-
str,
|
|
164
|
-
Optional[str],
|
|
165
|
-
Tuple[Tuple[Tuple[int, int], str, Optional[str]]],
|
|
166
|
-
],
|
|
167
|
-
]
|
|
168
|
-
]
|
|
169
|
-
],
|
|
170
|
-
],
|
|
171
|
-
],
|
|
172
|
-
]:
|
|
173
|
-
return self._imports
|
|
174
|
-
|
|
175
|
-
def merge(self, file_import: "FileImport") -> None:
|
|
176
|
-
"""Merge the given file import format."""
|
|
177
|
-
for typing_section, import_type_dict in file_import.imports.items():
|
|
178
|
-
for import_type, package_list in import_type_dict.items():
|
|
179
|
-
for package_name, module_list in package_list.items():
|
|
180
|
-
for module_name in module_list:
|
|
181
|
-
self._add_import(package_name, import_type, module_name, typing_section)
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
from typing import Any, Dict, List, TypeVar
|
|
7
|
-
from ..utils import _sync_or_async
|
|
8
|
-
|
|
9
|
-
T = TypeVar("T")
|
|
10
|
-
OrderedSet = Dict[T, None]
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class MixinOperation:
|
|
14
|
-
def __init__(self, name: str, mixin_operation_metadata: Dict[str, Any]):
|
|
15
|
-
self.name = name
|
|
16
|
-
self.mixin_operation_metadata = mixin_operation_metadata
|
|
17
|
-
self._available_apis: OrderedSet[str] = {}
|
|
18
|
-
|
|
19
|
-
def call(self, async_mode: bool) -> str:
|
|
20
|
-
return self.mixin_operation_metadata[_sync_or_async(async_mode)]["call"]
|
|
21
|
-
|
|
22
|
-
def signature(self, async_mode: bool) -> str:
|
|
23
|
-
return self.mixin_operation_metadata[_sync_or_async(async_mode)]["signature"]
|
|
24
|
-
|
|
25
|
-
def description(self, async_mode: bool) -> str:
|
|
26
|
-
return self.mixin_operation_metadata[_sync_or_async(async_mode)]["doc"]
|
|
27
|
-
|
|
28
|
-
def coroutine(self, async_mode: bool) -> bool:
|
|
29
|
-
if not async_mode:
|
|
30
|
-
return False
|
|
31
|
-
return self.mixin_operation_metadata["async"]["coroutine"]
|
|
32
|
-
|
|
33
|
-
@property
|
|
34
|
-
def available_apis(self) -> List[str]:
|
|
35
|
-
return list(self._available_apis.keys())
|
|
36
|
-
|
|
37
|
-
def append_available_api(self, val: str) -> None:
|
|
38
|
-
self._available_apis[val] = None
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
from typing import Dict, List, TypeVar
|
|
7
|
-
|
|
8
|
-
T = TypeVar("T")
|
|
9
|
-
OrderedSet = Dict[T, None]
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class OperationGroup:
|
|
13
|
-
def __init__(self, name: str):
|
|
14
|
-
self.name = name
|
|
15
|
-
self._available_apis: OrderedSet[str] = {}
|
|
16
|
-
self._api_to_class_name: Dict[str, str] = {}
|
|
17
|
-
|
|
18
|
-
@property
|
|
19
|
-
def available_apis(self) -> List[str]:
|
|
20
|
-
return list(self._available_apis.keys())
|
|
21
|
-
|
|
22
|
-
def append_available_api(self, val: str) -> None:
|
|
23
|
-
self._available_apis[val] = None
|
|
24
|
-
|
|
25
|
-
def append_api_class_name_pair(self, api_version: str, class_name: str):
|
|
26
|
-
self._api_to_class_name[api_version] = class_name
|
|
27
|
-
|
|
28
|
-
def class_name(self, api_version: str):
|
|
29
|
-
return self._api_to_class_name[api_version]
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
# -------------------------------------------------------------------------
|
|
2
|
-
# Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
# Licensed under the MIT License. See License.txt in the project root for
|
|
4
|
-
# license information.
|
|
5
|
-
# --------------------------------------------------------------------------
|
|
6
|
-
import json
|
|
7
|
-
from typing import Any, Dict, List
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
from .imports import FileImport
|
|
10
|
-
from .mixin_operation import MixinOperation
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class OperationMixinGroup:
|
|
14
|
-
def __init__(
|
|
15
|
-
self,
|
|
16
|
-
version_path_to_metadata: Dict[Path, Dict[str, Any]],
|
|
17
|
-
default_api_version: str,
|
|
18
|
-
):
|
|
19
|
-
self.default_api_version = default_api_version
|
|
20
|
-
self.version_path_to_metadata = version_path_to_metadata
|
|
21
|
-
|
|
22
|
-
def imports(self, async_mode: bool) -> FileImport:
|
|
23
|
-
imports = FileImport()
|
|
24
|
-
imports_to_load = "async_imports" if async_mode else "sync_imports"
|
|
25
|
-
for metadata_json in self.version_path_to_metadata.values():
|
|
26
|
-
if not metadata_json.get("operation_mixins"):
|
|
27
|
-
continue
|
|
28
|
-
mixin_imports = metadata_json["operation_mixins"][imports_to_load]
|
|
29
|
-
if mixin_imports != "None":
|
|
30
|
-
current_version_imports = FileImport(json.loads(mixin_imports))
|
|
31
|
-
imports.merge(current_version_imports)
|
|
32
|
-
return imports
|
|
33
|
-
|
|
34
|
-
def typing_definitions(self, async_mode: bool) -> str:
|
|
35
|
-
key = "sync_mixin_typing_definitions" if async_mode else "async_mixin_typing_definitions"
|
|
36
|
-
origin = "".join(
|
|
37
|
-
[
|
|
38
|
-
metadata_json.get("operation_mixins", {}).get(key, "")
|
|
39
|
-
for metadata_json in self.version_path_to_metadata.values()
|
|
40
|
-
]
|
|
41
|
-
)
|
|
42
|
-
return "\n".join(set(origin.split("\n")))
|
|
43
|
-
|
|
44
|
-
def _use_metadata_of_default_api_version(self, mixin_operations: List[MixinOperation]) -> List[MixinOperation]:
|
|
45
|
-
default_api_version_path = [
|
|
46
|
-
version_path
|
|
47
|
-
for version_path in self.version_path_to_metadata.keys()
|
|
48
|
-
if version_path.name == self.default_api_version
|
|
49
|
-
][0]
|
|
50
|
-
default_version_metadata = self.version_path_to_metadata[default_api_version_path]
|
|
51
|
-
if not default_version_metadata.get("operation_mixins"):
|
|
52
|
-
return mixin_operations
|
|
53
|
-
for name, metadata in default_version_metadata["operation_mixins"]["operations"].items():
|
|
54
|
-
if name.startswith("_"):
|
|
55
|
-
continue
|
|
56
|
-
mixin_operation = [mo for mo in mixin_operations if mo.name == name][0]
|
|
57
|
-
mixin_operation.mixin_operation_metadata = metadata
|
|
58
|
-
return mixin_operations
|
|
59
|
-
|
|
60
|
-
@property
|
|
61
|
-
def mixin_operations(self) -> List[MixinOperation]:
|
|
62
|
-
mixin_operations: List[MixinOperation] = []
|
|
63
|
-
for version_path, metadata_json in self.version_path_to_metadata.items():
|
|
64
|
-
if not metadata_json.get("operation_mixins"):
|
|
65
|
-
continue
|
|
66
|
-
mixin_operations_metadata = metadata_json["operation_mixins"]["operations"]
|
|
67
|
-
for (
|
|
68
|
-
mixin_operation_name,
|
|
69
|
-
mixin_operation_metadata,
|
|
70
|
-
) in mixin_operations_metadata.items():
|
|
71
|
-
if mixin_operation_name.startswith("_"):
|
|
72
|
-
continue
|
|
73
|
-
try:
|
|
74
|
-
mixin_operation = [mo for mo in mixin_operations if mo.name == mixin_operation_name][0]
|
|
75
|
-
except IndexError:
|
|
76
|
-
mixin_operation = MixinOperation(
|
|
77
|
-
name=mixin_operation_name,
|
|
78
|
-
mixin_operation_metadata=mixin_operation_metadata,
|
|
79
|
-
)
|
|
80
|
-
mixin_operations.append(mixin_operation)
|
|
81
|
-
mixin_operation.append_available_api(version_path.name)
|
|
82
|
-
|
|
83
|
-
# make sure that the signature, doc, call, and coroutine is based off of the default api version,
|
|
84
|
-
# if the default api version has a definition for it.
|
|
85
|
-
# will hopefully get this removed once we deal with mixin operations with different signatures
|
|
86
|
-
# for different api versions
|
|
87
|
-
mixin_operations = self._use_metadata_of_default_api_version(mixin_operations)
|
|
88
|
-
mixin_operations.sort(key=lambda x: x.name)
|
|
89
|
-
return mixin_operations
|