@autorest/python 6.13.16 → 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 +25 -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 +13 -51
- 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/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
|
)
|
|
@@ -102,26 +96,18 @@ class ClientSerializer:
|
|
|
102
96
|
|
|
103
97
|
@property
|
|
104
98
|
def should_init_super(self) -> bool:
|
|
105
|
-
return any(
|
|
106
|
-
og
|
|
107
|
-
for og in self.client.operation_groups
|
|
108
|
-
if og.is_mixin and og.has_abstract_operations
|
|
109
|
-
)
|
|
99
|
+
return any(og for og in self.client.operation_groups if og.is_mixin and og.has_abstract_operations)
|
|
110
100
|
|
|
111
101
|
def initialize_pipeline_client(self, async_mode: bool) -> List[str]:
|
|
112
102
|
result = []
|
|
113
103
|
pipeline_client_name = self.client.pipeline_class(async_mode)
|
|
114
|
-
endpoint_name =
|
|
115
|
-
"base_url" if self.client.code_model.is_azure_flavor else "endpoint"
|
|
116
|
-
)
|
|
104
|
+
endpoint_name = "base_url" if self.client.code_model.is_azure_flavor else "endpoint"
|
|
117
105
|
params = {
|
|
118
106
|
endpoint_name: self.host_variable_name,
|
|
119
107
|
"policies": "_policies",
|
|
120
108
|
}
|
|
121
109
|
if not self.client.code_model.is_legacy and self.client.request_id_header_name:
|
|
122
|
-
result.append(
|
|
123
|
-
f'kwargs["request_id_header_name"] = "{self.client.request_id_header_name}"'
|
|
124
|
-
)
|
|
110
|
+
result.append(f'kwargs["request_id_header_name"] = "{self.client.request_id_header_name}"')
|
|
125
111
|
policies = build_policies(
|
|
126
112
|
self.client.code_model.options["azure_arm"],
|
|
127
113
|
async_mode,
|
|
@@ -152,33 +138,23 @@ class ClientSerializer:
|
|
|
152
138
|
add_private_models = len(self.client.code_model.model_types) != len(
|
|
153
139
|
self.client.code_model.public_model_types
|
|
154
140
|
)
|
|
155
|
-
model_dict_name =
|
|
156
|
-
f"_models.{self.client.code_model.models_filename}"
|
|
157
|
-
if add_private_models
|
|
158
|
-
else "_models"
|
|
159
|
-
)
|
|
141
|
+
model_dict_name = f"_models.{self.client.code_model.models_filename}" if add_private_models else "_models"
|
|
160
142
|
retval.append(
|
|
161
143
|
f"client_models{': Dict[str, Any]' if not self.client.code_model.model_types else ''}"
|
|
162
144
|
f" = {_get_client_models_value(model_dict_name)}"
|
|
163
145
|
)
|
|
164
146
|
if add_private_models and self.client.code_model.model_types:
|
|
165
|
-
update_dict = (
|
|
166
|
-
"{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}"
|
|
167
|
-
)
|
|
147
|
+
update_dict = "{k: v for k, v in _models.__dict__.items() if isinstance(v, type)}"
|
|
168
148
|
retval.append(f"client_models.update({update_dict})")
|
|
169
149
|
client_models_str = "client_models" if is_msrest_model else ""
|
|
170
150
|
retval.append(f"self._serialize = Serializer({client_models_str})")
|
|
171
151
|
retval.append(f"self._deserialize = Deserializer({client_models_str})")
|
|
172
152
|
if not self.client.code_model.options["client_side_validation"]:
|
|
173
153
|
retval.append("self._serialize.client_side_validation = False")
|
|
174
|
-
operation_groups = [
|
|
175
|
-
og for og in self.client.operation_groups if not og.is_mixin
|
|
176
|
-
]
|
|
154
|
+
operation_groups = [og for og in self.client.operation_groups if not og.is_mixin]
|
|
177
155
|
for og in operation_groups:
|
|
178
156
|
if og.code_model.options["multiapi"]:
|
|
179
|
-
api_version =
|
|
180
|
-
f", '{og.api_versions[0]}'" if og.api_versions else ", None"
|
|
181
|
-
)
|
|
157
|
+
api_version = f", '{og.api_versions[0]}'" if og.api_versions else ", None"
|
|
182
158
|
else:
|
|
183
159
|
api_version = ""
|
|
184
160
|
retval.extend(
|
|
@@ -201,22 +177,16 @@ class ClientSerializer:
|
|
|
201
177
|
method_param_signatures=send_request_signature,
|
|
202
178
|
)
|
|
203
179
|
|
|
204
|
-
def send_request_signature_and_response_type_annotation(
|
|
205
|
-
self, async_mode: bool
|
|
206
|
-
) -> str:
|
|
180
|
+
def send_request_signature_and_response_type_annotation(self, async_mode: bool) -> str:
|
|
207
181
|
send_request_signature = self._send_request_signature()
|
|
208
182
|
return utils.method_signature_and_response_type_annotation_template(
|
|
209
183
|
method_signature=send_request_signature,
|
|
210
|
-
response_type_annotation=(
|
|
211
|
-
"Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse"
|
|
212
|
-
),
|
|
184
|
+
response_type_annotation=("Awaitable[AsyncHttpResponse]" if async_mode else "HttpResponse"),
|
|
213
185
|
)
|
|
214
186
|
|
|
215
187
|
def _example_make_call(self, async_mode: bool) -> List[str]:
|
|
216
188
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
217
|
-
retval = [
|
|
218
|
-
f">>> response = {'await ' if async_mode else ''}client.{self.client.send_request_name}(request)"
|
|
219
|
-
]
|
|
189
|
+
retval = [f">>> response = {'await ' if async_mode else ''}client.{self.client.send_request_name}(request)"]
|
|
220
190
|
retval.append(f"<{http_response}: 200 OK>")
|
|
221
191
|
return retval
|
|
222
192
|
|
|
@@ -225,36 +195,26 @@ class ClientSerializer:
|
|
|
225
195
|
"We have helper methods to create requests specific to this service in "
|
|
226
196
|
+ f"`{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}`."
|
|
227
197
|
]
|
|
228
|
-
retval.append(
|
|
229
|
-
"Use these helper methods to create the request you pass to this method."
|
|
230
|
-
)
|
|
198
|
+
retval.append("Use these helper methods to create the request you pass to this method.")
|
|
231
199
|
retval.append("")
|
|
232
200
|
|
|
233
201
|
request_builder = self.client.request_builders[0]
|
|
234
202
|
request_builder_signature = ", ".join(request_builder.parameters.call)
|
|
235
203
|
if request_builder.group_name:
|
|
236
204
|
rest_imported = request_builder.group_name
|
|
237
|
-
request_builder_name =
|
|
238
|
-
f"{request_builder.group_name}.{request_builder.name}"
|
|
239
|
-
)
|
|
205
|
+
request_builder_name = f"{request_builder.group_name}.{request_builder.name}"
|
|
240
206
|
else:
|
|
241
207
|
rest_imported = request_builder.name
|
|
242
208
|
request_builder_name = request_builder.name
|
|
243
209
|
full_path = f"{self.client.code_model.namespace}.{self.client.code_model.rest_layer_name}"
|
|
244
210
|
retval.append(f">>> from {full_path} import {rest_imported}")
|
|
245
|
-
retval.append(
|
|
246
|
-
|
|
247
|
-
)
|
|
248
|
-
retval.append(
|
|
249
|
-
f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>"
|
|
250
|
-
)
|
|
211
|
+
retval.append(f">>> request = {request_builder_name}({request_builder_signature})")
|
|
212
|
+
retval.append(f"<HttpRequest [{request_builder.method}], url: '{request_builder.url}'>")
|
|
251
213
|
retval.extend(self._example_make_call(async_mode))
|
|
252
214
|
return retval
|
|
253
215
|
|
|
254
216
|
def _rest_request_example(self, async_mode: bool) -> List[str]:
|
|
255
|
-
retval = [
|
|
256
|
-
f">>> from {self.client.code_model.core_library}.rest import HttpRequest"
|
|
257
|
-
]
|
|
217
|
+
retval = [f">>> from {self.client.code_model.core_library}.rest import HttpRequest"]
|
|
258
218
|
retval.append('>>> request = HttpRequest("GET", "https://www.example.org/")')
|
|
259
219
|
retval.append("<HttpRequest [GET], url: 'https://www.example.org/'>")
|
|
260
220
|
retval.extend(self._example_make_call(async_mode))
|
|
@@ -269,27 +229,19 @@ class ClientSerializer:
|
|
|
269
229
|
else:
|
|
270
230
|
retval.extend(self._rest_request_example(async_mode))
|
|
271
231
|
retval.append("")
|
|
272
|
-
retval.append(
|
|
273
|
-
"For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request"
|
|
274
|
-
)
|
|
232
|
+
retval.append("For more information on this code flow, see https://aka.ms/azsdk/dpcodegen/python/send_request")
|
|
275
233
|
retval.append("")
|
|
276
234
|
retval.append(":param request: The network request you want to make. Required.")
|
|
277
235
|
retval.append(f":type request: ~{rest_library}.HttpRequest")
|
|
278
|
-
retval.append(
|
|
279
|
-
|
|
280
|
-
)
|
|
281
|
-
retval.append(
|
|
282
|
-
":return: The response of your network call. Does not do error handling on your response."
|
|
283
|
-
)
|
|
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.")
|
|
284
238
|
http_response = "AsyncHttpResponse" if async_mode else "HttpResponse"
|
|
285
239
|
retval.append(f":rtype: ~{rest_library}.{http_response}")
|
|
286
240
|
retval.append('"""')
|
|
287
241
|
return retval
|
|
288
242
|
|
|
289
243
|
def serialize_path(self) -> List[str]:
|
|
290
|
-
return self.parameter_serializer.serialize_path(
|
|
291
|
-
self.client.parameters.path, "self._serialize"
|
|
292
|
-
)
|
|
244
|
+
return self.parameter_serializer.serialize_path(self.client.parameters.path, "self._serialize")
|
|
293
245
|
|
|
294
246
|
|
|
295
247
|
class ConfigSerializer:
|
|
@@ -302,9 +254,7 @@ class ConfigSerializer:
|
|
|
302
254
|
function_def="def",
|
|
303
255
|
method_name="__init__",
|
|
304
256
|
need_self_param=True,
|
|
305
|
-
method_param_signatures=self.client.config.parameters.method_signature(
|
|
306
|
-
async_mode
|
|
307
|
-
),
|
|
257
|
+
method_param_signatures=self.client.config.parameters.method_signature(async_mode),
|
|
308
258
|
)
|
|
309
259
|
|
|
310
260
|
def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
|
|
@@ -331,8 +281,7 @@ class ConfigSerializer:
|
|
|
331
281
|
|
|
332
282
|
def check_required_parameters(self) -> List[str]:
|
|
333
283
|
return [
|
|
334
|
-
f"if {p.client_name} is None:\n"
|
|
335
|
-
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.\")"
|
|
336
285
|
for p in self.client.config.parameters.method
|
|
337
286
|
if not (p.optional or p.constant)
|
|
338
287
|
]
|
|
@@ -341,8 +290,6 @@ class ConfigSerializer:
|
|
|
341
290
|
retval: List[str] = []
|
|
342
291
|
for p in self.client.config.parameters.method:
|
|
343
292
|
retval.append(f":{p.description_keyword} {p.client_name}: {p.description}")
|
|
344
|
-
retval.append(
|
|
345
|
-
f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}"
|
|
346
|
-
)
|
|
293
|
+
retval.append(f":{p.docstring_type_keyword} {p.client_name}: {p.docstring_type(async_mode=async_mode)}")
|
|
347
294
|
retval.append('"""')
|
|
348
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,16 +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
18
|
description = prop.description(is_operation_file=False).replace("\\", "\\\\")
|
|
21
19
|
retval.append(f"{sphinx_prefix} {description}" if description else sphinx_prefix)
|
|
22
|
-
retval.append(
|
|
23
|
-
f":{docstring_type_keyword} {prop.client_name}: {prop.type.docstring_type()}"
|
|
24
|
-
)
|
|
20
|
+
retval.append(f":{docstring_type_keyword} {prop.client_name}: {prop.type.docstring_type()}")
|
|
25
21
|
return retval
|
|
26
22
|
|
|
27
23
|
|
|
@@ -60,9 +56,7 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
60
56
|
|
|
61
57
|
@staticmethod
|
|
62
58
|
def initialize_discriminator_property(model: ModelType, prop: Property) -> str:
|
|
63
|
-
discriminator_value =
|
|
64
|
-
f"'{model.discriminator_value}'" if model.discriminator_value else None
|
|
65
|
-
)
|
|
59
|
+
discriminator_value = f"'{model.discriminator_value}'" if model.discriminator_value else None
|
|
66
60
|
if not discriminator_value:
|
|
67
61
|
typing = "Optional[str]"
|
|
68
62
|
else:
|
|
@@ -87,11 +81,7 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
87
81
|
|
|
88
82
|
@staticmethod
|
|
89
83
|
def _init_line_parameters(model: ModelType):
|
|
90
|
-
return [
|
|
91
|
-
p
|
|
92
|
-
for p in model.properties
|
|
93
|
-
if not p.readonly and not p.is_discriminator and not p.constant
|
|
94
|
-
]
|
|
84
|
+
return [p for p in model.properties if not p.readonly and not p.is_discriminator and not p.constant]
|
|
95
85
|
|
|
96
86
|
def init_line(self, model: ModelType) -> List[str]:
|
|
97
87
|
init_properties_declaration = []
|
|
@@ -109,15 +99,8 @@ class _ModelSerializer(BaseSerializer, ABC):
|
|
|
109
99
|
properties_to_pass_to_super = []
|
|
110
100
|
for parent in model.parents:
|
|
111
101
|
for prop in model.properties:
|
|
112
|
-
if
|
|
113
|
-
prop
|
|
114
|
-
and not prop.is_discriminator
|
|
115
|
-
and not prop.constant
|
|
116
|
-
and not prop.readonly
|
|
117
|
-
):
|
|
118
|
-
properties_to_pass_to_super.append(
|
|
119
|
-
f"{prop.client_name}={prop.client_name}"
|
|
120
|
-
)
|
|
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}")
|
|
121
104
|
properties_to_pass_to_super.append("**kwargs")
|
|
122
105
|
return ", ".join(properties_to_pass_to_super)
|
|
123
106
|
|
|
@@ -176,9 +159,7 @@ class MsrestModelSerializer(_ModelSerializer):
|
|
|
176
159
|
@staticmethod
|
|
177
160
|
def declare_property(prop: Property) -> str:
|
|
178
161
|
if prop.flattened_names:
|
|
179
|
-
attribute_key = ".".join(
|
|
180
|
-
_ModelSerializer.escape_dot(n) for n in prop.flattened_names
|
|
181
|
-
)
|
|
162
|
+
attribute_key = ".".join(_ModelSerializer.escape_dot(n) for n in prop.flattened_names)
|
|
182
163
|
else:
|
|
183
164
|
attribute_key = _ModelSerializer.escape_dot(prop.wire_name)
|
|
184
165
|
if prop.type.xml_serialization_ctxt:
|
|
@@ -219,9 +200,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
219
200
|
if model.is_polymorphic:
|
|
220
201
|
file_import.add_submodule_import("typing", "Dict", ImportType.STDLIB)
|
|
221
202
|
if not model.internal and self.init_line(model):
|
|
222
|
-
file_import.add_submodule_import(
|
|
223
|
-
"typing", "overload", ImportType.STDLIB
|
|
224
|
-
)
|
|
203
|
+
file_import.add_submodule_import("typing", "overload", ImportType.STDLIB)
|
|
225
204
|
file_import.add_submodule_import("typing", "Mapping", ImportType.STDLIB)
|
|
226
205
|
file_import.add_submodule_import("typing", "Any", ImportType.STDLIB)
|
|
227
206
|
return file_import
|
|
@@ -271,11 +250,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
271
250
|
args.append(f'format="{prop.type.encode}"') # type: ignore
|
|
272
251
|
|
|
273
252
|
field = "rest_discriminator" if prop.is_discriminator else "rest_field"
|
|
274
|
-
type_ignore = (
|
|
275
|
-
prop.is_discriminator
|
|
276
|
-
and isinstance(prop.type, (ConstantType, EnumValue))
|
|
277
|
-
and prop.type.value
|
|
278
|
-
)
|
|
253
|
+
type_ignore = prop.is_discriminator and isinstance(prop.type, (ConstantType, EnumValue)) and prop.type.value
|
|
279
254
|
return (
|
|
280
255
|
f"{prop.client_name}: {prop.type_annotation()} ="
|
|
281
256
|
f' {field}({", ".join(args)}){" # type: ignore" if type_ignore else ""}'
|
|
@@ -285,10 +260,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
285
260
|
init_args = []
|
|
286
261
|
for prop in self.get_properties_to_declare(model):
|
|
287
262
|
if prop.constant and not prop.is_base_discriminator:
|
|
288
|
-
init_args.append(
|
|
289
|
-
f"self.{prop.client_name}: {prop.type_annotation()} = "
|
|
290
|
-
f"{prop.get_declaration()}"
|
|
291
|
-
)
|
|
263
|
+
init_args.append(f"self.{prop.client_name}: {prop.type_annotation()} = " f"{prop.get_declaration()}")
|
|
292
264
|
return init_args
|
|
293
265
|
|
|
294
266
|
@staticmethod
|
|
@@ -296,10 +268,7 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
296
268
|
return [
|
|
297
269
|
p
|
|
298
270
|
for p in model.properties
|
|
299
|
-
if p.is_base_discriminator
|
|
300
|
-
or not p.is_discriminator
|
|
301
|
-
and not p.constant
|
|
302
|
-
and p.visibility != ["read"]
|
|
271
|
+
if p.is_base_discriminator or not p.is_discriminator and not p.constant and p.visibility != ["read"]
|
|
303
272
|
]
|
|
304
273
|
|
|
305
274
|
@staticmethod
|
|
@@ -308,18 +277,11 @@ class DpgModelSerializer(_ModelSerializer):
|
|
|
308
277
|
for parent in model.parents:
|
|
309
278
|
for prop in model.properties:
|
|
310
279
|
if (
|
|
311
|
-
prop.client_name
|
|
312
|
-
in [
|
|
313
|
-
prop.client_name
|
|
314
|
-
for prop in parent.properties
|
|
315
|
-
if prop.is_base_discriminator
|
|
316
|
-
]
|
|
280
|
+
prop.client_name in [prop.client_name for prop in parent.properties if prop.is_base_discriminator]
|
|
317
281
|
and prop.is_discriminator
|
|
318
282
|
and not prop.constant
|
|
319
283
|
and not prop.readonly
|
|
320
284
|
):
|
|
321
|
-
properties_to_pass_to_super.append(
|
|
322
|
-
f"{prop.client_name}={prop.get_declaration()}"
|
|
323
|
-
)
|
|
285
|
+
properties_to_pass_to_super.append(f"{prop.client_name}={prop.get_declaration()}")
|
|
324
286
|
properties_to_pass_to_super.append("**kwargs")
|
|
325
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,
|