@autorest/python 5.19.0 → 6.0.1
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/ChangeLog.md +61 -2
- package/README.md +9 -0
- package/autorest/__init__.py +54 -13
- package/autorest/black/__init__.py +14 -8
- package/autorest/codegen/__init__.py +126 -89
- package/autorest/codegen/models/base_builder.py +17 -6
- package/autorest/codegen/models/client.py +1 -1
- package/autorest/codegen/models/code_model.py +7 -12
- package/autorest/codegen/models/lro_operation.py +2 -6
- package/autorest/codegen/models/lro_paging_operation.py +3 -9
- package/autorest/codegen/models/model_type.py +1 -6
- package/autorest/codegen/models/operation.py +6 -37
- package/autorest/codegen/models/operation_group.py +4 -7
- package/autorest/codegen/models/paging_operation.py +17 -7
- package/autorest/codegen/models/parameter.py +3 -7
- package/autorest/codegen/models/parameter_list.py +20 -36
- package/autorest/codegen/models/request_builder.py +0 -22
- package/autorest/codegen/serializers/__init__.py +46 -98
- package/autorest/codegen/serializers/builder_serializer.py +53 -36
- package/autorest/codegen/serializers/client_serializer.py +20 -31
- package/autorest/codegen/serializers/general_serializer.py +2 -7
- package/autorest/codegen/serializers/import_serializer.py +11 -22
- package/autorest/codegen/serializers/metadata_serializer.py +0 -2
- package/autorest/codegen/serializers/{model_base_serializer.py → model_serializer.py} +47 -38
- package/autorest/codegen/serializers/operation_groups_serializer.py +0 -7
- package/autorest/codegen/serializers/operations_init_serializer.py +2 -23
- package/autorest/codegen/serializers/patch_serializer.py +1 -3
- package/autorest/codegen/serializers/request_builders_serializer.py +1 -4
- package/autorest/codegen/serializers/utils.py +1 -4
- package/autorest/codegen/templates/client.py.jinja2 +3 -3
- package/autorest/codegen/templates/config.py.jinja2 +2 -2
- package/autorest/codegen/templates/metadata.json.jinja2 +4 -4
- package/autorest/codegen/templates/model_init.py.jinja2 +5 -12
- package/autorest/codegen/templates/operation_group.py.jinja2 +1 -1
- package/autorest/codegen/templates/operation_groups_container.py.jinja2 +0 -6
- package/autorest/codegen/templates/patch.py.jinja2 +1 -2
- package/autorest/codegen/templates/request_builders.py.jinja2 +0 -3
- package/autorest/codegen/templates/rest_init.py.jinja2 +3 -8
- package/autorest/codegen/templates/serialization.py.jinja2 +3 -3
- package/autorest/codegen/templates/setup.py.jinja2 +1 -1
- package/autorest/jsonrpc/server.py +7 -7
- package/autorest/m2r/__init__.py +7 -2
- package/autorest/m4reformatter/__init__.py +13 -5
- package/autorest/multiapi/__init__.py +56 -29
- package/autorest/multiapi/serializers/__init__.py +26 -31
- package/autorest/multiapi/serializers/import_serializer.py +4 -8
- package/autorest/multiapi/serializers/multiapi_serializer.py +33 -26
- package/autorest/postprocess/__init__.py +14 -11
- package/autorest/preprocess/__init__.py +36 -7
- package/package.json +2 -2
- package/autorest/codegen/serializers/model_generic_serializer.py +0 -32
- package/autorest/codegen/serializers/model_python3_serializer.py +0 -72
|
@@ -9,14 +9,14 @@ from jinja2 import PackageLoader, Environment, FileSystemLoader, StrictUndefined
|
|
|
9
9
|
from autorest.codegen.models.operation_group import OperationGroup
|
|
10
10
|
from autorest.codegen.models.request_builder import OverloadedRequestBuilder
|
|
11
11
|
|
|
12
|
+
from ... import ReaderAndWriter, ReaderAndWriterAutorest
|
|
12
13
|
from ...jsonrpc import AutorestAPI
|
|
13
14
|
from ..models import CodeModel, OperationGroup, RequestBuilder
|
|
14
15
|
from ..models import TokenCredentialType
|
|
15
16
|
from .enum_serializer import EnumSerializer
|
|
16
17
|
from .general_serializer import GeneralSerializer
|
|
17
|
-
from .model_generic_serializer import ModelGenericSerializer
|
|
18
18
|
from .model_init_serializer import ModelInitSerializer
|
|
19
|
-
from .
|
|
19
|
+
from .model_serializer import ModelSerializer
|
|
20
20
|
from .operations_init_serializer import OperationsInitSerializer
|
|
21
21
|
from .operation_groups_serializer import OperationGroupsSerializer
|
|
22
22
|
from .metadata_serializer import MetadataSerializer
|
|
@@ -39,9 +39,9 @@ _PACKAGE_FILES = [
|
|
|
39
39
|
_REGENERATE_FILES = {"setup.py", "MANIFEST.in"}
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
class JinjaSerializer:
|
|
43
|
-
def __init__(self,
|
|
44
|
-
|
|
42
|
+
class JinjaSerializer(ReaderAndWriter): # pylint: disable=abstract-method
|
|
43
|
+
def __init__(self, code_model: CodeModel, **kwargs: Any) -> None:
|
|
44
|
+
super().__init__(**kwargs)
|
|
45
45
|
self.code_model = code_model
|
|
46
46
|
|
|
47
47
|
@property
|
|
@@ -130,10 +130,10 @@ class JinjaSerializer:
|
|
|
130
130
|
)
|
|
131
131
|
if not self.code_model.options["models_mode"]:
|
|
132
132
|
# keep models file if users ended up just writing a models file
|
|
133
|
-
if self.
|
|
134
|
-
self.
|
|
133
|
+
if self.read_file(namespace_path / Path("models.py")):
|
|
134
|
+
self.write_file(
|
|
135
135
|
namespace_path / Path("models.py"),
|
|
136
|
-
self.
|
|
136
|
+
self.read_file(namespace_path / Path("models.py")),
|
|
137
137
|
)
|
|
138
138
|
|
|
139
139
|
if self.code_model.options["package_mode"]:
|
|
@@ -144,13 +144,10 @@ class JinjaSerializer:
|
|
|
144
144
|
for template_name in package_files:
|
|
145
145
|
file = template_name.replace(".jinja2", "")
|
|
146
146
|
output_name = out_path / file
|
|
147
|
-
if (
|
|
148
|
-
not self._autorestapi.read_file(output_name)
|
|
149
|
-
or file in _REGENERATE_FILES
|
|
150
|
-
):
|
|
147
|
+
if not self.read_file(output_name) or file in _REGENERATE_FILES:
|
|
151
148
|
template = env.get_template(template_name)
|
|
152
149
|
render_result = template.render(**kwargs)
|
|
153
|
-
self.
|
|
150
|
+
self.write_file(output_name, render_result)
|
|
154
151
|
|
|
155
152
|
def _prepare_params() -> Dict[Any, Any]:
|
|
156
153
|
package_parts = package_name.split("-")[:-1]
|
|
@@ -208,12 +205,10 @@ class JinjaSerializer:
|
|
|
208
205
|
_serialize_and_write_package_files_proc(**params)
|
|
209
206
|
|
|
210
207
|
def _keep_patch_file(self, path_file: Path, env: Environment):
|
|
211
|
-
if self.
|
|
212
|
-
self.
|
|
213
|
-
path_file, self._autorestapi.read_file(path_file)
|
|
214
|
-
)
|
|
208
|
+
if self.read_file(path_file):
|
|
209
|
+
self.write_file(path_file, self.read_file(path_file))
|
|
215
210
|
else:
|
|
216
|
-
self.
|
|
211
|
+
self.write_file(
|
|
217
212
|
path_file,
|
|
218
213
|
PatchSerializer(env=env, code_model=self.code_model).serialize(),
|
|
219
214
|
)
|
|
@@ -224,29 +219,16 @@ class JinjaSerializer:
|
|
|
224
219
|
# Write the models folder
|
|
225
220
|
models_path = namespace_path / Path("models")
|
|
226
221
|
if self.code_model.model_types:
|
|
227
|
-
|
|
228
|
-
self.
|
|
229
|
-
|
|
230
|
-
/ Path(
|
|
231
|
-
f"{self.code_model.get_models_filename(is_python3_file=False)}.py"
|
|
232
|
-
),
|
|
233
|
-
ModelGenericSerializer(
|
|
234
|
-
code_model=self.code_model, env=env
|
|
235
|
-
).serialize(),
|
|
236
|
-
)
|
|
237
|
-
self._autorestapi.write_file(
|
|
238
|
-
models_path
|
|
239
|
-
/ Path(
|
|
240
|
-
f"{self.code_model.get_models_filename(is_python3_file=True)}.py"
|
|
241
|
-
),
|
|
242
|
-
ModelPython3Serializer(code_model=self.code_model, env=env).serialize(),
|
|
222
|
+
self.write_file(
|
|
223
|
+
models_path / Path(f"{self.code_model.models_filename}.py"),
|
|
224
|
+
ModelSerializer(code_model=self.code_model, env=env).serialize(),
|
|
243
225
|
)
|
|
244
226
|
if self.code_model.enums:
|
|
245
|
-
self.
|
|
227
|
+
self.write_file(
|
|
246
228
|
models_path / Path(f"{self.code_model.enums_filename}.py"),
|
|
247
229
|
EnumSerializer(code_model=self.code_model, env=env).serialize(),
|
|
248
230
|
)
|
|
249
|
-
self.
|
|
231
|
+
self.write_file(
|
|
250
232
|
models_path / Path("__init__.py"),
|
|
251
233
|
ModelInitSerializer(code_model=self.code_model, env=env).serialize(),
|
|
252
234
|
)
|
|
@@ -267,7 +249,7 @@ class JinjaSerializer:
|
|
|
267
249
|
env, rest_path, request_builders
|
|
268
250
|
)
|
|
269
251
|
if not "" in group_names:
|
|
270
|
-
self.
|
|
252
|
+
self.write_file(
|
|
271
253
|
rest_path / Path("__init__.py"),
|
|
272
254
|
self.code_model.options["license_header"],
|
|
273
255
|
)
|
|
@@ -281,35 +263,22 @@ class JinjaSerializer:
|
|
|
281
263
|
group_name = request_builders[0].group_name
|
|
282
264
|
output_path = rest_path / Path(group_name) if group_name else rest_path
|
|
283
265
|
# write generic request builders file
|
|
284
|
-
self.
|
|
266
|
+
self.write_file(
|
|
285
267
|
output_path / Path("_request_builders.py"),
|
|
286
268
|
RequestBuildersSerializer(
|
|
287
269
|
code_model=self.code_model,
|
|
288
270
|
env=env,
|
|
289
271
|
request_builders=request_builders,
|
|
290
|
-
is_python3_file=False,
|
|
291
|
-
).serialize_request_builders(),
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
# write python3 request builders file
|
|
295
|
-
self._autorestapi.write_file(
|
|
296
|
-
output_path / Path("_request_builders_py3.py"),
|
|
297
|
-
RequestBuildersSerializer(
|
|
298
|
-
code_model=self.code_model,
|
|
299
|
-
env=env,
|
|
300
|
-
request_builders=request_builders,
|
|
301
|
-
is_python3_file=True,
|
|
302
272
|
).serialize_request_builders(),
|
|
303
273
|
)
|
|
304
274
|
|
|
305
275
|
# write rest init file
|
|
306
|
-
self.
|
|
276
|
+
self.write_file(
|
|
307
277
|
output_path / Path("__init__.py"),
|
|
308
278
|
RequestBuildersSerializer(
|
|
309
279
|
code_model=self.code_model,
|
|
310
280
|
env=env,
|
|
311
281
|
request_builders=request_builders,
|
|
312
|
-
is_python3_file=True,
|
|
313
282
|
).serialize_init(),
|
|
314
283
|
)
|
|
315
284
|
|
|
@@ -325,44 +294,24 @@ class JinjaSerializer:
|
|
|
325
294
|
code_model=self.code_model,
|
|
326
295
|
env=env,
|
|
327
296
|
async_mode=False,
|
|
328
|
-
is_python3_file=self.code_model.options["python3_only"],
|
|
329
297
|
operation_group=operation_group,
|
|
330
298
|
)
|
|
331
|
-
self.
|
|
299
|
+
self.write_file(
|
|
332
300
|
namespace_path
|
|
333
301
|
/ Path(self.code_model.operations_folder_name)
|
|
334
302
|
/ Path(f"{filename}.py"),
|
|
335
303
|
operation_group_serializer.serialize(),
|
|
336
304
|
)
|
|
337
305
|
|
|
338
|
-
if (
|
|
339
|
-
not self.code_model.options["python3_only"]
|
|
340
|
-
and self.code_model.options["add_python3_operation_files"]
|
|
341
|
-
):
|
|
342
|
-
# write typed second file if not python 3 only
|
|
343
|
-
operation_group_serializer = OperationGroupsSerializer(
|
|
344
|
-
code_model=self.code_model,
|
|
345
|
-
env=env,
|
|
346
|
-
async_mode=False,
|
|
347
|
-
is_python3_file=True,
|
|
348
|
-
)
|
|
349
|
-
self._autorestapi.write_file(
|
|
350
|
-
namespace_path
|
|
351
|
-
/ Path(self.code_model.operations_folder_name)
|
|
352
|
-
/ Path(f"{filename}_py3.py"),
|
|
353
|
-
operation_group_serializer.serialize(),
|
|
354
|
-
)
|
|
355
|
-
|
|
356
306
|
if self.has_aio_folder:
|
|
357
307
|
# write async operation group and operation files
|
|
358
308
|
operation_group_async_serializer = OperationGroupsSerializer(
|
|
359
309
|
code_model=self.code_model,
|
|
360
310
|
env=env,
|
|
361
311
|
async_mode=True,
|
|
362
|
-
is_python3_file=True,
|
|
363
312
|
operation_group=operation_group,
|
|
364
313
|
)
|
|
365
|
-
self.
|
|
314
|
+
self.write_file(
|
|
366
315
|
(
|
|
367
316
|
namespace_path
|
|
368
317
|
/ Path("aio")
|
|
@@ -379,7 +328,7 @@ class JinjaSerializer:
|
|
|
379
328
|
operations_init_serializer = OperationsInitSerializer(
|
|
380
329
|
code_model=self.code_model, env=env, async_mode=False
|
|
381
330
|
)
|
|
382
|
-
self.
|
|
331
|
+
self.write_file(
|
|
383
332
|
namespace_path
|
|
384
333
|
/ Path(self.code_model.operations_folder_name)
|
|
385
334
|
/ Path("__init__.py"),
|
|
@@ -391,7 +340,7 @@ class JinjaSerializer:
|
|
|
391
340
|
operations_async_init_serializer = OperationsInitSerializer(
|
|
392
341
|
code_model=self.code_model, env=env, async_mode=True
|
|
393
342
|
)
|
|
394
|
-
self.
|
|
343
|
+
self.write_file(
|
|
395
344
|
namespace_path
|
|
396
345
|
/ Path("aio")
|
|
397
346
|
/ Path(self.code_model.operations_folder_name)
|
|
@@ -416,12 +365,10 @@ class JinjaSerializer:
|
|
|
416
365
|
self, namespace_path: Path, general_serializer: GeneralSerializer
|
|
417
366
|
):
|
|
418
367
|
def _read_version_file(original_version_file_name: str) -> str:
|
|
419
|
-
return self.
|
|
420
|
-
namespace_path / original_version_file_name
|
|
421
|
-
)
|
|
368
|
+
return self.read_file(namespace_path / original_version_file_name)
|
|
422
369
|
|
|
423
370
|
def _write_version_file(original_version_file_name: str) -> None:
|
|
424
|
-
self.
|
|
371
|
+
self.write_file(
|
|
425
372
|
namespace_path / Path("_version.py"),
|
|
426
373
|
_read_version_file(original_version_file_name),
|
|
427
374
|
)
|
|
@@ -432,7 +379,7 @@ class JinjaSerializer:
|
|
|
432
379
|
elif keep_version_file and _read_version_file("version.py"):
|
|
433
380
|
_write_version_file(original_version_file_name="version.py")
|
|
434
381
|
elif self.code_model.options["package_version"]:
|
|
435
|
-
self.
|
|
382
|
+
self.write_file(
|
|
436
383
|
namespace_path / Path("_version.py"),
|
|
437
384
|
general_serializer.serialize_version_file(),
|
|
438
385
|
)
|
|
@@ -444,14 +391,14 @@ class JinjaSerializer:
|
|
|
444
391
|
code_model=self.code_model, env=env, async_mode=False
|
|
445
392
|
)
|
|
446
393
|
|
|
447
|
-
self.
|
|
394
|
+
self.write_file(
|
|
448
395
|
namespace_path / Path("__init__.py"),
|
|
449
396
|
general_serializer.serialize_init_file(),
|
|
450
397
|
)
|
|
451
398
|
p = namespace_path.parent
|
|
452
399
|
while p != Path("."):
|
|
453
400
|
# write pkgutil init file
|
|
454
|
-
self.
|
|
401
|
+
self.write_file(
|
|
455
402
|
p / Path("__init__.py"),
|
|
456
403
|
general_serializer.serialize_pkgutil_init_file(),
|
|
457
404
|
)
|
|
@@ -459,13 +406,13 @@ class JinjaSerializer:
|
|
|
459
406
|
|
|
460
407
|
# Write the service client
|
|
461
408
|
if self.code_model.request_builders:
|
|
462
|
-
self.
|
|
409
|
+
self.write_file(
|
|
463
410
|
namespace_path / Path(f"{self.code_model.client.filename}.py"),
|
|
464
411
|
general_serializer.serialize_service_client_file(),
|
|
465
412
|
)
|
|
466
413
|
|
|
467
414
|
if self.code_model.need_vendored_code(async_mode=False):
|
|
468
|
-
self.
|
|
415
|
+
self.write_file(
|
|
469
416
|
namespace_path / Path("_vendor.py"),
|
|
470
417
|
general_serializer.serialize_vendor_file(),
|
|
471
418
|
)
|
|
@@ -473,31 +420,27 @@ class JinjaSerializer:
|
|
|
473
420
|
self._serialize_and_write_version_file(namespace_path, general_serializer)
|
|
474
421
|
|
|
475
422
|
# write the empty py.typed file
|
|
476
|
-
self.
|
|
477
|
-
namespace_path / Path("py.typed"), "# Marker file for PEP 561."
|
|
478
|
-
)
|
|
423
|
+
self.write_file(namespace_path / Path("py.typed"), "# Marker file for PEP 561.")
|
|
479
424
|
|
|
480
425
|
if (
|
|
481
426
|
not self.code_model.options["client_side_validation"]
|
|
482
427
|
and not self.code_model.options["multiapi"]
|
|
483
428
|
):
|
|
484
|
-
self.
|
|
429
|
+
self.write_file(
|
|
485
430
|
namespace_path / Path("_serialization.py"),
|
|
486
431
|
general_serializer.serialize_serialization_file(),
|
|
487
432
|
)
|
|
488
433
|
|
|
489
434
|
# Write the config file
|
|
490
435
|
if self.code_model.request_builders:
|
|
491
|
-
self.
|
|
436
|
+
self.write_file(
|
|
492
437
|
namespace_path / Path("_configuration.py"),
|
|
493
438
|
general_serializer.serialize_config_file(),
|
|
494
439
|
)
|
|
495
440
|
|
|
496
441
|
# Write the setup file
|
|
497
442
|
if self.code_model.options["basic_setup_py"]:
|
|
498
|
-
self.
|
|
499
|
-
Path("setup.py"), general_serializer.serialize_setup_file()
|
|
500
|
-
)
|
|
443
|
+
self.write_file(Path("setup.py"), general_serializer.serialize_setup_file())
|
|
501
444
|
|
|
502
445
|
def _serialize_and_write_aio_top_level_folder(
|
|
503
446
|
self, env: Environment, namespace_path: Path
|
|
@@ -509,24 +452,24 @@ class JinjaSerializer:
|
|
|
509
452
|
aio_path = namespace_path / Path("aio")
|
|
510
453
|
|
|
511
454
|
# Write the __init__ file
|
|
512
|
-
self.
|
|
455
|
+
self.write_file(
|
|
513
456
|
aio_path / Path("__init__.py"), aio_general_serializer.serialize_init_file()
|
|
514
457
|
)
|
|
515
458
|
|
|
516
459
|
# Write the service client
|
|
517
460
|
if self.code_model.request_builders:
|
|
518
|
-
self.
|
|
461
|
+
self.write_file(
|
|
519
462
|
aio_path / Path(f"{self.code_model.client.filename}.py"),
|
|
520
463
|
aio_general_serializer.serialize_service_client_file(),
|
|
521
464
|
)
|
|
522
465
|
|
|
523
466
|
# Write the config file
|
|
524
|
-
self.
|
|
467
|
+
self.write_file(
|
|
525
468
|
aio_path / Path("_configuration.py"),
|
|
526
469
|
aio_general_serializer.serialize_config_file(),
|
|
527
470
|
)
|
|
528
471
|
if self.code_model.need_vendored_code(async_mode=True):
|
|
529
|
-
self.
|
|
472
|
+
self.write_file(
|
|
530
473
|
aio_path / Path("_vendor.py"),
|
|
531
474
|
aio_general_serializer.serialize_vendor_file(),
|
|
532
475
|
)
|
|
@@ -535,6 +478,11 @@ class JinjaSerializer:
|
|
|
535
478
|
self, env: Environment, namespace_path: Path
|
|
536
479
|
) -> None:
|
|
537
480
|
metadata_serializer = MetadataSerializer(self.code_model, env)
|
|
538
|
-
self.
|
|
481
|
+
self.write_file(
|
|
539
482
|
namespace_path / Path("_metadata.json"), metadata_serializer.serialize()
|
|
540
483
|
)
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
class JinjaSerializerAutorest(JinjaSerializer, ReaderAndWriterAutorest):
|
|
487
|
+
def __init__(self, autorestapi: AutorestAPI, code_model: CodeModel) -> None:
|
|
488
|
+
super().__init__(autorestapi=autorestapi, code_model=code_model)
|
|
@@ -176,12 +176,9 @@ def _get_json_response_template_to_status_codes(
|
|
|
176
176
|
|
|
177
177
|
|
|
178
178
|
class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-method
|
|
179
|
-
def __init__(
|
|
180
|
-
self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
|
|
181
|
-
) -> None:
|
|
179
|
+
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
182
180
|
self.code_model = code_model
|
|
183
181
|
self.async_mode = async_mode
|
|
184
|
-
self.is_python3_file = is_python3_file
|
|
185
182
|
self.parameter_serializer = ParameterSerializer()
|
|
186
183
|
|
|
187
184
|
@property
|
|
@@ -225,9 +222,7 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
|
|
|
225
222
|
function_def=self._function_def,
|
|
226
223
|
method_name=builder.name,
|
|
227
224
|
need_self_param=self._need_self_param,
|
|
228
|
-
method_param_signatures=builder.method_signature(
|
|
229
|
-
self.async_mode or self.is_python3_file, self.async_mode
|
|
230
|
-
),
|
|
225
|
+
method_param_signatures=builder.method_signature(self.async_mode),
|
|
231
226
|
pylint_disable=builder.pylint_disable,
|
|
232
227
|
)
|
|
233
228
|
|
|
@@ -245,7 +240,6 @@ class _BuilderBaseSerializer(Generic[BuilderType]): # pylint: disable=abstract-
|
|
|
245
240
|
return (
|
|
246
241
|
decorators_str
|
|
247
242
|
+ utils.method_signature_and_response_type_annotation_template(
|
|
248
|
-
is_python3_file=self.is_python3_file,
|
|
249
243
|
method_signature=method_signature,
|
|
250
244
|
response_type_annotation=response_type_annotation,
|
|
251
245
|
)
|
|
@@ -442,7 +436,7 @@ class RequestBuilderSerializer(
|
|
|
442
436
|
|
|
443
437
|
def pop_kwargs_from_signature(self, builder: RequestBuilderType) -> List[str]:
|
|
444
438
|
return self.parameter_serializer.pop_kwargs_from_signature(
|
|
445
|
-
builder.parameters.kwargs_to_pop
|
|
439
|
+
builder.parameters.kwargs_to_pop,
|
|
446
440
|
check_kwarg_dict=True,
|
|
447
441
|
pop_headers_kwarg=PopKwargType.CASE_INSENSITIVE
|
|
448
442
|
if bool(builder.parameters.headers)
|
|
@@ -452,7 +446,8 @@ class RequestBuilderSerializer(
|
|
|
452
446
|
else PopKwargType.NO,
|
|
453
447
|
)
|
|
454
448
|
|
|
455
|
-
|
|
449
|
+
@staticmethod
|
|
450
|
+
def create_http_request(builder: RequestBuilderType) -> List[str]:
|
|
456
451
|
retval = ["return HttpRequest("]
|
|
457
452
|
retval.append(f' method="{builder.method}",')
|
|
458
453
|
retval.append(" url=_url,")
|
|
@@ -465,9 +460,9 @@ class RequestBuilderSerializer(
|
|
|
465
460
|
and builder.parameters.body_parameter.in_method_signature
|
|
466
461
|
):
|
|
467
462
|
body_param = builder.parameters.body_parameter
|
|
468
|
-
if
|
|
469
|
-
|
|
470
|
-
|
|
463
|
+
if (
|
|
464
|
+
body_param.constant
|
|
465
|
+
or body_param.method_location != ParameterMethodLocation.KWARG
|
|
471
466
|
):
|
|
472
467
|
# we only need to pass it through if it's not a kwarg or it's a popped kwarg
|
|
473
468
|
retval.append(
|
|
@@ -611,9 +606,7 @@ class _OperationSerializer(
|
|
|
611
606
|
return description_list
|
|
612
607
|
|
|
613
608
|
def pop_kwargs_from_signature(self, builder: OperationType) -> List[str]:
|
|
614
|
-
kwargs_to_pop = builder.parameters.kwargs_to_pop
|
|
615
|
-
is_python3_file=self.is_python3_file
|
|
616
|
-
)
|
|
609
|
+
kwargs_to_pop = builder.parameters.kwargs_to_pop
|
|
617
610
|
kwargs = self.parameter_serializer.pop_kwargs_from_signature(
|
|
618
611
|
kwargs_to_pop,
|
|
619
612
|
check_kwarg_dict=True,
|
|
@@ -822,7 +815,6 @@ class _OperationSerializer(
|
|
|
822
815
|
is_next_request
|
|
823
816
|
and builder.operation_type == "paging"
|
|
824
817
|
and not bool(builder.next_request_builder) # type: ignore
|
|
825
|
-
and not self.code_model.options["reformat_next_link"]
|
|
826
818
|
and parameter.location == ParameterLocation.QUERY
|
|
827
819
|
):
|
|
828
820
|
# if we don't want to reformat query parameters for next link calls
|
|
@@ -833,10 +825,15 @@ class _OperationSerializer(
|
|
|
833
825
|
f" {parameter.client_name}={parameter.name_in_high_level_operation},"
|
|
834
826
|
)
|
|
835
827
|
if request_builder.overloads:
|
|
828
|
+
seen_body_params = set()
|
|
836
829
|
for overload in request_builder.overloads:
|
|
837
830
|
body_param = cast(
|
|
838
831
|
RequestBuilderBodyParameter, overload.parameters.body_parameter
|
|
839
832
|
)
|
|
833
|
+
if body_param.client_name in seen_body_params:
|
|
834
|
+
continue
|
|
835
|
+
seen_body_params.add(body_param.client_name)
|
|
836
|
+
|
|
840
837
|
retval.append(
|
|
841
838
|
f" {body_param.client_name}={body_param.name_in_high_level_operation},"
|
|
842
839
|
)
|
|
@@ -1103,15 +1100,12 @@ PagingOperationType = TypeVar(
|
|
|
1103
1100
|
class _PagingOperationSerializer(
|
|
1104
1101
|
_OperationSerializer[PagingOperationType]
|
|
1105
1102
|
): # pylint: disable=abstract-method
|
|
1106
|
-
def __init__(
|
|
1107
|
-
self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
|
|
1108
|
-
) -> None:
|
|
1103
|
+
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
1109
1104
|
# for pylint reasons need to redefine init
|
|
1110
1105
|
# probably because inheritance is going too deep
|
|
1111
|
-
super().__init__(code_model, async_mode
|
|
1106
|
+
super().__init__(code_model, async_mode)
|
|
1112
1107
|
self.code_model = code_model
|
|
1113
1108
|
self.async_mode = async_mode
|
|
1114
|
-
self.is_python3_file = is_python3_file
|
|
1115
1109
|
self.parameter_serializer = ParameterSerializer()
|
|
1116
1110
|
|
|
1117
1111
|
def serialize_path(self, builder: PagingOperationType) -> List[str]:
|
|
@@ -1139,9 +1133,39 @@ class _PagingOperationSerializer(
|
|
|
1139
1133
|
template_url = "next_link"
|
|
1140
1134
|
|
|
1141
1135
|
request_builder = builder.next_request_builder or builder.request_builder
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1136
|
+
if builder.next_request_builder:
|
|
1137
|
+
return self._call_request_builder_helper(
|
|
1138
|
+
builder,
|
|
1139
|
+
request_builder,
|
|
1140
|
+
template_url=template_url,
|
|
1141
|
+
is_next_request=True,
|
|
1142
|
+
)
|
|
1143
|
+
retval: List[str] = []
|
|
1144
|
+
query_str = ""
|
|
1145
|
+
next_link_str = "next_link"
|
|
1146
|
+
try:
|
|
1147
|
+
api_version_param = next(
|
|
1148
|
+
p
|
|
1149
|
+
for p in self.code_model.client.parameters
|
|
1150
|
+
if p.rest_api_name == "api-version"
|
|
1151
|
+
)
|
|
1152
|
+
retval.append("# make call to next link with the client's api-version")
|
|
1153
|
+
retval.append("_parsed_next_link = urlparse(next_link)")
|
|
1154
|
+
retval.append(
|
|
1155
|
+
"_next_request_params = case_insensitive_dict(parse_qs(_parsed_next_link.query))"
|
|
1156
|
+
)
|
|
1157
|
+
retval.append(
|
|
1158
|
+
f'_next_request_params["api-version"] = {api_version_param.full_client_name}'
|
|
1159
|
+
)
|
|
1160
|
+
query_str = ", params=_next_request_params"
|
|
1161
|
+
next_link_str = "urljoin(next_link, _parsed_next_link.path)"
|
|
1162
|
+
except StopIteration:
|
|
1163
|
+
pass
|
|
1164
|
+
|
|
1165
|
+
retval.append(f'request = HttpRequest("GET", {next_link_str}{query_str})')
|
|
1166
|
+
retval.extend(self._postprocess_http_request(builder, "request.url"))
|
|
1167
|
+
|
|
1168
|
+
return retval
|
|
1145
1169
|
|
|
1146
1170
|
def _prepare_request_callback(self, builder: PagingOperationType) -> List[str]:
|
|
1147
1171
|
retval = ["def prepare_request(next_link=None):"]
|
|
@@ -1154,10 +1178,7 @@ class _PagingOperationSerializer(
|
|
|
1154
1178
|
retval.extend(
|
|
1155
1179
|
[f" {line}" for line in self.call_next_link_request_builder(builder)]
|
|
1156
1180
|
)
|
|
1157
|
-
if not builder.next_request_builder and
|
|
1158
|
-
retval.append("")
|
|
1159
|
-
retval.extend([f" {line}" for line in self.serialize_path(builder)])
|
|
1160
|
-
if not builder.next_request_builder:
|
|
1181
|
+
if not builder.next_request_builder and self.code_model.is_legacy:
|
|
1161
1182
|
retval.append(' request.method = "GET"')
|
|
1162
1183
|
else:
|
|
1163
1184
|
retval.append("")
|
|
@@ -1235,15 +1256,12 @@ LROOperationType = TypeVar(
|
|
|
1235
1256
|
|
|
1236
1257
|
|
|
1237
1258
|
class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
|
|
1238
|
-
def __init__(
|
|
1239
|
-
self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
|
|
1240
|
-
) -> None:
|
|
1259
|
+
def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
|
|
1241
1260
|
# for pylint reasons need to redefine init
|
|
1242
1261
|
# probably because inheritance is going too deep
|
|
1243
|
-
super().__init__(code_model, async_mode
|
|
1262
|
+
super().__init__(code_model, async_mode)
|
|
1244
1263
|
self.code_model = code_model
|
|
1245
1264
|
self.async_mode = async_mode
|
|
1246
|
-
self.is_python3_file = is_python3_file
|
|
1247
1265
|
self.parameter_serializer = ParameterSerializer()
|
|
1248
1266
|
|
|
1249
1267
|
def param_description(self, builder: LROOperationType) -> List[str]:
|
|
@@ -1423,7 +1441,6 @@ def get_operation_serializer(
|
|
|
1423
1441
|
builder: Operation,
|
|
1424
1442
|
code_model,
|
|
1425
1443
|
async_mode: bool,
|
|
1426
|
-
is_python3_file: bool,
|
|
1427
1444
|
) -> Union[
|
|
1428
1445
|
OperationSerializer,
|
|
1429
1446
|
PagingOperationSerializer,
|
|
@@ -1442,4 +1459,4 @@ def get_operation_serializer(
|
|
|
1442
1459
|
retcls = LROOperationSerializer
|
|
1443
1460
|
elif builder.operation_type == "paging":
|
|
1444
1461
|
retcls = PagingOperationSerializer
|
|
1445
|
-
return retcls(code_model, async_mode
|
|
1462
|
+
return retcls(code_model, async_mode)
|