@autorest/python 6.27.4 → 6.28.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 (120) hide show
  1. package/generator/build/lib/pygen/black.py +3 -3
  2. package/generator/build/lib/pygen/codegen/__init__.py +2 -0
  3. package/generator/build/lib/pygen/codegen/_utils.py +4 -0
  4. package/generator/build/lib/pygen/codegen/models/base.py +2 -3
  5. package/generator/build/lib/pygen/codegen/models/base_builder.py +5 -3
  6. package/generator/build/lib/pygen/codegen/models/client.py +28 -19
  7. package/generator/build/lib/pygen/codegen/models/code_model.py +204 -33
  8. package/generator/build/lib/pygen/codegen/models/combined_type.py +12 -8
  9. package/generator/build/lib/pygen/codegen/models/constant_type.py +2 -3
  10. package/generator/build/lib/pygen/codegen/models/credential_types.py +6 -3
  11. package/generator/build/lib/pygen/codegen/models/dictionary_type.py +2 -3
  12. package/generator/build/lib/pygen/codegen/models/enum_type.py +47 -24
  13. package/generator/build/lib/pygen/codegen/models/imports.py +14 -12
  14. package/generator/build/lib/pygen/codegen/models/list_type.py +2 -3
  15. package/generator/build/lib/pygen/codegen/models/lro_operation.py +8 -4
  16. package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
  17. package/generator/build/lib/pygen/codegen/models/model_type.py +34 -19
  18. package/generator/build/lib/pygen/codegen/models/operation.py +74 -31
  19. package/generator/build/lib/pygen/codegen/models/operation_group.py +82 -12
  20. package/generator/build/lib/pygen/codegen/models/paging_operation.py +10 -7
  21. package/generator/build/lib/pygen/codegen/models/parameter.py +10 -10
  22. package/generator/build/lib/pygen/codegen/models/parameter_list.py +7 -7
  23. package/generator/build/lib/pygen/codegen/models/primitive_types.py +23 -43
  24. package/generator/build/lib/pygen/codegen/models/property.py +9 -9
  25. package/generator/build/lib/pygen/codegen/models/request_builder.py +9 -15
  26. package/generator/build/lib/pygen/codegen/models/response.py +6 -8
  27. package/generator/build/lib/pygen/codegen/models/utils.py +11 -0
  28. package/generator/build/lib/pygen/codegen/serializers/__init__.py +228 -243
  29. package/generator/build/lib/pygen/codegen/serializers/base_serializer.py +19 -1
  30. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +58 -36
  31. package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +9 -5
  32. package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +17 -3
  33. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +26 -14
  34. package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +26 -8
  35. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +9 -4
  36. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +65 -24
  37. package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +20 -16
  38. package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  39. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +10 -7
  40. package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  41. package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +7 -10
  42. package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +24 -28
  43. package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +6 -1
  44. package/generator/build/lib/pygen/codegen/serializers/utils.py +1 -15
  45. package/generator/build/lib/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  46. package/generator/build/lib/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  47. package/generator/build/lib/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  48. package/generator/build/lib/pygen/codegen/templates/init.py.jinja2 +1 -1
  49. package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  50. package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +4 -4
  51. package/generator/build/lib/pygen/codegen/templates/operation_groups_container.py.jinja2 +2 -0
  52. package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  53. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +2 -68
  54. package/generator/build/lib/pygen/codegen/templates/test.py.jinja2 +3 -3
  55. package/generator/build/lib/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  56. package/generator/build/lib/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  57. package/generator/build/lib/pygen/preprocess/__init__.py +0 -4
  58. package/generator/component-detection-pip-report.json +2 -2
  59. package/generator/dev_requirements.txt +2 -2
  60. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  61. package/generator/pygen/black.py +3 -3
  62. package/generator/pygen/codegen/__init__.py +2 -0
  63. package/generator/pygen/codegen/_utils.py +4 -0
  64. package/generator/pygen/codegen/models/base.py +2 -3
  65. package/generator/pygen/codegen/models/base_builder.py +5 -3
  66. package/generator/pygen/codegen/models/client.py +28 -19
  67. package/generator/pygen/codegen/models/code_model.py +204 -33
  68. package/generator/pygen/codegen/models/combined_type.py +12 -8
  69. package/generator/pygen/codegen/models/constant_type.py +2 -3
  70. package/generator/pygen/codegen/models/credential_types.py +6 -3
  71. package/generator/pygen/codegen/models/dictionary_type.py +2 -3
  72. package/generator/pygen/codegen/models/enum_type.py +47 -24
  73. package/generator/pygen/codegen/models/imports.py +14 -12
  74. package/generator/pygen/codegen/models/list_type.py +2 -3
  75. package/generator/pygen/codegen/models/lro_operation.py +8 -4
  76. package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
  77. package/generator/pygen/codegen/models/model_type.py +34 -19
  78. package/generator/pygen/codegen/models/operation.py +74 -31
  79. package/generator/pygen/codegen/models/operation_group.py +82 -12
  80. package/generator/pygen/codegen/models/paging_operation.py +10 -7
  81. package/generator/pygen/codegen/models/parameter.py +10 -10
  82. package/generator/pygen/codegen/models/parameter_list.py +7 -7
  83. package/generator/pygen/codegen/models/primitive_types.py +23 -43
  84. package/generator/pygen/codegen/models/property.py +9 -9
  85. package/generator/pygen/codegen/models/request_builder.py +9 -15
  86. package/generator/pygen/codegen/models/response.py +6 -8
  87. package/generator/pygen/codegen/models/utils.py +11 -0
  88. package/generator/pygen/codegen/serializers/__init__.py +228 -243
  89. package/generator/pygen/codegen/serializers/base_serializer.py +19 -1
  90. package/generator/pygen/codegen/serializers/builder_serializer.py +58 -36
  91. package/generator/pygen/codegen/serializers/client_serializer.py +9 -5
  92. package/generator/pygen/codegen/serializers/enum_serializer.py +17 -3
  93. package/generator/pygen/codegen/serializers/general_serializer.py +26 -14
  94. package/generator/pygen/codegen/serializers/metadata_serializer.py +26 -8
  95. package/generator/pygen/codegen/serializers/model_init_serializer.py +9 -4
  96. package/generator/pygen/codegen/serializers/model_serializer.py +65 -24
  97. package/generator/pygen/codegen/serializers/operation_groups_serializer.py +20 -16
  98. package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -10
  99. package/generator/pygen/codegen/serializers/parameter_serializer.py +10 -7
  100. package/generator/pygen/codegen/serializers/request_builders_serializer.py +10 -1
  101. package/generator/pygen/codegen/serializers/sample_serializer.py +7 -10
  102. package/generator/pygen/codegen/serializers/test_serializer.py +24 -28
  103. package/generator/pygen/codegen/serializers/types_serializer.py +6 -1
  104. package/generator/pygen/codegen/serializers/utils.py +1 -15
  105. package/generator/pygen/codegen/templates/client_container.py.jinja2 +1 -1
  106. package/generator/pygen/codegen/templates/config_container.py.jinja2 +1 -1
  107. package/generator/pygen/codegen/templates/enum_container.py.jinja2 +1 -1
  108. package/generator/pygen/codegen/templates/init.py.jinja2 +1 -1
  109. package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  110. package/generator/pygen/codegen/templates/operation_group.py.jinja2 +4 -4
  111. package/generator/pygen/codegen/templates/operation_groups_container.py.jinja2 +2 -0
  112. package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +2 -4
  113. package/generator/pygen/codegen/templates/serialization.py.jinja2 +2 -68
  114. package/generator/pygen/codegen/templates/test.py.jinja2 +3 -3
  115. package/generator/pygen/codegen/templates/testpreparer.py.jinja2 +2 -2
  116. package/generator/pygen/codegen/templates/vendor.py.jinja2 +4 -4
  117. package/generator/pygen/preprocess/__init__.py +0 -4
  118. package/generator/pygen.egg-info/PKG-INFO +10 -1
  119. package/package.json +2 -2
  120. package/scripts/__pycache__/venvtools.cpython-310.pyc +0 -0
