Skip to content

Commit a6547b7

Browse files
authored
Add CronTrigger model and update version to 0.0.3b1 (#434)
* Add CronTrigger model and update version to 0.0.3b1 - Introduced a new CronTrigger model in models.py to handle cron expressions. - Updated the StateManager's upsert_graph method to accept a list of CronTrigger instances. - Added CronTrigger to the __all__ exports in __init__.py. - Bumped version to 0.0.3b1 in _version.py. * Refactor trigger handling in StateManager - Simplified the logic for processing triggers in the StateManager's upsert_graph method by directly constructing the triggers list. - Removed the previous loop and validation for CronTrigger instances, streamlining the code and improving readability. * Update expected exports in test_package_init.py to include CronTrigger - Added 'CronTrigger' to the list of expected exports in the test for __all__ in the package initialization file, ensuring that the new model is properly tested for inclusion.
1 parent b2695f5 commit a6547b7

5 files changed

Lines changed: 20 additions & 7 deletions

File tree

python-sdk/exospherehost/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ async def execute(self, inputs: Inputs) -> Outputs:
3939
from .node.BaseNode import BaseNode
4040
from .statemanager import StateManager
4141
from .signals import PruneSignal, ReQueueAfterSignal
42-
from .models import UnitesStrategyEnum, UnitesModel, GraphNodeModel, RetryStrategyEnum, RetryPolicyModel, StoreConfigModel
42+
from .models import UnitesStrategyEnum, UnitesModel, GraphNodeModel, RetryStrategyEnum, RetryPolicyModel, StoreConfigModel, CronTrigger
4343

4444
VERSION = __version__
4545

46-
__all__ = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel"]
46+
__all__ = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel", "CronTrigger"]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version = "0.0.3b0"
1+
version = "0.0.3b1"

python-sdk/exospherehost/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,4 +157,7 @@ def validate_default_values(cls, v: dict[str, str]) -> dict[str, str]:
157157

158158
if len(errors) > 0:
159159
raise ValueError("\n".join(errors))
160-
return normalized_dict
160+
return normalized_dict
161+
162+
class CronTrigger(BaseModel):
163+
expression: str = Field(..., description="Cron expression")

python-sdk/exospherehost/statemanager.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import asyncio
44
import time
55

6-
from .models import GraphNodeModel, RetryPolicyModel, StoreConfigModel
6+
from .models import GraphNodeModel, RetryPolicyModel, StoreConfigModel, CronTrigger
77

88

99
class StateManager:
@@ -125,7 +125,7 @@ async def get_graph(self, graph_name: str):
125125
raise Exception(f"Failed to get graph: {response.status} {await response.text()}")
126126
return await response.json()
127127

128-
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):
128+
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):
129129
"""
130130
Create or update a graph definition.
131131
@@ -165,6 +165,16 @@ async def upsert_graph(self, graph_name: str, graph_nodes: list[GraphNodeModel],
165165
body["retry_policy"] = retry_policy.model_dump()
166166
if store_config is not None:
167167
body["store_config"] = store_config.model_dump()
168+
if triggers is not None:
169+
body["triggers"] = [
170+
{
171+
"type": "CRON",
172+
"value": {
173+
"expression": trigger.expression
174+
}
175+
}
176+
for trigger in triggers
177+
]
168178

169179
async with aiohttp.ClientSession() as session:
170180
async with session.put(endpoint, json=body, headers=headers) as response: # type: ignore

python-sdk/tests/test_package_init.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def test_package_all_imports():
1414
"""Test that __all__ contains all expected exports."""
1515
from exospherehost import __all__
1616

17-
expected_exports = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel"]
17+
expected_exports = ["Runtime", "BaseNode", "StateManager", "VERSION", "PruneSignal", "ReQueueAfterSignal", "UnitesStrategyEnum", "UnitesModel", "GraphNodeModel", "RetryStrategyEnum", "RetryPolicyModel", "StoreConfigModel", "CronTrigger"]
1818

1919
for export in expected_exports:
2020
assert export in __all__, f"{export} should be in __all__"

0 commit comments

Comments
 (0)