Skip to main content

domubus

A type-safe, async/sync event bus for Python with optional Pydantic integration, persistence, and priority handlers. Zero required dependencies.

Features

  • ✅ Async & Sync - Both async and sync handlers, emit from either context
  • ✅ Zero Dependencies - Core package uses only Python stdlib
  • ✅ Optional Pydantic - Type-safe events when Pydantic is installed
  • ✅ Priority Handlers - Control execution order with priority values
  • ✅ Wildcard Subscriptions - Subscribe to all events with *
  • ✅ One-time Handlers - Auto-unsubscribe after first execution
  • ✅ Event Filters - Conditionally execute handlers
  • ✅ JSONL Persistence - WAL-style event persistence
  • ✅ Fully Typed - PEP 561 compatible with py.typed marker

Installation

pip install domubus

# With Pydantic support
pip install domubus[pydantic]

Quick Start

import asyncio
from domubus import EventBus

bus = EventBus()

@bus.on("device.light.on")
async def handle_light_on(event):
    print(f"Light turned on: {event.data}")

@bus.on("device.light.on", priority=100)
def high_priority_handler(event):
    print("This runs first (sync handler)")

async def main():
    await bus.emit_async("device.light.on", {"brightness": 100})

asyncio.run(main())

Typed Events with Pydantic

from typing import ClassVar
from domubus import EventBus, BaseEvent

class DeviceStateChanged(BaseEvent):
    event_type: ClassVar[str] = "device.state.changed"
    device_id: str
    new_state: str

bus = EventBus()

@bus.on("device.state.changed")
async def handle_state_change(event: DeviceStateChanged):
    print(f"Device {event.device_id} -> {event.new_state}")

await bus.emit_async(DeviceStateChanged(device_id="light1", new_state="on"))

Persistence

from domubus import EventBus

# Events are persisted to JSONL file
async with EventBus(persistence_path="~/.myapp/events.jsonl") as bus:
    await bus.emit_async("user.login", {"user_id": "123"})
    
    # History is automatically loaded on context enter
    history = bus.get_history(event_type="user.login")

Wildcard Subscriptions

@bus.on("*")
def log_all_events(event):
    print(f"Event: {event.event_type}")

One-time Handlers

@bus.once("system.ready")
async def on_ready(event):
    print("System ready! (only runs once)")

Event Filters

def only_important(event):
    return event.data.get("priority") == "high"

@bus.on("notification", filter_fn=only_important)
def handle_important(event):
    print(f"Important: {event.data}")

Error Handling

def on_error(exception, event, handler):
    print(f"Handler {handler.__name__} failed: {exception}")

bus = EventBus(error_callback=on_error)

API Reference

EventBus

  • subscribe(event_type, handler, priority=0, once=False, filter_fn=None) - Subscribe handler
  • unsubscribe(handler_id) - Unsubscribe by ID
  • on(event_type, ...) - Decorator for subscribing
  • once(event_type, ...) - Decorator for one-time handler
  • emit_async(event, data=None) - Emit event asynchronously
  • emit(event, data=None) - Emit (async from sync context)
  • emit_sync(event, data=None) - Emit synchronously (sync handlers only)
  • get_history(event_type=None, limit=None) - Get event history
  • clear_history() - Clear in-memory history
  • clear_handlers() - Remove all handlers

Events

  • BaseEvent - Pydantic-based event (or dataclass fallback)
  • StringEvent - Simple string-based event with data dict

License

MIT

Metadata

Release files for domubus 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for domubus 0.1.1
File Size Uploaded Provenance
domubus-0.1.1.tar.gz 11.7 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for domubus 0.1.1
File Interpreter ABI Platform
domubus-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 26.9 kB

Release files / domubus-0.1.1.tar.gz

Download URL domubus-0.1.1.tar.gz
Size 11.7 kB
Tags Source
SHA-256 checksum
How to use checksums
0779dfbf312940fb937dbcfad64914e69fa7e8cd4e43d915d82af58c5d097034
BLAKE2b-256 checksum
How to use checksums
b8b8f6e6d01ce13366ef5f3580f78bd7e3af33077a439ebf47b2656b07e9f9a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.

Transparency log

Release files / domubus-0.1.1-py3-none-any.whl

Download URL domubus-0.1.1-py3-none-any.whl
Size 15.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d8e52e4ee26e6922bfad9fae25bb1d141e3144aac43b064bc99d45eb3d725dff
BLAKE2b-256 checksum
How to use checksums
9b2e2d86d6e28a5d9a3b3a1790f42c79b931eb464dfa90166dcfb80f9843c0fb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.

Transparency log

Security for domubus 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for domubus-0.1.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Feb 4, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page