From 76af2cb98cea1889a7710e1f3336b780aca904b2 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Sat, 8 Feb 2025 17:47:20 +0800 Subject: [PATCH 01/24] single api part --- .../generator/pygen/codegen/models/client.py | 39 ++++++++++++++++++- .../codegen/serializers/client_serializer.py | 18 +++++++-- .../pygen/codegen/templates/client.py.jinja2 | 2 +- .../pygen/codegen/templates/config.py.jinja2 | 10 +---- .../packaging_templates/setup.py.jinja2 | 2 +- 5 files changed, 57 insertions(+), 14 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 4623326f6c5..47cea6b24e4 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -78,6 +78,18 @@ def __init__( self.link_lro_initial_operations() self.request_id_header_name = self.yaml_data.get("requestIdHeaderName", None) self.has_etag: bool = yaml_data.get("hasEtag", False) + + # update the host parameter value. In later logic, SDK will overwrite it with value from cloud_setting + if self.need_cloud_setting: + for p in self.parameters.parameters: + if p.is_host: + p.client_default_value = "" + break + + + @property + def need_cloud_setting(self) -> bool: + return self.code_model.options["azure_arm"] and self.credential_scopes def _build_request_builders( self, @@ -234,13 +246,24 @@ def _imports_shared(self, async_mode: bool, **kwargs) -> FileImport: f"{async_prefix}ARMAutoResourceProviderRegistrationPolicy", ImportType.SDKCORE, ) - + # import for "Self" file_import.add_submodule_import( "typing_extensions", "Self", ImportType.STDLIB, ) + if self.need_cloud_setting: + file_import.add_submodule_import( + "azure.core.settings", + "settings", + ImportType.SDKCORE, + ) + file_import.add_submodule_import( + "azure.mgmt.core.tools", + "get_arm_endpoints", + ImportType.SDKCORE, + ) return file_import @property @@ -340,6 +363,20 @@ def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport: ) return file_import + @property + def credential_scopes(self) -> List[str]: + """Credential scopes for this client""" + + cred_scopes = [] + if self.credential: + policy = getattr(self.credential.type, "policy", None) + if policy: + cred_scopes = getattr(policy, "credential_scopes", []) + if not cred_scopes: + types = getattr(self.credential.type, "types", []) + cred_scopes = next((t.policy.credential_scopes for t in types if hasattr(t.policy, "credential_scopes")), []) + return cred_scopes + @classmethod def from_yaml( cls, diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index 6ac6de68bb5..3a53caf3f51 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -77,17 +77,29 @@ def property_descriptions(self, async_mode: bool) -> List[str]: retval.append('"""') return retval - def initialize_config(self) -> str: + def initialize_config(self) -> List[str]: + retval = [] + additional_signatures = [] + if self.client.need_cloud_setting: + additional_signatures.append("credential_scopes=credential_scopes") + retval.extend([ + 'cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud', + "endpoints = get_arm_endpoints(cloud)", + "if not base_url:", + ' base_url = endpoints["resource_manager"]', + 'credential_scopes = kwargs.pop("credential_scopes", endpoints["credential_scopes"])', + ]) config_name = f"{self.client.name}Configuration" config_call = ", ".join( [ f"{p.client_name}={p.client_name}" for p in self.client.config.parameters.method if p.method_location != ParameterMethodLocation.KWARG - ] + ] + additional_signatures + + ["**kwargs"] ) - return f"self._config = {config_name}({config_call})" + retval.append(f"self._config = {config_name}({config_call})") + return retval @property def host_variable_name(self) -> str: diff --git a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 index 1b5d3c09821..dca078b0226 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 @@ -9,7 +9,7 @@ {% if client.has_parameterized_host %} {{ serializer.host_variable_name }} = {{ keywords.escape_str(client.url) }}{{ client.url_pylint_disable }} {% endif %} - {{ serializer.initialize_config() }} + {{ op_tools.serialize_with_wrap(serializer.initialize_config(), "\n") | indent(8) }} {{ op_tools.serialize(serializer.initialize_pipeline_client(async_mode)) | indent(8) }} {{ op_tools.serialize(serializer.serializers_and_operation_groups_properties()) | indent(8) }} diff --git a/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 index 57e8daa3146..cf39ed8ed7f 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 @@ -21,14 +21,8 @@ class {{ client.name }}Configuration: {{ client.config.pylint_disable() }} {% if serializer.set_constants() %} {{ op_tools.serialize(serializer.set_constants()) | indent(8) -}} {% endif %} -{% if client.credential %} - {% set cred_scopes = client.credential.type if client.credential.type.policy is defined and client.credential.type.policy.credential_scopes is defined %} - {% if not cred_scopes %} - {% set cred_scopes = client.credential.type.types | selectattr("policy.credential_scopes") | first if client.credential.type.types is defined %} - {% endif %} - {% if cred_scopes %} - self.credential_scopes = kwargs.pop('credential_scopes', {{ cred_scopes.policy.credential_scopes }}) - {% endif %} +{% if client.credential_scopes %} + self.credential_scopes = kwargs.pop('credential_scopes', {{ client.credential_scopes }}) {% endif %} kwargs.setdefault('sdk_moniker', '{{ client.config.sdk_moniker }}/{}'.format(VERSION)) self.polling_interval = kwargs.get("polling_interval", 30) diff --git a/packages/http-client-python/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 index 45239f0dac5..3017d6c12ec 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/packaging_templates/setup.py.jinja2 @@ -90,7 +90,7 @@ setup( "isodate>=0.6.1", {% endif %} {% if azure_arm %} - "azure-mgmt-core>=1.3.2", + "azure-mgmt-core>=1.5.0", {% elif code_model.is_azure_flavor %} "azure-core>=1.30.0", {% else %} From 8fff9d6fbce6c9b011923e73be7fdb5825bfad83 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 14:14:08 +0800 Subject: [PATCH 02/24] Format --- .../generator/pygen/codegen/models/client.py | 43 ++++++++++--------- .../codegen/serializers/builder_serializer.py | 8 ++-- .../codegen/serializers/client_serializer.py | 19 ++++---- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 47cea6b24e4..c5df0804bdf 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -78,18 +78,17 @@ def __init__( self.link_lro_initial_operations() self.request_id_header_name = self.yaml_data.get("requestIdHeaderName", None) self.has_etag: bool = yaml_data.get("hasEtag", False) - + # update the host parameter value. In later logic, SDK will overwrite it with value from cloud_setting if self.need_cloud_setting: - for p in self.parameters.parameters: - if p.is_host: - p.client_default_value = "" - break - + for p in self.parameters.parameters: + if p.is_host: + p.client_default_value = "" + break @property def need_cloud_setting(self) -> bool: - return self.code_model.options["azure_arm"] and self.credential_scopes + return self.code_model.options["azure_arm"] and self.credential_scopes def _build_request_builders( self, @@ -246,7 +245,7 @@ def _imports_shared(self, async_mode: bool, **kwargs) -> FileImport: f"{async_prefix}ARMAutoResourceProviderRegistrationPolicy", ImportType.SDKCORE, ) - + # import for "Self" file_import.add_submodule_import( "typing_extensions", @@ -255,14 +254,14 @@ def _imports_shared(self, async_mode: bool, **kwargs) -> FileImport: ) if self.need_cloud_setting: file_import.add_submodule_import( - "azure.core.settings", - "settings", - ImportType.SDKCORE, + "azure.core.settings", + "settings", + ImportType.SDKCORE, ) file_import.add_submodule_import( - "azure.mgmt.core.tools", - "get_arm_endpoints", - ImportType.SDKCORE, + "azure.mgmt.core.tools", + "get_arm_endpoints", + ImportType.SDKCORE, ) return file_import @@ -366,15 +365,17 @@ def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport: @property def credential_scopes(self) -> List[str]: """Credential scopes for this client""" - + cred_scopes = [] if self.credential: - policy = getattr(self.credential.type, "policy", None) - if policy: - cred_scopes = getattr(policy, "credential_scopes", []) - if not cred_scopes: - types = getattr(self.credential.type, "types", []) - cred_scopes = next((t.policy.credential_scopes for t in types if hasattr(t.policy, "credential_scopes")), []) + policy = getattr(self.credential.type, "policy", None) + if policy: + cred_scopes = getattr(policy, "credential_scopes", []) + if not cred_scopes: + types = getattr(self.credential.type, "types", []) + cred_scopes = next( + (t.policy.credential_scopes for t in types if hasattr(t.policy, "credential_scopes")), [] + ) return cred_scopes @classmethod diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py index ac3b2be69bc..82cbc255982 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py @@ -1005,7 +1005,9 @@ def response_deserialization( # pylint: disable=too-many-statements retval.extend(deserialize_code) return retval - def handle_error_response(self, builder: OperationType) -> List[str]: # pylint: disable=too-many-statements, too-many-branches + def handle_error_response( + self, builder: OperationType + ) -> List[str]: # pylint: disable=too-many-statements, too-many-branches async_await = "await " if self.async_mode else "" retval = [f"if response.status_code not in {str(builder.success_status_codes)}:"] response_read = [ @@ -1084,9 +1086,7 @@ def handle_error_response(self, builder: OperationType) -> List[str]: # pylint f" error = _failsafe_deserialize_xml({type_annotation}, response.text())" ) else: - retval.append( - f" error = _failsafe_deserialize({type_annotation}, response.json())" - ) + retval.append(f" error = _failsafe_deserialize({type_annotation}, response.json())") else: retval.append( f" error = self._deserialize.failsafe_deserialize({type_annotation}, " diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index 3a53caf3f51..a17e590d467 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -82,20 +82,23 @@ def initialize_config(self) -> List[str]: additional_signatures = [] if self.client.need_cloud_setting: additional_signatures.append("credential_scopes=credential_scopes") - retval.extend([ - 'cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud', - "endpoints = get_arm_endpoints(cloud)", - "if not base_url:", - ' base_url = endpoints["resource_manager"]', - 'credential_scopes = kwargs.pop("credential_scopes", endpoints["credential_scopes"])', - ]) + retval.extend( + [ + 'cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud', + "endpoints = get_arm_endpoints(cloud)", + "if not base_url:", + ' base_url = endpoints["resource_manager"]', + 'credential_scopes = kwargs.pop("credential_scopes", endpoints["credential_scopes"])', + ] + ) config_name = f"{self.client.name}Configuration" config_call = ", ".join( [ f"{p.client_name}={p.client_name}" for p in self.client.config.parameters.method if p.method_location != ParameterMethodLocation.KWARG - ] + additional_signatures + + ] + + additional_signatures + ["**kwargs"] ) retval.append(f"self._config = {config_name}({config_call})") From ef9e70316cc5697b1869cc91bdef8e9342ea342d Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 14:44:03 +0800 Subject: [PATCH 03/24] fix --- .../generator/pygen/codegen/models/client.py | 7 ++++--- .../generator/test/azure/requirements.txt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index c5df0804bdf..5e09f5264d4 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -15,7 +15,7 @@ OverloadedRequestBuilder, get_request_builder, ) -from .parameter import Parameter, ParameterMethodLocation +from .parameter import Parameter, ParameterMethodLocation, ParameterLocation from .lro_operation import LROOperation from .lro_paging_operation import LROPagingOperation from ...utils import extract_original_name, NAME_LENGTH_LIMIT @@ -79,10 +79,11 @@ def __init__( self.request_id_header_name = self.yaml_data.get("requestIdHeaderName", None) self.has_etag: bool = yaml_data.get("hasEtag", False) - # update the host parameter value. In later logic, SDK will overwrite it with value from cloud_setting + # update the host parameter value. In later logic, SDK will overwrite it + # with value from cloud_setting if users don't provide it. if self.need_cloud_setting: for p in self.parameters.parameters: - if p.is_host: + if p.location == ParameterLocation.ENDPOINT_PATH: p.client_default_value = "" break diff --git a/packages/http-client-python/generator/test/azure/requirements.txt b/packages/http-client-python/generator/test/azure/requirements.txt index 5c4e0d05a32..779a0acda9e 100644 --- a/packages/http-client-python/generator/test/azure/requirements.txt +++ b/packages/http-client-python/generator/test/azure/requirements.txt @@ -1,7 +1,7 @@ -r ../dev_requirements.txt -e ../../ azure-core==1.30.0 -azure-mgmt-core==1.3.2 +azure-mgmt-core==1.5.0 # only for azure -e ./generated/azure-client-generator-core-access From 624a90f8a0239d85dacf00ed05b1a05e5c4b2de6 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 14:50:37 +0800 Subject: [PATCH 04/24] update --- .../pygen/codegen/serializers/client_serializer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index a17e590d467..b6083091d8f 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -84,10 +84,10 @@ def initialize_config(self) -> List[str]: additional_signatures.append("credential_scopes=credential_scopes") retval.extend( [ - 'cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud', - "endpoints = get_arm_endpoints(cloud)", + '_cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud', + "_endpoints = get_arm_endpoints(_cloud)", "if not base_url:", - ' base_url = endpoints["resource_manager"]', + ' base_url = _endpoints["resource_manager"]', 'credential_scopes = kwargs.pop("credential_scopes", endpoints["credential_scopes"])', ] ) From 0dff76bb7278227c3103b372a4f02f1db305f410 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 14:54:18 +0800 Subject: [PATCH 05/24] add changelog --- .chronus/changes/multi-clouds-2025-1-10-14-54-3.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .chronus/changes/multi-clouds-2025-1-10-14-54-3.md diff --git a/.chronus/changes/multi-clouds-2025-1-10-14-54-3.md b/.chronus/changes/multi-clouds-2025-1-10-14-54-3.md new file mode 100644 index 00000000000..70be10bff6c --- /dev/null +++ b/.chronus/changes/multi-clouds-2025-1-10-14-54-3.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@typespec/http-client-python" +--- + +Improve user experience in multi clouds scenario \ No newline at end of file From f94b98f1d73b9a47651f749c116334efd3fedaca Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 14:56:54 +0800 Subject: [PATCH 06/24] fix --- .../generator/pygen/codegen/serializers/client_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index b6083091d8f..eaaee7dac21 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -88,7 +88,7 @@ def initialize_config(self) -> List[str]: "_endpoints = get_arm_endpoints(_cloud)", "if not base_url:", ' base_url = _endpoints["resource_manager"]', - 'credential_scopes = kwargs.pop("credential_scopes", endpoints["credential_scopes"])', + 'credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"])', ] ) config_name = f"{self.client.name}Configuration" From c9e3d0ad2183e904d874f5c46b10f3e240eca682 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 15:16:48 +0800 Subject: [PATCH 07/24] fix ci --- .../generator/pygen/codegen/models/client.py | 6 +++--- .../pygen/codegen/serializers/builder_serializer.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 5e09f5264d4..54249b3cca1 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -54,7 +54,7 @@ def name(self) -> str: return self.yaml_data["name"] -class Client(_ClientConfigBase[ClientGlobalParameterList]): +class Client(_ClientConfigBase[ClientGlobalParameterList]): # pylint: disable=too-many-public-methods """Model representing our service client""" def __init__( @@ -89,7 +89,7 @@ def __init__( @property def need_cloud_setting(self) -> bool: - return self.code_model.options["azure_arm"] and self.credential_scopes + return bool(self.code_model.options["azure_arm"] and self.credential_scopes) def _build_request_builders( self, @@ -367,7 +367,7 @@ def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport: def credential_scopes(self) -> List[str]: """Credential scopes for this client""" - cred_scopes = [] + cred_scopes: List[str] = [] if self.credential: policy = getattr(self.credential.type, "policy", None) if policy: diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py index 82cbc255982..bd7f2e11cae 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/builder_serializer.py @@ -1005,9 +1005,9 @@ def response_deserialization( # pylint: disable=too-many-statements retval.extend(deserialize_code) return retval - def handle_error_response( + def handle_error_response( # pylint: disable=too-many-statements, too-many-branches self, builder: OperationType - ) -> List[str]: # pylint: disable=too-many-statements, too-many-branches + ) -> List[str]: async_await = "await " if self.async_mode else "" retval = [f"if response.status_code not in {str(builder.success_status_codes)}:"] response_read = [ From f67308fb85957db46c24ad242684f060e84c8e0a Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 15:23:33 +0800 Subject: [PATCH 08/24] update test --- .../http-client-python/generator/test/azure/requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/http-client-python/generator/test/azure/requirements.txt b/packages/http-client-python/generator/test/azure/requirements.txt index 779a0acda9e..6897a4f90c0 100644 --- a/packages/http-client-python/generator/test/azure/requirements.txt +++ b/packages/http-client-python/generator/test/azure/requirements.txt @@ -1,6 +1,5 @@ -r ../dev_requirements.txt -e ../../ -azure-core==1.30.0 azure-mgmt-core==1.5.0 # only for azure From 50dc77b745d6d0762d694b63b146b4bbdb7d55ee Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Mon, 10 Feb 2025 17:41:16 +0800 Subject: [PATCH 09/24] fix for ci --- .../generator/pygen/codegen/templates/client.py.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 index dca078b0226..52dda75b2d8 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 @@ -9,7 +9,7 @@ {% if client.has_parameterized_host %} {{ serializer.host_variable_name }} = {{ keywords.escape_str(client.url) }}{{ client.url_pylint_disable }} {% endif %} - {{ op_tools.serialize_with_wrap(serializer.initialize_config(), "\n") | indent(8) }} + {{ op_tools.serialize(serializer.initialize_config()) | indent(8) }} {{ op_tools.serialize(serializer.initialize_pipeline_client(async_mode)) | indent(8) }} {{ op_tools.serialize(serializer.serializers_and_operation_groups_properties()) | indent(8) }} From c129c7a1e1ec777b7f53dea0c78c0f5a680f33aa Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 11 Feb 2025 13:32:59 +0800 Subject: [PATCH 10/24] fix for test --- .../generator/pygen/codegen/models/client.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 54249b3cca1..65990329c8a 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -369,14 +369,12 @@ def credential_scopes(self) -> List[str]: cred_scopes: List[str] = [] if self.credential: - policy = getattr(self.credential.type, "policy", None) - if policy: - cred_scopes = getattr(policy, "credential_scopes", []) - if not cred_scopes: - types = getattr(self.credential.type, "types", []) - cred_scopes = next( - (t.policy.credential_scopes for t in types if hasattr(t.policy, "credential_scopes")), [] - ) + cred_scopes = getattr(getattr(self.credential.type, "policy", None), "credential_scopes", []) + if not cred_scopes: + types = getattr(self.credential.type, "types", []) + cred_scopes = next( + (t.policy.credential_scopes for t in types if hasattr(t.policy, "credential_scopes")), [] + ) return cred_scopes @classmethod From 20872e789d7055fa917cebf09dbf8fdd67c7d2e7 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 11 Feb 2025 14:30:57 +0800 Subject: [PATCH 11/24] fix for mypy --- .../generator/pygen/codegen/serializers/client_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index eaaee7dac21..bad856f23fb 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -84,7 +84,7 @@ def initialize_config(self) -> List[str]: additional_signatures.append("credential_scopes=credential_scopes") retval.extend( [ - '_cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud', + '_cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud # type: ignore', "_endpoints = get_arm_endpoints(_cloud)", "if not base_url:", ' base_url = _endpoints["resource_manager"]', From 4cba5e903a34d91fe2faf496cd6cc3875d57e013 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 11 Feb 2025 16:13:46 +0800 Subject: [PATCH 12/24] fix when credential_scopes are empty array --- .../generator/pygen/codegen/models/client.py | 14 ++++++-------- .../pygen/codegen/templates/client.py.jinja2 | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 65990329c8a..60d4c5e5002 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -367,15 +367,13 @@ def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport: def credential_scopes(self) -> List[str]: """Credential scopes for this client""" - cred_scopes: List[str] = [] if self.credential: - cred_scopes = getattr(getattr(self.credential.type, "policy", None), "credential_scopes", []) - if not cred_scopes: - types = getattr(self.credential.type, "types", []) - cred_scopes = next( - (t.policy.credential_scopes for t in types if hasattr(t.policy, "credential_scopes")), [] - ) - return cred_scopes + if hasattr(getattr(self.credential.type, "policy", None), "credential_scopes"): + return self.credential.type.policy.credential_scopes # type: ignore + for t in getattr(self.credential.type, "types", []): + if hasattr(getattr(t, "policy", None), "credential_scopes"): + return t.policy.credential_scopes + return [] @classmethod def from_yaml( diff --git a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 index 52dda75b2d8..ac74dd4069a 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 @@ -9,7 +9,7 @@ {% if client.has_parameterized_host %} {{ serializer.host_variable_name }} = {{ keywords.escape_str(client.url) }}{{ client.url_pylint_disable }} {% endif %} - {{ op_tools.serialize(serializer.initialize_config()) | indent(8) }} + {{ op_tools.serialize(serializer.initialize_config()) | indent(8) -}} {{ op_tools.serialize(serializer.initialize_pipeline_client(async_mode)) | indent(8) }} {{ op_tools.serialize(serializer.serializers_and_operation_groups_properties()) | indent(8) }} From b8ce545bda637882ea363f81041b39b73365b9bf Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 11 Feb 2025 16:21:03 +0800 Subject: [PATCH 13/24] fix --- .../generator/pygen/codegen/templates/client.py.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 index ac74dd4069a..52dda75b2d8 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/client.py.jinja2 @@ -9,7 +9,7 @@ {% if client.has_parameterized_host %} {{ serializer.host_variable_name }} = {{ keywords.escape_str(client.url) }}{{ client.url_pylint_disable }} {% endif %} - {{ op_tools.serialize(serializer.initialize_config()) | indent(8) -}} + {{ op_tools.serialize(serializer.initialize_config()) | indent(8) }} {{ op_tools.serialize(serializer.initialize_pipeline_client(async_mode)) | indent(8) }} {{ op_tools.serialize(serializer.serializers_and_operation_groups_properties()) | indent(8) }} From 6095058f97e7305b39a9fdb24a6503aa82483454 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Tue, 11 Feb 2025 17:49:22 +0800 Subject: [PATCH 14/24] fix for sample --- .../generator/pygen/codegen/models/client.py | 6 +++--- .../pygen/codegen/serializers/sample_serializer.py | 4 ++-- .../generator/pygen/codegen/templates/config.py.jinja2 | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 60d4c5e5002..f8e545fb6ac 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -89,7 +89,7 @@ def __init__( @property def need_cloud_setting(self) -> bool: - return bool(self.code_model.options["azure_arm"] and self.credential_scopes) + return bool(self.code_model.options["azure_arm"] and self.credential_scopes is not None) def _build_request_builders( self, @@ -364,7 +364,7 @@ def imports_for_multiapi(self, async_mode: bool, **kwargs) -> FileImport: return file_import @property - def credential_scopes(self) -> List[str]: + def credential_scopes(self) -> Optional[List[str]]: """Credential scopes for this client""" if self.credential: @@ -373,7 +373,7 @@ def credential_scopes(self) -> List[str]: for t in getattr(self.credential.type, "types", []): if hasattr(getattr(t, "policy", None), "credential_scopes"): return t.policy.credential_scopes - return [] + return None @classmethod def from_yaml( diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/sample_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/sample_serializer.py index cc587e51791..acd10373166 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/sample_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/sample_serializer.py @@ -62,7 +62,7 @@ def _imports(self) -> FileImportSerializer: ImportType.SDKCORE, ) for param in self.operation.parameters.positional + self.operation.parameters.keyword_only: - if not param.client_default_value and not param.optional and param.wire_name in self.sample_params: + if param.client_default_value is None and not param.optional and param.wire_name in self.sample_params: imports.merge(param.type.imports_for_sample()) return FileImportSerializer(imports, True) @@ -80,7 +80,7 @@ def _client_params(self) -> Dict[str, Any]: for p in ( self.code_model.clients[0].parameters.positional + self.code_model.clients[0].parameters.keyword_only ) - if not (p.optional or p.client_default_value) + if not p.optional and p.client_default_value is None ] client_params = { p.client_name: special_param.get( diff --git a/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 b/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 index cf39ed8ed7f..def1c26bc73 100644 --- a/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 +++ b/packages/http-client-python/generator/pygen/codegen/templates/config.py.jinja2 @@ -21,7 +21,7 @@ class {{ client.name }}Configuration: {{ client.config.pylint_disable() }} {% if serializer.set_constants() %} {{ op_tools.serialize(serializer.set_constants()) | indent(8) -}} {% endif %} -{% if client.credential_scopes %} +{% if client.credential_scopes is not none %} self.credential_scopes = kwargs.pop('credential_scopes', {{ client.credential_scopes }}) {% endif %} kwargs.setdefault('sdk_moniker', '{{ client.config.sdk_moniker }}/{}'.format(VERSION)) From ec788491a7acfcdc99432ebff0be6458f62aea6c Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Wed, 12 Feb 2025 16:04:39 +0800 Subject: [PATCH 15/24] fix test --- .../generator/pygen/codegen/models/client.py | 10 +++++++++- .../pygen/codegen/serializers/client_serializer.py | 9 +++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index f8e545fb6ac..b08ed9827c7 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -89,7 +89,15 @@ def __init__( @property def need_cloud_setting(self) -> bool: - return bool(self.code_model.options["azure_arm"] and self.credential_scopes is not None) + return bool( + self.code_model.options["azure_arm"] + and self.credential_scopes is not None + and self.endpoint_parameter is not None + ) + + @property + def endpoint_parameter(self) -> Optional[Parameter]: + return next((p for p in self.parameters.parameters if p.location == ParameterLocation.ENDPOINT_PATH), None) def _build_request_builders( self, diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index bad856f23fb..cce4332c547 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -3,10 +3,10 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import List +from typing import List, cast from . import utils -from ..models import Client, ParameterMethodLocation +from ..models import Client, ParameterMethodLocation, Parameter from .parameter_serializer import ParameterSerializer, PopKwargType from ...utils import build_policies @@ -82,12 +82,13 @@ def initialize_config(self) -> List[str]: additional_signatures = [] if self.client.need_cloud_setting: additional_signatures.append("credential_scopes=credential_scopes") + endpoint_parameter = cast(Parameter, self.client.endpoint_parameter) retval.extend( [ '_cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud # type: ignore', "_endpoints = get_arm_endpoints(_cloud)", - "if not base_url:", - ' base_url = _endpoints["resource_manager"]', + f"if not {endpoint_parameter.client_name}:", + f' {endpoint_parameter.client_name} = _endpoints["resource_manager"]', 'credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"])', ] ) From e85071695223799d1206ea632e6ca709d731d0ac Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Thu, 10 Apr 2025 13:01:29 +0800 Subject: [PATCH 16/24] update --- .../http-client-python/generator/pygen/codegen/models/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 718fef56fcd..b0f57730eb2 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -84,7 +84,7 @@ def __init__( if self.need_cloud_setting: for p in self.parameters.parameters: if p.location == ParameterLocation.ENDPOINT_PATH: - p.client_default_value = "" + p.client_default_value = None break @property From 711207f6b6e0a8ebcce6b28161f9d9bd6917adda Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Thu, 10 Apr 2025 15:06:33 +0800 Subject: [PATCH 17/24] update --- .../generator/pygen/codegen/models/client.py | 2 +- .../generator/pygen/codegen/models/parameter.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index b0f57730eb2..6fef3dd797a 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -84,7 +84,7 @@ def __init__( if self.need_cloud_setting: for p in self.parameters.parameters: if p.location == ParameterLocation.ENDPOINT_PATH: - p.client_default_value = None + p.default_to_unset_sentinel = True break @property diff --git a/packages/http-client-python/generator/pygen/codegen/models/parameter.py b/packages/http-client-python/generator/pygen/codegen/models/parameter.py index 1805e9d2fb3..abe359d11bf 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/parameter.py +++ b/packages/http-client-python/generator/pygen/codegen/models/parameter.py @@ -215,10 +215,10 @@ def in_method_signature(self) -> bool: ... def method_signature(self, async_mode: bool, **kwargs: Any) -> str: type_annotation = self.type_annotation(async_mode=async_mode, **kwargs) - if self.client_default_value is not None or self.optional: - return f"{self.client_name}: {type_annotation} = {self.client_default_value_declaration}," if self.default_to_unset_sentinel: return f"{self.client_name}: {type_annotation} = _Unset," + if self.client_default_value is not None or self.optional: + return f"{self.client_name}: {type_annotation} = {self.client_default_value_declaration}," return f"{self.client_name}: {type_annotation}," From cd729dcebd83f0d457588228dd5947d89117b5ef Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Thu, 10 Apr 2025 15:29:00 +0800 Subject: [PATCH 18/24] update --- .../generator/pygen/codegen/serializers/client_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index cce4332c547..96da02ab96c 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -87,7 +87,7 @@ def initialize_config(self) -> List[str]: [ '_cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud # type: ignore', "_endpoints = get_arm_endpoints(_cloud)", - f"if not {endpoint_parameter.client_name}:", + f"if {endpoint_parameter.client_name} is _Unset:", f' {endpoint_parameter.client_name} = _endpoints["resource_manager"]', 'credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"])', ] From 8242d371a6f043a9de29d9324429aa4458690c46 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Thu, 10 Apr 2025 16:55:57 +0800 Subject: [PATCH 19/24] fix ci --- .../http-client-python/generator/pygen/codegen/models/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 6fef3dd797a..df73d39c6f6 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -90,7 +90,7 @@ def __init__( @property def need_cloud_setting(self) -> bool: return bool( - self.code_model.options["azure_arm"] + self.code_model.options.get("azure_arm", False) and self.credential_scopes is not None and self.endpoint_parameter is not None ) From 455019edf80aef1163b8c68b8098e7f8525b56a1 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Thu, 10 Apr 2025 17:15:06 +0800 Subject: [PATCH 20/24] update --- .../generator/pygen/codegen/models/client.py | 15 ++++----------- .../generator/pygen/codegen/models/parameter.py | 4 ++-- .../codegen/serializers/client_serializer.py | 13 ++++++++++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index df73d39c6f6..14c6f6c8c49 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -84,7 +84,7 @@ def __init__( if self.need_cloud_setting: for p in self.parameters.parameters: if p.location == ParameterLocation.ENDPOINT_PATH: - p.default_to_unset_sentinel = True + p.client_default_value = None break @property @@ -254,16 +254,9 @@ def _imports_shared(self, async_mode: bool, **kwargs) -> FileImport: ImportType.STDLIB, ) if self.need_cloud_setting: - file_import.add_submodule_import( - "azure.core.settings", - "settings", - ImportType.SDKCORE, - ) - file_import.add_submodule_import( - "azure.mgmt.core.tools", - "get_arm_endpoints", - ImportType.SDKCORE, - ) + file_import.add_submodule_import("typing", "cast", ImportType.STDLIB) + file_import.add_submodule_import("azure.core.settings", "settings", ImportType.SDKCORE) + file_import.add_submodule_import("azure.mgmt.core.tools", "get_arm_endpoints", ImportType.SDKCORE) return file_import @property diff --git a/packages/http-client-python/generator/pygen/codegen/models/parameter.py b/packages/http-client-python/generator/pygen/codegen/models/parameter.py index abe359d11bf..1805e9d2fb3 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/parameter.py +++ b/packages/http-client-python/generator/pygen/codegen/models/parameter.py @@ -215,10 +215,10 @@ def in_method_signature(self) -> bool: ... def method_signature(self, async_mode: bool, **kwargs: Any) -> str: type_annotation = self.type_annotation(async_mode=async_mode, **kwargs) - if self.default_to_unset_sentinel: - return f"{self.client_name}: {type_annotation} = _Unset," if self.client_default_value is not None or self.optional: return f"{self.client_name}: {type_annotation} = {self.client_default_value_declaration}," + if self.default_to_unset_sentinel: + return f"{self.client_name}: {type_annotation} = _Unset," return f"{self.client_name}: {type_annotation}," diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index 96da02ab96c..6df9247b31b 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -6,7 +6,7 @@ from typing import List, cast from . import utils -from ..models import Client, ParameterMethodLocation, Parameter +from ..models import Client, ParameterMethodLocation, Parameter, ParameterLocation from .parameter_serializer import ParameterSerializer, PopKwargType from ...utils import build_policies @@ -87,7 +87,7 @@ def initialize_config(self) -> List[str]: [ '_cloud = kwargs.pop("cloud_setting", None) or settings.current.azure_cloud # type: ignore', "_endpoints = get_arm_endpoints(_cloud)", - f"if {endpoint_parameter.client_name} is _Unset:", + f"if not {endpoint_parameter.client_name}:", f' {endpoint_parameter.client_name} = _endpoints["resource_manager"]', 'credential_scopes = kwargs.pop("credential_scopes", _endpoints["credential_scopes"])', ] @@ -95,7 +95,14 @@ def initialize_config(self) -> List[str]: config_name = f"{self.client.name}Configuration" config_call = ", ".join( [ - f"{p.client_name}={p.client_name}" + ( + f"{p.client_name}=" + + ( + f"cast(str, {p.client_name})" + if p.location == ParameterLocation.ENDPOINT_PATH + else p.client_name + ) + ) for p in self.client.config.parameters.method if p.method_location != ParameterMethodLocation.KWARG ] From 53d45f8a432ab310c783f8eaf060366ccc48cc67 Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Thu, 10 Apr 2025 17:56:08 +0800 Subject: [PATCH 21/24] fix ci --- .../generator/pygen/codegen/serializers/client_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index 6df9247b31b..8a118b71922 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -99,7 +99,7 @@ def initialize_config(self) -> List[str]: f"{p.client_name}=" + ( f"cast(str, {p.client_name})" - if p.location == ParameterLocation.ENDPOINT_PATH + if self.client.need_cloud_setting and p.location == ParameterLocation.ENDPOINT_PATH else p.client_name ) ) From 5a80f6c7a2febc9be5cdb8ef2552d1f470ab722c Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Fri, 11 Apr 2025 11:09:01 +0800 Subject: [PATCH 22/24] fix for legacy code --- .../pygen/codegen/serializers/client_serializer.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index 8a118b71922..a04ef2fe9a1 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -127,8 +127,13 @@ def initialize_pipeline_client(self, async_mode: bool) -> List[str]: result = [] pipeline_client_name = self.client.pipeline_class(async_mode) endpoint_name = "base_url" if self.client.code_model.is_azure_flavor else "endpoint" + host_variable_name = ( + "cast(str, base_url)" + if self.host_variable_name == "base_url" and self.client.need_cloud_setting + else self.host_variable_name + ) params = { - endpoint_name: self.host_variable_name, + endpoint_name: host_variable_name, "policies": "_policies", } if not self.client.code_model.is_legacy and self.client.request_id_header_name: From 8318d9fd8132301264ea68518f67c5cc3231b98e Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Fri, 11 Apr 2025 11:36:26 +0800 Subject: [PATCH 23/24] fix for legacy code --- .../generator/pygen/codegen/models/client.py | 1 + .../generator/pygen/codegen/serializers/client_serializer.py | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/http-client-python/generator/pygen/codegen/models/client.py b/packages/http-client-python/generator/pygen/codegen/models/client.py index 14c6f6c8c49..20df8466858 100644 --- a/packages/http-client-python/generator/pygen/codegen/models/client.py +++ b/packages/http-client-python/generator/pygen/codegen/models/client.py @@ -85,6 +85,7 @@ def __init__( for p in self.parameters.parameters: if p.location == ParameterLocation.ENDPOINT_PATH: p.client_default_value = None + p.optional = True break @property diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py index a04ef2fe9a1..381d758d2e9 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/client_serializer.py @@ -128,9 +128,7 @@ def initialize_pipeline_client(self, async_mode: bool) -> List[str]: pipeline_client_name = self.client.pipeline_class(async_mode) endpoint_name = "base_url" if self.client.code_model.is_azure_flavor else "endpoint" host_variable_name = ( - "cast(str, base_url)" - if self.host_variable_name == "base_url" and self.client.need_cloud_setting - else self.host_variable_name + f"cast(str, {self.host_variable_name})" if self.client.need_cloud_setting else self.host_variable_name ) params = { endpoint_name: host_variable_name, From 15f6dfbfed280a8dc8cbe036a692b95c0246d08d Mon Sep 17 00:00:00 2001 From: Yuchao Yan Date: Wed, 16 Apr 2025 09:54:09 +0800 Subject: [PATCH 24/24] Update azure-mgmt-core version to 1.5.0 --- .../generator/pygen/codegen/serializers/general_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py index 1c23c1a37ce..d41245b1f8a 100644 --- a/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py +++ b/packages/http-client-python/generator/pygen/codegen/serializers/general_serializer.py @@ -19,7 +19,7 @@ VERSION_MAP = { "msrest": "0.7.1", "isodate": "0.6.1", - "azure-mgmt-core": "1.3.2", + "azure-mgmt-core": "1.5.0", "azure-core": "1.30.0", "typing-extensions": "4.6.0", "corehttp": "1.0.0b6",