dbos 0.26.0a9__py3-none-any.whl → 0.26.0a11__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/_client.py CHANGED
@@ -1,7 +1,7 @@
1
1
  import asyncio
2
2
  import sys
3
3
  import uuid
4
- from typing import Any, Generic, Optional, TypedDict, TypeVar
4
+ from typing import Any, Generic, List, Optional, TypedDict, TypeVar
5
5
 
6
6
  if sys.version_info < (3, 11):
7
7
  from typing_extensions import NotRequired
@@ -15,7 +15,12 @@ from dbos._error import DBOSNonExistentWorkflowError
15
15
  from dbos._registrations import DEFAULT_MAX_RECOVERY_ATTEMPTS
16
16
  from dbos._serialization import WorkflowInputs
17
17
  from dbos._sys_db import SystemDatabase, WorkflowStatusInternal, WorkflowStatusString
18
- from dbos._workflow_commands import WorkflowStatus, get_workflow
18
+ from dbos._workflow_commands import (
19
+ WorkflowStatus,
20
+ get_workflow,
21
+ list_queued_workflows,
22
+ list_workflows,
23
+ )
19
24
 
20
25
  R = TypeVar("R", covariant=True) # A generic type for workflow return values
21
26
 
@@ -202,3 +207,119 @@ class DBOSClient:
202
207
  return await asyncio.to_thread(
203
208
  self.get_event, workflow_id, key, timeout_seconds
204
209
  )
210
+
211
+ def cancel_workflow(self, workflow_id: str) -> None:
212
+ self._sys_db.cancel_workflow(workflow_id)
213
+
214
+ async def cancel_workflow_async(self, workflow_id: str) -> None:
215
+ await asyncio.to_thread(self.cancel_workflow, workflow_id)
216
+
217
+ def resume_workflow(self, workflow_id: str) -> None:
218
+ self._sys_db.resume_workflow(workflow_id)
219
+
220
+ async def resume_workflow_async(self, workflow_id: str) -> None:
221
+ await asyncio.to_thread(self.resume_workflow, workflow_id)
222
+
223
+ def list_workflows(
224
+ self,
225
+ *,
226
+ workflow_ids: Optional[List[str]] = None,
227
+ status: Optional[str] = None,
228
+ start_time: Optional[str] = None,
229
+ end_time: Optional[str] = None,
230
+ name: Optional[str] = None,
231
+ app_version: Optional[str] = None,
232
+ user: Optional[str] = None,
233
+ limit: Optional[int] = None,
234
+ offset: Optional[int] = None,
235
+ sort_desc: bool = False,
236
+ ) -> List[WorkflowStatus]:
237
+ return list_workflows(
238
+ self._sys_db,
239
+ workflow_ids=workflow_ids,
240
+ status=status,
241
+ start_time=start_time,
242
+ end_time=end_time,
243
+ name=name,
244
+ app_version=app_version,
245
+ user=user,
246
+ limit=limit,
247
+ offset=offset,
248
+ sort_desc=sort_desc,
249
+ )
250
+
251
+ async def list_workflows_async(
252
+ self,
253
+ *,
254
+ workflow_ids: Optional[List[str]] = None,
255
+ status: Optional[str] = None,
256
+ start_time: Optional[str] = None,
257
+ end_time: Optional[str] = None,
258
+ name: Optional[str] = None,
259
+ app_version: Optional[str] = None,
260
+ user: Optional[str] = None,
261
+ limit: Optional[int] = None,
262
+ offset: Optional[int] = None,
263
+ sort_desc: bool = False,
264
+ ) -> List[WorkflowStatus]:
265
+ return await asyncio.to_thread(
266
+ self.list_workflows,
267
+ workflow_ids=workflow_ids,
268
+ status=status,
269
+ start_time=start_time,
270
+ end_time=end_time,
271
+ name=name,
272
+ app_version=app_version,
273
+ user=user,
274
+ limit=limit,
275
+ offset=offset,
276
+ sort_desc=sort_desc,
277
+ )
278
+
279
+ def list_queued_workflows(
280
+ self,
281
+ *,
282
+ queue_name: Optional[str] = None,
283
+ status: Optional[str] = None,
284
+ start_time: Optional[str] = None,
285
+ end_time: Optional[str] = None,
286
+ name: Optional[str] = None,
287
+ limit: Optional[int] = None,
288
+ offset: Optional[int] = None,
289
+ sort_desc: bool = False,
290
+ ) -> List[WorkflowStatus]:
291
+ return list_queued_workflows(
292
+ self._sys_db,
293
+ queue_name=queue_name,
294
+ status=status,
295
+ start_time=start_time,
296
+ end_time=end_time,
297
+ name=name,
298
+ limit=limit,
299
+ offset=offset,
300
+ sort_desc=sort_desc,
301
+ )
302
+
303
+ async def list_queued_workflows_async(
304
+ self,
305
+ *,
306
+ queue_name: Optional[str] = None,
307
+ status: Optional[str] = None,
308
+ start_time: Optional[str] = None,
309
+ end_time: Optional[str] = None,
310
+ name: Optional[str] = None,
311
+ limit: Optional[int] = None,
312
+ offset: Optional[int] = None,
313
+ sort_desc: bool = False,
314
+ ) -> List[WorkflowStatus]:
315
+ return await asyncio.to_thread(
316
+ self.list_queued_workflows,
317
+ queue_name=queue_name,
318
+ status=status,
319
+ start_time=start_time,
320
+ end_time=end_time,
321
+ name=name,
322
+ limit=limit,
323
+ offset=offset,
324
+ sort_desc=sort_desc,
325
+ )
dbos/_dbos.py CHANGED
@@ -1061,11 +1061,11 @@ class DBOS:
1061
1061
 