@@ -7,6 +7,6 @@
7
7
  {{ imports }}
8
8
 
9
9
  {% for client in clients %}
10
- {% set serializer = get_serializer(client) %}
10
+ {% set serializer = get_serializer(client, serialize_namespace) %}
11
11
  {% include "client.py.jinja2" %}
12
12
  {% endfor %}
@@ -11,6 +11,6 @@ VERSION = "unknown"
11
11
  {% endif %}
12
12
 
13
13
  {% for client in clients %}
14
- {% set serializer = get_serializer(client) %}
14
+ {% set serializer = get_serializer(client, serialize_namespace) %}
15
15
  {% include "config.py.jinja2" %}
16
16
  {% endfor %}
@@ -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" %}
@@ -31,10 +31,10 @@ class {{ operation_group.class_name }}: {{ operation_group.pylint_disable() }}
31
31
  {% endif %}
32
32
  def __init__(self, *args, **kwargs){{ return_none_type_annotation }}:
33
33
  input_args = list(args)
34
- self._client = input_args.pop(0) if input_args else kwargs.pop("client")
35
- self._config = input_args.pop(0) if input_args else kwargs.pop("config")
36
- self._serialize = input_args.pop(0) if input_args else kwargs.pop("serializer")
37
- self._deserialize = input_args.pop(0) if input_args else kwargs.pop("deserializer")
34
+ self._client: {{ 'Async' if async_mode else ''}}PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client")
35
+ self._config: {{ operation_group.client.name }}Configuration = input_args.pop(0) if input_args else kwargs.pop("config")
36
+ self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer")
37
+ self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer")
38
38
  {% if code_model.options["multiapi"] %}
