Skip to content
This repository was archived by the owner on May 22, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion packages/autorest.python/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@

- Fix `x-ms-client-default` for model property #1937
- Added sub-namespace folder when generating samples #1920
- Optimize logic to find realted params in example files #1916
- Optimize logic to find related params in example files #1916
- Optimize default value for `api_version` for better compatibility of multiapi package #1934

### 2023-05-19 - 6.4.15

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,7 @@ def pop_kwargs_from_signature(self, builder: OperationType) -> List[str]:
)
else PopKwargType.SIMPLE,
check_client_input=not self.code_model.options["multiapi"],
operation_name=f"('{builder.name}')" if builder.group_name == "" else "",
)
cls_annotation = builder.cls_type_annotation(async_mode=self.async_mode)
pylint_disable = ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,16 @@ def _get_client_models_value(models_dict_name: str) -> str:
og for og in self.client.operation_groups if not og.is_mixin
]
for og in operation_groups:
if og.code_model.options["multiapi"]:
api_version = (
f", '{og.api_versions[0]}'" if og.api_versions else ", None"
)
else:
api_version = ""
retval.extend(
[
f"self.{og.property_name} = {og.class_name}({og.pylint_disable}",
" self._client, self._config, self._serialize, self._deserialize",
f" self._client, self._config, self._serialize, self._deserialize{api_version}",
")",
]
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------
from typing import List, Sequence, Union
from typing import List, Sequence, Union, Optional
from enum import Enum, auto


Expand Down Expand Up @@ -111,6 +111,7 @@ def pop_kwargs_from_signature(
pop_headers_kwarg: PopKwargType,
pop_params_kwarg: PopKwargType,
check_client_input: bool = False,
operation_name: Optional[str] = None,
) -> List[str]:
retval = []

Expand Down Expand Up @@ -142,9 +143,18 @@ def append_pop_kwarg(key: str, pop_type: PopKwargType) -> None:
if kwarg.location == ParameterLocation.HEADER
else "params"
)
if (
kwarg.client_name == "api_version"
and kwarg.code_model.options["multiapi"]
and operation_name is not None
):
default_value = (
f"self._api_version{operation_name} or {default_value}"
)
default_value = (
f"_{kwarg_dict}.pop('{kwarg.wire_name}', {default_value})"
)

retval.append(
f"{kwarg.client_name}: {type_annot} = kwargs.pop('{kwarg.client_name}', "
+ f"{default_value})"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,22 @@ class {{ operation_group.class_name }}{{ base_class }}:{{ disable }}
self._config = input_args.pop(0) if input_args else kwargs.pop("config")
self._serialize = input_args.pop(0) if input_args else kwargs.pop("serializer")
self._deserialize = input_args.pop(0) if input_args else kwargs.pop("deserializer")
{% if code_model.options["multiapi"] %}
self._api_version = input_args.pop(0) if input_args else kwargs.pop("api_version")
{% endif %}
{{ check_abstract_methods() }}
{% elif operation_group.has_abstract_operations %}

def __init__(self){{ return_none_type_annotation }}:
{{ check_abstract_methods() }}
{% endif %}
{% if operation_group.is_mixin and code_model.options["multiapi"] %}
def _api_version(self, op_name: str) -> str: # pylint: disable=unused-argument
try:
return self._config.api_version
except: # pylint: disable=bare-except
return ""
{% endif %}
{% for operation in operation_group.operations if not operation.abstract %}

{% set request_builder = operation.request_builder %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,8 @@ class {{ code_model.client.name }}({% if code_model.operation_mixin_group.mixin_
else:
raise ValueError("API version {} is not available".format(api_version))
{% endif %}
if api_version:
kwargs.setdefault('api_version', api_version)
self._config = {{ code_model.client.name }}Configuration({{ code_model.global_parameters.call }}{{ ", " if code_model.global_parameters.call }}**kwargs)
self._client = {{ async_prefix }}{{ code_model.client.pipeline_client }}(base_url={{ code_model.host_variable_name }}, config=self._config, **kwargs)
super({{ code_model.client.name }}, self).__init__(
Expand Down Expand Up @@ -132,7 +134,7 @@ class {{ code_model.client.name }}({% if code_model.operation_mixin_group.mixin_
else:
raise ValueError("API version {} does not have operation group '{{ operation_group.name }}'".format(api_version))
self._config.api_version = api_version
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)))
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version)
{% endfor %}

{{ def }} close(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ def __init__(
profile: KnownProfiles=KnownProfiles.default,
**kwargs: Any
):
if api_version:
kwargs.setdefault('api_version', api_version)
self._config = MultiapiServiceClientConfiguration(credential, **kwargs)
self._client = ARMPipelineClient(base_url=base_url, config=self._config, **kwargs)
super(MultiapiServiceClient, self).__init__(
Expand Down Expand Up @@ -120,7 +122,7 @@ def operation_group_one(self):
else:
raise ValueError("API version {} does not have operation group 'operation_group_one'".format(api_version))
self._config.api_version = api_version
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)))
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version)

@property
def operation_group_two(self):
Expand All @@ -137,7 +139,7 @@ def operation_group_two(self):
else:
raise ValueError("API version {} does not have operation group 'operation_group_two'".format(api_version))
self._config.api_version = api_version
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)))
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version)

