@autorest/python 5.18.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/ChangeLog.md +58 -13
  2. package/README.md +9 -0
  3. package/autorest/codegen/__init__.py +24 -30
  4. package/autorest/codegen/models/base_builder.py +17 -6
  5. package/autorest/codegen/models/client.py +9 -6
  6. package/autorest/codegen/models/code_model.py +20 -14
  7. package/autorest/codegen/models/imports.py +57 -2
  8. package/autorest/codegen/models/lro_operation.py +4 -6
  9. package/autorest/codegen/models/lro_paging_operation.py +3 -9
  10. package/autorest/codegen/models/model_type.py +1 -6
  11. package/autorest/codegen/models/operation.py +47 -79
  12. package/autorest/codegen/models/operation_group.py +10 -9
  13. package/autorest/codegen/models/paging_operation.py +19 -7
  14. package/autorest/codegen/models/parameter.py +3 -7
  15. package/autorest/codegen/models/parameter_list.py +20 -36
  16. package/autorest/codegen/models/request_builder.py +31 -42
  17. package/autorest/codegen/serializers/__init__.py +12 -50
  18. package/autorest/codegen/serializers/builder_serializer.py +53 -40
  19. package/autorest/codegen/serializers/client_serializer.py +22 -31
  20. package/autorest/codegen/serializers/general_serializer.py +12 -12
  21. package/autorest/codegen/serializers/import_serializer.py +11 -22
  22. package/autorest/codegen/serializers/metadata_serializer.py +0 -2
  23. package/autorest/codegen/serializers/{model_base_serializer.py → model_serializer.py} +57 -43
  24. package/autorest/codegen/serializers/operation_groups_serializer.py +3 -7
  25. package/autorest/codegen/serializers/operations_init_serializer.py +2 -23
  26. package/autorest/codegen/serializers/patch_serializer.py +1 -3
  27. package/autorest/codegen/serializers/request_builders_serializer.py +2 -5
  28. package/autorest/codegen/serializers/utils.py +1 -4
  29. package/autorest/codegen/templates/client.py.jinja2 +6 -3
  30. package/autorest/codegen/templates/config.py.jinja2 +2 -2
  31. package/autorest/codegen/templates/metadata.json.jinja2 +4 -4
  32. package/autorest/codegen/templates/model_init.py.jinja2 +5 -12
  33. package/autorest/codegen/templates/operation_group.py.jinja2 +16 -3
  34. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +2 -8
  35. package/autorest/codegen/templates/operation_tools.jinja2 +3 -1
  36. package/autorest/codegen/templates/patch.py.jinja2 +1 -2
  37. package/autorest/codegen/templates/request_builder.py.jinja2 +0 -7
  38. package/autorest/codegen/templates/request_builders.py.jinja2 +1 -4
  39. package/autorest/codegen/templates/rest_init.py.jinja2 +3 -8
  40. package/autorest/codegen/templates/serialization.py.jinja2 +2006 -0
  41. package/autorest/codegen/templates/setup.py.jinja2 +4 -0
  42. package/autorest/codegen/templates/vendor.py.jinja2 +10 -0
  43. package/autorest/m4reformatter/__init__.py +9 -3
  44. package/autorest/multiapi/models/client.py +12 -2
  45. package/autorest/multiapi/serializers/__init__.py +17 -8
  46. package/autorest/multiapi/serializers/import_serializer.py +4 -8
  47. package/autorest/multiapi/templates/multiapi_operations_mixin.py.jinja2 +1 -1
  48. package/autorest/preprocess/__init__.py +24 -4
  49. package/package.json +2 -2
  50. package/autorest/codegen/serializers/model_generic_serializer.py +0 -32
  51. package/autorest/codegen/serializers/model_python3_serializer.py +0 -72
@@ -14,9 +14,8 @@ from ..models import CodeModel, OperationGroup, RequestBuilder
14
14
  from ..models import TokenCredentialType
15
15
  from .enum_serializer import EnumSerializer
