dbos 1.12.0a2__tar.gz → 1.12.0a3__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.12.0a2 → dbos-1.12.0a3}/PKG-INFO +1 -1
  2. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_fastapi.py +2 -0
  3. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/cli/cli.py +35 -6
  4. {dbos-1.12.0a2 → dbos-1.12.0a3}/pyproject.toml +1 -1
  5. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_package.py +100 -0
  6. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_spans.py +2 -0
  7. {dbos-1.12.0a2 → dbos-1.12.0a3}/LICENSE +0 -0
  8. {dbos-1.12.0a2 → dbos-1.12.0a3}/README.md +0 -0
  9. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/__init__.py +0 -0
  10. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/__main__.py +0 -0
  11. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_admin_server.py +0 -0
  12. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_app_db.py +0 -0
  13. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_classproperty.py +0 -0
  14. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_client.py +0 -0
  15. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_conductor/conductor.py +0 -0
  16. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_conductor/protocol.py +0 -0
  17. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_context.py +0 -0
  18. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_core.py +0 -0
  19. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_croniter.py +0 -0
  20. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_dbos.py +0 -0
  21. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_dbos_config.py +0 -0
  22. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_debug.py +0 -0
  23. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_docker_pg_helper.py +0 -0
  24. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_error.py +0 -0
  25. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_event_loop.py +0 -0
  26. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_flask.py +0 -0
  27. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_kafka.py +0 -0
  28. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_kafka_message.py +0 -0
  29. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_logger.py +0 -0
  30. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/env.py +0 -0
  31. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/script.py.mako +0 -0
  32. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/01ce9f07bd10_streaming.py +0 -0
  33. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  34. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  35. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  36. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  37. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -0
  38. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  39. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
  40. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  41. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  42. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  43. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/d994145b47b6_consolidate_inputs.py +0 -0
  44. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  45. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  46. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_outcome.py +0 -0
  47. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_queue.py +0 -0
  48. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_recovery.py +0 -0
  49. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_registrations.py +0 -0
  50. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_roles.py +0 -0
  51. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_scheduler.py +0 -0
  52. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_schemas/__init__.py +0 -0
  53. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_schemas/application_database.py +0 -0
  54. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_schemas/system_database.py +0 -0
  55. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_serialization.py +0 -0
  56. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_sys_db.py +0 -0
  57. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/README.md +0 -0
  58. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  59. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  60. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  61. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  62. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  63. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  64. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  65. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  66. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  67. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_tracer.py +0 -0
  68. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_utils.py +0 -0
  69. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/_workflow_commands.py +0 -0
  70. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/cli/_github_init.py +0 -0
  71. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/cli/_template_init.py +0 -0
  72. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/cli/migration.py +0 -0
  73. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/dbos-config.schema.json +0 -0
  74. {dbos-1.12.0a2 → dbos-1.12.0a3}/dbos/py.typed +0 -0
  75. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/__init__.py +0 -0
  76. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/atexit_no_ctor.py +0 -0
  77. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/atexit_no_launch.py +0 -0
  78. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/classdefs.py +0 -0
  79. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/client_collateral.py +0 -0
  80. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/client_worker.py +0 -0
  81. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/conftest.py +0 -0
  82. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/dupname_classdefs1.py +0 -0
  83. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/dupname_classdefsa.py +0 -0
  84. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/more_classdefs.py +0 -0
  85. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/queuedworkflow.py +0 -0
  86. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_admin_server.py +0 -0
  87. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_async.py +0 -0
  88. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_async_workflow_management.py +0 -0
  89. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_classdecorators.py +0 -0
  90. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_cli.py +0 -0
  91. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_client.py +0 -0
  92. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_concurrency.py +0 -0
  93. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_config.py +0 -0
  94. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_croniter.py +0 -0
  95. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_dbos.py +0 -0
  96. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_debug.py +0 -0
  97. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_docker_secrets.py +0 -0
  98. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_failures.py +0 -0
  99. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_fastapi.py +0 -0
  100. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_fastapi_roles.py +0 -0
  101. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_flask.py +0 -0
  102. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_kafka.py +0 -0
  103. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_migrate.py +0 -0
  104. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_outcome.py +0 -0
  105. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_queue.py +0 -0
  106. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_scheduler.py +0 -0
  107. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_schema_migration.py +0 -0
  108. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_singleton.py +0 -0
  109. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_sqlalchemy.py +0 -0
  110. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_streaming.py +0 -0
  111. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_workflow_introspection.py +0 -0
  112. {dbos-1.12.0a2 → dbos-1.12.0a3}/tests/test_workflow_management.py +0 -0
  113. {dbos-1.12.0a2 → dbos-1.12.0a3}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.12.0a2
