Skip to content

Commit 1bf32e2

Browse files
Fix/entity overwrite fixes (#1548)
1 parent cbcb884 commit 1bf32e2

17 files changed

Lines changed: 1171 additions & 78 deletions

File tree

packages/uipath-platform/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "uipath-platform"
3-
version = "0.1.23"
3+
version = "0.1.24"
44
description = "HTTP client library for programmatic access to UiPath Platform"
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.11"

packages/uipath-platform/src/uipath/platform/_uipath.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,9 @@ def llm(self) -> UiPathLlmChatService:
139139

140140
@property
141141
def entities(self) -> EntitiesService:
142-
return EntitiesService(self._config, self._execution_context)
142+
return EntitiesService(
143+
self._config, self._execution_context, folders_service=self.folders
144+
)
143145

144146
@cached_property
145147
def resource_catalog(self) -> ResourceCatalogService:

packages/uipath-platform/src/uipath/platform/common/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from ._base_service import BaseService
88
from ._bindings import (
99
ConnectionResourceOverwrite,
10+
EntityResourceOverwrite,
1011
GenericResourceOverwrite,
1112
ResourceOverwrite,
1213
ResourceOverwriteParser,
@@ -100,6 +101,7 @@
100101
"EndpointManager",
101102
"jsonschema_to_pydantic",
102103
"ConnectionResourceOverwrite",
104+
"EntityResourceOverwrite",
103105
"GenericResourceOverwrite",
104106
"ResourceOverwrite",
105107
"ResourceOverwriteParser",

packages/uipath-platform/src/uipath/platform/common/_bindings.py

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@
1414
Union,
1515
)
1616

17-
from pydantic import AliasChoices, BaseModel, ConfigDict, Field, TypeAdapter
17+
from pydantic import (
18+
AliasChoices,
19+
BaseModel,
20+
ConfigDict,
21+
Field,
22+
TypeAdapter,
23+
model_validator,
24+
)
1825

1926
logger = logging.getLogger(__name__)
2027

@@ -45,7 +52,7 @@ def folder_identifier(self) -> str:
4552

4653
class GenericResourceOverwrite(ResourceOverwrite):
4754
resource_type: Literal[
48-
"process", "index", "app", "asset", "bucket", "mcpServer", "queue", "entity"
55+
"process", "index", "app", "asset", "bucket", "mcpServer", "queue"
4956
]
5057
name: str = Field(alias="name")
5158
folder_path: str = Field(alias="folderPath")
@@ -59,6 +66,29 @@ def folder_identifier(self) -> str:
5966
return self.folder_path
6067

6168

69+
class EntityResourceOverwrite(ResourceOverwrite):
70+
resource_type: Literal["entity"]
71+
name: str = Field(alias="name")
72+
folder_id: Optional[str] = Field(default=None, alias="folderId")
73+
folder_path: Optional[str] = Field(default=None, alias="folderPath")
74+
75+
@model_validator(mode="after")
76+
def validate_folder_identifier(self) -> "EntityResourceOverwrite":
77+
if self.folder_id and self.folder_path:
78+
raise ValueError("Only one of folderId or folderPath may be provided.")
79+
if not self.folder_id and not self.folder_path:
80+
raise ValueError("Either folderId or folderPath must be provided.")
81+
return self
82+
83+
@property
84+
def resource_identifier(self) -> str:
85+
return self.name
86+
87+
@property
88+
def folder_identifier(self) -> str:
89+
return self.folder_id or self.folder_path or ""
90+
91+
6292
class ConnectionResourceOverwrite(ResourceOverwrite):
6393
resource_type: Literal["connection"]
6494
# In eval context, studio web provides "ConnectionId".
@@ -83,7 +113,9 @@ def folder_identifier(self) -> str:
83113

84114

85115
ResourceOverwriteUnion = Annotated[
86-
Union[GenericResourceOverwrite, ConnectionResourceOverwrite],
116+
Union[
117+
GenericResourceOverwrite, EntityResourceOverwrite, ConnectionResourceOverwrite
118+
],
87119
Field(discriminator="resource_type"),
88120
]
89121

@@ -112,9 +144,23 @@ def parse(cls, key: str, value: dict[str, Any]) -> ResourceOverwrite:
112144
The appropriate ResourceOverwrite subclass instance
113145
"""
114146
resource_type = key.split(".")[0]
115-
value_with_type = {"resource_type": resource_type, **value}
147+
normalized_value = cls._normalize_value(resource_type, value)
148+
value_with_type = {"resource_type": resource_type, **normalized_value}
116149
return cls._adapter.validate_python(value_with_type)
117150

151+
@staticmethod
152+
def _normalize_value(resource_type: str, value: dict[str, Any]) -> dict[str, Any]:
153+
if resource_type != "entity":
154+
return value
155+
156+
normalized = dict(value)
157+
if "folderId" in normalized:
158+
normalized["folder_id"] = normalized.pop("folderId")
159+
if "folderPath" in normalized:
160+
normalized["folder_path"] = normalized.pop("folderPath")
161+
162+
return normalized
163+
118164

119165
_resource_overwrites: ContextVar[Optional[dict[str, ResourceOverwrite]]] = ContextVar(
120166
"resource_overwrites", default=None

packages/uipath-platform/src/uipath/platform/entities/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
from ._entities_service import EntitiesService
77
from .entities import (
8+
DataFabricEntityItem,
89
Entity,
910
EntityField,
1011
EntityFieldMetadata,
1112
EntityRecord,
1213
EntityRecordsBatchResponse,
1314
EntityRouting,
15+
EntitySetResolution,
1416
ExternalField,
1517
ExternalObject,
1618
ExternalSourceFields,
@@ -22,12 +24,14 @@
2224
)
2325

2426
__all__ = [
27+
"DataFabricEntityItem",
2528
"EntitiesService",
2629
"Entity",
2730
"EntityField",
2831
"EntityRecord",
2932
"EntityFieldMetadata",
3033
"EntityRouting",
34+
"EntitySetResolution",
3135
"FieldDataType",
3236
"FieldMetadata",
3337
"EntityRecordsBatchResponse",

0 commit comments

Comments
 (0)