1062
1062
  @classproperty
1063
1063
  def step_id(cls) -> int:
1064
- """Return the step ID for the current context. This is a unique identifier of the current step within the workflow."""
1064
+ """Return the step ID for the currently executing step. This is a unique identifier of the current step within the workflow."""
1065
1065
  ctx = assert_current_dbos_context()
1066
1066
  assert (
1067
- ctx.is_within_workflow()
1068
- ), "step_id is only available within a DBOS workflow."
1067
+ ctx.is_step() or ctx.is_transaction()
1068
+ ), "step_id is only available within a DBOS step."
1069
1069
  return ctx.function_id
1070
1070
 
1071
1071
  @classproperty
dbos/_sys_db.py CHANGED
@@ -1569,7 +1569,9 @@ class SystemDatabase:
1569
1569
 
1570
1570
  def call_function_as_step(self, fn: Callable[[], T], function_name: str) -> T:
1571
1571
  ctx = get_local_dbos_context()
1572
- if ctx and ctx.is_within_workflow():
1572
+ if ctx and ctx.is_transaction():
1573
+ raise Exception(f"Invalid call to `{function_name}` inside a transaction")
1574
+ if ctx and ctx.is_workflow():
1573
1575
  ctx.function_id += 1
1574
1576
  res = self.check_operation_execution(
1575
1577
  ctx.workflow_id, ctx.function_id, function_name
@@ -1587,7 +1589,7 @@ class SystemDatabase:
1587
1589
  f"Recorded output and error are both None for {function_name}"
1588
1590
  )
1589
1591
  result = fn()
