@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,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 %}