@azure-tools/typespec-python 0.33.0 → 0.35.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/dist/scripts/eng/lint.d.ts.map +1 -1
  2. package/dist/scripts/eng/lint.js +18 -1
  3. package/dist/scripts/eng/lint.js.map +1 -1
  4. package/dist/src/emitter.d.ts +0 -2
  5. package/dist/src/emitter.d.ts.map +1 -1
  6. package/dist/src/emitter.js +2 -102
  7. package/dist/src/emitter.js.map +1 -1
  8. package/dist/src/index.d.ts +1 -1
  9. package/dist/src/index.d.ts.map +1 -1
  10. package/dist/src/index.js +1 -1
  11. package/dist/src/index.js.map +1 -1
  12. package/generator/dev_requirements.txt +10 -3
  13. package/package.json +14 -11
  14. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  15. package/scripts/eng/lint.ts +17 -1
  16. package/scripts/eng/pylintrc +2 -1
  17. package/scripts/install.py +0 -1
  18. package/dist/src/code-model.d.ts +0 -4
  19. package/dist/src/code-model.d.ts.map +0 -1
  20. package/dist/src/code-model.js +0 -190
  21. package/dist/src/code-model.js.map +0 -1
  22. package/dist/src/external-process.d.ts +0 -20
  23. package/dist/src/external-process.d.ts.map +0 -1
  24. package/dist/src/external-process.js +0 -44
  25. package/dist/src/external-process.js.map +0 -1
  26. package/dist/src/http.d.ts +0 -7
  27. package/dist/src/http.d.ts.map +0 -1
  28. package/dist/src/http.js +0 -266
  29. package/dist/src/http.js.map +0 -1
  30. package/dist/src/types.d.ts +0 -36
  31. package/dist/src/types.d.ts.map +0 -1
  32. package/dist/src/types.js +0 -489
  33. package/dist/src/types.js.map +0 -1
  34. package/dist/src/utils.d.ts +0 -26
  35. package/dist/src/utils.d.ts.map +0 -1
  36. package/dist/src/utils.js +0 -151
  37. package/dist/src/utils.js.map +0 -1
  38. package/generator/LICENSE +0 -21
  39. package/generator/README.md +0 -1
  40. package/generator/pygen/__init__.py +0 -107
  41. package/generator/pygen/_version.py +0 -7
  42. package/generator/pygen/black.py +0 -69
  43. package/generator/pygen/codegen/__init__.py +0 -338
  44. package/generator/pygen/codegen/_utils.py +0 -16
  45. package/generator/pygen/codegen/models/__init__.py +0 -204
  46. package/generator/pygen/codegen/models/base.py +0 -186
  47. package/generator/pygen/codegen/models/base_builder.py +0 -119
  48. package/generator/pygen/codegen/models/client.py +0 -430
  49. package/generator/pygen/codegen/models/code_model.py +0 -237
  50. package/generator/pygen/codegen/models/combined_type.py +0 -149
  51. package/generator/pygen/codegen/models/constant_type.py +0 -129
  52. package/generator/pygen/codegen/models/credential_types.py +0 -214
  53. package/generator/pygen/codegen/models/dictionary_type.py +0 -127
  54. package/generator/pygen/codegen/models/enum_type.py +0 -238
  55. package/generator/pygen/codegen/models/imports.py +0 -291
  56. package/generator/pygen/codegen/models/list_type.py +0 -143
  57. package/generator/pygen/codegen/models/lro_operation.py +0 -142
  58. package/generator/pygen/codegen/models/lro_paging_operation.py +0 -32
  59. package/generator/pygen/codegen/models/model_type.py +0 -362
  60. package/generator/pygen/codegen/models/operation.py +0 -530
  61. package/generator/pygen/codegen/models/operation_group.py +0 -184
  62. package/generator/pygen/codegen/models/paging_operation.py +0 -155
  63. package/generator/pygen/codegen/models/parameter.py +0 -412
  64. package/generator/pygen/codegen/models/parameter_list.py +0 -387
  65. package/generator/pygen/codegen/models/primitive_types.py +0 -659
  66. package/generator/pygen/codegen/models/property.py +0 -171
  67. package/generator/pygen/codegen/models/request_builder.py +0 -189
  68. package/generator/pygen/codegen/models/request_builder_parameter.py +0 -115
  69. package/generator/pygen/codegen/models/response.py +0 -348
  70. package/generator/pygen/codegen/models/utils.py +0 -23
  71. package/generator/pygen/codegen/serializers/__init__.py +0 -574
  72. package/generator/pygen/codegen/serializers/base_serializer.py +0 -21
  73. package/generator/pygen/codegen/serializers/builder_serializer.py +0 -1513
  74. package/generator/pygen/codegen/serializers/client_serializer.py +0 -295
  75. package/generator/pygen/codegen/serializers/enum_serializer.py +0 -15
  76. package/generator/pygen/codegen/serializers/general_serializer.py +0 -213
  77. package/generator/pygen/codegen/serializers/import_serializer.py +0 -127
  78. package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -198
  79. package/generator/pygen/codegen/serializers/model_init_serializer.py +0 -33
  80. package/generator/pygen/codegen/serializers/model_serializer.py +0 -300
  81. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +0 -89
  82. package/generator/pygen/codegen/serializers/operations_init_serializer.py +0 -44
  83. package/generator/pygen/codegen/serializers/parameter_serializer.py +0 -221
  84. package/generator/pygen/codegen/serializers/patch_serializer.py +0 -19
  85. package/generator/pygen/codegen/serializers/request_builders_serializer.py +0 -52
  86. package/generator/pygen/codegen/serializers/sample_serializer.py +0 -168
  87. package/generator/pygen/codegen/serializers/test_serializer.py +0 -293
  88. package/generator/pygen/codegen/serializers/types_serializer.py +0 -31
  89. package/generator/pygen/codegen/serializers/utils.py +0 -68
  90. package/generator/pygen/codegen/templates/client.py.jinja2 +0 -37
  91. package/generator/pygen/codegen/templates/client_container.py.jinja2 +0 -12
  92. package/generator/pygen/codegen/templates/config.py.jinja2 +0 -73
  93. package/generator/pygen/codegen/templates/config_container.py.jinja2 +0 -16
  94. package/generator/pygen/codegen/templates/conftest.py.jinja2 +0 -28
  95. package/generator/pygen/codegen/templates/enum.py.jinja2 +0 -13
  96. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +0 -10
  97. package/generator/pygen/codegen/templates/init.py.jinja2 +0 -24
  98. package/generator/pygen/codegen/templates/keywords.jinja2 +0 -19
  99. package/generator/pygen/codegen/templates/lro_operation.py.jinja2 +0 -16
  100. package/generator/pygen/codegen/templates/lro_paging_operation.py.jinja2 +0 -18
  101. package/generator/pygen/codegen/templates/macros.jinja2 +0 -12
  102. package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
  103. package/generator/pygen/codegen/templates/model_base.py.jinja2 +0 -1158
  104. package/generator/pygen/codegen/templates/model_container.py.jinja2 +0 -13
  105. package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +0 -98
  106. package/generator/pygen/codegen/templates/model_init.py.jinja2 +0 -28
  107. package/generator/pygen/codegen/templates/model_msrest.py.jinja2 +0 -92
  108. package/generator/pygen/codegen/templates/operation.py.jinja2 +0 -21
  109. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +0 -75
  110. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +0 -20
  111. package/generator/pygen/codegen/templates/operation_tools.jinja2 +0 -81
  112. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +0 -17
  113. package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +0 -6
  114. package/generator/pygen/codegen/templates/packaging_templates/LICENSE.jinja2 +0 -21
  115. package/generator/pygen/codegen/templates/packaging_templates/MANIFEST.in.jinja2 +0 -8
  116. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +0 -107
  117. package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +0 -9
  118. package/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +0 -108
  119. package/generator/pygen/codegen/templates/paging_operation.py.jinja2 +0 -21
  120. package/generator/pygen/codegen/templates/patch.py.jinja2 +0 -19
  121. package/generator/pygen/codegen/templates/pkgutil_init.py.jinja2 +0 -1
  122. package/generator/pygen/codegen/templates/request_builder.py.jinja2 +0 -28
  123. package/generator/pygen/codegen/templates/request_builders.py.jinja2 +0 -10
  124. package/generator/pygen/codegen/templates/rest_init.py.jinja2 +0 -12
  125. package/generator/pygen/codegen/templates/sample.py.jinja2 +0 -44
  126. package/generator/pygen/codegen/templates/serialization.py.jinja2 +0 -2115
  127. package/generator/pygen/codegen/templates/test.py.jinja2 +0 -50
  128. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +0 -26
  129. package/generator/pygen/codegen/templates/types.py.jinja2 +0 -8
  130. package/generator/pygen/codegen/templates/validation.py.jinja2 +0 -38
  131. package/generator/pygen/codegen/templates/vendor.py.jinja2 +0 -96
  132. package/generator/pygen/codegen/templates/version.py.jinja2 +0 -4
  133. package/generator/pygen/m2r.py +0 -65
  134. package/generator/pygen/postprocess/__init__.py +0 -183
  135. package/generator/pygen/postprocess/get_all.py +0 -19
  136. package/generator/pygen/postprocess/venvtools.py +0 -75
  137. package/generator/pygen/preprocess/__init__.py +0 -509
  138. package/generator/pygen/preprocess/helpers.py +0 -27
  139. package/generator/pygen/preprocess/python_mappings.py +0 -224
  140. package/generator/pygen/utils.py +0 -160
  141. package/generator/pygen.egg-info/PKG-INFO +0 -25
  142. package/generator/pygen.egg-info/SOURCES.txt +0 -66
  143. package/generator/pygen.egg-info/dependency_links.txt +0 -1
  144. package/generator/pygen.egg-info/requires.txt +0 -4
  145. package/generator/pygen.egg-info/top_level.txt +0 -1
  146. package/generator/setup.py +0 -55
