@typespec/http-client-python 0.5.1 → 0.6.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 (143) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +10 -7
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/emitter.d.ts.map +1 -1
  5. package/dist/emitter/emitter.js +4 -1
  6. package/dist/emitter/emitter.js.map +1 -1
  7. package/dist/emitter/lib.d.ts +1 -0
  8. package/dist/emitter/lib.d.ts.map +1 -1
  9. package/dist/emitter/lib.js +1 -0
  10. package/dist/emitter/lib.js.map +1 -1
  11. package/dist/emitter/types.d.ts.map +1 -1
  12. package/dist/emitter/types.js +7 -4
  13. package/dist/emitter/types.js.map +1 -1
  14. package/dist/emitter/utils.d.ts +1 -0
  15. package/dist/emitter/utils.d.ts.map +1 -1
  16. package/dist/emitter/utils.js +19 -0
  17. package/dist/emitter/utils.js.map +1 -1
  18. package/emitter/src/code-model.ts +16 -6
  19. package/emitter/src/emitter.ts +4 -1
  20. package/emitter/src/lib.ts +4 -0
  21. package/emitter/src/types.ts +16 -4
  22. package/emitter/src/utils.ts +27 -0
  23. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  24. package/eng/scripts/ci/regenerate.ts +7 -0
  25. package/eng/scripts/setup/__pycache__/venvtools.cpython-38.pyc +0 -0
  26. package/generator/build/lib/pygen/black.py +2 -2
  27. package/generator/build/lib/pygen/codegen/__init__.py +2 -0
  28. package/generator/build/lib/pygen/codegen/_utils.py +4 -0
  29. package/generator/build/lib/pygen/codegen/models/base.py +2 -3
  30. package/generator/build/lib/pygen/codegen/models/base_builder.py +5 -3
  31. package/generator/build/lib/pygen/codegen/models/client.py +28 -19
  32. package/generator/build/lib/pygen/codegen/models/code_model.py +200 -33
  33. package/generator/build/lib/pygen/codegen/models/combined_type.py +8 -5
  34. package/generator/build/lib/pygen/codegen/models/constant_type.py +2 -3
  35. package/generator/build/lib/pygen/codegen/models/credential_types.py +1 -2
  36. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +2 -3
  37. package/generator/build/lib/pygen/codegen/models/enum_type.py +47 -24
  38. package/generator/build/lib/pygen/codegen/models/imports.py +14 -12
  39. package/generator/build/lib/pygen/codegen/models/list_type.py +2 -3
  40. package/generator/build/lib/pygen/codegen/models/lro_operation.py +8 -4
  41. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
  42. package/generator/build/lib/pygen/codegen/models/model_type.py +34 -19
  43. package/generator/build/lib/pygen/codegen/models/operation.py +66 -29
  44. package/generator/build/lib/pygen/codegen/models/operation_group.py +56 -11
  45. package/generator/build/lib/pygen/codegen/models/paging_operation.py +9 -6
  46. package/generator/build/lib/pygen/codegen/models/parameter.py +10 -10
  47. package/generator/build/lib/pygen/codegen/models/parameter_list.py +7 -7
  48. package/generator/build/lib/pygen/codegen/models/primitive_types.py +23 -43
  49. package/generator/build/lib/pygen/codegen/models/property.py +7 -7
  50. package/generator/build/lib/pygen/codegen/models/request_builder.py +9 -15
  51. package/generator/build/lib/pygen/codegen/models/response.py +6 -8
  52. package/generator/build/lib/pygen/codegen/models/utils.py +11 -0
  53. package/generator/build/lib/pygen/codegen/serializers/__init__.py +201 -242
  54. package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +19 -1
  55. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +53 -35
  56. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +9 -5
  57. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +17 -3
  58. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +26 -14
  59. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +26 -8
  60. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +9 -4
  61. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +62 -22
  62. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
  63. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  64. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +10 -7
  65. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  66. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +7 -10
  67. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +24 -28
  68. package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +6 -1
  69. package/generator/build/lib/pygen/codegen/serializers/utils.py +1 -15
  70. package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  71. package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  72. package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  73. package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +1 -1
  74. package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  75. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  76. package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +3 -3
  77. package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  78. package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  79. package/generator/build/lib/pygen/preprocess/__init__.py +0 -4
  80. package/generator/dev_requirements.txt +2 -2
  81. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  82. package/generator/pygen/black.py +2 -2
  83. package/generator/pygen/codegen/__init__.py +2 -0
  84. package/generator/pygen/codegen/_utils.py +4 -0
  85. package/generator/pygen/codegen/models/base.py +2 -3
  86. package/generator/pygen/codegen/models/base_builder.py +5 -3
  87. package/generator/pygen/codegen/models/client.py +28 -19
  88. package/generator/pygen/codegen/models/code_model.py +200 -33
  89. package/generator/pygen/codegen/models/combined_type.py +8 -5
  90. package/generator/pygen/codegen/models/constant_type.py +2 -3
  91. package/generator/pygen/codegen/models/credential_types.py +1 -2
  92. package/generator/pygen/codegen/models/dictionary_type.py +2 -3
  93. package/generator/pygen/codegen/models/enum_type.py +47 -24
  94. package/generator/pygen/codegen/models/imports.py +14 -12
  95. package/generator/pygen/codegen/models/list_type.py +2 -3
  96. package/generator/pygen/codegen/models/lro_operation.py +8 -4
  97. package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
  98. package/generator/pygen/codegen/models/model_type.py +34 -19
  99. package/generator/pygen/codegen/models/operation.py +66 -29
  100. package/generator/pygen/codegen/models/operation_group.py +56 -11
  101. package/generator/pygen/codegen/models/paging_operation.py +9 -6
  102. package/generator/pygen/codegen/models/parameter.py +10 -10
  103. package/generator/pygen/codegen/models/parameter_list.py +7 -7
  104. package/generator/pygen/codegen/models/primitive_types.py +23 -43
  105. package/generator/pygen/codegen/models/property.py +7 -7
  106. package/generator/pygen/codegen/models/request_builder.py +9 -15
  107. package/generator/pygen/codegen/models/response.py +6 -8
  108. package/generator/pygen/codegen/models/utils.py +11 -0
  109. package/generator/pygen/codegen/serializers/__init__.py +201 -242
  110. package/generator/pygen/codegen/serializers/base_serializer.py +19 -1
  111. package/generator/pygen/codegen/serializers/builder_serializer.py +53 -35
  112. package/generator/pygen/codegen/serializers/client_serializer.py +9 -5
  113. package/generator/pygen/codegen/serializers/enum_serializer.py +17 -3
  114. package/generator/pygen/codegen/serializers/general_serializer.py +26 -14
  115. package/generator/pygen/codegen/serializers/metadata_serializer.py +26 -8
  116. package/generator/pygen/codegen/serializers/model_init_serializer.py +9 -4
  117. package/generator/pygen/codegen/serializers/model_serializer.py +62 -22
  118. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +19 -16
  119. package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  120. package/generator/pygen/codegen/serializers/parameter_serializer.py +10 -7
  121. package/generator/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  122. package/generator/pygen/codegen/serializers/sample_serializer.py +7 -10
  123. package/generator/pygen/codegen/serializers/test_serializer.py +24 -28
  124. package/generator/pygen/codegen/serializers/types_serializer.py +6 -1
  125. package/generator/pygen/codegen/serializers/utils.py +1 -15
  126. package/generator/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  127. package/generator/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  128. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  129. package/generator/pygen/codegen/templates/init.py.jinja2 +1 -1
  130. package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  131. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  132. package/generator/pygen/codegen/templates/test.py.jinja2 +3 -3
  133. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  134. package/generator/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  135. package/generator/pygen/preprocess/__init__.py +0 -4
  136. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +31 -0
  137. package/generator/test/azure/mock_api_tests/test_client_namespace.py +29 -0
  138. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven_async.py +1 -0
  139. package/generator/test/azure/requirements.txt +3 -2
  140. package/generator/test/azure/tox.ini +2 -2
  141. package/generator/test/unbranded/requirements.txt +2 -2
  142. package/generator/test/unbranded/tox.ini +2 -2
  143. package/package.json +1 -1
