@azure-tools/typespec-python 0.24.3 → 0.25.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 (132) hide show
  1. package/dist/src/code-model.d.ts.map +1 -1
  2. package/dist/src/code-model.js +1 -4
  3. package/dist/src/code-model.js.map +1 -1
  4. package/dist/src/emitter.d.ts.map +1 -1
  5. package/dist/src/emitter.js +5 -4
  6. package/dist/src/emitter.js.map +1 -1
  7. package/dist/src/external-process.d.ts +0 -9
  8. package/dist/src/external-process.d.ts.map +1 -1
  9. package/dist/src/external-process.js +1 -25
  10. package/dist/src/external-process.js.map +1 -1
  11. package/dist/src/types.d.ts.map +1 -1
  12. package/dist/src/types.js +2 -0
  13. package/dist/src/types.js.map +1 -1
  14. package/generator/LICENSE +21 -0
  15. package/generator/README.md +1 -0
  16. package/generator/dev_requirements.txt +5 -0
  17. package/generator/pygen/__init__.py +107 -0
  18. package/generator/pygen/_version.py +7 -0
  19. package/generator/pygen/black.py +71 -0
  20. package/generator/pygen/codegen/__init__.py +334 -0
  21. package/generator/pygen/codegen/_utils.py +16 -0
  22. package/generator/pygen/codegen/models/__init__.py +202 -0
  23. package/generator/pygen/codegen/models/base.py +186 -0
  24. package/generator/pygen/codegen/models/base_builder.py +119 -0
  25. package/generator/pygen/codegen/models/client.py +429 -0
  26. package/generator/pygen/codegen/models/code_model.py +239 -0
  27. package/generator/pygen/codegen/models/combined_type.py +149 -0
  28. package/generator/pygen/codegen/models/constant_type.py +129 -0
  29. package/generator/pygen/codegen/models/credential_types.py +221 -0
  30. package/generator/pygen/codegen/models/dictionary_type.py +127 -0
  31. package/generator/pygen/codegen/models/enum_type.py +238 -0
  32. package/generator/pygen/codegen/models/imports.py +291 -0
  33. package/generator/pygen/codegen/models/list_type.py +143 -0
  34. package/generator/pygen/codegen/models/lro_operation.py +143 -0
  35. package/generator/pygen/codegen/models/lro_paging_operation.py +32 -0
  36. package/generator/pygen/codegen/models/model_type.py +361 -0
  37. package/generator/pygen/codegen/models/operation.py +518 -0
  38. package/generator/pygen/codegen/models/operation_group.py +184 -0
  39. package/generator/pygen/codegen/models/paging_operation.py +156 -0
  40. package/generator/pygen/codegen/models/parameter.py +402 -0
  41. package/generator/pygen/codegen/models/parameter_list.py +390 -0
  42. package/generator/pygen/codegen/models/primitive_types.py +626 -0
  43. package/generator/pygen/codegen/models/property.py +175 -0
  44. package/generator/pygen/codegen/models/request_builder.py +189 -0
  45. package/generator/pygen/codegen/models/request_builder_parameter.py +115 -0
  46. package/generator/pygen/codegen/models/response.py +348 -0
  47. package/generator/pygen/codegen/models/utils.py +23 -0
  48. package/generator/pygen/codegen/serializers/__init__.py +570 -0
  49. package/generator/pygen/codegen/serializers/base_serializer.py +21 -0
  50. package/generator/pygen/codegen/serializers/builder_serializer.py +1454 -0
  51. package/generator/pygen/codegen/serializers/client_serializer.py +295 -0
  52. package/generator/pygen/codegen/serializers/enum_serializer.py +15 -0
  53. package/generator/pygen/codegen/serializers/general_serializer.py +212 -0
  54. package/generator/pygen/codegen/serializers/import_serializer.py +127 -0
  55. package/generator/pygen/codegen/serializers/metadata_serializer.py +198 -0
  56. package/generator/pygen/codegen/serializers/model_init_serializer.py +33 -0
  57. package/generator/pygen/codegen/serializers/model_serializer.py +287 -0
  58. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +89 -0
  59. package/generator/pygen/codegen/serializers/operations_init_serializer.py +44 -0
  60. package/generator/pygen/codegen/serializers/parameter_serializer.py +221 -0
  61. package/generator/pygen/codegen/serializers/patch_serializer.py +19 -0
  62. package/generator/pygen/codegen/serializers/request_builders_serializer.py +52 -0
  63. package/generator/pygen/codegen/serializers/sample_serializer.py +163 -0
  64. package/generator/pygen/codegen/serializers/test_serializer.py +287 -0
  65. package/generator/pygen/codegen/serializers/types_serializer.py +31 -0
  66. package/generator/pygen/codegen/serializers/utils.py +68 -0
  67. package/generator/pygen/codegen/templates/client.py.jinja2 +37 -0
  68. package/generator/pygen/codegen/templates/client_container.py.jinja2 +12 -0
  69. package/generator/pygen/codegen/templates/config.py.jinja2 +73 -0
  70. package/generator/pygen/codegen/templates/config_container.py.jinja2 +16 -0
  71. package/generator/pygen/codegen/templates/conftest.py.jinja2 +28 -0
  72. package/generator/pygen/codegen/templates/enum.py.jinja2 +13 -0
  73. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +10 -0
  74. package/generator/pygen/codegen/templates/init.py.jinja2 +24 -0
  75. package/generator/pygen/codegen/templates/keywords.jinja2 +19 -0
  76. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +16 -0
  77. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +18 -0
  78. package/generator/pygen/codegen/templates/macros.jinja2 +12 -0
  79. package/generator/pygen/codegen/templates/metadata.json.jinja2 +167 -0
  80. package/generator/pygen/codegen/templates/model_base.py.jinja2 +899 -0
  81. package/generator/pygen/codegen/templates/model_container.py.jinja2 +13 -0
  82. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +92 -0
  83. package/generator/pygen/codegen/templates/model_init.py.jinja2 +28 -0
  84. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +92 -0
  85. package/generator/pygen/codegen/templates/operation.py.jinja2 +21 -0
  86. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +75 -0
  87. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +20 -0
  88. package/generator/pygen/codegen/templates/operation_tools.jinja2 +74 -0
  89. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +17 -0
  90. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +6 -0
  91. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +21 -0
  92. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +8 -0
  93. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +107 -0
  94. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +9 -0
  95. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +108 -0
  96. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +21 -0
  97. package/generator/pygen/codegen/templates/patch.py.jinja2 +19 -0
  98. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +1 -0
  99. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +28 -0
  100. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +10 -0
  101. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +12 -0
  102. package/generator/pygen/codegen/templates/sample.py.jinja2 +44 -0
  103. package/generator/pygen/codegen/templates/serialization.py.jinja2 +2006 -0
  104. package/generator/pygen/codegen/templates/test.py.jinja2 +50 -0
  105. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +26 -0
  106. package/generator/pygen/codegen/templates/types.py.jinja2 +8 -0
  107. package/generator/pygen/codegen/templates/validation.py.jinja2 +38 -0
  108. package/generator/pygen/codegen/templates/vendor.py.jinja2 +98 -0
  109. package/generator/pygen/codegen/templates/version.py.jinja2 +4 -0
  110. package/generator/pygen/m2r.py +65 -0
  111. package/generator/pygen/postprocess/__init__.py +183 -0
  112. package/generator/pygen/postprocess/get_all.py +19 -0
  113. package/generator/pygen/postprocess/venvtools.py +77 -0
  114. package/generator/pygen/preprocess/__init__.py +503 -0
  115. package/generator/pygen/preprocess/helpers.py +27 -0
  116. package/generator/pygen/preprocess/python_mappings.py +222 -0
  117. package/generator/pygen/utils.py +149 -0
  118. package/generator/pygen.egg-info/PKG-INFO +25 -0
  119. package/generator/pygen.egg-info/SOURCES.txt +66 -0
  120. package/generator/pygen.egg-info/dependency_links.txt +1 -0
  121. package/generator/pygen.egg-info/requires.txt +4 -0
  122. package/generator/pygen.egg-info/top_level.txt +1 -0
  123. package/generator/requirements.txt +12 -0
  124. package/generator/setup.py +55 -0
  125. package/package.json +10 -7
  126. package/scripts/__pycache__/venvtools.cpython-38.pyc +0 -0
  127. package/scripts/install.py +49 -0
  128. package/scripts/prepare.py +38 -0
  129. package/scripts/run-python3.cjs +22 -0
  130. package/scripts/run_tsp.py +40 -0
  131. package/scripts/system-requirements.cjs +180 -0
  132. package/scripts/venvtools.py +81 -0
