Skip to main content

Yet Another Python Event Emitter

Project description

Yet Another Python Event Emitter

Made in Ukraine license Poetry Ruff pypi Publish Tests codecov Ask DeepWiki

ASAP (as simple as possible), fast, and understandable brokerless, zero-dependent event emitter for Python.

Features

  • Supports both synchronous and asynchronous listeners.
  • Provides event waiting with predicates and optional timeouts.
  • Allows dynamic listener registration and removal.
  • Built-in error propagation and handling.
  • Enables lazy event emission.

Installation

Project published on PyPi under yapee name.

poetry add yapee
pip install yapee
uv add yapee

Usage

Basic Example

import asyncio

from yapee import EventEmitter

ee = EventEmitter()


@ee.enlist("my_event")
def my_listener(data):
    print(f"Received data: {data}")


ee.emit("my_event", "Hello, EventEmitter!")

Asynchronous Listeners

@ee.enlist("async_event")
async def async_listener(data):
    await asyncio.sleep(1)  # Do some async work
    print(f"Async received: {data}")


async def main():
    ee.emit("async_event", "Hello Async!")
    await asyncio.sleep(2)  # Give time for async execution


asyncio.run(main())

Waiting for an Event

async def trigger_event():
    await asyncio.sleep(2)
    ee.emit("wait_event", "Waited data")


asyncio.create_task(trigger_event())
data = await ee.wait_for("wait_event", timeout=5)
print(f"Waited and got: {data}")

Waiting for an Event with Predicate Function

Pay attention that predicate function must be light and do not block execution.

async def trigger_event():
    await asyncio.sleep(2)
    ee.emit("filtered_event", 49)  # Emit event with data, will not pass predicate, as 49 < 50
    await asyncio.sleep(2)
    ee.emit("filtered_event", 51)  # Will pass predicate and wait_for will return 51


asyncio.create_task(trigger_event())

data = await ee.wait_for("filtered_event", predicate=lambda x: x > 50)
print(f"Received matching event data: {data}")

Removing Listeners

# Removing a specific listener
ee.delist("my_event", my_listener)
ee.delist("my_event", async_listener)

# Removing all listeners for an event
ee.delist_all("my_event")

# Removing all listeners for all events
ee.delist_all()

Error Handling in Listeners

By default, any exception inside a listener will be raised. You can override _on_listener_error to customize error handling:

class MyCustomEmitter(EventEmitter):
    async def _on_listener_error(self, event, listener, args, e):
        print(f"Error in listener {listener} for event {event}: {e}")


my_custom_ee = MyCustomEmitter()

Is there anybody interested in this event?

Sometimes emitting an event is cheap, but preparing its payload is not. Use these helpers to check whether an event has any listeners or waiters before doing expensive work:

ee.has_listeners(event)  # at least one listener is registered for event
ee.has_waiters(event)  # at least one active waiter is waiting for event
ee.has_any(event)  # at least one listener or waiter is here awaiting for event

# So
if ee.has_any("my_event"):
    payload = expensive_work()
    ee.emit("my_event", payload)

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

yapee-1.0.2.tar.gz (5.0 kB view details)

Uploaded Source

Built Distribution

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

yapee-1.0.2-py3-none-any.whl (5.4 kB view details)

Uploaded Python 3

File details

Details for the file yapee-1.0.2.tar.gz.

File metadata

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

File hashes

Hashes for yapee-1.0.2.tar.gz
Algorithm Hash digest
SHA256 3f2d17a8caf8b48e3209c2bf76ffe3a046a13b26486c3fe50c0a62a5300b7424
MD5 2126a099cfc6183ba8afb856bd2229de
BLAKE2b-256 e45ed5fba9b81533aaab1a0eb2a3e35817dbe1c18b25989882d421ceb98b8397

See more details on using hashes here.

Provenance

The following attestation bundles were made for yapee-1.0.2.tar.gz:

Publisher: publish.yml on somespecialone/yapee

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

File details

Details for the file yapee-1.0.2-py3-none-any.whl.

File metadata

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

File hashes

Hashes for yapee-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 51a9c31306907a002b0c2b7b7faeec6f2804e74be849f1bb06981d37d1e16462
MD5 8c0fc2463d4946eccc7b984efeef60f4
BLAKE2b-256 23a4f28a27c4fc3b7bb9f412a6778e6a35e29bf7454d4ee196ab18fc24e57449

See more details on using hashes here.

Provenance

The following attestation bundles were made for yapee-1.0.2-py3-none-any.whl:

Publisher: publish.yml on somespecialone/yapee

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