dbos 0.5.0a7__py3-none-any.whl → 0.5.0a12__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.

dbos/admin_sever.py CHANGED
@@ -28,11 +28,11 @@ class AdminServer:
28
28
  self.server_thread = threading.Thread(target=self.server.serve_forever)
29
29
  self.server_thread.daemon = True
30
30
 
31
- dbos_logger.info("Starting DBOS admin server on port %d", self.port)
31
+ dbos_logger.debug("Starting DBOS admin server on port %d", self.port)
32
32
  self.server_thread.start()
33
33
 
34
34
  def stop(self) -> None:
35
- dbos_logger.info("Stopping DBOS admin server")
35
+ dbos_logger.debug("Stopping DBOS admin server")
36
36
  self.server.shutdown()
37
37
  self.server.server_close()
38
38
  self.server_thread.join()
dbos/cli.py CHANGED
@@ -119,7 +119,7 @@ def copy_template_dir(src_dir: str, dst_dir: str, ctx: dict[str, str]) -> None:
119
119
  shutil.copy(src, dst)
120
120
 
121
121
 
122
- def copy_template(src_dir: str, project_name: str) -> None:
122
+ def copy_template(src_dir: str, project_name: str, config_mode: bool) -> None:
123
123
 
124
124
  dst_dir = path.abspath(".")
125
125
 
@@ -131,10 +131,17 @@ def copy_template(src_dir: str, project_name: str) -> None:
131
131
  "db_name": db_name,
132
132
  }
133
133
 
134
- copy_template_dir(src_dir, dst_dir, ctx)
135
- copy_template_dir(
136
- path.join(src_dir, "__package"), path.join(dst_dir, package_name), ctx
137
- )
134
+ if config_mode:
135
+ copy_dbos_template(
136
+ os.path.join(src_dir, "dbos-config.yaml.dbos"),
137
+ os.path.join(dst_dir, "dbos-config.yaml"),
138
+ ctx,
139
+ )
140
+ else:
141
+ copy_template_dir(src_dir, dst_dir, ctx)
142
+ copy_template_dir(
143
+ path.join(src_dir, "__package"), path.join(dst_dir, package_name), ctx
144
+ )
138
145
 
139
146
 
140
147
  def get_project_name() -> typing.Union[str, None]:
@@ -173,6 +180,10 @@ def init(
173
180
  typing.Optional[str],
174
181
  typer.Option("--template", "-t", help="Specify template to use"),
175
182
  ] = None,
183
+ config: Annotated[
184
+ bool,
185
+ typer.Option("--config", "-c", help="Only add dbos-config.yaml"),
186
+ ] = False,
176
187
  ) -> None:
177
188
  try:
178
189
  if project_name is None:
