dbos 1.11.0a3__tar.gz → 1.11.0a5__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 (113) hide show
  1. {dbos-1.11.0a3 → dbos-1.11.0a5}/PKG-INFO +1 -1
  2. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_core.py +3 -2
  3. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/cli/migration.py +3 -1
  4. {dbos-1.11.0a3 → dbos-1.11.0a5}/pyproject.toml +1 -1
  5. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_async.py +34 -0
  6. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_migrate.py +6 -6
  7. {dbos-1.11.0a3 → dbos-1.11.0a5}/LICENSE +0 -0
  8. {dbos-1.11.0a3 → dbos-1.11.0a5}/README.md +0 -0
  9. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/__init__.py +0 -0
  10. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/__main__.py +0 -0
  11. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_admin_server.py +0 -0
  12. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_app_db.py +0 -0
  13. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_classproperty.py +0 -0
  14. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_client.py +0 -0
  15. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_conductor/conductor.py +0 -0
  16. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_conductor/protocol.py +0 -0
  17. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_context.py +0 -0
  18. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_croniter.py +0 -0
  19. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_dbos.py +0 -0
  20. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_dbos_config.py +0 -0
  21. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_debug.py +0 -0
  22. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_docker_pg_helper.py +0 -0
  23. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_error.py +0 -0
  24. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_event_loop.py +0 -0
  25. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_fastapi.py +0 -0
  26. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_flask.py +0 -0
  27. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_kafka.py +0 -0
  28. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_kafka_message.py +0 -0
  29. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_logger.py +0 -0
  30. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/env.py +0 -0
  31. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/script.py.mako +0 -0
  32. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/01ce9f07bd10_streaming.py +0 -0
  33. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  34. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  35. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  36. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  37. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -0
  38. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  39. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
  40. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  41. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  42. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  43. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/d994145b47b6_consolidate_inputs.py +0 -0
  44. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  45. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  46. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_outcome.py +0 -0
  47. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_queue.py +0 -0
  48. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_recovery.py +0 -0
  49. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_registrations.py +0 -0
  50. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_roles.py +0 -0
  51. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_scheduler.py +0 -0
  52. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_schemas/__init__.py +0 -0
  53. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_schemas/application_database.py +0 -0
  54. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_schemas/system_database.py +0 -0
  55. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_serialization.py +0 -0
  56. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_sys_db.py +0 -0
  57. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/README.md +0 -0
  58. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  59. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  60. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  61. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  62. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  63. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  64. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  65. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  66. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  67. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_tracer.py +0 -0
  68. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_utils.py +0 -0
  69. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/_workflow_commands.py +0 -0
  70. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/cli/_github_init.py +0 -0
  71. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/cli/_template_init.py +0 -0
  72. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/cli/cli.py +0 -0
  73. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/dbos-config.schema.json +0 -0
  74. {dbos-1.11.0a3 → dbos-1.11.0a5}/dbos/py.typed +0 -0
  75. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/__init__.py +0 -0
  76. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/atexit_no_ctor.py +0 -0
  77. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/atexit_no_launch.py +0 -0
  78. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/classdefs.py +0 -0
  79. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/client_collateral.py +0 -0
  80. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/client_worker.py +0 -0
  81. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/conftest.py +0 -0
  82. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/dupname_classdefs1.py +0 -0
  83. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/dupname_classdefsa.py +0 -0
  84. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/more_classdefs.py +0 -0
  85. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/queuedworkflow.py +0 -0
  86. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_admin_server.py +0 -0
  87. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_async_workflow_management.py +0 -0
  88. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_classdecorators.py +0 -0
  89. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_cli.py +0 -0
  90. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_client.py +0 -0
  91. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_concurrency.py +0 -0
  92. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_config.py +0 -0
  93. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_croniter.py +0 -0
  94. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_dbos.py +0 -0
  95. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_debug.py +0 -0
  96. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_docker_secrets.py +0 -0
  97. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_failures.py +0 -0
  98. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_fastapi.py +0 -0
  99. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_fastapi_roles.py +0 -0
  100. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_flask.py +0 -0
  101. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_kafka.py +0 -0
  102. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_outcome.py +0 -0
  103. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_package.py +0 -0
  104. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_queue.py +0 -0
  105. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_scheduler.py +0 -0
  106. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_schema_migration.py +0 -0
  107. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_singleton.py +0 -0
  108. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_spans.py +0 -0
  109. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_sqlalchemy.py +0 -0
  110. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_streaming.py +0 -0
  111. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_workflow_introspection.py +0 -0
  112. {dbos-1.11.0a3 → dbos-1.11.0a5}/tests/test_workflow_management.py +0 -0
  113. {dbos-1.11.0a3 → dbos-1.11.0a5}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.11.0a3
3
+ Version: 1.11.0a5
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -157,7 +157,7 @@ class WorkflowHandlePolling(Generic[R]):
157
157
 
158
158
  class WorkflowHandleAsyncTask(Generic[R]):
159
159
 
160
- def __init__(self, workflow_id: str, task: asyncio.Task[R], dbos: "DBOS"):
160
+ def __init__(self, workflow_id: str, task: asyncio.Future[R], dbos: "DBOS"):
161
161
  self.workflow_id = workflow_id