@@ -5,6 +5,6 @@
5
5
  from enum import Enum
6
6
  from {{ code_model.core_library }}{{ "" if code_model.is_azure_flavor else ".utils" }} import CaseInsensitiveEnumMeta
7
7
 
8
- {% for enum in code_model.enums | sort %}
8
+ {% for enum in enums | sort %}
9
9
  {% include "enum.py.jinja2" %}
10
10
  {% endfor %}
@@ -8,7 +8,7 @@ from .{{ client.filename }} import {{ client.name }} # type: ignore
8
8
  {% endfor %}
9
9
  {% endif %}
10
10
  {% if not async_mode and code_model.options['package_version']%}
11
- from ._version import VERSION
11
+ from {{ code_model.get_relative_import_path(serialize_namespace, module_name="_version") }} import VERSION
12
12
 
13
13
  __version__ = VERSION
14
14
  {% endif %}
@@ -6,7 +6,7 @@
6
6
  {% endif %}
7
7
 
8
8
  {{ imports }}
9
- {% for model in code_model.model_types %}
9
+ {% for model in models %}
10
10
  {% if model.base == "dpg" %}
11
11
  {% include "model_dpg.py.jinja2" %}
12
12
  {% elif model.base == "msrest" %}
@@ -7,11 +7,9 @@
7
7
  {{ op_tools.serialize(operation_group_imports()) }}
