dbos 1.12.0a3__py3-none-any.whl → 1.13.0a5__py3-none-any.whl

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 (39) hide show
  1. dbos/_alembic_migrations/versions/471b60d64126_dbos_migrations.py +35 -0
  2. dbos/_app_db.py +217 -80
  3. dbos/_client.py +3 -2
  4. dbos/_context.py +4 -0
  5. dbos/_core.py +7 -8
  6. dbos/_dbos.py +28 -18
  7. dbos/_dbos_config.py +29 -20
  8. dbos/_fastapi.py +1 -1
  9. dbos/_logger.py +3 -1
  10. dbos/_migration.py +322 -0
  11. dbos/_sys_db.py +123 -200
  12. dbos/_sys_db_postgres.py +173 -0
  13. dbos/_sys_db_sqlite.py +185 -0
  14. dbos/_tracer.py +5 -1
  15. dbos/_utils.py +10 -1
  16. dbos/cli/cli.py +5 -15
  17. dbos/cli/migration.py +2 -2
  18. {dbos-1.12.0a3.dist-info → dbos-1.13.0a5.dist-info}/METADATA +1 -1
  19. dbos-1.13.0a5.dist-info/RECORD +78 -0
  20. dbos-1.12.0a3.dist-info/RECORD +0 -74
  21. /dbos/{_migrations → _alembic_migrations}/env.py +0 -0
  22. /dbos/{_migrations → _alembic_migrations}/script.py.mako +0 -0
  23. /dbos/{_migrations → _alembic_migrations}/versions/01ce9f07bd10_streaming.py +0 -0
  24. /dbos/{_migrations → _alembic_migrations}/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  25. /dbos/{_migrations → _alembic_migrations}/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  26. /dbos/{_migrations → _alembic_migrations}/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  27. /dbos/{_migrations → _alembic_migrations}/versions/5c361fc04708_added_system_tables.py +0 -0
  28. /dbos/{_migrations → _alembic_migrations}/versions/66478e1b95e5_consolidate_queues.py +0 -0
  29. /dbos/{_migrations → _alembic_migrations}/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  30. /dbos/{_migrations → _alembic_migrations}/versions/933e86bdac6a_add_queue_priority.py +0 -0
  31. /dbos/{_migrations → _alembic_migrations}/versions/a3b18ad34abe_added_triggers.py +0 -0
  32. /dbos/{_migrations → _alembic_migrations}/versions/d76646551a6b_job_queue_limiter.py +0 -0
  33. /dbos/{_migrations → _alembic_migrations}/versions/d76646551a6c_workflow_queue.py +0 -0
  34. /dbos/{_migrations → _alembic_migrations}/versions/d994145b47b6_consolidate_inputs.py +0 -0
  35. /dbos/{_migrations → _alembic_migrations}/versions/eab0cc1d9a14_job_queue.py +0 -0
  36. /dbos/{_migrations → _alembic_migrations}/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  37. {dbos-1.12.0a3.dist-info → dbos-1.13.0a5.dist-info}/WHEEL +0 -0
  38. {dbos-1.12.0a3.dist-info → dbos-1.13.0a5.dist-info}/entry_points.txt +0 -0
  39. {dbos-1.12.0a3.dist-info → dbos-1.13.0a5.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,173 @@
1
+ import time
2
+ from typing import Any, Dict, Optional
3
+
4
+ import psycopg
5
+ import sqlalchemy as sa
6
+ from sqlalchemy.exc import DBAPIError
7
+
8
+ from dbos._migration import (
9
+ ensure_dbos_schema,
10
+ run_alembic_migrations,
11
+ run_dbos_migrations,
12
+ )
13
+ from dbos._schemas.system_database import SystemSchema
14
+
15
+ from ._logger import dbos_logger
16
+ from ._sys_db import SystemDatabase
17
+
18
+
19
+ class PostgresSystemDatabase(SystemDatabase):
20
+ """PostgreSQL-specific implementation of SystemDatabase."""
21
+
22
+ def __init__(
23
+ self,
24
+ *,
25
+ system_database_url: str,
26
+ engine_kwargs: Dict[str, Any],
27
+ debug_mode: bool = False,
28
+ ):
29
+ super().__init__(
30
+ system_database_url=system_database_url,
31
+ engine_kwargs=engine_kwargs,
32
+ debug_mode=debug_mode,
33
+ )
34
+ self.notification_conn: Optional[psycopg.connection.Connection] = None
35
+
36
+ def _create_engine(
37
+ self, system_database_url: str, engine_kwargs: Dict[str, Any]
38
+ ) -> sa.Engine:
39
+ # TODO: Make the schema dynamic so this isn't needed
40
+ SystemSchema.workflow_status.schema = "dbos"
41
+ SystemSchema.operation_outputs.schema = "dbos"
42
+ SystemSchema.notifications.schema = "dbos"
43
+ SystemSchema.workflow_events.schema = "dbos"
44
+ SystemSchema.streams.schema = "dbos"
45
+ url = sa.make_url(system_database_url).set(drivername="postgresql+psycopg")
46
+ return sa.create_engine(url, **engine_kwargs)
47
+
48
+ def run_migrations(self) -> None:
49
+ """Run PostgreSQL-specific migrations."""
50
+ if self._debug_mode:
51
+ dbos_logger.warning("System database migrations are skipped in debug mode.")
52
+ return
53
+ system_db_url = self.engine.url
54
+ sysdb_name = system_db_url.database
55
+ # If the system database does not already exist, create it
56
+ engine = sa.create_engine(
57
+ system_db_url.set(database="postgres"), **self._engine_kwargs
58
+ )
59
+ with engine.connect() as conn:
60
+ conn.execution_options(isolation_level="AUTOCOMMIT")
61
+ if not conn.execute(
62
+ sa.text("SELECT 1 FROM pg_database WHERE datname=:db_name"),
63
+ parameters={"db_name": sysdb_name},
64
+ ).scalar():
65
+ dbos_logger.info(f"Creating system database {sysdb_name}")
66
+ conn.execute(sa.text(f"CREATE DATABASE {sysdb_name}"))
67
+ engine.dispose()
68
+
69
+ using_dbos_migrations = ensure_dbos_schema(self.engine)
70
+ if not using_dbos_migrations:
71
+ # Complete the Alembic migrations, create the dbos_migrations table
72
+ run_alembic_migrations(self.engine)
73
+ run_dbos_migrations(self.engine)
74
+
75
+ def _cleanup_connections(self) -> None:
76
+ """Clean up PostgreSQL-specific connections."""
77
+ if self.notification_conn is not None:
78
+ self.notification_conn.close()
79
+
80
+ def _is_unique_constraint_violation(self, dbapi_error: DBAPIError) -> bool:
81
+ """Check if the error is a unique constraint violation in PostgreSQL."""
82
+ return dbapi_error.orig.sqlstate == "23505" # type: ignore
83
+
84
+ def _is_foreign_key_violation(self, dbapi_error: DBAPIError) -> bool:
85
+ """Check if the error is a foreign key violation in PostgreSQL."""
86
+ return dbapi_error.orig.sqlstate == "23503" # type: ignore
87
+
88
+ @staticmethod
89
+ def _reset_system_database(database_url: str) -> None:
90
+ """Reset the PostgreSQL system database by dropping it."""
91
+ system_db_url = sa.make_url(database_url)
92
+ sysdb_name = system_db_url.database
93
+
94
+ if sysdb_name is None:
95
+ raise ValueError(f"System database name not found in URL {system_db_url}")
96
+
97
+ try:
98
+ # Connect to postgres default database
99
+ engine = sa.create_engine(
100
+ system_db_url.set(database="postgres", drivername="postgresql+psycopg"),
101
+ connect_args={"connect_timeout": 10},
102
+ )
103
+
104
+ with engine.connect() as conn:
105
+ # Set autocommit required for database dropping
106
+ conn.execution_options(isolation_level="AUTOCOMMIT")
107
+
108
+ # Drop the database
109
+ conn.execute(
110
+ sa.text(f"DROP DATABASE IF EXISTS {sysdb_name} WITH (FORCE)")
111
+ )
112
+ engine.dispose()
113
+ except Exception as e:
114
+ dbos_logger.error(f"Error resetting PostgreSQL system database: {str(e)}")
115
+ raise e
116
+
117
+ def _notification_listener(self) -> None:
118
+ """Listen for PostgreSQL notifications using psycopg."""
119
+ while self._run_background_processes:
120
+ try:
121
+ # since we're using the psycopg connection directly, we need a url without the "+psycopg" suffix
122
+ url = sa.URL.create(
123
+ "postgresql", **self.engine.url.translate_connect_args()
124
+ )
125
+ # Listen to notifications
126
+ self.notification_conn = psycopg.connect(
127
+ url.render_as_string(hide_password=False), autocommit=True
128
+ )
129
+
130
+ self.notification_conn.execute("LISTEN dbos_notifications_channel")
131
+ self.notification_conn.execute("LISTEN dbos_workflow_events_channel")
132
+
133
+ while self._run_background_processes:
134
+ gen = self.notification_conn.notifies()
135
+ for notify in gen:
136
+ channel = notify.channel
137
+ dbos_logger.debug(
138
+ f"Received notification on channel: {channel}, payload: {notify.payload}"
139
+ )
140
+ if channel == "dbos_notifications_channel":
141
+ if notify.payload:
142
+ condition = self.notifications_map.get(notify.payload)
143
+ if condition is None:
144
+ # No condition found for this payload
145
+ continue
146
+ condition.acquire()
147
+ condition.notify_all()
148
+ condition.release()
149
+ dbos_logger.debug(
150
+ f"Signaled notifications condition for {notify.payload}"
151
+ )
152
+ elif channel == "dbos_workflow_events_channel":
153
+ if notify.payload:
154
+ condition = self.workflow_events_map.get(notify.payload)
155
+ if condition is None:
156
+ # No condition found for this payload
157
+ continue
158
+ condition.acquire()
159
+ condition.notify_all()
160
+ condition.release()
161
+ dbos_logger.debug(
162
+ f"Signaled workflow_events condition for {notify.payload}"
163
+ )
164
+ else:
165
+ dbos_logger.error(f"Unknown channel: {channel}")
166
+ except Exception as e:
167
+ if self._run_background_processes:
168
+ dbos_logger.warning(f"Notification listener error: {e}")
169
+ time.sleep(1)
170
+ # Then the loop will try to reconnect and restart the listener
171
+ finally:
172
+ if self.notification_conn is not None:
173
+ self.notification_conn.close()
dbos/_sys_db_sqlite.py ADDED
@@ -0,0 +1,185 @@
1
+ import os
2
+ import time
3
+ from typing import Any, Dict, Optional, Tuple
4
+
5
+ import sqlalchemy as sa
6
+ from sqlalchemy.exc import DBAPIError
7
+
8
+ from dbos._migration import sqlite_migrations
9
+ from dbos._schemas.system_database import SystemSchema
10
+
11
+ from ._logger import dbos_logger
12
+ from ._sys_db import SystemDatabase
13
+
14
+
15
+ class SQLiteSystemDatabase(SystemDatabase):
16
+ """SQLite-specific implementation of SystemDatabase."""
17
+
18
+ def _create_engine(
19
+ self, system_database_url: str, engine_kwargs: Dict[str, Any]
20
+ ) -> sa.Engine:
21
+ """Create a SQLite engine."""
22
+ # TODO: Make the schema dynamic so this isn't needed
23
+ SystemSchema.workflow_status.schema = None
24
+ SystemSchema.operation_outputs.schema = None
25
+ SystemSchema.notifications.schema = None
26
+ SystemSchema.workflow_events.schema = None
27
+ SystemSchema.streams.schema = None
28
+ return sa.create_engine(system_database_url)
29
+
30
+ def run_migrations(self) -> None:
31
+ """Run SQLite-specific migrations."""
32
+ if self._debug_mode:
33
+ dbos_logger.warning("System database migrations are skipped in debug mode.")
34
+ return
35
+
36
+ with self.engine.begin() as conn:
37
+ # Enable foreign keys for SQLite
38
+ conn.execute(sa.text("PRAGMA foreign_keys = ON"))
39
+
40
+ # Check if migrations table exists
41
+ result = conn.execute(
42
+ sa.text(
43
+ "SELECT name FROM sqlite_master WHERE type='table' AND name='dbos_migrations'"
44
+ )
45
+ ).fetchone()
46
+
47
+ if result is None:
48
+ # Create migrations table
49
+ conn.execute(
50
+ sa.text(
51
+ "CREATE TABLE dbos_migrations (version INTEGER NOT NULL PRIMARY KEY)"
52
+ )
53
+ )
54
+ last_applied = 0
55
+ else:
56
+ # Get current migration version
57
+ version_result = conn.execute(
58
+ sa.text("SELECT version FROM dbos_migrations")
59
+ ).fetchone()
60
+ last_applied = version_result[0] if version_result else 0
61
+
62
+ # Apply migrations starting from the next version
63
+ for i, migration_sql in enumerate(sqlite_migrations, 1):
64
+ if i <= last_applied:
65
+ continue
66
+
67
+ # Execute the migration
68
+ dbos_logger.info(
69
+ f"Applying DBOS SQLite system database schema migration {i}"
70
+ )
71
+
72
+ # SQLite only allows one statement at a time, so split by semicolon
73
+ statements = [
74
+ stmt.strip() for stmt in migration_sql.split(";") if stmt.strip()
75
+ ]
76
+ for statement in statements:
77
+ conn.execute(sa.text(statement))
78
+
79
+ # Update the single row with the new version
80
+ if last_applied == 0:
81
+ conn.execute(
82
+ sa.text(
83
+ "INSERT INTO dbos_migrations (version) VALUES (:version)"
84
+ ),
85
+ {"version": i},
86
+ )
87
+ else:
88
+ conn.execute(
89
+ sa.text("UPDATE dbos_migrations SET version = :version"),
90
+ {"version": i},
91
+ )
92
+ last_applied = i
93
+
94
+ def _cleanup_connections(self) -> None:
95
+ """Clean up SQLite-specific connections."""
96
+ # SQLite doesn't require special connection cleanup
97
+ pass
98
+
99
+ def _is_unique_constraint_violation(self, dbapi_error: DBAPIError) -> bool:
100
+ """Check if the error is a unique constraint violation in SQLite."""
101
+ # SQLite UNIQUE constraint error
102
+ return "UNIQUE constraint failed" in str(dbapi_error.orig)
103
+
104
+ def _is_foreign_key_violation(self, dbapi_error: DBAPIError) -> bool:
105
+ """Check if the error is a foreign key violation in SQLite."""
106
+ # SQLite FOREIGN KEY constraint error
107
+ return "FOREIGN KEY constraint failed" in str(dbapi_error.orig)
108
+
109
+ @staticmethod
110
+ def _reset_system_database(database_url: str) -> None:
111
+ """Reset the SQLite system database by deleting the database file."""
112
+
113
+ # Parse the SQLite database URL to get the file path
114
+ url = sa.make_url(database_url)
115
+ db_path = url.database
116
+
117
+ if db_path is None:
118
+ raise ValueError(f"System database path not found in URL {url}")
119
+
120
+ try:
121
+ if os.path.exists(db_path):
122
+ os.remove(db_path)
123
+ dbos_logger.info(f"Deleted SQLite database file: {db_path}")
124
+ else:
125
+ dbos_logger.info(f"SQLite database file does not exist: {db_path}")
126
+ except OSError as e:
127
+ dbos_logger.error(
128
+ f"Error deleting SQLite database file {db_path}: {str(e)}"
129
+ )
130
+ raise e
131
+
132
+ def _notification_listener(self) -> None:
133
+ """Poll for notifications and workflow events in SQLite."""
134
+
135
+ def split_payload(payload: str) -> Tuple[str, Optional[str]]:
136
+ """Split payload into components (first::second format)."""
137
+ if "::" in payload:
138
+ parts = payload.split("::", 1)
139
+ return parts[0], parts[1]
140
+ return payload, None
141
+
142
+ def signal_condition(condition_map: Any, payload: str) -> None:
143
+ """Signal a condition variable if it exists."""
144
+ condition = condition_map.get(payload)
145
+ if condition:
146
+ condition.acquire()
147
+ condition.notify_all()
148
+ condition.release()
149
+ dbos_logger.debug(f"Signaled condition for {payload}")
150
+
151
+ while self._run_background_processes:
152
+ try:
153
+ # Poll every second
154
+ time.sleep(1)
155
+
156
+ # Check all payloads in the notifications_map
157
+ for payload in list(self.notifications_map._dict.keys()):
158
+ dest_uuid, topic = split_payload(payload)
159
+ with self.engine.begin() as conn:
160
+ result = conn.execute(
161
+ sa.text(
162
+ "SELECT 1 FROM notifications WHERE destination_uuid = :dest_uuid AND topic = :topic LIMIT 1"
163
+ ),
164
+ {"dest_uuid": dest_uuid, "topic": topic},
165
+ )
166
+ if result.fetchone():
167
+ signal_condition(self.notifications_map, payload)
168
+
169
+ # Check all payloads in the workflow_events_map
170
+ for payload in list(self.workflow_events_map._dict.keys()):
171
+ workflow_uuid, key = split_payload(payload)
172
+ with self.engine.begin() as conn:
173
+ result = conn.execute(
174
+ sa.text(
175
+ "SELECT 1 FROM workflow_events WHERE workflow_uuid = :workflow_uuid AND key = :key LIMIT 1"
176
+ ),
177
+ {"workflow_uuid": workflow_uuid, "key": key},
178
+ )
179
+ if result.fetchone():
180
+ signal_condition(self.workflow_events_map, payload)
181
+
182
+ except Exception as e:
183
+ if self._run_background_processes:
184
+ dbos_logger.warning(f"SQLite notification poller error: {e}")
185
+ time.sleep(1)
dbos/_tracer.py CHANGED
@@ -24,10 +24,14 @@ class DBOSTracer:
24
24
  def __init__(self) -> None:
25
25
  self.app_id = os.environ.get("DBOS__APPID", None)
26
26
  self.provider: Optional[TracerProvider] = None
27
+ self.disable_otlp: bool = False
27
28
 
28
29
  def config(self, config: ConfigFile) -> None:
29
30
  self.otlp_attributes = config.get("telemetry", {}).get("otlp_attributes", {}) # type: ignore
30
- if not isinstance(trace.get_tracer_provider(), TracerProvider):
31
+ self.disable_otlp = config.get("telemetry", {}).get("disable_otlp", False) # type: ignore
32
+ if not self.disable_otlp and not isinstance(
33
+ trace.get_tracer_provider(), TracerProvider
34
+ ):
31
35
  resource = Resource(
32
36
  attributes={
33
37
  ResourceAttributes.SERVICE_NAME: config["name"],
dbos/_utils.py CHANGED
@@ -20,7 +20,9 @@ class GlobalParams:
20
20
  dbos_version = "unknown"
21
21
 
22
22
 
23
- def retriable_postgres_exception(e: DBAPIError) -> bool:
23
+ def retriable_postgres_exception(e: Exception) -> bool:
24
+ if not isinstance(e, DBAPIError):
25
+ return False
24
26
  if e.connection_invalidated:
25
27
  return True
26
28
  if isinstance(e.orig, psycopg.OperationalError):
@@ -48,3 +50,10 @@ def retriable_postgres_exception(e: DBAPIError) -> bool:
48
50
  return False
49
51
  else:
50
52
  return False
53
+
54
+
55
+ def retriable_sqlite_exception(e: Exception) -> bool:
56
+ if "database is locked" in str(e):
57
+ return True
58
+ else:
59
+ return False
dbos/cli/cli.py CHANGED
@@ -29,7 +29,7 @@ from .._dbos_config import (
29
29
  )
30
30
  from .._docker_pg_helper import start_docker_pg, stop_docker_pg
31
31
  from .._schemas.system_database import SystemSchema
32
- from .._sys_db import SystemDatabase, reset_system_database
32
+ from .._sys_db import SystemDatabase
33
33
  from .._utils import GlobalParams
34
34
  from ..cli._github_init import create_template_from_github
35
35
  from ._template_init import copy_template, get_project_name, get_templates_directory
@@ -371,22 +371,12 @@ def reset(
371
371
  typer.echo("Operation cancelled.")
372
372
  raise typer.Exit()
373
373
  try:
374
- # Make a SA url out of the user-provided URL and verify a database name is present
375
374
  database_url = _get_db_url(db_url)
376
- pg_db_url = sa.make_url(database_url)
377
- assert (
378
- pg_db_url.database is not None
379
- ), f"Database name is required in URL: {pg_db_url.render_as_string(hide_password=True)}"
380
- # Resolve system database name
381
- sysdb_name = (
382
- sys_db_name
383
- if sys_db_name
384
- else (pg_db_url.database + SystemSchema.sysdb_suffix)
375
+ system_database_url = get_system_database_url(
376
+ {"database_url": database_url, "database": {"sys_db_name": sys_db_name}}
385
377
  )
386
- reset_system_database(
387
- postgres_db_url=pg_db_url.set(database="postgres"), sysdb_name=sysdb_name
388
- )
389
- except sa.exc.SQLAlchemyError as e:
378
+ SystemDatabase.reset_system_database(system_database_url)
379
+ except Exception as e:
390
380
  typer.echo(f"Error resetting system database: {str(e)}")
391
381
  return
392
382
 
dbos/cli/migration.py CHANGED
@@ -9,7 +9,7 @@ def migrate_dbos_databases(app_database_url: str, system_database_url: str) -> N
9
9
  app_db = None
10
10
  sys_db = None
11
11
  try:
12
- sys_db = SystemDatabase(
12
+ sys_db = SystemDatabase.create(
13
13
  system_database_url=system_database_url,
14
14
  engine_kwargs={
15
15
  "pool_timeout": 30,
@@ -17,7 +17,7 @@ def migrate_dbos_databases(app_database_url: str, system_database_url: str) -> N
17
17
  "pool_size": 2,
18
18
  },
19
19
  )
20
- app_db = ApplicationDatabase(
20
+ app_db = ApplicationDatabase.create(
21
21
  database_url=app_database_url,
22
22
  engine_kwargs={
23
23
  "pool_timeout": 30,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.12.0a3
3
+ Version: 1.13.0a5
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -0,0 +1,78 @@
1
+ dbos-1.13.0a5.dist-info/METADATA,sha256=obXcr7i8Wu_nO0bUihx40pr-fopo32nU3rqFBBe3D0o,13268
2
+ dbos-1.13.0a5.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
+ dbos-1.13.0a5.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
+ dbos-1.13.0a5.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
+ dbos/__init__.py,sha256=NssPCubaBxdiKarOWa-wViz1hdJSkmBGcpLX_gQ4NeA,891
6
+ dbos/__main__.py,sha256=G7Exn-MhGrVJVDbgNlpzhfh8WMX_72t3_oJaFT9Lmt8,653
7
+ dbos/_admin_server.py,sha256=e8ELhcDWqR3_PNobnNgUvLGh5lzZq0yFSF6dvtzoQRI,16267
8
+ dbos/_alembic_migrations/env.py,sha256=38SIGVbmn_VV2x2u1aHLcPOoWgZ84eCymf3g_NljmbU,1626
9
+ dbos/_alembic_migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
10
+ dbos/_alembic_migrations/versions/01ce9f07bd10_streaming.py,sha256=5F2tCCXbjP3ZrRFVBwJdaf4FHLlWuhQkMQiYmypfSNM,1123
11
+ dbos/_alembic_migrations/versions/04ca4f231047_workflow_queues_executor_id.py,sha256=ICLPl8CN9tQXMsLDsAj8z1TsL831-Z3F8jSBvrR-wyw,736
12
+ dbos/_alembic_migrations/versions/27ac6900c6ad_add_queue_dedup.py,sha256=56w1v6TdofW3V18iwm0MP0SAeSaAUPSS40HIcn6qYIE,1072
13
+ dbos/_alembic_migrations/versions/471b60d64126_dbos_migrations.py,sha256=XHlv_RFDoO3l3hjAVHm4uH2OA67e_BjQyW1D7HQqYLc,851
14
+ dbos/_alembic_migrations/versions/50f3227f0b4b_fix_job_queue.py,sha256=ZBYrtTdxy64HxIAlOes89fVIk2P1gNaJack7wuC_epg,873
15
+ dbos/_alembic_migrations/versions/5c361fc04708_added_system_tables.py,sha256=Xr9hBDJjkAtymlauOmAy00yUHj0VVUaEz7kNwEM9IwE,6403
16
+ dbos/_alembic_migrations/versions/66478e1b95e5_consolidate_queues.py,sha256=Qo9C8pFSdN0GPM0fN-DI5GPRegXq99Mig2me04IXfLI,1894
17
+ dbos/_alembic_migrations/versions/83f3732ae8e7_workflow_timeout.py,sha256=Q_R35pb8AfVI3sg5mzKwyoPfYB88Ychcc8gwxpM9R7A,1035
18
+ dbos/_alembic_migrations/versions/933e86bdac6a_add_queue_priority.py,sha256=yZX2kGF33skpXIBdMXtDNx-Nl_orFatKeHB8c-3K8-c,773
19
+ dbos/_alembic_migrations/versions/a3b18ad34abe_added_triggers.py,sha256=Rv0ZsZYZ_WdgGEULYsPfnp4YzaO5L198gDTgYY39AVA,2022
20
+ dbos/_alembic_migrations/versions/d76646551a6b_job_queue_limiter.py,sha256=8PyFi8rd6CN-mUro43wGhsg5wcQWKZPRHD6jw8R5pVc,986
21
+ dbos/_alembic_migrations/versions/d76646551a6c_workflow_queue.py,sha256=G942nophZ2uC2vc4hGBC02Ptng1715roTjY3xiyzZU4,729
22
+ dbos/_alembic_migrations/versions/d994145b47b6_consolidate_inputs.py,sha256=_J0jP247fuo66fzOmLlKFO9FJ_CRBXlqa2lnLrcXugQ,672
23
+ dbos/_alembic_migrations/versions/eab0cc1d9a14_job_queue.py,sha256=uvhFOtqbBreCePhAxZfIT0qCAI7BiZTou9wt6QnbY7c,1412
24
+ dbos/_alembic_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py,sha256=m90Lc5YH0ZISSq1MyxND6oq3RZrZKrIqEsZtwJ1jWxA,1049
25
+ dbos/_app_db.py,sha256=e8mASnDX_tyE9DWf_yAZgIi7ZWeyVWWTrhCZK_Jy50g,16190
26
+ dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
27
+ dbos/_client.py,sha256=hSSIqWZEbGVAyRy80rS4Sywaf_biQOF17ThW3Eyaaso,18267
28
+ dbos/_conductor/conductor.py,sha256=3E_hL3c9g9yWqKZkvI6KA0-ZzPMPRo06TOzT1esMiek,24114
29
+ dbos/_conductor/protocol.py,sha256=q3rgLxINFtWFigdOONc-4gX4vn66UmMlJQD6Kj8LnL4,7420
30
+ dbos/_context.py,sha256=IMboNgbCqTxfIORqeifE3da-Ce5siMz7MYMLPk5M-AQ,26851
31
+ dbos/_core.py,sha256=2IWEkewiYL3d3MrhMfqj0JDWNyNM54rpW7CRGjBTPfk,48788
32
+ dbos/_croniter.py,sha256=XHAyUyibs_59sJQfSNWkP7rqQY6_XrlfuuCxk4jYqek,47559
33
+ dbos/_dbos.py,sha256=wKLN7W1ej6cyEOHnCtt3-awnU6SR6MQAlOvTTt5_N-E,58219
34
+ dbos/_dbos_config.py,sha256=jv-k2WyXgfoR3R0NaPxAFx5OzZYjr0rjH2npsbokGRM,22321
35
+ dbos/_debug.py,sha256=99j2SChWmCPAlZoDmjsJGe77tpU2LEa8E2TtLAnnh7o,1831
36
+ dbos/_docker_pg_helper.py,sha256=tLJXWqZ4S-ExcaPnxg_i6cVxL6ZxrYlZjaGsklY-s2I,6115
37
+ dbos/_error.py,sha256=GwO0Ng4d4iB52brY09-Ss6Cz_V28Xc0D0cRCzZ6XmNM,8688
38
+ dbos/_event_loop.py,sha256=cvaFN9-II3MsHEOq8QoICc_8qSKrjikMlLfuhC3Y8Dk,2923
39
+ dbos/_fastapi.py,sha256=D0H6TPYYTJ0LnkKn7t9sfPwPgDx6fO8AZQtvBcH3ibI,3277
40
+ dbos/_flask.py,sha256=Npnakt-a3W5OykONFRkDRnumaDhTQmA0NPdUCGRYKXE,1652
41
+ dbos/_kafka.py,sha256=Gm4fHWl7gYb-i5BMvwNwm5Km3z8zQpseqdMgqgFjlGI,4252
42
+ dbos/_kafka_message.py,sha256=NYvOXNG3Qn7bghn1pv3fg4Pbs86ILZGcK4IB-MLUNu0,409
43
+ dbos/_logger.py,sha256=vvBL4kzJWBPtfcHIuL0nJAq5cgpeo_D3IiIUDicWLOg,4732
44
+ dbos/_migration.py,sha256=wJrSTYerlkYDFYmkTqo4a7n4WaKmqXh8BdkUEzgSEQQ,10898
45
+ dbos/_outcome.py,sha256=Kz3aL7517q9UEFTx3Cq9zzztjWyWVOx_08fZyHo9dvg,7035
46
+ dbos/_queue.py,sha256=0kJTPwXy3nZ4Epzt-lHky9M9S4L31645drPGFR8fIJY,4854
47
+ dbos/_recovery.py,sha256=K-wlFhdf4yGRm6cUzyhcTjQUS0xp2T5rdNMLiiBErYg,2882
48
+ dbos/_registrations.py,sha256=bEOntObnWaBylnebr5ZpcX2hk7OVLDd1z4BvW4_y3zA,7380
49
+ dbos/_roles.py,sha256=kCuhhg8XLtrHCgKgm44I0abIRTGHltf88OwjEKAUggk,2317
50
+ dbos/_scheduler.py,sha256=CWeGVfl9h51VXfxt80y5Da_5pE8SPty_AYkfpJkkMxQ,2117
51
+ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ dbos/_schemas/application_database.py,sha256=SypAS9l9EsaBHFn9FR8jmnqt01M74d9AF1AMa4m2hhI,1040
53
+ dbos/_schemas/system_database.py,sha256=-dAKk-_Y3vzbpLT4ei-sIrBQgFyQiwPj1enZb1TYc8I,4943
54
+ dbos/_serialization.py,sha256=bWuwhXSQcGmiazvhJHA5gwhrRWxtmFmcCFQSDJnqqkU,3666
55
+ dbos/_sys_db.py,sha256=zlAJ3YPLuzN8Ju32_lfhsq3-MxnH4V45Rf6X9Imxqf0,81838
56
+ dbos/_sys_db_postgres.py,sha256=WcG-f1CUzUNBGEOjqKEp6DDraN63jTnJ6CAfieCcxOs,7555
57
+ dbos/_sys_db_sqlite.py,sha256=58Fv7paGloCmpXdWZVCEpcZFvHWLuEkw4XBKCWprGsA,7500
58
+ dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
59
+ dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
+ dbos/_templates/dbos-db-starter/__package/main.py.dbos,sha256=aQnBPSSQpkB8ERfhf7gB7P9tsU6OPKhZscfeh0yiaD8,2702
61
+ dbos/_templates/dbos-db-starter/__package/schema.py,sha256=7Z27JGC8yy7Z44cbVXIREYxtUhU4JVkLCp5Q7UahVQ0,260
62
+ dbos/_templates/dbos-db-starter/alembic.ini,sha256=VKBn4Gy8mMuCdY7Hip1jmo3wEUJ1VG1aW7EqY0_n-as,3695
63
+ dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos,sha256=0wPktElM7kMB3OPHTXw4xBk9bgGKMqOHrrr7x_R23Z8,446
64
+ dbos/_templates/dbos-db-starter/migrations/env.py.dbos,sha256=IBB_gz9RjC20HPfOTGZzS6kTbv3jXhiOrnWpbJNk1Gk,2509
65
+ dbos/_templates/dbos-db-starter/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
66
+ dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py,sha256=MpS7LGaJS0CpvsjhfDkp9EJqvMvVCjRPfUp4c0aE2ys,941
67
+ dbos/_templates/dbos-db-starter/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKse9HsWv5fynJEFJHM,1681
68
+ dbos/_tracer.py,sha256=8aOAVTBnj2q9DcOb5KJCfo56CVZ1ZvsWBscaNlIX-7k,3150
69
+ dbos/_utils.py,sha256=ZdoM1MDbHnlJrh31zfhp3iX62bAxK1kyvMwXnltC_84,1779
70
+ dbos/_workflow_commands.py,sha256=EmmAaQfRWeOZm_WPTznuU-O3he3jiSzzT9VpYrhxugE,4835
71
+ dbos/cli/_github_init.py,sha256=Y_bDF9gfO2jB1id4FV5h1oIxEJRWyqVjhb7bNEa5nQ0,3224
72
+ dbos/cli/_template_init.py,sha256=7JBcpMqP1r2mfCnvWatu33z8ctEGHJarlZYKgB83cXE,2972
73
+ dbos/cli/cli.py,sha256=basgruBuvOMIb5nrsa1cVKOOYvSx_Lqx3M51P0d6NEU,22698
74
+ dbos/cli/migration.py,sha256=5GiyagLZkyVvDz3StYxtFdkFoKFCmh6eSXjzsIGhZ_A,3330
75
+ dbos/dbos-config.schema.json,sha256=CjaspeYmOkx6Ip_pcxtmfXJTn_YGdSx_0pcPBF7KZmo,6060
76
+ dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
77
+ version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
78
+ dbos-1.13.0a5.dist-info/RECORD,,
@@ -1,74 +0,0 @@
1
- dbos-1.12.0a3.dist-info/METADATA,sha256=i85-mbUNn-cIjrb1446QIw276DRDiV9AWW36ig8KgBk,13268
2
- dbos-1.12.0a3.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
3
- dbos-1.12.0a3.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
- dbos-1.12.0a3.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
- dbos/__init__.py,sha256=NssPCubaBxdiKarOWa-wViz1hdJSkmBGcpLX_gQ4NeA,891
6
- dbos/__main__.py,sha256=G7Exn-MhGrVJVDbgNlpzhfh8WMX_72t3_oJaFT9Lmt8,653
7
- dbos/_admin_server.py,sha256=e8ELhcDWqR3_PNobnNgUvLGh5lzZq0yFSF6dvtzoQRI,16267
8
- dbos/_app_db.py,sha256=bUXQqzc0C9PHh4Zl2tHfBrQWNBURdI7F7XXjCpYirmw,10959
9
- dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
10
- dbos/_client.py,sha256=_wMe4qnRSwiRZo74xdqTBetbHlIVy3vQifdSd7os1ZY,18213
11
- dbos/_conductor/conductor.py,sha256=3E_hL3c9g9yWqKZkvI6KA0-ZzPMPRo06TOzT1esMiek,24114
12
- dbos/_conductor/protocol.py,sha256=q3rgLxINFtWFigdOONc-4gX4vn66UmMlJQD6Kj8LnL4,7420
13
- dbos/_context.py,sha256=8yZOTM1ehhk6URLa0EP9_20aOd6SZLhXBmcPwFEZDlA,26739
14
- dbos/_core.py,sha256=tKAahVW7StJ_KuW4e1fWnCSE5-2SaI7RZIMWZWcuzm8,48848
15
- dbos/_croniter.py,sha256=XHAyUyibs_59sJQfSNWkP7rqQY6_XrlfuuCxk4jYqek,47559
16
- dbos/_dbos.py,sha256=bn5S_T6HZnDipYEVqhLq_F2Zo904fjT3J5oO15Frhrs,57715
17
- dbos/_dbos_config.py,sha256=er8oF3e9zGlEG9KntX7uBSXrDuVvROtkzVidzXjOwUU,21746
18
- dbos/_debug.py,sha256=99j2SChWmCPAlZoDmjsJGe77tpU2LEa8E2TtLAnnh7o,1831
19
- dbos/_docker_pg_helper.py,sha256=tLJXWqZ4S-ExcaPnxg_i6cVxL6ZxrYlZjaGsklY-s2I,6115
20
- dbos/_error.py,sha256=GwO0Ng4d4iB52brY09-Ss6Cz_V28Xc0D0cRCzZ6XmNM,8688
21
- dbos/_event_loop.py,sha256=cvaFN9-II3MsHEOq8QoICc_8qSKrjikMlLfuhC3Y8Dk,2923
22
- dbos/_fastapi.py,sha256=cXqXAf0pM0wMM6YZPkRqHVToeRszzRasmk01HDj1aNc,3278
23
- dbos/_flask.py,sha256=Npnakt-a3W5OykONFRkDRnumaDhTQmA0NPdUCGRYKXE,1652
24
- dbos/_kafka.py,sha256=Gm4fHWl7gYb-i5BMvwNwm5Km3z8zQpseqdMgqgFjlGI,4252
25
- dbos/_kafka_message.py,sha256=NYvOXNG3Qn7bghn1pv3fg4Pbs86ILZGcK4IB-MLUNu0,409
26
- dbos/_logger.py,sha256=Dp6bHZKUtcm5gWwYHj_HA5Wj5OMuJGUrpl2g2i4xDZg,4620
27
- dbos/_migrations/env.py,sha256=38SIGVbmn_VV2x2u1aHLcPOoWgZ84eCymf3g_NljmbU,1626
28
- dbos/_migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
29
- dbos/_migrations/versions/01ce9f07bd10_streaming.py,sha256=5F2tCCXbjP3ZrRFVBwJdaf4FHLlWuhQkMQiYmypfSNM,1123
30
- dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py,sha256=ICLPl8CN9tQXMsLDsAj8z1TsL831-Z3F8jSBvrR-wyw,736
31
- dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py,sha256=56w1v6TdofW3V18iwm0MP0SAeSaAUPSS40HIcn6qYIE,1072
32
- dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py,sha256=ZBYrtTdxy64HxIAlOes89fVIk2P1gNaJack7wuC_epg,873
33
- dbos/_migrations/versions/5c361fc04708_added_system_tables.py,sha256=Xr9hBDJjkAtymlauOmAy00yUHj0VVUaEz7kNwEM9IwE,6403
34
- dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py,sha256=Qo9C8pFSdN0GPM0fN-DI5GPRegXq99Mig2me04IXfLI,1894
35
- dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py,sha256=Q_R35pb8AfVI3sg5mzKwyoPfYB88Ychcc8gwxpM9R7A,1035
36
- dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py,sha256=yZX2kGF33skpXIBdMXtDNx-Nl_orFatKeHB8c-3K8-c,773
37
- dbos/_migrations/versions/a3b18ad34abe_added_triggers.py,sha256=Rv0ZsZYZ_WdgGEULYsPfnp4YzaO5L198gDTgYY39AVA,2022
38
- dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py,sha256=8PyFi8rd6CN-mUro43wGhsg5wcQWKZPRHD6jw8R5pVc,986
39
- dbos/_migrations/versions/d76646551a6c_workflow_queue.py,sha256=G942nophZ2uC2vc4hGBC02Ptng1715roTjY3xiyzZU4,729
40
- dbos/_migrations/versions/d994145b47b6_consolidate_inputs.py,sha256=_J0jP247fuo66fzOmLlKFO9FJ_CRBXlqa2lnLrcXugQ,672
41
- dbos/_migrations/versions/eab0cc1d9a14_job_queue.py,sha256=uvhFOtqbBreCePhAxZfIT0qCAI7BiZTou9wt6QnbY7c,1412
42
- dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py,sha256=m90Lc5YH0ZISSq1MyxND6oq3RZrZKrIqEsZtwJ1jWxA,1049
43
- dbos/_outcome.py,sha256=Kz3aL7517q9UEFTx3Cq9zzztjWyWVOx_08fZyHo9dvg,7035
44
- dbos/_queue.py,sha256=0kJTPwXy3nZ4Epzt-lHky9M9S4L31645drPGFR8fIJY,4854
45
- dbos/_recovery.py,sha256=K-wlFhdf4yGRm6cUzyhcTjQUS0xp2T5rdNMLiiBErYg,2882
46
- dbos/_registrations.py,sha256=bEOntObnWaBylnebr5ZpcX2hk7OVLDd1z4BvW4_y3zA,7380
47
- dbos/_roles.py,sha256=kCuhhg8XLtrHCgKgm44I0abIRTGHltf88OwjEKAUggk,2317
48
- dbos/_scheduler.py,sha256=CWeGVfl9h51VXfxt80y5Da_5pE8SPty_AYkfpJkkMxQ,2117
49
- dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
- dbos/_schemas/application_database.py,sha256=SypAS9l9EsaBHFn9FR8jmnqt01M74d9AF1AMa4m2hhI,1040
51
- dbos/_schemas/system_database.py,sha256=-dAKk-_Y3vzbpLT4ei-sIrBQgFyQiwPj1enZb1TYc8I,4943
52
- dbos/_serialization.py,sha256=bWuwhXSQcGmiazvhJHA5gwhrRWxtmFmcCFQSDJnqqkU,3666
53
- dbos/_sys_db.py,sha256=MWSrGeCUMgctOMxJ3SViswVzC9URUMy7COdI7vRSLv8,86256
54
- dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
55
- dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
- dbos/_templates/dbos-db-starter/__package/main.py.dbos,sha256=aQnBPSSQpkB8ERfhf7gB7P9tsU6OPKhZscfeh0yiaD8,2702
57
- dbos/_templates/dbos-db-starter/__package/schema.py,sha256=7Z27JGC8yy7Z44cbVXIREYxtUhU4JVkLCp5Q7UahVQ0,260
58
- dbos/_templates/dbos-db-starter/alembic.ini,sha256=VKBn4Gy8mMuCdY7Hip1jmo3wEUJ1VG1aW7EqY0_n-as,3695
59
- dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos,sha256=0wPktElM7kMB3OPHTXw4xBk9bgGKMqOHrrr7x_R23Z8,446
60
- dbos/_templates/dbos-db-starter/migrations/env.py.dbos,sha256=IBB_gz9RjC20HPfOTGZzS6kTbv3jXhiOrnWpbJNk1Gk,2509
61
- dbos/_templates/dbos-db-starter/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
62
- dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py,sha256=MpS7LGaJS0CpvsjhfDkp9EJqvMvVCjRPfUp4c0aE2ys,941
63
- dbos/_templates/dbos-db-starter/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKse9HsWv5fynJEFJHM,1681
64
- dbos/_tracer.py,sha256=RnlcaOJEx_58hr2J9L9g6E7gjAHAeEtEGugJZmCwNfQ,2963
65
- dbos/_utils.py,sha256=uywq1QrjMwy17btjxW4bES49povlQwYwYbvKwMT6C2U,1575
66
- dbos/_workflow_commands.py,sha256=EmmAaQfRWeOZm_WPTznuU-O3he3jiSzzT9VpYrhxugE,4835
67
- dbos/cli/_github_init.py,sha256=Y_bDF9gfO2jB1id4FV5h1oIxEJRWyqVjhb7bNEa5nQ0,3224
68
- dbos/cli/_template_init.py,sha256=7JBcpMqP1r2mfCnvWatu33z8ctEGHJarlZYKgB83cXE,2972
69
- dbos/cli/cli.py,sha256=btUbl0L_1cf46W8z0Hi6nPBCLaSqY9I4c1eZCG7obow,23128
70
- dbos/cli/migration.py,sha256=eI0sc0vYq2iUP3cBHPfTa6WHCyDBr8ld9nRxEZZzFrU,3316
71
- dbos/dbos-config.schema.json,sha256=CjaspeYmOkx6Ip_pcxtmfXJTn_YGdSx_0pcPBF7KZmo,6060
72
- dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
73
- version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
74
- dbos-1.12.0a3.dist-info/RECORD,,
File without changes