162
162
  self.task = task
163
163
  self.dbos = dbos
@@ -698,7 +698,8 @@ async def start_workflow_async(
698
698
  return WorkflowHandleAsyncPolling(new_wf_id, dbos)
699
699
 
700
700
  coro = _execute_workflow_async(dbos, status, func, new_wf_ctx, *args, **kwargs)
701
- task = asyncio.create_task(coro)
701
+ # Shield the workflow task from cancellation
702
+ task = asyncio.shield(asyncio.create_task(coro))
702
703
  return WorkflowHandleAsyncTask(new_wf_id, task, dbos)
703
704
 
704
705
 
@@ -46,7 +46,9 @@ def grant_dbos_schema_permissions(database_url: str, role_name: str) -> None:
46
46
  )
47
47
  engine = None
48
48
  try:
49
- engine = sa.create_engine(database_url)
49
+ engine = sa.create_engine(
50
+ sa.make_url(database_url).set(drivername="postgresql+psycopg")
51
+ )
50
52
  with engine.connect() as connection:
51
53
  connection.execution_options(isolation_level="AUTOCOMMIT")
52
54
 
@@ -27,7 +27,7 @@ dependencies = [
27
27
  ]
28
28
  requires-python = ">=3.9"
29
29
  readme = "README.md"
30
- version = "1.11.0a3"
30
+ version = "1.11.0a5"
31
31
 
32
32
  [project.license]
33
33
  text = "MIT"
@@ -595,3 +595,37 @@ async def test_main_loop(dbos: DBOS, config: DBOSConfig) -> None:
595
595
  # Verify the enqueued task is submitted into the main event loop
596
596
  handle = await queue.enqueue_async(test_workflow)
597
597
  assert await handle.get_result() == id(asyncio.get_running_loop())
598
+
599
+
600
+ @pytest.mark.asyncio
601
+ async def test_workflow_with_task_cancellation(dbos: DBOS) -> None:
602
+ @DBOS.workflow()
603
+ async def test_workflow(duration: float) -> str:
604
+ await DBOS.sleep_async(duration)
605
+ return "completed"
606
+
607
+ # Run the workflow in an asyncio task
608
+ wfid = str(uuid.uuid4())
609
+ event = asyncio.Event()
610
+
611
+ async def run_workflow_task() -> str:
612
+ with SetWorkflowID(wfid):
613
+ handle = await DBOS.start_workflow_async(test_workflow, 1.0)
614
+ event.set()
615
+ return await handle.get_result()
616
+
617
+ task = asyncio.create_task(run_workflow_task())
618
+
619
+ # Wait for the workflow to start
620
+ await event.wait()
621
+
622
+ # Cancel the task
623
+ task.cancel()
624
+
625
+ # Verify the task was cancelled
626
+ with pytest.raises(asyncio.CancelledError):
627
+ await task
628
+
629
+ # Verify the workflow completes despite the task cancellation
630
+ handle: WorkflowHandleAsync[str] = await DBOS.retrieve_workflow_async(wfid)
631
+ assert await handle.get_result() == "completed"
@@ -11,9 +11,11 @@ def test_migrate(postgres_db_engine: sa.Engine) -> None:
11
11
  role_name = "migrate-test-role"
12
12
  role_password = "migrate_test_password"
13
13
 
14
- db_url = postgres_db_engine.url.set(database=database_name).render_as_string(
15
- hide_password=False
14
+ # Verify migration is agnostic to driver name (under the hood it uses postgresql+psycopg)
15
+ db_url = postgres_db_engine.url.set(database=database_name).set(
16
+ drivername="postgresql"
16
17
  )
18
+ db_url_string = db_url.render_as_string(hide_password=False)
17
19
 
18
20
  # Drop the DBOS database if it exists. Create a test role with no permissions.
19
21
  with postgres_db_engine.connect() as connection:
@@ -31,7 +33,7 @@ def test_migrate(postgres_db_engine: sa.Engine) -> None:
31
33
  # Using the admin role, create the DBOS database and verify it exists.
32
34
  # Set permissions for the test role.
33
35
  subprocess.check_call(
34
- ["dbos", "migrate", "-D", db_url, "-s", db_url, "-r", role_name]
36
+ ["dbos", "migrate", "-D", db_url_string, "-s", db_url_string, "-r", role_name]
35
37
  )
36
38
  with postgres_db_engine.connect() as c:
37
39
  c.execution_options(isolation_level="AUTOCOMMIT")
@@ -44,9 +46,7 @@ def test_migrate(postgres_db_engine: sa.Engine) -> None:
44
46
 
45
47
  # Initialize DBOS with the test role. Verify various operations work.
46
48
  test_db_url = (
47
- postgres_db_engine.url.set(database=database_name)
48
- .set(username=role_name)
49
- .set(password=role_password)
49
+ db_url.set(username=role_name).set(password=role_password)
50
50
  ).render_as_string(hide_password=False)
51
51
  DBOS.destroy(destroy_registry=True)
52
52
  config: DBOSConfig = {
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
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