@azure-tools/typespec-python 0.32.1 → 0.34.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 (150) hide show
  1. package/dist/scripts/copy-scripts.d.ts +2 -0
  2. package/dist/scripts/copy-scripts.d.ts.map +1 -0
  3. package/dist/scripts/copy-scripts.js +24 -0
  4. package/dist/scripts/copy-scripts.js.map +1 -0
  5. package/dist/scripts/eng/lint.js +1 -1
  6. package/dist/scripts/eng/lint.js.map +1 -1
  7. package/dist/src/emitter.d.ts +0 -2
  8. package/dist/src/emitter.d.ts.map +1 -1
  9. package/dist/src/emitter.js +2 -102
  10. package/dist/src/emitter.js.map +1 -1
  11. package/dist/src/index.d.ts +1 -1
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +1 -1
  14. package/dist/src/index.js.map +1 -1
  15. package/package.json +22 -19
  16. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  17. package/scripts/copy-scripts.ts +26 -0
  18. package/scripts/eng/lint.ts +1 -1
  19. package/scripts/eng/pylintrc +2 -1
  20. package/dist/src/code-model.d.ts +0 -4
  21. package/dist/src/code-model.d.ts.map +0 -1
  22. package/dist/src/code-model.js +0 -190
  23. package/dist/src/code-model.js.map +0 -1
  24. package/dist/src/external-process.d.ts +0 -20
  25. package/dist/src/external-process.d.ts.map +0 -1
  26. package/dist/src/external-process.js +0 -44
  27. package/dist/src/external-process.js.map +0 -1
  28. package/dist/src/http.d.ts +0 -7
  29. package/dist/src/http.d.ts.map +0 -1
  30. package/dist/src/http.js +0 -266
  31. package/dist/src/http.js.map +0 -1
  32. package/dist/src/types.d.ts +0 -36
  33. package/dist/src/types.d.ts.map +0 -1
  34. package/dist/src/types.js +0 -488
  35. package/dist/src/types.js.map +0 -1
  36. package/dist/src/utils.d.ts +0 -26
  37. package/dist/src/utils.d.ts.map +0 -1
  38. package/dist/src/utils.js +0 -151
  39. package/dist/src/utils.js.map +0 -1
  40. package/generator/LICENSE +0 -21
  41. package/generator/README.md +0 -1
  42. package/generator/dev_requirements.txt +0 -5
  43. package/generator/pygen/__init__.py +0 -107
  44. package/generator/pygen/_version.py +0 -7
  45. package/generator/pygen/black.py +0 -69
  46. package/generator/pygen/codegen/__init__.py +0 -338
  47. package/generator/pygen/codegen/_utils.py +0 -16
  48. package/generator/pygen/codegen/models/__init__.py +0 -204
  49. package/generator/pygen/codegen/models/base.py +0 -186
  50. package/generator/pygen/codegen/models/base_builder.py +0 -119
  51. package/generator/pygen/codegen/models/client.py +0 -430
  52. package/generator/pygen/codegen/models/code_model.py +0 -237
  53. package/generator/pygen/codegen/models/combined_type.py +0 -149
  54. package/generator/pygen/codegen/models/constant_type.py +0 -129
  55. package/generator/pygen/codegen/models/credential_types.py +0 -214
  56. package/generator/pygen/codegen/models/dictionary_type.py +0 -127
  57. package/generator/pygen/codegen/models/enum_type.py +0 -238
  58. package/generator/pygen/codegen/models/imports.py +0 -291
  59. package/generator/pygen/codegen/models/list_type.py +0 -143
  60. package/generator/pygen/codegen/models/lro_operation.py +0 -142
  61. package/generator/pygen/codegen/models/lro_paging_operation.py +0 -32
  62. package/generator/pygen/codegen/models/model_type.py +0 -362
  63. package/generator/pygen/codegen/models/operation.py +0 -530
  64. package/generator/pygen/codegen/models/operation_group.py +0 -184
  65. package/generator/pygen/codegen/models/paging_operation.py +0 -155
  66. package/generator/pygen/codegen/models/parameter.py +0 -412
  67. package/generator/pygen/codegen/models/parameter_list.py +0 -387
  68. package/generator/pygen/codegen/models/primitive_types.py +0 -659
  69. package/generator/pygen/codegen/models/property.py +0 -171
  70. package/generator/pygen/codegen/models/request_builder.py +0 -189
  71. package/generator/pygen/codegen/models/request_builder_parameter.py +0 -115
  72. package/generator/pygen/codegen/models/response.py +0 -348
  73. package/generator/pygen/codegen/models/utils.py +0 -23
  74. package/generator/pygen/codegen/serializers/__init__.py +0 -574
  75. package/generator/pygen/codegen/serializers/base_serializer.py +0 -21
  76. package/generator/pygen/codegen/serializers/builder_serializer.py +0 -1513
  77. package/generator/pygen/codegen/serializers/client_serializer.py +0 -295
  78. package/generator/pygen/codegen/serializers/enum_serializer.py +0 -15
  79. package/generator/pygen/codegen/serializers/general_serializer.py +0 -213
  80. package/generator/pygen/codegen/serializers/import_serializer.py +0 -127
  81. package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -198
  82. package/generator/pygen/codegen/serializers/model_init_serializer.py +0 -33
  83. package/generator/pygen/codegen/serializers/model_serializer.py +0 -300
  84. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +0 -89
  85. package/generator/pygen/codegen/serializers/operations_init_serializer.py +0 -44
  86. package/generator/pygen/codegen/serializers/parameter_serializer.py +0 -221
  87. package/generator/pygen/codegen/serializers/patch_serializer.py +0 -19
  88. package/generator/pygen/codegen/serializers/request_builders_serializer.py +0 -52
  89. package/generator/pygen/codegen/serializers/sample_serializer.py +0 -168
  90. package/generator/pygen/codegen/serializers/test_serializer.py +0 -293
  91. package/generator/pygen/codegen/serializers/types_serializer.py +0 -31
  92. package/generator/pygen/codegen/serializers/utils.py +0 -68
  93. package/generator/pygen/codegen/templates/client.py.jinja2 +0 -37
  94. package/generator/pygen/codegen/templates/client_container.py.jinja2 +0 -12
  95. package/generator/pygen/codegen/templates/config.py.jinja2 +0 -73
  96. package/generator/pygen/codegen/templates/config_container.py.jinja2 +0 -16
  97. package/generator/pygen/codegen/templates/conftest.py.jinja2 +0 -28
  98. package/generator/pygen/codegen/templates/enum.py.jinja2 +0 -13
  99. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +0 -10
  100. package/generator/pygen/codegen/templates/init.py.jinja2 +0 -24
  101. package/generator/pygen/codegen/templates/keywords.jinja2 +0 -19
  102. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +0 -16
  103. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +0 -18
  104. package/generator/pygen/codegen/templates/macros.jinja2 +0 -12
  105. package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
  106. package/generator/pygen/codegen/templates/model_base.py.jinja2 +0 -1158
  107. package/generator/pygen/codegen/templates/model_container.py.jinja2 +0 -13
  108. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +0 -98
  109. package/generator/pygen/codegen/templates/model_init.py.jinja2 +0 -28
  110. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +0 -92
  111. package/generator/pygen/codegen/templates/operation.py.jinja2 +0 -21
  112. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +0 -75
  113. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +0 -20
  114. package/generator/pygen/codegen/templates/operation_tools.jinja2 +0 -81
  115. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +0 -17
  116. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +0 -6
  117. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +0 -21
  118. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +0 -8
  119. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +0 -107
  120. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +0 -9
  121. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +0 -108
  122. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +0 -21
  123. package/generator/pygen/codegen/templates/patch.py.jinja2 +0 -19
  124. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +0 -1
  125. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +0 -28
  126. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +0 -10
  127. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +0 -12
  128. package/generator/pygen/codegen/templates/sample.py.jinja2 +0 -44
  129. package/generator/pygen/codegen/templates/serialization.py.jinja2 +0 -2115
  130. package/generator/pygen/codegen/templates/test.py.jinja2 +0 -50
  131. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +0 -26
  132. package/generator/pygen/codegen/templates/types.py.jinja2 +0 -8
  133. package/generator/pygen/codegen/templates/validation.py.jinja2 +0 -38
  134. package/generator/pygen/codegen/templates/vendor.py.jinja2 +0 -96
  135. package/generator/pygen/codegen/templates/version.py.jinja2 +0 -4
  136. package/generator/pygen/m2r.py +0 -65
  137. package/generator/pygen/postprocess/__init__.py +0 -183
  138. package/generator/pygen/postprocess/get_all.py +0 -19
  139. package/generator/pygen/postprocess/venvtools.py +0 -75
  140. package/generator/pygen/preprocess/__init__.py +0 -509
  141. package/generator/pygen/preprocess/helpers.py +0 -27
  142. package/generator/pygen/preprocess/python_mappings.py +0 -224
  143. package/generator/pygen/utils.py +0 -160
  144. package/generator/pygen.egg-info/PKG-INFO +0 -25
  145. package/generator/pygen.egg-info/SOURCES.txt +0 -66
  146. package/generator/pygen.egg-info/dependency_links.txt +0 -1
  147. package/generator/pygen.egg-info/requires.txt +0 -4
  148. package/generator/pygen.egg-info/top_level.txt +0 -1
  149. package/generator/requirements.txt +0 -12
  150. package/generator/setup.py +0 -55
