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.
- {dbos-1.7.0a3 → dbos-1.7.0a5}/PKG-INFO +1 -1
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_admin_server.py +6 -2
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_core.py +4 -1
- {dbos-1.7.0a3 → dbos-1.7.0a5}/pyproject.toml +1 -1
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_admin_server.py +24 -6
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_dbos.py +26 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/LICENSE +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/README.md +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/__init__.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/__main__.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_app_db.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_classproperty.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_client.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_conductor/conductor.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_conductor/protocol.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_context.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_croniter.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_dbos.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_dbos_config.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_debug.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_docker_pg_helper.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_error.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_event_loop.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_fastapi.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_flask.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_kafka.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_kafka_message.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_logger.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/env.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/script.py.mako +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/d994145b47b6_consolidate_inputs.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_outcome.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_queue.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_recovery.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_registrations.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_roles.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_scheduler.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_schemas/__init__.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_schemas/application_database.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_schemas/system_database.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_serialization.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_sys_db.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/README.md +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_tracer.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_utils.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_workflow_commands.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/cli/_github_init.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/cli/_template_init.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/cli/cli.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/dbos-config.schema.json +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/py.typed +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/__init__.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/atexit_no_ctor.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/atexit_no_launch.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/classdefs.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/client_collateral.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/client_worker.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/conftest.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/dupname_classdefs1.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/dupname_classdefsa.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/more_classdefs.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/queuedworkflow.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_async.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_classdecorators.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_cli.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_client.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_concurrency.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_config.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_croniter.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_debug.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_docker_secrets.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_failures.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_fastapi.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_fastapi_roles.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_flask.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_kafka.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_outcome.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_package.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_queue.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_scheduler.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_schema_migration.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_singleton.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_spans.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_sqlalchemy.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_workflow_introspection.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/tests/test_workflow_management.py +0 -0
- {dbos-1.7.0a3 → dbos-1.7.0a5}/version/__init__.py +0 -0
|
@@ -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
|
-
|
|
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"
|
|
@@ -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() ->
|
|
643
|
-
|
|
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["
|
|
663
|
+
assert workflow_data["WorkflowUUID"] == workflow_id, "Workflow ID mismatch"
|
|
664
664
|
assert (
|
|
665
|
-
workflow_data["
|
|
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
|
{dbos-1.7.0a3 → dbos-1.7.0a5}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py
RENAMED
|
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
|
|
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
|