8
8
  {{ keywords.patch_imports() }}
9
9
  __all__ = [
10
- {% for client in clients %}
11
- {% for operation_group in client.operation_groups %}
10
+ {% for operation_group in operation_groups %}
12
11
  '{{ operation_group.class_name }}',
13
- {% endfor %}
14
- {% endfor %}
12
+ {% endfor %}
15
13
  ]
16
14
  {{ keywords.extend_all }}
17
15
  _patch_sdk()
@@ -1,7 +1,7 @@
1
1
  {% set prefix_lower = test.prefix|lower %}
2
2
  {% set client_var = "self.client" if code_model.options["azure_arm"] else "client" %}
3
- {% set async = "async " if test.is_async else "" %}
4
- {% set async_suffix = "_async" if test.is_async else "" %}
3
+ {% set async = "async " if test.async_mode else "" %}
4
+ {% set async_suffix = "_async" if test.async_mode else "" %}
5
5
  # coding=utf-8
6
6
  {{ code_model.options['license_header'] }}
7
7
  import pytest
@@ -15,7 +15,7 @@ AZURE_LOCATION = "eastus"
15
15
  class {{ test.test_class_name }}({{ test.base_test_class_name }}):
16
16
  {% if code_model.options["azure_arm"] %}
17
17
  def setup_method(self, method):
18
- {% if test.is_async %}
18
+ {% if test.async_mode %}
19
19
  self.client = self.create_mgmt_client({{ test.client_name }}, is_async=True)
20
20
  {% else %}
21
21
  self.client = self.create_mgmt_client({{ test.client_name }})
@@ -3,7 +3,7 @@
3
3
  {{ imports }}
4
4
 
5
5
  {% for test_name in test_names %}
6
- {% set extra_async = ", is_async=True" if test_name.is_async else ""%}
6
+ {% set extra_async = ", is_async=True" if test_name.async_mode else ""%}
7
7
  {% set prefix_lower = test_name.prefix|lower %}
8
8
  class {{ test_name.base_test_class_name }}(AzureRecordedTestCase):
9
9
 
@@ -15,7 +15,7 @@ class {{ test_name.base_test_class_name }}(AzureRecordedTestCase):
15
15
  endpoint=endpoint,
16
16
  )
17
17
 