@@ -1,430 +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, TYPE_CHECKING, TypeVar, Generic, Union, List, Optional
7
-
8
- from .base import BaseModel
9
- from .parameter_list import ClientGlobalParameterList, ConfigGlobalParameterList
10
- from .imports import FileImport, ImportType, TypingSection, MsrestImportType
11
- from .utils import add_to_pylint_disable, NAME_LENGTH_LIMIT
12
- from .operation_group import OperationGroup
13
- from .request_builder import (
14
- RequestBuilder,
15
- OverloadedRequestBuilder,
16
- get_request_builder,
17
- )
18
- from .parameter import Parameter, ParameterMethodLocation
19
- from .lro_operation import LROOperation
20
- from .lro_paging_operation import LROPagingOperation
21
- from ...utils import extract_original_name
22
-
23
- ParameterListType = TypeVar(
24
- "ParameterListType",
25
- bound=Union[ClientGlobalParameterList, ConfigGlobalParameterList],
26
- )
27
-
28
- if TYPE_CHECKING:
29
- from .code_model import CodeModel
30
- from . import OperationType
31
-
32
-
33
- class _ClientConfigBase(Generic[ParameterListType], BaseModel):
34
- """The service client base. Shared across our Client and Config type"""
35
-
36
- def __init__(
37
- self,
38
- yaml_data: Dict[str, Any],
39
- code_model: "CodeModel",
40
- parameters: ParameterListType,
41
- ):
42
- super().__init__(yaml_data, code_model)
43
- self.parameters = parameters
44
- self.url: str = self.yaml_data["url"] # the base endpoint of the client. Can be parameterized or not
45
- self.legacy_filename: str = self.yaml_data.get("legacyFilename", "client")
46
-
47
- @property
48
- def description(self) -> str:
49
- return self.yaml_data["description"]
50
-
51
- @property
52
- def name(self) -> str:
53
- return self.yaml_data["name"]
54
-
55
-
56
- class Client(_ClientConfigBase[ClientGlobalParameterList]):
57
- """Model representing our service client"""
58
-
59
- def __init__(
60
- self,
61
- yaml_data: Dict[str, Any],
62
- code_model: "CodeModel",
63
- parameters: ClientGlobalParameterList,
64
- *,
65
- is_subclient: bool = False,
66
- ):
67
- super().__init__(yaml_data, code_model, parameters)
68
- self.operation_groups: List[OperationGroup] = []
69
- self.config = Config.from_yaml(yaml_data, self.code_model)
70
- self.is_subclient = is_subclient
71
- self.request_builders = self._build_request_builders()
72
- if self.code_model.options["show_operations"]:
73
- self.operation_groups = [
74
- OperationGroup.from_yaml(op_group, code_model, self)
75
- for op_group in self.yaml_data.get("operationGroups", [])
76
- ]
77
- self.link_lro_initial_operations()
78
- self.request_id_header_name = self.yaml_data.get("requestIdHeaderName", None)
79
- self.has_etag: bool = yaml_data.get("hasEtag", False)
80
-
81
- def _build_request_builders(
82
- self,
83
- ) -> List[Union[RequestBuilder, OverloadedRequestBuilder]]:
84
- request_builders: List[Union[RequestBuilder, OverloadedRequestBuilder]] = []
85
-
86
- def add_og_request_builder(og: Dict[str, Any]):
87
- for operation_yaml in og["operations"]:
88
- request_builder = get_request_builder(
89
- operation_yaml,
90
- code_model=self.code_model,
91
- client=self,
92
- )
93
- if operation_yaml.get("isLroInitialOperation"):
94
- # we want to change the name
95
- request_builder.name = request_builder.get_name(
96
- extract_original_name(request_builder.yaml_data["name"]),
97
- request_builder.yaml_data,
98
- request_builder.code_model,
99
- request_builder.client,
100
- )
101
- if request_builder.overloads:
102
- request_builders.extend(request_builder.overloads)
103
- request_builders.append(request_builder)
104
- if operation_yaml.get("nextOperation"):
105
- # i am a paging operation and i have a next operation.
106
- # Make sure to include my next operation
107
- request_builders.append(
108
- get_request_builder(
109
- operation_yaml["nextOperation"],
110
- code_model=self.code_model,
111
- client=self,
112
- )
113
- )
114
-
115
- queue = self.yaml_data.get("operationGroups", []).copy()
116
- while queue:
117
- now = queue.pop(0)
118
- add_og_request_builder(now)
119
- if now.get("operationGroups"):
120
- queue.extend(now["operationGroups"])
121
-
122
- return request_builders
123
-
124
- def pipeline_class(self, async_mode: bool) -> str:
125
- if self.code_model.options["azure_arm"]:
126
- if async_mode:
127
- return "AsyncARMPipelineClient"
128
- return "ARMPipelineClient"
129
- if async_mode:
130
- return "AsyncPipelineClient"
131
- return "PipelineClient"
132
-
133
- @property
134
- def credential(self) -> Optional[Parameter]:
135
- """The credential param, if one exists"""
136
- return self.parameters.credential
137
-
138
- @property
139
- def send_request_name(self) -> str:
140
- """Name of the send request function"""
141
- return "send_request" if self.code_model.options["show_send_request"] else "_send_request"
142
-
143
- @property
144
- def has_parameterized_host(self) -> bool:
145
- """Whether the base url is parameterized or not"""
146
- return not any(p for p in self.parameters if p.is_host)
147
-
148
- @property
149
- def pylint_disable(self) -> str:
150
- retval = add_to_pylint_disable("", "client-accepts-api-version-keyword")
151
- if len(self.operation_groups) > 6:
152
- retval = add_to_pylint_disable(retval, "too-many-instance-attributes")
153
- if len(self.name) > NAME_LENGTH_LIMIT:
154
- retval = add_to_pylint_disable(retval, "name-too-long")
155
- return retval
156
-
157
- @property
158
- def url_pylint_disable(self) -> str:
159
- # if the url is too long
160
- retval = ""
161
- if len(self.url) > 85:
162
- retval = add_to_pylint_disable(retval, "line-too-long")
163
- return retval
164
-
165
- @property
166
- def filename(self) -> str:
167
- """Name of the file for the client"""
168
- if self.code_model.options["version_tolerant"] or self.code_model.options["low_level_client"]:
169
- return "_client"
170
- return f"_{self.legacy_filename}"
171
-
172
- def lookup_request_builder(self, request_builder_id: int) -> Union[RequestBuilder, OverloadedRequestBuilder]:
173
- """Find the request builder based off of id"""
174
- try:
175
- return next(rb for rb in self.request_builders if id(rb.yaml_data) == request_builder_id)
176
- except StopIteration as exc:
177
- raise KeyError(f"No request builder with id {request_builder_id} found.") from exc
178
-
179
- def lookup_operation(self, operation_id: int) -> "OperationType":
180
- try:
181
- return next(o for og in self.operation_groups for o in og.operations if id(o.yaml_data) == operation_id)
182
- except StopIteration as exc:
183
- raise KeyError(f"No operation with id {operation_id} found.") from exc
184
-
185
- def _imports_shared(self, async_mode: bool) -> FileImport:
186
- file_import = FileImport(self.code_model)
187
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
188
- if self.code_model.options["azure_arm"]:
189
- file_import.add_submodule_import("azure.mgmt.core", self.pipeline_class(async_mode), ImportType.SDKCORE)
190
- else:
191
- file_import.add_submodule_import(
192
- "" if self.code_model.is_azure_flavor else "runtime",
193
- self.pipeline_class(async_mode),
194
- ImportType.SDKCORE,
195
- )
196
-
197
- for gp in self.parameters:
198
- if gp.method_location == ParameterMethodLocation.KWARG:
199
- continue
200
- file_import.merge(
201
- gp.imports(
202
- async_mode,
203
- relative_path=".." if async_mode else ".",
204
- operation=True,
205
- )
206
- )
207
- file_import.add_submodule_import(
208
- "._configuration",
209
- f"{self.name}Configuration",
210
- ImportType.LOCAL,
211
- )
212
- file_import.add_msrest_import(
213
- relative_path=".." if async_mode else ".",
214
- msrest_import_type=MsrestImportType.SerializerDeserializer,
215
- typing_section=TypingSection.REGULAR,
216
- )
217
- file_import.add_submodule_import(
218
- "pipeline" if self.code_model.is_azure_flavor else "runtime",
219
- "policies",
220
- ImportType.SDKCORE,
221
- )
222
- if self.code_model.options["azure_arm"]:
223
- async_prefix = "Async" if async_mode else ""
224
- file_import.add_submodule_import(
225
- "azure.mgmt.core.policies",
226
- f"{async_prefix}ARMAutoResourceProviderRegistrationPolicy",
227
- ImportType.SDKCORE,
228
- )
229
-
230
- # import for "Self"
231
- file_import.add_submodule_import(
232
- "typing_extensions",
233
- "Self",
234
- ImportType.STDLIB,
235
- )
236
- return file_import
237
-
238
- @property
239
- def has_mixin(self) -> bool:
240
- """Do we want a mixin ABC class for typing purposes?"""
241
- return any(og for og in self.operation_groups if og.is_mixin)
242
-
243
- @property
244
- def lro_operations(self) -> List["OperationType"]:
245
- """all LRO operations in this SDK?"""
246
- return [operation for operation_group in self.operation_groups for operation in operation_group.lro_operations]
247
-
248
- @property
249
- def has_public_lro_operations(self) -> bool:
250
- """Are there any public LRO operations in this SDK?"""
251
- return any(not operation.internal for operation in self.lro_operations)
252
-
253
- @property
254
- def has_operations(self) -> bool:
255
- return any(operation_group.has_operations for operation_group in self.operation_groups)
256
-
257
- def link_lro_initial_operations(self) -> None:
258
- """Link each LRO operation to its initial operation"""
259
- for operation_group in self.operation_groups:
260
- for operation in operation_group.operations:
261
- if isinstance(operation, (LROOperation, LROPagingOperation)):
262
- operation.initial_operation = self.lookup_operation(id(operation.yaml_data["initialOperation"]))
263
-
264
- @property
265
- def has_abstract_operations(self) -> bool:
266
- """Whether there is abstract operation in any operation group."""
267
- return any(og.has_abstract_operations for og in self.operation_groups)
268
-
269
- @property
270
- def has_non_abstract_operations(self) -> bool:
271
- """Whether there is non-abstract operation in any operation group."""
272
- return any(og.has_non_abstract_operations for og in self.operation_groups)
273
-
274
- def imports(self, async_mode: bool) -> FileImport:
275
- file_import = self._imports_shared(async_mode)
276
- if async_mode:
277
- file_import.add_submodule_import("typing", "Awaitable", ImportType.STDLIB)
278
- file_import.add_submodule_import(
279
- "rest",
280
- "AsyncHttpResponse",
281
- ImportType.SDKCORE,
282
- TypingSection.CONDITIONAL,
283
- )
284
- else:
285
- file_import.add_submodule_import(
286
- "rest",
287
- "HttpResponse",
288
- ImportType.SDKCORE,
289
- TypingSection.CONDITIONAL,
290
- )
291
- file_import.add_submodule_import(
292
- "rest",
293
- "HttpRequest",
294
- ImportType.SDKCORE,
295
- TypingSection.CONDITIONAL,
296
- )
297
- for og in self.operation_groups:
298
- file_import.add_submodule_import(
299
- f".{self.code_model.operations_folder_name}",
300
- og.class_name,
301
- ImportType.LOCAL,
302
- )
303
-
304
- if self.code_model.model_types and self.code_model.options["models_mode"] == "msrest":
305
- path_to_models = ".." if async_mode else "."
306
- file_import.add_submodule_import(path_to_models, "models", ImportType.LOCAL, alias="_models")
307
- elif self.code_model.options["models_mode"] == "msrest":
308
- # in this case, we have client_models = {} in the service client, which needs a type annotation
309
- # this import will always be commented, so will always add it to the typing section
310
- file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
311
- file_import.add_submodule_import("copy", "deepcopy", ImportType.STDLIB)
312
- return file_import
313
-
314
- def imports_for_multiapi(self, async_mode: bool) -> FileImport:
315
- file_import = self._imports_shared(async_mode)
316
- file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB, TypingSection.CONDITIONAL)
317
- try:
318
- mixin_operation = next(og for og in self.operation_groups if og.is_mixin)
319
- file_import.add_submodule_import("._operations_mixin", mixin_operation.class_name, ImportType.LOCAL)
320
- except StopIteration:
321
- pass
322
- file_import.add_submodule_import("azure.profiles", "KnownProfiles", import_type=ImportType.SDKCORE)
323
- file_import.add_submodule_import("azure.profiles", "ProfileDefinition", import_type=ImportType.SDKCORE)
324
- file_import.add_submodule_import(
325
- "azure.profiles.multiapiclient",
326
- "MultiApiClientMixin",
327
- import_type=ImportType.SDKCORE,
328
- )
329
- return file_import
330
-
331
- @classmethod
332
- def from_yaml(
333
- cls,
334
- yaml_data: Dict[str, Any],
335
- code_model: "CodeModel",
336
- *,
337
- is_subclient: bool = False,
338
- ) -> "Client":
339
- return cls(
340
- yaml_data=yaml_data,
341
- code_model=code_model,
342
- parameters=ClientGlobalParameterList.from_yaml(yaml_data, code_model),
343
- is_subclient=is_subclient,
344
- )
345
-
346
-
347
- class Config(_ClientConfigBase[ConfigGlobalParameterList]):
348
- """Model representing our Config type."""
349
-
350
- @property
351
- def pylint_disable(self) -> str:
352
- retval = add_to_pylint_disable("", "too-many-instance-attributes")
353
- if len(self.name) + len("Configuration") > NAME_LENGTH_LIMIT:
354
- retval = add_to_pylint_disable(retval, "name-too-long")
355
- return retval
356
-
357
- @property
358
- def description(self) -> str:
359
- return (
360
- f"Configuration for {self.yaml_data['name']}.\n\n."
361
- "Note that all parameters used to create this instance are saved as instance attributes."
362
- )
363
-
364
- @property
365
- def sdk_moniker(self) -> str:
366
- package_name = self.code_model.options["package_name"]
367
- if package_name and package_name.startswith("azure-"):
368
- package_name = package_name[len("azure-") :]
369
- return package_name if package_name else self.yaml_data["name"].lower()
370
-
371
- @property
372
- def name(self) -> str:
373
- return f"{super().name}Configuration"
374
-
375
- def _imports_shared(self, async_mode: bool) -> FileImport:
376
- file_import = FileImport(self.code_model)
377
- file_import.add_submodule_import(
378
- "pipeline" if self.code_model.is_azure_flavor else "runtime",
379
- "policies",
380
- ImportType.SDKCORE,
381
- )
382
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
383
- if self.code_model.options["package_version"]:
384
- file_import.add_submodule_import(".._version" if async_mode else "._version", "VERSION", ImportType.LOCAL)
385
- if self.code_model.options["azure_arm"]:
386
- policy = "AsyncARMChallengeAuthenticationPolicy" if async_mode else "ARMChallengeAuthenticationPolicy"
387
- file_import.add_submodule_import("azure.mgmt.core.policies", "ARMHttpLoggingPolicy", ImportType.SDKCORE)
388
- file_import.add_submodule_import("azure.mgmt.core.policies", policy, ImportType.SDKCORE)
389
-
390
- return file_import
391
-
392
- def imports(self, async_mode: bool) -> FileImport:
393
- file_import = self._imports_shared(async_mode)
394
- for gp in self.parameters:
395
- if gp.method_location == ParameterMethodLocation.KWARG and gp not in self.parameters.kwargs_to_pop:
396
- continue
397
- file_import.merge(
398
- gp.imports(
399
- async_mode=async_mode,
400
- relative_path=".." if async_mode else ".",
401
- operation=True,
402
- )
403
- )
404
- return file_import
405
-
406
- def imports_for_multiapi(self, async_mode: bool) -> FileImport:
407
- file_import = self._imports_shared(async_mode)
408
- for gp in self.parameters:
409
- if (
410
- gp.method_location == ParameterMethodLocation.KWARG
411
- and gp not in self.parameters.kwargs_to_pop
412
- and gp.client_name == "api_version"
413
- ):
414
- continue
415
- file_import.merge(
416
- gp.imports_for_multiapi(
417
- async_mode=async_mode,
418
- relative_path=".." if async_mode else ".",
419
- operation=True,
420
- )
421
- )
422
- return file_import
423
-
424
- @classmethod
425
- def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel") -> "Config":
426
- return cls(
427
- yaml_data=yaml_data,
428
- code_model=code_model,
429
- parameters=ConfigGlobalParameterList.from_yaml(yaml_data, code_model),
430
- )
@@ -1,237 +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 List, Dict, Any, Set, Union, Literal
7
-
8
- from .base import BaseType
9
- from .enum_type import EnumType
10
- from .model_type import ModelType, UsageFlags
11
- from .combined_type import CombinedType
12
- from .client import Client
13
- from .request_builder import RequestBuilder, OverloadedRequestBuilder
14
-
15
-
16
- def _is_legacy(options) -> bool:
17
- return not (options.get("version_tolerant") or options.get("low_level_client"))
18
-
19
-
20
- class CodeModel: # pylint: disable=too-many-public-methods, disable=too-many-instance-attributes
21
- """Top level code model
22
-
23
- :param options: Options of the code model. I.e., whether this is for management generation
24
- :type options: dict[str, bool]
25
- :param str module_name: The module name for the client. Is in snake case.
26
- :param str class_name: The class name for the client. Is in pascal case.
27
- :param str description: The description of the client
28
- :param str namespace: The namespace of our module
29
- :param schemas: The list of schemas we are going to serialize in the models files. Maps their yaml
30
- id to our created ModelType.
31
- :type schemas: dict[int, ~autorest.models.ModelType]
32
- :param sorted_schemas: Our schemas in order by inheritance and alphabet
33
- :type sorted_schemas: list[~autorest.models.ModelType]
34
- :param enums: The enums, if any, we are going to serialize. Maps their yaml id to our created EnumType.
35
- :type enums: Dict[int, ~autorest.models.EnumType]
36
- :param primitives: List of schemas we've created that are not EnumSchemas or ObjectSchemas. Maps their
37
- yaml id to our created schemas.
38
- :type primitives: Dict[int, ~autorest.models.BaseType]
39
- :param package_dependency: All the dependencies needed in setup.py
40
- :type package_dependency: Dict[str, str]
41
- """
42
-
43
- def __init__(
44
- self,
45
- yaml_data: Dict[str, Any],
46
- options: Dict[str, Any],
47
- *,
48
- is_subnamespace: bool = False,
49
- ) -> None:
50
- self.yaml_data = yaml_data
51
- self.options = options
52
- self.namespace = self.yaml_data["namespace"]
53
- self.types_map: Dict[int, BaseType] = {} # map yaml id to schema
54
- self._model_types: List[ModelType] = []
55
- from . import build_type
56
-
57
- for type_yaml in yaml_data.get("types", []):
58
- build_type(yaml_data=type_yaml, code_model=self)
59
- self.clients: List[Client] = [
60
- Client.from_yaml(client_yaml_data, self) for client_yaml_data in yaml_data["clients"]
61
- ]
62
- self.subnamespace_to_clients: Dict[str, List[Client]] = {
63
- subnamespace: [Client.from_yaml(client_yaml, self, is_subclient=True) for client_yaml in client_yamls]
64
- for subnamespace, client_yamls in yaml_data.get("subnamespaceToClients", {}).items()
65
- }
66
- if self.options["models_mode"] and self.model_types:
67
- self.sort_model_types()
68
- self.is_subnamespace = is_subnamespace
69
- self.named_unions: List[CombinedType] = [
70
- t for t in self.types_map.values() if isinstance(t, CombinedType) and t.name
71
- ]
72
- self.cross_language_package_id = self.yaml_data.get("crossLanguagePackageId")
73
- self.for_test: bool = False
74
-
75
- @property
76
- def has_form_data(self) -> bool:
77
- return any(og.has_form_data_body for client in self.clients for og in client.operation_groups)
78
-
79
- @property
80
- def has_etag(self) -> bool:
81
- return any(client.has_etag for client in self.clients)
82
-
83
- @property
84
- def has_operations(self) -> bool:
85
- if any(c for c in self.clients if c.has_operations):
86
- return True
87
- return any(c for clients in self.subnamespace_to_clients.values() for c in clients if c.has_operations)
88
-
89
- @property
90
- def has_non_abstract_operations(self) -> bool:
91
- return any(c for c in self.clients if c.has_non_abstract_operations) or any(
92
- c for cs in self.subnamespace_to_clients.values() for c in cs if c.has_non_abstract_operations
93
- )
94
-
95
- def lookup_request_builder(self, request_builder_id: int) -> Union[RequestBuilder, OverloadedRequestBuilder]:
96
- """Find the request builder based off of id"""
97
- for client in self.clients:
98
- try:
99
- return client.lookup_request_builder(request_builder_id)
100
- except KeyError:
101
- pass
102
- raise KeyError(f"No request builder with id {request_builder_id} found.")
103
-
104
- @property
105
- def is_azure_flavor(self) -> bool:
106
- return self.options["flavor"] == "azure"
107
-
108
- @property
109
- def rest_layer_name(self) -> str:
110
- """If we have a separate rest layer, what is its name?"""
111
- return "rest" if self.options["builders_visibility"] == "public" else "_rest"
112
-
113
- @property
114
- def client_filename(self) -> str:
115
- return self.clients[0].filename
116
-
117
- def need_vendored_code(self, async_mode: bool) -> bool:
118
- """Whether we need to vendor code in the _vendor.py file for this SDK"""
119
- if self.has_abstract_operations:
120
- return True
121
- if async_mode:
122
- return self.need_mixin_abc
123
- return self.need_mixin_abc or self.has_etag or self.has_form_data
124
-
125
- @property
126
- def need_mixin_abc(self) -> bool:
127
- return any(c for c in self.clients if c.has_mixin)
128
-
129
- @property
130
- def has_abstract_operations(self) -> bool:
131
- return any(c for c in self.clients if c.has_abstract_operations)
132
-
133
- @property
134
- def operations_folder_name(self) -> str:
135
- """Get the name of the operations folder that holds operations."""
136
- name = "operations"
137
- if self.options["version_tolerant"] and not any(
138
- og for client in self.clients for og in client.operation_groups if not og.is_mixin
139
- ):
140
- name = f"_{name}"
141
- return name
142
-
143
- @property
144
- def description(self) -> str:
145
- return self.clients[0].description
146
-
147
- def lookup_type(self, schema_id: int) -> BaseType:
148
- """Looks to see if the schema has already been created.
149
-
150
- :param int schema_id: The yaml id of the schema
151
- :return: If created, we return the created schema, otherwise, we throw.
152
- :rtype: ~autorest.models.BaseType
153
- :raises: KeyError if schema is not found
154
- """
155
- try:
156
- return next(type for id, type in self.types_map.items() if id == schema_id)
157
- except StopIteration as exc:
158
- raise KeyError(f"Couldn't find schema with id {schema_id}") from exc
159
-
160
- @property
161
- def model_types(self) -> List[ModelType]:
162
- """All of the model types in this class"""
163
- if not self._model_types:
164
- self._model_types = [
165
- t for t in self.types_map.values() if isinstance(t, ModelType) and t.usage != UsageFlags.Default.value
166
- ]
167
- return self._model_types
168
-
169
- @model_types.setter
170
- def model_types(self, val: List[ModelType]) -> None:
171
- self._model_types = val
172
-
173
- @property
174
- def public_model_types(self) -> List[ModelType]:
175
- return [m for m in self.model_types if not m.internal and not m.base == "json"]
176
-
177
- @property
178
- def enums(self) -> List[EnumType]:
179
- """All of the enums"""
180
- return [t for t in self.types_map.values() if isinstance(t, EnumType)]
181
-
182
- @property
183
- def core_library(self) -> Literal["azure.core", "corehttp"]:
184
- return "azure.core" if self.is_azure_flavor else "corehttp"
185
-
186
- def _sort_model_types_helper(
187
- self,
188
- current: ModelType,
189
- seen_schema_names: Set[str],
190
- seen_schema_yaml_ids: Set[int],
191
- ):
192
- if current.id in seen_schema_yaml_ids:
193
- return []
194
- if current.name in seen_schema_names:
195
- raise ValueError(f"We have already generated a schema with name {current.name}")
196
- ancestors = [current]
197
- if current.parents:
198
- for parent in current.parents:
199
- if parent.id in seen_schema_yaml_ids:
200
- continue
201
- seen_schema_names.add(current.name)
202
- seen_schema_yaml_ids.add(current.id)
203
- ancestors = self._sort_model_types_helper(parent, seen_schema_names, seen_schema_yaml_ids) + ancestors
204
- seen_schema_names.add(current.name)
205
- seen_schema_yaml_ids.add(current.id)
206
- return ancestors
207
-
208
- def sort_model_types(self) -> None:
209
- """Sorts the final object schemas by inheritance and by alphabetical order.
210
-
211
- :return: None
212
- :rtype: None
213
- """
214
- seen_schema_names: Set[str] = set()
215
- seen_schema_yaml_ids: Set[int] = set()
216
- sorted_object_schemas: List[ModelType] = []
217
- for schema in sorted(self.model_types, key=lambda x: x.name.lower()):
218
- sorted_object_schemas.extend(self._sort_model_types_helper(schema, seen_schema_names, seen_schema_yaml_ids))
219
- self.model_types = sorted_object_schemas
220
-
221
- @property
222
- def models_filename(self) -> str:
223
- """Get the names of the model file(s)"""
224
- if self.is_legacy:
225
- return "_models_py3"
226
- return "_models"
227
-
228
- @property
229
- def enums_filename(self) -> str:
230
- """The name of the enums file"""
231
- if self.is_legacy:
232
- return f"_{self.clients[0].legacy_filename}_enums"
233
- return "_enums"
234
-
235
- @property
236
- def is_legacy(self) -> bool:
237
- return _is_legacy(self.options)