3
+ Version: 1.12.0a3
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -83,4 +83,6 @@ def setup_fastapi_middleware(app: FastAPI, dbos: DBOS) -> None:
83
83
  response = await call_next(request)
84
84
  else:
85
85
  response = await call_next(request)
86
+ if hasattr(response, "status_code"):
87
+ DBOS.span.set_attribute("responseCode", response.status_code)
86
88
  return response
@@ -14,6 +14,7 @@ from rich import print as richprint
14
14
  from rich.prompt import IntPrompt
15
15
  from typing_extensions import Annotated, List
16
16
 
17
+ from dbos._context import SetWorkflowID
17
18
  from dbos._debug import debug_workflow, parse_start_command
18
19
  from dbos.cli.migration import grant_dbos_schema_permissions, migrate_dbos_databases
19
20
 
@@ -567,7 +568,9 @@ def resume(
567
568
  start_client(db_url=db_url).resume_workflow(workflow_id=workflow_id)
568
569
 
569
570
 
570
- @workflow.command(help="Restart a workflow from the beginning with a new id")
571
+ @workflow.command(
572
+ help="[DEPRECATED - Use fork instead] Restart a workflow from the beginning with a new id"
573
+ )
571
574
  def restart(
572
575
  workflow_id: Annotated[str, typer.Argument()],
573
576
  db_url: Annotated[
@@ -600,6 +603,22 @@ def fork(
600
603
  help="Restart from this step",
601
604
  ),
602
605
  ] = 1,
606
+ forked_workflow_id: Annotated[
607
+ typing.Optional[str],
608
+ typer.Option(
609
+ "--forked-workflow-id",
610
+ "-f",
611
+ help="Custom ID for the forked workflow",
612
+ ),
613
+ ] = None,
614
+ application_version: Annotated[
615
+ typing.Optional[str],
616
+ typer.Option(
617
+ "--application-version",
618
+ "-v",
619
+ help="Custom application version for the forked workflow",
620
+ ),
621
+ ] = None,
603
622
  db_url: Annotated[
604
623
  typing.Optional[str],
605
624
  typer.Option(
@@ -609,11 +628,21 @@ def fork(
609
628
  ),
610
629
  ] = None,
611
630
  ) -> None:
612
- status = (
613
- start_client(db_url=db_url)
614
- .fork_workflow(workflow_id=workflow_id, start_step=step)
615
- .get_status()
616
- )
631
+ client = start_client(db_url=db_url)
632
+
633
+ if forked_workflow_id is not None:
634
+ with SetWorkflowID(forked_workflow_id):
635
+ status = client.fork_workflow(
636
+ workflow_id=workflow_id,
637
+ start_step=step,
638
+ application_version=application_version,
639
+ ).get_status()
640
+ else:
641
+ status = client.fork_workflow(
642
+ workflow_id=workflow_id,
643
+ start_step=step,
644
+ application_version=application_version,
645
+ ).get_status()
617
646
  print(jsonpickle.encode(status, unpicklable=False))
618
647
 
619
648
 
@@ -27,7 +27,7 @@ dependencies = [
27
27
  ]
28
28
  requires-python = ">=3.9"
29
29
  readme = "README.md"
30
- version = "1.12.0a2"
30
+ version = "1.12.0a3"
31
31
 
32
32
  [project.license]
33
33
  text = "MIT"
@@ -275,3 +275,103 @@ def test_workflow_commands(postgres_db_engine: sa.Engine) -> None:
275
275
  assert isinstance(fork_wf_data, dict)
276
276
  assert fork_wf_data["workflow_id"] != wf_id
277
277
  assert fork_wf_data["status"] == "ENQUEUED"
278
+
279
+ # fork the workflow with custom forked workflow ID
280
+ custom_fork_id = "custom-fork-id-12345"
281
+ output = subprocess.check_output(
282
+ [
283
+ "dbos",
284
+ "workflow",
285
+ "fork",
286
+ wf_id,
287
+ "--step",
288
+ "3",
289
+ "--forked-workflow-id",
290
+ custom_fork_id,
291
+ ],
292
+ cwd=temp_path,
293
+ env=env,
294
+ )
295
+ custom_fork_data = json.loads(output)
296
+ assert isinstance(custom_fork_data, dict)
297
+ assert custom_fork_data["workflow_id"] == custom_fork_id
298
+ assert custom_fork_data["status"] == "ENQUEUED"
299
+
300
+ # verify the forked workflow data with get command
301
+ output = subprocess.check_output(
302
+ ["dbos", "workflow", "get", custom_fork_id, "--db-url", db_url],
303
+ cwd=temp_path,
304
+ )
305
+ custom_fork_get_data = json.loads(output)
306
+ assert isinstance(custom_fork_get_data, dict)
307
+ assert custom_fork_get_data["workflow_id"] == custom_fork_id
308
+
309
+ # fork the workflow with custom application version
310
+ output = subprocess.check_output(
311
+ [
312
+ "dbos",
313
+ "workflow",
314
+ "fork",
315
+ wf_id,
316
+ "--step",
317
+ "2",
318
+ "--application-version",
319
+ "test-version",
320
+ ],
321
+ cwd=temp_path,
322
+ env=env,
323
+ )
324
+ version_fork_data = json.loads(output)
325
+ assert isinstance(version_fork_data, dict)
326
+ assert version_fork_data["workflow_id"] != wf_id
327
+ assert version_fork_data["status"] == "ENQUEUED"
328
+
329
+ # verify the forked workflow data with get command and check application version
330
+ output = subprocess.check_output(
331
+ [
332
+ "dbos",
333
+ "workflow",
334
+ "get",
335
+ version_fork_data["workflow_id"],
336
+ "--db-url",
337
+ db_url,
338
+ ],
339
+ cwd=temp_path,
340
+ )
341
+ version_fork_get_data = json.loads(output)
342
+ assert isinstance(version_fork_get_data, dict)
343
+ assert version_fork_get_data["workflow_id"] == version_fork_data["workflow_id"]
344
+ assert version_fork_get_data["app_version"] == "test-version"
345
+
346
+ # fork the workflow with both custom ID and application version
347
+ custom_fork_id2 = "custom-fork-with-version-67890"
348
+ output = subprocess.check_output(
349
+ [
350
+ "dbos",
351
+ "workflow",
352
+ "fork",
353
+ wf_id,
354
+ "--step",
355
+ "4",
356
+ "--forked-workflow-id",
357
+ custom_fork_id2,
358
+ "--application-version",
359
+ "v2.0.0",
360
+ ],
361
+ cwd=temp_path,
362
+ env=env,
363
+ )
364
+ combined_fork_data = json.loads(output)
365
+ assert isinstance(combined_fork_data, dict)
366
+ assert combined_fork_data["workflow_id"] == custom_fork_id2
367
+ assert combined_fork_data["status"] == "ENQUEUED"
368
+
369
+ # verify the forked workflow data with get command and check both ID and application version
370
+ output = subprocess.check_output(
371
+ ["dbos", "workflow", "get", custom_fork_id2, "--db-url", db_url],
372
+ cwd=temp_path,
373
+ )
374
+ combined_fork_get_data = json.loads(output)
375
+ assert isinstance(combined_fork_get_data, dict)
376
+ assert combined_fork_get_data["workflow_id"] == custom_fork_id2
377
+ assert combined_fork_get_data["app_version"] == "v2.0.0"
@@ -244,6 +244,8 @@ def test_wf_fastapi(dbos_fastapi: Tuple[DBOS, FastAPI]) -> None:
244
244
 
245
245
  assert spans[0].name == test_workflow_endpoint.__qualname__
246
246
  assert spans[1].name == "/wf"
247
+ assert spans[1].attributes is not None
248
+ assert spans[1].attributes["responseCode"] == 200
247
249
 
248
250
  assert spans[0].parent.span_id == spans[1].context.span_id # type: ignore
249
251
  assert spans[1].parent == None
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