dbos 0.25.0a14__py3-none-any.whl → 0.26.0a0__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.
dbos/__init__.py CHANGED
@@ -1,4 +1,5 @@
1
1
  from . import _error as error
2
+ from ._client import DBOSClient, EnqueueOptions
2
3
  from ._context import DBOSContextEnsure, DBOSContextSetAuth, SetWorkflowID
3
4
  from ._dbos import DBOS, DBOSConfiguredInstance, WorkflowHandle
4
5
  from ._dbos_config import ConfigFile, DBOSConfig, get_dbos_database_url, load_config
@@ -11,9 +12,11 @@ __all__ = [
11
12
  "ConfigFile",
12
13
  "DBOSConfig",
13
14
  "DBOS",
15
+ "DBOSClient",
14
16
  "DBOSConfiguredInstance",
15
17
  "DBOSContextEnsure",
16
18
  "DBOSContextSetAuth",
19
+ "EnqueueOptions",
17
20
  "GetWorkflowsInput",
18
21
  "KafkaMessage",
19
22
  "SetWorkflowID",
dbos/_app_db.py CHANGED
@@ -27,19 +27,18 @@ class RecordedResult(TypedDict):
27
27
 
28
28
  class ApplicationDatabase:
29
29
 
30
- def __init__(self, config: ConfigFile, *, debug_mode: bool = False):
31
- self.config = config
30
+ def __init__(self, database: DatabaseConfig, *, debug_mode: bool = False):
32
31
 
33
- app_db_name = config["database"]["app_db_name"]
32
+ app_db_name = database["app_db_name"]
34
33
 
35
34
  # If the application database does not already exist, create it
36
35
  if not debug_mode:
37
36
  postgres_db_url = sa.URL.create(
38
37
  "postgresql+psycopg",
39
- username=config["database"]["username"],
40
- password=config["database"]["password"],
41
- host=config["database"]["hostname"],
42
- port=config["database"]["port"],
38
+ username=database["username"],
39
+ password=database["password"],
40
+ host=database["hostname"],
41
+ port=database["port"],
43
42
  database="postgres",
44
43
  )
45
44
  postgres_db_engine = sa.create_engine(postgres_db_url)
@@ -55,25 +54,25 @@ class ApplicationDatabase:
55
54
  # Create a connection pool for the application database
56
55
  app_db_url = sa.URL.create(
57
56
  "postgresql+psycopg",
58
- username=config["database"]["username"],
59
- password=config["database"]["password"],
60
- host=config["database"]["hostname"],
61
- port=config["database"]["port"],
57
+ username=database["username"],
58
+ password=database["password"],
59
+ host=database["hostname"],
60
+ port=database["port"],
62
61
  database=app_db_name,
63
62
  )
64
63
 
65
64
  connect_args = {}
66
65
  if (
67
- "connectionTimeoutMillis" in config["database"]
68
- and config["database"]["connectionTimeoutMillis"]
66
+ "connectionTimeoutMillis" in database
67
+ and database["connectionTimeoutMillis"]
69
68
  ):
70
69
  connect_args["connect_timeout"] = int(
71
- config["database"]["connectionTimeoutMillis"] / 1000
70
+ database["connectionTimeoutMillis"] / 1000
72
71
  )
73
72
 
74
73
  self.engine = sa.create_engine(
75
74
  app_db_url,
76
- pool_size=config["database"]["app_db_pool_size"],
75
+ pool_size=database["app_db_pool_size"],
77
76
  max_overflow=0,
78
77
  pool_timeout=30,
79
78
  connect_args=connect_args,
dbos/_client.py ADDED
@@ -0,0 +1,206 @@
1
+ import asyncio
2
+ import sys
3
+ import uuid
4
+ from typing import Any, Generic, Optional, TypedDict, TypeVar
5
+
6
+ if sys.version_info < (3, 11):
7
+ from typing_extensions import NotRequired
8
+ else:
9
+ from typing import NotRequired
10
+
11
+ from dbos import _serialization
12
+ from dbos._dbos import WorkflowHandle, WorkflowHandleAsync
13
+ from dbos._dbos_config import parse_database_url_to_dbconfig
14
+ from dbos._error import DBOSNonExistentWorkflowError
15
+ from dbos._registrations import DEFAULT_MAX_RECOVERY_ATTEMPTS
16
+ from dbos._serialization import WorkflowInputs
17
+ from dbos._sys_db import SystemDatabase, WorkflowStatusInternal, WorkflowStatusString
18
+ from dbos._workflow_commands import WorkflowStatus, get_workflow
19
+
20
+ R = TypeVar("R", covariant=True) # A generic type for workflow return values
21
+
22
+
23
+ class EnqueueOptions(TypedDict):
24
+ workflow_name: str
25
+ workflow_class_name: NotRequired[str]
26
+ queue_name: str
27
+ app_version: NotRequired[str]
28
+ workflow_id: NotRequired[str]
29
+
30
+
31
+ class WorkflowHandleClientPolling(Generic[R]):
32
+
33
+ def __init__(self, workflow_id: str, sys_db: SystemDatabase):
34
+ self.workflow_id = workflow_id
35
+ self._sys_db = sys_db
36
+
37
+ def get_workflow_id(self) -> str:
38
+ return self.workflow_id
39
+
40
+ def get_result(self) -> R:
41
+ res: R = self._sys_db.await_workflow_result(self.workflow_id)
42
+ return res
43
+
44
+ def get_status(self) -> "WorkflowStatus":
45
+ status = get_workflow(self._sys_db, self.workflow_id, True)
46
+ if status is None:
47
+ raise DBOSNonExistentWorkflowError(self.workflow_id)
48
+ return status
49
+
50
+
51
+ class WorkflowHandleClientAsyncPolling(Generic[R]):
52
+
53
+ def __init__(self, workflow_id: str, sys_db: SystemDatabase):
54
+ self.workflow_id = workflow_id
55
+ self._sys_db = sys_db
56
+
57
+ def get_workflow_id(self) -> str:
58
+ return self.workflow_id
59
+
60
+ async def get_result(self) -> R:
61
+ res: R = await asyncio.to_thread(
62
+ self._sys_db.await_workflow_result, self.workflow_id
63
+ )
64
+ return res
65
+
66
+ async def get_status(self) -> "WorkflowStatus":
67
+ status = await asyncio.to_thread(
68
+ get_workflow, self._sys_db, self.workflow_id, True
69
+ )
70
+ if status is None:
71
+ raise DBOSNonExistentWorkflowError(self.workflow_id)
72
+ return status
73
+
74
+
75
+ class DBOSClient:
76
+ def __init__(self, database_url: str, *, system_database: Optional[str] = None):
77
+ db_config = parse_database_url_to_dbconfig(database_url)
78
+ if system_database is not None:
79
+ db_config["sys_db_name"] = system_database
80
+ self._sys_db = SystemDatabase(db_config)
81
+
82
+ def destroy(self) -> None:
83
+ self._sys_db.destroy()
84
+
85
+ def _enqueue(self, options: EnqueueOptions, *args: Any, **kwargs: Any) -> str:
86
+ workflow_name = options["workflow_name"]
87
+ queue_name = options["queue_name"]
88
+
89
+ workflow_class_name = options.get("workflow_class_name")
90
+ app_version = options.get("app_version")
91
+ max_recovery_attempts = options.get("max_recovery_attempts")
92
+ if max_recovery_attempts is None:
93
+ max_recovery_attempts = DEFAULT_MAX_RECOVERY_ATTEMPTS
94
+ workflow_id = options.get("workflow_id")
95
+ if workflow_id is None:
96
+ workflow_id = str(uuid.uuid4())
97
+
98
+ status: WorkflowStatusInternal = {
99
+ "workflow_uuid": workflow_id,
100
+ "status": WorkflowStatusString.ENQUEUED.value,
101
+ "name": workflow_name,
102
+ "class_name": workflow_class_name,
103
+ "queue_name": queue_name,
104
+ "app_version": app_version,
105
+ "config_name": None,
106
+ "authenticated_user": None,
107
+ "assumed_role": None,
108
+ "authenticated_roles": None,
109
+ "request": None,
110
+ "output": None,
111
+ "error": None,
112
+ "created_at": None,
113
+ "updated_at": None,
114
+ "executor_id": None,
115
+ "recovery_attempts": None,
116
+ "app_id": None,
117
+ }
118
+
119
+ inputs: WorkflowInputs = {
120
+ "args": args,
121
+ "kwargs": kwargs,
122
+ }
123
+
124
+ wf_status = self._sys_db.insert_workflow_status(status)
125
+ self._sys_db.update_workflow_inputs(
126
+ workflow_id, _serialization.serialize_args(inputs)
127
+ )
128
+ if wf_status == WorkflowStatusString.ENQUEUED.value:
129
+ self._sys_db.enqueue(workflow_id, queue_name)
130
+ return workflow_id
131
+
132
+ def enqueue(
133
+ self, options: EnqueueOptions, *args: Any, **kwargs: Any
134
+ ) -> WorkflowHandle[R]:
135
+ workflow_id = self._enqueue(options, *args, **kwargs)
136
+ return WorkflowHandleClientPolling[R](workflow_id, self._sys_db)
137
+
138
+ async def enqueue_async(
139
+ self, options: EnqueueOptions, *args: Any, **kwargs: Any
140
+ ) -> WorkflowHandleAsync[R]:
141
+ workflow_id = await asyncio.to_thread(self._enqueue, options, *args, **kwargs)
142
+ return WorkflowHandleClientAsyncPolling[R](workflow_id, self._sys_db)
143
+
144
+ def retrieve_workflow(self, workflow_id: str) -> WorkflowHandle[R]:
145
+ status = get_workflow(self._sys_db, workflow_id, True)
146
+ if status is None:
147
+ raise DBOSNonExistentWorkflowError(workflow_id)
148
+ return WorkflowHandleClientPolling[R](workflow_id, self._sys_db)
149
+
150
+ async def retrieve_workflow_async(self, workflow_id: str) -> WorkflowHandleAsync[R]:
151
+ status = asyncio.to_thread(get_workflow, self._sys_db, workflow_id, True)
152
+ if status is None:
153
+ raise DBOSNonExistentWorkflowError(workflow_id)
154
+ return WorkflowHandleClientAsyncPolling[R](workflow_id, self._sys_db)
155
+
156
+ def send(
157
+ self,
158
+ destination_id: str,
159
+ message: Any,
160
+ topic: Optional[str] = None,
161
+ idempotency_key: Optional[str] = None,
162
+ ) -> None:
163
+ idempotency_key = idempotency_key if idempotency_key else str(uuid.uuid4())
164
+ status: WorkflowStatusInternal = {
165
+ "workflow_uuid": f"{destination_id}-{idempotency_key}",
166
+ "status": WorkflowStatusString.SUCCESS.value,
167
+ "name": "temp_workflow-send-client",
168
+ "class_name": None,
169
+ "queue_name": None,
170
+ "config_name": None,
171
+ "authenticated_user": None,
172
+ "assumed_role": None,
173
+ "authenticated_roles": None,
174
+ "request": None,
175
+ "output": None,
176
+ "error": None,
177
+ "created_at": None,
178
+ "updated_at": None,
179
+ "executor_id": None,
180
+ "recovery_attempts": None,
181
+ "app_id": None,
182
+ "app_version": None,
183
+ }
184
+ self._sys_db.insert_workflow_status(status)
185
+ self._sys_db.send(status["workflow_uuid"], 0, destination_id, message, topic)
186
+
187
+ async def send_async(
188
+ self,
189
+ destination_id: str,
190
+ message: Any,
191
+ topic: Optional[str] = None,
192
+ idempotency_key: Optional[str] = None,
193
+ ) -> None:
194
+ return await asyncio.to_thread(
195
+ self.send, destination_id, message, topic, idempotency_key
196
+ )
197
+
198
+ def get_event(self, workflow_id: str, key: str, timeout_seconds: float = 60) -> Any:
199
+ return self._sys_db.get_event(workflow_id, key, timeout_seconds)
200
+
201
+ async def get_event_async(
202
+ self, workflow_id: str, key: str, timeout_seconds: float = 60
203
+ ) -> Any:
204
+ return await asyncio.to_thread(
205
+ self.get_event, workflow_id, key, timeout_seconds
206
+ )
dbos/_dbos.py CHANGED
@@ -445,8 +445,12 @@ class DBOS:
445
445
  dbos_logger.info(f"Executor ID: {GlobalParams.executor_id}")
446
446
  dbos_logger.info(f"Application version: {GlobalParams.app_version}")
447
447
  self._executor_field = ThreadPoolExecutor(max_workers=64)
448
- self._sys_db_field = SystemDatabase(self.config, debug_mode=debug_mode)
449
- self._app_db_field = ApplicationDatabase(self.config, debug_mode=debug_mode)
448
+ self._sys_db_field = SystemDatabase(
449
+ self.config["database"], debug_mode=debug_mode
450
+ )
451
+ self._app_db_field = ApplicationDatabase(
452
+ self.config["database"], debug_mode=debug_mode
453
+ )
450
454
 
451
455
  if debug_mode:
452
456
  return
dbos/_logger.py CHANGED
@@ -7,6 +7,7 @@ from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
7
7
  from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
8
8
  from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
9
9
  from opentelemetry.sdk.resources import Resource
10
+ from opentelemetry.trace.span import format_trace_id
10
11
 
11
12
  from dbos._utils import GlobalParams
12
13
 
@@ -26,6 +27,19 @@ class DBOSLogTransformer(logging.Filter):
26
27
  record.applicationID = self.app_id
27
28
  record.applicationVersion = GlobalParams.app_version
28
29
  record.executorID = GlobalParams.executor_id
30
+
31
+ # If available, decorate the log entry with Workflow ID and Trace ID
32
+ from dbos._context import get_local_dbos_context
33
+
34
+ ctx = get_local_dbos_context()
35
+ if ctx:
36
+ if ctx.is_within_workflow():
37
+ record.operationUUID = ctx.workflow_id
38
+ span = ctx.get_current_span()
39
+ if span:
40
+ trace_id = format_trace_id(span.get_span_context().trace_id)
41
+ record.traceId = trace_id
42
+
29
43
  return True
30
44
 
31
45
 
dbos/_queue.py CHANGED
@@ -85,7 +85,7 @@ def queue_thread(stop_event: threading.Event, dbos: "DBOS") -> None:
85
85
  for _, queue in dbos._registry.queue_info_map.items():
86
86
  try:
87
87
  wf_ids = dbos._sys_db.start_queued_workflows(
88
- queue, GlobalParams.executor_id
88
+ queue, GlobalParams.executor_id, GlobalParams.app_version
89
89
  )
90
90
  for id in wf_ids:
91
91
  execute_workflow_by_id(dbos, id)
dbos/_sys_db.py CHANGED
@@ -29,7 +29,7 @@ from dbos._utils import GlobalParams
29
29
 
30
30
  from . import _serialization
31
31
  from ._context import get_local_dbos_context
32
- from ._dbos_config import ConfigFile
32
+ from ._dbos_config import ConfigFile, DatabaseConfig
33
33
  from ._error import (
34
34
  DBOSConflictingWorkflowError,
35
35
  DBOSDeadLetterQueueError,
@@ -170,23 +170,21 @@ _dbos_null_topic = "__null__topic__"
170
170
 
171
171
  class SystemDatabase:
172
172
 
173
- def __init__(self, config: ConfigFile, *, debug_mode: bool = False):
174
- self.config = config
175
-
173
+ def __init__(self, database: DatabaseConfig, *, debug_mode: bool = False):
176
174
  sysdb_name = (
177
- config["database"]["sys_db_name"]
178
- if "sys_db_name" in config["database"] and config["database"]["sys_db_name"]
179
- else config["database"]["app_db_name"] + SystemSchema.sysdb_suffix
175
+ database["sys_db_name"]
176
+ if "sys_db_name" in database and database["sys_db_name"]
177
+ else database["app_db_name"] + SystemSchema.sysdb_suffix
180
178
  )
181
179
 
182
180
  if not debug_mode:
183
181
  # If the system database does not already exist, create it
184
182
  postgres_db_url = sa.URL.create(
185
183
  "postgresql+psycopg",
186
- username=config["database"]["username"],
187
- password=config["database"]["password"],
188
- host=config["database"]["hostname"],
189
- port=config["database"]["port"],
184
+ username=database["username"],
185
+ password=database["password"],
186
+ host=database["hostname"],
187
+ port=database["port"],
190
188
  database="postgres",
191
189
  # fills the "application_name" column in pg_stat_activity
192
190
  query={"application_name": f"dbos_transact_{GlobalParams.executor_id}"},
@@ -203,19 +201,23 @@ class SystemDatabase:
203
201
 
204
202
  system_db_url = sa.URL.create(
205
203
  "postgresql+psycopg",
206
- username=config["database"]["username"],
207
- password=config["database"]["password"],
208
- host=config["database"]["hostname"],
209
- port=config["database"]["port"],
204
+ username=database["username"],
205
+ password=database["password"],
206
+ host=database["hostname"],
207
+ port=database["port"],
210
208
  database=sysdb_name,
211
209
  # fills the "application_name" column in pg_stat_activity
212
210
  query={"application_name": f"dbos_transact_{GlobalParams.executor_id}"},
213
211
  )
214
212
 
215
213
  # Create a connection pool for the system database
214
+ pool_size = database.get("sys_db_pool_size")
215
+ if pool_size is None:
216
+ pool_size = 20
217
+
216
218
  self.engine = sa.create_engine(
217
219
  system_db_url,
218
- pool_size=config["database"]["sys_db_pool_size"],
220
+ pool_size=pool_size,
219
221
  max_overflow=0,
220
222
  pool_timeout=30,
221
223
  connect_args={"connect_timeout": 10},
@@ -1264,7 +1266,9 @@ class SystemDatabase:
1264
1266
  .on_conflict_do_nothing()
1265
1267
  )
1266
1268
 
1267
- def start_queued_workflows(self, queue: "Queue", executor_id: str) -> List[str]:
1269
+ def start_queued_workflows(
1270
+ self, queue: "Queue", executor_id: str, app_version: str
1271
+ ) -> List[str]:
1268
1272
  if self._debug_mode:
1269
1273
  return []
1270
1274
 
@@ -1379,26 +1383,36 @@ class SystemDatabase:
1379
1383
  break
1380
1384
 
1381
1385
  # To start a function, first set its status to PENDING and update its executor ID
1382
- c.execute(
1386
+ res = c.execute(
1383
1387
  SystemSchema.workflow_status.update()
1384
1388
  .where(SystemSchema.workflow_status.c.workflow_uuid == id)
1385
1389
  .where(
1386
1390
  SystemSchema.workflow_status.c.status
1387
1391
  == WorkflowStatusString.ENQUEUED.value
1388
1392
  )
1393
+ .where(
1394
+ sa.or_(
1395
+ SystemSchema.workflow_status.c.application_version
1396
+ == app_version,
1397
+ SystemSchema.workflow_status.c.application_version.is_(
1398
+ None
1399
+ ),
1400
+ )
1401
+ )
1389
1402
  .values(
1390
1403
  status=WorkflowStatusString.PENDING.value,
1404
+ application_version=app_version,
1391
1405
  executor_id=executor_id,
1392
1406
  )
1393
1407
  )
1394
-
1395
- # Then give it a start time and assign the executor ID
1396
- c.execute(
1397
- SystemSchema.workflow_queue.update()
1398
- .where(SystemSchema.workflow_queue.c.workflow_uuid == id)
1399
- .values(started_at_epoch_ms=start_time_ms)
1400
- )
1401
- ret_ids.append(id)
1408
+ if res.rowcount > 0:
1409
+ # Then give it a start time and assign the executor ID
1410
+ c.execute(
1411
+ SystemSchema.workflow_queue.update()
1412
+ .where(SystemSchema.workflow_queue.c.workflow_uuid == id)
1413
+ .values(started_at_epoch_ms=start_time_ms)
1414
+ )
1415
+ ret_ids.append(id)
1402
1416
 
1403
1417
  # If we have a limiter, garbage-collect all completed functions started
1404
1418
  # before the period. If there's no limiter, there's no need--they were
dbos/cli/cli.py CHANGED
@@ -189,8 +189,8 @@ def migrate() -> None:
189
189
  app_db = None
190
190
  sys_db = None
191
191
  try:
192
- sys_db = SystemDatabase(config)
193
- app_db = ApplicationDatabase(config)
192
+ sys_db = SystemDatabase(config["database"])
193
+ app_db = ApplicationDatabase(config["database"])
194
194
  except Exception as e:
195
195
  typer.echo(f"DBOS system schema migration failed: {e}")
196
196
  finally:
@@ -314,7 +314,7 @@ def list(
314
314
  ] = False,
315
315
  ) -> None:
316
316
  config = load_config(silent=True)
317
- sys_db = SystemDatabase(config)
317
+ sys_db = SystemDatabase(config["database"])
318
318
  workflows = list_workflows(
319
319
  sys_db,
320
320
  limit=limit,
@@ -338,7 +338,7 @@ def get(
338
338
  ] = False,
339
339
  ) -> None:
340
340
  config = load_config(silent=True)
341
- sys_db = SystemDatabase(config)
341
+ sys_db = SystemDatabase(config["database"])
342
342
  print(
343
343
  jsonpickle.encode(get_workflow(sys_db, workflow_id, request), unpicklable=False)
344
344
  )
@@ -349,7 +349,7 @@ def steps(
349
349
  workflow_id: Annotated[str, typer.Argument()],
350
350
  ) -> None:
351
351
  config = load_config(silent=True)
352
- sys_db = SystemDatabase(config)
352
+ sys_db = SystemDatabase(config["database"])
353
353
  print(
354
354
  jsonpickle.encode(list_workflow_steps(sys_db, workflow_id), unpicklable=False)
355
355
  )
@@ -475,7 +475,7 @@ def list_queue(
475
475
  ] = False,
476
476
  ) -> None:
477
477
  config = load_config(silent=True)
478
- sys_db = SystemDatabase(config)
478
+ sys_db = SystemDatabase(config["database"])
479
479
  workflows = list_queued_workflows(
480
480
  sys_db=sys_db,
481
481
  limit=limit,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 0.25.0a14
3
+ Version: 0.26.0a0
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -1,12 +1,13 @@
1
- dbos-0.25.0a14.dist-info/METADATA,sha256=47yo_N6VbWT0oM9z9vavQ9nIVGLzzerDaIJXqeAyI_Q,5554
2
- dbos-0.25.0a14.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
- dbos-0.25.0a14.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
- dbos-0.25.0a14.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
- dbos/__init__.py,sha256=2Ur8QyNElSVn7CeL9Ovek2Zsye8A_ZCyjb9djF-N4A4,785
1
+ dbos-0.26.0a0.dist-info/METADATA,sha256=duid-oSnv_Stb3_Cb8EpTRZujzf6HfLkVSaCNKLHH_s,5553
2
+ dbos-0.26.0a0.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
+ dbos-0.26.0a0.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
4
+ dbos-0.26.0a0.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
+ dbos/__init__.py,sha256=3NQfGlBiiUSM_v88STdVP3rNZvGkUL_9WbSotKb8Voo,873
6
6
  dbos/__main__.py,sha256=G7Exn-MhGrVJVDbgNlpzhfh8WMX_72t3_oJaFT9Lmt8,653
7
7
  dbos/_admin_server.py,sha256=FLUacm9WGIPjB5s3QhdpMCilc8JHJOF0KMNStF82qs0,6625
8
- dbos/_app_db.py,sha256=4EGrYL14rVx96TXn34hoibN9ltf4-2DKcj6nd-HvBxA,6262
8
+ dbos/_app_db.py,sha256=R3sbh--84A4i-dTz8IXYmxO4b4s5VSwiPQvi_le52mg,6109
9
9
  dbos/_classproperty.py,sha256=f0X-_BySzn3yFDRKB2JpCbLYQ9tLwt1XftfshvY7CBs,626
10
+ dbos/_client.py,sha256=XKjR0a3JA9Xfo9VJx48EcdyiVDaA10FvI7Y_I1v27Ng,7384
10
11
  dbos/_cloudutils/authentication.py,sha256=V0fCWQN9stCkhbuuxgPTGpvuQcDqfU3KAxPAh01vKW4,5007
11
12
  dbos/_cloudutils/cloudutils.py,sha256=YC7jGsIopT0KveLsqbRpQk2KlRBk-nIRC_UCgep4f3o,7797
12
13
  dbos/_cloudutils/databases.py,sha256=_shqaqSvhY4n2ScgQ8IP5PDZvzvcx3YBKV8fj-cxhSY,8543
@@ -16,7 +17,7 @@ dbos/_context.py,sha256=3He4w46OTFbR7h8U1MLcdaU10wNyIPBSRqzLkdggv7U,19368
16
17
  dbos/_core.py,sha256=kIj_4wlIff8ptlACJKXAPSNoyJIt2h44swjMKxfwv0k,45789
17
18
  dbos/_croniter.py,sha256=XHAyUyibs_59sJQfSNWkP7rqQY6_XrlfuuCxk4jYqek,47559
18
19
  dbos/_db_wizard.py,sha256=VnMa6OL87Lc-XPDD1RnXp8NjsJE8YgiQLj3wtWAXp-8,8252
19
- dbos/_dbos.py,sha256=IZ3Qj8UBUqYYJiG6HVz35A0GQnQyI1Po_-E6DDvWlQg,45147
20
+ dbos/_dbos.py,sha256=AKfB61vvz5shPoEpKxqrqoiDemintKMqyBxhESRRJE8,45231
20
21
  dbos/_dbos_config.py,sha256=7Qm3FARP3lTKZS0gSxDHLbpaDCT30GzfyERxfCde4bc,21566
21
22
  dbos/_debug.py,sha256=mmgvLkqlrljMBBow9wk01PPur9kUf2rI_11dTJXY4gw,1822
22
23
  dbos/_error.py,sha256=B6Y9XLS1f6yrawxB2uAEYFMxFwk9BHhdxPNddKco-Fw,5399
@@ -24,7 +25,7 @@ dbos/_fastapi.py,sha256=PhaKftbApHnjtYEOw0EYna_3K0cmz__J9of7mRJWzu4,3704
24
25
  dbos/_flask.py,sha256=DZKUZR5-xOzPI7tYZ53r2PvvHVoAb8SYwLzMVFsVfjI,2608
25
26
  dbos/_kafka.py,sha256=o6DbwnsYRDtvVTZVsN7BAK8cdP79AfoWX3Q7CGY2Yuo,4199
26
27
  dbos/_kafka_message.py,sha256=NYvOXNG3Qn7bghn1pv3fg4Pbs86ILZGcK4IB-MLUNu0,409
27
- dbos/_logger.py,sha256=pSP-CyzHUR6ypousTaeKe2zYMKSqvrbsFru8HJpBHsA,3546
28
+ dbos/_logger.py,sha256=qv2srteCF2rSRjCK1VGOck3ieIkwUe9Lvbv60mJc16E,4069
28
29
  dbos/_migrations/env.py,sha256=38SIGVbmn_VV2x2u1aHLcPOoWgZ84eCymf3g_NljmbU,1626
29
30
  dbos/_migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
30
31
  dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py,sha256=ICLPl8CN9tQXMsLDsAj8z1TsL831-Z3F8jSBvrR-wyw,736
@@ -36,7 +37,7 @@ dbos/_migrations/versions/d76646551a6c_workflow_queue.py,sha256=G942nophZ2uC2vc4
36
37
  dbos/_migrations/versions/eab0cc1d9a14_job_queue.py,sha256=uvhFOtqbBreCePhAxZfIT0qCAI7BiZTou9wt6QnbY7c,1412
37
38
  dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py,sha256=m90Lc5YH0ZISSq1MyxND6oq3RZrZKrIqEsZtwJ1jWxA,1049
38
39
  dbos/_outcome.py,sha256=EXxBg4jXCVJsByDQ1VOCIedmbeq_03S6d-p1vqQrLFU,6810
39
- dbos/_queue.py,sha256=yYwKCjxCSFjtD63vpnRQmb835BZAe9UATgWjMW6dcnY,3341
40
+ dbos/_queue.py,sha256=HqeybpS7kujs9laM-n0j7LWcJdwMl9okqm2hNSrUab8,3367
40
41
  dbos/_recovery.py,sha256=4KyZb0XJEUGH7ekYT1kpx38i6y5vygPeH75Ta7RZjYo,2596
41
42
  dbos/_registrations.py,sha256=_zy6k944Ll8QwqU12Kr3OP23ukVtm8axPNN1TS_kJRc,6717
42
43
  dbos/_request.py,sha256=cX1B3Atlh160phgS35gF1VEEV4pD126c9F3BDgBmxZU,929
@@ -46,7 +47,7 @@ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
47
  dbos/_schemas/application_database.py,sha256=KeyoPrF7hy_ODXV7QNike_VFSD74QBRfQ76D7QyE9HI,966
47
48
  dbos/_schemas/system_database.py,sha256=W9eSpL7SZzQkxcEZ4W07BOcwkkDr35b9oCjUOgfHWek,5336
48
49
  dbos/_serialization.py,sha256=YCYv0qKAwAZ1djZisBC7khvKqG-5OcIv9t9EC5PFIog,1743
49
- dbos/_sys_db.py,sha256=33euvXfpbpVaCpR0Sx5eQ4yBt1gRKGdvfGQUugqoJBY,62320
50
+ dbos/_sys_db.py,sha256=fEkJbIzavLX-7K_TFnJe8ST58cpWShpBIarhEVXu6Po,62816
50
51
  dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
51
52
  dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
53
  dbos/_templates/dbos-db-starter/__package/main.py,sha256=nJMN3ZD2lmwg4Dcgmiwqc-tQGuCJuJal2Xl85iA277U,2453
@@ -62,8 +63,8 @@ dbos/_utils.py,sha256=wjOJzxN66IzL9p4dwcEmQACRQah_V09G6mJI2exQfOM,155
62
63
  dbos/_workflow_commands.py,sha256=SYp2khc9RSf6tjllG9CqT1zjBQnFTFq33ePXpvmRwME,5892
63
64
  dbos/cli/_github_init.py,sha256=Y_bDF9gfO2jB1id4FV5h1oIxEJRWyqVjhb7bNEa5nQ0,3224
64
65
  dbos/cli/_template_init.py,sha256=-WW3kbq0W_Tq4WbMqb1UGJG3xvJb3woEY5VspG95Srk,2857
65
- dbos/cli/cli.py,sha256=ut47q-R6A423je0zvBTEgwdxENagaKKoyIvyTeACFIU,15977
66
+ dbos/cli/cli.py,sha256=G55sZJxfmvUGvWr0hoIWwVZBy-fJdpCsTsZmuHT1CjA,16049
66
67
  dbos/dbos-config.schema.json,sha256=HtF_njVTGHLdzBGZ4OrGQz3qbPPT0Go-iwd1PgFVTNg,5847
67
68
  dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
68
69
  version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
69
- dbos-0.25.0a14.dist-info/RECORD,,
70
+ dbos-0.26.0a0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: pdm-backend (2.4.3)
2
+ Generator: pdm-backend (2.4.4)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any