dbos 0.7.0a8__tar.gz → 0.8.0a0__tar.gz

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.

Potentially problematic release.


This version of dbos might be problematic. Click here for more details.

Files changed (72) hide show
  1. {dbos-0.7.0a8 → dbos-0.8.0a0}/PKG-INFO +1 -1
  2. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/error.py +0 -11
  3. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/system_database.py +12 -17
  4. {dbos-0.7.0a8 → dbos-0.8.0a0}/pyproject.toml +1 -1
  5. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_dbos.py +22 -2
  6. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_fastapi_roles.py +2 -2
  7. {dbos-0.7.0a8 → dbos-0.8.0a0}/LICENSE +0 -0
  8. {dbos-0.7.0a8 → dbos-0.8.0a0}/README.md +0 -0
  9. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/__init__.py +0 -0
  10. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/admin_sever.py +0 -0
  11. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/application_database.py +0 -0
  12. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/cli.py +0 -0
  13. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/context.py +0 -0
  14. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/core.py +0 -0
  15. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/dbos-config.schema.json +0 -0
  16. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/dbos.py +0 -0
  17. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/dbos_config.py +0 -0
  18. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/decorators.py +0 -0
  19. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/fastapi.py +0 -0
  20. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/flask.py +0 -0
  21. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/kafka.py +0 -0
  22. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/kafka_message.py +0 -0
  23. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/logger.py +0 -0
  24. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/migrations/env.py +0 -0
  25. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/migrations/script.py.mako +0 -0
  26. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  27. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  28. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  29. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/py.typed +0 -0
  30. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/queue.py +0 -0
  31. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/recovery.py +0 -0
  32. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/registrations.py +0 -0
  33. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/request.py +0 -0
  34. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/roles.py +0 -0
  35. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/scheduler/croniter.py +0 -0
  36. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/scheduler/scheduler.py +0 -0
  37. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/schemas/__init__.py +0 -0
  38. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/schemas/application_database.py +0 -0
  39. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/schemas/system_database.py +0 -0
  40. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/README.md +0 -0
  41. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/__package/__init__.py +0 -0
  42. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/__package/main.py +0 -0
  43. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/__package/schema.py +0 -0
  44. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/alembic.ini +0 -0
  45. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/dbos-config.yaml.dbos +0 -0
  46. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/migrations/env.py.dbos +0 -0
  47. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/migrations/script.py.mako +0 -0
  48. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/migrations/versions/2024_07_31_180642_init.py +0 -0
  49. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/templates/hello/start_postgres_docker.py +0 -0
  50. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/tracer.py +0 -0
  51. {dbos-0.7.0a8 → dbos-0.8.0a0}/dbos/utils.py +0 -0
  52. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/__init__.py +0 -0
  53. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/atexit_no_ctor.py +0 -0
  54. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/atexit_no_launch.py +0 -0
  55. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/classdefs.py +0 -0
  56. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/conftest.py +0 -0
  57. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/more_classdefs.py +0 -0
  58. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/scheduler/test_croniter.py +0 -0
  59. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/scheduler/test_scheduler.py +0 -0
  60. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_admin_server.py +0 -0
  61. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_classdecorators.py +0 -0
  62. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_concurrency.py +0 -0
  63. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_config.py +0 -0
  64. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_failures.py +0 -0
  65. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_fastapi.py +0 -0
  66. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_flask.py +0 -0
  67. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_kafka.py +0 -0
  68. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_package.py +0 -0
  69. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_queue.py +0 -0
  70. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_schema_migration.py +0 -0
  71. {dbos-0.7.0a8 → dbos-0.8.0a0}/tests/test_singleton.py +0 -0
  72. {dbos-0.7.0a8 → dbos-0.8.0a0}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 0.7.0a8
3
+ Version: 0.8.0a0
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -32,7 +32,6 @@ class DBOSErrorCode(Enum):
32
32
  InitializationError = 3
33
33
  WorkflowFunctionNotFound = 4
34
34
  NonExistentWorkflowError = 5
35
- DuplicateWorkflowEventError = 6
36
35
  MaxStepRetriesExceeded = 7
37
36
  NotAuthorized = 8
38
37
 
@@ -87,16 +86,6 @@ class DBOSNonExistentWorkflowError(DBOSException):
87
86
  )
88
87
 
89
88
 
90
- class DBOSDuplicateWorkflowEventError(DBOSException):
91
- """Exception raised when a workflow attempts to set an event value more than once per key."""
92
-
93
- def __init__(self, workflow_id: str, key: str):
94
- super().__init__(
95
- f"Workflow {workflow_id} has already emitted an event with key {key}",
96
- dbos_error_code=DBOSErrorCode.DuplicateWorkflowEventError.value,
97
- )
98
-
99
-
100
89
  class DBOSNotAuthorizedError(DBOSException):
101
90
  """Exception raised by DBOS role-based security when the user is not authorized to access a function."""
102
91
 
@@ -1,6 +1,5 @@
1
1
  import datetime
2
2
  import os
3
- import select
4
3
  import threading
