dbos 1.2.0a5__tar.gz → 1.2.0a6__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.
Files changed (106) hide show
  1. {dbos-1.2.0a5 → dbos-1.2.0a6}/PKG-INFO +1 -1
  2. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_sys_db.py +10 -7
  3. {dbos-1.2.0a5 → dbos-1.2.0a6}/pyproject.toml +1 -1
  4. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_queue.py +30 -0
  5. {dbos-1.2.0a5 → dbos-1.2.0a6}/LICENSE +0 -0
  6. {dbos-1.2.0a5 → dbos-1.2.0a6}/README.md +0 -0
  7. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/__init__.py +0 -0
  8. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/__main__.py +0 -0
  9. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_admin_server.py +0 -0
  10. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_app_db.py +0 -0
  11. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_classproperty.py +0 -0
  12. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_client.py +0 -0
  13. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_conductor/conductor.py +0 -0
  14. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_conductor/protocol.py +0 -0
  15. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_context.py +0 -0
  16. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_core.py +0 -0
  17. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_croniter.py +0 -0
  18. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_dbos.py +0 -0
  19. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_dbos_config.py +0 -0
  20. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_debug.py +0 -0
  21. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_docker_pg_helper.py +0 -0
  22. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_error.py +0 -0
  23. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_event_loop.py +0 -0
  24. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_fastapi.py +0 -0
  25. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_flask.py +0 -0
  26. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_kafka.py +0 -0
  27. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_kafka_message.py +0 -0
  28. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_logger.py +0 -0
  29. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/env.py +0 -0
  30. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/script.py.mako +0 -0
  31. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  32. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  33. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  34. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  35. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  36. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
  37. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  38. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  39. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  40. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  41. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  42. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_outcome.py +0 -0
  43. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_queue.py +0 -0
  44. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_recovery.py +0 -0
  45. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_registrations.py +0 -0
  46. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_roles.py +0 -0
  47. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_scheduler.py +0 -0
  48. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_schemas/__init__.py +0 -0
  49. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_schemas/application_database.py +0 -0
  50. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_schemas/system_database.py +0 -0
  51. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_serialization.py +0 -0
  52. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/README.md +0 -0
  53. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  54. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  55. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  56. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  57. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  58. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  59. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  60. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  61. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  62. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_tracer.py +0 -0
  63. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_utils.py +0 -0
  64. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/_workflow_commands.py +0 -0
  65. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/cli/_github_init.py +0 -0
  66. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/cli/_template_init.py +0 -0
  67. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/cli/cli.py +0 -0
  68. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/dbos-config.schema.json +0 -0
  69. {dbos-1.2.0a5 → dbos-1.2.0a6}/dbos/py.typed +0 -0
  70. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/__init__.py +0 -0
  71. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/atexit_no_ctor.py +0 -0
  72. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/atexit_no_launch.py +0 -0
  73. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/classdefs.py +0 -0
  74. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/client_collateral.py +0 -0
  75. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/client_worker.py +0 -0
  76. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/conftest.py +0 -0
  77. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/dupname_classdefs1.py +0 -0
  78. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/dupname_classdefsa.py +0 -0
  79. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/more_classdefs.py +0 -0
  80. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/queuedworkflow.py +0 -0
  81. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_admin_server.py +0 -0
  82. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_async.py +0 -0
  83. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_classdecorators.py +0 -0
  84. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_cli.py +0 -0
  85. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_client.py +0 -0
  86. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_concurrency.py +0 -0
  87. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_config.py +0 -0
  88. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_croniter.py +0 -0
  89. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_dbos.py +0 -0
  90. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_debug.py +0 -0
  91. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_docker_secrets.py +0 -0
  92. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_failures.py +0 -0
  93. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_fastapi.py +0 -0
  94. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_fastapi_roles.py +0 -0
  95. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_flask.py +0 -0
  96. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_kafka.py +0 -0
  97. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_outcome.py +0 -0
  98. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_package.py +0 -0
  99. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_scheduler.py +0 -0
  100. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_schema_migration.py +0 -0
  101. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_singleton.py +0 -0
  102. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_spans.py +0 -0
  103. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_sqlalchemy.py +0 -0
  104. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_workflow_introspection.py +0 -0
  105. {dbos-1.2.0a5 → dbos-1.2.0a6}/tests/test_workflow_management.py +0 -0
  106. {dbos-1.2.0a5 → dbos-1.2.0a6}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.2.0a5
