dbos 1.7.0a3__tar.gz → 1.7.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 (108) hide show
  1. {dbos-1.7.0a3 → dbos-1.7.0a5}/PKG-INFO +1 -1
  2. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_admin_server.py +6 -2
  3. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_core.py +4 -1
  4. {dbos-1.7.0a3 → dbos-1.7.0a5}/pyproject.toml +1 -1
  5. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_admin_server.py +24 -6
  6. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_dbos.py +26 -0
  7. {dbos-1.7.0a3 → dbos-1.7.0a5}/LICENSE +0 -0
  8. {dbos-1.7.0a3 → dbos-1.7.0a5}/README.md +0 -0
  9. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/__init__.py +0 -0
  10. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/__main__.py +0 -0
  11. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_app_db.py +0 -0
  12. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_classproperty.py +0 -0
  13. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_client.py +0 -0
  14. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_conductor/conductor.py +0 -0
  15. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_conductor/protocol.py +0 -0
  16. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_context.py +0 -0
  17. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_croniter.py +0 -0
  18. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_dbos.py +0 -0
  19. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_dbos_config.py +0 -0
  20. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_debug.py +0 -0
  21. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_docker_pg_helper.py +0 -0
  22. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_error.py +0 -0
  23. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_event_loop.py +0 -0
  24. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_fastapi.py +0 -0
  25. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_flask.py +0 -0
  26. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_kafka.py +0 -0
  27. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_kafka_message.py +0 -0
  28. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_logger.py +0 -0
  29. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/env.py +0 -0
  30. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/script.py.mako +0 -0
  31. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  32. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  33. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  34. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  35. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -0
  36. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  37. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
  38. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  39. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  40. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  41. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/d994145b47b6_consolidate_inputs.py +0 -0
  42. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  43. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  44. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_outcome.py +0 -0
  45. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_queue.py +0 -0
  46. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_recovery.py +0 -0
  47. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_registrations.py +0 -0
  48. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_roles.py +0 -0
  49. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_scheduler.py +0 -0
  50. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_schemas/__init__.py +0 -0
  51. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_schemas/application_database.py +0 -0
  52. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_schemas/system_database.py +0 -0
  53. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_serialization.py +0 -0
  54. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_sys_db.py +0 -0
  55. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/README.md +0 -0
  56. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  57. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  58. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  59. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  60. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  61. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  62. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  63. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  64. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  65. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_tracer.py +0 -0
  66. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_utils.py +0 -0
  67. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_workflow_commands.py +0 -0
  68. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/cli/_github_init.py +0 -0
  69. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/cli/_template_init.py +0 -0
  70. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/cli/cli.py +0 -0
  71. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/dbos-config.schema.json +0 -0
  72. {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/py.typed +0 -0
  73. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/__init__.py +0 -0
  74. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/atexit_no_ctor.py +0 -0
  75. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/atexit_no_launch.py +0 -0
  76. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/classdefs.py +0 -0
  77. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/client_collateral.py +0 -0
  78. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/client_worker.py +0 -0
  79. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/conftest.py +0 -0
  80. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/dupname_classdefs1.py +0 -0
  81. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/dupname_classdefsa.py +0 -0
  82. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/more_classdefs.py +0 -0
  83. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/queuedworkflow.py +0 -0
  84. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_async.py +0 -0
  85. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_classdecorators.py +0 -0
  86. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_cli.py +0 -0
  87. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_client.py +0 -0
  88. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_concurrency.py +0 -0
  89. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_config.py +0 -0
  90. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_croniter.py +0 -0
  91. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_debug.py +0 -0
  92. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_docker_secrets.py +0 -0
  93. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_failures.py +0 -0
  94. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_fastapi.py +0 -0
  95. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_fastapi_roles.py +0 -0
  96. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_flask.py +0 -0
  97. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_kafka.py +0 -0
  98. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_outcome.py +0 -0
  99. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_package.py +0 -0
  100. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_queue.py +0 -0
  101. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_scheduler.py +0 -0
  102. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_schema_migration.py +0 -0
  103. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_singleton.py +0 -0
  104. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_spans.py +0 -0
  105. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_sqlalchemy.py +0 -0
  106. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_workflow_introspection.py +0 -0
  107. {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_workflow_management.py +0 -0
  108. {dbos-1.7.0a3 → dbos-1.7.0a5}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.7.0a3
3
+ Version: 1.7.0a5
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  import json
4
4
  import re
5
5
  import threading
6
- from dataclasses import asdict
7
6
  from functools import partial
8
7
  from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
9
8
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, TypedDict
@@ -120,7 +119,12 @@ class AdminRequestHandler(BaseHTTPRequestHandler):
120
119
  self.send_response(404)
121
120
  self._end_headers()
122
121
  return
123
- response_body = json.dumps(workflows[0].__dict__).encode("utf-8")
122
+ workflow_output = (
123
+ conductor_protocol.WorkflowsOutput.from_workflow_information(
124
+ workflows[0]
125
+ )
126
+ )
127
+ response_body = json.dumps(workflow_output.__dict__).encode("utf-8")
124
128
  self.send_response(200)
125
129
  self.send_header("Content-Type", "application/json")
126
130
  self.send_header("Content-Length", str(len(response_body)))
@@ -1157,13 +1157,16 @@ def decorate_step(
1157
1157
  def wrapper(*args: Any, **kwargs: Any) -> Any:
1158
1158
  rr: Optional[str] = check_required_roles(func, fi)
1159
1159
  # Entering step is allowed:
1160
+ # No DBOS, just call the original function directly
1160
1161
  # In a step already, just call the original function directly.
1161
1162
  # In a workflow (that is not in a step already)
1162
1163
  # Not in a workflow (we will start the single op workflow)
1164
+ if not dbosreg.dbos or not dbosreg.dbos._launched:
1165
+ # Call the original function directly
1166
+ return func(*args, **kwargs)
1163
1167
  ctx = get_local_dbos_context()
1164
1168
  if ctx and ctx.is_step():
1165
1169
  # Call the original function directly
1166
-
1167
1170
  return func(*args, **kwargs)
1168
1171
  if ctx and ctx.is_within_workflow():
1169
1172
  assert ctx.is_workflow(), "Steps must be called from within workflows"
@@ -27,7 +27,7 @@ dependencies = [
27
27
  ]
28
28
  requires-python = ">=3.9"
29
29
  readme = "README.md"
30
- version = "1.7.0a3"
30
+ version = "1.7.0a5"
31
31
 
32
32
  [project.license]
33
33
  text = "MIT"
@@ -639,16 +639,16 @@ def test_get_workflow_by_id(dbos: DBOS) -> None:
639
639
  pass
640
640
 
641
641
  @DBOS.workflow()
642
- def test_workflow_2() -> None:
643
- pass
642
+ def test_workflow_2(my_time: datetime) -> str:
643
+ return DBOS.workflow_id + " completed at " + my_time.isoformat()
644
644
 
645
645
  # Start workflows
646
646
  handle_1 = DBOS.start_workflow(test_workflow_1)
647
- handle_2 = DBOS.start_workflow(test_workflow_2)
647
+ handle_2 = DBOS.start_workflow(test_workflow_2, datetime.now())
648
648
 
649
649
  # Wait for workflows to complete
650
650
  handle_1.get_result()
651
- handle_2.get_result()
651
+ assert handle_2.get_result() is not None
652
652
 
653
653
  # Get the workflow ID of the second workflow
654
654
  workflow_id = handle_2.workflow_id
@@ -660,10 +660,28 @@ def test_get_workflow_by_id(dbos: DBOS) -> None:
660
660
  ), f"Expected status code 200, but got {response.status_code}"
661
661
 
662
662
  workflow_data = response.json()
663
- assert workflow_data["workflow_id"] == workflow_id, "Workflow ID mismatch"
663
+ assert workflow_data["WorkflowUUID"] == workflow_id, "Workflow ID mismatch"
664
664
  assert (
665
- workflow_data["status"] == "SUCCESS"
665
+ workflow_data["Status"] == "SUCCESS"
666
666
  ), "Expected workflow status to be SUCCESS"
667
+ assert workflow_data["WorkflowName"] == test_workflow_2.__qualname__
668
+ assert workflow_data["WorkflowClassName"] is None
669
+ assert workflow_data["WorkflowConfigName"] is None
670
+ assert workflow_data["AuthenticatedUser"] is None
671
+ assert workflow_data["AssumedRole"] is None
672
+ assert workflow_data["AuthenticatedRoles"] is None
673
+ assert workflow_data["Input"] is not None and len(workflow_data["Input"]) > 0
674
+ assert workflow_data["Output"] is not None and len(workflow_data["Output"]) > 0
675
+ assert workflow_data["Error"] is None
676
+ assert (
677
+ workflow_data["CreatedAt"] is not None and len(workflow_data["CreatedAt"]) > 0
678
+ )
679
+ assert (
680
+ workflow_data["UpdatedAt"] is not None and len(workflow_data["UpdatedAt"]) > 0
681
+ )
682
+ assert workflow_data["QueueName"] is None
683
+ assert workflow_data["ApplicationVersion"] == GlobalParams.app_version
684
+ assert workflow_data["ExecutorID"] == GlobalParams.executor_id
667
685
 
668
686
  # Test GET /workflows/:workflow_id for a non-existing workflow
669
687
  non_existing_workflow_id = "non-existing-id"
@@ -1608,3 +1608,29 @@ def test_custom_names(dbos: DBOS) -> None:
1608
1608
  handle = DBOS.start_workflow(workflow, value) # type: ignore
1609
1609
  assert handle.get_status().name == another_workflow
1610
1610
  assert handle.get_result() == value # type: ignore
1611
+
1612
+
1613
+ @pytest.mark.asyncio
1614
+ async def test_step_without_dbos(dbos: DBOS, config: DBOSConfig) -> None:
1615
+ DBOS.destroy(destroy_registry=True)
1616
+
1617
+ @DBOS.step()
1618
+ def step(x: int) -> int:
1619
+ return x
1620
+
1621
+ @DBOS.step()
1622
+ async def async_step(x: int) -> int:
1623
+ return x
1624
+
1625
+ assert step(5) == 5
1626
+ assert await async_step(5) == 5
1627
+
1628
+ DBOS(config=config)
1629
+
1630
+ assert step(5) == 5
1631
+ assert await async_step(5) == 5
1632
+
1633
+ DBOS.launch()
1634
+
1635
+ assert step(5) == 5
1636
+ assert await async_step(5) == 5
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