@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.
Files changed (146) hide show
  1. package/README.md +2 -27
  2. package/autorest/codegen.py +0 -1
  3. package/autorest/jsonrpc/server.py +0 -3
  4. package/generator/build/lib/pygen/__init__.py +14 -23
  5. package/generator/build/lib/pygen/codegen/__init__.py +4 -4
  6. package/generator/build/lib/pygen/codegen/models/__init__.py +2 -2
  7. package/generator/build/lib/pygen/codegen/models/base.py +9 -12
  8. package/generator/build/lib/pygen/codegen/models/base_builder.py +4 -6
  9. package/generator/build/lib/pygen/codegen/models/client.py +61 -102
  10. package/generator/build/lib/pygen/codegen/models/code_model.py +29 -29
  11. package/generator/build/lib/pygen/codegen/models/combined_type.py +7 -7
  12. package/generator/build/lib/pygen/codegen/models/constant_type.py +4 -11
  13. package/generator/build/lib/pygen/codegen/models/credential_types.py +9 -11
  14. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +7 -8
  15. package/generator/build/lib/pygen/codegen/models/enum_type.py +7 -7
  16. package/generator/build/lib/pygen/codegen/models/imports.py +24 -29
  17. package/generator/build/lib/pygen/codegen/models/list_type.py +15 -14
  18. package/generator/build/lib/pygen/codegen/models/lro_operation.py +6 -6
  19. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
  20. package/generator/build/lib/pygen/codegen/models/model_type.py +11 -11
  21. package/generator/build/lib/pygen/codegen/models/operation.py +26 -56
  22. package/generator/build/lib/pygen/codegen/models/operation_group.py +11 -22
  23. package/generator/build/lib/pygen/codegen/models/paging_operation.py +15 -19
  24. package/generator/build/lib/pygen/codegen/models/parameter.py +12 -21
  25. package/generator/build/lib/pygen/codegen/models/parameter_list.py +37 -39
  26. package/generator/build/lib/pygen/codegen/models/primitive_types.py +24 -18
  27. package/generator/build/lib/pygen/codegen/models/property.py +10 -10
  28. package/generator/build/lib/pygen/codegen/models/request_builder.py +7 -8
  29. package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +3 -3
  30. package/generator/build/lib/pygen/codegen/models/response.py +15 -40
  31. package/generator/build/lib/pygen/codegen/models/utils.py +2 -2
  32. package/generator/build/lib/pygen/codegen/serializers/__init__.py +26 -42
  33. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +103 -100
  34. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +22 -25
  35. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +2 -2
  36. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +49 -61
  37. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +6 -7
  38. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -2
  39. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +15 -17
  40. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
  41. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -6
  42. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +28 -18
  43. package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +1 -2
  44. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +1 -2
  45. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +9 -14
  46. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +7 -7
  47. package/generator/build/lib/pygen/codegen/serializers/utils.py +2 -2
  48. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +30 -24
  49. package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
  50. package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
  51. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
  52. package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
  53. package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  54. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
  55. package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +1 -1
  56. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +11 -13
  57. package/generator/build/lib/pygen/codegen/templates/utils.py.jinja2 +6 -6
  58. package/generator/build/lib/pygen/preprocess/__init__.py +47 -30
  59. package/generator/build/lib/pygen/preprocess/helpers.py +2 -2
  60. package/generator/build/lib/pygen/utils.py +6 -6
  61. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  62. package/generator/pygen/__init__.py +14 -23
  63. package/generator/pygen/codegen/__init__.py +4 -4
  64. package/generator/pygen/codegen/models/__init__.py +2 -2
  65. package/generator/pygen/codegen/models/base.py +9 -12
  66. package/generator/pygen/codegen/models/base_builder.py +4 -6
  67. package/generator/pygen/codegen/models/client.py +61 -102
  68. package/generator/pygen/codegen/models/code_model.py +29 -29
  69. package/generator/pygen/codegen/models/combined_type.py +7 -7
  70. package/generator/pygen/codegen/models/constant_type.py +4 -11
  71. package/generator/pygen/codegen/models/credential_types.py +9 -11
  72. package/generator/pygen/codegen/models/dictionary_type.py +7 -8
  73. package/generator/pygen/codegen/models/enum_type.py +7 -7
  74. package/generator/pygen/codegen/models/imports.py +24 -29
  75. package/generator/pygen/codegen/models/list_type.py +15 -14
  76. package/generator/pygen/codegen/models/lro_operation.py +6 -6
  77. package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
  78. package/generator/pygen/codegen/models/model_type.py +11 -11
  79. package/generator/pygen/codegen/models/operation.py +26 -56
  80. package/generator/pygen/codegen/models/operation_group.py +11 -22
  81. package/generator/pygen/codegen/models/paging_operation.py +15 -19
  82. package/generator/pygen/codegen/models/parameter.py +12 -21
  83. package/generator/pygen/codegen/models/parameter_list.py +37 -39
  84. package/generator/pygen/codegen/models/primitive_types.py +24 -18
  85. package/generator/pygen/codegen/models/property.py +10 -10
  86. package/generator/pygen/codegen/models/request_builder.py +7 -8
  87. package/generator/pygen/codegen/models/request_builder_parameter.py +3 -3
  88. package/generator/pygen/codegen/models/response.py +15 -40
  89. package/generator/pygen/codegen/models/utils.py +2 -2
  90. package/generator/pygen/codegen/serializers/__init__.py +26 -42
  91. package/generator/pygen/codegen/serializers/builder_serializer.py +103 -100
  92. package/generator/pygen/codegen/serializers/client_serializer.py +22 -25
  93. package/generator/pygen/codegen/serializers/enum_serializer.py +2 -2
  94. package/generator/pygen/codegen/serializers/general_serializer.py +49 -61
  95. package/generator/pygen/codegen/serializers/import_serializer.py +6 -7
  96. package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -2
  97. package/generator/pygen/codegen/serializers/model_serializer.py +15 -17
  98. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
  99. package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -6
  100. package/generator/pygen/codegen/serializers/parameter_serializer.py +28 -18
  101. package/generator/pygen/codegen/serializers/patch_serializer.py +1 -2
  102. package/generator/pygen/codegen/serializers/request_builders_serializer.py +1 -2
  103. package/generator/pygen/codegen/serializers/sample_serializer.py +9 -14
  104. package/generator/pygen/codegen/serializers/test_serializer.py +7 -7
  105. package/generator/pygen/codegen/serializers/utils.py +2 -2
  106. package/generator/pygen/codegen/templates/model_base.py.jinja2 +30 -24
  107. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
  108. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
  109. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
  110. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
  111. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
  112. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
  113. package/generator/pygen/codegen/templates/patch.py.jinja2 +1 -1
  114. package/generator/pygen/codegen/templates/serialization.py.jinja2 +11 -13
  115. package/generator/pygen/codegen/templates/utils.py.jinja2 +6 -6
  116. package/generator/pygen/preprocess/__init__.py +47 -30
  117. package/generator/pygen/preprocess/helpers.py +2 -2
  118. package/generator/pygen/utils.py +6 -6
  119. package/generator/pygen.egg-info/SOURCES.txt +0 -2
  120. package/package.json +2 -2
  121. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  122. package/autorest/multiapi/__init__.py +0 -185
  123. package/autorest/multiapi/models/__init__.py +0 -16
  124. package/autorest/multiapi/models/client.py +0 -68
  125. package/autorest/multiapi/models/code_model.py +0 -142
  126. package/autorest/multiapi/models/config.py +0 -24
  127. package/autorest/multiapi/models/constant_global_parameter.py +0 -11
  128. package/autorest/multiapi/models/global_parameter.py +0 -34
  129. package/autorest/multiapi/models/global_parameters.py +0 -53
  130. package/autorest/multiapi/models/imports.py +0 -181
  131. package/autorest/multiapi/models/mixin_operation.py +0 -38
  132. package/autorest/multiapi/models/operation_group.py +0 -29
  133. package/autorest/multiapi/models/operation_mixin_group.py +0 -89
  134. package/autorest/multiapi/serializers/__init__.py +0 -145
  135. package/autorest/multiapi/serializers/import_serializer.py +0 -181
  136. package/autorest/multiapi/templates/multiapi_config.py.jinja2 +0 -89
  137. package/autorest/multiapi/templates/multiapi_init.py.jinja2 +0 -22
  138. package/autorest/multiapi/templates/multiapi_models.py.jinja2 +0 -9
  139. package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +0 -39
  140. package/autorest/multiapi/templates/multiapi_service_client.py.jinja2 +0 -163
  141. package/autorest/multiapi/templates/multiapi_version.py.jinja2 +0 -8
  142. package/autorest/multiapi/utils.py +0 -51
  143. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +0 -216
  144. package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +0 -167
  145. package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -216
  146. 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