@@ -199,7 +210,9 @@ def init(
199
210
  if template not in templates:
200
211
  raise Exception(f"template {template} not found in {templates_dir}")
201
212
 
202
- copy_template(path.join(templates_dir, template), project_name)
213
+ copy_template(
214
+ path.join(templates_dir, template), project_name, config_mode=config
215
+ )
203
216
  except Exception as e:
204
217
  print(f"[red]{e}[/red]")
205
218
 
dbos/context.py CHANGED
@@ -8,13 +8,10 @@ from types import TracebackType
8
8
  from typing import TYPE_CHECKING, List, Literal, Optional, Type, TypedDict
9
9
 
10
10
  from opentelemetry.trace import Span, Status, StatusCode
11
-
12
- if TYPE_CHECKING:
13
- from .fastapi import Request
14
-
15
11
  from sqlalchemy.orm import Session
16
12
 
17
13
  from .logger import dbos_logger
14
+ from .request import Request
18
15
  from .tracer import dbos_tracer
19
16
 
20
17
 
dbos/dbos.py CHANGED
@@ -52,7 +52,7 @@ from .tracer import dbos_tracer
52
52
 
53
53
  if TYPE_CHECKING:
54
54
  from fastapi import FastAPI
55
- from .fastapi import Request
55
+ from .request import Request
56
56
 
57
57
  from sqlalchemy.orm import Session
58
58
 
@@ -202,8 +202,9 @@ class DBOS:
202
202
 
203
203
  def __new__(
204
204
  cls: Type[DBOS],
205
- fastapi: Optional["FastAPI"] = None,
205
+ *,
206
206
  config: Optional[ConfigFile] = None,
207
+ fastapi: Optional["FastAPI"] = None,
207
208
  ) -> DBOS:
208
209
  global _dbos_global_instance
209
210
  global _dbos_global_registry
@@ -239,8 +240,9 @@ class DBOS:
239
240
 
240
241
  def __init__(
241
242
  self,
242
- fastapi: Optional["FastAPI"] = None,
243
+ *,
243
244
  config: Optional[ConfigFile] = None,
245
+ fastapi: Optional["FastAPI"] = None,
244
246
  ) -> None:
245
247
  if hasattr(self, "_initialized") and self._initialized:
246
248
  return
@@ -267,7 +269,8 @@ class DBOS:
267
269
  from dbos.fastapi import setup_fastapi_middleware
268
270
 
269
271
  setup_fastapi_middleware(self.fastapi)
270
- self.fastapi.on_event("startup")(self.launch)
272
+ self.fastapi.on_event("startup")(self._launch)
273
+ self.fastapi.on_event("shutdown")(self._destroy)
271
274
 
272
275
  # Register send_stub as a workflow
273
276
  def send_temp_workflow(
@@ -313,7 +316,12 @@ class DBOS:
313
316
  rv: AdminServer = self._admin_server
314
317
  return rv
315
318
 
316
- def launch(self) -> None:
319
+ @classmethod
320
+ def launch(cls) -> None:
321
+ if _dbos_global_instance is not None:
322
+ _dbos_global_instance._launch()
323
+
324
+ def _launch(self) -> None:
317
325
  if self._launched:
318
326
  dbos_logger.warning(f"DBOS was already launched")
319
327
  return
@@ -651,7 +659,7 @@ class DBOS:
651
659
 
652
660
  @classproperty
653
661
  def request(cls) -> Optional["Request"]:
654
- """Return the FastAPI `Request`, if any, associated with the current context."""
662
+ """Return the HTTP `Request`, if any, associated with the current context."""
655
663
  ctx = assert_current_dbos_context()
656
664
  return ctx.request
657
665
 
dbos/fastapi.py CHANGED
@@ -11,6 +11,7 @@ from .context import (
11
11
  TracedAttributes,
12
12
  assert_current_dbos_context,
13
13
  )
14
+ from .request import Address, Request
14
15
 
15
16
  request_id_header = "x-request-id"
16
17
 
@@ -23,31 +24,17 @@ def get_or_generate_request_id(request: FastAPIRequest) -> str:
23
24
  return str(uuid.uuid4())
24
25
 
25
26
 
26
- class Request:
27
- """
28
- Serializable subset of the FastAPI Request object.
29
-
30
- Attributes:
31
- base_url(URL): Base of URL requested, as in application code
32
- client(Address): HTTP Client
33
- cookies(Dict[str, str]): HTTP Cookies
34
- headers(Headers): HTTP headers
35
- method(str): HTTP verb
36
- path_params(Dict[str,Any]): Parameters extracted from URL path sections
37
- query_params(QueryParams): URL query string parameters
38
- url(URL): Full URL accessed
39
-
40
- """
41
-
42
- def __init__(self, req: FastAPIRequest):
43
- self.headers = req.headers
44
- self.path_params = req.path_params
45
- self.query_params = req.query_params
46
- self.url = req.url
47
- self.base_url = req.base_url
48
- self.client = req.client
49
- self.cookies = req.cookies
50
- self.method = req.method
27
+ def make_request(request: FastAPIRequest) -> Request:
28
+ return Request(
29
+ headers=request.headers,
30
+ path_params=request.path_params,
31
+ query_params=request.query_params,
32
+ url=str(request.url),
33
+ base_url=str(request.base_url),
34
+ client=Address(*request.client) if request.client is not None else None,
35
+ cookies=request.cookies,
36
+ method=request.method,
37
+ )
51
38
 
52
39
 
53
40
  def setup_fastapi_middleware(app: FastAPI) -> None:
@@ -65,7 +52,7 @@ def setup_fastapi_middleware(app: FastAPI) -> None:
65
52
  }
66
53
  with EnterDBOSHandler(attributes):
67
54
  ctx = assert_current_dbos_context()
68
- ctx.request = Request(request)
55
+ ctx.request = make_request(request)
69
56
  workflow_id = request.headers.get("dbos-idempotency-key", "")
70
57
  with SetWorkflowID(workflow_id):
71
58
  response = await call_next(request)
dbos/request.py ADDED
@@ -0,0 +1,32 @@
1
+ from dataclasses import dataclass
2
+ from typing import Any, Mapping, NamedTuple, Optional
3
+
4
+
5
+ class Address(NamedTuple):
6
+ hostname: str
7
+ port: int
8
+
9
+
10
+ @dataclass
11
+ class Request:
12
+ """
13
+ Serializable HTTP Request object.
14
+ Attributes:
15
+ base_url(str): Base of URL requested, as in application code
16
+ client(Optional[Address]): HTTP Client
17
+ cookies(Mapping[str, str]): HTTP Cookies
18
+ headers(Mapping[str, str]): HTTP headers
19
+ method(str): HTTP verb
20
+ path_params(Mapping[str, Any]): Parameters extracted from URL path sections
21
+ query_params(Mapping[str, str]): URL query string parameters
22
+ url(str): Full URL accessed
23
+ """
24
+
25
+ headers: Mapping[str, str]
26
+ path_params: Mapping[str, Any]
27
+ query_params: Mapping[str, str]
28
+ url: str
29
+ base_url: str
30
+ client: Optional[Address]
31
+ cookies: Mapping[str, str]
32
+ method: str
dbos/system_database.py CHANGED
@@ -230,7 +230,7 @@ class SystemDatabase:
230
230
  def wait_for_buffer_flush(self) -> None:
231
231
  # Wait until the buffers are flushed.
232
232
  while self._is_flushing_status_buffer or not self._is_buffers_empty:
233
- dbos_logger.info("Waiting for system buffers to be exported")
233
+ dbos_logger.debug("Waiting for system buffers to be exported")
234
234
  time.sleep(1)
235
235
 
236
236
  def update_workflow_status(
@@ -15,7 +15,7 @@ from dbos import DBOS
15
15
  from .schema import dbos_hello
16
16
 
17
17
  app = FastAPI()
18
- DBOS(app)
18
+ DBOS(fastapi=app)
19
19
 
20
20
  # Next, let's write a function that greets visitors.
21
21
  # To make it more interesting, we'll keep track of how
@@ -0,0 +1,130 @@
1
+ Metadata-Version: 2.1
2
+ Name: dbos
3
+ Version: 0.5.0a12
4
+ Summary: Ultra-lightweight durable execution in Python
5
+ Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
+ License: MIT
7
+ Requires-Python: >=3.9
8
+ Requires-Dist: pyyaml>=6.0.2
9
+ Requires-Dist: jsonschema>=4.23.0
10
+ Requires-Dist: alembic>=1.13.2
11
+ Requires-Dist: psycopg2-binary>=2.9.9
12
+ Requires-Dist: typing-extensions>=4.12.2; python_version < "3.10"
13
+ Requires-Dist: typer>=0.12.3
14
+ Requires-Dist: jsonpickle>=3.2.2
15
+ Requires-Dist: opentelemetry-api>=1.26.0
16
+ Requires-Dist: opentelemetry-sdk>=1.26.0
17
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.26.0
18
+ Requires-Dist: python-dateutil>=2.9.0.post0
19
+ Requires-Dist: fastapi[standard]>=0.112.1
20
+ Requires-Dist: psutil>=6.0.0
21
+ Requires-Dist: tomlkit>=0.13.2
22
+ Description-Content-Type: text/markdown
23
+
24
+ ## 🚀 DBOS Transact - Ultra-Lightweight Durable Execution in Python 🚀
25
+
26
+ ---
27
+
28
+ 📚 **Documentation**: Under Construction 🚧
29
+
30
+ 💬 **Join the Discussion**: [Discord Community](https://discord.gg/fMwQjeW5zg)
31
+
32
+ ---
33
+
34
+
35
+ **DBOS Python is under construction! 🚧🚧🚧 Check back regularly for updates, release coming in mid-September!**
36
+
37
+ DBOS Transact is a **Python library** providing ultra-lightweight durable execution.
38
+ For example:
39
+
40
+ ```python
41
+ @DBOS.step()
42
+ def step_one():
43
+ ...
44
+
45
+ @DBOS.step()
46
+ def step_two():
47
+ ...
48
+
49
+ @DBOS.workflow()
50
+ def workflow()
51
+ step_one()
52
+ step_two()
53
+ ```
54
+
55
+ Durable execution means your program is **resilient to any failure**.
56
+ If it is ever interrupted or crashes, all your workflows will automatically resume from the last completed step.
57
+ If you want to see durable execution in action, check out [this demo app](https://demo-widget-store.cloud.dbos.dev/) (source code [here](https://github.com/dbos-inc/dbos-demo-apps/tree/main/python/widget-store)).
58
+ No matter how many times you try to crash it, it always resumes from exactly where it left off!
59
+
60
+ Under the hood, DBOS Transact works by storing your program's execution state (which workflows are currently executing and which steps they've completed) in a Postgres database.
61
+ So all you need to use it is a Postgres database to connect to&mdash;there's no need for a "workflow server."
62
+ This approach is also incredibly fast, for example [25x faster than AWS Step Functions](https://www.dbos.dev/blog/dbos-vs-aws-step-functions-benchmark).
63
+
64
+ Some more cool features include:
65
+
66
+ - Scheduled jobs&mdash;run your workflows exactly-once per time interval.
67
+ - Exactly-once event processing&mdash;use workflows to process incoming events (for example, from a Kafka topic) exactly-once.
68
+ - Observability&mdash;all workflows automatically emit [OpenTelemetry](https://opentelemetry.io/) traces.
69
+
70
+ ## Getting Started
71
+
72
+ To try out the latest pre-release version, install and configure with:
73
+
74
+ ```shell
75
+ pip install --pre dbos
76
+ dbos init --config
77
+ ```
78
+
79
+ Try it out with this simple program (requires Postgres):
80
+
81
+ ```python
82
+ from fastapi import FastAPI
83
+ from dbos import DBOS
84
+
85
+ app = FastAPI()
86
+ DBOS(fastapi=app)
87
+
88
+ @DBOS.step()
89
+ def step_one():
90
+ print("Step one completed!")
91
+
92
+ @DBOS.step()
93
+ def step_two():
94
+ print("Step two completed!")
95
+
96
+ @DBOS.workflow()
97
+ def workflow():
98
+ step_one()
99
+ for _ in range(5):
100
+ print("Press Control + \ to stop the app...")
101
+ DBOS.sleep(1)
102
+ step_two()
103
+
104
+ @app.get("/")
105
+ def endpoint():
106
+ workflow()
107
+ ```
108
+
109
+ Save the program into `main.py`, tell it your local Postgres password via `export PGPASSWORD=<your password>` and start it with `fastapi run`.
110
+ Visit `localhost:8000` in your browser (or curl it) to start the workflow.
111
+ When prompted, press `Control + \` to force quit your application.
112
+ It should crash midway through the workflow, having completed step one but not step two.
113
+ Then, restart your app with `fastapi run`.
114
+ It should resume the workflow from where it left off, completing step two without re-executing step one.
115
+
116
+ To learn how to build more complex examples, see our programming guide (coming soon).
117
+
118
+ ## Documentation
119
+
120
+ Coming soon! 🚧
121
+
122
+ ## Examples
123
+
124
+ Check out some cool demo apps here: [https://github.com/dbos-inc/dbos-demo-apps/tree/main/python](https://github.com/dbos-inc/dbos-demo-apps/tree/main/python)
125
+
126
+ ## Community
127
+
128
+ If you're interested in building with us, please star our repository and join our community on [Discord](https://discord.gg/fMwQjeW5zg)!
129
+ If you see a bug or have a feature request, don't hesitate to open an issue here on GitHub.
130
+ If you're interested in contributing, check out our [contributions guide](./CONTRIBUTING.md).
@@ -1,19 +1,19 @@
1
- dbos-0.5.0a7.dist-info/METADATA,sha256=LdnWhAfO7Lnl85g-bvhXhoFYrCHkz7Jxmj_yqEKpPVc,5420
2
- dbos-0.5.0a7.dist-info/WHEEL,sha256=rSwsxJWe3vzyR5HCwjWXQruDgschpei4h_giTm0dJVE,90
3
- dbos-0.5.0a7.dist-info/entry_points.txt,sha256=3PmOPbM4FYxEmggRRdJw0oAsiBzKR8U0yx7bmwUmMOM,39
4
- dbos-0.5.0a7.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
1
+ dbos-0.5.0a12.dist-info/METADATA,sha256=w33L3epCZ1uqAdgc-4WZftuNGB61yVGSchxW_j13BFI,4444
2
+ dbos-0.5.0a12.dist-info/WHEEL,sha256=rSwsxJWe3vzyR5HCwjWXQruDgschpei4h_giTm0dJVE,90
3
+ dbos-0.5.0a12.dist-info/entry_points.txt,sha256=3PmOPbM4FYxEmggRRdJw0oAsiBzKR8U0yx7bmwUmMOM,39
4
+ dbos-0.5.0a12.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
5
5
  dbos/__init__.py,sha256=X1LdP36NomDtvPfFwoMNtgXf81TO05jj7vltsp79UUw,787
6
- dbos/admin_sever.py,sha256=KtzH6aKyskCm4h3yulpy9jb5PIqRlYI2sjctw5mvaKY,3395
6
+ dbos/admin_sever.py,sha256=Qg5T3YRrbPW05PR_99yAaxgo1ugQrAp_uTeTqSfjm_k,3397
7
7
  dbos/application_database.py,sha256=1K3kE96BgGi_QWOd2heXluyNTwFAwlUVuAR6JKKUqf0,5659
8
- dbos/cli.py,sha256=QnbGtZ8S963q3iyFvXNBcL4DB35r4SFMarlb5DRqN6M,7915
9
- dbos/context.py,sha256=JZMV2RtSpTK7lnyyWxeBmGPwrZSB00XZEP6R6MT9ygQ,15690
8
+ dbos/cli.py,sha256=YARlQiWHUwFni-fEOr0k5P_-pqPS4xkywj_B0oTMXn0,8318
9
+ dbos/context.py,sha256=qAVj_pAIV4YBOAbI0WCv-Roq7aNwPzAoj3CeQaVqlrU,15666
10
10
  dbos/core.py,sha256=HfKnPpIaQqIBAHzP2hD67aSIchTHp87NgD21CcujKkE,28300
11
11
  dbos/dbos-config.schema.json,sha256=azpfmoDZg7WfSy3kvIsk9iEiKB_-VZt03VEOoXJAkqE,5331
12
- dbos/dbos.py,sha256=-zrxmo_yN4vPTKQdyDtAcGlZI4-RV4PZBiIFayNSHyI,26342
12
+ dbos/dbos.py,sha256=bDp-m25V_CkaR4hsr4VmCFCZbDQ4V99Um9bDUxahpag,26561
13
13
  dbos/dbos_config.py,sha256=EkO0c0xaIM7_vAAqqnvNNEAKG5fOJbmmalqnZvaKYZA,5312
14
14
  dbos/decorators.py,sha256=lbPefsLK6Cya4cb7TrOcLglOpGT3pc6qjZdsQKlfZLg,629
15
15
  dbos/error.py,sha256=nBdLC4hxGO_K9V26YbDGOo7xi1CKuN4PsE_cBv7K8Cc,3798
16
- dbos/fastapi.py,sha256=ZFcMizyv3pizo5zf0sSF6U4GoR3rQH8LxGipkQIGHfU,2282
16
+ dbos/fastapi.py,sha256=LkARLITiN_NuQh4g2QL7sfK0oG1GvJjj2tvU7WWO8f8,1898
17
17
  dbos/logger.py,sha256=D-aFSZUCHBP34J1IZ5YNkTrJW-rDiH3py_v9jLU4Yrk,3565
18
18
  dbos/migrations/env.py,sha256=38SIGVbmn_VV2x2u1aHLcPOoWgZ84eCymf3g_NljmbU,1626
19
19
  dbos/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
@@ -22,16 +22,17 @@ dbos/migrations/versions/a3b18ad34abe_added_triggers.py,sha256=Rv0ZsZYZ_WdgGEULY
22
22
  dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
23
23
  dbos/recovery.py,sha256=xfwQFWNuD8DXg5HD5_-3tG7Neo9j-x1lrqiwtn5FSh8,2015
24
24
  dbos/registrations.py,sha256=gMI-u05tv5bpvyddQGtoUgCsqARx51aOY7p0JXPafQo,6539
25
+ dbos/request.py,sha256=FTjmgzqWwKKTSf6PKPdlQ4Ssp39PATQukYmMOW_xP7k,892
25
26
  dbos/roles.py,sha256=9u0z4CWmXPeqIKzQWEzaOKIlzOuaagBtMiB-swqjX_U,2291
26
27
  dbos/scheduler/croniter.py,sha256=hbhgfsHBqclUS8VeLnJ9PSE9Z54z6mi4nnrr1aUXn0k,47561
27
28
  dbos/scheduler/scheduler.py,sha256=uO4_9jmWW2rLv1ODL3lc1cE_37ZaVTgnvmFx_FAlN50,1472
28
29
  dbos/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
30
  dbos/schemas/application_database.py,sha256=q_Wr2XbiZNBYFkOtu7uKavo1T_cSOBblxKGHThYGGsY,962
30
31
  dbos/schemas/system_database.py,sha256=5V3vqnEzry0Hn7ZbVS9Gs_dJKia8uX8p7mGC82Ru8rk,4303
31
- dbos/system_database.py,sha256=84c53iAel113SRb7DcgFJ8XQNWBhD4VrCRCb0s5Oe8Y,39635
32
+ dbos/system_database.py,sha256=K2PYGRjXOJxhYW0_wDvu49CwE5L1HH_s0fAhHZw1HO8,39636
32
33
  dbos/templates/hello/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
33
34
  dbos/templates/hello/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- dbos/templates/hello/__package/main.py,sha256=hJgp3S14cseT7zWIZsPwjqdzwTCw1aLo8kPKsTvYz0Y,2976
35
+ dbos/templates/hello/__package/main.py,sha256=LFN48qBWt-xsf21Cg1llf5Grr0e7Il_7lcyi60sK4ec,2984
35
36
  dbos/templates/hello/__package/schema.py,sha256=XOSeq_vFG0vN1LxWPob-L9K65jq9OMCz2qOmvw5CKN8,235
36
37
  dbos/templates/hello/alembic.ini,sha256=VKBn4Gy8mMuCdY7Hip1jmo3wEUJ1VG1aW7EqY0_n-as,3695
37
38
  dbos/templates/hello/dbos-config.yaml.dbos,sha256=8wxCf_MIEFNWqMXj0nAHUwg1U3YaKz4xcUN6g51WkDE,603
@@ -42,4 +43,4 @@ dbos/templates/hello/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKs
42
43
  dbos/tracer.py,sha256=RPW9oxmX9tSc0Yq7O-FAhpQWBg1QT7Ni1Q06uwhtNDk,2237
43
44
  dbos/utils.py,sha256=hWj9iWDrby2cVEhb0pG-IdnrxLqP64NhkaWUXiLc8bA,402
44
45
  version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
45
- dbos-0.5.0a7.dist-info/RECORD,,
46
+ dbos-0.5.0a12.dist-info/RECORD,,
@@ -1,78 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: dbos
3
- Version: 0.5.0a7
4
- Summary: A Python framework for backends that scale
5
- Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
- License: MIT
7
- Requires-Python: >=3.9
8
- Requires-Dist: pyyaml>=6.0.2
9
- Requires-Dist: jsonschema>=4.23.0
10
- Requires-Dist: alembic>=1.13.2
11
- Requires-Dist: psycopg2-binary>=2.9.9
12
- Requires-Dist: typing-extensions>=4.12.2; python_version < "3.10"
13
- Requires-Dist: typer>=0.12.3
14
- Requires-Dist: jsonpickle>=3.2.2
15
- Requires-Dist: opentelemetry-api>=1.26.0
16
- Requires-Dist: opentelemetry-sdk>=1.26.0
17
- Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.26.0
18
- Requires-Dist: python-dateutil>=2.9.0.post0
19
- Requires-Dist: fastapi[standard]>=0.112.1
20
- Requires-Dist: psutil>=6.0.0
21
- Requires-Dist: tomlkit>=0.13.2
22
- Description-Content-Type: text/markdown
23
-
24
- # DBOS Transact Python
25
-
26
- **DBOS Python is under construction! 🚧🚧🚧 Check back regularly for updates, release coming in mid-September!**
27
-
28
- DBOS Transact is a **Python library** for building durable and scalable applications.
29
-
30
- You want to use DBOS Transact in your application because you need:
31
-
32
- - **Resilience to any failure**. If your app is interrupted for any reason, it automatically resumes from where it left off. Reliable message delivery is built in. Idempotency is built in.
33
- - **Reliable event processing**. Need to consume Kafka events exactly-once? Just add one line of code to your app. Need to run a task exactly once per hour, day, or month? Just one more line of code.
34
- - **Built-in observability**. Automatically emit [OpenTelemetry](https://opentelemetry.io/)-compatible logs and traces from any application. Query your app's history from the command line or with SQL.
35
- - **Blazing-fast, developer-friendly serverless**. Develop your project locally and run it anywhere. When you're ready, [deploy it for free to DBOS Cloud](https://docs.dbos.dev/getting-started/quickstart#deploying-to-dbos-cloud) and we'll host it for you, [25x faster](https://www.dbos.dev/blog/dbos-vs-aws-step-functions-benchmark) and [15x cheaper](https://www.dbos.dev/blog/dbos-vs-lambda-cost) than AWS Lambda.
36
-
37
- ## Getting Started
38
-
39
- To try out the latest pre-release version, install with:
40
-
41
- ```shell
42
- pip install --pre dbos
43
- ```
44
-
45
- ## Documentation
46
-
47
- Coming soon! 🚧
48
-
49
- But we have some cool demo apps for you to check out: [https://github.com/dbos-inc/dbos-demo-apps/tree/main/python](https://github.com/dbos-inc/dbos-demo-apps/tree/main/python)
50
-
51
- ## Main Features
52
-
53
- Here are some of the core features of DBOS Transact:
54
-
55
- | Feature | Description
56
- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
57
- | [Transactions](https://www.dbos.dev/dbos-transact-python) | Easily and safely query your application database using [SQLAlchemy](https://www.sqlalchemy.org/) or raw SQL.
58
- | [Workflows](https://www.dbos.dev/dbos-transact-python) | Reliable workflow orchestration&#8212;resume your program after any failure.
59
- | [Idempotency](https://www.dbos.dev/dbos-transact-python) | Automatically make any request idempotent, so your requests happen exactly once.
60
- | [Authentication and Authorization](https://www.dbos.dev/dbos-transact-python) | Secure your HTTP endpoints so only authorized users can access them.
61
- | [Kafka Integration](https://www.dbos.dev/dbos-transact-python) | Consume Kafka messages exactly-once with transactions or workflows.
62
- | [Scheduled Workflows](https://www.dbos.dev/dbos-transact-python) | Schedule your workflows to run exactly-once per time interval with cron-like syntax.
63
- | [Self-Hosting](https://www.dbos.dev/dbos-transact-python) | Host your applications anywhere, as long as they have a Postgres database to connect to.
64
-
65
- And DBOS Cloud:
66
-
67
- | Feature | Description
68
- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
69
- | [Serverless App Deployment](https://docs.dbos.dev/cloud-tutorials/application-management) | Deploy apps to DBOS Cloud in minutes.
70
- | [Interactive Time Travel](https://docs.dbos.dev/cloud-tutorials/interactive-timetravel) | Query your application database as of any past point in time.
71
- | [Cloud Database Management](https://docs.dbos.dev/cloud-tutorials/database-management) | Provision cloud Postgres instances for your applications. Alternatively, [bring your own database](https://docs.dbos.dev/cloud-tutorials/byod-management).
72
- | [Built-in Observability](https://docs.dbos.dev/cloud-tutorials/monitoring-dashboard) | Built-in log capture, request tracing, and dashboards.
73
-
74
- ## Community
75
-
76
- If you're interested in building with us, please star our repository and join our community on [Discord](https://discord.gg/fMwQjeW5zg)!
77
- If you see a bug or have a feature request, don't hesitate to open an issue here on GitHub.
78
- If you're interested in contributing, check out our [contributions guide](./CONTRIBUTING.md).