Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/uipath/core/serialization/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
"""Serialization utilities for converting Python objects to various formats."""

from .json import serialize_defaults, serialize_json
from .json import serialize_defaults, serialize_json, serialize_object

__all__ = ["serialize_defaults", "serialize_json"]
__all__ = ["serialize_defaults", "serialize_json", "serialize_object"]
40 changes: 39 additions & 1 deletion src/uipath/core/serialization/json.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
"""JSON serialization utilities for converting Python objects to JSON formats."""

import json
import uuid
from dataclasses import asdict, is_dataclass
from datetime import datetime, timezone
from datetime import date, datetime, time, timezone
from enum import Enum
from typing import Any, cast
from zoneinfo import ZoneInfo
Expand Down Expand Up @@ -156,3 +157,40 @@ def serialize_json(obj: Any) -> str:
'{"name": "Review PR", "created": "2024-01-15T10:30:00"}'
"""
return json.dumps(obj, default=serialize_defaults)


def serialize_object(obj):
"""Recursively serializes an object and all its nested components."""
# Handle Pydantic models
if hasattr(obj, "model_dump"):
return serialize_object(obj.model_dump(by_alias=True))
elif hasattr(obj, "dict"):
return serialize_object(obj.dict())
elif hasattr(obj, "to_dict"):
return serialize_object(obj.to_dict())
# Special handling for UiPathBaseRuntimeErrors
elif hasattr(obj, "as_dict"):
return serialize_object(obj.as_dict)
elif isinstance(obj, (datetime, date, time)):
return obj.isoformat()
# Handle dictionaries
elif isinstance(obj, dict):
return {k: serialize_object(v) for k, v in obj.items()}
# Handle lists
elif isinstance(obj, list):
return [serialize_object(item) for item in obj]
# Handle exceptions
elif isinstance(obj, Exception):
return str(obj)
# Handle other iterable objects (convert to dict first)
elif hasattr(obj, "__iter__") and not isinstance(obj, (str, bytes)):
try:
return serialize_object(dict(obj))
except (TypeError, ValueError):
return obj
# UUIDs must be serialized explicitly
elif isinstance(obj, uuid.UUID):
return str(obj)
# Return primitive types as is
else:
return obj
15 changes: 15 additions & 0 deletions src/uipath/core/triggers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"""Module containing UiPath trigger definitions."""

__all__ = [
"UiPathResumeTrigger",
"UiPathResumeTriggerType",
"UiPathApiTrigger",
"UiPathResumeTriggerName",
]

from uipath.core.triggers.trigger import (
UiPathApiTrigger,
UiPathResumeTrigger,
UiPathResumeTriggerName,
UiPathResumeTriggerType,
)
69 changes: 69 additions & 0 deletions src/uipath/core/triggers/trigger.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
"""Module defining resume trigger types and data models."""

from enum import Enum
from typing import Any

from pydantic import BaseModel, ConfigDict, Field


class UiPathResumeTriggerType(str, Enum):
"""Constants representing different types of resume job triggers in the system."""

NONE = "None"
QUEUE_ITEM = "QueueItem"
JOB = "Job"
TASK = "Task"
TIMER = "Timer"
INBOX = "Inbox"
API = "Api"
DEEP_RAG = "DeepRag"
BATCH_RAG = "BatchRag"
INDEX_INGESTION = "IndexIngestion"
IXP_EXTRACTION = "IxpExtraction"
IXP_VS_ESCALATION = "IxpVsEscalation"


class UiPathResumeTriggerName(str, Enum):
"""Constants representing specific names for resume job triggers in the system."""

UNKNOWN = "Unknown"
QUEUE_ITEM = "QueueItem"
JOB = "Job"
TASK = "Task"
ESCALATION = "Escalation"
TIMER = "Timer"
INBOX = "Inbox"
API = "Api"
DEEP_RAG = "DeepRag"
BATCH_RAG = "BatchRag"
INDEX_INGESTION = "IndexIngestion"
EXTRACTION = "Extraction"
IXP_VS_ESCALATION = "IxpVsEscalation"


class UiPathApiTrigger(BaseModel):
"""API resume trigger request."""

inbox_id: str | None = Field(default=None, alias="inboxId")
request: Any = None

model_config = ConfigDict(validate_by_name=True)


class UiPathResumeTrigger(BaseModel):
"""Information needed to resume execution."""

interrupt_id: str | None = Field(default=None, alias="interruptId")
trigger_type: UiPathResumeTriggerType = Field(
default=UiPathResumeTriggerType.API, alias="triggerType"
)
trigger_name: UiPathResumeTriggerName = Field(
default=UiPathResumeTriggerName.UNKNOWN, alias="triggerName", exclude=True
)
item_key: str | None = Field(default=None, alias="itemKey")
api_resume: UiPathApiTrigger | None = Field(default=None, alias="apiResume")
folder_path: str | None = Field(default=None, alias="folderPath")
folder_key: str | None = Field(default=None, alias="folderKey")
payload: Any | None = Field(default=None, alias="interruptObject", exclude=True)

model_config = ConfigDict(validate_by_name=True)
Loading