@autorest/python 6.13.15 → 6.13.17
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.
- package/autorest/__init__.py +4 -12
- package/autorest/_utils.py +5 -20
- package/autorest/black/__init__.py +1 -3
- package/autorest/codegen/__init__.py +29 -96
- package/autorest/codegen/models/__init__.py +1 -3
- package/autorest/codegen/models/base.py +2 -6
- package/autorest/codegen/models/base_builder.py +2 -6
- package/autorest/codegen/models/client.py +24 -86
- package/autorest/codegen/models/code_model.py +13 -53
- package/autorest/codegen/models/combined_type.py +3 -9
- package/autorest/codegen/models/constant_type.py +4 -14
- package/autorest/codegen/models/credential_types.py +11 -35
- package/autorest/codegen/models/dictionary_type.py +4 -12
- package/autorest/codegen/models/enum_type.py +10 -31
- package/autorest/codegen/models/imports.py +15 -41
- package/autorest/codegen/models/list_type.py +7 -23
- package/autorest/codegen/models/lro_operation.py +6 -18
- package/autorest/codegen/models/lro_paging_operation.py +1 -3
- package/autorest/codegen/models/model_type.py +21 -73
- package/autorest/codegen/models/operation.py +41 -139
- package/autorest/codegen/models/operation_group.py +21 -60
- package/autorest/codegen/models/paging_operation.py +13 -43
- package/autorest/codegen/models/parameter.py +16 -54
- package/autorest/codegen/models/parameter_list.py +27 -103
- package/autorest/codegen/models/primitive_types.py +15 -49
- package/autorest/codegen/models/property.py +8 -28
- package/autorest/codegen/models/request_builder.py +11 -39
- package/autorest/codegen/models/request_builder_parameter.py +4 -13
- package/autorest/codegen/models/response.py +16 -57
- package/autorest/codegen/serializers/__init__.py +46 -150
- package/autorest/codegen/serializers/builder_serializer.py +113 -402
- package/autorest/codegen/serializers/client_serializer.py +26 -78
- package/autorest/codegen/serializers/enum_serializer.py +1 -3
- package/autorest/codegen/serializers/general_serializer.py +6 -22
- package/autorest/codegen/serializers/import_serializer.py +13 -40
- package/autorest/codegen/serializers/metadata_serializer.py +7 -21
- package/autorest/codegen/serializers/model_init_serializer.py +1 -5
- package/autorest/codegen/serializers/model_serializer.py +15 -56
- package/autorest/codegen/serializers/operation_groups_serializer.py +1 -3
- package/autorest/codegen/serializers/operations_init_serializer.py +2 -8
- package/autorest/codegen/serializers/parameter_serializer.py +8 -26
- package/autorest/codegen/serializers/request_builders_serializer.py +1 -3
- package/autorest/codegen/serializers/sample_serializer.py +13 -39
- package/autorest/codegen/serializers/test_serializer.py +10 -30
- package/autorest/codegen/serializers/types_serializer.py +1 -3
- package/autorest/codegen/templates/enum.py.jinja2 +2 -2
- package/autorest/codegen/templates/enum_container.py.jinja2 +1 -0
- package/autorest/codegen/templates/model_container.py.jinja2 +1 -0
- package/autorest/codegen/templates/model_dpg.py.jinja2 +3 -3
- package/autorest/codegen/templates/model_msrest.py.jinja2 +1 -1
- package/autorest/codegen/templates/operation_tools.jinja2 +1 -1
- package/autorest/jsonrpc/__init__.py +1 -3
- package/autorest/jsonrpc/server.py +3 -9
- package/autorest/jsonrpc/stdstream.py +4 -12
- package/autorest/m2r/__init__.py +2 -6
- package/autorest/m4reformatter/__init__.py +72 -237
- package/autorest/multiapi/__init__.py +4 -11
- package/autorest/multiapi/models/client.py +7 -21
- package/autorest/multiapi/models/code_model.py +9 -28
- package/autorest/multiapi/models/config.py +1 -3
- package/autorest/multiapi/models/global_parameters.py +6 -16
- package/autorest/multiapi/models/imports.py +5 -9
- package/autorest/multiapi/models/operation_mixin_group.py +5 -17
- package/autorest/multiapi/serializers/__init__.py +10 -31
- package/autorest/multiapi/serializers/import_serializer.py +8 -24
- package/autorest/multiapi/utils.py +2 -6
- package/autorest/multiclient/__init__.py +1 -3
- package/autorest/postprocess/__init__.py +9 -29
- package/autorest/postprocess/get_all.py +1 -3
- package/autorest/postprocess/venvtools.py +1 -3
- package/autorest/preprocess/__init__.py +40 -126
- package/install.py +2 -0
- package/package.json +1 -1
- package/prepare.py +3 -1
- package/requirements.txt +1 -1
- package/run_cadl.py +1 -3
- package/setup.py +25 -25
- package/start.py +2 -0
- package/venvtools.py +15 -10
|
@@ -19,9 +19,7 @@ class ClientSerializer:
|
|
|
19
19
|
def _init_signature(self, async_mode: bool) -> str:
|
|
20
20
|
pylint_disable = ""
|
|
21
21
|
if not self.client.parameters.credential:
|
|
22
|
-
pylint_disable =
|
|
23
|
-
" # pylint: disable=missing-client-constructor-parameter-credential"
|
|
24
|
-
)
|
|
22
|
+
pylint_disable = " # pylint: disable=missing-client-constructor-parameter-credential"
|
|
25
23
|
return self.parameter_serializer.serialize_method(
|
|
26
24
|
function_def="def",
|
|
27
25
|
method_name="__init__",
|
|
@@ -61,14 +59,10 @@ class ClientSerializer:
|
|
|
61
59
|
operations_folder = ".aio.operations." if async_mode else ".operations."
|
|
62
60
|
for og in [og for og in self.client.operation_groups if not og.is_mixin]:
|
|
63
61
|
retval.append(f":ivar {og.property_name}: {og.class_name} operations")
|
|
64
|
-
property_type =
|
|
65
|
-
f"{self.client.code_model.namespace}{operations_folder}{og.class_name}"
|
|
66
|
-
)
|
|
62
|
+
property_type = f"{self.client.code_model.namespace}{operations_folder}{og.class_name}"
|
|
67
63
|
retval.append(f":vartype {og.property_name}: {property_type}")
|
|
68
64
|
for param in self.client.parameters.method:
|
|
69
|
-
retval.append(
|
|
70
|
-
f":{param.description_keyword} {param.client_name}: {param.description}"
|
|
71
|
-
)
|
|
65
|
+
retval.append(f":{param.description_keyword} {param.client_name}: {param.description}")
|
|
72
66
|
retval.append(
|
|
73
67
|
f":{param.docstring_type_keyword} {param.client_name}: {param.docstring_type(async_mode=async_mode)}"
|
|
74
68
|
)
|
|
@@ -77,6 +71,7 @@ class ClientSerializer:
|
|
|
77
71
|
":keyword int polling_interval: Default waiting time between two polls for LRO operations "
|
|
78
72
|
"if no Retry-After header is present."
|
|
79
73
|
)
|
|
74
|
+
retval = [s.replace("\\", "\\\\") for s in retval]
|
|
80
75
|
retval.append('"""')
|
|
81
76
|
return retval
|
|
82
77
|
|
|
@@ -101,26 +96,18 @@ class ClientSerializer:
|
|
|
101
96
|
|
|
102
97
|
@property
|
|
103
98
|
def should_init_super(self) -> bool:
|
|
104
|
-
return any(
|
|
105
|
-
og
|
|
106
|
-
for og in self.client.operation_groups
|
|
107
|
-
if og.is_mixin and og.has_abstract_operations
|
|
108
|
-
)
|
|
99
|
+
return any(og for og in self.client.operation_groups if og.is_mixin and og.has_abstract_operations)
|
|
109
100
|
|
|
110
101
|
def initialize_pipeline_client(self, async_mode: bool) -> List[str]:
|
|
111
102
|
result = []
|
|
112
103
|
pipeline_client_name = self.client.pipeline_class(async_mode)
|
|
113
|
-
endpoint_name =
|
|
114
|
-
"base_url" if self.client.code_model.is_azure_flavor else "endpoint"
|
|
115
|
-
)
|
|
104
|
+
endpoint_name = "base_url" if self.client.code_model.is_azure_flavor else "endpoint"
|
|
116
105
|
params = {
|
|
117
106
|
endpoint_name: self.host_variable_name,
|
|
118
107
|
"policies": "_policies",
|
|
119
108
|
}
|
|
120
109
|
if not self.client.code_model.is_legacy and self.client.request_id_header_name:
|
|
121
|
-
result.append(
|
|
122
|
-
f'kwargs["request_id_header_name"] = "{self.client.request_id_header_name}"'
|
|
123
|
-
)
|
|
110
|
+
result.append(f'kwargs["request_id_header_name"] = "{self.client.request_id_header_name}"')
|
|
124
111
|
policies = build_policies(
|
|
125
112
|
self.client.code_model.options["azure_arm"],
|
|
126
113
|
async_mode,
|
|
@@ -151,33 +138,23 @@ class ClientSerializer:
|
|
|
151
138
|
add_private_models = len(self.client.code_model.model_types) != len(
|
|
152
139
|
self.client.code_model.public_model_types
|
|
153
140
|
)
|
|
154
|
-
model_dict_name =
|
|
155
|
-
f"_models.{self.client.code_model.models_filename}"
|
|
156
|
-
if add_private_models
|
|
157
|
-
else "_models"
|
|
158
|
-
)
|
|
141
|
+
model_dict_name = f"_models.{self.client.code_model.models_filename}" if add_private_models else "_models"
|
|
159
142
|
retval.append(
|
|
160
143
|
f"client_models{': Dict[str, Any]' if not self.client.code_model.model_types else ''}"
|
|
161
144
|
f" = {_get_client_models_value(model_dict_name)}"
|
|
162
145
|
)
|
|
163
146
|
if add_private_models and self.client.code_model.model_types:
|
|
164
|
-
update_dict = (
|
|
165
|
-
"{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}"
|
|
166
|
-
)
|
|
147
|
+
update_dict = "{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}"
|
|
167
148
|
retval.append(f"client_models.update({update_dict})")
|
|
168
149
|
client_models_str = "client_models" if is_msrest_model else ""
|
|
169
150
|
retval.append(f"self._serialize = Serializer({client_models_str})")
|
|
170
151
|
retval.append(f"self._deserialize = Deserializer({client_models_str})")
|
|
171
152
|
if not self.client.code_model.options["client_side_validation"]:
|
|
172
153
|
retval.append("self._serialize.client_side_validation = False")
|
|
173
|
-
operation_groups = [
|
|
174
|
-
og for og in self.client.operation_groups if not og.is_mixin
|
|
175
|
-
]
|
|
154
|
+
operation_groups = [og for og in self.client.operation_groups if not og.is_mixin]
|
|
176
155
|
for og in operation_groups:
|
|
177
156
|
if og.code_model.options["multiapi"]:
|
|
178
|
-
api_version =
|
|
179
|
-
f", '{og.api_versions[0]}'" if og.api_versions else ", None"
|
|
180
|
-
)
|
|
157
|
+
api_version = f", '{og.api_versions[0]}'" if og.api_versions else ", None"
|
|
181
158
|
else:
|
|
182
159
|
api_version = ""
|
|
183
160
|
retval.extend(
|
|
@@ -200,22 +177,16 @@ class ClientSerializer:
|
|
|
200
177
|
method_param_signatures=send_request_signature,
|
|
201
178
|
)
|
|
202
179
|
|
|
203
|
-
def send_request_signature_and_response_type_annotation(
|
|
204
|
-
self, async_mode: bool
|
|
205
|
-
) -> str:
|
|
180
|
+
def send_request_signature_and_response_type_annotation(self, async_mode: bool) -> str:
|
|
206
181
|
send_request_signature = self._send_request_signature()
|
|
207
182
|
return utils.method_signature_and_response_type_annotation_template(
|
|
208
183
|
method_signature=send_request_signature,
|
|
209
|
-
response_type_annotation=(
|
|
210
|
-
"Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse"
|
|
211
|
-
),
|
|
184
|
+
response_type_annotation=("Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse"),
|
|
212
185
|
)
|
|
213
186
|
|
|
214
187
|
def _example_make_call(self, async_mode: bool) -> List[str]:
|
|
215
188
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
216
|
-
retval = [
|
|
217
|
-
f">>> response = {'await ' if async_mode else ''}client.{self.client.send_request_name}(request)"
|
|
218
|
-
]
|
|
189
|
+
retval = [f">>> response = {'await ' if async_mode else ''}client.{self.client.send_request_name}(request)"]
|
|
219
190
|
retval.append(f"<{http_response}: 200 OK>")
|
|
220
191
|
return retval
|
|
221
192
|
|
|
@@ -224,36 +195,26 @@ class ClientSerializer:
|
|
|
224
195
|
"We have helper methods to create requests specific to this service in "
|
|
225
196
|
+ f"`{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}`."
|
|
226
197
|
]
|
|
227
|
-
retval.append(
|
|
228
|
-
"Use these helper methods to create the request you pass to this method."
|
|
229
|
-
)
|
|
198
|
+
retval.append("Use these helper methods to create the request you pass to this method.")
|
|
230
199
|
retval.append("")
|
|
231
200
|
|
|
232
201
|
request_builder = self.client.request_builders[0]
|
|
233
202
|
request_builder_signature = ", ".join(request_builder.parameters.call)
|
|
234
203
|
if request_builder.group_name:
|
|
235
204
|
rest_imported = request_builder.group_name
|
|
236
|
-
request_builder_name =
|
|
237
|
-
f"{request_builder.group_name}.{request_builder.name}"
|
|
238
|
-
)
|
|
205
|
+
request_builder_name = f"{request_builder.group_name}.{request_builder.name}"
|
|
239
206
|
else:
|
|
240
207
|
rest_imported = request_builder.name
|
|
241
208
|
request_builder_name = request_builder.name
|
|
242
209
|
full_path = f"{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}"
|
|
243
210
|
retval.append(f">>> from {full_path} import {rest_imported}")
|
|
244
|
-
retval.append(
|
|
245
|
-
|
|
246
|
-
)
|
|
247
|
-
retval.append(
|
|
248
|
-
f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>"
|
|
249
|
-
)
|
|
211
|
+
retval.append(f">>> request = {request_builder_name}({request_builder_signature})")
|
|
212
|
+
retval.append(f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>")
|
|
250
213
|
retval.extend(self._example_make_call(async_mode))
|
|
251
214
|
return retval
|
|
252
215
|
|
|
253
216
|
def _rest_request_example(self, async_mode: bool) -> List[str]:
|
|
254
|
-
retval = [
|
|
255
|
-
f">>> from {self.client.code_model.core_library}.rest import HttpRequest"
|
|
256
|
-
]
|
|
217
|
+
retval = [f">>> from {self.client.code_model.core_library}.rest import HttpRequest"]
|
|
257
218
|
retval.append('>>> request = HttpRequest("GET", "https://www.example.org/")')
|
|
258
219
|
retval.append("<HttpRequest [GET], url: 'https://www.example.org/'>")
|
|
259
220
|
retval.extend(self._example_make_call(async_mode))
|
|
@@ -268,27 +229,19 @@ class ClientSerializer:
|
|
|
268
229
|
else:
|
|
269
230
|
retval.extend(self._rest_request_example(async_mode))
|
|
270
231
|
retval.append("")
|
|
271
|
-
retval.append(
|
|
272
|
-
"For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request"
|
|
273
|
-
)
|
|
232
|
+
retval.append("For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request")
|
|
274
233
|
retval.append("")
|
|
275
234
|
retval.append(":param request: The network request you want to make. Required.")
|
|
276
235
|
retval.append(f":type request: ~{rest_library}.HttpRequest")
|
|
277
|
-
retval.append(
|
|
278
|
-
|
|
279
|
-
)
|
|
280
|
-
retval.append(
|
|
281
|
-
":return: The response of your network call. Does not do error handling on your response."
|
|
282
|
-
)
|
|
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.")
|
|
283
238
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
284
239
|
retval.append(f":rtype: ~{rest_library}.{http_response}")
|
|
285
240
|
retval.append('"""')
|
|
286
241
|
return retval
|
|
287
242
|
|
|
288
243
|
def serialize_path(self) -> List[str]:
|
|
289
|
-
return self.parameter_serializer.serialize_path(
|
|
290
|
-
self.client.parameters.path, "self._serialize"
|
|
291
|
-
)
|
|
244
|
+
return self.parameter_serializer.serialize_path(self.client.parameters.path, "self._serialize")
|
|
292
245
|
|
|
293
246
|
|
|
294
247
|
class ConfigSerializer:
|
|
@@ -301,9 +254,7 @@ class ConfigSerializer:
|
|
|
301
254
|
function_def="def",
|
|
302
255
|
method_name="__init__",
|
|
303
256
|
need_self_param=True,
|
|
304
|
-
method_param_signatures=self.client.config.parameters.method_signature(
|
|
305
|
-
async_mode
|
|
306
|
-
),
|
|
257
|
+
method_param_signatures=self.client.config.parameters.method_signature(async_mode),
|
|
307
258
|
)
|
|
308
259
|
|
|
309
260
|
def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
|
|
@@ -330,8 +281,7 @@ class ConfigSerializer:
|
|
|
330
281
|
|
|
331
282
|
def check_required_parameters(self) -> List[str]:
|
|
332
283
|
return [
|
|
333
|
-
f"if {p.client_name} is None:\n"
|
|
334
|
-
f" raise ValueError(\"Parameter '{p.client_name}' must not be None.\")"
|
|
284
|
+
f"if {p.client_name} is None:\n" f" raise ValueError(\"Parameter '{p.client_name}' must not be None.\")"
|
|
335
285
|
for p in self.client.config.parameters.method
|
|
336
286
|
if not (p.optional or p.constant)
|
|
337
287
|
]
|
|
@@ -340,8 +290,6 @@ class ConfigSerializer:
|
|
|
340
290
|
retval: List[str] = []
|
|
341
291
|
for p in self.client.config.parameters.method:
|
|
342
292
|
retval.append(f":{p.description_keyword} {p.client_name}: {p.description}")
|
|
343
|
-
retval.append(
|
|
344
|
-
f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}"
|
|
345
|
-
)
|
|
293
|
+
retval.append(f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}")
|
|
346
294
|
retval.append('"""')
|
|
347
295
|
return retval
|
|
@@ -12,6 +12,4 @@ class EnumSerializer(BaseSerializer):
|
|
|
12
12
|
def serialize(self) -> str:
|
|
13
13
|
# Generate the enum file
|
|
14
14
|
template = self.env.get_template("enum_container.py.jinja2")
|
|
15
|
-
return template.render(
|
|
16
|
-
code_model=self.code_model, file_import=FileImport(self.code_model)
|
|
17
|
-
)
|
|
15
|
+
return template.render(code_model=self.code_model, file_import=FileImport(self.code_model))
|
|
@@ -35,9 +35,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
35
35
|
template = self.env.get_template(template_name)
|
|
36
36
|
package_parts = (self.code_model.options["package_name"] or "").split("-")[:-1]
|
|
37
37
|
token_credential = any(
|
|
38
|
-
c
|
|
39
|
-
for c in self.code_model.clients
|
|
40
|
-
if isinstance(getattr(c.credential, "type", None), TokenCredentialType)
|
|
38
|
+
c for c in self.code_model.clients if isinstance(getattr(c.credential, "type", None), TokenCredentialType)
|
|
41
39
|
)
|
|
42
40
|
version = self.code_model.options["package_version"]
|
|
43
41
|
if any(x in version for x in ["a", "b", "rc"]) or version[0] == "0":
|
|
@@ -48,13 +46,8 @@ class GeneralSerializer(BaseSerializer):
|
|
|
48
46
|
"code_model": self.code_model,
|
|
49
47
|
"dev_status": dev_status,
|
|
50
48
|
"token_credential": token_credential,
|
|
51
|
-
"pkgutil_names": [
|
|
52
|
-
|
|
53
|
-
],
|
|
54
|
-
"init_names": [
|
|
55
|
-
"/".join(package_parts[: i + 1]) + "/__init__.py"
|
|
56
|
-
for i in range(len(package_parts))
|
|
57
|
-
],
|
|
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))],
|
|
58
51
|
"client_name": self.code_model.clients[0].name,
|
|
59
52
|
"namespace": self.code_model.namespace,
|
|
60
53
|
}
|
|
@@ -131,10 +124,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
131
124
|
"MatchConditions",
|
|
132
125
|
ImportType.SDKCORE,
|
|
133
126
|
)
|
|
134
|
-
if
|
|
135
|
-
self.code_model.has_form_data
|
|
136
|
-
and self.code_model.options["models_mode"] == "dpg"
|
|
137
|
-
):
|
|
127
|
+
if self.code_model.has_form_data and self.code_model.options["models_mode"] == "dpg" and not self.async_mode:
|
|
138
128
|
file_import.add_submodule_import("typing", "IO", ImportType.STDLIB)
|
|
139
129
|
file_import.add_submodule_import("typing", "Tuple", ImportType.STDLIB)
|
|
140
130
|
file_import.add_submodule_import("typing", "Union", ImportType.STDLIB)
|
|
@@ -190,9 +180,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
190
180
|
|
|
191
181
|
def serialize_model_base_file(self) -> str:
|
|
192
182
|
template = self.env.get_template("model_base.py.jinja2")
|
|
193
|
-
return template.render(
|
|
194
|
-
code_model=self.code_model, file_import=FileImport(self.code_model)
|
|
195
|
-
)
|
|
183
|
+
return template.render(code_model=self.code_model, file_import=FileImport(self.code_model))
|
|
196
184
|
|
|
197
185
|
def serialize_validation_file(self) -> str:
|
|
198
186
|
template = self.env.get_template("validation.py.jinja2")
|
|
@@ -213,11 +201,7 @@ class GeneralSerializer(BaseSerializer):
|
|
|
213
201
|
{
|
|
214
202
|
(
|
|
215
203
|
f"{self.code_model.namespace}.{client.name}."
|
|
216
|
-
+ (
|
|
217
|
-
""
|
|
218
|
-
if operation_group.is_mixin
|
|
219
|
-
else f"{operation_group.property_name}."
|
|
220
|
-
)
|
|
204
|
+
+ ("" if operation_group.is_mixin else f"{operation_group.property_name}.")
|
|
221
205
|
+ f"{operation.name}"
|
|
222
206
|
): operation.cross_language_definition_id
|
|
223
207
|
for client in self.code_model.clients
|
|
@@ -17,15 +17,12 @@ from ..models.imports import (
|
|
|
17
17
|
def _serialize_package(imports: List[ImportModel], delimiter: str) -> str:
|
|
18
18
|
buffer = []
|
|
19
19
|
if any(i for i in imports if i.submodule_name is None):
|
|
20
|
-
buffer.append(
|
|
21
|
-
f"import {imports[0].module_name}{f' as {imports[0].alias}' if imports[0].alias else ''}"
|
|
22
|
-
)
|
|
20
|
+
buffer.append(f"import {imports[0].module_name}{f' as {imports[0].alias}' if imports[0].alias else ''}")
|
|
23
21
|
else:
|
|
24
22
|
import_str = ", ".join(
|
|
25
23
|
sorted(
|
|
26
24
|
set(
|
|
27
|
-
f"{i.submodule_name} as {i.alias}" if i.alias else i.submodule_name # type: ignore
|
|
28
|
-
for i in imports
|
|
25
|
+
f"{i.submodule_name} as {i.alias}" if i.alias else i.submodule_name for i in imports # type: ignore
|
|
29
26
|
)
|
|
30
27
|
)
|
|
31
28
|
)
|
|
@@ -38,9 +35,7 @@ def _serialize_versioned_package(i: ImportModel, delimiter: str) -> str:
|
|
|
38
35
|
return ""
|
|
39
36
|
buffer = []
|
|
40
37
|
for n, (version, module_name, comment) in enumerate(i.version_modules):
|
|
41
|
-
buffer.append(
|
|
42
|
-
"{} sys.version_info >= {}:".format("if" if n == 0 else "elif", version)
|
|
43
|
-
)
|
|
38
|
+
buffer.append("{} sys.version_info >= {}:".format("if" if n == 0 else "elif", version))
|
|
44
39
|
buffer.append(
|
|
45
40
|
f" from {module_name} import {i.submodule_name}{f' as {i.alias}' if i.alias else ''}"
|
|
46
41
|
f"{f' # {comment}' if comment else ''}"
|
|
@@ -57,12 +52,8 @@ def _serialize_import_type(imports: List[ImportModel], delimiter: str) -> str:
|
|
|
57
52
|
"""Serialize a given import type."""
|
|
58
53
|
import_list = []
|
|
59
54
|
for module_name in sorted(set(i.module_name for i in imports)):
|
|
60
|
-
normal_imports = [
|
|
61
|
-
|
|
62
|
-
]
|
|
63
|
-
versioned_imports = [
|
|
64
|
-
i for i in imports if i.module_name == module_name and i.version_modules
|
|
65
|
-
]
|
|
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]
|
|
66
57
|
if normal_imports:
|
|
67
58
|
import_list.append(_serialize_package(normal_imports, delimiter))
|
|
68
59
|
for i in versioned_imports:
|
|
@@ -75,9 +66,7 @@ def _get_import_clauses(imports: List[ImportModel], delimiter: str) -> List[str]
|
|
|
75
66
|
for import_type in ImportType:
|
|
76
67
|
imports_with_import_type = [i for i in imports if i.import_type == import_type]
|
|
77
68
|
if imports_with_import_type:
|
|
78
|
-
import_clause.append(
|
|
79
|
-
_serialize_import_type(imports_with_import_type, delimiter)
|
|
80
|
-
)
|
|
69
|
+
import_clause.append(_serialize_import_type(imports_with_import_type, delimiter))
|
|
81
70
|
return import_clause
|
|
82
71
|
|
|
83
72
|
|
|
@@ -86,15 +75,11 @@ class FileImportSerializer:
|
|
|
86
75
|
self.file_import = file_import
|
|
87
76
|
self.async_mode = async_mode
|
|
88
77
|
|
|
89
|
-
def _get_imports_list(
|
|
90
|
-
self, baseline_typing_section: TypingSection, add_conditional_typing: bool
|
|
91
|
-
):
|
|
78
|
+
def _get_imports_list(self, baseline_typing_section: TypingSection, add_conditional_typing: bool):
|
|
92
79
|
# If this is a python 3 file, our regular imports include the CONDITIONAL category
|
|
93
80
|
# If this is not a python 3 file, our typing imports include the CONDITIONAL category
|
|
94
81
|
file_import_copy = deepcopy(self.file_import)
|
|
95
|
-
if add_conditional_typing and any(
|
|
96
|
-
self.file_import.get_imports_from_section(TypingSection.CONDITIONAL)
|
|
97
|
-
):
|
|
82
|
+
if add_conditional_typing and any(self.file_import.get_imports_from_section(TypingSection.CONDITIONAL)):
|
|
98
83
|
# we switch the TypingSection key for the CONDITIONAL typing imports so we can merge
|
|
99
84
|
# the imports together
|
|
100
85
|
for i in file_import_copy.imports:
|
|
@@ -104,20 +89,12 @@ class FileImportSerializer:
|
|
|
104
89
|
|
|
105
90
|
def _add_type_checking_import(self):
|
|
106
91
|
if any(self.file_import.get_imports_from_section(TypingSection.TYPING)):
|
|
107
|
-
self.file_import.add_submodule_import(
|
|
108
|
-
"typing", "TYPE_CHECKING", ImportType.STDLIB
|
|
109
|
-
)
|
|
92
|
+
self.file_import.add_submodule_import("typing", "TYPE_CHECKING", ImportType.STDLIB)
|
|
110
93
|
|
|
111
94
|
def get_typing_definitions(self) -> str:
|
|
112
|
-
def declare_definition(
|
|
113
|
-
type_name: str, type_definition: TypeDefinition
|
|
114
|
-
) -> List[str]:
|
|
95
|
+
def declare_definition(type_name: str, type_definition: TypeDefinition) -> List[str]:
|
|
115
96
|
ret: List[str] = []
|
|
116
|
-
definition_value =
|
|
117
|
-
type_definition.async_definition
|
|
118
|
-
if self.async_mode
|
|
119
|
-
else type_definition.sync_definition
|
|
120
|
-
)
|
|
97
|
+
definition_value = type_definition.async_definition if self.async_mode else type_definition.sync_definition
|
|
121
98
|
ret.append("{} = {}".format(type_name, definition_value))
|
|
122
99
|
return ret
|
|
123
100
|
|
|
@@ -137,9 +114,7 @@ class FileImportSerializer:
|
|
|
137
114
|
)
|
|
138
115
|
|
|
139
116
|
if regular_imports_list:
|
|
140
|
-
regular_imports = "\n\n".join(
|
|
141
|
-
_get_import_clauses(regular_imports_list, "\n")
|
|
142
|
-
)
|
|
117
|
+
regular_imports = "\n\n".join(_get_import_clauses(regular_imports_list, "\n"))
|
|
143
118
|
|
|
144
119
|
typing_imports = ""
|
|
145
120
|
typing_imports_list = self._get_imports_list(
|
|
@@ -148,7 +123,5 @@ class FileImportSerializer:
|
|
|
148
123
|
)
|
|
149
124
|
if typing_imports_list:
|
|
150
125
|
typing_imports += "\n\nif TYPE_CHECKING:\n # pylint: disable=unused-import,ungrouped-imports\n "
|
|
151
|
-
typing_imports += "\n\n ".join(
|
|
152
|
-
_get_import_clauses(typing_imports_list, "\n ")
|
|
153
|
-
)
|
|
126
|
+
typing_imports += "\n\n ".join(_get_import_clauses(typing_imports_list, "\n "))
|
|
154
127
|
return regular_imports + typing_imports + self.get_typing_definitions()
|
|
@@ -87,9 +87,7 @@ def _mixin_imports(
|
|
|
87
87
|
sync_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=False)
|
|
88
88
|
async_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=True)
|
|
89
89
|
|
|
90
|
-
return _json_serialize_imports(
|
|
91
|
-
sync_mixin_imports.to_dict()
|
|
92
|
-
), _json_serialize_imports(async_mixin_imports.to_dict())
|
|
90
|
+
return _json_serialize_imports(sync_mixin_imports.to_dict()), _json_serialize_imports(async_mixin_imports.to_dict())
|
|
93
91
|
|
|
94
92
|
|
|
95
93
|
def _mixin_typing_definitions(
|
|
@@ -100,12 +98,8 @@ def _mixin_typing_definitions(
|
|
|
100
98
|
|
|
101
99
|
sync_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=False)
|
|
102
100
|
async_mixin_imports = mixin_operation_group.imports_for_multiapi(async_mode=True)
|
|
103
|
-
sync_mixin_typing_definitions = FileImportSerializer(
|
|
104
|
-
|
|
105
|
-
).get_typing_definitions()
|
|
106
|
-
async_mixin_typing_definitions = FileImportSerializer(
|
|
107
|
-
async_mixin_imports, True
|
|
108
|
-
).get_typing_definitions()
|
|
101
|
+
sync_mixin_typing_definitions = FileImportSerializer(sync_mixin_imports, False).get_typing_definitions()
|
|
102
|
+
async_mixin_typing_definitions = FileImportSerializer(async_mixin_imports, True).get_typing_definitions()
|
|
109
103
|
|
|
110
104
|
return sync_mixin_typing_definitions, async_mixin_typing_definitions
|
|
111
105
|
|
|
@@ -127,9 +121,7 @@ class MetadataSerializer:
|
|
|
127
121
|
total_api_version_list.sort()
|
|
128
122
|
|
|
129
123
|
# switching ' to " so json can decode the dict we end up writing to file
|
|
130
|
-
total_api_version_list = [
|
|
131
|
-
str(api_version).replace("'", '"') for api_version in total_api_version_list
|
|
132
|
-
]
|
|
124
|
+
total_api_version_list = [str(api_version).replace("'", '"') for api_version in total_api_version_list]
|
|
133
125
|
if len(total_api_version_list) == 1:
|
|
134
126
|
chosen_version = total_api_version_list[0]
|
|
135
127
|
elif len(total_api_version_list) > 1:
|
|
@@ -156,9 +148,7 @@ class MetadataSerializer:
|
|
|
156
148
|
),
|
|
157
149
|
None,
|
|
158
150
|
)
|
|
159
|
-
mixin_operations =
|
|
160
|
-
mixin_operation_group.operations if mixin_operation_group else []
|
|
161
|
-
)
|
|
151
|
+
mixin_operations = mixin_operation_group.operations if mixin_operation_group else []
|
|
162
152
|
sync_mixin_imports, async_mixin_imports = _mixin_imports(mixin_operation_group)
|
|
163
153
|
(
|
|
164
154
|
sync_mixin_typing_definitions,
|
|
@@ -186,12 +176,8 @@ class MetadataSerializer:
|
|
|
186
176
|
async_mixin_imports=async_mixin_imports,
|
|
187
177
|
sync_mixin_typing_definitions=sync_mixin_typing_definitions,
|
|
188
178
|
async_mixin_typing_definitions=async_mixin_typing_definitions,
|
|
189
|
-
sync_client_imports=_json_serialize_imports(
|
|
190
|
-
|
|
191
|
-
),
|
|
192
|
-
async_client_imports=_json_serialize_imports(
|
|
193
|
-
self.client.imports_for_multiapi(async_mode=True).to_dict()
|
|
194
|
-
),
|
|
179
|
+
sync_client_imports=_json_serialize_imports(self.client.imports_for_multiapi(async_mode=False).to_dict()),
|
|
180
|
+
async_client_imports=_json_serialize_imports(self.client.imports_for_multiapi(async_mode=True).to_dict()),
|
|
195
181
|
sync_config_imports=_json_serialize_imports(
|
|
196
182
|
self.client.config.imports_for_multiapi(async_mode=False).to_dict()
|
|
197
183
|
),
|
|
@@ -15,11 +15,7 @@ class ModelInitSerializer:
|
|
|
15
15
|
def serialize(self) -> str:
|
|
16
16
|
schemas = [s.name for s in self.code_model.public_model_types]
|
|
17
17
|
schemas.sort()
|
|
18
|
-
enums =
|
|
19
|
-
[e.name for e in self.code_model.enums if not e.internal]
|
|
20
|
-
if self.code_model.enums
|
|
21
|
-
else None
|
|
22
|
-
)
|
|
18
|
+
enums = [e.name for e in self.code_model.enums if not e.internal] if self.code_model.enums else None
|
|
23
19
|
|
|
24
20
|
if enums:
|
|
25
21
|
enums.sort()
|
|
@@ -12,19 +12,12 @@ from .import_serializer import FileImportSerializer
|
|
|
12
12
|
from .base_serializer import BaseSerializer
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def _documentation_string(
|
|
16
|
-
prop: Property, description_keyword: str, docstring_type_keyword: str
|
|
17
|
-
) -> List[str]:
|
|
15
|
+
def _documentation_string(prop: Property, description_keyword: str, docstring_type_keyword: str) -> List[str]:
|
|
18
16
|
retval: List[str] = []
|
|
19
17
|
sphinx_prefix = f":{description_keyword} {prop.client_name}:"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
else sphinx_prefix
|
|
24
|
-
)
|
|
25
|
-
retval.append(
|
|
26
|
-
f":{docstring_type_keyword} {prop.client_name}: {prop.type.docstring_type()}"
|
|
27
|
-
)
|
|
18
|
+
description = prop.description(is_operation_file=False).replace("\\", "\\\\")
|
|
19
|
+
retval.append(f"{sphinx_prefix} {description}" if description else sphinx_prefix)
|
|
20
|
+
retval.append(f":{docstring_type_keyword} {prop.client_name}: {prop.type.docstring_type()}")
|
|
28
21
|
return retval
|
|
29
22
|
|
|
30
23
|
|
|
@@ -63,9 +56,7 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
63
56
|
|
|
64
57
|
@staticmethod
|
|
65
58
|
def initialize_discriminator_property(model: ModelType, prop: Property) -> str:
|
|
66
|
-
discriminator_value =
|
|
67
|
-
f"'{model.discriminator_value}'" if model.discriminator_value else None
|
|
68
|
-
)
|
|
59
|
+
discriminator_value = f"'{model.discriminator_value}'" if model.discriminator_value else None
|
|
69
60
|
if not discriminator_value:
|
|
70
61
|
typing = "Optional[str]"
|
|
71
62
|
else:
|
|
@@ -90,11 +81,7 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
90
81
|
|
|
91
82
|
@staticmethod
|
|
92
83
|
def _init_line_parameters(model: ModelType):
|
|
93
|
-
return [
|
|
94
|
-
p
|
|
95
|
-
for p in model.properties
|
|
96
|
-
if not p.readonly and not p.is_discriminator and not p.constant
|
|
97
|
-
]
|
|
84
|
+
return [p for p in model.properties if not p.readonly and not p.is_discriminator and not p.constant]
|
|
98
85
|
|
|
99
86
|
def init_line(self, model: ModelType) -> List[str]:
|
|
100
87
|
init_properties_declaration = []
|
|
@@ -112,15 +99,8 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
112
99
|
properties_to_pass_to_super = []
|
|
113
100
|
for parent in model.parents:
|
|
114
101
|
for prop in model.properties:
|
|
115
|
-
if
|
|
116
|
-
prop
|
|
117
|
-
and not prop.is_discriminator
|
|
118
|
-
and not prop.constant
|
|
119
|
-
and not prop.readonly
|
|
120
|
-
):
|
|
121
|
-
properties_to_pass_to_super.append(
|
|
122
|
-
f"{prop.client_name}={prop.client_name}"
|
|
123
|
-
)
|
|
102
|
+
if prop in parent.properties and not prop.is_discriminator and not prop.constant and not prop.readonly:
|
|
103
|
+
properties_to_pass_to_super.append(f"{prop.client_name}={prop.client_name}")
|
|
124
104
|
properties_to_pass_to_super.append("**kwargs")
|
|
125
105
|
return ", ".join(properties_to_pass_to_super)
|
|
126
106
|
|
|
@@ -179,9 +159,7 @@ class MsrestModelSerializer(_ModelSerializer):
|
|
|
179
159
|
@staticmethod
|
|
180
160
|
def declare_property(prop: Property) -> str:
|
|
181
161
|
if prop.flattened_names:
|
|
182
|
-
attribute_key = ".".join(
|
|
183
|
-
_ModelSerializer.escape_dot(n) for n in prop.flattened_names
|
|
184
|
-
)
|
|
162
|
+
attribute_key = ".".join(_ModelSerializer.escape_dot(n) for n in prop.flattened_names)
|
|
185
163
|
else:
|
|
186
164
|
attribute_key = _ModelSerializer.escape_dot(prop.wire_name)
|
|
187
165
|
if prop.type.xml_serialization_ctxt:
|
|
@@ -222,9 +200,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
222
200
|
if model.is_polymorphic:
|
|
223
201
|
file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
|
|
224
202
|
if not model.internal and self.init_line(model):
|
|
225
|
-
file_import.add_submodule_import(
|
|
226
|
-
"typing", "overload", ImportType.STDLIB
|
|
227
|
-
)
|
|
203
|
+
file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
|
|
228
204
|
file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
|
|
229
205
|
file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
|
|
230
206
|
return file_import
|
|
@@ -274,11 +250,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
274
250
|
args.append(f'format="{prop.type.encode}"') # type: ignore
|
|
275
251
|
|
|
276
252
|
field = "rest_discriminator" if prop.is_discriminator else "rest_field"
|
|
277
|
-
type_ignore = (
|
|
278
|
-
prop.is_discriminator
|
|
279
|
-
and isinstance(prop.type, (ConstantType, EnumValue))
|
|
280
|
-
and prop.type.value
|
|
281
|
-
)
|
|
253
|
+
type_ignore = prop.is_discriminator and isinstance(prop.type, (ConstantType, EnumValue)) and prop.type.value
|
|
282
254
|
return (
|
|
283
255
|
f"{prop.client_name}: {prop.type_annotation()} ="
|
|
284
256
|
f' {field}({", ".join(args)}){" # type: ignore" if type_ignore else ""}'
|
|
@@ -288,10 +260,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
288
260
|
init_args = []
|
|
289
261
|
for prop in self.get_properties_to_declare(model):
|
|
290
262
|
if prop.constant and not prop.is_base_discriminator:
|
|
291
|
-
init_args.append(
|
|
292
|
-
f"self.{prop.client_name}: {prop.type_annotation()} = "
|
|
293
|
-
f"{prop.get_declaration()}"
|
|
294
|
-
)
|
|
263
|
+
init_args.append(f"self.{prop.client_name}: {prop.type_annotation()} = " f"{prop.get_declaration()}")
|
|
295
264
|
return init_args
|
|
296
265
|
|
|
297
266
|
@staticmethod
|
|
@@ -299,10 +268,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
299
268
|
return [
|
|
300
269
|
p
|
|
301
270
|
for p in model.properties
|
|
302
|
-
if p.is_base_discriminator
|
|
303
|
-
or not p.is_discriminator
|
|
304
|
-
and not p.constant
|
|
305
|
-
and p.visibility != ["read"]
|
|
271
|
+
if p.is_base_discriminator or not p.is_discriminator and not p.constant and p.visibility != ["read"]
|
|
306
272
|
]
|
|
307
273
|
|
|
308
274
|
@staticmethod
|
|
@@ -311,18 +277,11 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
311
277
|
for parent in model.parents:
|
|
312
278
|
for prop in model.properties:
|
|
313
279
|
if (
|
|
314
|
-
prop.client_name
|
|
315
|
-
in [
|
|
316
|
-
prop.client_name
|
|
317
|
-
for prop in parent.properties
|
|
318
|
-
if prop.is_base_discriminator
|
|
319
|
-
]
|
|
280
|
+
prop.client_name in [prop.client_name for prop in parent.properties if prop.is_base_discriminator]
|
|
320
281
|
and prop.is_discriminator
|
|
321
282
|
and not prop.constant
|
|
322
283
|
and not prop.readonly
|
|
323
284
|
):
|
|
324
|
-
properties_to_pass_to_super.append(
|
|
325
|
-
f"{prop.client_name}={prop.get_declaration()}"
|
|
326
|
-
)
|
|
285
|
+
properties_to_pass_to_super.append(f"{prop.client_name}={prop.get_declaration()}")
|
|
327
286
|
properties_to_pass_to_super.append("**kwargs")
|
|
328
287
|
return ", ".join(properties_to_pass_to_super)
|
|
@@ -66,9 +66,7 @@ class OperationGroupsSerializer(BaseSerializer):
|
|
|
66
66
|
)
|
|
67
67
|
)
|
|
68
68
|
|
|
69
|
-
template = self.env.get_or_select_template(
|
|
70
|
-
"operation_groups_container.py.jinja2"
|
|
71
|
-
)
|
|
69
|
+
template = self.env.get_or_select_template("operation_groups_container.py.jinja2")
|
|
72
70
|
|
|
73
71
|
return template.render(
|
|
74
72
|
code_model=self.code_model,
|