18
- {% if not test_name.is_async %}
18
+ {% if not test_name.async_mode %}
19
19
  {{ test_name.preparer_name }} = functools.partial(
20
20
  PowerShellPreparer,
21
21
  "{{ prefix_lower }}",
@@ -3,7 +3,7 @@
3
3
 
4
4
  {{ imports }}
5
5
 
6
- {% if code_model.need_mixin_abc %}
6
+ {% if code_model.need_vendored_mixin(client_namespace) %}
7
7
  {% for client in clients | selectattr("has_mixin") %}
8
8
  {% set pylint_disable = "# pylint: disable=name-too-long" if (client.name | length) + ("MixinABC" | length) > 40 else "" %}
9
9
  class {{ client.name }}MixinABC( {{ pylint_disable }}
@@ -16,7 +16,7 @@ class {{ client.name }}MixinABC( {{ pylint_disable }}
16
16
  _deserialize: "Deserializer"
17
17
  {% endfor %}
18
18
  {% endif %}
19
- {% if code_model.has_abstract_operations %}
19
+ {% if code_model.need_vendored_abstract(client_namespace) %}
20
20
 
21
21
  def raise_if_not_implemented(cls, abstract_methods):
22
22
  not_implemented = [f for f in abstract_methods if not callable(getattr(cls, f, None))]
@@ -27,7 +27,7 @@ def raise_if_not_implemented(cls, abstract_methods):
27
27
  )
28
28
  {% endif %}
29
29
 
30
- {% if code_model.has_etag %}
30
+ {% if code_model.need_vendored_etag(client_namespace) %}
31
31
  def quote_etag(etag: Optional[str]) -> Optional[str]:
32
32
  if not etag or etag == "*":
33
33
  return etag
@@ -57,7 +57,7 @@ def prep_if_none_match(etag: Optional[str], match_condition: Optional[MatchCondi
57
57
  return "*"
58
58
  return None
59
59
  {% endif %}
60
- {% if code_model.has_form_data and code_model.options["models_mode"] == "dpg" and not async_mode %}
60
+ {% if code_model.need_vendored_form_data(async_mode, client_namespace) %}
61
61
  # file-like tuple could be `(filename, IO (or bytes))` or `(filename, IO (or bytes), content_type)`
62
62
  FileContent = Union[str, bytes, IO[str], IO[bytes]]
63
63
 
@@ -501,10 +501,6 @@ class PreProcessPlugin(YamlUpdatePlugin):
501
501
  for client in yaml_data["clients"]:
502
502
  self.update_client(client)
503
503
  self.update_operation_groups(yaml_data, client)
504
- for clients in yaml_data["subnamespaceToClients"].values():
505
- for client in clients:
506
- self.update_client(client)
507
- self.update_operation_groups(yaml_data, client)
508
504
  if yaml_data.get("namespace"):
509
505
  yaml_data["namespace"] = pad_builtin_namespaces(yaml_data["namespace"])
510
506
 
@@ -1,8 +1,8 @@
1
1
  -e ./generator
2
- pyright==1.1.389
2
+ pyright==1.1.391
3
3
  pylint==3.2.7
4
4
  tox==4.16.0
5
- mypy==1.13.0
5
+ mypy==1.14.1
6
6
  colorama==0.4.6
7
7
  debugpy==1.8.2
8
8
  pytest==8.3.2
@@ -43,8 +43,8 @@ class BlackScriptPlugin(Plugin):
43
43
  "venv",
44
44
  "env",
45
45
  )
46
- and not Path(f).parts[0].startswith(".")
47
- and Path(f).suffix == ".py"
46
+ # we shall also format generated files like "../../../generated_tests/test_xxx.py"
47
+ and (not Path(f).parts[0].startswith(".") or Path(f).parts[0] == "..") and Path(f).suffix == ".py"
48
48
  ],
49
49
  )
50
50
  )
@@ -40,6 +40,7 @@ class OptionsRetriever:
40
40
  "generate-test": False,
41
41
  "from-typespec": False,
42
42
  "emit-cross-language-definition-file": False,
43
+ "enable-typespec-namespace": False,
43
44
  }
44
45
 
45
46
  @property
@@ -316,6 +317,7 @@ class CodeGenerator(Plugin):
316
317
  "flavor",
317
318
  "company_name",
318
319
  "emit_cross_language_definition_file",
320
+ "enable_typespec_namespace",
319
321
  ]
320
322
  return {f: getattr(self.options_retriever, f) for f in flags}
321
323
 
@@ -15,3 +15,7 @@ SWAGGER_PACKAGE_MODE = ["mgmtplane", "dataplane"] # for backward compatibility
15
15
  TYPESPEC_PACKAGE_MODE = ["azure-mgmt", "azure-dataplane", "generic"]
16
16
  VALID_PACKAGE_MODE = SWAGGER_PACKAGE_MODE + TYPESPEC_PACKAGE_MODE
17
17
  NAME_LENGTH_LIMIT = 40
18
+
19
+
20
+ def get_parent_namespace(namespace: str) -> str:
21
+ return namespace.rsplit(".", 1)[0]
@@ -87,8 +87,7 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
87
87
  attrs_list.append("'text': True")
88
88
  return ", ".join(attrs_list)
89
89
 
