Skip to content

Commit 8ffcecf

Browse files
committed
fix: trace resource overrides
1 parent 2a557c8 commit 8ffcecf

File tree

12 files changed

+152
-69
lines changed

12 files changed

+152
-69
lines changed

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.4.3"
3+
version = "2.4.4"
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.11"

src/uipath/_utils/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from ._bindings import get_inferred_bindings_names, resource_override
1+
from ._bindings import resource_override
22
from ._endpoint import Endpoint
33
from ._logs import setup_logging
44
from ._request_override import header_folder
@@ -12,7 +12,6 @@
1212
"setup_logging",
1313
"RequestSpec",
1414
"header_folder",
15-
"get_inferred_bindings_names",
1615
"resource_override",
1716
"header_user_agent",
1817
"user_agent_value",

src/uipath/_utils/_bindings.py

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,29 @@ def resource_override(
139139
resource_identifier: str = "name",
140140
folder_identifier: str = "folder_path",
141141
) -> Callable[..., Any]:
142+
"""Decorator for applying resource overrides for an overridable resource.
143+
144+
It checks the current ContextVar to identify the requested overrides and, if any key matches, it invokes the decorated function
145+
with the extracted resource and folder identifiers.
146+
147+
Args:
148+
resource_type: Type of resource to check for overrides (e.g., "model", "dataset")
149+
resource_identifier: Key name for the resource ID in override data (default: "name")
150+
folder_identifier: Key name for the folder path in override data (default: "folder_path")
151+
152+
Returns:
153+
Decorated function that receives overridden resource identifiers when applicable
154+
155+
Note:
156+
Must be applied BEFORE the @traced decorator to ensure proper execution order.
157+
"""
158+
142159
def decorator(func: Callable[..., Any]):
143-
@functools.wraps(func)
144-
def wrapper(*args, **kwargs):
160+
sig = inspect.signature(func)
161+
162+
def process_args(args, kwargs) -> dict[str, Any]:
163+
"""Process arguments and apply resource overrides if applicable."""
145164
# convert both args and kwargs to single dict
146-
sig = inspect.signature(func)
147165
bound = sig.bind_partial(*args, **kwargs)
148166
bound.apply_defaults()
149167
all_args = dict(bound.arguments)
@@ -177,22 +195,23 @@ def wrapper(*args, **kwargs):
177195
matched_overwrite.folder_identifier
178196
)
179197

180-
return func(**all_args)
198+
return all_args
181199

182-
wrapper._should_infer_bindings = True # type: ignore[attr-defined] # probably a better way to do this
183-
wrapper._infer_bindings_mappings = { # type: ignore[attr-defined] # probably a better way to do this
184-
"name": resource_identifier,
185-
"folder_path": folder_identifier,
186-
}
187-
return wrapper
200+
if inspect.iscoroutinefunction(func):
188201

189-
return decorator
202+
@functools.wraps(func)
203+
async def async_wrapper(*args, **kwargs):
204+
all_args = process_args(args, kwargs)
205+
return await func(**all_args)
190206

207+
return async_wrapper
208+
else:
191209

192-
def get_inferred_bindings_names(cls: T):
193-
inferred_bindings = {}
194-
for name, method in inspect.getmembers(cls, inspect.isfunction):
195-
if hasattr(method, "_should_infer_bindings") and method._should_infer_bindings:
196-
inferred_bindings[name] = method._infer_bindings_mappings # type: ignore # probably a better way to do this
210+
@functools.wraps(func)
211+
def wrapper(*args, **kwargs):
212+
all_args = process_args(args, kwargs)
213+
return func(**all_args)
197214

198-
return inferred_bindings
215+
return wrapper
216+
217+
return decorator

src/uipath/platform/action_center/_tasks_service.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,12 @@ def __init__(
166166
) -> None:
167167
super().__init__(config=config, execution_context=execution_context)
168168

