@autorest/python 6.2.0 → 6.2.2

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 (73) hide show
  1. package/autorest/codegen/__init__.py +9 -74
  2. package/autorest/codegen/models/__init__.py +11 -12
  3. package/autorest/codegen/models/{base_type.py → base.py} +29 -10
  4. package/autorest/codegen/models/base_builder.py +8 -10
  5. package/autorest/codegen/models/client.py +111 -40
  6. package/autorest/codegen/models/code_model.py +131 -90
  7. package/autorest/codegen/models/combined_type.py +7 -7
  8. package/autorest/codegen/models/constant_type.py +44 -10
  9. package/autorest/codegen/models/credential_types.py +17 -19
  10. package/autorest/codegen/models/dictionary_type.py +7 -9
  11. package/autorest/codegen/models/enum_type.py +19 -24
  12. package/autorest/codegen/models/imports.py +82 -33
  13. package/autorest/codegen/models/list_type.py +11 -15
  14. package/autorest/codegen/models/lro_operation.py +6 -10
  15. package/autorest/codegen/models/model_type.py +20 -21
  16. package/autorest/codegen/models/operation.py +49 -42
  17. package/autorest/codegen/models/operation_group.py +11 -11
  18. package/autorest/codegen/models/paging_operation.py +9 -11
  19. package/autorest/codegen/models/parameter.py +48 -32
  20. package/autorest/codegen/models/parameter_list.py +16 -22
  21. package/autorest/codegen/models/primitive_types.py +12 -23
  22. package/autorest/codegen/models/property.py +11 -11
  23. package/autorest/codegen/models/request_builder.py +19 -19
  24. package/autorest/codegen/models/request_builder_parameter.py +14 -16
  25. package/autorest/codegen/models/response.py +24 -28
  26. package/autorest/codegen/serializers/__init__.py +202 -187
  27. package/autorest/codegen/serializers/builder_serializer.py +49 -50
  28. package/autorest/codegen/serializers/client_serializer.py +9 -7
  29. package/autorest/codegen/serializers/enum_serializer.py +4 -4
  30. package/autorest/codegen/serializers/general_serializer.py +26 -36
  31. package/autorest/codegen/serializers/import_serializer.py +30 -36
  32. package/autorest/codegen/serializers/metadata_serializer.py +35 -17
  33. package/autorest/codegen/serializers/model_init_serializer.py +6 -10
  34. package/autorest/codegen/serializers/model_serializer.py +42 -27
  35. package/autorest/codegen/serializers/operation_groups_serializer.py +12 -8
  36. package/autorest/codegen/serializers/operations_init_serializer.py +13 -6
  37. package/autorest/codegen/serializers/patch_serializer.py +4 -4
  38. package/autorest/codegen/serializers/request_builders_serializer.py +6 -6
  39. package/autorest/codegen/serializers/sample_serializer.py +10 -12
  40. package/autorest/codegen/templates/client_container.py.jinja2 +2 -2
  41. package/autorest/codegen/templates/config.py.jinja2 +1 -1
  42. package/autorest/codegen/templates/config_container.py.jinja2 +3 -3
  43. package/autorest/codegen/templates/enum_container.py.jinja2 +2 -2
  44. package/autorest/codegen/templates/init.py.jinja2 +2 -2
  45. package/autorest/codegen/templates/lro_operation.py.jinja2 +1 -1
  46. package/autorest/codegen/templates/lro_paging_operation.py.jinja2 +1 -1
  47. package/autorest/codegen/templates/metadata.json.jinja2 +2 -2
  48. package/autorest/codegen/templates/model_container.py.jinja2 +3 -3
  49. package/autorest/codegen/templates/model_dpg.py.jinja2 +4 -4
  50. package/autorest/codegen/templates/model_init.py.jinja2 +3 -3
  51. package/autorest/codegen/templates/operation.py.jinja2 +1 -1
  52. package/autorest/codegen/templates/operation_group.py.jinja2 +2 -2
  53. package/autorest/codegen/templates/operation_groups_container.py.jinja2 +3 -3
  54. package/autorest/codegen/templates/operation_tools.jinja2 +3 -3
  55. package/autorest/codegen/templates/operations_folder_init.py.jinja2 +4 -4
  56. package/autorest/codegen/templates/packaging_templates/setup.py.jinja2 +4 -1
  57. package/autorest/codegen/templates/paging_operation.py.jinja2 +1 -1
  58. package/autorest/codegen/templates/request_builder.py.jinja2 +1 -1
  59. package/autorest/codegen/templates/request_builders.py.jinja2 +2 -2
  60. package/autorest/codegen/templates/rest_init.py.jinja2 +1 -1
  61. package/autorest/codegen/templates/sample.py.jinja2 +5 -5
  62. package/autorest/codegen/templates/validation.py.jinja2 +1 -1
  63. package/autorest/codegen/templates/vendor.py.jinja2 +6 -6
  64. package/autorest/codegen/templates/version.py.jinja2 +2 -2
  65. package/autorest/m4reformatter/__init__.py +57 -47
  66. package/autorest/multiapi/models/imports.py +89 -18
  67. package/autorest/multiapi/serializers/import_serializer.py +88 -7
  68. package/autorest/multiapi/utils.py +6 -0
  69. package/autorest/preprocess/__init__.py +23 -26
  70. package/package.json +1 -1
  71. package/run_cadl.py +0 -1
  72. package/autorest/cadlflags/__init__.py +0 -130
  73. package/autorest/codegen/models/base_model.py +0 -30
