Skip to main content

A lightweight pub-sub framework.

Project description

splurge-pub-sub

PyPI version Python versions License: MIT

CI Coverage Ruff mypy

A lightweight, thread-safe publish-subscribe framework for Python applications. Splurge provides simple, Pythonic in-process event communication with full type safety and comprehensive error handling.

Features

  • Lightweight: Zero external dependencies, minimal footprint
  • Thread-Safe: Full concurrency support with reentrant locks
  • Type-Safe: Complete type annotations with mypy strict mode compliance
  • Simple API: Subscribe, publish, unsubscribe with intuitive methods
  • Decorator Syntax: @bus.on("topic") for simplified subscriptions
  • Topic Filtering: Wildcard pattern matching for selective message delivery
  • Correlation IDs: Cross-library event tracking and coordination
  • Error Handling: Custom error handlers for failed callbacks
  • Context Manager: Automatic resource cleanup with with statement
  • 94% Coverage: Comprehensive test coverage across all features

Quick Start

Installation

pip install splurge-pub-sub

Basic Usage

from splurge_pub_sub import PubSub, Message

# Create a pub-sub bus
bus = PubSub()

# Subscribe to a topic
def handle_event(msg: Message) -> None:
    print(f"Received: {msg.data}")

sub_id = bus.subscribe("user.created", handle_event)

# Publish a message
bus.publish("user.created", {"id": 123, "name": "Alice"})
# Output: Received: {'id': 123, 'name': 'Alice'}

# Unsubscribe when done
bus.unsubscribe("user.created", sub_id)

Decorator API

@bus.on("user.updated")
def handle_user_updated(msg: Message) -> None:
    print(f"User updated: {msg.data}")

bus.publish("user.updated", {"id": 123, "status": "active"})

Topic Filtering

from splurge_pub_sub import TopicPattern

# Create patterns with wildcards
pattern = TopicPattern("user.*")
pattern.matches("user.created")  # True
pattern.matches("user.updated")  # True
pattern.matches("order.created")  # False

# Patterns with ? for single character
pattern = TopicPattern("user.?.created")
pattern.matches("user.a.created")  # True
pattern.matches("user.ab.created")  # False

Correlation ID for Cross-Library Coordination

# Multiple libraries using same correlation_id
correlation_id = "workflow-123"

dsv_bus = PubSub(correlation_id=correlation_id)
tabular_bus = PubSub(correlation_id=correlation_id)

# Monitor all events with same correlation_id
monitor_bus = PubSub()
monitor_bus.subscribe("*", lambda m: print(f"[{m.correlation_id}] {m.topic}"), 
                      correlation_id=correlation_id)

dsv_bus.publish("dsv.file.loaded", {"file": "data.csv"})
tabular_bus.publish("tabular.table.created", {"rows": 100})
# Both messages received by monitor

Error Handling

def my_error_handler(exc: Exception, topic: str) -> None:
    print(f"Error on topic '{topic}': {exc}")

bus = PubSub(error_handler=my_error_handler)

@bus.on("risky.operation")
def handle_event(msg: Message) -> None:
    raise ValueError("Something went wrong!")

bus.publish("risky.operation", {})  # Error handler called
# Output: Error on topic 'risky.operation': Something went wrong!

Context Manager

with PubSub() as bus:
    bus.subscribe("topic", callback)
    bus.publish("topic", data)
    # Cleanup happens automatically

Documentation

Requirements

  • Python 3.10 or later
  • No external dependencies

License

MIT License - see LICENSE file for details

Author

Jim Schilling

Support

For issues, questions, or contributions, visit the GitHub repository.

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

splurge_pub_sub-2025.2.0.tar.gz (26.2 kB view details)

Uploaded Source

Built Distribution

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

splurge_pub_sub-2025.2.0-py3-none-any.whl (31.3 kB view details)

Uploaded Python 3

File details

Details for the file splurge_pub_sub-2025.2.0.tar.gz.

File metadata

  • Download URL: splurge_pub_sub-2025.2.0.tar.gz
  • Upload date:
  • Size: 26.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for splurge_pub_sub-2025.2.0.tar.gz
Algorithm Hash digest
SHA256 889df758b0da0f56f2fd2d4ba9e2d1f3cce273c8bbdff796f0ef8b1266e05543
MD5 c5e202efa417d0705eb5c9a7a2da7fcf
BLAKE2b-256 d22fc23eac71e4ab47876bcb4c58192eaf98c02c19769c8da3f62d9eb48f6bf7

See more details on using hashes here.

File details

Details for the file splurge_pub_sub-2025.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for splurge_pub_sub-2025.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1a181c993e77371d68cdef228d8e59daedb8e5b0b05d0c9dd442995e2c32fd89
MD5 99e00fc43ae8e868d634d174d2aac5a6
BLAKE2b-256 60b98ba4e747c3465427de687c09b73a8711e1e7afc0d305462d1c622522bed9

See more details on using hashes here.

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