169-
@traced(name="tasks_create", run_type="uipath")
170169
@resource_override(
171170
resource_type="app",
172171
resource_identifier="app_name",
173172
folder_identifier="app_folder_path",
174173
)
174+
@traced(name="tasks_create", run_type="uipath")
175175
async def create_async(
176176
self,
177177
title: str,
@@ -234,12 +234,12 @@ async def create_async(
234234
)
235235
return Task.model_validate(json_response)
236236

237-
@traced(name="tasks_create", run_type="uipath")
238237
@resource_override(
239238
resource_type="app",
240239
resource_identifier="app_name",
241240
folder_identifier="app_folder_path",
242241
)
242+
@traced(name="tasks_create", run_type="uipath")
243243
def create(
244244
self,
245245
title: str,
@@ -302,12 +302,12 @@ def create(
302302
)
303303
return Task.model_validate(json_response)
304304

305-
@traced(name="tasks_retrieve", run_type="uipath")
306305
@resource_override(
307306
resource_type="app",
308307
resource_identifier="app_name",
309308
folder_identifier="app_folder_path",
310309
)
310+
@traced(name="tasks_retrieve", run_type="uipath")
311311
def retrieve(
312312
self,
313313
action_key: str,
@@ -336,12 +336,12 @@ def retrieve(
336336

337337
return Task.model_validate(response.json())
338338

339-
@traced(name="tasks_retrieve", run_type="uipath")
340339
@resource_override(
341340
resource_type="app",
342341
resource_identifier="app_name",
343342
folder_identifier="app_folder_path",
344343
)
344+
@traced(name="tasks_retrieve", run_type="uipath")
345345
async def retrieve_async(
346346
self,
347347
action_key: str,

src/uipath/platform/connections/_connections_service.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ def __init__(
3737
super().__init__(config=config, execution_context=execution_context)
3838
self._folders_service = folders_service
3939

40+
@resource_override("connection", resource_identifier="key")
4041
@traced(
4142
name="connections_retrieve",
4243
run_type="uipath",
4344
hide_output=True,
4445
)
45-
@resource_override("connection", resource_identifier="key")
4646
def retrieve(self, key: str) -> Connection:
4747
"""Retrieve connection details by its key.
4848
@@ -248,12 +248,12 @@ async def list_async(
248248

249249
return self._parse_and_validate_list_response(response)
250250

251+
@resource_override("connection", resource_identifier="key")
251252
@traced(
252253
name="connections_retrieve",
253254
run_type="uipath",
254255
hide_output=True,
255256
)
256-
@resource_override("connection", resource_identifier="key")
257257
async def retrieve_async(self, key: str) -> Connection:
258258
"""Asynchronously retrieve connection details by its key.
259259

src/uipath/platform/context_grounding/_context_grounding_service.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ def __init__(
7474
super().__init__(config=config, execution_context=execution_context)
7575

7676
# 2.3.0 prefix trace name with contextgrounding
77-
@traced(name="add_to_index", run_type="uipath")
7877
@resource_override(resource_type="index")
78+
@traced(name="add_to_index", run_type="uipath")
7979
def add_to_index(
8080
self,
8181
name: str,
@@ -130,8 +130,8 @@ def add_to_index(
130130
self.ingest_data(index, folder_key=folder_key, folder_path=folder_path)
131131

132132
# 2.3.0 prefix trace name with contextgrounding
133-
@traced(name="add_to_index", run_type="uipath")
134133
@resource_override(resource_type="index")
134+
@traced(name="add_to_index", run_type="uipath")
135135
async def add_to_index_async(
136136
self,
137137
name: str,
@@ -189,8 +189,8 @@ async def add_to_index_async(
189189
index, folder_key=folder_key, folder_path=folder_path
190190
)
191191

192-
@traced(name="contextgrounding_retrieve", run_type="uipath")
193192
@resource_override(resource_type="index")
193+
@traced(name="contextgrounding_retrieve", run_type="uipath")
194194
def retrieve(
195195
self,
196196
name: str,
@@ -231,8 +231,8 @@ def retrieve(
231231
except StopIteration as e:
232232
raise Exception("ContextGroundingIndex not found") from e
233233

234-
@traced(name="contextgrounding_retrieve", run_type="uipath")
235234
@resource_override(resource_type="index")
235+
@traced(name="contextgrounding_retrieve", run_type="uipath")
236236
async def retrieve_async(
237237
self,
238238
name: str,
@@ -343,8 +343,8 @@ async def retrieve_by_id_async(
343343

344344
return response.json()
345345

346-
@traced(name="contextgrounding_create_index", run_type="uipath")
347346
@resource_override(resource_type="index")
347+
@traced(name="contextgrounding_create_index", run_type="uipath")
348348
def create_index(
349349
self,
350350
name: str,
@@ -398,8 +398,8 @@ def create_index(
398398

399399
return ContextGroundingIndex.model_validate(response.json())
400400

401-
@traced(name="contextgrounding_create_index", run_type="uipath")
402401
@resource_override(resource_type="index")
402+
@traced(name="contextgrounding_create_index", run_type="uipath")
403403
async def create_index_async(
404404
self,
405405
name: str,
@@ -453,8 +453,8 @@ async def create_index_async(
453453

454454
return ContextGroundingIndex.model_validate(response.json())
455455

456-
@traced(name="contextgrounding_retrieve_deep_rag", run_type="uipath")
457456
@resource_override(resource_type="index", resource_identifier="index_name")
457+
@traced(name="contextgrounding_retrieve_deep_rag", run_type="uipath")
458458
def retrieve_deep_rag(
459459
self,
460460
id: str,
@@ -482,8 +482,8 @@ def retrieve_deep_rag(
482482
)
483483
return DeepRagResponse.model_validate(response.json())
484484

485-
@traced(name="contextgrounding_retrieve_deep_rag_async", run_type="uipath")
486485
@resource_override(resource_type="index", resource_identifier="index_name")
486+
@traced(name="contextgrounding_retrieve_deep_rag_async", run_type="uipath")
487487
async def retrieve_deep_rag_async(
488488
self,
489489
id: str,
@@ -513,8 +513,8 @@ async def retrieve_deep_rag_async(
513513

514514
return DeepRagResponse.model_validate(response.json())
515515

516-
@traced(name="contextgrounding_start_batch_transform", run_type="uipath")
517516
@resource_override(resource_type="index", resource_identifier="index_name")
517+
@traced(name="contextgrounding_start_batch_transform", run_type="uipath")
518518
def start_batch_transform(
519519
self,
520520
name: str,
@@ -571,8 +571,8 @@ def start_batch_transform(
571571
)
572572
return BatchTransformCreationResponse.model_validate(response.json())
573573

574-
@traced(name="contextgrounding_start_batch_transform_async", run_type="uipath")
575574
@resource_override(resource_type="index", resource_identifier="index_name")
575+
@traced(name="contextgrounding_start_batch_transform_async", run_type="uipath")
576576
async def start_batch_transform_async(
577577
self,
578578
name: str,
@@ -629,8 +629,8 @@ async def start_batch_transform_async(
629629
)
630630
return BatchTransformCreationResponse.model_validate(response.json())
631631

632-
@traced(name="contextgrounding_retrieve_batch_transform", run_type="uipath")
633632
@resource_override(resource_type="index", resource_identifier="index_name")
633+
@traced(name="contextgrounding_retrieve_batch_transform", run_type="uipath")
634634
def retrieve_batch_transform(
635635
self,
636636
id: str,
@@ -655,8 +655,8 @@ def retrieve_batch_transform(
655655
)
656656
return BatchTransformResponse.model_validate(response.json())
657657

658-
@traced(name="contextgrounding_retrieve_batch_transform_async", run_type="uipath")
659658
@resource_override(resource_type="index", resource_identifier="index_name")
659+
@traced(name="contextgrounding_retrieve_batch_transform_async", run_type="uipath")
660660
async def retrieve_batch_transform_async(
661661
self,
662662
id: str,
@@ -681,8 +681,8 @@ async def retrieve_batch_transform_async(
681681
)
682682
return BatchTransformResponse.model_validate(response.json())
683683

684-
@traced(name="contextgrounding_download_batch_transform_result", run_type="uipath")
685684
@resource_override(resource_type="index", resource_identifier="index_name")
685+
@traced(name="contextgrounding_download_batch_transform_result", run_type="uipath")
686686
def download_batch_transform_result(
687687
self,
688688
id: str,
@@ -727,10 +727,10 @@ def download_batch_transform_result(
727727
file_content = client.get(uri_response.uri).content
728728
file.write(file_content)
729729

730+
@resource_override(resource_type="index", resource_identifier="index_name")
730731
@traced(
731732
name="contextgrounding_download_batch_transform_result_async", run_type="uipath"
732733
)
733-
@resource_override(resource_type="index", resource_identifier="index_name")
734734
async def download_batch_transform_result_async(
735735
self,
736736
id: str,
@@ -777,8 +777,8 @@ async def download_batch_transform_result_async(
777777
with open(destination_path, "wb") as file:
778778
file.write(file_content)
779779

780-
@traced(name="contextgrounding_start_deep_rag", run_type="uipath")
781780
@resource_override(resource_type="index", resource_identifier="index_name")
781+
@traced(name="contextgrounding_start_deep_rag", run_type="uipath")
782782
def start_deep_rag(
783783
self,
784784
name: str,
@@ -829,8 +829,8 @@ def start_deep_rag(
829829

830830
return DeepRagCreationResponse.model_validate(response.json())
831831

832-
@traced(name="contextgrounding_start_deep_rag_async", run_type="uipath")
833832
@resource_override(resource_type="index", resource_identifier="index_name")
833+
@traced(name="contextgrounding_start_deep_rag_async", run_type="uipath")
834834
async def start_deep_rag_async(
835835
self,
836836
name: str,
@@ -882,8 +882,8 @@ async def start_deep_rag_async(
882882

883883
return DeepRagCreationResponse.model_validate(response.json())
884884

885-
@traced(name="contextgrounding_search", run_type="uipath")
886885
@resource_override(resource_type="index")
886+
@traced(name="contextgrounding_search", run_type="uipath")
887887
def search(
888888
self,
889889
name: str,
@@ -931,8 +931,8 @@ def search(
931931
response.json()
932932
)
933933

934-
@traced(name="contextgrounding_search", run_type="uipath")
935934
@resource_override(resource_type="index")
935+
@traced(name="contextgrounding_search", run_type="uipath")
936936
async def search_async(
937937
self,
938938
name: str,

0 commit comments

Comments
 (0)