def close(self):
self._client.close()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ def __init__(
profile: KnownProfiles = KnownProfiles.default,
**kwargs: Any
) -> None:
if api_version:
kwargs.setdefault('api_version', api_version)
self._config = MultiapiServiceClientConfiguration(credential, **kwargs)
self._client = AsyncARMPipelineClient(base_url=base_url, config=self._config, **kwargs)
super(MultiapiServiceClient, self).__init__(
Expand Down Expand Up @@ -120,7 +122,7 @@ def operation_group_one(self):
else:
raise ValueError("API version {} does not have operation group 'operation_group_one'".format(api_version))
self._config.api_version = api_version
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)))
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version)

@property
def operation_group_two(self):
Expand All @@ -137,7 +139,7 @@ def operation_group_two(self):
else:
raise ValueError("API version {} does not have operation group 'operation_group_two'".format(api_version))
self._config.api_version = api_version
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)))
return OperationClass(self._client, self._config, Serializer(self._models_dict(api_version)), Deserializer(self._models_dict(api_version)), api_version)

async def close(self):
await self._client.close()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def __init__(self, credential: "TokenCredential", base_url: str = "http://localh
self._deserialize = Deserializer(client_models)
self._serialize.client_side_validation = False
self.operation_group_one = OperationGroupOneOperations(
self._client, self._config, self._serialize, self._deserialize
self._client, self._config, self._serialize, self._deserialize, "1.0.0"
)

def _send_request(self, request: HttpRequest, **kwargs: Any) -> HttpResponse:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def __init__(
self._deserialize = Deserializer(client_models)
self._serialize.client_side_validation = False
self.operation_group_one = OperationGroupOneOperations(
self._client, self._config, self._serialize, self._deserialize
self._client, self._config, self._serialize, self._deserialize, "1.0.0"
)

def _send_request(self, request: HttpRequest, **kwargs: Any) -> Awaitable[AsyncHttpResponse]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@


class MultiapiServiceClientOperationsMixin(MultiapiServiceClientMixinABC):
def _api_version(self, op_name: str) -> str: # pylint: disable=unused-argument
try:
return self._config.api_version
except: # pylint: disable=bare-except
return ""

@distributed_trace_async
async def test_one( # pylint: disable=inconsistent-return-statements
self, id: int, message: Optional[str] = None, **kwargs: Any
Expand All @@ -70,7 +76,9 @@ async def test_one( # pylint: disable=inconsistent-return-statements
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "1.0.0"))
api_version: str = kwargs.pop(
"api_version", _params.pop("api-version", self._api_version("test_one") or "1.0.0")
)
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_one_request(
Expand Down Expand Up @@ -498,7 +506,9 @@ async def test_different_calls( # pylint: disable=inconsistent-return-statement
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "1.0.0"))
api_version: str = kwargs.pop(
"api_version", _params.pop("api-version", self._api_version("test_different_calls") or "1.0.0")
)
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_different_calls_request(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ def __init__(self, *args, **kwargs) -> None:
self._config = input_args.pop(0) if input_args else kwargs.pop("config")
self._serialize = input_args.pop(0) if input_args else kwargs.pop("serializer")
self._deserialize = input_args.pop(0) if input_args else kwargs.pop("deserializer")
self._api_version = input_args.pop(0) if input_args else kwargs.pop("api_version")

@distributed_trace_async
async def test_two(self, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements
Expand All @@ -71,7 +72,7 @@ async def test_two(self, **kwargs: Any) -> None: # pylint: disable=inconsistent
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "1.0.0"))
api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._api_version or "1.0.0"))
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_two_request(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,12 @@ def build_test_different_calls_request(*, greeting_in_english: str, **kwargs: An


class MultiapiServiceClientOperationsMixin(MultiapiServiceClientMixinABC):
def _api_version(self, op_name: str) -> str: # pylint: disable=unused-argument
try:
return self._config.api_version
except: # pylint: disable=bare-except
return ""

@distributed_trace
def test_one( # pylint: disable=inconsistent-return-statements
self, id: int, message: Optional[str] = None, **kwargs: Any
Expand All @@ -147,7 +153,9 @@ def test_one( # pylint: disable=inconsistent-return-statements
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "1.0.0"))
api_version: str = kwargs.pop(
"api_version", _params.pop("api-version", self._api_version("test_one") or "1.0.0")
)
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_one_request(
Expand Down Expand Up @@ -572,7 +580,9 @@ def test_different_calls( # pylint: disable=inconsistent-return-statements
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "1.0.0"))
api_version: str = kwargs.pop(
"api_version", _params.pop("api-version", self._api_version("test_different_calls") or "1.0.0")
)
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_different_calls_request(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def __init__(self, *args, **kwargs):
self._config = input_args.pop(0) if input_args else kwargs.pop("config")
self._serialize = input_args.pop(0) if input_args else kwargs.pop("serializer")
self._deserialize = input_args.pop(0) if input_args else kwargs.pop("deserializer")
self._api_version = input_args.pop(0) if input_args else kwargs.pop("api_version")

@distributed_trace
def test_two(self, **kwargs: Any) -> None: # pylint: disable=inconsistent-return-statements
Expand All @@ -92,7 +93,7 @@ def test_two(self, **kwargs: Any) -> None: # pylint: disable=inconsistent-retur
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "1.0.0"))
api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._api_version or "1.0.0"))
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_two_request(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ def __init__(self, credential: "TokenCredential", base_url: str = "http://localh
self._deserialize = Deserializer(client_models)
self._serialize.client_side_validation = False
self.operation_group_one = OperationGroupOneOperations(
self._client, self._config, self._serialize, self._deserialize
self._client, self._config, self._serialize, self._deserialize, "2.0.0"
)
self.operation_group_two = OperationGroupTwoOperations(
self._client, self._config, self._serialize, self._deserialize
self._client, self._config, self._serialize, self._deserialize, "2.0.0"
)

def _send_request(self, request: HttpRequest, **kwargs: Any) -> HttpResponse:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,10 @@ def __init__(
self._deserialize = Deserializer(client_models)
self._serialize.client_side_validation = False
self.operation_group_one = OperationGroupOneOperations(
self._client, self._config, self._serialize, self._deserialize
self._client, self._config, self._serialize, self._deserialize, "2.0.0"
)
self.operation_group_two = OperationGroupTwoOperations(
self._client, self._config, self._serialize, self._deserialize
self._client, self._config, self._serialize, self._deserialize, "2.0.0"
)

def _send_request(self, request: HttpRequest, **kwargs: Any) -> Awaitable[AsyncHttpResponse]:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@


class MultiapiServiceClientOperationsMixin(MultiapiServiceClientMixinABC):
def _api_version(self, op_name: str) -> str: # pylint: disable=unused-argument
try:
return self._config.api_version
except: # pylint: disable=bare-except
return ""

@distributed_trace_async
async def test_one(self, id: int, message: Optional[str] = None, **kwargs: Any) -> _models.ModelTwo:
"""TestOne should be in an SecondVersionOperationsMixin. Returns ModelTwo.
Expand All @@ -57,7 +63,9 @@ async def test_one(self, id: int, message: Optional[str] = None, **kwargs: Any)
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2.0.0"))
api_version: str = kwargs.pop(
"api_version", _params.pop("api-version", self._api_version("test_one") or "2.0.0")
)
cls: ClsType[_models.ModelTwo] = kwargs.pop("cls", None)

request = build_test_one_request(
Expand Down Expand Up @@ -118,7 +126,9 @@ async def test_different_calls( # pylint: disable=inconsistent-return-statement
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2.0.0"))
api_version: str = kwargs.pop(
"api_version", _params.pop("api-version", self._api_version("test_different_calls") or "2.0.0")
)
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_different_calls_request(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ def __init__(self, *args, **kwargs) -> None:
self._config = input_args.pop(0) if input_args else kwargs.pop("config")
self._serialize = input_args.pop(0) if input_args else kwargs.pop("serializer")
self._deserialize = input_args.pop(0) if input_args else kwargs.pop("deserializer")
self._api_version = input_args.pop(0) if input_args else kwargs.pop("api_version")

@overload
async def test_two(
Expand Down Expand Up @@ -114,7 +115,7 @@ async def test_two(
_headers = case_insensitive_dict(kwargs.pop("headers", {}) or {})
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2.0.0"))
api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._api_version or "2.0.0"))
content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None))
cls: ClsType[_models.ModelTwo] = kwargs.pop("cls", None)

Expand Down Expand Up @@ -182,7 +183,7 @@ async def test_three(self, **kwargs: Any) -> None: # pylint: disable=inconsiste
_headers = kwargs.pop("headers", {}) or {}
_params = case_insensitive_dict(kwargs.pop("params", {}) or {})

api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2.0.0"))
api_version: str = kwargs.pop("api_version", _params.pop("api-version", self._api_version or "2.0.0"))
cls: ClsType[None] = kwargs.pop("cls", None)

request = build_test_three_request(
Expand Down
Loading