3
+ Version: 1.2.0a6
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -425,6 +425,15 @@ class SystemDatabase:
425
425
  wf_status: WorkflowStatuses = status["status"]
426
426
  workflow_deadline_epoch_ms: Optional[int] = status["workflow_deadline_epoch_ms"]
427
427
 
428
+ # Values to update when a row already exists for this workflow
429
+ update_values: dict[str, Any] = {
430
+ "recovery_attempts": SystemSchema.workflow_status.c.recovery_attempts + 1,
431
+ "updated_at": func.extract("epoch", func.now()) * 1000,
432
+ }
433
+ # Don't update an existing executor ID when enqueueing a workflow.
434
+ if wf_status != WorkflowStatusString.ENQUEUED.value:
435
+ update_values["executor_id"] = status["executor_id"]
436
+
428
437
  cmd = (
429
438
  pg.insert(SystemSchema.workflow_status)
430
439
  .values(
@@ -450,13 +459,7 @@ class SystemDatabase:
450
459
  )
451
460
  .on_conflict_do_update(
452
461
  index_elements=["workflow_uuid"],
453
- set_=dict(
454
- executor_id=status["executor_id"],
455
- recovery_attempts=(
456
- SystemSchema.workflow_status.c.recovery_attempts + 1
457
- ),
458
- updated_at=func.extract("epoch", func.now()) * 1000,
459
- ),
462
+ set_=update_values,
460
463
  )
461
464
  )
462
465
 
@@ -27,7 +27,7 @@ dependencies = [
27
27
  ]
28
28
  requires-python = ">=3.9"
29
29
  readme = "README.md"
30
- version = "1.2.0a5"
30
+ version = "1.2.0a6"
31
31
 
32
32
  [project.license]
33
33
  text = "MIT"
@@ -1446,3 +1446,33 @@ def test_unsetting_timeout(dbos: DBOS) -> None:
1446
1446
  # Verify child two, which doesn't have a timeout, succeeds
1447
1447
  handle = DBOS.retrieve_workflow(child_two)
1448
1448
  assert handle.get_result() == child_two
1449
+
1450
+
1451
+ def test_queue_executor_id(dbos: DBOS) -> None:
1452
+
1453
+ queue = Queue("test-queue")
1454
+
1455
+ @DBOS.workflow()
1456
+ def example_workflow() -> str:
1457
+ return DBOS.workflow_id
1458
+
1459
+ # Set an executor ID
1460
+ original_executor_id = str(uuid.uuid4())
1461
+ GlobalParams.executor_id = original_executor_id
1462
+
1463
+ # Enqueue the workflow, validate its executor ID
1464
+ wfid = str(uuid.uuid4())
1465
+ with SetWorkflowID(wfid):
1466
+ handle = queue.enqueue(example_workflow)
1467
+ assert handle.get_result() == wfid
1468
+ assert handle.get_status().executor_id == original_executor_id
1469
+
1470
+ # Set a new executor ID
1471
+ new_executor_id = str(uuid.uuid4())
1472
+ GlobalParams.executor_id = new_executor_id
1473
+
1474
+ # Re-enqueue the workflow, verify its executor ID does not change.
1475
+ with SetWorkflowID(wfid):
1476
+ handle = queue.enqueue(example_workflow)
1477
+ assert handle.get_result() == wfid
1478
+ assert handle.get_status().executor_id == original_executor_id
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
File without changes
File without changes
File without changes
File without changes
File without changes