From a6fd129f97b397be08fb6a35de2243de0f0cb370 Mon Sep 17 00:00:00 2001 From: radu-mocanu Date: Fri, 20 Feb 2026 17:01:09 +0200 Subject: [PATCH] wip: uipath-platform --- src/uipath/core/serialization/__init__.py | 4 +- src/uipath/core/serialization/json.py | 40 ++++++++++++- src/uipath/core/triggers/__init__.py | 15 +++++ src/uipath/core/triggers/trigger.py | 69 +++++++++++++++++++++++ 4 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 src/uipath/core/triggers/__init__.py create mode 100644 src/uipath/core/triggers/trigger.py diff --git a/src/uipath/core/serialization/__init__.py b/src/uipath/core/serialization/__init__.py index aa26e75..9296b10 100644 --- a/src/uipath/core/serialization/__init__.py +++ b/src/uipath/core/serialization/__init__.py @@ -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"] diff --git a/src/uipath/core/serialization/json.py b/src/uipath/core/serialization/json.py index a29c3b1..a3eebc4 100644 --- a/src/uipath/core/serialization/json.py +++ b/src/uipath/core/serialization/json.py @@ -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 @@ -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 diff --git a/src/uipath/core/triggers/__init__.py b/src/uipath/core/triggers/__init__.py new file mode 100644 index 0000000..4004622 --- /dev/null +++ b/src/uipath/core/triggers/__init__.py @@ -0,0 +1,15 @@ +"""Module containing UiPath trigger definitions.""" + +__all__ = [ + "UiPathResumeTrigger", + "UiPathResumeTriggerType", + "UiPathApiTrigger", + "UiPathResumeTriggerName", +] + +from uipath.core.triggers.trigger import ( + UiPathApiTrigger, + UiPathResumeTrigger, + UiPathResumeTriggerName, + UiPathResumeTriggerType, +) diff --git a/src/uipath/core/triggers/trigger.py b/src/uipath/core/triggers/trigger.py new file mode 100644 index 0000000..05ed88a --- /dev/null +++ b/src/uipath/core/triggers/trigger.py @@ -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)