@@ -1,293 +0,0 @@
1
- # pylint: disable=too-many-lines
2
- # -------------------------------------------------------------------------
3
- # Copyright (c) Microsoft Corporation. All rights reserved.
4
- # Licensed under the MIT License. See License.txt in the project root for
5
- # license information.
6
- # --------------------------------------------------------------------------
7
- from typing import Dict, Any, List, Optional
8
- from jinja2 import Environment
9
-
10
- from .import_serializer import FileImportSerializer
11
- from .base_serializer import BaseSerializer
12
- from ..models import (
13
- CodeModel,
14
- ImportType,
15
- OperationGroup,
16
- Client,
17
- OperationType,
18
- ModelType,
19
- BaseType,
20
- CombinedType,
21
- FileImport,
22
- )
23
- from .utils import get_namespace_from_package_name, json_dumps_template
24
-
25
-
26
- def is_lro(operation_type: str) -> bool:
27
- return operation_type in ("lro", "lropaging")
28
-
29
-
30
- def is_paging(operation_type: str) -> bool:
31
- return operation_type in ("paging", "lropaging")
32
-
33
-
34
- def is_common_operation(operation_type: str) -> bool:
35
- return operation_type == "operation"
36
-
37
-
38
- class TestName:
39
- def __init__(self, code_model: CodeModel, client_name: str, *, is_async: bool = False) -> None:
40
- self.code_model = code_model
41
- self.client_name = client_name
42
- self.is_async = is_async
43
-
44
- @property
45
- def async_suffix_capt(self) -> str:
46
- return "Async" if self.is_async else ""
47
-
48
- @property
49
- def create_client_name(self) -> str:
50
- return "create_async_client" if self.is_async else "create_client"
51
-
52
- @property
53
- def prefix(self) -> str:
54
- return self.client_name.replace("Client", "")
55
-
56
- @property
57
- def preparer_name(self) -> str:
58
- if self.code_model.options["azure_arm"]:
59
- return "RandomNameResourceGroupPreparer"
60
- return self.prefix + "Preparer"
61
-
62
- @property
63
- def base_test_class_name(self) -> str:
64
- if self.code_model.options["azure_arm"]:
65
- return "AzureMgmtRecordedTestCase"
66
- return f"{self.client_name}TestBase{self.async_suffix_capt}"
67
-
68
-
69
- class TestCase:
70
- def __init__(
71
- self,
72
- operation_groups: List[OperationGroup],
73
- params: Dict[str, Any],
74
- operation: OperationType,
75
- *,
76
- is_async: bool = False,
77
- ) -> None:
78
- self.operation_groups = operation_groups
79
- self.params = params
80
- self.operation = operation
81
- self.is_async = is_async
82
-
83
- @property
84
- def name(self) -> str:
85
- if self.operation_groups[-1].is_mixin:
86
- return self.operation.name
87
- return "_".join([og.property_name for og in self.operation_groups] + [self.operation.name])
88
-
89
- @property
90
- def operation_group_prefix(self) -> str:
91
- if self.operation_groups[-1].is_mixin:
92
- return ""
93
- return "." + ".".join([og.property_name for og in self.operation_groups])
94
-
95
- @property
96
- def response(self) -> str:
97
- if self.is_async:
98
- if is_lro(self.operation.operation_type):
99
- return "response = await (await "
100
- if is_common_operation(self.operation.operation_type):
101
- return "response = await "
102
- return "response = "
103
-
104
- @property
105
- def lro_comment(self) -> str:
106
- return " # call '.result()' to poll until service return final result"
107
-
108
- @property
109
- def operation_suffix(self) -> str:
110
- if is_lro(self.operation.operation_type):
111
- extra = ")" if self.is_async else ""
112
- return f"{extra}.result(){self.lro_comment}"
113
- return ""
114
-
115
- @property
116
- def extra_operation(self) -> str:
117
- if is_paging(self.operation.operation_type):
118
- async_str = "async " if self.is_async else ""
119
- return f"result = [r {async_str}for r in response]"
120
- return ""
121
-
122
-
123
- class Test(TestName):
124
- def __init__(
125
- self,
126
- code_model: CodeModel,
127
- client_name: str,
128
- operation_group: OperationGroup,
129
- testcases: List[TestCase],
130
- test_class_name: str,
131
- *,
132
- is_async: bool = False,
133
- ) -> None:
134
- super().__init__(code_model, client_name, is_async=is_async)
135
- self.operation_group = operation_group
136
- self.testcases = testcases
137
- self.test_class_name = test_class_name
138
-
139
-
140
- class TestGeneralSerializer(BaseSerializer):
141
- def __init__(self, code_model: CodeModel, env: Environment, *, is_async: bool = False) -> None:
142
- super().__init__(code_model, env)
143
- self.is_async = is_async
144
-
145
- @property
146
- def aio_str(self) -> str:
147
- return ".aio" if self.is_async else ""
148
-
149
- @property
150
- def test_names(self) -> List[TestName]:
151
- return [TestName(self.code_model, c.name, is_async=self.is_async) for c in self.code_model.clients]
152
-
153
- def add_import_client(self, imports: FileImport) -> None:
154
- namespace = get_namespace_from_package_name(self.code_model.options["package_name"])
155
- for client in self.code_model.clients:
156
- imports.add_submodule_import(namespace + self.aio_str, client.name, ImportType.STDLIB)
157
-
158
- @property
159
- def import_clients(self) -> FileImportSerializer:
160
- imports = self.init_file_import()
161
-
162
- imports.add_submodule_import("devtools_testutils", "AzureRecordedTestCase", ImportType.STDLIB)
163
- if not self.is_async:
164
- imports.add_import("functools", ImportType.STDLIB)
165
- imports.add_submodule_import("devtools_testutils", "PowerShellPreparer", ImportType.STDLIB)
166
- self.add_import_client(imports)
167
-
168
- return FileImportSerializer(imports, self.is_async)
169
-
170
- def serialize_conftest(self) -> str:
171
- return self.env.get_template("conftest.py.jinja2").render(
172
- test_names=self.test_names,
173
- code_model=self.code_model,
174
- )
175
-
176
- def serialize_testpreparer(self) -> str:
177
- return self.env.get_template("testpreparer.py.jinja2").render(
178
- test_names=self.test_names,
179
- imports=self.import_clients,
180
- code_model=self.code_model,
181
- )
182
-
183
-
184
- class TestSerializer(TestGeneralSerializer):
185
- def __init__(
186
- self,
187
- code_model: CodeModel,
188
- env: Environment,
189
- *,
190
- client: Client,
191
- operation_group: OperationGroup,
192
- is_async: bool = False,
193
- ) -> None:
194
- super().__init__(code_model, env, is_async=is_async)
195
- self.client = client
196
- self.operation_group = operation_group
197
-
198
- @property
199
- def import_test(self) -> FileImportSerializer:
200
- imports = self.init_file_import()
201
- test_name = TestName(self.code_model, self.client.name, is_async=self.is_async)
202
- async_suffix = "_async" if self.is_async else ""
203
- imports.add_submodule_import(
204
- "devtools_testutils" if self.code_model.options["azure_arm"] else "testpreparer" + async_suffix,
205
- test_name.base_test_class_name,
206
- ImportType.LOCAL,
207
- )
208
- imports.add_submodule_import(
209
- "devtools_testutils" if self.code_model.options["azure_arm"] else "testpreparer",
210
- test_name.preparer_name,
211
- ImportType.LOCAL,
212
- )
213
- imports.add_submodule_import(
214
- "devtools_testutils" + self.aio_str,
215
- "recorded_by_proxy" + async_suffix,
216
- ImportType.LOCAL,
217
- )
218
- if self.code_model.options["azure_arm"]:
219
- self.add_import_client(imports)
220
- return FileImportSerializer(imports, self.is_async)
221
-
222
- @property
223
- def breadth_search_operation_group(self) -> List[List[OperationGroup]]:
224
- result = []
225
- queue = [[self.operation_group]]
226
- while queue:
227
- current = queue.pop(0)
228
- if current[-1].operations:
229
- result.append(current)
230
- if current[-1].operation_groups:
231
- queue.extend([current + [og] for og in current[-1].operation_groups])
232
- return result
233
-
234
- def get_sub_type(self, param_type: ModelType) -> ModelType:
235
- if param_type.discriminated_subtypes:
236
- for item in param_type.discriminated_subtypes.values():
237
- return self.get_sub_type(item)
238
- return param_type
239
-
240
- def get_model_type(self, param_type: BaseType) -> Optional[ModelType]:
241
- if isinstance(param_type, ModelType):
242
- return param_type
243
- if isinstance(param_type, CombinedType):
244
- return param_type.target_model_subtype((ModelType,))
245
- return None
246
-
247
- def get_operation_params(self, operation: OperationType) -> Dict[str, Any]:
248
- operation_params = {}
249
- required_params = [p for p in operation.parameters.method if not p.optional]
250
- for param in required_params:
251
- model_type = self.get_model_type(param.type)
252
- param_type = self.get_sub_type(model_type) if model_type else param.type
253
- operation_params[param.client_name] = json_dumps_template(param_type.get_json_template_representation())
254
- return operation_params
255
-
256
- def get_test(self) -> Test:
257
- testcases = []
258
- for operation_groups in self.breadth_search_operation_group:
259
- for operation in operation_groups[-1].operations:
260
- if operation.internal or operation.is_lro_initial_operation:
261
- continue
262
- operation_params = self.get_operation_params(operation)
263
- testcase = TestCase(
264
- operation_groups=operation_groups,
265
- params=operation_params,
266
- operation=operation,
267
- is_async=self.is_async,
268
- )
269
- testcases.append(testcase)
270
- if not testcases:
271
- raise Exception("no public operation to test") # pylint: disable=broad-exception-raised
272
-
273
- return Test(
274
- code_model=self.code_model,
275
- client_name=self.client.name,
276
- operation_group=self.operation_group,
277
- testcases=testcases,
278
- test_class_name=self.test_class_name,
279
- is_async=self.is_async,
280
- )
281
-
282
- @property
283
- def test_class_name(self) -> str:
284
- test_name = TestName(self.code_model, self.client.name, is_async=self.is_async)
285
- class_name = "" if self.operation_group.is_mixin else self.operation_group.class_name
286
- return f"Test{test_name.prefix}{class_name}{test_name.async_suffix_capt}"
287
-
288
- def serialize_test(self) -> str:
289
- return self.env.get_template("test.py.jinja2").render(
290
- imports=self.import_test,
291
- code_model=self.code_model,
292
- test=self.get_test(),
293
- )
@@ -1,31 +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 ..models.imports import FileImport, ImportType
7
- from .import_serializer import FileImportSerializer
8
- from .base_serializer import BaseSerializer
9
-
10
-
11
- class TypesSerializer(BaseSerializer):
12
- def imports(self) -> FileImport:
13
- file_import = FileImport(self.code_model)
14
- if self.code_model.named_unions:
15
- file_import.add_submodule_import(
16
- "typing",
17
- "Union",
18
- ImportType.STDLIB,
19
- )
20
- for nu in self.code_model.named_unions:
21
- file_import.merge(nu.imports(relative_path=".", model_typing=True, is_types_file=True))
22
- return file_import
23
-
24
- def serialize(self) -> str:
25
- # Generate the models
26
- template = self.env.get_template("types.py.jinja2")
27
- return template.render(
28
- code_model=self.code_model,
29
- imports=FileImportSerializer(self.imports()),
30
- serializer=self,
31
- )
@@ -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 json
7
- from typing import Optional, List, Any
8
- from pathlib import Path
9
-
10
- from ..models import Client, OperationGroup
11
-
12
-
13
- def method_signature_and_response_type_annotation_template(
14
- *,
15
- method_signature: str,
16
- response_type_annotation: str,
17
- ) -> str:
18
- return f"{method_signature} -> {response_type_annotation}:"
19
-
20
-
21
- def extract_sample_name(file_path: str) -> str:
22
- file = file_path.split("specification")[-1]
23
- return Path(file).parts[-1].replace(".json", "")
24
-
25
-
26
- def strip_end(namespace: str) -> str:
27
- return ".".join(namespace.split(".")[:-1])
28
-
29
-
30
- def get_namespace_config(namespace: str, multiapi: bool) -> str:
31
- return strip_end(namespace) if multiapi else namespace
32
-
33
-
34
- def get_namespace_from_package_name(package_name: Optional[str]) -> str:
35
- return (package_name or "").replace("-", ".")
36
-
37
-
38
- def get_all_operation_groups_recursively(clients: List[Client]) -> List[OperationGroup]:
39
- operation_groups = []
40
- queue = []
41
- for client in clients:
42
- queue.extend(client.operation_groups)
43
- while queue:
44
- operation_groups.append(queue.pop(0))
45
- if operation_groups[-1].operation_groups:
46
- queue.extend(operation_groups[-1].operation_groups)
47
- return operation_groups
48
-
49
-
50
- def _improve_json_string(template_representation: str) -> Any:
51
- origin = template_representation.split("\n")
52
- final = []
53
- for line in origin:
54
- idx0 = line.find("#")
55
- idx1 = line.rfind('"')
56
- modified_line = ""
57
- if idx0 > -1 and idx1 > -1:
58
- modified_line = line[:idx0] + line[idx1:] + " " + line[idx0:idx1] + "\n"
59
- else:
60
- modified_line = line + "\n"
61
- modified_line = modified_line.replace('"', "").replace("\\", '"')
62
- final.append(modified_line)
63
- return "".join(final)
64
-
65
-
66
- def json_dumps_template(template_representation: Any) -> Any:
67
- # only for template use, since it wraps everything in strings
68
- return _improve_json_string(json.dumps(template_representation, indent=4))
@@ -1,37 +0,0 @@
1
- {{ serializer.class_definition }}
2
- """{{ op_tools.wrap_string(client.description, "\n") | indent }}
3
-
4
- {{ op_tools.serialize_with_wrap(serializer.property_descriptions(async_mode), "\n ") | indent }}
5
- {{ serializer.init_signature_and_response_type_annotation(async_mode) | indent }}
6
- {% if serializer.should_init_super %}
7
- super().__init__()
8
- {% endif %}
9
- {% if client.has_parameterized_host %}
10
- {{ serializer.host_variable_name }} = {{ keywords.escape_str(client.url) }}{{ client.url_pylint_disable }}
11
- {% endif %}
12
- {{ serializer.initialize_config() }}
13
- {{ op_tools.serialize(serializer.initialize_pipeline_client(async_mode)) | indent(8) }}
14
-
15
- {{ op_tools.serialize(serializer.serializers_and_operation_groups_properties()) | indent(8) }}
16
-
17
- {% set http_response = keywords.async_class + "HttpResponse" %}
18
- {{ serializer.send_request_signature_and_response_type_annotation(async_mode) | indent }}
19
- {{ op_tools.serialize(serializer.send_request_description(async_mode)) | indent(8) }}
20
- request_copy = deepcopy(request)
21
- {% if client.parameters.path %}
22
- {{ op_tools.serialize(serializer.serialize_path()) | indent(8) }}
23
- request_copy.url = self._client.format_url(request_copy.url, **path_format_arguments)
24
- {% else %}
25
- request_copy.url = self._client.format_url(request_copy.url)
26
- {% endif %}
27
- return self._client.send_request(request_copy, stream=stream, **kwargs) # type: ignore
28
-
29
- {{ keywords.def }} close(self) -> None:
30
- {{ keywords.await }}self._client.close()
31
-
32
- {{ keywords.def }} __{{ keywords.async_prefix }}enter__(self) -> Self:
33
- {{ keywords.await }}self._client.__{{ keywords.async_prefix }}enter__()
34
- return self
35
-
36
- {{ keywords.def }} __{{ keywords.async_prefix }}exit__(self, *exc_details: Any) -> None:
37
- {{ keywords.await }}self._client.__{{ keywords.async_prefix }}exit__(*exc_details)
@@ -1,12 +0,0 @@
1
- {% import 'keywords.jinja2' as keywords with context %}
2
- {% import 'operation_tools.jinja2' as op_tools %}
3
- {# actual template starts here #}
4
- # coding=utf-8
5
- {{ code_model.options['license_header'] }}
6
-
7
- {{ imports }}
8
-
9
- {% for client in clients %}
10
- {% set serializer = get_serializer(client) %}
11
- {% include "client.py.jinja2" %}
12
- {% endfor %}
@@ -1,73 +0,0 @@
1
- class {{ client.name }}Configuration: {{ client.config.pylint_disable }}
2
- """Configuration for {{ client.name }}.
3
-
4
- Note that all parameters used to create this instance are saved as instance
5
- attributes.
6
- {% if client.config.parameters.method | first %}
7
-
8
- {% endif %}
9
- {{ op_tools.serialize_with_wrap(serializer.property_descriptions(async_mode), "\n ") | indent }}
10
- {{ serializer.init_signature_and_response_type_annotation(async_mode) | indent }}
11
- {% if client.config.parameters.kwargs_to_pop %}
12
- {{ op_tools.serialize(serializer.pop_kwargs_from_signature()) | indent(8) }}
13
- {% endif %}
14
- {% if serializer.check_required_parameters() %}
15
- {{ op_tools.serialize(serializer.check_required_parameters()) | indent(8) -}}
16
- {% endif %}
17
-
18
- {% for parameter in client.config.parameters.method %}
19
- self.{{ parameter.client_name }} = {{ parameter.client_name }}
20
- {% endfor %}
21
- {% if serializer.set_constants() %}
22
- {{ op_tools.serialize(serializer.set_constants()) | indent(8) -}}
23
- {% endif %}
24
- {% if client.credential %}
25
- {% set cred_scopes = client.credential.type if client.credential.type.policy is defined and client.credential.type.policy.credential_scopes is defined %}
26
- {% if not cred_scopes %}
27
- {% set cred_scopes = client.credential.type.types | selectattr("policy.credential_scopes") | first if client.credential.type.types is defined %}
28
- {% endif %}
29
- {% if cred_scopes %}
30
- self.credential_scopes = kwargs.pop('credential_scopes', {{ cred_scopes.policy.credential_scopes }})
31
- {% endif %}
32
- {% endif %}
33
- kwargs.setdefault('sdk_moniker', '{{ client.config.sdk_moniker }}/{}'.format(VERSION))
34
- self.polling_interval = kwargs.get("polling_interval", 30)
35
- self._configure(**kwargs)
36
-
37
- {% if client.credential and client.credential.type.types is defined %}
38
- def _infer_policy(self, **kwargs):
39
- {% for cred_type in client.credential.type.types %}
40
- if {{ cred_type.instance_check_template.format("self.credential") }}:
41
- return {{ cred_type.policy.call(async_mode) }}
42
- {% endfor %}
43
- raise TypeError(f"Unsupported credential: {self.credential}")
44
- {% endif %}
45
-
46
- def _configure(
47
- self,
48
- **kwargs: Any
49
- ) -> None:
50
- self.user_agent_policy = kwargs.get('user_agent_policy') or policies.UserAgentPolicy(**kwargs)
51
- self.headers_policy = kwargs.get('headers_policy') or policies.HeadersPolicy(**kwargs)
52
- self.proxy_policy = kwargs.get('proxy_policy') or policies.ProxyPolicy(**kwargs)
53
- self.logging_policy = kwargs.get('logging_policy') or policies.NetworkTraceLoggingPolicy(**kwargs)
54
- {% if code_model.is_azure_flavor %}
55
- self.http_logging_policy = kwargs.get('http_logging_policy') or {{ "ARM" if client.code_model.options['azure_arm'] else "policies." }}HttpLoggingPolicy(**kwargs)
56
- self.custom_hook_policy = kwargs.get('custom_hook_policy') or policies.CustomHookPolicy(**kwargs)
57
- self.redirect_policy = kwargs.get('redirect_policy') or policies.{{ keywords.async_class }}RedirectPolicy(**kwargs)
58
- {% endif %}
59
- self.retry_policy = kwargs.get('retry_policy') or policies.{{ keywords.async_class }}RetryPolicy(**kwargs)
60
- self.authentication_policy = kwargs.get('authentication_policy')
61
- {% if client.credential and client.credential.type.policy is defined %}
62
- {# only adding this if credential_scopes is not passed during code generation #}
63
- {% if client.credential.type.policy.credential_scopes is defined and client.credential.type.policy.credential_scopes | length == 0 %}
64
- if not self.credential_scopes and not self.authentication_policy:
65
- raise ValueError("You must provide either credential_scopes or authentication_policy as kwargs")
66
- {% endif %}
67
- if self.credential and not self.authentication_policy:
68
- self.authentication_policy = {{ client.credential.type.policy.call(async_mode) }}
69
- {% endif %}
70
- {% if client.credential and client.credential.type.types is defined %}
71
- if self.credential and not self.authentication_policy:
72
- self.authentication_policy = self._infer_policy(**kwargs)
73
- {% endif %}
@@ -1,16 +0,0 @@
1
- {% import 'keywords.jinja2' as keywords with context %}
2
- {% import 'operation_tools.jinja2' as op_tools %}
3
- {# actual template starts here #}
4
- # coding=utf-8
5
- {{ code_model.options['license_header'] }}
6
-
7
- {{ imports }}
8
-
9
- {% if not code_model.options['package_version'] %}
10
- VERSION = "unknown"
11
- {% endif %}
12
-
13
- {% for client in clients %}
14
- {% set serializer = get_serializer(client) %}
15
- {% include "config.py.jinja2" %}
16
- {% endfor %}
@@ -1,28 +0,0 @@
1
- # coding=utf-8
2
- {{ code_model.options['license_header'] }}
3
- import os
4
- import pytest
5
- from dotenv import load_dotenv
6
- from devtools_testutils import test_proxy, add_general_regex_sanitizer, add_body_key_sanitizer, add_header_regex_sanitizer
7
-
8
- load_dotenv()
9
-
10
- # For security, please avoid record sensitive identity information in recordings
11
- @pytest.fixture(scope="session", autouse=True)
12
- def add_sanitizers(test_proxy):
13
- {% for test_name in test_names %}
14
- {% set prefix_upper = "AZURE" if code_model.options["azure_arm"] else test_name.prefix|upper %}
15
- {% set prefix_lower = test_name.prefix|lower %}
16
- {{ prefix_lower }}_subscription_id = os.environ.get("{{ prefix_upper }}_SUBSCRIPTION_ID", "00000000-0000-0000-0000-000000000000")
17
- {{ prefix_lower }}_tenant_id = os.environ.get("{{ prefix_upper }}_TENANT_ID", "00000000-0000-0000-0000-000000000000")
18
- {{ prefix_lower }}_client_id = os.environ.get("{{ prefix_upper }}_CLIENT_ID", "00000000-0000-0000-0000-000000000000")
19
- {{ prefix_lower }}_client_secret = os.environ.get("{{ prefix_upper }}_CLIENT_SECRET", "00000000-0000-0000-0000-000000000000")
20
- add_general_regex_sanitizer(regex={{ prefix_lower }}_subscription_id, value="00000000-0000-0000-0000-000000000000")
21
- add_general_regex_sanitizer(regex={{ prefix_lower }}_tenant_id, value="00000000-0000-0000-0000-000000000000")
22
- add_general_regex_sanitizer(regex={{ prefix_lower }}_client_id, value="00000000-0000-0000-0000-000000000000")
23
- add_general_regex_sanitizer(regex={{ prefix_lower }}_client_secret, value="00000000-0000-0000-0000-000000000000")
24
-
25
- {% endfor %}
26
- add_header_regex_sanitizer(key="Set-Cookie", value="[set-cookie;]")
27
- add_header_regex_sanitizer(key="Cookie", value="cookie;")
28
- add_body_key_sanitizer(json_path="$..access_token", value="access_token")
@@ -1,13 +0,0 @@
1
-
2
- class {{ enum.name }}({{ enum.value_type.type_annotation(is_operation_file=False) }}, Enum, metaclass=CaseInsensitiveEnumMeta):
3
- {% if enum.yaml_data.get("description") %}
4
- """{{ op_tools.wrap_string(enum.yaml_data["description"], "\n ") }}
5
- """
6
- {% endif %}
7
-
8
- {% for value in enum.values %}
9
- {{ value.name }} = {{ enum.value_type.get_declaration(value.value) }}
10
- {% if value.description(is_operation_file=False) %}
11
- """{{ op_tools.wrap_string(value.description(is_operation_file=False), "\n ") }}"""
12
- {% endif %}
13
- {% endfor %}
@@ -1,10 +0,0 @@
1
- {% import 'operation_tools.jinja2' as op_tools %}
2
- # coding=utf-8
3
- {{ code_model.options['license_header'] }}
4
-
5
- from enum import Enum
6
- from {{ code_model.core_library }}{{ "" if code_model.is_azure_flavor else ".utils" }} import CaseInsensitiveEnumMeta
7
-
8
- {% for enum in code_model.enums | sort %}
9
- {% include "enum.py.jinja2" %}
10
- {% endfor %}
@@ -1,24 +0,0 @@
1
- {% import 'keywords.jinja2' as keywords %}
2
- # coding=utf-8
3
- {{ code_model.options['license_header'] }}
4
-
5
- {% if clients %}
6
- {% for client in clients %}
7
- from .{{ client.filename }} import {{ client.name }}
8
- {% endfor %}
9
- {% endif %}
10
- {% if not async_mode and code_model.options['package_version']%}
11
- from ._version import VERSION
12
-
13
- __version__ = VERSION
14
- {% endif %}
15
-
16
- {{ keywords.patch_imports(try_except=True) }}
17
- __all__ = [
18
- {% for client in clients %}
19
- {{ keywords.escape_str(client.name) }},
20
- {% endfor %}
21
- ]
22
- {{ keywords.extend_all }}
23
-
24
- _patch_sdk()
@@ -1,19 +0,0 @@
1
- {% set def = "async def" if async_mode else "def" %}
2
- {% set async_prefix = "a" if async_mode else "" %}
3
- {% set await = "await " if async_mode else "" %}
4
- {% set async_class = "Async" if async_mode else "" %}
5
- {% macro escape_str(s) %}'{{ s|replace("'", "\\'") }}'{% endmacro %}
6
- {% set kwargs_declaration = "**kwargs: Any" %}
7
- {% set extend_all = "__all__.extend([p for p in _patch_all if p not in __all__])" %}
8
- {% macro patch_imports(try_except=False) %}
9
- {% set indentation = " " if try_except else "" %}
10
- {% if try_except %}
11
- try:
12
- {% endif %}
13
- {{ indentation }}from ._patch import __all__ as _patch_all
14
- {{ indentation }}from ._patch import * # pylint: disable=unused-wildcard-import
15
- {% if try_except %}
16
- except ImportError:
17
- _patch_all = []
18
- {% endif %}
19
- from ._patch import patch_sdk as _patch_sdk{% endmacro %}
@@ -1,16 +0,0 @@
1
- {% import 'operation_tools.jinja2' as op_tools with context %}
2
- {# actual template starts here #}
3
- {% if operation.overloads and operation.include_documentation %}
4
- {{ op_tools.generate_overloads(operation_serializer, operation) }}
5
- {% endif %}
6
- {{ operation_serializer.method_signature_and_response_type_annotation(operation) }}
7
- {{ op_tools.description(operation, operation_serializer) | indent -}}
8
- {% if not operation.abstract %}
9
- {% if operation_serializer.pop_kwargs_from_signature(operation) %}
10
- {{ op_tools.serialize(operation_serializer.pop_kwargs_from_signature(operation)) | indent }}
11
- {%- endif %}
12
- {{ op_tools.serialize(operation_serializer.initial_call(operation)) | indent }}
13
- {{ op_tools.serialize(operation_serializer.get_long_running_output(operation)) | indent }}
14
-
15
- {{ op_tools.serialize(operation_serializer.return_lro_poller(operation)) | indent }}
16
- {% endif %}
@@ -1,18 +0,0 @@
1
- {% import 'operation_tools.jinja2' as op_tools with context %}
2
- {% import 'keywords.jinja2' as keywords with context %}
3
- {# actual template starts here #}
4
- {% if operation.overloads and operation.include_documentation %}
5
- {{ op_tools.generate_overloads(operation_serializer, operation) }}
6
- {% endif %}
7
- {{ operation_serializer.method_signature_and_response_type_annotation(operation) }}
8
- {{ op_tools.description(operation, operation_serializer) | indent }}
9
- {% if not operation.abstract %}
10
- {% if operation_serializer.pop_kwargs_from_signature(operation) %}
11
- {{ op_tools.serialize(operation_serializer.pop_kwargs_from_signature(operation)) | indent }}
12
- {% endif %}
13
- {{ op_tools.serialize(operation_serializer.set_up_params_for_pager(operation)) | indent }}
14
-
15
- {{ op_tools.serialize(operation_serializer.initial_call(operation)) | indent }}
16
- {{ op_tools.serialize(operation_serializer.get_long_running_output(operation)) | indent }}
17
- {{ op_tools.serialize(operation_serializer.return_lro_poller(operation)) | indent }}
18
- {% endif %}