loom-core 0.1.7__py3-none-any.whl → 0.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
loom/core/engine.py CHANGED
@@ -137,5 +137,4 @@ class Engine(Generic[InputT, StateT]):
137
137
  return
138
138
 
139
139
  async with Database[InputT, StateT]() as db:
140
- await db.create_event(workflow_id, "WORKFLOW_COMPLETED", {})
141
- await db.complete_running_step(workflow_id)
140
+ await db.complete_workflow(workflow_id)
loom/core/state.py CHANGED
@@ -32,6 +32,7 @@ class StateProxy(Generic[InputT, StateT]):
32
32
  event = self._ctx._peek()
33
33
  if event and event["type"] == "STATE_SET" and event["payload"]["key"] == name:
34
34
  self._ctx._consume()
35
+ self._data[name] = value
35
36
  return
36
37
 
37
38
  event = ("STATE_SET", {"key": name, "value": value})
@@ -56,6 +57,8 @@ class StateProxy(Generic[InputT, StateT]):
56
57
  payload = event["payload"]
57
58
  if set(payload["values"].keys()) == set(updaters.keys()):
58
59
  self._ctx._consume()
60
+ for key, value in payload["values"].items():
61
+ self._data[key] = value
59
62
  return
60
63
  new_values = {}
61
64
 
loom/database/db.py CHANGED
@@ -345,7 +345,7 @@ class Database(Generic[InputT, StateT]):
345
345
  )
346
346
 
347
347
  async def workflow_failed(
348
- self, workflow_id: str, error: str, task_id: str = None, task_kind: str = None
348
+ self, workflow_id: str, error: str, task_id: str|None = None, task_kind: str|None = None
349
349
  ) -> None:
350
350
  """Mark a workflow as failed due to an unhandled exception.
351
351
 
@@ -410,6 +410,60 @@ class Database(Generic[InputT, StateT]):
410
410
  (workflow_id,),
411
411
  )
412
412
 
413
+ async def complete_workflow(self, workflow_id: str) -> None:
414
+ """Mark a workflow as successfully completed.
415
+
416
+ Creates a WORKFLOW_COMPLETED event and updates the workflow status.
417
+ Also completes any running step tasks for the workflow.
418
+
419
+ Args:
420
+ workflow_id: Workflow identifier to mark as completed
421
+
422
+ Raises:
423
+ WorkflowNotFoundError: If the workflow doesn't exist
424
+ """
425
+ # Get workflow info (this will raise WorkflowNotFoundError if not found)
426
+ workflow = await self.get_workflow_info(workflow_id)
427
+
428
+ # Skip if already in terminal state
429
+ if workflow["status"] in ("COMPLETED", "FAILED", "CANCELED"):
430
+ return
431
+
432
+ # Create completion event
433
+ await self.execute(
434
+ """
435
+ INSERT INTO events (workflow_id, type, payload)
436
+ VALUES (?, 'WORKFLOW_COMPLETED', ?)
437
+ """,
438
+ (workflow_id, json.dumps({
439
+ "completed_at": datetime.now(timezone.utc).isoformat()
440
+ })),
441
+ )
442
+
443
+ # Update workflow status
444
+ await self.execute(
445
+ """
446
+ UPDATE workflows
447
+ SET status = 'COMPLETED',
448
+ updated_at = CURRENT_TIMESTAMP
449
+ WHERE id = ?
450
+ """,
451
+ (workflow_id,),
452
+ )
453
+
454
+ # Complete any running step tasks
455
+ await self.execute(
456
+ """
457
+ UPDATE tasks
458
+ SET status = 'COMPLETED',
459
+ updated_at = CURRENT_TIMESTAMP
460
+ WHERE workflow_id = ?
461
+ AND kind = 'STEP'
462
+ AND status = 'RUNNING'
463
+ """,
464
+ (workflow_id,),
465
+ )
466
+
413
467
  async def cancel_workflow(
414
468
  self, workflow_id: str, reason: str | None = None
415
469
  ) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loom-core
3
- Version: 0.1.7
3
+ Version: 0.1.9
4
4
  Summary: Durable workflow orchestration engine for Python
5
5
  Home-page: https://github.com/satadeep3927/loom
6
6
  Author: Satadeep Dasgupta
@@ -8,15 +8,15 @@ loom/common/workflow.py,sha256=R4X1vt6duqTJz6kGk6YI866O-CleOiyw0dXdUVo_qAE,2118
8
8
  loom/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  loom/core/compiled.py,sha256=Y2NQDMZVLee65ILgJoK2Ny_OcR1T4LJnOQWQcyg0Z7U,1178
10
10
  loom/core/context.py,sha256=IsEKaQV_Zzis-6HHLp79LgIZ5IEQvlkg7F8-ODYnVvM,10924
11
- loom/core/engine.py,sha256=6EvacrZCfVhJQ7yPurRdCeTzlGRaGk5uI-s7yxu9IUs,5822
11
+ loom/core/engine.py,sha256=oHz_4YviHiw1E9XHWkELEHQ5KmAQXCKBebZDOwHXCCQ,5744
12
12
  loom/core/handle.py,sha256=beOVmJit-gSrk7II4c2KuSubmr5OIPls82_vJ-pI04U,5532
13
13
  loom/core/logger.py,sha256=ZSOZydQ-o8bfhh8VBcSWZNVE-NBvEedN7LDcbAEVJL0,1829
14
14
  loom/core/runner.py,sha256=nNA-EcdJt3UEgwzKHyb22xD7aLT8kI01x5UVdLteSI8,1998
15
- loom/core/state.py,sha256=oXiZ442PL2kl_JyQXLZOFeBLs_cTF2iEjykKVVUNiAI,2997
15
+ loom/core/state.py,sha256=KynxRQfroYxUgv3Toy0c-yrPsmD5zHn7L3s_y8tkgcU,3142
16
16
  loom/core/worker.py,sha256=jpTtvM1rIToVkG4SwJu1W9Q-eL3bw8b3N8KsxxrRovA,5322
17
17
  loom/core/workflow.py,sha256=E_A2rI6iaW3liZmVy3X98oxSeBDXMGiQnRZRq3Cp3BA,5755
18
18
  loom/database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- loom/database/db.py,sha256=MSNXWhUzfwvjPXaVWY3-UK1lqw-Qas0Cc1FYcU8qdWw,25700
19
+ loom/database/db.py,sha256=Ml-H3ePOaOpJeVPtxGfTRsAzx6cs0zyRQVBVttzmE1U,27444
20
20
  loom/decorators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  loom/decorators/activity.py,sha256=xt7oeYOKJxhKIEcwWsSVA26c_jk4yQB1PHtbcg3tCFI,4824
22
22
  loom/decorators/workflow.py,sha256=rBpbnpLfDTTAWdgiERpUPIgNUJpnYJKvBZPmzx-ECcc,1516
@@ -42,9 +42,9 @@ loom/schemas/database.py,sha256=DlMBvacsJ9oceBHkrMiJC7uD3_rCHFe6Kwa2STFcKOw,283
42
42
  loom/schemas/events.py,sha256=Gz-R836nVXNSsp4Y54idhKs_WTvzFPmx5KlA8PunP28,2216
43
43
  loom/schemas/tasks.py,sha256=DJbLInggIGxI-CfP1kSyK79Bz83e3sZyEKh6C2HE8q4,1341
44
44
  loom/schemas/workflow.py,sha256=F1cNEJRuEWLjPhGinEZE2T6vwchDC8RuTHmxEIaH6Ls,671
45
- loom_core-0.1.7.dist-info/licenses/LICENSE,sha256=8EpC-clAYRUfJQ92T3iQEIIWYjx2A3Kfk28zOd8lh7I,1095
46
- loom_core-0.1.7.dist-info/METADATA,sha256=jxnYEA02G3sXiR4BQ4FWpXGuRIz7NDEux43KwWjyoMk,8897
47
- loom_core-0.1.7.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
48
- loom_core-0.1.7.dist-info/entry_points.txt,sha256=Jx5HXHL2y7jvSjkwkH3QqF954cbSxiE6OGwL2coldyE,42
49
- loom_core-0.1.7.dist-info/top_level.txt,sha256=cAfRgAuCuit-cU9iBrf0bS4ovvmq-URykNd9fmYMojg,5
50
- loom_core-0.1.7.dist-info/RECORD,,
45
+ loom_core-0.1.9.dist-info/licenses/LICENSE,sha256=8EpC-clAYRUfJQ92T3iQEIIWYjx2A3Kfk28zOd8lh7I,1095
46
+ loom_core-0.1.9.dist-info/METADATA,sha256=5Hjfpo7DUJcht4m0NlV1WjiYdtUBD4iOBbWnzUqSA7w,8897
47
+ loom_core-0.1.9.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
48
+ loom_core-0.1.9.dist-info/entry_points.txt,sha256=Jx5HXHL2y7jvSjkwkH3QqF954cbSxiE6OGwL2coldyE,42
49
+ loom_core-0.1.9.dist-info/top_level.txt,sha256=cAfRgAuCuit-cU9iBrf0bS4ovvmq-URykNd9fmYMojg,5
50
+ loom_core-0.1.9.dist-info/RECORD,,