16
16
  from .general_serializer import GeneralSerializer
17
- from .model_generic_serializer import ModelGenericSerializer
18
17
  from .model_init_serializer import ModelInitSerializer
19
- from .model_python3_serializer import ModelPython3Serializer
18
+ from .model_serializer import ModelSerializer
20
19
  from .operations_init_serializer import OperationsInitSerializer
21
20
  from .operation_groups_serializer import OperationGroupsSerializer
22
21
  from .metadata_serializer import MetadataSerializer
@@ -224,22 +223,9 @@ class JinjaSerializer:
224
223
  # Write the models folder
225
224
  models_path = namespace_path / Path("models")
226
225
  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
226
  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(),
227
+ models_path / Path(f"{self.code_model.models_filename}.py"),
228
+ ModelSerializer(code_model=self.code_model, env=env).serialize(),
243
229
  )
244
230
  if self.code_model.enums:
245
231
  self._autorestapi.write_file(
@@ -287,18 +273,6 @@ class JinjaSerializer:
287
273
  code_model=self.code_model,
288
274
  env=env,
289
275
  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
276
  ).serialize_request_builders(),
303
277
  )
304
278
 
@@ -309,7 +283,6 @@ class JinjaSerializer:
309
283
  code_model=self.code_model,
310
284
  env=env,
311
285
  request_builders=request_builders,
312
- is_python3_file=True,
313
286
  ).serialize_init(),
314
287
  )
315
288
 
@@ -325,7 +298,6 @@ class JinjaSerializer:
325
298
  code_model=self.code_model,
326
299
  env=env,
327
300
  async_mode=False,
328
- is_python3_file=self.code_model.options["python3_only"],
329
301
  operation_group=operation_group,
330
302
  )
331
303
  self._autorestapi.write_file(
@@ -335,31 +307,12 @@ class JinjaSerializer:
335
307
  operation_group_serializer.serialize(),
336
308
  )
337
309
 
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
310
  if self.has_aio_folder:
357
311
  # write async operation group and operation files
358
312
  operation_group_async_serializer = OperationGroupsSerializer(
359
313
  code_model=self.code_model,
360
314
  env=env,
361
315
  async_mode=True,
362
- is_python3_file=True,
363
316
  operation_group=operation_group,
364
317
  )
365
318
  self._autorestapi.write_file(
@@ -477,6 +430,15 @@ class JinjaSerializer:
477
430
  namespace_path / Path("py.typed"), "# Marker file for PEP 561."
478
431
  )
479
432
 
433
+ if (
434
+ not self.code_model.options["client_side_validation"]
435
+ and not self.code_model.options["multiapi"]
436
+ ):
437
+ self._autorestapi.write_file(
438
+ namespace_path / Path("_serialization.py"),
439
+ general_serializer.serialize_serialization_file(),
440
+ )
441
+
480
442
  # Write the config file
481
443
  if self.code_model.request_builders:
482
444
  self._autorestapi.write_file(
@@ -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(
@@ -598,8 +593,6 @@ class _OperationSerializer(
598
593
  def decorators(self, builder: OperationType) -> List[str]:
599
594
  """Decorators for the method"""
600
595
  super_decorators = super().decorators(builder)
601
- if builder.abstract:
602
- super_decorators.append("@abc.abstractmethod")
603
596
  return super_decorators
604
597
 
605
598
  def param_description(
@@ -613,9 +606,7 @@ class _OperationSerializer(
613
606
  return description_list
614
607
 
615
608
  def pop_kwargs_from_signature(self, builder: OperationType) -> List[str]:
616
- kwargs_to_pop = builder.parameters.kwargs_to_pop(
617
- is_python3_file=self.is_python3_file
618
- )
609
+ kwargs_to_pop = builder.parameters.kwargs_to_pop
619
610
  kwargs = self.parameter_serializer.pop_kwargs_from_signature(
620
611
  kwargs_to_pop,
621
612
  check_kwarg_dict=True,
@@ -824,7 +815,6 @@ class _OperationSerializer(
824
815
  is_next_request
825
816
  and builder.operation_type == "paging"
826
817
  and not bool(builder.next_request_builder) # type: ignore
827
- and not self.code_model.options["reformat_next_link"]
828
818
  and parameter.location == ParameterLocation.QUERY
829
819
  ):
830
820
  # if we don't want to reformat query parameters for next link calls
@@ -835,10 +825,15 @@ class _OperationSerializer(
835
825
  f" {parameter.client_name}={parameter.name_in_high_level_operation},"
836
826
  )
837
827
  if request_builder.overloads:
828
+ seen_body_params = set()
838
829
  for overload in request_builder.overloads:
839
830
  body_param = cast(
840
831
  RequestBuilderBodyParameter, overload.parameters.body_parameter
841
832
  )
833
+ if body_param.client_name in seen_body_params:
834
+ continue
835
+ seen_body_params.add(body_param.client_name)
836
+
842
837
  retval.append(
843
838
  f" {body_param.client_name}={body_param.name_in_high_level_operation},"
844
839
  )
@@ -1105,15 +1100,12 @@ PagingOperationType = TypeVar(
1105
1100
  class _PagingOperationSerializer(
1106
1101
  _OperationSerializer[PagingOperationType]
1107
1102
  ): # pylint: disable=abstract-method
1108
- def __init__(
1109
- self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
1110
- ) -> None:
1103
+ def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
1111
1104
  # for pylint reasons need to redefine init
1112
1105
  # probably because inheritance is going too deep
1113
- super().__init__(code_model, async_mode, is_python3_file)
1106
+ super().__init__(code_model, async_mode)
1114
1107
  self.code_model = code_model
1115
1108
  self.async_mode = async_mode
1116
- self.is_python3_file = is_python3_file
1117
1109
  self.parameter_serializer = ParameterSerializer()
1118
1110
 
1119
1111
  def serialize_path(self, builder: PagingOperationType) -> List[str]:
@@ -1126,8 +1118,6 @@ class _PagingOperationSerializer(
1126
1118
  retval: List[str] = []
1127
1119
  if self.code_model.options["tracing"] and builder.want_tracing:
1128
1120
  retval.append("@distributed_trace")
1129
- if builder.abstract:
1130
- retval.append("@abc.abstractmethod")
1131
1121
  return retval
1132
1122
 
1133
1123
  def call_next_link_request_builder(self, builder: PagingOperationType) -> List[str]:
@@ -1143,9 +1133,39 @@ class _PagingOperationSerializer(
1143
1133
  template_url = "next_link"
1144
1134
 
1145
1135
  request_builder = builder.next_request_builder or builder.request_builder
1146
- return self._call_request_builder_helper(
1147
- builder, request_builder, template_url=template_url, is_next_request=True
1148
- )
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
1149
1169
 
1150
1170
  def _prepare_request_callback(self, builder: PagingOperationType) -> List[str]:
1151
1171
  retval = ["def prepare_request(next_link=None):"]
@@ -1158,10 +1178,7 @@ class _PagingOperationSerializer(
1158
1178
  retval.extend(
1159
1179
  [f" {line}" for line in self.call_next_link_request_builder(builder)]
1160
1180
  )
1161
- if not builder.next_request_builder and builder.parameters.path:
1162
- retval.append("")
1163
- retval.extend([f" {line}" for line in self.serialize_path(builder)])
1164
- if not builder.next_request_builder:
1181
+ if not builder.next_request_builder and self.code_model.is_legacy:
1165
1182
  retval.append(' request.method = "GET"')
1166
1183
  else:
1167
1184
  retval.append("")
@@ -1239,15 +1256,12 @@ LROOperationType = TypeVar(
1239
1256
 
1240
1257
 
1241
1258
  class _LROOperationSerializer(_OperationSerializer[LROOperationType]):
1242
- def __init__(
1243
- self, code_model: CodeModel, async_mode: bool, is_python3_file: bool
1244
- ) -> None:
1259
+ def __init__(self, code_model: CodeModel, async_mode: bool) -> None:
1245
1260
  # for pylint reasons need to redefine init
1246
1261
  # probably because inheritance is going too deep
1247
- super().__init__(code_model, async_mode, is_python3_file)
1262
+ super().__init__(code_model, async_mode)
1248
1263
  self.code_model = code_model
1249
1264
  self.async_mode = async_mode
1250
- self.is_python3_file = is_python3_file
1251
1265
  self.parameter_serializer = ParameterSerializer()
1252
1266
 
1253
1267
  def param_description(self, builder: LROOperationType) -> List[str]:
@@ -1427,7 +1441,6 @@ def get_operation_serializer(
1427
1441
  builder: Operation,
1428
1442
  code_model,
1429
1443
  async_mode: bool,
1430
- is_python3_file: bool,
1431
1444
  ) -> Union[
1432
1445
  OperationSerializer,
1433
1446
  PagingOperationSerializer,
@@ -1446,4 +1459,4 @@ def get_operation_serializer(
1446
1459
  retcls = LROOperationSerializer
1447
1460
  elif builder.operation_type == "paging":
1448
1461
  retcls = PagingOperationSerializer
1449
- return retcls(code_model, async_mode, is_python3_file)
1462
+ return retcls(code_model, async_mode)
@@ -11,9 +11,8 @@ from .parameter_serializer import ParameterSerializer, PopKwargType
11
11
 
12
12
 
13
13
  class ClientSerializer:
14
- def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
14
+ def __init__(self, code_model: CodeModel) -> None:
15
15
  self.code_model = code_model
16
- self.is_python3_file = is_python3_file
17
16
  self.parameter_serializer = ParameterSerializer()
18
17
 
19
18
  def _init_signature(self, async_mode: bool) -> str:
@@ -22,36 +21,32 @@ class ClientSerializer:
22
21
  method_name="__init__",
23
22
  need_self_param=True,
24
23
  method_param_signatures=self.code_model.client.parameters.method_signature(
25
- async_mode or self.is_python3_file, async_mode
24
+ async_mode
26
25
  ),
27
26
  )
28
27
 
29
28
  def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
30
29
  init_signature = self._init_signature(async_mode)
31
30
  return utils.method_signature_and_response_type_annotation_template(
32
- is_python3_file=async_mode or self.is_python3_file,
33
31
  method_signature=init_signature,
34
32
  response_type_annotation="None",
35
33
  )
36
34
 
37
- def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
35
+ def pop_kwargs_from_signature(self) -> List[str]:
38
36
  return self.parameter_serializer.pop_kwargs_from_signature(
39
- self.code_model.client.parameters.kwargs_to_pop(
40
- async_mode or self.is_python3_file,
41
- ),
37
+ self.code_model.client.parameters.kwargs_to_pop,
42
38
  check_kwarg_dict=False,
43
39
  pop_headers_kwarg=PopKwargType.NO,
44
40
  pop_params_kwarg=PopKwargType.NO,
45
41
  )
46
42
 
47
- def class_definition(self, async_mode) -> str:
43
+ @property
44
+ def class_definition(self) -> str:
48
45
  class_name = self.code_model.client.name
49
46
  has_mixin_og = any(og for og in self.code_model.operation_groups if og.is_mixin)
50
47
  base_class = ""
51
48
  if has_mixin_og:
52
49
  base_class = f"{class_name}OperationsMixin"
53
- elif not (async_mode or self.is_python3_file):
54
- base_class = "object"
55
50
  pylint_disable = self.code_model.client.pylint_disable
56
51
  if base_class:
57
52
  return f"class {class_name}({base_class}):{pylint_disable}"
@@ -101,6 +96,14 @@ class ClientSerializer:
101
96
  except StopIteration:
102
97
  return "_endpoint"
103
98
 
99
+ @property
100
+ def should_init_super(self) -> bool:
101
+ return any(
102
+ og
103
+ for og in self.code_model.operation_groups
104
+ if og.is_mixin and og.has_abstract_operations
105
+ )
106
+
104
107
  def initialize_pipeline_client(self, async_mode: bool) -> str:
105
108
  pipeline_client_name = self.code_model.client.pipeline_class(async_mode)
106
109
  return (
@@ -138,17 +141,10 @@ class ClientSerializer:
138
141
  )
139
142
  return retval
140
143
 
141
- def _send_request_signature(self, async_mode: bool) -> str:
142
- is_python3_file = async_mode or self.code_model.options["python3_only"]
143
- request_signature = [
144
+ def _send_request_signature(self) -> str:
145
+ send_request_signature = [
144
146
  "request: HttpRequest,"
145
- if is_python3_file
146
- else "request, # type: HttpRequest"
147
- ]
148
- send_request_signature = (
149
- request_signature
150
- + self.code_model.client.parameters.method_signature_kwargs(is_python3_file)
151
- )
147
+ ] + self.code_model.client.parameters.method_signature_kwargs
152
148
  return self.parameter_serializer.serialize_method(
153
149
  function_def="def",
154
150
  method_name=self.code_model.client.send_request_name,
@@ -159,9 +155,8 @@ class ClientSerializer:
159
155
  def send_request_signature_and_response_type_annotation(
160
156
  self, async_mode: bool
161
157
  ) -> str:
162
- send_request_signature = self._send_request_signature(async_mode)
158
+ send_request_signature = self._send_request_signature()
163
159
  return utils.method_signature_and_response_type_annotation_template(
164
- is_python3_file=async_mode or self.is_python3_file,
165
160
  method_signature=send_request_signature,
166
161
  response_type_annotation="Awaitable[AsyncHttpResponse]"
167
162
  if async_mode
@@ -247,10 +242,9 @@ class ClientSerializer:
247
242
 
248
243
 
249
244
  class ConfigSerializer:
250
- def __init__(self, code_model: CodeModel, is_python3_file: bool) -> None:
245
+ def __init__(self, code_model: CodeModel) -> None:
251
246
  self.code_model = code_model
252
247
  self.parameter_serializer = ParameterSerializer()
253
- self.is_python3_file = is_python3_file
254
248
 
255
249
  def _init_signature(self, async_mode: bool) -> str:
256
250
  return self.parameter_serializer.serialize_method(
@@ -258,23 +252,20 @@ class ConfigSerializer:
258
252
  method_name="__init__",
259
253
  need_self_param=True,
260
254
  method_param_signatures=self.code_model.config.parameters.method_signature(
261
- async_mode or self.is_python3_file, async_mode
255
+ async_mode
262
256
  ),
263
257
  )
264
258
 
265
259
  def init_signature_and_response_type_annotation(self, async_mode: bool) -> str:
266
260
  init_signature = self._init_signature(async_mode)
267
261
  return utils.method_signature_and_response_type_annotation_template(
268
- is_python3_file=async_mode or self.is_python3_file,
269
262
  method_signature=init_signature,
270
263
  response_type_annotation="None",
271
264
  )
272
265
 
273
- def pop_kwargs_from_signature(self, async_mode: bool) -> List[str]:
266
+ def pop_kwargs_from_signature(self) -> List[str]:
274
267
  return self.parameter_serializer.pop_kwargs_from_signature(
275
- self.code_model.config.parameters.kwargs_to_pop(
276
- async_mode or self.is_python3_file
277
- ),
268
+ self.code_model.config.parameters.kwargs_to_pop,
278
269
  check_kwarg_dict=False,
279
270
  pop_headers_kwarg=PopKwargType.NO,
280
271
  pop_params_kwarg=PopKwargType.NO,
@@ -5,6 +5,7 @@
5
5
  # --------------------------------------------------------------------------
6
6
  from jinja2 import Environment
7
7
  from .import_serializer import FileImportSerializer, TypingSection
8
+ from ..models.imports import MsrestImportType
8
9
  from ..models import (
9
10
  FileImport,
10
11
  ImportType,
@@ -33,14 +34,12 @@ class GeneralSerializer:
33
34
 
34
35
  template = self.env.get_template("client.py.jinja2")
35
36
 
36
- python3_only = self.code_model.options["python3_only"]
37
37
  return template.render(
38
38
  code_model=self.code_model,
39
39
  async_mode=self.async_mode,
40
- serializer=ClientSerializer(self.code_model, is_python3_file=python3_only),
40
+ serializer=ClientSerializer(self.code_model),
41
41
  imports=FileImportSerializer(
42
42
  self.code_model.client.imports(self.async_mode),
43
- is_python3_file=self.async_mode or python3_only,
44
43
  ),
45
44
  )
46
45
 
@@ -73,18 +72,17 @@ class GeneralSerializer:
73
72
  f"{self.code_model.client.name}Configuration",
74
73
  ImportType.LOCAL,
75
74
  )
76
- file_import.add_submodule_import(
77
- "msrest", "Serializer", ImportType.THIRDPARTY, TypingSection.TYPING
78
- )
79
- file_import.add_submodule_import(
80
- "msrest", "Deserializer", ImportType.THIRDPARTY, TypingSection.TYPING
75
+ file_import.add_msrest_import(
76
+ self.code_model,
77
+ ".." if self.async_mode else ".",
78
+ MsrestImportType.SerializerDeserializer,
79
+ TypingSection.TYPING,
81
80
  )
82
81
 
83
82
  return template.render(
84
83
  code_model=self.code_model,
85
84
  imports=FileImportSerializer(
86
85
  file_import,
87
- is_python3_file=self.async_mode,
88
86
  ),
89
87
  async_mode=self.async_mode,
90
88
  )
@@ -98,15 +96,13 @@ class GeneralSerializer:
98
96
  package_name if package_name else self.code_model.client.name.lower()
99
97
  )
100
98
  template = self.env.get_template("config.py.jinja2")
101
- python3_only = self.code_model.options["python3_only"]
102
99
  return template.render(
103
100
  code_model=self.code_model,
104
101
  async_mode=self.async_mode,
105
102
  imports=FileImportSerializer(
106
103
  self.code_model.config.imports(self.async_mode),
107
- is_python3_file=self.async_mode or python3_only,
108
104
  ),
109
- serializer=ConfigSerializer(self.code_model, is_python3_file=python3_only),
105
+ serializer=ConfigSerializer(self.code_model),
110
106
  sdk_moniker=sdk_moniker,
111
107
  )
112
108
 
@@ -120,3 +116,7 @@ class GeneralSerializer:
120
116
  params.update(self.code_model.options)
121
117
  params.update(self.code_model.package_dependency)
122
118
  return template.render(code_model=self.code_model, **params)
119
+
120
+ def serialize_serialization_file(self) -> str:
121
+ template = self.env.get_template("serialization.py.jinja2")
122
+ return template.render(code_model=self.code_model)
@@ -58,11 +58,8 @@ def _get_import_clauses(imports: List[ImportModel], delimiter: str) -> List[str]
58
58
 
59
59
 
60
60
  class FileImportSerializer:
61
- def __init__(
62
- self, file_import: FileImport, is_python3_file: bool, async_mode: bool = False
63
- ) -> None:
61
+ def __init__(self, file_import: FileImport, async_mode: bool = False) -> None:
64
62
  self.file_import = file_import
65
- self.is_python3_file = is_python3_file
66
63
  self.async_mode = async_mode
67
64
 
68
65
  def _get_imports_list(
@@ -82,20 +79,14 @@ class FileImportSerializer:
82
79
  return file_import_copy.get_imports_from_section(baseline_typing_section)
83
80
 
84
81
  def _add_type_checking_import(self):
85
- any_typing = any(
86
- self.file_import.get_imports_from_section(TypingSection.TYPING)
87
- )
88
- conditional_and_not_py3 = not self.is_python3_file and any(
89
- self.file_import.get_imports_from_section(TypingSection.CONDITIONAL)
90
- )
91
- if any_typing or conditional_and_not_py3:
82
+ if any(self.file_import.get_imports_from_section(TypingSection.TYPING)):
92
83
  self.file_import.add_submodule_import(
93
84
  "typing", "TYPE_CHECKING", ImportType.STDLIB
94
85
  )
95
86
 
96
87
  def _get_typing_definitions(self) -> str:
97
88
  def declare_defintion(
98
- spacing: str, type_name: str, type_definition: TypeDefinition
89
+ type_name: str, type_definition: TypeDefinition
99
90
  ) -> List[str]:
100
91
  ret: List[str] = []
101
92
  definition_value = (
@@ -112,21 +103,20 @@ class FileImportSerializer:
112
103
  ):
113
104
  if version is not None:
114
105
  ret.append(
115
- "{}{} sys.version_info >= {}:".format(
116
- spacing, "if" if i == 0 else "elif", version
106
+ "{} sys.version_info >= {}:".format(
107
+ "if" if i == 0 else "elif", version
117
108
  )
118
109
  )
119
110
  elif i > 0:
120
- ret.append("{}else:".format(spacing))
111
+ ret.append("else:")
121
112
  for import_clause in _get_import_clauses(
122
113
  [type_definition.version_imports[version]], "\n"
123
114
  ):
124
115
  ret.append(
125
- "{}{}{}".format(
116
+ "{}{}".format(
126
117
  " "
127
118
  if len(versions) > 1 or version is not None
128
119
  else "",
129
- spacing,
130
120
  import_clause,
131
121
  )
132
122
  )
@@ -134,15 +124,14 @@ class FileImportSerializer:
134
124
  ret[
135
125
  -1
136
126
  ] += " # type: ignore # pylint: disable=ungrouped-imports"
137
- ret.append("{}{} = {}".format(spacing, type_name, definition_value))
127
+ ret.append("{} = {}".format(type_name, definition_value))
138
128
  return ret
139
129
 
140
130
  if not self.file_import.type_definitions:
141
131
  return ""
142
- spacing = "" if self.is_python3_file else " "
143
132
  declarations: List[str] = [""]
144
133
  for type_name, value in self.file_import.type_definitions.items():
145
- declarations.extend(declare_defintion(spacing, type_name, value))
134
+ declarations.extend(declare_defintion(type_name, value))
146
135
  return "\n".join(declarations)
147
136
 
148
137
  def __str__(self) -> str:
@@ -150,7 +139,7 @@ class FileImportSerializer:
150
139
  regular_imports = ""
151
140
  regular_imports_list = self._get_imports_list(
152
141
  baseline_typing_section=TypingSection.REGULAR,
153
- add_conditional_typing=self.is_python3_file,
142
+ add_conditional_typing=True,
154
143
  )
155
144
 
156
145
  if regular_imports_list:
@@ -161,7 +150,7 @@ class FileImportSerializer:
161
150
  typing_imports = ""
162
151
  typing_imports_list = self._get_imports_list(
163
152
  baseline_typing_section=TypingSection.TYPING,
164
- add_conditional_typing=not self.is_python3_file,
153
+ add_conditional_typing=False,
165
154
  )
166
155
  if typing_imports_list:
167
156
  typing_imports += "\n\nif TYPE_CHECKING:\n # pylint: disable=unused-import,ungrouped-imports\n "
@@ -143,13 +143,11 @@ class MetadataSerializer:
143
143
  get_operation_serializer,
144
144
  code_model=self.code_model,
145
145
  async_mode=True,
146
- is_python3_file=True,
147
146
  ),
148
147
  get_sync_operation_serializer=functools.partial(
149
148
  get_operation_serializer,
150
149
  code_model=self.code_model,
151
150
  async_mode=False,
152
- is_python3_file=False,
153
151
  ),
154
152
  has_credential=bool(self.code_model.credential),
155
153
  )