39
39
  self._api_version = input_args.pop(0) if input_args else kwargs.pop("api_version")
40
40
  {% endif %}
@@ -6,7 +6,9 @@
6
6
  {{ imports }}
7
7
  {{ unset }}
8
8
  {% if code_model.options["builders_visibility"] == "embedded" and not async_mode %}
9
+ {% if need_declare_serializer %}
9
10
  {{ op_tools.declare_serializer(code_model) }}
11
+ {% endif %}
10
12
  {% for operation_group in operation_groups %}
11
13
  {% for request_builder in get_request_builders(operation_group) %}
12
14
 
@@ -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()
@@ -184,73 +184,7 @@ try:
184
184
  except NameError:
185
185
  _long_type = int
186
186
 
187
-
188
- class UTC(datetime.tzinfo):
189
- """Time Zone info for handling UTC"""
190
-
191
- def utcoffset(self, dt):
192
- """UTF offset for UTC is 0.
193
-
194
- :param datetime.datetime dt: The datetime
195
- :returns: The offset
196
- :rtype: datetime.timedelta
197
- """
198
- return datetime.timedelta(0)
199
-
200
- def tzname(self, dt):
201
- """Timestamp representation.
202
-
203
- :param datetime.datetime dt: The datetime
204
- :returns: The timestamp representation
205
- :rtype: str
206
- """
207
- return "Z"
208
-
209
- def dst(self, dt):
210
- """No daylight saving for UTC.
211
-
212
- :param datetime.datetime dt: The datetime
213
- :returns: The daylight saving time
214
- :rtype: datetime.timedelta
215
- """
216
- return datetime.timedelta(hours=1)
217
-
218
-
219
- try:
220
- from datetime import timezone as _FixedOffset # type: ignore
221
- except ImportError: # Python 2.7
222
-
223
- class _FixedOffset(datetime.tzinfo): # type: ignore
224
- """Fixed offset in minutes east from UTC.
225
- Copy/pasted from Python doc
226
- :param datetime.timedelta offset: offset in timedelta format
227
- """
228
-
229
- def __init__(self, offset) -> None:
230
- self.__offset = offset
231
-
232
- def utcoffset(self, dt):
233
- return self.__offset
234
-
235
- def tzname(self, dt):
236
- return str(self.__offset.total_seconds() / 3600)
237
-
238
- def __repr__(self):
239
- return "<FixedOffset {}>".format(self.tzname(None))
240
-
241
- def dst(self, dt):
242
- return datetime.timedelta(0)
243
-
244
- def __getinitargs__(self):
245
- return (self.__offset,)
246
-
247
-
248
- try:
249
- from datetime import timezone
250
-
251
- TZ_UTC = timezone.utc
252
- except ImportError:
253
- TZ_UTC = UTC() # type: ignore
187
+ TZ_UTC = datetime.timezone.utc
254
188
 
255
189
  _FLATTEN = re.compile(r"(?<!\\)\.")
256
190
 
@@ -2050,7 +1984,7 @@ class Deserializer:
2050
1984
  try:
2051
1985
  parsed_date = email.utils.parsedate_tz(attr) # type: ignore
2052
1986
  date_obj = datetime.datetime(
2053
- *parsed_date[:6], tzinfo=_FixedOffset(datetime.timedelta(minutes=(parsed_date[9] or 0) / 60))
1987
+ *parsed_date[:6], tzinfo=datetime.timezone(datetime.timedelta(minutes=(parsed_date[9] or 0) / 60))
2054
1988
  )
2055
1989
  if not date_obj.tzinfo:
2056
1990
  date_obj = date_obj.astimezone(tz=TZ_UTC)
@@ -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
 
@@ -123,9 +123,9 @@
123
123
  "implementation_version": "3.8.10",
124
124
  "os_name": "posix",
125
125
  "platform_machine": "x86_64",
126
- "platform_release": "5.15.0-1075-azure",
126
+ "platform_release": "5.15.0-1078-azure",
127
127
  "platform_system": "Linux",
128
- "platform_version": "#84~20.04.1-Ubuntu SMP Mon Nov 4 18:58:41 UTC 2024",
128
+ "platform_version": "#87~20.04.1-Ubuntu SMP Wed Dec 18 20:14:54 UTC 2024",
129
129
  "python_full_version": "3.8.10",
130
130
  "platform_python_implementation": "CPython",
131
131
  "python_version": "3.8",
@@ -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
  )
@@ -60,7 +60,7 @@ class BlackScriptPlugin(Plugin):
60
60
  except:
61
61
  _LOGGER.error("Error: failed to format %s", file)
62
62
  raise
63
- if len(file_content.splitlines()) > 1000:
63
+ if len(file_content.splitlines()) > 1000 and "pylint: disable=too-many-lines" not in file_content:
64
64
  file_content = "# pylint: disable=too-many-lines\n" + file_content
65
65
  self.write_file(file, file_content)
66
66
 
@@ -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