1590
- if ctx and ctx.is_within_workflow():
1592
+ if ctx and ctx.is_workflow():
1591
1593
  self.record_operation_result(
1592
1594
  {
1593
1595
  "workflow_uuid": ctx.workflow_id,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 0.26.0a9
3
+ Version: 0.26.0a11
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -1,19 +1,19 @@
1
- dbos-0.26.0a9.dist-info/METADATA,sha256=Olpmk9xnLEbfqKPtj7_cLfCShqh_RFowiykc6KtBTNQ,5553
2
- dbos-0.26.0a9.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- dbos-0.26.0a9.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
- dbos-0.26.0a9.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
1
+ dbos-0.26.0a11.dist-info/METADATA,sha256=sw5u9uXooyqFBMqX-mEFYFXehYWd-ism0o9xcqokW4g,5554
2
+ dbos-0.26.0a11.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
+ dbos-0.26.0a11.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
+ dbos-0.26.0a11.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
5
  dbos/__init__.py,sha256=3NQfGlBiiUSM_v88STdVP3rNZvGkUL_9WbSotKb8Voo,873
6
6
  dbos/__main__.py,sha256=G7Exn-MhGrVJVDbgNlpzhfh8WMX_72t3_oJaFT9Lmt8,653
7
7
  dbos/_admin_server.py,sha256=vxPG_YJ6lYrkfPCSp42FiATVLBOij7Fm52Yngg5Z_tE,7027
8
8
  dbos/_app_db.py,sha256=IwnNlHEQYp2bl5BM66vVPFa40h8DOtvRgUWTJ1dz20A,8963
9
9
  dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
10
- dbos/_client.py,sha256=fzW_Gagh-oyWyDYtREcQDBesoVl_LsEoMeJAsn5-C5s,7262
10
+ dbos/_client.py,sha256=5iaoFsu5wAqwjjj3EWusZ1eDbBAW8FwYazhokdCJ9h4,10964
11
11
  dbos/_conductor/conductor.py,sha256=HYzVL29IMMrs2Mnms_7cHJynCnmmEN5SDQOMjzn3UoU,16840
12
12
  dbos/_conductor/protocol.py,sha256=xN7pmooyF1pqbH1b6WhllU5718P7zSb_b0KCwA6bzcs,6716
13
13
  dbos/_context.py,sha256=I8sLkdKTTkZEz7wG-MjynaQB6XEF2bLXuwNksiauP7w,19430
14
14
  dbos/_core.py,sha256=tjBGVbSgOn59lR29gcYi5f6fcKNKQM5EP1QXrQGUkXA,45426
15
15
  dbos/_croniter.py,sha256=XHAyUyibs_59sJQfSNWkP7rqQY6_XrlfuuCxk4jYqek,47559
16
- dbos/_dbos.py,sha256=TOLi95Aca50huyOAWl9H5fii4nMYaGwN-zQ8GlLWdOg,45569
16
+ dbos/_dbos.py,sha256=rc5MLk6k-B0BlDpsQ9mYW509M1HUYa9SZvdWPpZS35o,45587
17
17
  dbos/_dbos_config.py,sha256=m05IFjM0jSwZBsnFMF_4qP2JkjVFc0gqyM2tnotXq20,20636
18
18
  dbos/_debug.py,sha256=MNlQVZ6TscGCRQeEEL0VE8Uignvr6dPeDDDefS3xgIE,1823
19
19
  dbos/_docker_pg_helper.py,sha256=9OGbuavRA_cwE-uPiLZJSdpbQu-6PPgl9clQZB2zT_U,5852
@@ -44,7 +44,7 @@ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  dbos/_schemas/application_database.py,sha256=SypAS9l9EsaBHFn9FR8jmnqt01M74d9AF1AMa4m2hhI,1040
45
45
  dbos/_schemas/system_database.py,sha256=W9eSpL7SZzQkxcEZ4W07BOcwkkDr35b9oCjUOgfHWek,5336
46
46
  dbos/_serialization.py,sha256=YCYv0qKAwAZ1djZisBC7khvKqG-5OcIv9t9EC5PFIog,1743
47
- dbos/_sys_db.py,sha256=BqXZ0l4X4Y4cFKDyaa8ZirWCnRlof9A12yp-XflGnb0,68229
47
+ dbos/_sys_db.py,sha256=vQzr6qACjtmjVS151OJ45BlhOeB1tBBZemyEzOsy5nc,68343
48
48
  dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
49
49
  dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
50
  dbos/_templates/dbos-db-starter/__package/main.py,sha256=nJMN3ZD2lmwg4Dcgmiwqc-tQGuCJuJal2Xl85iA277U,2453
@@ -64,4 +64,4 @@ dbos/cli/cli.py,sha256=Lb_RYmXoT5KH0xDbwaYpROE4c-svZ0eCq2Kxg7cAxTw,16537
64
64
  dbos/dbos-config.schema.json,sha256=i7jcxXqByKq0Jzv3nAUavONtj03vTwj6vWP4ylmBr8o,5694
65
65
  dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
66
66
  version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
67
- dbos-0.26.0a9.dist-info/RECORD,,
67
+ dbos-0.26.0a11.dist-info/RECORD,,