@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.
Files changed (52) hide show
  1. package/ChangeLog.md +61 -2
  2. package/README.md +9 -0
  3. package/autorest/__init__.py +54 -13
  4. package/autorest/black/__init__.py +14 -8
  5. package/autorest/codegen/__init__.py +126 -89
  6. package/autorest/codegen/models/base_builder.py +17 -6
  7. package/autorest/codegen/models/client.py +1 -1
  8. package/autorest/codegen/models/code_model.py +7 -12
  9. package/autorest/codegen/models/lro_operation.py +2 -6
  10. package/autorest/codegen/models/lro_paging_operation.py +3 -9
  11. package/autorest/codegen/models/model_type.py +1 -6
  12. package/autorest/codegen/models/operation.py +6 -37
  13. package/autorest/codegen/models/operation_group.py +4 -7
  14. package/autorest/codegen/models/paging_operation.py +17 -7
  15. package/autorest/codegen/models/parameter.py +3 -7
  16. package/autorest/codegen/models/parameter_list.py +20 -36
  17. package/autorest/codegen/models/request_builder.py +0 -22
  18. package/autorest/codegen/serializers/__init__.py +46 -98
  19. package/autorest/codegen/serializers/builder_serializer.py +53 -36
  20. package/autorest/codegen/serializers/client_serializer.py +20 -31
  21. package/autorest/codegen/serializers/general_serializer.py +2 -7
  22. package/autorest/codegen/serializers/import_serializer.py +11 -22
  23. package/autorest/codegen/serializers/metadata_serializer.py +0 -2
  24. package/autorest/codegen/serializers/{model_base_serializer.py → model_serializer.py} +47 -38
  25. package/autorest/codegen/serializers/operation_groups_serializer.py +0 -7
  26. package/autorest/codegen/serializers/operations_init_serializer.py +2 -23
  27. package/autorest/codegen/serializers/patch_serializer.py +1 -3
  28. package/autorest/codegen/serializers/request_builders_serializer.py +1 -4
  29. package/autorest/codegen/serializers/utils.py +1 -4
  30. package/autorest/codegen/templates/client.py.jinja2 +3 -3
  31. package/autorest/codegen/templates/config.py.jinja2 +2 -2
  32. package/autorest/codegen/templates/metadata.json.jinja2 +4 -4
  33. package/autorest/codegen/templates/model_init.py.jinja2 +5 -12
  34. package/autorest/codegen/templates/operation_group.py.jinja2 +1 -1
  35. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +0 -6
  36. package/autorest/codegen/templates/patch.py.jinja2 +1 -2
  37. package/autorest/codegen/templates/request_builders.py.jinja2 +0 -3
  38. package/autorest/codegen/templates/rest_init.py.jinja2 +3 -8
  39. package/autorest/codegen/templates/serialization.py.jinja2 +3 -3
  40. package/autorest/codegen/templates/setup.py.jinja2 +1 -1
  41. package/autorest/jsonrpc/server.py +7 -7
  42. package/autorest/m2r/__init__.py +7 -2
  43. package/autorest/m4reformatter/__init__.py +13 -5
  44. package/autorest/multiapi/__init__.py +56 -29
  45. package/autorest/multiapi/serializers/__init__.py +26 -31
  46. package/autorest/multiapi/serializers/import_serializer.py +4 -8
  47. package/autorest/multiapi/serializers/multiapi_serializer.py +33 -26
  48. package/autorest/postprocess/__init__.py +14 -11
  49. package/autorest/preprocess/__init__.py +36 -7
  50. package/package.json +2 -2
  51. package/autorest/codegen/serializers/model_generic_serializer.py +0 -32
  52. 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 .model_python3_serializer import ModelPython3Serializer
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, autorestapi: AutorestAPI, code_model: CodeModel) -> None:
44
- self._autorestapi = autorestapi
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._autorestapi.read_file(namespace_path / Path("models.py")):
134
- self._autorestapi.write_file(
133
+ if self.read_file(namespace_path / Path("models.py")):
134
+ self.write_file(
135
135
  namespace_path / Path("models.py"),
136
- self._autorestapi.read_file(namespace_path / Path("models.py")),
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._autorestapi.write_file(output_name, render_result)
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._autorestapi.read_file(path_file):
212
- self._autorestapi.write_file(
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._autorestapi.write_file(
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
- if not self.code_model.options["python3_only"]:
228
- self._autorestapi.write_file(
229
- models_path
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.read_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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._autorestapi.write_file(
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(is_python3_file=self.is_python3_file),
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
- def create_http_request(self, builder: RequestBuilderType) -> List[str]:
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 body_param.constant or (
469
- self.is_python3_file
470
- and body_param.method_location != ParameterMethodLocation.KWARG
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, is_python3_file)
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
- return self._call_request_builder_helper(
1143
- builder, request_builder, template_url=template_url, is_next_request=True
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 builder.parameters.path:
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, is_python3_file)
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, is_python3_file)
1462
+ return retcls(code_model, async_mode)