Skip to main content

Event handling stereotype for Spakky Framework (@EventHandler, @on_event)

Project description

Spakky Event

Event handling stereotype for Spakky Framework.

Installation

pip install spakky-event

Features

  • @EventHandler: Stereotype for event handler classes
  • @on_event: Decorator for marking methods as event handlers
  • Type-safe: Full type hint support for event types
  • Async support: Native async/await for event processing

Quick Start

Define Events

Events should extend one of the event base classes from spakky-domain:

  • Use AbstractDomainEvent for events within a bounded context (in-process domain events)
  • Use AbstractIntegrationEvent for cross-boundary events (message broker integration)

When using message broker plugins (RabbitMQ / Kafka), define events as AbstractIntegrationEvent.

from spakky.core.common.mutability import immutable
from spakky.domain.models.event import AbstractIntegrationEvent


@immutable
class UserCreatedEvent(AbstractIntegrationEvent):
    user_id: str
    email: str


@immutable
class UserDeletedEvent(AbstractIntegrationEvent):
    user_id: str

Create Event Handler

Use @EventHandler stereotype with @on_event decorators:

from spakky.event.stereotype.event_handler import EventHandler, on_event


@EventHandler()
class UserEventHandler:
    def __init__(self, notification_service: NotificationService) -> None:
        self.notification_service = notification_service

    @on_event(UserCreatedEvent)
    async def on_user_created(self, event: UserCreatedEvent) -> None:
        await self.notification_service.send_welcome_email(event.email)

    @on_event(UserDeletedEvent)
    async def on_user_deleted(self, event: UserDeletedEvent) -> None:
        await self.notification_service.send_goodbye_email(event.user_id)

Integration with Message Brokers

The @EventHandler stereotype works with Spakky's message broker plugins:

RabbitMQ

pip install spakky-rabbitmq
from spakky.core.application.application import SpakkyApplication
from spakky.core.application.application_context import ApplicationContext

app = (
    SpakkyApplication(ApplicationContext())
    .load_plugins()  # Loads spakky-rabbitmq plugin
    .scan()
    .start()
)

Kafka

pip install spakky-kafka
from spakky.core.application.application import SpakkyApplication
from spakky.core.application.application_context import ApplicationContext

app = (
    SpakkyApplication(ApplicationContext())
    .load_plugins()  # Loads spakky-kafka plugin
    .scan()
    .start()
)

API Reference

Stereotypes

Decorator Description
@EventHandler() Marks a class as an event handler (extends @Pod)
@on_event(EventType) Marks a method as handler for specific event type

Interfaces

Interface Description
IEventPublisher / IAsyncEventPublisher Event publish entry point (type-based routing)
IEventBus / IAsyncEventBus Integration event send entry point (Outbox seam)
IEventTransport / IAsyncEventTransport Actual message broker transport
IEventConsumer / IAsyncEventConsumer Handler callback registration
IEventDispatcher / IAsyncEventDispatcher In-process handler dispatch

Implementations

Class Description
EventMediator / AsyncEventMediator Consumer + Dispatcher combined (in-process)
EventPublisher / AsyncEventPublisher Type-based router (DomainEvent→Mediator, IntegrationEvent→EventBus)
DirectEventBus / AsyncDirectEventBus Default EventBus → EventTransport delegation
EventHandlerRegistrationPostProcessor Auto-registers @EventHandler methods

Types

Type Description
EventRoute Annotation class for event routing metadata
EventT_contra TypeVar bound to AbstractEvent
EventHandlerCallback Type alias for sync event callbacks
AsyncEventHandlerCallback Type alias for async event callbacks

Errors

Class Description
AbstractSpakkyEventError Base error for event operations
DuplicateEventHandlerError Raised when duplicate handlers registered
InvalidMessageError Raised when message is malformed

Related Packages

Package Description
spakky-domain DDD building blocks including AbstractEvent, AbstractDomainEvent, AbstractIntegrationEvent
spakky-rabbitmq RabbitMQ transport (RabbitMQEventTransport)
spakky-kafka Kafka transport (KafkaEventTransport)

In-process Domain Event Publishing

For events within a bounded context (DomainEvents), use the in-process publisher:

from spakky.core.application.application import SpakkyApplication
from spakky.core.application.application_context import ApplicationContext
from spakky.event import IAsyncEventPublisher

# Bootstrap application (load_plugins auto-registers event components)
app = (
    SpakkyApplication(ApplicationContext())
    .load_plugins()
    .scan()
    .start()
)

# Get publisher from container
publisher = app.container.get(IAsyncEventPublisher)
await publisher.publish(UserCreatedEvent(user_id="123", email="test@example.com"))

Architecture (ISP Compliant)

The in-process event system follows Interface Segregation Principle:

  • Consumer: Registers event handlers (register() method)
  • Dispatcher: Dispatches events to handlers (dispatch() method)
  • Mediator: Combines both interfaces in a single implementation
  • Publisher: Depends only on Dispatcher (not Consumer)
┌─────────────────┐     ┌─────────────────┐
│   Publisher     │────▶│   Dispatcher    │
└─────────────────┘     └────────┬────────┘
                                 │
                        ┌────────▼────────┐
                        │    Mediator     │
                        │ (Consumer +     │
                        │  Dispatcher)    │
                        └────────┬────────┘
                                 │
                        ┌────────▼────────┐
                        │  EventHandler   │
                        │  @on_event()    │
                        └─────────────────┘

License

MIT License

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

spakky_event-6.0.0.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

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

spakky_event-6.0.0-py3-none-any.whl (13.7 kB view details)

Uploaded Python 3

File details

Details for the file spakky_event-6.0.0.tar.gz.

File metadata

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

File hashes

Hashes for spakky_event-6.0.0.tar.gz
Algorithm Hash digest
SHA256 dfb67d693d588e1c60381a2c18d7c6b6a18aad8398f348010621fa773d6262b2
MD5 2b21396b37508aa3d55a778d83b2460c
BLAKE2b-256 ed09f7becf127e26d666a0ec7b7367a96ed0b456f1c7fcf4594f6fd24a6696ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for spakky_event-6.0.0.tar.gz:

Publisher: release.yml on E5presso/spakky-framework

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

File details

Details for the file spakky_event-6.0.0-py3-none-any.whl.

File metadata

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

File hashes

Hashes for spakky_event-6.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f22015816d4de7c7add613caa59b2789cdc44b05ffcc9235bf686dd4699d79de
MD5 07556bf725595c3577691403415b7e33
BLAKE2b-256 b6ee90a2f900ec0825cd8a976095b677a0c0d2a351e51032bf1542709140e2db

See more details on using hashes here.

Provenance

The following attestation bundles were made for spakky_event-6.0.0-py3-none-any.whl:

Publisher: release.yml on E5presso/spakky-framework

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