diff --git a/python-sdk/exospherehost/__init__.py b/python-sdk/exospherehost/__init__.py index 4f905001..df3598ed 100644 --- a/python-sdk/exospherehost/__init__.py +++ b/python-sdk/exospherehost/__init__.py @@ -39,8 +39,8 @@ async def execute(self, inputs: Inputs) -> Outputs: from .node.BaseNode import BaseNode from .statemanager import StateManager from .signals import PruneSignal, ReQueueAfterSignal -from .models import UnitesStrategyEnum, UnitesModel, GraphNodeModel, RetryStrategyEnum, RetryPolicyModel, StoreConfigModel +from .models import UnitesStrategyEnum, UnitesModel, GraphNodeModel, RetryStrategyEnum, RetryPolicyModel, StoreConfigModel, CronTrigger VERSION = __version__ -__all__ = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel"] +__all__ = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel", "CronTrigger"] diff --git a/python-sdk/exospherehost/_version.py b/python-sdk/exospherehost/_version.py index c956996d..77621c99 100644 --- a/python-sdk/exospherehost/_version.py +++ b/python-sdk/exospherehost/_version.py @@ -1 +1 @@ -version = "0.0.3b0" \ No newline at end of file +version = "0.0.3b1" \ No newline at end of file diff --git a/python-sdk/exospherehost/models.py b/python-sdk/exospherehost/models.py index 467da4b8..78fabeba 100644 --- a/python-sdk/exospherehost/models.py +++ b/python-sdk/exospherehost/models.py @@ -157,4 +157,7 @@ def validate_default_values(cls, v: dict[str, str]) -> dict[str, str]: if len(errors) > 0: raise ValueError("\n".join(errors)) - return normalized_dict \ No newline at end of file + return normalized_dict + +class CronTrigger(BaseModel): + expression: str = Field(..., description="Cron expression") \ No newline at end of file diff --git a/python-sdk/exospherehost/statemanager.py b/python-sdk/exospherehost/statemanager.py index 1b029fa1..85e94130 100644 --- a/python-sdk/exospherehost/statemanager.py +++ b/python-sdk/exospherehost/statemanager.py @@ -3,7 +3,7 @@ import asyncio import time -from .models import GraphNodeModel, RetryPolicyModel, StoreConfigModel +from .models import GraphNodeModel, RetryPolicyModel, StoreConfigModel, CronTrigger class StateManager: @@ -125,7 +125,7 @@ async def get_graph(self, graph_name: str): raise Exception(f"Failed to get graph: {response.status} {await response.text()}") return await response.json() - async def upsert_graph(self, graph_name: str, graph_nodes: list[GraphNodeModel], secrets: dict[str, str], retry_policy: RetryPolicyModel | None = None, store_config: StoreConfigModel | None = None, validation_timeout: int = 60, polling_interval: int = 1): + async def upsert_graph(self, graph_name: str, graph_nodes: list[GraphNodeModel], secrets: dict[str, str], retry_policy: RetryPolicyModel | None = None, store_config: StoreConfigModel | None = None, triggers: list[CronTrigger] | None = None, validation_timeout: int = 60, polling_interval: int = 1): """ Create or update a graph definition. @@ -165,6 +165,16 @@ async def upsert_graph(self, graph_name: str, graph_nodes: list[GraphNodeModel], body["retry_policy"] = retry_policy.model_dump() if store_config is not None: body["store_config"] = store_config.model_dump() + if triggers is not None: + body["triggers"] = [ + { + "type": "CRON", + "value": { + "expression": trigger.expression + } + } + for trigger in triggers + ] async with aiohttp.ClientSession() as session: async with session.put(endpoint, json=body, headers=headers) as response: # type: ignore diff --git a/python-sdk/tests/test_package_init.py b/python-sdk/tests/test_package_init.py index 54dba15c..f2a5b0e5 100644 --- a/python-sdk/tests/test_package_init.py +++ b/python-sdk/tests/test_package_init.py @@ -14,7 +14,7 @@ def test_package_all_imports(): """Test that __all__ contains all expected exports.""" from exospherehost import __all__ - expected_exports = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel"] + expected_exports = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel", "CronTrigger"] for export in expected_exports: assert export in __all__, f"{export} should be in __all__"