Skip to content

Commit 69cb248

Browse files
committed
fix: use odata api for folder search
1 parent 784add3 commit 69cb248

6 files changed

Lines changed: 39 additions & 51 deletions

File tree

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"
3-
version = "2.0.66"
3+
version = "2.0.67"
44
description = "Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools."
55
readme = { file = "README.md", content-type = "text/markdown" }
66
requires-python = ">=3.10"

src/uipath/_services/context_grounding_service.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -673,12 +673,14 @@ def _resolve_folder_key(self, folder_key, folder_path):
673673
)
674674

675675
if folder_key is None:
676-
raise ValueError("Folder key or folder path is required")
676+
raise ValueError("ContextGrounding: Failed to resolve folder key")
677677

678678
return folder_key
679679

680680
def _extract_bucket_info(self, index: ContextGroundingIndex) -> Tuple[str, str]:
681681
try:
682682
return index.data_source.bucketName, index.data_source.folder # type: ignore
683683
except AttributeError as e:
684-
raise Exception("Cannot extract bucket data from index") from e
684+
raise Exception(
685+
"ContextGrounding: Cannot extract bucket data from index"
686+
) from e

src/uipath/_services/folder_service.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,19 @@ def retrieve_key(self, *, folder_path: str) -> Optional[str]:
3434
url=spec.endpoint,
3535
params=spec.params,
3636
).json()
37-
38-
return next(
39-
(
40-
item["Key"]
41-
for item in response["PageItems"]
42-
if item["FullyQualifiedName"] == folder_path
43-
),
44-
None,
45-
)
37+
try:
38+
return response["value"][0]["Key"]
39+
except KeyError:
40+
return None
4641

4742
def _retrieve_spec(self, folder_path: str) -> RequestSpec:
4843
folder_name = folder_path.split("/")[-1]
4944
return RequestSpec(
5045
method="GET",
51-
endpoint=Endpoint(
52-
"orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser"
53-
),
46+
endpoint=Endpoint("orchestrator_/odata/Folders"),
5447
params={
55-
"searchText": folder_name,
56-
"take": 1,
48+
"$filter": f"DisplayName eq '{folder_name}'",
49+
"$top": 1,
50+
"$select": "Key",
5751
},
5852
)