@@ -39,7 +39,7 @@ from .model_type import ModelType
39
39
  from .request_builder import OverloadedRequestBuilder, RequestBuilder
40
40
 
41
41
  if TYPE_CHECKING:
42
- from .code_model import NamespaceModel
42
+ from .code_model import CodeModel
43
43
  from .client import Client
44
44
 
45
45
  ResponseType = TypeVar(
@@ -54,7 +54,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
54
54
  def __init__(
55
55
  self,
56
56
  yaml_data: Dict[str, Any],
57
- namespace_model: "NamespaceModel",
57
+ code_model: "CodeModel",
58
58
  client: "Client",
59
59
  name: str,
60
60
  request_builder: Union[RequestBuilder, OverloadedRequestBuilder],
@@ -67,7 +67,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
67
67
  want_tracing: bool = True,
68
68
  ) -> None:
69
69
  super().__init__(
70
- namespace_model=namespace_model,
70
+ code_model=code_model,
71
71
  client=client,
72
72
  yaml_data=yaml_data,
73
73
  name=name,
@@ -98,7 +98,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
98
98
 
99
99
  def response_type_annotation(self, **kwargs) -> str:
100
100
  if (
101
- self.namespace_model.options["head_as_boolean"]
101
+ self.code_model.options["head_as_boolean"]
102
102
  and self.request_builder.method.lower() == "head"
103
103
  ):
104
104
  return "bool"
@@ -127,7 +127,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
127
127
  def cls_type_annotation(self, *, async_mode: bool) -> str:
128
128
  if (
129
129
  self.request_builder.method.lower() == "head"
130
- and self.namespace_model.options["head_as_boolean"]
130
+ and self.code_model.options["head_as_boolean"]
131
131
  ):
132
132
  return "ClsType[None]"
133
133
  return f"ClsType[{self.response_type_annotation(async_mode=async_mode)}]"
@@ -136,7 +136,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
136
136
  responses_with_body = [r for r in self.responses if r.type]
137
137
  if (
138
138
  self.request_builder.method.lower() == "head"
139
- and self.namespace_model.options["head_as_boolean"]
139
+ and self.code_model.options["head_as_boolean"]
140
140
  ):
141
141
  return "bool"
142
142
  if responses_with_body:
@@ -154,9 +154,9 @@ class OperationBase( # pylint: disable=too-many-public-methods
154
154
 
155
155
  def response_docstring_text(self, **kwargs) -> str:
156
156
  retval = self._response_docstring_helper("docstring_text", **kwargs)
157
- if not self.namespace_model.options["version_tolerant"]:
157
+ if not self.code_model.options["version_tolerant"]:
158
158
  retval += " or the result of cls(response)"
159
- if self.namespace_model.options["models_mode"] == "dpg" and any(
159
+ if self.code_model.options["models_mode"] == "dpg" and any(
160
160
  isinstance(r.type, ModelType) for r in self.responses
161
161
  ):
162
162
  r = next(r for r in self.responses if isinstance(r.type, ModelType))
@@ -204,13 +204,13 @@ class OperationBase( # pylint: disable=too-many-public-methods
204
204
  )
205
205
  )
206
206
 
207
- def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport:
207
+ def _imports_shared(
208
+ self, async_mode: bool, **kwargs: Any # pylint: disable=unused-argument
209
+ ) -> FileImport:
208
210
  file_import = FileImport()
209
211
  file_import.add_submodule_import(
210
212
  "typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL
211
213
  )
212
- for param in self.parameters.method:
213
- file_import.merge(param.imports(async_mode, **kwargs))
214
214
 
215
215
  response_types = [
216
216
  r.type_annotation(async_mode=async_mode) for r in self.responses if r.type
@@ -231,11 +231,18 @@ class OperationBase( # pylint: disable=too-many-public-methods
231
231
  if self.abstract:
232
232
  return FileImport()
233
233
  file_import = self._imports_shared(async_mode, **kwargs)
234
+ for param in self.parameters.method:
235
+ file_import.merge(
236
+ param.imports_for_multiapi(
237
+ async_mode,
238
+ **kwargs,
239
+ )
240
+ )
234
241
  for response in self.responses:
235
242
  file_import.merge(
236
243
  response.imports_for_multiapi(async_mode=async_mode, **kwargs)
237
244
  )
238
- if self.namespace_model.options["models_mode"]:
245
+ if self.code_model.options["models_mode"]:
239
246
  for exception in self.exceptions:
240
247
  file_import.merge(
241
248
  exception.imports_for_multiapi(async_mode=async_mode, **kwargs)
@@ -272,12 +279,12 @@ class OperationBase( # pylint: disable=too-many-public-methods
272
279
  ) -> FileImport:
273
280
  """Helper method to get a request builder import."""
274
281
  file_import = FileImport()
275
- if self.namespace_model.options["builders_visibility"] != "embedded":
282
+ if self.code_model.options["builders_visibility"] != "embedded":
276
283
  group_name = request_builder.group_name
277
284
  rest_import_path = "..." if async_mode else ".."
278
285
  if group_name:
279
286
  file_import.add_submodule_import(
280
- f"{rest_import_path}{self.namespace_model.rest_layer_name}",
287
+ f"{rest_import_path}{self.code_model.rest_layer_name}",
281
288
  group_name,
282
289
  import_type=ImportType.LOCAL,
283
290
  alias=f"rest_{group_name}",
@@ -285,16 +292,13 @@ class OperationBase( # pylint: disable=too-many-public-methods
285
292
  else:
286
293
  file_import.add_submodule_import(
287
294
  rest_import_path,
288
- self.namespace_model.rest_layer_name,
295
+ self.code_model.rest_layer_name,
289
296
  import_type=ImportType.LOCAL,
290
297
  alias="rest",
291
298
  )
292
- if (
293
- self.namespace_model.options["builders_visibility"] == "embedded"
294
- and async_mode
295
- ):
299
+ if self.code_model.options["builders_visibility"] == "embedded" and async_mode:
296
300
  file_import.add_submodule_import(
297
- f"...{self.namespace_model.operations_folder_name}.{self.filename}",
301
+ f"...{self.code_model.operations_folder_name}.{self.filename}",
298
302
  request_builder.name,
299
303
  import_type=ImportType.LOCAL,
300
304
  )
@@ -305,9 +309,16 @@ class OperationBase( # pylint: disable=too-many-public-methods
305
309
  return FileImport()
306
310
  file_import = self._imports_shared(async_mode, **kwargs)
307
311
 
312
+ for param in self.parameters.method:
313
+ file_import.merge(
314
+ param.imports(
315
+ async_mode,
316
+ **kwargs,
317
+ )
318
+ )
308
319
  for response in self.responses:
309
320
  file_import.merge(response.imports(async_mode=async_mode, **kwargs))
310
- if self.namespace_model.options["models_mode"]:
321
+ if self.code_model.options["models_mode"]:
311
322
  for exception in self.exceptions:
312
323
  file_import.merge(exception.imports(async_mode=async_mode, **kwargs))
313
324
 
@@ -327,7 +338,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
327
338
  file_import.add_submodule_import(
328
339
  "azure.core.exceptions", error, ImportType.AZURECORE
329
340
  )
330
- if self.namespace_model.options["azure_arm"]:
341
+ if self.code_model.options["azure_arm"]:
331
342
  file_import.add_submodule_import(
332
343
  "azure.mgmt.core.exceptions", "ARMErrorFormat", ImportType.AZURECORE
333
344
  )
@@ -343,7 +354,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
343
354
  if self.deprecated:
344
355
  file_import.add_import("warnings", ImportType.STDLIB)
345
356
 
346
- if self.namespace_model.need_request_converter:
357
+ if self.code_model.need_request_converter:
347
358
  relative_path = "..." if async_mode else ".."
348
359
  file_import.add_submodule_import(
349
360
  f"{relative_path}_vendor", "_convert_request", ImportType.LOCAL
@@ -359,7 +370,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
359
370
  "azure.core.pipeline.transport", "HttpResponse", ImportType.AZURECORE
360
371
  )
361
372
  if (
362
- self.namespace_model.options["builders_visibility"] == "embedded"
373
+ self.code_model.options["builders_visibility"] == "embedded"
363
374
  and not async_mode
364
375
  ):
365
376
  file_import.merge(self.request_builder.imports())
@@ -381,11 +392,7 @@ class OperationBase( # pylint: disable=too-many-public-methods
381
392
  file_import.add_submodule_import(
382
393
  "typing", "TypeVar", ImportType.STDLIB, TypingSection.CONDITIONAL
383
394
  )
384
- if (
385
- self.namespace_model.options["tracing"]
386
- and self.want_tracing
387
- and not async_mode
388
- ):
395
+ if self.code_model.options["tracing"] and self.want_tracing and not async_mode:
389
396
  file_import.add_submodule_import(
390
397
  f"azure.core.tracing.decorator",
391
398
  f"distributed_trace",
@@ -418,11 +425,11 @@ class OperationBase( # pylint: disable=too-many-public-methods
418
425
  basename = self.group_name
419
426
  if basename == "":
420
427
  # in a mixin
421
- basename = self.namespace_model.clients[0].legacy_filename
428
+ basename = self.code_model.clients[0].legacy_filename
422
429
 
423
430
  if (
424
431
  basename == "operations"
425
- or self.namespace_model.options["combine_operation_files"]
432
+ or self.code_model.options["combine_operation_files"]
426
433
  ):
427
434
  return f"_operations"
428
435
  return f"_{basename}_operations"
@@ -435,27 +442,27 @@ class OperationBase( # pylint: disable=too-many-public-methods
435
442
  def from_yaml(
436
443
  cls,
437
444
  yaml_data: Dict[str, Any],
438
- namespace_model: "NamespaceModel",
445
+ code_model: "CodeModel",
439
446
  client: "Client",
440
447
  ):
441
448
  name = yaml_data["name"]
442
- request_builder = namespace_model.lookup_request_builder(id(yaml_data))
449
+ request_builder = client.lookup_request_builder(id(yaml_data))
443
450
  responses = [
444
- cast(ResponseType, get_response(r, namespace_model))
451
+ cast(ResponseType, get_response(r, code_model))
445
452
  for r in yaml_data["responses"]
446
453
  ]
447
454
  exceptions = [
448
- Response.from_yaml(e, namespace_model) for e in yaml_data["exceptions"]
455
+ Response.from_yaml(e, code_model) for e in yaml_data["exceptions"]
449
456
  ]
450
- parameter_list = ParameterList.from_yaml(yaml_data, namespace_model)
457
+ parameter_list = ParameterList.from_yaml(yaml_data, code_model)
451
458
  overloads = [
452
- cls.from_yaml(overload, namespace_model, client)
459
+ cls.from_yaml(overload, code_model, client)
453
460
  for overload in yaml_data.get("overloads", [])
454
461
  ]
455
462
 
456
463
  return cls(
457
464
  yaml_data=yaml_data,
458
- namespace_model=namespace_model,
465
+ code_model=code_model,
459
466
  client=client,
460
467
  request_builder=request_builder,
461
468
  name=name,
@@ -481,10 +488,10 @@ class Operation(OperationBase[Response]):
481
488
  if (
482
489
  self.has_response_body
483
490
  and not self.has_optional_return_type
484
- and not self.namespace_model.options["models_mode"]
491
+ and not self.code_model.options["models_mode"]
485
492
  ):
486
493
  file_import.add_submodule_import("typing", "cast", ImportType.STDLIB)
487
- if self.namespace_model.options["models_mode"] == "dpg":
494
+ if self.code_model.options["models_mode"] == "dpg":
488
495
  relative_path = "..." if async_mode else ".."
489
496
  if self.parameters.has_body:
490
497
  file_import.add_submodule_import(
@@ -502,7 +509,7 @@ class Operation(OperationBase[Response]):
502
509
 
503
510
 
504
511
  def get_operation(
505
- yaml_data: Dict[str, Any], namespace_model: "NamespaceModel", client: "Client"
512
+ yaml_data: Dict[str, Any], code_model: "CodeModel", client: "Client"
506
513
  ) -> OperationBase:
507
514
  if yaml_data["discriminator"] == "lropaging":
508
515
  from .lro_paging_operation import LROPagingOperation as OperationCls
@@ -512,4 +519,4 @@ def get_operation(
512
519
  from .paging_operation import PagingOperation as OperationCls # type: ignore
513
520
  else:
514
521
  from . import Operation as OperationCls # type: ignore
515
- return OperationCls.from_yaml(yaml_data, namespace_model, client)
522
+ return OperationCls.from_yaml(yaml_data, code_model, client)
@@ -7,13 +7,13 @@ from typing import Dict, List, Any, TYPE_CHECKING
7
7
 
8
8
  from autorest.codegen.models.utils import OrderedSet
9
9
 
10
- from .base_model import BaseModel
10
+ from .base import BaseModel
11
11
  from .operation import OperationBase, get_operation
12
12
  from .imports import FileImport, ImportType, TypingSection
13
13
  from .utils import add_to_pylint_disable
14
14
 
15
15
  if TYPE_CHECKING:
16
- from .code_model import NamespaceModel
16
+ from .code_model import CodeModel
17
17
  from .client import Client
18
18
 
19
19
 
@@ -23,12 +23,12 @@ class OperationGroup(BaseModel):
23
23
  def __init__(
24
24
  self,
25
25
  yaml_data: Dict[str, Any],
26
- namespace_model: "NamespaceModel",
26
+ code_model: "CodeModel",
27
27
  client: "Client",
28
28
  operations: List[OperationBase],
29
29
  api_versions: List[str],
30
30
  ) -> None:
31
- super().__init__(yaml_data, namespace_model)
31
+ super().__init__(yaml_data, code_model)
32
32
  self.client = client
33
33
  self.class_name: str = yaml_data["className"]
34
34
  self.property_name: str = yaml_data["propertyName"]
@@ -42,7 +42,7 @@ class OperationGroup(BaseModel):
42
42
  @property
43
43
  def base_class(self) -> str:
44
44
  base_classes: List[str] = []
45
- if self.is_mixin and self.namespace_model.need_mixin_abc:
45
+ if self.is_mixin and self.code_model.need_mixin_abc:
46
46
  base_classes.append(f"{self.client.name}MixinABC")
47
47
  return ", ".join(base_classes)
48
48
 
@@ -84,12 +84,12 @@ class OperationGroup(BaseModel):
84
84
  )
85
85
  # for multiapi
86
86
  if (
87
- self.namespace_model.model_types or self.namespace_model.enums
88
- ) and self.namespace_model.options["models_mode"] == "msrest":
87
+ self.code_model.model_types or self.code_model.enums
88
+ ) and self.code_model.options["models_mode"] == "msrest":
89
89
  file_import.add_submodule_import(
90
90
  relative_path, "models", ImportType.LOCAL, alias="_models"
91
91
  )
92
- if self.namespace_model.need_mixin_abc:
92
+ if self.code_model.need_mixin_abc:
93
93
  file_import.add_submodule_import(
94
94
  ".._vendor", f"{self.client.name}MixinABC", ImportType.LOCAL
95
95
  )
@@ -122,11 +122,11 @@ class OperationGroup(BaseModel):
122
122
  def from_yaml(
123
123
  cls,
124
124
  yaml_data: Dict[str, Any],
125
- namespace_model: "NamespaceModel",
125
+ code_model: "CodeModel",
126
126
  client: "Client",
127
127
  ) -> "OperationGroup":
128
128
  operations = [
129
- get_operation(o, namespace_model, client) for o in yaml_data["operations"]
129
+ get_operation(o, code_model, client) for o in yaml_data["operations"]
130
130
  ]
131
131
  api_versions: OrderedSet[str] = {}
132
132
  for operation in operations:
@@ -134,7 +134,7 @@ class OperationGroup(BaseModel):
134
134
  api_versions[api_version] = None
135
135
  return cls(
136
136
  yaml_data=yaml_data,
137
- namespace_model=namespace_model,
137
+ code_model=code_model,
138
138
  client=client,
139
139
  operations=operations,
140
140
  api_versions=list(api_versions.keys()),
@@ -17,7 +17,7 @@ from .parameter_list import ParameterList
17
17
  from .model_type import ModelType
18
18
 
19
19
  if TYPE_CHECKING:
20
- from .code_model import NamespaceModel
20
+ from .code_model import CodeModel
21
21
  from .client import Client
22
22
 
23
23
  PagingResponseType = TypeVar(
@@ -29,7 +29,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
29
29
  def __init__(
30
30
  self,
31
31
  yaml_data: Dict[str, Any],
32
- namespace_model: "NamespaceModel",
32
+ code_model: "CodeModel",
33
33
  client: "Client",
34
34
  name: str,
35
35
  request_builder: RequestBuilder,
@@ -43,7 +43,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
43
43
  override_success_response_to_200: bool = False,
44
44
  ) -> None:
45
45
  super().__init__(
46
- namespace_model=namespace_model,
46
+ code_model=code_model,
47
47
  client=client,
48
48
  yaml_data=yaml_data,
49
49
  name=name,
@@ -58,9 +58,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
58
58
  self.next_request_builder: Optional[
59
59
  Union[RequestBuilder, OverloadedRequestBuilder]
60
60
  ] = (
61
- get_request_builder(
62
- self.yaml_data["nextOperation"], namespace_model, client
63
- )
61
+ get_request_builder(self.yaml_data["nextOperation"], code_model, client)
64
62
  if self.yaml_data.get("nextOperation")
65
63
  else None
66
64
  )
@@ -90,14 +88,14 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
90
88
  if not rest_api_name:
91
89
  # That's an ok scenario, it just means no next page possible
92
90
  return None
93
- if self.namespace_model.options["models_mode"]:
91
+ if self.code_model.options["models_mode"]:
94
92
  return self._get_attr_name(rest_api_name)
95
93
  return rest_api_name
96
94
 
97
95
  @property
98
96
  def item_name(self) -> str:
99
97
  rest_api_name = self.yaml_data["itemName"]
100
- if self.namespace_model.options["models_mode"]:
98
+ if self.code_model.options["models_mode"]:
101
99
  return self._get_attr_name(rest_api_name)
102
100
  return rest_api_name
103
101
 
@@ -120,7 +118,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
120
118
  )
121
119
  if (
122
120
  self.next_request_builder
123
- and self.namespace_model.options["builders_visibility"] == "embedded"
121
+ and self.code_model.options["builders_visibility"] == "embedded"
124
122
  and not async_mode
125
123
  ):
126
124
  file_import.merge(self.next_request_builder.imports())
@@ -135,7 +133,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
135
133
  return FileImport()
136
134
  file_import = self._imports_shared(async_mode, **kwargs)
137
135
  file_import.merge(super().imports(async_mode, **kwargs))
138
- if self.namespace_model.options["tracing"] and self.want_tracing:
136
+ if self.code_model.options["tracing"] and self.want_tracing:
139
137
  file_import.add_submodule_import(
140
138
  "azure.core.tracing.decorator",
141
139
  "distributed_trace",
@@ -145,7 +143,7 @@ class PagingOperationBase(OperationBase[PagingResponseType]):
145
143
  file_import.merge(
146
144
  self.get_request_builder_import(self.next_request_builder, async_mode)
147
145
  )
148
- elif "api-version" in [p.rest_api_name for p in self.client.parameters]:
146
+ elif any(p.is_api_version for p in self.client.parameters):
149
147
  file_import.add_import("urllib.parse", ImportType.STDLIB)
150
148
  file_import.add_submodule_import(
151
149
  "azure.core.utils", "case_insensitive_dict", ImportType.AZURECORE
@@ -19,15 +19,15 @@ from typing import (
19
19
  )
20
20
 
21
21
  from .imports import FileImport, ImportType
22
- from .base_model import BaseModel
23
- from .base_type import BaseType
22
+ from .base import BaseModel
23
+ from .base import BaseType
24
24
  from .constant_type import ConstantType
25
25
  from .model_type import ModelType
26
26
  from .combined_type import CombinedType
27
27
  from .utils import add_to_description
28
28
 
29
29
  if TYPE_CHECKING:
30
- from .code_model import NamespaceModel
30
+ from .code_model import CodeModel
31
31
  from .request_builder_parameter import RequestBuilderBodyParameter
32
32
 
33
33
 
@@ -61,10 +61,10 @@ class _ParameterBase(
61
61
  def __init__(
62
62
  self,
63
63
  yaml_data: Dict[str, Any],
64
- namespace_model: "NamespaceModel",
64
+ code_model: "CodeModel",
65
65
  type: BaseType,
66
66
  ) -> None:
67
- super().__init__(yaml_data, namespace_model)
67
+ super().__init__(yaml_data, code_model)
68
68
  self.rest_api_name: str = yaml_data["restApiName"]
69
69
  self.client_name: str = self.yaml_data["clientName"]
70
70
  self.optional: bool = self.yaml_data["optional"]
@@ -86,6 +86,7 @@ class _ParameterBase(
86
86
  self.grouper: bool = self.yaml_data.get("grouper", False)
87
87
  self.check_client_input: bool = self.yaml_data.get("checkClientInput", False)
88
88
  self.added_on: Optional[str] = self.yaml_data.get("addedOn")
89
+ self.is_api_version: bool = self.yaml_data.get("isApiVersion", False)
89
90
 
90
91
  @property
91
92
  def constant(self) -> bool:
@@ -93,7 +94,9 @@ class _ParameterBase(
93
94
  Checking to see if it's required, because if not, we don't consider it
94
95
  a constant because it can have a value of None.
95
96
  """
96
- return not self.optional and isinstance(self.type, ConstantType)
97
+ return (not self.optional or self.is_api_version) and isinstance(
98
+ self.type, ConstantType
99
+ )
97
100
 
98
101
  @property
99
102
  def description(self) -> str:
@@ -149,11 +152,8 @@ class _ParameterBase(
149
152
  def serialization_type(self) -> str:
150
153
  return self.type.serialization_type
151
154
 
152
- def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
155
+ def _imports_shared(self, async_mode: bool, **_: Any) -> FileImport:
153
156
  file_import = FileImport()
154
- file_import.merge(
155
- self.type.imports(is_operation_file=True, async_mode=async_mode, **kwargs)
156
- )
157
157
  if self.optional and self.client_default_value is None:
158
158
  file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB)
159
159
  if self.added_on:
@@ -164,6 +164,22 @@ class _ParameterBase(
164
164
  )
165
165
  return file_import
166
166
 
167
+ def imports(self, async_mode: bool, **kwargs: Any) -> FileImport:
168
+ file_import = self._imports_shared(async_mode, **kwargs)
169
+ file_import.merge(
170
+ self.type.imports(is_operation_file=True, async_mode=async_mode, **kwargs)
171
+ )
172
+ return file_import
173
+
174
+ def imports_for_multiapi(self, async_mode: bool, **kwargs: Any) -> FileImport:
175
+ file_import = self._imports_shared(async_mode, **kwargs)
176
+ file_import.merge(
177
+ self.type.imports_for_multiapi(
178
+ is_operation_file=True, async_mode=async_mode, **kwargs
179
+ )
180
+ )
181
+ return file_import
182
+
167
183
  @property
168
184
  def method_location(self) -> ParameterMethodLocation:
169
185
  raise NotImplementedError("Please implement in children")
@@ -230,18 +246,18 @@ class BodyParameter(_BodyParameterBase):
230
246
 
231
247
  @classmethod
232
248
  def from_yaml(
233
- cls, yaml_data: Dict[str, Any], namespace_model: "NamespaceModel"
249
+ cls, yaml_data: Dict[str, Any], code_model: "CodeModel"
234
250
  ) -> "BodyParameter":
235
251
  return cls(
236
252
  yaml_data=yaml_data,
237
- namespace_model=namespace_model,
238
- type=namespace_model.lookup_type(id(yaml_data["type"])),
253
+ code_model=code_model,
254
+ type=code_model.lookup_type(id(yaml_data["type"])),
239
255
  )
240
256
 
241
257
  def type_annotation(self, **kwargs: Any) -> str:
242
258
  annotation = super().type_annotation(**kwargs)
243
259
  model_seq = BodyParameter.get_model_seq(self.type)
244
- if self.namespace_model.options["models_mode"] == "dpg" and model_seq >= 0:
260
+ if self.code_model.options["models_mode"] == "dpg" and model_seq >= 0:
245
261
  pattern = re.compile(r"Union\[.*\]")
246
262
  union_content = (
247
263
  annotation[6:-1] if pattern.match(annotation) else annotation
@@ -254,7 +270,7 @@ class BodyParameter(_BodyParameterBase):
254
270
  def docstring_type(self, **kwargs: Any) -> str:
255
271
  docstring = super().docstring_type(**kwargs)
256
272
  model_seq = BodyParameter.get_model_seq(self.type)
257
- if self.namespace_model.options["models_mode"] == "dpg" and model_seq >= 0:
273
+ if self.code_model.options["models_mode"] == "dpg" and model_seq >= 0:
258
274
  items = docstring.split(" or ")
259
275
  items.insert(model_seq + 1, "JSON")
260
276
  docstring = " or ".join(items)
@@ -284,11 +300,11 @@ class _MultipartBodyParameter(Generic[EntryBodyParameterType], BodyParameter):
284
300
  def __init__(
285
301
  self,
286
302
  yaml_data: Dict[str, Any],
287
- namespace_model: "NamespaceModel",
303
+ code_model: "CodeModel",
288
304
  type: BaseType,
289
305
  entries: List[EntryBodyParameterType],
290
306
  ) -> None:
291
- super().__init__(yaml_data, namespace_model, type)
307
+ super().__init__(yaml_data, code_model, type)
292
308
  self.entries = entries
293
309
 
294
310
  @property
@@ -305,14 +321,14 @@ class MultipartBodyParameter(
305
321
 
306
322
  @classmethod
307
323
  def from_yaml(
308
- cls, yaml_data: Dict[str, Any], namespace_model: "NamespaceModel"
324
+ cls, yaml_data: Dict[str, Any], code_model: "CodeModel"
309
325
  ) -> "MultipartBodyParameter":
310
326
  return cls(
311
327
  yaml_data=yaml_data,
312
- namespace_model=namespace_model,
313
- type=namespace_model.lookup_type(id(yaml_data["type"])),
328
+ code_model=code_model,
329
+ type=code_model.lookup_type(id(yaml_data["type"])),
314
330
  entries=[
315
- BodyParameter.from_yaml(entry, namespace_model)
331
+ BodyParameter.from_yaml(entry, code_model)
316
332
  for entry in yaml_data["entries"]
317
333
  ],
318
334
  )
@@ -324,10 +340,10 @@ class Parameter(_ParameterBase):
324
340
  def __init__(
325
341
  self,
326
342
  yaml_data: Dict[str, Any],
327
- namespace_model: "NamespaceModel",
343
+ code_model: "CodeModel",
328
344
  type: BaseType,
329
345
  ) -> None:
330
- super().__init__(yaml_data, namespace_model, type=type)
346
+ super().__init__(yaml_data, code_model, type=type)
331
347
 
332
348
  self.implementation: str = yaml_data["implementation"]
333
349
  self.skip_url_encoding: bool = self.yaml_data.get("skipUrlEncoding", False)
@@ -371,18 +387,18 @@ class Parameter(_ParameterBase):
371
387
  ParameterLocation.QUERY,
372
388
  )
373
389
  if (
374
- self.namespace_model.options["only_path_and_body_params_positional"]
390
+ self.code_model.options["only_path_and_body_params_positional"]
375
391
  and query_or_header
376
392
  ):
377
393
  return ParameterMethodLocation.KEYWORD_ONLY
378
394
  return ParameterMethodLocation.POSITIONAL
379
395
 
380
396
  @classmethod
381
- def from_yaml(cls, yaml_data: Dict[str, Any], namespace_model: "NamespaceModel"):
397
+ def from_yaml(cls, yaml_data: Dict[str, Any], code_model: "CodeModel"):
382
398
  return cls(
383
399
  yaml_data=yaml_data,
384
- namespace_model=namespace_model,
385
- type=namespace_model.lookup_type(id(yaml_data["type"])),
400
+ code_model=code_model,
401
+ type=code_model.lookup_type(id(yaml_data["type"])),
386
402
  )
387
403
 
388
404
 
@@ -398,8 +414,8 @@ class ClientParameter(Parameter):
398
414
  if self.constant:
399
415
  return ParameterMethodLocation.KWARG
400
416
  if self.is_host and (
401
- self.namespace_model.options["version_tolerant"]
402
- or self.namespace_model.options["low_level_client"]
417
+ self.code_model.options["version_tolerant"]
418
+ or self.code_model.options["low_level_client"]
403
419
  ):
404
420
  # this means i am the base url
405
421
  return ParameterMethodLocation.KEYWORD_ONLY
@@ -425,9 +441,9 @@ class ConfigParameter(Parameter):
425
441
 
426
442
 
427
443
  def get_body_parameter(
428
- yaml_data: Dict[str, Any], namespace_model: "NamespaceModel"
444
+ yaml_data: Dict[str, Any], code_model: "CodeModel"
429
445
  ) -> Union[BodyParameter, MultipartBodyParameter]:
430
446
  """Creates a regular body parameter or Multipart body parameter"""
431
447
  if yaml_data.get("entries"):
432
- return MultipartBodyParameter.from_yaml(yaml_data, namespace_model)
433
- return BodyParameter.from_yaml(yaml_data, namespace_model)
448
+ return MultipartBodyParameter.from_yaml(yaml_data, code_model)
449
+ return BodyParameter.from_yaml(yaml_data, code_model)