Lightweight Mediator pattern (sync/async) for Python
Project description
mediapyr (Python)
Mediator pattern implementation for Python, inspired by MediatR in C#. Provides async-first request/response and pub/sub messaging with optional Dependency Injection (DI).
Installation
pip install mediapyr
Quick Start
Define a Request and Handler
from mediapyr import mediator, Request, IRequestHandler
class Ping(Request):
def __init__(self, msg: str):
self.msg = msg
@mediator.request_handler(Ping)
class PingHandler(IRequestHandler):
async def handle(self, request: Ping) -> str:
return f"Pong: {request.msg}"
Define an Event and Handlers
from mediapyr import Event, IEventHandler
class UserCreated(Event):
def __init__(self, username: str):
self.username = username
@mediator.event_handler(UserCreated)
class SendWelcomeEmail(IEventHandler):
async def handle(self, event: UserCreated):
print(f"📧 Send welcome email to {event.username}")
@mediator.event_handler(UserCreated)
class AddToCRM(IEventHandler):
async def handle(self, event: UserCreated):
print(f"👤 Add {event.username} to CRM")
Run Example
import asyncio
from mediapyr import mediator
async def main():
res = await mediator.send(Ping("Hello"))
print("Send result:", res)
await mediator.publish(UserCreated("Alice"))
if __name__ == "__main__":
asyncio.run(main())
Dependency Injection with dependency-injector
mediapyr supports plugging in your own DI provider. Example using dependency-injector:
from dependency_injector import containers, providers
from mediapyr import mediator, IRequestHandler, IEventHandler
# Example services
class EmailService:
def send(self, user: str):
print(f"[EmailService] Sent email to {user}")
class UserRepository:
def add(self, user: str):
print(f"[UserRepository] Added user {user}")
# Handlers
class SendWelcomeEmail(IEventHandler):
def __init__(self, email_service: EmailService):
self._email = email_service
async def handle(self, event: UserCreated):
self._email.send(event.username)
class AddToCRM(IEventHandler):
def __init__(self, repo: UserRepository):
self._repo = repo
async def handle(self, event: UserCreated):
self._repo.add(event.username)
class PingHandler(IRequestHandler):
async def handle(self, request: Ping) -> str:
return f"Pong from DI: {request.msg}"
# Setup DI container
class Container(containers.DeclarativeContainer):
wiring_config = containers.WiringConfiguration()
# Services (singleton)
email_service = providers.Singleton(EmailService)
user_repo = providers.Singleton(UserRepository)
# Handlers (factory/transient)
SendWelcomeEmail = providers.Factory(SendWelcomeEmail, email_service=email_service)
AddToCRM = providers.Factory(AddToCRM, repo=user_repo)
PingHandler = providers.Factory(PingHandler)
container = Container()
# Plug into mediator
def provider(cls):
try:
return getattr(container, cls.__name__)()
except AttributeError:
return cls() # fallback empty constructor
mediator._provider = provider
Running with DI
import asyncio
async def main():
res = await mediator.send(Ping("Hello DI"))
print("Send result:", res)
await mediator.publish(UserCreated("Alice"))
if __name__ == "__main__":
asyncio.run(main())
License
MIT License. See LICENSE for details.
Author: NguyenTungSk
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mediapyr-0.1.3.tar.gz.
File metadata
- Download URL: mediapyr-0.1.3.tar.gz
- Upload date:
- Size: 4.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b0c2f92bff83a9f4e11b54ac35a89b8e4845530838585cd36012dcda3c07221a
|
|
| MD5 |
eacc0504ff1d8a3262de79a32e86b3bf
|
|
| BLAKE2b-256 |
faa8fe9360e76081898980e3aed70d1be0a245751e20756327cc270ab7d47657
|
File details
Details for the file mediapyr-0.1.3-py3-none-any.whl.
File metadata
- Download URL: mediapyr-0.1.3-py3-none-any.whl
- Upload date:
- Size: 4.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ba905e128a8ac78b3c5a34c3212b987930b9c120175b400b59ad4fe0b29d4b4
|
|
| MD5 |
f91eb0ea23d3003557e08d989b35e470
|
|
| BLAKE2b-256 |
f4c41f582d223898363bc7c27e2e004b6b31717d9e2e6485090bf3acfd5455f5
|