90
- @property
91
- def serialization_type(self) -> str:
90
+ def serialization_type(self, **kwargs: Any) -> str:
92
91
  """The tag recognized by 'msrest' as a serialization/deserialization.
93
92
 
94
93
  'str', 'int', 'float', 'bool' or
@@ -103,7 +102,7 @@ class BaseType(BaseModel, ABC): # pylint: disable=too-many-public-methods
103
102
 
104
103
  @property
105
104
  def msrest_deserialization_key(self) -> str:
106
- return self.serialization_type
105
+ return self.serialization_type()
107
106
 
108
107
  @property
109
108
  def client_default_value(self) -> Any:
@@ -14,6 +14,7 @@ from typing import (
14
14
  Union,
15
15
  TYPE_CHECKING,
16
16
  cast,
17
+ Sequence,
17
18
  )
18
19
  from abc import abstractmethod
19
20
 
@@ -39,7 +40,7 @@ if TYPE_CHECKING:
39
40
  from .request_builder import RequestBuilder
40
41
 
41
42
 
42
- OverloadListType = TypeVar("OverloadListType", bound=Union[List["Operation"], List["RequestBuilder"]])
43
+ OverloadListType = TypeVar("OverloadListType", bound=Union[Sequence["Operation"], Sequence["RequestBuilder"]])
43
44
 
44
45
  _LOGGER = logging.getLogger(__name__)
45
46
 
@@ -72,6 +73,7 @@ class BaseBuilder(
72
73
  self.api_versions: List[str] = yaml_data["apiVersions"]
73
74
  self.added_on: Optional[str] = yaml_data.get("addedOn")
74
75
  self.external_docs: Optional[Dict[str, Any]] = yaml_data.get("externalDocs")
76
+ self.client_namespace: str = yaml_data.get("clientNamespace", code_model.namespace)
75
77
 
76
78
  if code_model.options["version_tolerant"] and yaml_data.get("abstract"):
77
79
  _LOGGER.warning(
@@ -112,7 +114,7 @@ class BaseBuilder(
112
114
  )
113
115
  return self._description or self.name
114
116
 
115
- def method_signature(self, async_mode: bool) -> List[str]:
117
+ def method_signature(self, async_mode: bool, **kwargs: Any) -> List[str]:
116
118
  if self.abstract:
117
119
  return ["*args,", "**kwargs"]
118
- return self.parameters.method_signature(async_mode)
120
+ return self.parameters.method_signature(async_mode, **kwargs)
@@ -43,6 +43,7 @@ class _ClientConfigBase(Generic[ParameterListType], BaseModel):
43
43
  self.parameters = parameters
44
44
  self.url: str = self.yaml_data["url"] # the base endpoint of the client. Can be parameterized or not
45
45
  self.legacy_filename: str = self.yaml_data.get("legacyFilename", "client")
46
+ self.client_namespace: str = self.yaml_data.get("clientNamespace", code_model.namespace)
46
47
 
47
48
  @property
48
49
  def description(self) -> str:
@@ -188,7 +189,7 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
188
189
  except StopIteration as exc:
189
190
  raise KeyError(f"No operation with id {operation_id} found.") from exc
190
191
 
191
- def _imports_shared(self, async_mode: bool) -> FileImport:
192
+ def _imports_shared(self, async_mode: bool, **kwargs) -> FileImport:
192
193
  file_import = FileImport(self.code_model)
193
194
  file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
194
195
  if self.code_model.options["azure_arm"]:
@@ -206,8 +207,8 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
206
207
  file_import.merge(
207
208
  gp.imports(
208
209
  async_mode,
209
- relative_path=".." if async_mode else ".",
210
- operation=True,
210
+ is_operation_file=True,
211
+ **kwargs,
211
212
  )
212
213
  )
213
214
  file_import.add_submodule_import(
@@ -215,8 +216,9 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
215
216
  f"{self.name}Configuration",
216
217
  ImportType.LOCAL,
217
218
  )
219
+ serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
218
220
  file_import.add_msrest_import(
219
- relative_path=".." if async_mode else ".",
221
+ serialize_namespace=serialize_namespace,
220
222
  msrest_import_type=MsrestImportType.SerializerDeserializer,
221
223
  typing_section=TypingSection.REGULAR,
222
224
  )
@@ -277,8 +279,8 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
277
279
  """Whether there is non-abstract operation in any operation group."""
278
280
  return any(og.has_non_abstract_operations for og in self.operation_groups)
279
281
 
280
- def imports(self, async_mode: bool) -> FileImport:
281
- file_import = self._imports_shared(async_mode)
282
+ def imports(self, async_mode: bool, **kwargs) -> FileImport:
283
+ file_import = self._imports_shared(async_mode, **kwargs)
282
284
  if async_mode:
283
285
  file_import.add_submodule_import("typing", "Awaitable", ImportType.STDLIB)
284
286
  file_import.add_submodule_import(
@@ -300,9 +302,13 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
300
302
  ImportType.SDKCORE,
301
303
  TypingSection.CONDITIONAL,
302
304
  )
305
+ serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
303
306
  for og in self.operation_groups:
304
307
  file_import.add_submodule_import(
305
- f".{self.code_model.operations_folder_name}",
308
+ self.code_model.get_relative_import_path(
309
+ serialize_namespace,
310
+ self.code_model.get_imported_namespace_for_operation(og.client_namespace, async_mode),
311
+ ),
306
312
  og.class_name,
307
313
  ImportType.LOCAL,
308
314
  )
@@ -317,8 +323,8 @@ class Client(_ClientConfigBase[ClientGlobalParameterList]):
317
323
  file_import.add_submodule_import("copy", "deepcopy", ImportType.STDLIB)
318
324
  return file_import
319
325
 
320
- def imports_for_multiapi(self, async_mode: bool) -> FileImport:
321
- file_import = self._imports_shared(async_mode)
326
+ def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport:
327
+ file_import = self._imports_shared(async_mode, **kwargs)
322
328
  file_import.add_submodule_import("typing", "Optional", ImportType.STDLIB, TypingSection.CONDITIONAL)
323
329
  try:
324
330
  mixin_operation = next(og for og in self.operation_groups if og.is_mixin)
@@ -377,7 +383,7 @@ class Config(_ClientConfigBase[ConfigGlobalParameterList]):
377
383
  def name(self) -> str:
378
384
  return f"{super().name}Configuration"
379
385
 
380
- def _imports_shared(self, async_mode: bool) -> FileImport:
386
+ def _imports_shared(self, async_mode: bool, **kwargs: Any) -> FileImport:
381
387
  file_import = FileImport(self.code_model)
382
388
  file_import.add_submodule_import(
383
389
  "pipeline" if self.code_model.is_azure_flavor else "runtime",
@@ -386,7 +392,12 @@ class Config(_ClientConfigBase[ConfigGlobalParameterList]):
386
392
  )
387
393
  file_import.add_submodule_import("typing", "Any", ImportType.STDLIB, TypingSection.CONDITIONAL)
388
394
  if self.code_model.options["package_version"]:
389
- file_import.add_submodule_import(".._version" if async_mode else "._version", "VERSION", ImportType.LOCAL)
395
+ serialize_namespace = kwargs.get("serialize_namespace", self.code_model.namespace)
396
+ file_import.add_submodule_import(
397
+ self.code_model.get_relative_import_path(serialize_namespace, module_name="_version"),
398
+ "VERSION",
399
+ ImportType.LOCAL,
400
+ )
390
401
  if self.code_model.options["azure_arm"]:
391
402
  policy = "AsyncARMChallengeAuthenticationPolicy" if async_mode else "ARMChallengeAuthenticationPolicy"
392
403
  file_import.add_submodule_import("azure.mgmt.core.policies", "ARMHttpLoggingPolicy", ImportType.SDKCORE)
@@ -394,22 +405,21 @@ class Config(_ClientConfigBase[ConfigGlobalParameterList]):
394
405
 
395
406
  return file_import
396
407
 
397
- def imports(self, async_mode: bool) -> FileImport:
398
- file_import = self._imports_shared(async_mode)
408
+ def imports(self, async_mode: bool, **kwargs) -> FileImport:
409
+ file_import = self._imports_shared(async_mode, **kwargs)
399
410
  for gp in self.parameters:
400
411
  if gp.method_location == ParameterMethodLocation.KWARG and gp not in self.parameters.kwargs_to_pop:
401
412
  continue
402
413
  file_import.merge(
403
414
  gp.imports(
404
415
  async_mode=async_mode,
405
- relative_path=".." if async_mode else ".",
406
- operation=True,
416
+ **kwargs,
407
417
  )
408
418
  )
409
419
  return file_import
410
420
 
411
- def imports_for_multiapi(self, async_mode: bool) -> FileImport:
412
- file_import = self._imports_shared(async_mode)
421
+ def imports_for_multiapi(self, async_mode: bool, **kwargs: Any) -> FileImport:
422
+ file_import = self._imports_shared(async_mode, **kwargs)
413
423
  for gp in self.parameters:
414
424
  if (
415
425
  gp.method_location == ParameterMethodLocation.KWARG
@@ -420,8 +430,7 @@ class Config(_ClientConfigBase[ConfigGlobalParameterList]):
420
430
  file_import.merge(
421
431
  gp.imports_for_multiapi(
422
432
  async_mode=async_mode,
423
- relative_path=".." if async_mode else ".",
424
- operation=True,
433
+ **kwargs,
425
434
  )
426
435
  )
427
436
  return file_import