Skip to content
This repository was archived by the owner on Mar 4, 2026. It is now read-only.

Commit a6fd129

Browse files
committed
wip: uipath-platform
1 parent fd9e827 commit a6fd129

4 files changed

Lines changed: 125 additions & 3 deletions

File tree

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""Serialization utilities for converting Python objects to various formats."""
22

3-
from .json import serialize_defaults, serialize_json
3+
from .json import serialize_defaults, serialize_json, serialize_object
44

5-
__all__ = ["serialize_defaults", "serialize_json"]
5+
__all__ = ["serialize_defaults", "serialize_json", "serialize_object"]

src/uipath/core/serialization/json.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
"""JSON serialization utilities for converting Python objects to JSON formats."""
22

33
import json
4+
import uuid
45
from dataclasses import asdict, is_dataclass
5-
from datetime import datetime, timezone
6+
from datetime import date, datetime, time, timezone
67
from enum import Enum
78
from typing import Any, cast
89
from zoneinfo import ZoneInfo
@@ -156,3 +157,40 @@ def serialize_json(obj: Any) -> str:
156157
'{"name": "Review PR", "created": "2024-01-15T10:30:00"}'
157158
"""
158159
return json.dumps(obj, default=serialize_defaults)
160+
161+
162+
def serialize_object(obj):
163+
"""Recursively serializes an object and all its nested components."""
164+
# Handle Pydantic models
165+
if hasattr(obj, "model_dump"):
166+
return serialize_object(obj.model_dump(by_alias=True))
167+
elif hasattr(obj, "dict"):
168+
return serialize_object(obj.dict())
169+
elif hasattr(obj, "to_dict"):
170+
return serialize_object(obj.to_dict())
171+
# Special handling for UiPathBaseRuntimeErrors
172+
elif hasattr(obj, "as_dict"):
173+
return serialize_object(obj.as_dict)
174+
elif isinstance(obj, (datetime, date, time)):
175+
return obj.isoformat()
176+
# Handle dictionaries
177+
elif isinstance(obj, dict):
178+
return {k: serialize_object(v) for k, v in obj.items()}
179+
# Handle lists
180+
elif isinstance(obj, list):
181+
return [serialize_object(item) for item in obj]
182+
# Handle exceptions
183+
elif isinstance(obj, Exception):
184+
return str(obj)
185+
# Handle other iterable objects (convert to dict first)
186+
elif hasattr(obj, "__iter__") and not isinstance(obj, (str, bytes)):
187+
try:
188+
return serialize_object(dict(obj))
189+
except (TypeError, ValueError):
190+
return obj
191+
# UUIDs must be serialized explicitly
192+
elif isinstance(obj, uuid.UUID):
193+
return str(obj)
194+
# Return primitive types as is
195+
else:
196+
return obj
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"""Module containing UiPath trigger definitions."""
2+
3+
__all__ = [
4+
"UiPathResumeTrigger",
5+
"UiPathResumeTriggerType",
6+
"UiPathApiTrigger",
7+
"UiPathResumeTriggerName",
8+
]
9+
10+
from uipath.core.triggers.trigger import (
11+
UiPathApiTrigger,
12+
UiPathResumeTrigger,
13+
UiPathResumeTriggerName,
14+
UiPathResumeTriggerType,
15+
)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
"""Module defining resume trigger types and data models."""
2+
3+
from enum import Enum
4+
from typing import Any
5+
6+
from pydantic import BaseModel, ConfigDict, Field
7+
8+
9+
class UiPathResumeTriggerType(str, Enum):
10+
"""Constants representing different types of resume job triggers in the system."""
11+
12+
NONE = "None"
13+
QUEUE_ITEM = "QueueItem"
14+
JOB = "Job"
15+
TASK = "Task"
16+
TIMER = "Timer"
17+
INBOX = "Inbox"
18+
API = "Api"
19+
DEEP_RAG = "DeepRag"
20+
BATCH_RAG = "BatchRag"
21+
INDEX_INGESTION = "IndexIngestion"
22+
IXP_EXTRACTION = "IxpExtraction"
23+
IXP_VS_ESCALATION = "IxpVsEscalation"
24+
25+
26+
class UiPathResumeTriggerName(str, Enum):
27+
"""Constants representing specific names for resume job triggers in the system."""
28+
29+
UNKNOWN = "Unknown"
30+
QUEUE_ITEM = "QueueItem"
31+
JOB = "Job"
32+
TASK = "Task"
33+
ESCALATION = "Escalation"
34+
TIMER = "Timer"
35+
INBOX = "Inbox"
36+
API = "Api"
37+
DEEP_RAG = "DeepRag"
38+
BATCH_RAG = "BatchRag"
39+
INDEX_INGESTION = "IndexIngestion"
40+
EXTRACTION = "Extraction"
41+
IXP_VS_ESCALATION = "IxpVsEscalation"
42+
43+
44+
class UiPathApiTrigger(BaseModel):
45+
"""API resume trigger request."""
46+
47+
inbox_id: str | None = Field(default=None, alias="inboxId")
48+
request: Any = None
49+
50+
model_config = ConfigDict(validate_by_name=True)
51+
52+
53+
class UiPathResumeTrigger(BaseModel):
54+
"""Information needed to resume execution."""
55+
56+
interrupt_id: str | None = Field(default=None, alias="interruptId")
57+
trigger_type: UiPathResumeTriggerType = Field(
58+
default=UiPathResumeTriggerType.API, alias="triggerType"
59+
)
60+
trigger_name: UiPathResumeTriggerName = Field(
61+
default=UiPathResumeTriggerName.UNKNOWN, alias="triggerName", exclude=True
62+
)
63+
item_key: str | None = Field(default=None, alias="itemKey")
64+
api_resume: UiPathApiTrigger | None = Field(default=None, alias="apiResume")
65+
folder_path: str | None = Field(default=None, alias="folderPath")
66+
folder_key: str | None = Field(default=None, alias="folderKey")
67+
payload: Any | None = Field(default=None, alias="interruptObject", exclude=True)
68+
69+
model_config = ConfigDict(validate_by_name=True)

0 commit comments

Comments
 (0)