tests/sdk/services/test_context_grounding_service.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,12 @@ def test_search(
3838
version: str,
3939
) -> None:
4040
httpx_mock.add_response(
41-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
41+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key",
4242
status_code=200,
4343
json={
44-
"PageItems": [
44+
"value": [
4545
{
4646
"Key": "test-folder-key",
47-
"FullyQualifiedName": "test-folder-path",
4847
}
4948
]
5049
},
@@ -68,13 +67,12 @@ def test_search(
6867
)
6968

7069
httpx_mock.add_response(
71-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
70+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key",
7271
status_code=200,
7372
json={
74-
"PageItems": [
73+
"value": [
7574
{
7675
"Key": "test-folder-key",
77-
"FullyQualifiedName": "test-folder-path",
7876
}
7977
]
8078
},
@@ -132,13 +130,12 @@ async def test_search_async(
132130
version: str,
133131
) -> None:
134132
httpx_mock.add_response(
135-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
133+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key",
136134
status_code=200,
137135
json={
138-
"PageItems": [
136+
"value": [
139137
{
140138
"Key": "test-folder-key",
141-
"FullyQualifiedName": "test-folder-path",
142139
}
143140
]
144141
},
@@ -162,13 +159,12 @@ async def test_search_async(
162159
)
163160

164161
httpx_mock.add_response(
165-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
162+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key",
166163
status_code=200,
167164
json={
168-
"PageItems": [
165+
"value": [
169166
{
170167
"Key": "test-folder-key",
171-
"FullyQualifiedName": "test-folder-path",
172168
}
173169
]
174170
},
@@ -225,13 +221,12 @@ def test_retrieve(
225221
version: str,
226222
) -> None:
227223
httpx_mock.add_response(
228-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
224+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key",
229225
status_code=200,
230226
json={
231-
"PageItems": [
227+
"value": [
232228
{
233229
"Key": "test-folder-key",
234-
"FullyQualifiedName": "test-folder-path",
235230
}
236231
]
237232
},
@@ -285,13 +280,12 @@ async def test_retrieve_async(
285280
version: str,
286281
) -> None:
287282
httpx_mock.add_response(
288-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
283+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key",
289284
status_code=200,
290285
json={
291-
"PageItems": [
286+
"value": [
292287
{
293288
"Key": "test-folder-key",
294-
"FullyQualifiedName": "test-folder-path",
295289
}
296290
]
297291
},

tests/sdk/services/test_folder_service.py

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,19 @@ def test_retrieve_key_by_folder_path(
2828
version: str,
2929
) -> None:
3030
httpx_mock.add_response(
31-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
31+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test_folder_path%27&%24top=1&%24select=Key",
3232
status_code=200,
3333
json={
34-
"PageItems": [
34+
"value": [
3535
{
3636
"Key": "test-folder-key",
37-
"FullyQualifiedName": "test-folder-path",
3837
}
3938
]
4039
},
4140
)
4241

4342
with pytest.warns(DeprecationWarning, match="Use retrieve_key instead"):
44-
folder_key = service.retrieve_key_by_folder_path("test-folder-path")
43+
folder_key = service.retrieve_key_by_folder_path("test_folder_path")
4544

4645
assert folder_key == "test-folder-key"
4746

@@ -52,7 +51,7 @@ def test_retrieve_key_by_folder_path(
5251
assert sent_request.method == "GET"
5352
assert (
5453
sent_request.url
55-
== f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1"
54+
== f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test_folder_path%27&%24top=1&%24select=Key"
5655
)
5756

5857
assert HEADER_USER_AGENT in sent_request.headers
@@ -71,9 +70,9 @@ def test_retrieve_key_by_folder_path_not_found(
7170
version: str,
7271
) -> None:
7372
httpx_mock.add_response(
74-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=non-existent-folder&take=1",
73+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27non-existent-folder%27&%24top=1&%24select=Key",
7574
status_code=200,
76-
json={"PageItems": []},
75+
json={},
7776
)
7877

7978
with pytest.warns(DeprecationWarning, match="Use retrieve_key instead"):
@@ -88,7 +87,7 @@ def test_retrieve_key_by_folder_path_not_found(
8887
assert sent_request.method == "GET"
8988
assert (
9089
sent_request.url
91-
== f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=non-existent-folder&take=1"
90+
== f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27non-existent-folder%27&%24top=1&%24select=Key"
9291
)
9392

9493
assert HEADER_USER_AGENT in sent_request.headers
@@ -107,13 +106,12 @@ def test_retrieve_key(
107106
version: str,
108107
) -> None:
109108
httpx_mock.add_response(
110-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1",
109+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key",
111110
status_code=200,
112111
json={
113-
"PageItems": [
112+
"value": [
114113
{
115114
"Key": "test-folder-key",
116-
"FullyQualifiedName": "test-folder-path",
117115
}
118116
]
119117
},
@@ -130,7 +128,7 @@ def test_retrieve_key(
130128
assert sent_request.method == "GET"
131129
assert (
132130
sent_request.url
133-
== f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=test-folder-path&take=1"
131+
== f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27test-folder-path%27&%24top=1&%24select=Key"
134132
)
135133

136134
assert HEADER_USER_AGENT in sent_request.headers
@@ -149,9 +147,9 @@ def test_retrieve_key_not_found(
149147
version: str,
150148
) -> None:
151149
httpx_mock.add_response(
152-
url=f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=non-existent-folder&take=1",
150+
url=f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27non-existent-folder%27&%24top=1&%24select=Key",
153151
status_code=200,
154-
json={"PageItems": []},
152+
json={},
155153
)
156154

157155
folder_key = service.retrieve_key_by_folder_path("non-existent-folder")
@@ -165,7 +163,7 @@ def test_retrieve_key_not_found(
165163
assert sent_request.method == "GET"
166164
assert (
167165
sent_request.url
168-
== f"{base_url}{org}{tenant}/orchestrator_/api/FoldersNavigation/GetFoldersForCurrentUser?searchText=non-existent-folder&take=1"
166+
== f"{base_url}{org}{tenant}/orchestrator_/odata/Folders?%24filter=DisplayName+eq+%27non-existent-folder%27&%24top=1&%24select=Key"
169167
)
170168

171169
assert HEADER_USER_AGENT in sent_request.headers

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)