@azure-tools/typespec-python 0.33.0 → 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 (147) 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/src/emitter.d.ts +0 -2
  6. package/dist/src/emitter.d.ts.map +1 -1
  7. package/dist/src/emitter.js +2 -102
  8. package/dist/src/emitter.js.map +1 -1
  9. package/dist/src/index.d.ts +1 -1
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js +1 -1
  12. package/dist/src/index.js.map +1 -1
  13. package/package.json +14 -11
  14. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
  15. package/scripts/copy-scripts.ts +26 -0
  16. package/scripts/eng/pylintrc +2 -1
  17. package/dist/src/code-model.d.ts +0 -4
  18. package/dist/src/code-model.d.ts.map +0 -1
  19. package/dist/src/code-model.js +0 -190
  20. package/dist/src/code-model.js.map +0 -1
  21. package/dist/src/external-process.d.ts +0 -20
  22. package/dist/src/external-process.d.ts.map +0 -1
  23. package/dist/src/external-process.js +0 -44
  24. package/dist/src/external-process.js.map +0 -1
  25. package/dist/src/http.d.ts +0 -7
  26. package/dist/src/http.d.ts.map +0 -1
  27. package/dist/src/http.js +0 -266
  28. package/dist/src/http.js.map +0 -1
  29. package/dist/src/types.d.ts +0 -36
  30. package/dist/src/types.d.ts.map +0 -1
  31. package/dist/src/types.js +0 -489
  32. package/dist/src/types.js.map +0 -1
  33. package/dist/src/utils.d.ts +0 -26
  34. package/dist/src/utils.d.ts.map +0 -1
  35. package/dist/src/utils.js +0 -151
  36. package/dist/src/utils.js.map +0 -1
  37. package/generator/LICENSE +0 -21
  38. package/generator/README.md +0 -1
  39. package/generator/dev_requirements.txt +0 -5
  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/requirements.txt +0 -12
  147. package/generator/setup.py +0 -55
