From 7cfff1e5a119bd5386f4d51078170bebdb8c32e4 Mon Sep 17 00:00:00 2001 From: Akshaya Shanbhogue Date: Thu, 8 Jan 2026 09:02:07 -0800 Subject: [PATCH] fix(ConnectionIdOverwrites): connection id overwrites in eval In eval context `studio_client.get_resource_overwrites()` is invoked. This client provides overrides for connections as `ConnectionId` instead of `connectionId`. Allowing parsing of both fields using `AliasChoice`, but we prioritize `connectionId` over `ConnectionId` for backwards compatibility. Serialization will always be done to `connectionId`. --- pyproject.toml | 2 +- src/uipath/_utils/_bindings.py | 8 +++-- tests/sdk/test_bindings.py | 56 ++++++++++++++++++++++++++++++++++ uv.lock | 2 +- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4b77acf3c..da1cf62eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "uipath" -version = "2.4.5" +version = "2.4.6" description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools." readme = { file = "README.md", content-type = "text/markdown" } requires-python = ">=3.11" diff --git a/src/uipath/_utils/_bindings.py b/src/uipath/_utils/_bindings.py index b843a0671..223132353 100644 --- a/src/uipath/_utils/_bindings.py +++ b/src/uipath/_utils/_bindings.py @@ -13,7 +13,7 @@ Union, ) -from pydantic import BaseModel, ConfigDict, Field, TypeAdapter +from pydantic import AliasChoices, BaseModel, ConfigDict, Field, TypeAdapter T = TypeVar("T") @@ -56,7 +56,11 @@ def folder_identifier(self) -> str: class ConnectionResourceOverwrite(ResourceOverwrite): resource_type: Literal["connection"] - connection_id: str = Field(alias="connectionId") + # In eval context, studio web provides "ConnectionId". + connection_id: str = Field( + alias="connectionId", + validation_alias=AliasChoices("connectionId", "ConnectionId"), + ) folder_key: str = Field(alias="folderKey") model_config = ConfigDict( diff --git a/tests/sdk/test_bindings.py b/tests/sdk/test_bindings.py index 973dedf6c..5aaf776bd 100644 --- a/tests/sdk/test_bindings.py +++ b/tests/sdk/test_bindings.py @@ -4,7 +4,9 @@ from uipath._utils import resource_override from uipath._utils._bindings import ( + ConnectionResourceOverwrite, GenericResourceOverwrite, + ResourceOverwriteParser, ResourceOverwritesContext, _resource_overwrites, ) @@ -335,3 +337,57 @@ def get_asset(name, folder_path): # Verify context was cleaned up despite the exception result_after = get_asset("test", "original") assert result_after == ("test", "original") + + +class TestConnectionResourceOverwriteAliases: + """Test that ConnectionResourceOverwrite accepts both connectionId and ConnectionId aliases.""" + + def test_connection_resource_overwrite_with_lowercase_alias(self): + """Test that connectionId alias works.""" + overwrite = ConnectionResourceOverwrite( + resource_type="connection", + connectionId="conn-123", + folderKey="folder1", + ) + assert overwrite.connection_id == "conn-123" + assert overwrite.folder_key == "folder1" + + def test_connection_resource_overwrite_with_capitalized_alias(self): + """Test that ConnectionId alias works.""" + overwrite = ConnectionResourceOverwrite( + resource_type="connection", + ConnectionId="conn-456", + folderKey="folder2", + ) + assert overwrite.connection_id == "conn-456" + assert overwrite.folder_key == "folder2" + + def test_connection_resource_overwrite_with_field_name(self): + """Test that the actual field name connection_id also works.""" + overwrite = ConnectionResourceOverwrite( + resource_type="connection", + connection_id="conn-789", + folder_key="folder3", + ) + assert overwrite.connection_id == "conn-789" + assert overwrite.folder_key == "folder3" + + def test_parse_connection_with_lowercase_alias(self): + """Test parsing a connection resource with lowercase connectionId alias.""" + overwrite = ResourceOverwriteParser.parse( + key="connection.conn-123", + value={"connectionId": "conn-123", "folderKey": "folder1"}, + ) + assert isinstance(overwrite, ConnectionResourceOverwrite) + assert overwrite.connection_id == "conn-123" + assert overwrite.folder_key == "folder1" + + def test_parse_connection_with_capitalized_alias(self): + """Test parsing a connection resource with capitalized ConnectionId alias.""" + overwrite = ResourceOverwriteParser.parse( + key="connection.conn-456", + value={"ConnectionId": "conn-456", "folderKey": "folder2"}, + ) + assert isinstance(overwrite, ConnectionResourceOverwrite) + assert overwrite.connection_id == "conn-456" + assert overwrite.folder_key == "folder2" diff --git a/uv.lock b/uv.lock index 9a7a728ce..3f0c5cc09 100644 --- a/uv.lock +++ b/uv.lock @@ -2486,7 +2486,7 @@ wheels = [ [[package]] name = "uipath" -version = "2.4.5" +version = "2.4.6" source = { editable = "." } dependencies = [ { name = "applicationinsights" },