@@ -0,0 +1,334 @@
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 logging
7
+ from typing import Dict, Any, Union, Optional
8
+ from pathlib import Path
9
+ import yaml
10
+
11
+
12
+ from .. import Plugin
13
+ from ..utils import parse_args
14
+ from .models.code_model import CodeModel
15
+ from .serializers import JinjaSerializer
16
+ from ._utils import DEFAULT_HEADER_TEXT, VALID_PACKAGE_MODE, TYPESPEC_PACKAGE_MODE
17
+
18
+
19
+ def _default_pprint(package_name: str) -> str:
20
+ return " ".join([i.capitalize() for i in package_name.split("-")])
21
+
22
+
23
+ _LOGGER = logging.getLogger(__name__)
24
+
25
+
26
+ class OptionsRetriever:
27
+ OPTIONS_TO_DEFAULT = {
28
+ "azure-arm": False,
29
+ "flavor": "azure", # need to default to azure in shared code so we don't break swagger generation
30
+ "no-async": False,
31
+ "low-level-client": False,
32
+ "version-tolerant": True,
33
+ "keep-version-file": False,
34
+ "no-namespace-folders": False,
35
+ "basic-setup-py": False,
36
+ "client-side-validation": False,
37
+ "multiapi": False,
38
+ "polymorphic-examples": 5,
39
+ "generate-sample": False,
40
+ "generate-test": False,
41
+ "from-typespec": False,
42
+ "emit-cross-language-definition-file": False,
43
+ }
44
+
45
+ @property
46
+ def is_azure_flavor(self) -> bool:
47
+ return self.flavor == "azure"
48
+
49
+ def __init__(self, options: Dict[str, Any]) -> None:
50
+ self.options = options
51
+
52
+ def __getattr__(self, prop: str) -> Any:
53
+ key = prop.replace("_", "-")
54
+ return self.options.get(key, self.OPTIONS_TO_DEFAULT.get(key))
55
+
56
+ @property
57
+ def company_name(self) -> str:
58
+ return self.options.get("company-name", "Microsoft" if self.is_azure_flavor else "")
59
+
60
+ @property
61
+ def license_header(self) -> str:
62
+ license_header = self.options.get(
63
+ "header-text",
64
+ (DEFAULT_HEADER_TEXT.format(company_name=self.company_name) if self.company_name else ""),
65
+ )
66
+ if license_header:
67
+ license_header = license_header.replace("\n", "\n# ")
68
+ license_header = (
69
+ "# --------------------------------------------------------------------------\n# " + license_header
70
+ )
71
+ license_header += "\n# --------------------------------------------------------------------------"
72
+ return license_header
73
+
74
+ @property
75
+ def show_operations(self) -> bool:
76
+ return self.options.get("show-operations", not self.low_level_client)
77
+
78
+ @property
79
+ def _models_mode_default(self) -> str:
80
+ models_mode_default = "none" if self.low_level_client or self.version_tolerant else "msrest"
81
+ if self.options.get("cadl_file") is not None:
82
+ models_mode_default = "dpg"
83
+ return models_mode_default
84
+
85
+ @property
86
+ def original_models_mode(self) -> str:
87
+ return self.options.get("models-mode", self._models_mode_default)
88
+
89
+ @property
90
+ def models_mode(self) -> Union[str, bool]:
91
+ # switch to falsy value for easier code writing
92
+ return False if self.original_models_mode == "none" else self.original_models_mode
93
+
94
+ @property
95
+ def tracing(self) -> bool:
96
+ return self.options.get(
97
+ "tracing",
98
+ self.show_operations and self.is_azure_flavor,
99
+ )
100
+
101
+ @property
102
+ def show_send_request(self) -> bool:
103
+ return self.options.get(
104
+ "show-send-request",
105
+ self._low_level_or_version_tolerant,
106
+ )
107
+
108
+ @property
109
+ def _low_level_or_version_tolerant(self) -> bool:
110
+ return self.low_level_client or self.version_tolerant
111
+
112
+ @property
113
+ def only_path_and_body_params_positional(self) -> bool:
114
+ return self.options.get(
115
+ "only-path-and-body-params-positional",
116
+ self._low_level_or_version_tolerant,
117
+ )
118
+
119
+ @property
120
+ def combine_operation_files(self) -> bool:
121
+ return self.options.get(
122
+ "combine-operation-files",
123
+ self.version_tolerant,
124
+ )
125
+
126
+ @property
127
+ def package_pprint_name(self) -> str:
128
+ return self.options.get("package-pprint-name") or _default_pprint(str(self.package_name))
129
+
130
+ @property
131
+ def default_optional_constants_to_none(self) -> bool:
132
+ return self.options.get(
133
+ "default-optional-constants-to-none",
134
+ self._low_level_or_version_tolerant,
135
+ )
136
+
137
+ @property
138
+ def builders_visibility(self) -> str:
139
+ builders_visibility = self.options.get("builders-visibility")
140
+ if builders_visibility is None:
141
+ return "public" if self.low_level_client else "embedded"
142
+ return builders_visibility.lower()
143
+
144
+ @property
145
+ def head_as_boolean(self) -> bool:
146
+ head_as_boolean = self.options.get("head-as-boolean", True)
147
+ # Force some options in ARM MODE
148
+ return True if self.azure_arm else head_as_boolean
149
+
150
+ @property
151
+ def package_mode(self) -> str:
152
+ return self.options.get("packaging-files-dir") or self.options.get("package-mode", "")
153
+
154
+ @property
155
+ def packaging_files_config(self) -> Optional[Dict[str, Any]]:
156
+ packaging_files_config = self.options.get("packaging-files-config")
157
+ if packaging_files_config is None:
158
+ return None
159
+ # packaging-files-config is either a string or a dict
160
+ # if it's a string, we can split on the comma to get the dict
161
+ # otherwise we just return
162
+ try:
163
+ return {k.strip(): v.strip() for k, v in [i.split(":") for i in packaging_files_config.split("|")]}
164
+ except AttributeError:
165
+ return packaging_files_config
166
+
167
+
168
+ class CodeGenerator(Plugin):
169
+ def __init__(self, *args, **kwargs: Any) -> None:
170
+ super().__init__(*args, **kwargs)
171
+ self.options_retriever = OptionsRetriever(self.options)
172
+
173
+ def _validate_code_model_options(self) -> None:
174
+ if self.options_retriever.builders_visibility not in [
175
+ "public",
176
+ "hidden",
177
+ "embedded",
178
+ ]:
179
+ raise ValueError("The value of --builders-visibility must be either 'public', 'hidden', or 'embedded'")
180
+
181
+ if self.options_retriever.original_models_mode not in ["msrest", "dpg", "none"]:
182
+ raise ValueError(
183
+ "--models-mode can only be 'msrest', 'dpg' or 'none'. "
184
+ "Pass in 'msrest' if you want msrest models, or "
185
+ "'none' if you don't want any."
186
+ )
187
+
188
+ if not self.options_retriever.show_operations and self.options_retriever.builders_visibility == "embedded":
189
+ raise ValueError(
190
+ "Can not embed builders without operations. "
191
+ "Either set --show-operations to True, or change the value of --builders-visibility "
192
+ "to 'public' or 'hidden'."
193
+ )
194
+
195
+ if self.options_retriever.basic_setup_py and not self.options_retriever.package_version:
196
+ raise ValueError("--basic-setup-py must be used with --package-version")
197
+
198
+ if self.options_retriever.package_mode and not self.options_retriever.package_version:
199
+ raise ValueError("--package-mode must be used with --package-version")
200
+
201
+ if not self.options_retriever.show_operations and self.options_retriever.combine_operation_files:
202
+ raise ValueError(
203
+ "Can not combine operation files if you are not showing operations. "
204
+ "If you want operation files, pass in flag --show-operations"
205
+ )
206
+
207
+ if self.options_retriever.package_mode:
208
+ if (
209
+ (
210
+ self.options_retriever.package_mode not in TYPESPEC_PACKAGE_MODE
211
+ and self.options_retriever.from_typespec
212
+ )
213
+ or (
214
+ self.options_retriever.package_mode not in VALID_PACKAGE_MODE
215
+ and not self.options_retriever.from_typespec
216
+ )
217
+ ) and not Path(self.options_retriever.package_mode).exists():
218
+ raise ValueError(
219
+ f"--package-mode can only be {' or '.join(TYPESPEC_PACKAGE_MODE)} or directory which contains template files" # pylint: disable=line-too-long
220
+ )
221
+
222
+ if self.options_retriever.multiapi and self.options_retriever.version_tolerant:
223
+ raise ValueError(
224
+ "Can not currently generate version tolerant multiapi SDKs. "
225
+ "We are working on creating a new multiapi SDK for version tolerant and it is not available yet."
226
+ )
227
+
228
+ if self.options_retriever.client_side_validation and self.options_retriever.version_tolerant:
229
+ raise ValueError("Can not generate version tolerant with --client-side-validation. ")
230
+
231
+ if not (self.options_retriever.azure_arm or self.options_retriever.version_tolerant):
232
+ _LOGGER.warning(
233
+ "You are generating with options that would not allow the SDK to be shipped as an official Azure SDK. "
234
+ "Please read https://aka.ms/azsdk/dpcodegen for more details."
235
+ )
236
+
237
+ if not self.options_retriever.is_azure_flavor and self.options_retriever.tracing:
238
+ raise ValueError("Can only have tracing turned on for Azure SDKs.")
239
+
240
+ @staticmethod
241
+ def remove_cloud_errors(yaml_data: Dict[str, Any]) -> None:
242
+ for client in yaml_data["clients"]:
243
+ for group in client["operationGroups"]:
244
+ for operation in group["operations"]:
245
+ if not operation.get("exceptions"):
246
+ continue
247
+ i = 0
248
+ while i < len(operation["exceptions"]):
249
+ exception = operation["exceptions"][i]
250
+ if (
251
+ exception.get("schema")
252
+ and exception["schema"]["language"]["default"]["name"] == "CloudError"
253
+ ):
254
+ del operation["exceptions"][i]
255
+ i -= 1
256
+ i += 1
257
+ if yaml_data.get("schemas") and yaml_data["schemas"].get("objects"):
258
+ for i in range(len(yaml_data["schemas"]["objects"])):
259
+ obj_schema = yaml_data["schemas"]["objects"][i]
260
+ if obj_schema["language"]["default"]["name"] == "CloudError":
261
+ del yaml_data["schemas"]["objects"][i]
262
+ break
263
+
264
+ def _build_code_model_options(self) -> Dict[str, Any]:
265
+ flags = [
266
+ "azure_arm",
267
+ "head_as_boolean",
268
+ "license_header",
269
+ "keep_version_file",
270
+ "no_async",
271
+ "no_namespace_folders",
272
+ "basic_setup_py",
273
+ "package_name",
274
+ "package_version",
275
+ "client_side_validation",
276
+ "tracing",
277
+ "multiapi",
278
+ "polymorphic_examples",
279
+ "models_mode",
280
+ "builders_visibility",
281
+ "show_operations",
282
+ "show_send_request",
283
+ "only_path_and_body_params_positional",
284
+ "version_tolerant",
285
+ "low_level_client",
286
+ "combine_operation_files",
287
+ "package_mode",
288
+ "package_pprint_name",
289
+ "packaging_files_config",
290
+ "default_optional_constants_to_none",
291
+ "generate_sample",
292
+ "generate_test",
293
+ "default_api_version",
294
+ "from_typespec",
295
+ "flavor",
296
+ "company_name",
297
+ "emit_cross_language_definition_file",
298
+ ]
299
+ return {f: getattr(self.options_retriever, f) for f in flags}
300
+
301
+ def get_yaml(self) -> Dict[str, Any]:
302
+ # cadl file doesn't have to be relative to output folder
303
+ with open(self.options["cadl_file"], "r", encoding="utf-8-sig") as fd:
304
+ return yaml.safe_load(fd.read())
305
+
306
+ def get_serializer(self, code_model: CodeModel):
307
+ return JinjaSerializer(code_model, output_folder=self.output_folder)
308
+
309
+ def process(self) -> bool:
310
+ # List the input file, should be only one
311
+ self._validate_code_model_options()
312
+ options = self._build_code_model_options()
313
+ yaml_data = self.get_yaml()
314
+
315
+ if self.options_retriever.azure_arm:
316
+ self.remove_cloud_errors(yaml_data)
317
+
318
+ code_model = CodeModel(yaml_data=yaml_data, options=options)
319
+ if not self.options_retriever.is_azure_flavor and any(client.lro_operations for client in code_model.clients):
320
+ raise ValueError("Only support LROs for Azure SDKs")
321
+ serializer = self.get_serializer(code_model)
322
+ serializer.serialize()
323
+
324
+ return True
325
+
326
+
327
+ if __name__ == "__main__":
328
+ # CADL pipeline will call this
329
+ parsed_args, unknown_args = parse_args()
330
+ CodeGenerator(
331
+ output_folder=parsed_args.output_folder,
332
+ cadl_file=parsed_args.cadl_file,
333
+ **unknown_args,
334
+ ).process()
@@ -0,0 +1,16 @@
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
+ DEFAULT_HEADER_TEXT = (
8
+ "Copyright (c) {company_name} Corporation. All rights reserved.\n"
9
+ "Licensed under the MIT License. See License.txt in the project root for license information.\n"
10
+ "Code generated by {company_name} (R) Python Code Generator.\n"
11
+ "Changes may cause incorrect behavior and will be lost if the code is regenerated."
12
+ )
13
+
14
+ SWAGGER_PACKAGE_MODE = ["mgmtplane", "dataplane"] # for backward compatibility
15
+ TYPESPEC_PACKAGE_MODE = ["azure-mgmt", "azure-dataplane", "generic"]
16
+ VALID_PACKAGE_MODE = SWAGGER_PACKAGE_MODE + TYPESPEC_PACKAGE_MODE
@@ -0,0 +1,202 @@
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 logging
7
+ from typing import Any, Dict, Union, Optional
8
+ from .base import BaseModel
9
+ from .base_builder import BaseBuilder, ParameterListType
10
+ from .code_model import CodeModel
11
+ from .client import Client
12
+ from .model_type import ModelType, JSONModelType, DPGModelType, MsrestModelType
13
+ from .dictionary_type import DictionaryType
14
+ from .list_type import ListType
15
+ from .combined_type import CombinedType
16
+ from .primitive_types import (
17
+ ByteArraySchema,
18
+ DateType,
19
+ DatetimeType,
20
+ DurationType,
21
+ IntegerType,
22
+ FloatType,
23
+ StringType,
24
+ TimeType,
25
+ AnyType,
26
+ PrimitiveType,
27
+ BinaryType,
28
+ BooleanType,
29
+ AnyObjectType,
30
+ UnixTimeType,
31
+ SdkCoreType,
32
+ DecimalType,
33
+ )
34
+ from .enum_type import EnumType, EnumValue
35
+ from .base import BaseType
36
+ from .constant_type import ConstantType
37
+ from .imports import FileImport, ImportType, TypingSection
38
+ from .lro_operation import LROOperation
39
+ from .paging_operation import PagingOperation
40
+ from .parameter import (
41
+ Parameter,
42
+ ParameterMethodLocation,
43
+ ParameterLocation,
44
+ BodyParameter,
45
+ ParameterDelimeter,
46
+ ClientParameter,
47
+ ConfigParameter,
48
+ )
49
+ from .operation import Operation
50
+ from .property import Property
51
+ from .operation_group import OperationGroup
52
+ from .response import Response
53
+ from .parameter_list import (
54
+ ParameterList,
55
+ ClientGlobalParameterList,
56
+ ConfigGlobalParameterList,
57
+ )
58
+ from .request_builder import (
59
+ RequestBuilder,
60
+ OverloadedRequestBuilder,
61
+ RequestBuilderBase,
62
+ )
63
+ from .lro_paging_operation import LROPagingOperation
64
+ from .request_builder_parameter import (
65
+ RequestBuilderParameter,
66
+ RequestBuilderBodyParameter,
67
+ )
68
+ from .credential_types import (
69
+ TokenCredentialType,
70
+ KeyCredentialType,
71
+ ARMChallengeAuthenticationPolicyType,
72
+ BearerTokenCredentialPolicyType,
73
+ KeyCredentialPolicyType,
74
+ CredentialType,
75
+ )
76
+
77
+ __all__ = [
78
+ "KeyCredentialPolicyType",
79
+ "AnyType",
80
+ "BaseModel",
81
+ "BaseType",
82
+ "CodeModel",
83
+ "Client",
84
+ "ConstantType",
85
+ "ModelType",
86
+ "DictionaryType",
87
+ "ListType",
88
+ "EnumType",
89
+ "EnumValue",
90
+ "FileImport",
91
+ "ImportType",
92
+ "TypingSection",
93
+ "PrimitiveType",
94
+ "LROOperation",
95
+ "Operation",
96
+ "PagingOperation",
97
+ "Parameter",
98
+ "ParameterList",
99
+ "OperationGroup",
100
+ "Property",
101
+ "RequestBuilder",
102
+ "Response",
103
+ "TokenCredentialType",
104
+ "LROPagingOperation",
105
+ "BaseBuilder",
106
+ "RequestBuilderParameter",
107
+ "BinaryType",
108
+ "ClientGlobalParameterList",
109
+ "ConfigGlobalParameterList",
110
+ "ParameterMethodLocation",
111
+ "ParameterLocation",
112
+ "OverloadedRequestBuilder",
113
+ "RequestBuilderBase",
114
+ "BodyParameter",
115
+ "RequestBuilderBodyParameter",
116
+ "ParameterDelimeter",
117
+ "CredentialType",
118
+ "ClientParameter",
119
+ "ConfigParameter",
120
+ "ParameterListType",
121
+ ]
122
+
123
+ TYPE_TO_OBJECT = {
124
+ "integer": IntegerType,
125
+ "float": FloatType,
126
+ "decimal": DecimalType,
127
+ "string": StringType,
128
+ "list": ListType,
129
+ "dict": DictionaryType,
130
+ "constant": ConstantType,
131
+ "enum": EnumType,
132
+ "enumvalue": EnumValue,
133
+ "binary": BinaryType,
134
+ "any": AnyType,
135
+ "utcDateTime": DatetimeType,
136
+ "offsetDateTime": DatetimeType,
137
+ "plainTime": TimeType,
138
+ "duration": DurationType,
139
+ "plainDate": DateType,
140
+ "bytes": ByteArraySchema,
141
+ "boolean": BooleanType,
142
+ "combined": CombinedType,
143
+ "OAuth2": TokenCredentialType,
144
+ "Key": KeyCredentialType,
145
+ "ARMChallengeAuthenticationPolicy": ARMChallengeAuthenticationPolicyType,
146
+ "BearerTokenCredentialPolicy": BearerTokenCredentialPolicyType,
147
+ "KeyCredentialPolicy": KeyCredentialPolicyType,
148
+ "any-object": AnyObjectType,
149
+ "unixtime": UnixTimeType,
150
+ "credential": StringType,
151
+ "sdkcore": SdkCoreType,
152
+ }
153
+ _LOGGER = logging.getLogger(__name__)
154
+
155
+
156
+ def build_type(yaml_data: Dict[str, Any], code_model: CodeModel) -> BaseType:
157
+ yaml_id = id(yaml_data)
158
+ try:
159
+ return code_model.lookup_type(yaml_id)
160
+ except KeyError:
161
+ # Not created yet, let's create it and add it to the index
162
+ pass
163
+ response: Optional[BaseType] = None
164
+ if yaml_data["type"] == "model":
165
+ # need to special case model to avoid recursion
166
+ if yaml_data["base"] == "json" or not code_model.options["models_mode"]:
167
+ model_type = JSONModelType
168
+ elif yaml_data["base"] == "dpg":
169
+ model_type = DPGModelType # type: ignore
170
+ else:
171
+ model_type = MsrestModelType # type: ignore
172
+ response = model_type(yaml_data, code_model)
173
+ code_model.types_map[yaml_id] = response
174
+ response.fill_instance_from_yaml(yaml_data, code_model)
175
+ elif yaml_data["type"] == "enum":
176
+ # avoid recursion because we add the parent enum type to the enum value
177
+ response = EnumType(
178
+ yaml_data,
179
+ code_model,
180
+ values=[],
181
+ value_type=build_type(yaml_data["valueType"], code_model),
182
+ )
183
+ code_model.types_map[yaml_id] = response
184
+ response.fill_instance_from_yaml(yaml_data, code_model)
185
+ else:
186
+ object_type = yaml_data.get("type")
187
+ if object_type not in TYPE_TO_OBJECT:
188
+ _LOGGER.warning(
189
+ 'Unrecognized definition type "%s" is found, falling back it as "string"! ',
190
+ yaml_data["type"],
191
+ )
192
+ object_type = "string"
193
+ response = TYPE_TO_OBJECT[object_type].from_yaml(yaml_data, code_model) # type: ignore
194
+ if response is None:
195
+ raise ValueError("response can not be None")
196
+ code_model.types_map[yaml_id] = response
197
+ return response
198
+
199
+
200
+ RequestBuilderType = Union[RequestBuilder, OverloadedRequestBuilder]
201
+ ParameterType = Union[Parameter, RequestBuilderParameter, ClientParameter, ConfigParameter]
202
+ OperationType = Union[Operation, LROOperation, PagingOperation, LROPagingOperation]