@@ -1,295 +0,0 @@
1
- # -------------------------------------------------------------------------
2
- # Copyright (c) Microsoft Corporation. All rights reserved.
3
- # Licensed under the MIT License. See License.txt in the project root for
4
- # license information.
5
- # --------------------------------------------------------------------------
6
- from typing import List
7
-
8
- from . import utils
9
- from ..models import Client, ParameterMethodLocation
10
- from .parameter_serializer import ParameterSerializer, PopKwargType
11
- from ...utils import build_policies
12
-
13
-
14
- class ClientSerializer:
15
- def __init__(self, client: Client) -> None:
16
- self.client = client
17
- self.parameter_serializer = ParameterSerializer()
18
-
19
- def _init_signature(self, async_mode: bool) -> str:
20
- pylint_disable = ""
21
- if not self.client.parameters.credential:
22
- pylint_disable = " # pylint: disable=missing-client-constructor-parameter-credential"
23
- return self.parameter_serializer.serialize_method(
24
- function_def="def",
25
- method_name="__init__",
26
- need_self_param=True,
27
- method_param_signatures=self.client.parameters.method_signature(async_mode),
28
- pylint_disable=pylint_disable,
29
- )
30
-
31
- def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
32
- init_signature = self._init_signature(async_mode)
33
- return utils.method_signature_and_response_type_annotation_template(
34
- method_signature=init_signature,
35
- response_type_annotation="None",
36
- )
37
-
38
- def pop_kwargs_from_signature(self) -> List[str]:
39
- return self.parameter_serializer.pop_kwargs_from_signature(
40
- self.client.parameters.kwargs_to_pop,
41
- check_kwarg_dict=False,
42
- pop_headers_kwarg=PopKwargType.NO,
43
- pop_params_kwarg=PopKwargType.NO,
44
- )
45
-
46
- @property
47
- def class_definition(self) -> str:
48
- class_name = self.client.name
49
- base_class = ""
50
- if self.client.has_mixin:
51
- base_class = f"{class_name}OperationsMixin"
52
- pylint_disable = self.client.pylint_disable
53
- if base_class:
54
- return f"class {class_name}({base_class}):{pylint_disable}"
55
- return f"class {class_name}:{pylint_disable}"
56
-
57
- def property_descriptions(self, async_mode: bool) -> List[str]:
58
- retval: List[str] = []
59
- operations_folder = ".aio.operations." if async_mode else ".operations."
60
- for og in [og for og in self.client.operation_groups if not og.is_mixin]:
61
- retval.append(f":ivar {og.property_name}: {og.class_name} operations")
62
- property_type = f"{self.client.code_model.namespace}{operations_folder}{og.class_name}"
63
- retval.append(f":vartype {og.property_name}: {property_type}")
64
- for param in self.client.parameters.method:
65
- retval.append(f":{param.description_keyword} {param.client_name}: {param.description}")
66
- retval.append(
67
- f":{param.docstring_type_keyword} {param.client_name}: {param.docstring_type(async_mode=async_mode)}"
68
- )
69
- if self.client.has_public_lro_operations:
70
- retval.append(
71
- ":keyword int polling_interval: Default waiting time between two polls for LRO operations "
72
- "if no Retry-After header is present."
73
- )
74
- retval = [s.replace("\\", "\\\\") for s in retval]
75
- retval.append('"""')
76
- return retval
77
-
78
- def initialize_config(self) -> str:
79
- config_name = f"{self.client.name}Configuration"
80
- config_call = ", ".join(
81
- [
82
- f"{p.client_name}={p.client_name}"
83
- for p in self.client.config.parameters.method
84
- if p.method_location != ParameterMethodLocation.KWARG
85
- ]
86
- + ["**kwargs"]
87
- )
88
- return f"self._config = {config_name}({config_call})"
89
-
90
- @property
91
- def host_variable_name(self) -> str:
92
- try:
93
- return next(p for p in self.client.parameters if p.is_host).client_name
94
- except StopIteration:
95
- return "_endpoint"
96
-
97
- @property
98
- def should_init_super(self) -> bool:
99
- return any(og for og in self.client.operation_groups if og.is_mixin and og.has_abstract_operations)
100
-
101
- def initialize_pipeline_client(self, async_mode: bool) -> List[str]:
102
- result = []
103
- pipeline_client_name = self.client.pipeline_class(async_mode)
104
- endpoint_name = "base_url" if self.client.code_model.is_azure_flavor else "endpoint"
105
- params = {
106
- endpoint_name: self.host_variable_name,
107
- "policies": "_policies",
108
- }
109
- if not self.client.code_model.is_legacy and self.client.request_id_header_name:
110
- result.append(f'kwargs["request_id_header_name"] = "{self.client.request_id_header_name}"')
111
- policies = build_policies(
112
- self.client.code_model.options["azure_arm"],
113
- async_mode,
114
- is_azure_flavor=self.client.code_model.is_azure_flavor,
115
- tracing=self.client.code_model.options["tracing"],
116
- )
117
- result.extend(
118
- [
119
- "_policies = kwargs.pop('policies', None)",
120
- "if _policies is None:",
121
- f' _policies = [{",".join(policies)}]',
122
- f"self._client: {pipeline_client_name} = {pipeline_client_name}("
123
- f"{', '.join(f'{k}={v}' for k, v in params.items())}, **kwargs)",
124
- ]
125
- )
126
- return result
127
-
128
- def serializers_and_operation_groups_properties(self) -> List[str]:
129
- retval = []
130
-
131
- def _get_client_models_value(models_dict_name: str) -> str:
132
- if self.client.code_model.model_types:
133
- return f"{{k: v for k, v in {models_dict_name}.__dict__.items() if isinstance(v, type)}}"
134
- return "{}"
135
-
136
- is_msrest_model = self.client.code_model.options["models_mode"] == "msrest"
137
- if is_msrest_model:
138
- add_private_models = len(self.client.code_model.model_types) != len(
139
- self.client.code_model.public_model_types
140
- )
141
- model_dict_name = f"_models.{self.client.code_model.models_filename}" if add_private_models else "_models"
142
- retval.append(
143
- f"client_models{': Dict[str, Any]' if not self.client.code_model.model_types else ''}"
144
- f" = {_get_client_models_value(model_dict_name)}"
145
- )
146
- if add_private_models and self.client.code_model.model_types:
147
- update_dict = "{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}"
148
- retval.append(f"client_models.update({update_dict})")
149
- client_models_str = "client_models" if is_msrest_model else ""
150
- retval.append(f"self._serialize = Serializer({client_models_str})")
151
- retval.append(f"self._deserialize = Deserializer({client_models_str})")
152
- if not self.client.code_model.options["client_side_validation"]:
153
- retval.append("self._serialize.client_side_validation = False")
154
- operation_groups = [og for og in self.client.operation_groups if not og.is_mixin]
155
- for og in operation_groups:
156
- if og.code_model.options["multiapi"]:
157
- api_version = f", '{og.api_versions[0]}'" if og.api_versions else ", None"
158
- else:
159
- api_version = ""
160
- retval.extend(
161
- [
162
- f"self.{og.property_name} = {og.class_name}(",
163
- f" self._client, self._config, self._serialize, self._deserialize{api_version}",
164
- ")",
165
- ]
166
- )
167
- return retval
168
-
169
- def _send_request_signature(self) -> str:
170
- send_request_signature = [
171
- "request: HttpRequest, *, stream: bool = False,"
172
- ] + self.client.parameters.method_signature_kwargs
173
- return self.parameter_serializer.serialize_method(
174
- function_def="def",
175
- method_name=self.client.send_request_name,
176
- need_self_param=True,
177
- method_param_signatures=send_request_signature,
178
- )
179
-
180
- def send_request_signature_and_response_type_annotation(self, async_mode: bool) -> str:
181
- send_request_signature = self._send_request_signature()
182
- return utils.method_signature_and_response_type_annotation_template(
183
- method_signature=send_request_signature,
184
- response_type_annotation=("Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse"),
185
- )
186
-
187
- def _example_make_call(self, async_mode: bool) -> List[str]:
188
- http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
189
- retval = [f">>> response = {'await ' if async_mode else ''}client.{self.client.send_request_name}(request)"]
190
- retval.append(f"<{http_response}: 200 OK>")
191
- return retval
192
-
193
- def _request_builder_example(self, async_mode: bool) -> List[str]:
194
- retval = [
195
- "We have helper methods to create requests specific to this service in "
196
- + f"`{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}`."
197
- ]
198
- retval.append("Use these helper methods to create the request you pass to this method.")
199
- retval.append("")
200
-
201
- request_builder = self.client.request_builders[0]
202
- request_builder_signature = ", ".join(request_builder.parameters.call)
203
- if request_builder.group_name:
204
- rest_imported = request_builder.group_name
205
- request_builder_name = f"{request_builder.group_name}.{request_builder.name}"
206
- else:
207
- rest_imported = request_builder.name
208
- request_builder_name = request_builder.name
209
- full_path = f"{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}"
210
- retval.append(f">>> from {full_path} import {rest_imported}")
211
- retval.append(f">>> request = {request_builder_name}({request_builder_signature})")
212
- retval.append(f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>")
213
- retval.extend(self._example_make_call(async_mode))
214
- return retval
215
-
216
- def _rest_request_example(self, async_mode: bool) -> List[str]:
217
- retval = [f">>> from {self.client.code_model.core_library}.rest import HttpRequest"]
218
- retval.append('>>> request = HttpRequest("GET", "https://www.example.org/")')
219
- retval.append("<HttpRequest [GET], url: 'https://www.example.org/'>")
220
- retval.extend(self._example_make_call(async_mode))
221
- return retval
222
-
223
- def send_request_description(self, async_mode: bool) -> List[str]:
224
- rest_library = f"{self.client.code_model.core_library}.rest"
225
- retval = ['"""Runs the network request through the client\'s chained policies.']
226
- retval.append("")
227
- if self.client.code_model.options["builders_visibility"] != "embedded":
228
- retval.extend(self._request_builder_example(async_mode))
229
- else:
230
- retval.extend(self._rest_request_example(async_mode))
231
- retval.append("")
232
- retval.append("For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request")
233
- retval.append("")
234
- retval.append(":param request: The network request you want to make. Required.")
235
- retval.append(f":type request: ~{rest_library}.HttpRequest")
236
- retval.append(":keyword bool stream: Whether the response payload will be streamed. Defaults to False.")
237
- retval.append(":return: The response of your network call. Does not do error handling on your response.")
238
- http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
239
- retval.append(f":rtype: ~{rest_library}.{http_response}")
240
- retval.append('"""')
241
- return retval
242
-
243
- def serialize_path(self) -> List[str]:
244
- return self.parameter_serializer.serialize_path(self.client.parameters.path, "self._serialize")
245
-
246
-
247
- class ConfigSerializer:
248
- def __init__(self, client: Client) -> None:
249
- self.client = client
250
- self.parameter_serializer = ParameterSerializer()
251
-
252
- def _init_signature(self, async_mode: bool) -> str:
253
- return self.parameter_serializer.serialize_method(
254
- function_def="def",
255
- method_name="__init__",
256
- need_self_param=True,
257
- method_param_signatures=self.client.config.parameters.method_signature(async_mode),
258
- )
259
-
260
- def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
261
- init_signature = self._init_signature(async_mode)
262
- return utils.method_signature_and_response_type_annotation_template(
263
- method_signature=init_signature,
264
- response_type_annotation="None",
265
- )
266
-
267
- def pop_kwargs_from_signature(self) -> List[str]:
268
- return self.parameter_serializer.pop_kwargs_from_signature(
269
- self.client.config.parameters.kwargs_to_pop,
270
- check_kwarg_dict=False,
271
- pop_headers_kwarg=PopKwargType.NO,
272
- pop_params_kwarg=PopKwargType.NO,
273
- )
274
-
275
- def set_constants(self) -> List[str]:
276
- return [
277
- f"self.{p.client_name} = {p.client_default_value_declaration}"
278
- for p in self.client.config.parameters.constant
279
- if p not in self.client.config.parameters.method
280
- ]
281
-
282
- def check_required_parameters(self) -> List[str]:
283
- return [
284
- f"if {p.client_name} is None:\n" f" raise ValueError(\"Parameter '{p.client_name}' must not be None.\")"
285
- for p in self.client.config.parameters.method
286
- if not (p.optional or p.constant)
287
- ]
288
-
289
- def property_descriptions(self, async_mode: bool) -> List[str]:
290
- retval: List[str] = []
291
- for p in self.client.config.parameters.method:
292
- retval.append(f":{p.description_keyword} {p.client_name}: {p.description}")
293
- retval.append(f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}")
294
- retval.append('"""')
295
- return retval
@@ -1,15 +0,0 @@
1
- # -------------------------------------------------------------------------
2
- # Copyright (c) Microsoft Corporation. All rights reserved.
3
- # Licensed under the MIT License. See License.txt in the project root for
4
- # license information.
5
- # --------------------------------------------------------------------------
6
-
7
- from .base_serializer import BaseSerializer
8
- from ..models import FileImport
9
-
10
-
11
- class EnumSerializer(BaseSerializer):
12
- def serialize(self) -> str:
13
- # Generate the enum file
14
- template = self.env.get_template("enum_container.py.jinja2")
15
- return template.render(code_model=self.code_model, file_import=FileImport(self.code_model))
@@ -1,213 +0,0 @@
1
- # -------------------------------------------------------------------------
2
- # Copyright (c) Microsoft Corporation. All rights reserved.
3
- # Licensed under the MIT License. See License.txt in the project root for
4
- # license information.
5
- # --------------------------------------------------------------------------
6
- import json
7
- from typing import Any, List
8
- from jinja2 import Environment
9
- from .import_serializer import FileImportSerializer, TypingSection
10
- from ..models.imports import MsrestImportType, FileImport
11
- from ..models import (
12
- ImportType,
13
- CodeModel,
14
- TokenCredentialType,
15
- Client,
16
- )
17
- from .client_serializer import ClientSerializer, ConfigSerializer
18
- from .base_serializer import BaseSerializer
19
-
20
-
21
- class GeneralSerializer(BaseSerializer):
22
- """General serializer for SDK root level files"""
23
-
24
- def __init__(self, code_model: CodeModel, env: Environment, async_mode: bool):
25
- super().__init__(code_model, env)
26
- self.async_mode = async_mode
27
-
28
- def serialize_setup_file(self) -> str:
29
- template = self.env.get_template("packaging_templates/setup.py.jinja2")
30
- params = {}
31
- params.update(self.code_model.options)
32
- return template.render(code_model=self.code_model, **params)
33
-
34
- def serialize_package_file(self, template_name: str, **kwargs: Any) -> str:
35
- template = self.env.get_template(template_name)
36
- package_parts = (self.code_model.options["package_name"] or "").split("-")[:-1]
37
- token_credential = any(
38
- c for c in self.code_model.clients if isinstance(getattr(c.credential, "type", None), TokenCredentialType)
39
- )
40
- version = self.code_model.options["package_version"]
41
- if any(x in version for x in ["a", "b", "rc"]) or version[0] == "0":
42
- dev_status = "4 - Beta"
43
- else:
44
- dev_status = "5 - Production/Stable"
45
- params = {
46
- "code_model": self.code_model,
47
- "dev_status": dev_status,
48
- "token_credential": token_credential,
49
- "pkgutil_names": [".".join(package_parts[: i + 1]) for i in range(len(package_parts))],
50
- "init_names": ["/".join(package_parts[: i + 1]) + "/__init__.py" for i in range(len(package_parts))],
51
- "client_name": self.code_model.clients[0].name,
52
- "namespace": self.code_model.namespace,
53
- }
54
- params.update(self.code_model.options)
55
- params.update(kwargs)
56
- return template.render(file_import=FileImport(self.code_model), **params)
57
-
58
- def serialize_pkgutil_init_file(self) -> str:
59
- template = self.env.get_template("pkgutil_init.py.jinja2")
60
- return template.render()
61
-
62
- def serialize_init_file(self, clients: List[Client]) -> str:
63
- template = self.env.get_template("init.py.jinja2")
64
- return template.render(
65
- code_model=self.code_model,
66
- clients=clients,
67
- async_mode=self.async_mode,
68
- )
69
-
70
- def serialize_service_client_file(self, clients: List[Client]) -> str:
71
- template = self.env.get_template("client_container.py.jinja2")
72
-
73
- imports = FileImport(self.code_model)
74
- for client in clients:
75
- imports.merge(client.imports(self.async_mode))
76
-
77
- return template.render(
78
- code_model=self.code_model,
79
- clients=clients,
80
- async_mode=self.async_mode,
81
- get_serializer=ClientSerializer,
82
- imports=FileImportSerializer(imports),
83
- )
84
-
85
- def serialize_vendor_file(self, clients: List[Client]) -> str:
86
- template = self.env.get_template("vendor.py.jinja2")
87
-
88
- # configure imports
89
- file_import = FileImport(self.code_model)
90
- if self.code_model.need_mixin_abc:
91
- file_import.add_submodule_import(
92
- "abc",
93
- "ABC",
94
- ImportType.STDLIB,
95
- )
96
- file_import.add_submodule_import(
97
- "" if self.code_model.is_azure_flavor else "runtime",
98
- f"{'Async' if self.async_mode else ''}PipelineClient",
99
- ImportType.SDKCORE,
100
- TypingSection.TYPING,
101
- )
102
- file_import.add_msrest_import(
103
- relative_path=".." if self.async_mode else ".",
104
- msrest_import_type=MsrestImportType.SerializerDeserializer,
105
- typing_section=TypingSection.TYPING,
106
- )
107
- for client in clients:
108
- if client.has_mixin:
109
- file_import.add_submodule_import(
110
- "._configuration",
111
- f"{client.name}Configuration",
112
- ImportType.LOCAL,
113
- )
114
- if self.code_model.has_etag:
115
- file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
116
- file_import.add_submodule_import(
117
- "",
118
- "MatchConditions",
119
- ImportType.SDKCORE,
120
- )
121
- if self.code_model.has_form_data and self.code_model.options["models_mode"] == "dpg" and not self.async_mode:
122
- file_import.add_submodule_import("typing", "IO", ImportType.STDLIB)
123
- file_import.add_submodule_import("typing", "Tuple", ImportType.STDLIB)
124
- file_import.add_submodule_import("typing", "Union", ImportType.STDLIB)
125
- file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
126
- file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
127
- file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
128
- file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
129
- file_import.add_submodule_import("typing", "List", ImportType.STDLIB)
130
- file_import.add_submodule_import(
131
- "._model_base",
132
- "SdkJSONEncoder",
133
- ImportType.LOCAL,
134
- )
135
- file_import.add_submodule_import(
136
- "._model_base",
137
- "Model",
138
- ImportType.LOCAL,
139
- )
140
- file_import.add_import("json", ImportType.STDLIB)
141
-
142
- return template.render(
143
- code_model=self.code_model,
144
- imports=FileImportSerializer(
145
- file_import,
146
- ),
147
- async_mode=self.async_mode,
148
- clients=clients,
149
- )
150
-
151
- def serialize_config_file(self, clients: List[Client]) -> str:
152
- template = self.env.get_template("config_container.py.jinja2")
153
- imports = FileImport(self.code_model)
154
- for client in self.code_model.clients:
155
- imports.merge(client.config.imports(self.async_mode))
156
- return template.render(
157
- code_model=self.code_model,
158
- async_mode=self.async_mode,
159
- imports=FileImportSerializer(imports),
160
- get_serializer=ConfigSerializer,
161
- clients=clients,
162
- )
163
-
164
- def serialize_version_file(self) -> str:
165
- template = self.env.get_template("version.py.jinja2")
166
- return template.render(code_model=self.code_model)
167
-
168
- def serialize_serialization_file(self) -> str:
169
- template = self.env.get_template("serialization.py.jinja2")
170
- return template.render(
171
- code_model=self.code_model,
172
- )
173
-
174
- def serialize_model_base_file(self) -> str:
175
- template = self.env.get_template("model_base.py.jinja2")
176
- return template.render(code_model=self.code_model, file_import=FileImport(self.code_model))
177
-
178
- def serialize_validation_file(self) -> str:
179
- template = self.env.get_template("validation.py.jinja2")
180
- return template.render(code_model=self.code_model)
181
-
182
- def serialize_cross_language_definition_file(self) -> str:
183
- cross_langauge_def_dict = {
184
- f"{self.code_model.namespace}.models.{model.name}": model.cross_language_definition_id
185
- for model in self.code_model.public_model_types
186
- }
187
- cross_langauge_def_dict.update(
188
- {
189
- f"{self.code_model.namespace}.models.{enum.name}": enum.cross_language_definition_id
190
- for enum in self.code_model.enums
191
- if not enum.internal
192
- }
193
- )
194
- cross_langauge_def_dict.update(
195
- {
196
- (
197
- f"{self.code_model.namespace}.{client.name}."
198
- + ("" if operation_group.is_mixin else f"{operation_group.property_name}.")
199
- + f"{operation.name}"
200
- ): operation.cross_language_definition_id
201
- for client in self.code_model.clients
202
- for operation_group in client.operation_groups
203
- for operation in operation_group.operations
204
- if not operation.name.startswith("_")
205
- }
206
- )
207
- return json.dumps(
208
- {
209
- "CrossLanguagePackageId": self.code_model.cross_language_package_id,
210
- "CrossLanguageDefinitionId": cross_langauge_def_dict,
211
- },
212
- indent=4,
213
- )
@@ -1,127 +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 copy import deepcopy
7
- from typing import List
8
- from ..models.imports import (
9
- ImportType,
10
- FileImport,
11
- ImportModel,
12
- TypingSection,
13
- TypeDefinition,
14
- )
15
-
16
-
17
- def _serialize_package(imports: List[ImportModel], delimiter: str) -> str:
18
- buffer = []
19
- if any(i for i in imports if i.submodule_name is None):
20
- buffer.append(f"import {imports[0].module_name}{f' as {imports[0].alias}' if imports[0].alias else ''}")
21
- else:
22
- import_str = ", ".join(
23
- sorted(
24
- set(
25
- f"{i.submodule_name} as {i.alias}" if i.alias else i.submodule_name for i in imports # type: ignore
26
- )
27
- )
28
- )
29
- buffer.append(f"from {imports[0].module_name} import {import_str}")
30
- return delimiter.join(buffer)
31
-
32
-
33
- def _serialize_versioned_package(i: ImportModel, delimiter: str) -> str:
34
- if not i.version_modules:
35
- return ""
36
- buffer = []
37
- for n, (version, module_name, comment) in enumerate(i.version_modules):
38
- buffer.append("{} sys.version_info >= {}:".format("if" if n == 0 else "elif", version))
39
- buffer.append(
40
- f" from {module_name} import {i.submodule_name}{f' as {i.alias}' if i.alias else ''}"
41
- f"{f' # {comment}' if comment else ''}"
42
- )
43
- buffer.append("else:")
44
- buffer.append(
45
- f" from {i.module_name} import {i.submodule_name}{f' as {i.alias}' if i.alias else ''}"
46
- " # type: ignore # pylint: disable=ungrouped-imports"
47
- )
48
- return delimiter.join(buffer)
49
-
50
-
51
- def _serialize_import_type(imports: List[ImportModel], delimiter: str) -> str:
52
- """Serialize a given import type."""
53
- import_list = []
54
- for module_name in sorted(set(i.module_name for i in imports)):
55
- normal_imports = [i for i in imports if i.module_name == module_name and not i.version_modules]
56
- versioned_imports = [i for i in imports if i.module_name == module_name and i.version_modules]
57
- if normal_imports:
58
- import_list.append(_serialize_package(normal_imports, delimiter))
59
- for i in versioned_imports:
60
- import_list.append(_serialize_versioned_package(i, delimiter))
61
- return delimiter.join(import_list)
62
-
63
-
64
- def _get_import_clauses(imports: List[ImportModel], delimiter: str) -> List[str]:
65
- import_clause = []
66
- for import_type in ImportType:
67
- imports_with_import_type = [i for i in imports if i.import_type == import_type]
68
- if imports_with_import_type:
69
- import_clause.append(_serialize_import_type(imports_with_import_type, delimiter))
70
- return import_clause
71
-
72
-
73
- class FileImportSerializer:
74
- def __init__(self, file_import: FileImport, async_mode: bool = False) -> None:
75
- self.file_import = file_import
76
- self.async_mode = async_mode
77
-
78
- def _get_imports_list(self, baseline_typing_section: TypingSection, add_conditional_typing: bool):
79
- # If this is a python 3 file, our regular imports include the CONDITIONAL category
80
- # If this is not a python 3 file, our typing imports include the CONDITIONAL category
81
- file_import_copy = deepcopy(self.file_import)
82
- if add_conditional_typing and any(self.file_import.get_imports_from_section(TypingSection.CONDITIONAL)):
83
- # we switch the TypingSection key for the CONDITIONAL typing imports so we can merge
84
- # the imports together
85
- for i in file_import_copy.imports:
86
- if i.typing_section == TypingSection.CONDITIONAL:
87
- i.typing_section = baseline_typing_section
88
- return file_import_copy.get_imports_from_section(baseline_typing_section)
89
-
90
- def _add_type_checking_import(self):
91
- if any(self.file_import.get_imports_from_section(TypingSection.TYPING)):
92
- self.file_import.add_submodule_import("typing", "TYPE_CHECKING", ImportType.STDLIB)
93
-
94
- def get_typing_definitions(self) -> str:
95
- def declare_definition(type_name: str, type_definition: TypeDefinition) -> List[str]:
96
- ret: List[str] = []
97
- definition_value = type_definition.async_definition if self.async_mode else type_definition.sync_definition
98
- ret.append("{} = {}".format(type_name, definition_value))
99
- return ret
100
-
101
- if not self.file_import.type_definitions:
102
- return ""
103
- declarations: List[str] = [""]
104
- for type_name, value in self.file_import.type_definitions.items():
105
- declarations.extend(declare_definition(type_name, value))
106
- return "\n".join(declarations)
107
-
108
- def __str__(self) -> str:
109
- self._add_type_checking_import()
110
- regular_imports = ""
111
- regular_imports_list = self._get_imports_list(
112
- baseline_typing_section=TypingSection.REGULAR,
113
- add_conditional_typing=True,
114
- )
115
-
116
- if regular_imports_list:
117
- regular_imports = "\n\n".join(_get_import_clauses(regular_imports_list, "\n"))
118
-
119
- typing_imports = ""
120
- typing_imports_list = self._get_imports_list(
121
- baseline_typing_section=TypingSection.TYPING,
122
- add_conditional_typing=False,
123
- )
124
- if typing_imports_list:
125
- typing_imports += "\n\nif TYPE_CHECKING:\n # pylint: disable=unused-import,ungrouped-imports\n "
126
- typing_imports += "\n\n ".join(_get_import_clauses(typing_imports_list, "\n "))
127
- return regular_imports + typing_imports + self.get_typing_definitions()