5
4
  import time
6
5
  from enum import Enum
@@ -14,11 +13,7 @@ from alembic.config import Config
14
13
  from sqlalchemy.exc import DBAPIError
15
14
 
16
15
  import dbos.utils as utils
17
- from dbos.error import (
18
- DBOSDuplicateWorkflowEventError,
19
- DBOSNonExistentWorkflowError,
20
- DBOSWorkflowConflictIDError,
21
- )
16
+ from dbos.error import DBOSNonExistentWorkflowError, DBOSWorkflowConflictIDError
22
17
 
23
18
  from .dbos_config import ConfigFile
24
19
  from .logger import dbos_logger
@@ -832,18 +827,18 @@ class SystemDatabase:
832
827
  if recorded_output is not None:
833
828
  return # Already sent before
834
829
 
835
- try:
836
- c.execute(
837
- pg.insert(SystemSchema.workflow_events).values(
838
- workflow_uuid=workflow_uuid,
839
- key=key,
840
- value=utils.serialize(message),
841
- )
830
+ c.execute(
831
+ pg.insert(SystemSchema.workflow_events)
832
+ .values(
833
+ workflow_uuid=workflow_uuid,
834
+ key=key,
835
+ value=utils.serialize(message),
842
836
  )
843
- except DBAPIError as dbapi_error:
844
- if dbapi_error.orig.sqlstate == "23505": # type: ignore
845
- raise DBOSDuplicateWorkflowEventError(workflow_uuid, key)
846
- raise
837
+ .on_conflict_do_update(
838
+ index_elements=["workflow_uuid", "key"],
839
+ set_={"value": utils.serialize(message)},
840
+ )
841
+ )
847
842
  output: OperationResultInternal = {
848
843
  "workflow_uuid": workflow_uuid,
849
844
  "function_id": function_id,
@@ -23,7 +23,7 @@ dependencies = [
23
23
  ]
24
24
  requires-python = ">=3.9"
25
25
  readme = "README.md"
26
- version = "0.7.0a8"
26
+ version = "0.8.0a0"
27
27
 
28
28
  [project.license]
29
29
  text = "MIT"
@@ -1,7 +1,8 @@
1
1
  import datetime
2
+ import threading
2
3
  import time
3
4
  import uuid
4
- from typing import Any, Optional
5
+ from typing import Optional
5
6
 
6
7
  import pytest
7
8
  import sqlalchemy as sa
@@ -13,7 +14,6 @@ from dbos import DBOS, ConfigFile, SetWorkflowID, WorkflowHandle, WorkflowStatus
13
14
  from dbos.context import assert_current_dbos_context, get_local_dbos_context
14
15
  from dbos.error import DBOSMaxStepRetriesExceeded
15
16
  from dbos.system_database import GetWorkflowsInput
16
- from tests.conftest import default_config
17
17
 
18
18
 
19
19
  def test_simple_workflow(dbos: DBOS) -> None:
@@ -882,3 +882,23 @@ def test_set_get_events(dbos: DBOS) -> None:
882
882
  with pytest.raises(Exception) as exc_info:
883
883
  dbos.set_event("key1", "value1")
884
884
  assert "set_event() must be called from within a workflow" in str(exc_info.value)
885
+
886
+
887
+ def test_multi_set_event(dbos: DBOS) -> None:
888
+ event = threading.Event()
889
+
890
+ wfid = str(uuid.uuid4())
891
+
892
+ @DBOS.workflow()
893
+ def test_setevent_workflow() -> None:
894
+ assert DBOS.workflow_id == wfid
895
+ DBOS.set_event("key", "value1")
896
+ event.wait()
897
+ DBOS.set_event("key", "value2")
898
+
899
+ with SetWorkflowID(wfid):
900
+ handle = DBOS.start_workflow(test_setevent_workflow)
901
+ assert DBOS.get_event(wfid, "key") == "value1"
902
+ event.set()
903
+ assert handle.get_result() == None
904
+ assert DBOS.get_event(wfid, "key") == "value2"
@@ -18,7 +18,7 @@ from dbos import DBOS, DBOSContextEnsure
18
18
 
19
19
  # Private API because this is a unit test
20
20
  from dbos.context import assert_current_dbos_context
21
- from dbos.error import DBOSDuplicateWorkflowEventError, DBOSNotAuthorizedError
21
+ from dbos.error import DBOSInitializationError, DBOSNotAuthorizedError
22
22
  from dbos.system_database import GetWorkflowsInput
23
23
  from dbos.tracer import dbos_tracer
24
24
 
@@ -54,7 +54,7 @@ def test_simple_endpoint(dbos_fastapi: Tuple[DBOS, FastAPI]) -> None:
54
54
 
55
55
  @app.get("/dbosinternalerror")
56
56
  def test_dbos_error_internal() -> None:
57
- raise DBOSDuplicateWorkflowEventError("nosuchwf", "test")
57
+ raise DBOSInitializationError("oh no")
58
58
 
59
59
  @app.get("/open/{var1}")
60
60
  @DBOS.required_roles([])
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes