dbos 0.21.0a3__py3-none-any.whl → 0.21.0a4__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.
dbos/_dbos.py CHANGED
@@ -800,14 +800,13 @@ class DBOS:
800
800
  @classmethod
801
801
  def cancel_workflow(cls, workflow_id: str) -> None:
802
802
  """Cancel a workflow by ID."""
803
- _get_dbos_instance()._sys_db.set_workflow_status(
804
- workflow_id, WorkflowStatusString.CANCELLED
805
- )
803
+ _get_dbos_instance()._sys_db.cancel_workflow(workflow_id)
806
804
 
807
805
  @classmethod
808
- def resume_workflow(cls, workflow_id: str) -> None:
806
+ def resume_workflow(cls, workflow_id: str) -> WorkflowHandle[Any]:
809
807
  """Resume a workflow by ID."""
810
- execute_workflow_by_id(_get_dbos_instance(), workflow_id, False)
808
+ _get_dbos_instance()._sys_db.resume_workflow(workflow_id)
809
+ return execute_workflow_by_id(_get_dbos_instance(), workflow_id, False)
811
810
 
812
811
  @classproperty
813
812
  def logger(cls) -> Logger:
dbos/_sys_db.py CHANGED
@@ -390,20 +390,55 @@ class SystemDatabase:
390
390
  if status["workflow_uuid"] in self._temp_txn_wf_ids:
391
391
  self._exported_temp_txn_wf_status.add(status["workflow_uuid"])
392
392
 
