uipath 2.1.57__py3-none-any.whl → 2.1.59__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -291,7 +291,8 @@ class SwFileHandler:
291
291
 
292
292
  # Check if the current folder is empty after processing its children
293
293
  if self._is_folder_empty(subfolder):
294
- empty_folders.append({"id": subfolder.id, "name": subfolder.name})
294
+ if subfolder.id is not None:
295
+ empty_folders.append({"id": subfolder.id, "name": subfolder.name})
295
296
 
296
297
  return empty_folders
297
298
 
@@ -67,7 +67,7 @@ class ProjectFolder(BaseModel):
67
67
  """Model representing a folder in a UiPath project structure.
68
68
 
69
69
  Attributes:
70
- id: The unique identifier of the folder
70
+ id: The unique identifier of the folder. Root folder id may be None.
71
71
  name: The name of the folder
72
72
  folders: List of subfolders
73
73
  files: List of files in the folder
@@ -82,7 +82,7 @@ class ProjectFolder(BaseModel):
82
82
  extra="allow",
83
83
  )
84
84
 
85
- id: str = Field(alias="id")
85
+ id: Optional[str] = Field(default=None, alias="id")
86
86
  name: str = Field(alias="name")
87
87
  folders: List["ProjectFolder"] = Field(default_factory=list)
88
88
  files: List[ProjectFile] = Field(default_factory=list)
uipath/tracing/_traced.py CHANGED
@@ -215,11 +215,15 @@ def _opentelemetry_traced(
215
215
  if input_processor:
216
216
  processed_inputs = input_processor(json.loads(inputs))
217
217
  inputs = json.dumps(processed_inputs, default=str)
218
- span.set_attribute("inputs", inputs)
218
+ span.set_attribute("input.mime_type", "application/json")
219
+ span.set_attribute("input.value", inputs)
219
220
 
220
221
  result = func(*args, **kwargs)
221
222
  output = output_processor(result) if output_processor else result
222
- span.set_attribute("output", json.dumps(output, default=str))
223
+ span.set_attribute(
224
+ "output.value", _SpanUtils.format_object_for_trace_json(output)
225
+ )
226
+ span.set_attribute("output.mime_type", "application/json")
223
227
  return result
224
228
  except Exception as e:
225
229
  span.record_exception(e)
@@ -249,11 +253,15 @@ def _opentelemetry_traced(
249
253
  if input_processor:
250
254
  processed_inputs = input_processor(json.loads(inputs))
251
255
  inputs = json.dumps(processed_inputs, default=str)
252
- span.set_attribute("inputs", inputs)
256
+ span.set_attribute("input.mime_type", "application/json")
257
+ span.set_attribute("input.value", inputs)
253
258
 
254
259
  result = await func(*args, **kwargs)
255
260
  output = output_processor(result) if output_processor else result
256
- span.set_attribute("output", json.dumps(output, default=str))
261
+ span.set_attribute(
262
+ "output.value", _SpanUtils.format_object_for_trace_json(output)
263
+ )
264
+ span.set_attribute("output.mime_type", "application/json")
257
265
  return result
258
266
  except Exception as e:
259
267
  span.record_exception(e)
@@ -285,7 +293,8 @@ def _opentelemetry_traced(
285
293
  if input_processor:
286
294
  processed_inputs = input_processor(json.loads(inputs))
287
295
  inputs = json.dumps(processed_inputs, default=str)
288
- span.set_attribute("inputs", inputs)
296
+ span.set_attribute("input.mime_type", "application/json")
297
+ span.set_attribute("input.value", inputs)
289
298
 
290
299
  outputs = []
291
300
  for item in func(*args, **kwargs):
@@ -293,7 +302,10 @@ def _opentelemetry_traced(
293
302
  span.add_event(f"Yielded: {item}")
294
303
  yield item
295
304
  output = output_processor(outputs) if output_processor else outputs
296
- span.set_attribute("output", json.dumps(output, default=str))
305
+ span.set_attribute(
306
+ "output.value", _SpanUtils.format_object_for_trace_json(output)
307
+ )
308
+ span.set_attribute("output.mime_type", "application/json")
297
309
  except Exception as e:
298
310
  span.record_exception(e)
299
311
  span.set_status(
@@ -324,7 +336,8 @@ def _opentelemetry_traced(
324
336
  if input_processor:
325
337
  processed_inputs = input_processor(json.loads(inputs))
326
338
  inputs = json.dumps(processed_inputs, default=str)
327
- span.set_attribute("inputs", inputs)
339
+ span.set_attribute("input.mime_type", "application/json")
340
+ span.set_attribute("input.value", inputs)
328
341
 
329
342
  outputs = []
330
343
  async for item in func(*args, **kwargs):
@@ -332,7 +345,10 @@ def _opentelemetry_traced(
332
345
  span.add_event(f"Yielded: {item}")
333
346
  yield item
334
347
  output = output_processor(outputs) if output_processor else outputs
335
- span.set_attribute("output", json.dumps(output, default=str))
348
+ span.set_attribute(
349
+ "output.value", _SpanUtils.format_object_for_trace_json(output)
350
+ )
351
+ span.set_attribute("output.mime_type", "application/json")
336
352
  except Exception as e:
337
353
  span.record_exception(e)
338
354
  span.set_status(
uipath/tracing/_utils.py CHANGED
@@ -4,10 +4,12 @@ import logging
4
4
  import os
5
5
  import random
6
6
  import uuid
7
- from dataclasses import dataclass, field
8
- from datetime import datetime
7
+ from dataclasses import asdict, dataclass, field, is_dataclass
8
+ from datetime import datetime, timezone
9
+ from enum import Enum
9
10
  from os import environ as env
10
11
  from typing import Any, Dict, Optional
12
+ from zoneinfo import ZoneInfo
11
13
 
12
14
  from opentelemetry.sdk.trace import ReadableSpan
13
15
  from opentelemetry.trace import StatusCode
@@ -15,6 +17,36 @@ from opentelemetry.trace import StatusCode
15
17
  logger = logging.getLogger(__name__)
16
18
 
17
19
 
20
+ def _simple_serialize_defaults(obj):
21
+ if hasattr(obj, "model_dump"):
22
+ return obj.model_dump(exclude_none=True, mode="json")
23
+ if hasattr(obj, "dict"):
24
+ return obj.dict()
25
+ if hasattr(obj, "to_dict"):
26
+ return obj.to_dict()
27
+
28
+ # Handle dataclasses
29
+ if is_dataclass(obj) and not isinstance(obj, type):
30
+ return asdict(obj)
31
+
32
+ # Handle enums
33
+ if isinstance(obj, Enum):
34
+ return obj.value
35
+
36
+ if isinstance(obj, (set, tuple)):
37
+ if hasattr(obj, "_asdict") and callable(obj._asdict):
38
+ return obj._asdict()
39
+ return list(obj)
40
+
41
+ if isinstance(obj, datetime):
42
+ return obj.isoformat()
43
+
44
+ if isinstance(obj, (timezone, ZoneInfo)):
45
+ return obj.tzname(None)
46
+
47
+ return str(obj)
48
+
49
+
18
50
  @dataclass
19
51
  class UiPathSpan:
20
52
  """Represents a span in the UiPath tracing system."""
@@ -150,30 +182,32 @@ class _SpanUtils:
150
182
  status = 2 # Error
151
183
  attributes_dict["error"] = otel_span.status.description
152
184
 
153
- original_inputs = attributes_dict.get("inputs", None)
154
- original_outputs = attributes_dict.get("outputs", None)
185
+ original_inputs = attributes_dict.get("input", None)
186
+ original_outputs = attributes_dict.get("output", None)
155
187
 
156
188
  if original_inputs:
157
189
  try:
158
190
  if isinstance(original_inputs, str):
159
191
  json_inputs = json.loads(original_inputs)
160
- attributes_dict["inputs"] = json_inputs
192
+ attributes_dict["input.value"] = json_inputs
193
+ attributes_dict["input.mime_type"] = "application/json"
161
194
  else:
162
- attributes_dict["inputs"] = original_inputs
195
+ attributes_dict["input.value"] = original_inputs
163
196
  except Exception as e:
164
- print(f"Error parsing inputs: {e}")
165
- attributes_dict["inputs"] = str(original_inputs)
197
+ logger.warning(f"Error parsing inputs: {e}")
198
+ attributes_dict["input.value"] = str(original_inputs)
166
199
 
167
200
  if original_outputs:
168
201
  try:
169
202
  if isinstance(original_outputs, str):
170
203
  json_outputs = json.loads(original_outputs)
171
- attributes_dict["outputs"] = json_outputs
204
+ attributes_dict["output.value"] = json_outputs
205
+ attributes_dict["output.mime_type"] = "application/json"
172
206
  else:
173
- attributes_dict["outputs"] = original_outputs
207
+ attributes_dict["output.value"] = original_outputs
174
208
  except Exception as e:
175
- print(f"Error parsing outputs: {e}")
176
- attributes_dict["outputs"] = str(original_outputs)
209
+ logger.warning(f"Error parsing output: {e}")
210
+ attributes_dict["output.value"] = str(original_outputs)
177
211
 
178
212
  # Add events as additional attributes if they exist
179
213
  if otel_span.events:
@@ -233,7 +267,14 @@ class _SpanUtils:
233
267
  ) -> str:
234
268
  """Return a JSON string of inputs from the function signature."""
235
269
  result = _SpanUtils.format_args_for_trace(signature, *args, **kwargs)
236
- return json.dumps(result, default=str)
270
+ return json.dumps(result, default=_simple_serialize_defaults)
271
+
272
+ @staticmethod
273
+ def format_object_for_trace_json(
274
+ input_object: Any,
275
+ ) -> str:
276
+ """Return a JSON string of inputs from the function signature."""
277
+ return json.dumps(input_object, default=_simple_serialize_defaults)
237
278
 
238
279
  @staticmethod
239
280
  def format_args_for_trace(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: uipath
3
- Version: 2.1.57
3
+ Version: 2.1.59
4
4
  Summary: Python SDK and CLI for UiPath Platform, enabling programmatic interaction with automation services, process management, and deployment tools.
5
5
  Project-URL: Homepage, https://uipath.com
6
6
  Project-URL: Repository, https://github.com/UiPath/uipath-python
@@ -49,7 +49,7 @@ uipath/_cli/_evals/_runtime.py,sha256=KFGl2we1RH0omuD2HWw5thIK6DDZxVGtqx_G9T4DM_
49
49
  uipath/_cli/_evals/_models/_evaluation_set.py,sha256=mwcTstHuyHd7ys_nLzgCNKBAsS4ns9UL2TF5Oq2Cc64,1758
50
50
  uipath/_cli/_evals/_models/_evaluator_base_params.py,sha256=lTYKOV66tcjW85KHTyOdtF1p1VDaBNemrMAvH8bFIFc,382
51
51
  uipath/_cli/_evals/_models/_output.py,sha256=TTQ0hhmD3dTkIbj_Ly_rDCGSnpZsHwdmCsl7FLdoZD0,2634
52
- uipath/_cli/_push/sw_file_handler.py,sha256=AX4TKM-q6CNGw3JyBW02M8ktPZuFMcAU9LN3Ii0Q2QI,18202
52
+ uipath/_cli/_push/sw_file_handler.py,sha256=iE8Sk1Z-9hxmLFFj3j-k4kTK6TzNFP6hUCmxTudG6JQ,18251
53
53
  uipath/_cli/_runtime/_contracts.py,sha256=7JSb-2C2zWigEW5hCsVz9vz19RNR8nSaML8-PC4lkmI,28665
54
54
  uipath/_cli/_runtime/_escalation.py,sha256=x3vI98qsfRA-fL_tNkRVTFXioM5Gv2w0GFcXJJ5eQtg,7981
55
55
  uipath/_cli/_runtime/_hitl.py,sha256=VKbM021nVg1HEDnTfucSLJ0LsDn83CKyUtVzofS2qTU,11369
@@ -71,7 +71,7 @@ uipath/_cli/_utils/_input_args.py,sha256=3LGNqVpJItvof75VGm-ZNTUMUH9-c7-YgleM5b2
71
71
  uipath/_cli/_utils/_parse_ast.py,sha256=8Iohz58s6bYQ7rgWtOTjrEInLJ-ETikmOMZzZdIY2Co,20072
72
72
  uipath/_cli/_utils/_processes.py,sha256=q7DfEKHISDWf3pngci5za_z0Pbnf_shWiYEcTOTCiyk,1855
73
73
  uipath/_cli/_utils/_project_files.py,sha256=sulh3xZhDDw_rBOrn_XSUfVSD6sUu47ZK4n_lF5BKkQ,13197
74
- uipath/_cli/_utils/_studio_project.py,sha256=4aoRFj5FazUPpPltfr3jvyjoLsUd4hyl9We4SAuKFh4,15376
74
+ uipath/_cli/_utils/_studio_project.py,sha256=VR9SXsn9vfSoEwhJFXjkhnm62A2gLquGpqp8wpwEz7o,15429
75
75
  uipath/_cli/_utils/_tracing.py,sha256=2igb03j3EHjF_A406UhtCKkPfudVfFPjUq5tXUEG4oo,1541
76
76
  uipath/_cli/_utils/_uv_helpers.py,sha256=6SvoLnZPoKIxW0sjMvD1-ENV_HOXDYzH34GjBqwT138,3450
77
77
  uipath/_resources/AGENTS.md,sha256=YWhWuX9XIbyVhVT3PnPc4Of3_q6bsNJcuzYu3N8f_Ug,25850
@@ -146,12 +146,12 @@ uipath/telemetry/_constants.py,sha256=uRDuEZayBYtBA0tMx-2AS_D-oiVA7oKgp9zid9jNat
146
146
  uipath/telemetry/_track.py,sha256=G_Pyq8n8iMvoCWhUpWedlptXUSuUSbQBBzGxsh4DW9c,4654
147
147
  uipath/tracing/__init__.py,sha256=GKRINyWdHVrDsI-8mrZDLdf0oey6GHGlNZTOADK-kgc,224
148
148
  uipath/tracing/_otel_exporters.py,sha256=X7cnuGqvxGbACZuFD2XYTWXwIse8pokOEAjeTPE6DCQ,3158
149
- uipath/tracing/_traced.py,sha256=CsuNMy67R5HCunuu84LnRNwcadNLhtHLMEawGaNsTYs,18435
150
- uipath/tracing/_utils.py,sha256=wJRELaPu69iY0AhV432Dk5QYf_N_ViRU4kAUG1BI1ew,10384
149
+ uipath/tracing/_traced.py,sha256=CJIp6wqIoHVTmh9-Kuk7diD4OJDTAeA6x3zI9w0i4lI,19307
150
+ uipath/tracing/_utils.py,sha256=ny3VgfUPT_5fQ0BAFl7hitR2jH6nNuuZEpR7DKVd8QE,11739
151
151
  uipath/utils/__init__.py,sha256=VD-KXFpF_oWexFg6zyiWMkxl2HM4hYJMIUDZ1UEtGx0,105
152
152
  uipath/utils/_endpoints_manager.py,sha256=iRTl5Q0XAm_YgcnMcJOXtj-8052sr6jpWuPNz6CgT0Q,8408
153
- uipath-2.1.57.dist-info/METADATA,sha256=LZV3q6VHuyZ0YY919szKSEItcd9Ir0p4wocixl1r7T0,6482
154
- uipath-2.1.57.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
155
- uipath-2.1.57.dist-info/entry_points.txt,sha256=9C2_29U6Oq1ExFu7usihR-dnfIVNSKc-0EFbh0rskB4,43
156
- uipath-2.1.57.dist-info/licenses/LICENSE,sha256=-KBavWXepyDjimmzH5fVAsi-6jNVpIKFc2kZs0Ri4ng,1058
157
- uipath-2.1.57.dist-info/RECORD,,
153
+ uipath-2.1.59.dist-info/METADATA,sha256=rdYh58XcywOF-95bX4oq6F-XMcFD4s5Yu9bjiI78WI8,6482
154
+ uipath-2.1.59.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
155
+ uipath-2.1.59.dist-info/entry_points.txt,sha256=9C2_29U6Oq1ExFu7usihR-dnfIVNSKc-0EFbh0rskB4,43
156
+ uipath-2.1.59.dist-info/licenses/LICENSE,sha256=-KBavWXepyDjimmzH5fVAsi-6jNVpIKFc2kZs0Ri4ng,1058
157
+ uipath-2.1.59.dist-info/RECORD,,