Skip to main content

Async DDD framework for microservices on Starlette

Project description

Urich

Async DDD framework for microservices on Starlette.

Documentation: kashn9sh.github.io/urich · Contributing: CONTRIBUTING.md · Community & promotion: docs/community.md

The application is composed from module objects via app.register(module) — similar to FastAPI with routers, but one consistent style for domain, events, RPC and discovery.

Idea

  • One object = one building block: DomainModule, EventBusModule, OutboxModule, DiscoveryModule, RpcModule. All configured via fluent API and attached with app.register(module).
  • DDD: Bounded context as DomainModule with .aggregate(), .repository(), .command(), .query(), .on_event(). Commands and queries get HTTP routes automatically.
  • No lock-in: Protocols (EventBus, ServiceDiscovery, RpcTransport) in core; implementations (Redis, Consul, HTTP+JSON) supplied by the user or optional out-of-the-box adapters.

Install

pip install urich
# CLI for generating skeletons:
pip install "urich[cli]"

Quick start

from urich import Application
from urich.ddd import DomainModule

# One object = full bounded context
from orders.module import orders_module

app = Application()
app.register(orders_module)

# Run: python -m uvicorn main:app --reload  (or: pip install uvicorn && uvicorn main:app --reload)

Routes by convention: POST /orders/commands/create_order, GET /orders/queries/get_order.

OpenAPI / Swagger

After registering all modules, call app.openapi(title="My API", version="0.1.0"). Then:

  • GET /openapi.json — OpenAPI 3.0 spec
  • GET /docs — Swagger UI
app = Application()
# ... app.register(module) ...
app.openapi(title="My API", version="0.1.0")

CLI

urich create-app myapp
cd myapp
urich add-context orders --dir .
urich add-aggregate orders Order --dir .
# In main.py: from orders.module import orders_module; app.register(orders_module)

Module structure (DomainModule)

  • domain — aggregate (AggregateRoot), domain events (DomainEvent).
  • application — commands/queries (Command/Query), handlers (one per command/query).
  • infrastructure — repository interface and implementation (e.g. in-memory for prototypes).
  • module.py — one object DomainModule("orders").aggregate(...).repository(...).command(...).query(...).on_event(...); register in the app with app.register(orders_module).

Other modules

  • EventBusModule.adapter(impl) or .in_memory(); in container as EventBus.
  • OutboxModule.storage(...) and .publisher(...); contracts in core.
  • DiscoveryModule.static({"svc": "http://..."}) or .adapter(impl); ServiceDiscovery protocol.
  • RpcModule.server(path="/rpc") and .client(discovery=..., transport=...); optional JsonHttpRpcTransport (requires httpx).

Full composition example: examples/ecommerce/main.py.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

urich-0.1.4.tar.gz (19.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

urich-0.1.4-py3-none-any.whl (26.4 kB view details)

Uploaded Python 3

File details

Details for the file urich-0.1.4.tar.gz.

File metadata

  • Download URL: urich-0.1.4.tar.gz
  • Upload date:
  • Size: 19.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for urich-0.1.4.tar.gz
Algorithm Hash digest
SHA256 3d3edbdd2abdce2742ecff7d62389f28d79fd28d455b96cd063135c835a755e5
MD5 5db6dd8e00873774ac92bc0323418ac1
BLAKE2b-256 83ba331ca4a89fceca8c70a2778492091226908b01ed16be7a779ea3b3c66e62

See more details on using hashes here.

Provenance

The following attestation bundles were made for urich-0.1.4.tar.gz:

Publisher: publish.yml on KashN9sh/urich

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file urich-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: urich-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 26.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for urich-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 62522594e2c0692dde981d8150f9ea1204caf5f7fb683c7e52423ea7422ba5f9
MD5 dca6070f87fbf4794222cfc3a29df1c2
BLAKE2b-256 60e532fac0178bf4da9f2563f251a08dc1cb1358b9834210db55cfdb1e2a7e67

See more details on using hashes here.

Provenance

The following attestation bundles were made for urich-0.1.4-py3-none-any.whl:

Publisher: publish.yml on KashN9sh/urich

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page