393
- def set_workflow_status(
393
+ def cancel_workflow(
394
394
  self,
395
- workflow_uuid: str,
396
- status: WorkflowStatusString,
395
+ workflow_id: str,
397
396
  ) -> None:
398
397
  with self.engine.begin() as c:
399
- stmt = (
398
+ # Remove the workflow from the queues table so it does not block the table
399
+ c.execute(
400
+ sa.delete(SystemSchema.workflow_queue).where(
401
+ SystemSchema.workflow_queue.c.workflow_uuid == workflow_id
402
+ )
403
+ )
404
+ # Set the workflow's status to CANCELLED
405
+ c.execute(
400
406
  sa.update(SystemSchema.workflow_status)
401
- .where(SystemSchema.workflow_status.c.workflow_uuid == workflow_uuid)
407
+ .where(SystemSchema.workflow_status.c.workflow_uuid == workflow_id)
402
408
  .values(
403
- status=status,
409
+ status=WorkflowStatusString.CANCELLED.value,
410
+ )
411
+ )
412
+
413
+ def resume_workflow(
414
+ self,
415
+ workflow_id: str,
416
+ ) -> None:
417
+ with self.engine.begin() as c:
418
+ # Check the status of the workflow. If it is complete, do nothing.
419
+ row = c.execute(
420
+ sa.select(
421
+ SystemSchema.workflow_status.c.status,
422
+ ).where(SystemSchema.workflow_status.c.workflow_uuid == workflow_id)
423
+ ).fetchone()
424
+ if (
425
+ row is None
426
+ or row[0] == WorkflowStatusString.SUCCESS.value
427
+ or row[0] == WorkflowStatusString.ERROR.value
428
+ ):
429
+ return
430
+ # Remove the workflow from the queues table so resume can safely be called on an ENQUEUED workflow
431
+ c.execute(
432
+ sa.delete(SystemSchema.workflow_queue).where(
433
+ SystemSchema.workflow_queue.c.workflow_uuid == workflow_id
404
434
  )
405
435
  )
406
- c.execute(stmt)
436
+ # Set the workflow's status to PENDING and clear its recovery attempts.
437
+ c.execute(
438
+ sa.update(SystemSchema.workflow_status)
439
+ .where(SystemSchema.workflow_status.c.workflow_uuid == workflow_id)
440
+ .values(status=WorkflowStatusString.PENDING.value, recovery_attempts=0)
441
+ )
407
442
 
408
443
  def get_workflow_status(
409
444
  self, workflow_uuid: str
@@ -1,23 +1,14 @@
1
- import importlib
2
- import os
3
- import sys
4
- from typing import Any, List, Optional, cast
1
+ from typing import List, Optional, cast
5
2
 
6
3
  import typer
7
- from rich import print
8
4
 
9
- from dbos import DBOS
10
-
11
- from . import _serialization, load_config
12
- from ._core import execute_workflow_by_id
13
- from ._dbos_config import ConfigFile, _is_valid_app_name
5
+ from . import _serialization
6
+ from ._dbos_config import ConfigFile
14
7
  from ._sys_db import (
15
8
  GetWorkflowsInput,
16
9
  GetWorkflowsOutput,
17
10
  SystemDatabase,
18
11
  WorkflowStatuses,
19
- WorkflowStatusInternal,
20
- WorkflowStatusString,
21
12
  )
22
13
 
23
14
 
@@ -41,7 +32,7 @@ class WorkflowInformation:
41
32
  queue_name: Optional[str]
42
33
 
43
34
 
44
- def _list_workflows(
35
+ def list_workflows(
45
36
  config: ConfigFile,
46
37
  li: int,
47
38
  user: Optional[str],
@@ -91,17 +82,13 @@ def _list_workflows(
91
82
  sys_db.destroy()
92
83
 
93
84
 
94
- def _get_workflow(
85
+ def get_workflow(
95
86
  config: ConfigFile, uuid: str, request: bool
96
87
  ) -> Optional[WorkflowInformation]:
97
- sys_db = None
98
-
99
88
  try:
100
89
  sys_db = SystemDatabase(config)
101
-
102
90
  info = _get_workflow_info(sys_db, uuid, request)
103
91
  return info
104
-
105
92
  except Exception as e:
106
93
  typer.echo(f"Error getting workflow: {e}")
107
94
  return None
@@ -110,18 +97,13 @@ def _get_workflow(
110
97
  sys_db.destroy()
111
98
 
112
99
 
113
- def _cancel_workflow(config: ConfigFile, uuid: str) -> None:
114
- # config = load_config()
115
- sys_db = None
116
-
100
+ def cancel_workflow(config: ConfigFile, uuid: str) -> None:
117
101
  try:
118
102
  sys_db = SystemDatabase(config)
119
- sys_db.set_workflow_status(uuid, WorkflowStatusString.CANCELLED)
120
- return
121
-
103
+ sys_db.cancel_workflow(uuid)
122
104
  except Exception as e:
123
105
  typer.echo(f"Failed to connect to DBOS system database: {e}")
124
- return None
106
+ raise e
125
107
  finally:
126
108
  if sys_db:
127
109
  sys_db.destroy()
dbos/cli/cli.py CHANGED
@@ -19,7 +19,7 @@ from .. import load_config
19
19
  from .._app_db import ApplicationDatabase
20
20
  from .._dbos_config import _is_valid_app_name
21
21
  from .._sys_db import SystemDatabase, reset_system_database
22
- from .._workflow_commands import _cancel_workflow, _get_workflow, _list_workflows
22
+ from .._workflow_commands import cancel_workflow, get_workflow, list_workflows
23
23
  from ..cli._github_init import create_template_from_github
24
24
  from ._template_init import copy_template, get_project_name, get_templates_directory
25
25
 
@@ -282,7 +282,7 @@ def list(
282
282
  ] = None,
283
283
  ) -> None:
284
284
  config = load_config()
285
- workflows = _list_workflows(
285
+ workflows = list_workflows(
286
286
  config, limit, user, starttime, endtime, status, request, appversion
287
287
  )
288
288
  print(jsonpickle.encode(workflows, unpicklable=False))
@@ -301,7 +301,7 @@ def get(
301
301
  ] = True,
302
302
  ) -> None:
303
303
  config = load_config()
304
- print(jsonpickle.encode(_get_workflow(config, uuid, request), unpicklable=False))
304
+ print(jsonpickle.encode(get_workflow(config, uuid, request), unpicklable=False))
305
305
 
306
306
 
307
307
  @workflow.command(
@@ -315,7 +315,7 @@ def cancel(
315
315
  ] = None,
316
316
  ) -> None:
317
317
  config = load_config()
318
- _cancel_workflow(config, uuid)
318
+ cancel_workflow(config, uuid)
319
319
  print(f"Workflow {uuid} has been cancelled")
320
320
 
321
321
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 0.21.0a3
3
+ Version: 0.21.0a4
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -1,7 +1,7 @@
1
- dbos-0.21.0a3.dist-info/METADATA,sha256=pYEcDMgafZVNUAn-kuU_BMF-kwBGN-RKkSpK1jP41cY,5309
2
- dbos-0.21.0a3.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
- dbos-0.21.0a3.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
- dbos-0.21.0a3.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
1
+ dbos-0.21.0a4.dist-info/METADATA,sha256=YFvX-uuQsvFQM0j6IuS3jugWr93rx3QhQAHffV15nkY,5309
2
+ dbos-0.21.0a4.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
+ dbos-0.21.0a4.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
+ dbos-0.21.0a4.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
5
  dbos/__init__.py,sha256=CxRHBHEthPL4PZoLbZhp3rdm44-KkRTT2-7DkK9d4QQ,724
6
6
  dbos/_admin_server.py,sha256=PJgneZG9-64TapZrPeJtt73puAswRImCE5uce2k2PKU,4750
7
7
  dbos/_app_db.py,sha256=_tv2vmPjjiaikwgxH3mqxgJ4nUUcG2-0uMXKWCqVu1c,5509
@@ -13,7 +13,7 @@ dbos/_context.py,sha256=FHB_fpE4fQt4fIJvAmMMsbY4xHwH77gsW01cFsRZjsE,17779
13
13
  dbos/_core.py,sha256=nGiXyYgV8H5TRRZG0e8HCd5IZimufYQLmKNr7nBbwbo,36564
14
14
  dbos/_croniter.py,sha256=hbhgfsHBqclUS8VeLnJ9PSE9Z54z6mi4nnrr1aUXn0k,47561
15
15
  dbos/_db_wizard.py,sha256=xgKLna0_6Xi50F3o8msRosXba8NScHlpJR5ICVCkHDQ,7534
16
- dbos/_dbos.py,sha256=wjiOp7orMYm-jbHsstu7fnkKN3hRjY3V6ifKyyyJ_WY,36186
16
+ dbos/_dbos.py,sha256=y5RgXPxdNsnketphphGMlaYZABFEQpr78UK-Xyja6dk,36216
17
17
  dbos/_dbos_config.py,sha256=h_q1gzudhsAMVkGMD0qQ6kLic6YhdJgzm50YFSIx9Bo,8196
18
18
  dbos/_error.py,sha256=vtaSsG0QW6cRlwfZ4zzZWy_IHCZlomwSlrDyGWuyn8c,4337
19
19
  dbos/_fastapi.py,sha256=ke03vqsSYDnO6XeOtOVFXj0-f-v1MGsOxa9McaROvNc,3616
@@ -41,7 +41,7 @@ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  dbos/_schemas/application_database.py,sha256=KeyoPrF7hy_ODXV7QNike_VFSD74QBRfQ76D7QyE9HI,966
42
42
  dbos/_schemas/system_database.py,sha256=rwp4EvCSaXcUoMaRczZCvETCxGp72k3-hvLyGUDkih0,5163
43
43
  dbos/_serialization.py,sha256=YCYv0qKAwAZ1djZisBC7khvKqG-5OcIv9t9EC5PFIog,1743
44
- dbos/_sys_db.py,sha256=HSOM4oQGC4XEEEOphoovKi670mnEdukddBaB2GEZ8K0,54607
44
+ dbos/_sys_db.py,sha256=dgRD6kMQWktxGSGUtw0ow1CJW4o6gsLdmpULvgQCago,56190
45
45
  dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
46
46
  dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
47
  dbos/_templates/dbos-db-starter/__package/main.py,sha256=eI0SS9Nwj-fldtiuSzIlIG6dC91GXXwdRsoHxv6S_WI,2719
@@ -53,11 +53,11 @@ dbos/_templates/dbos-db-starter/migrations/script.py.mako,sha256=MEqL-2qATlST9TA
53
53
  dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py,sha256=U5thFWGqNN4QLrNXT7wUUqftIFDNE5eSdqD8JNW1mec,942
54
54
  dbos/_templates/dbos-db-starter/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKse9HsWv5fynJEFJHM,1681
55
55
  dbos/_tracer.py,sha256=rvBY1RQU6DO7rL7EnaJJxGcmd4tP_PpGqUEE6imZnhY,2518
56
- dbos/_workflow_commands.py,sha256=w9chfcnmfeZMtt9jsimnIpEtL71xnvGLMY6HaAzRz4Y,4618
56
+ dbos/_workflow_commands.py,sha256=wVX_VdEM0qeuUQJWpdtEPY1RQ4C6quFPLSFtJGnvRi4,4272
57
57
  dbos/cli/_github_init.py,sha256=Y_bDF9gfO2jB1id4FV5h1oIxEJRWyqVjhb7bNEa5nQ0,3224
58
58
  dbos/cli/_template_init.py,sha256=AfuMaO8bmr9WsPNHr6j2cp7kjVVZDUpH7KpbTg0hhFs,2722
59
- dbos/cli/cli.py,sha256=07TXdfDhImEOjB2-yhWJc1CK07_CSF-xF7TYCtB1kRY,12410
59
+ dbos/cli/cli.py,sha256=ZfOl5m791a113zjP94_P_a-qPl6wjBl4_tSfCIGAXK0,12404
60
60
  dbos/dbos-config.schema.json,sha256=X5TpXNcARGceX0zQs0fVgtZW_Xj9uBbY5afPt9Rz9yk,5741
61
61
  dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
62
62
  version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
63
- dbos-0.21.0a3.dist-info/RECORD,,
63
+ dbos-0.21.0a4.dist-info/RECORD,,