This is a fork from Diator, a Python library for implementing CQRS pattern in your applications. The original project is apparently abandoned.
Project description
SiKei - CQRS Library for Python
SiKei is a Python library for implementing CQRS pattern in your Python applications forked from Diator (https://akhundmurad.github.io/diator/). It provides a set of abstractions and utilities to help you separate your read and write concerns, allowing for better scalability, performance, and maintainability of your application.
Features :bulb:
- Implements the CQRS pattern.
- Simple, yet flexible API.
- Supports multiple message brokers, such as Redis Pub/Sub and Azure Service Bus.
- Supports various di-frameworks, such as di and rodi.
- Easy to integrate with existing codebases.
Installation :triangular_ruler:
Install the SiKei library with pip
pip install sikei
There are also several installation options:
-
To use Redis as Message Broker
pip install sikei[redis]
-
Or Azure Service Bus
pip install sikei[azure]
Simple Example :hammer_and_wrench:
Minimal example of sikei usage:
import asyncio
from dataclasses import dataclass, field
from di import Container, bind_by_type
from di.dependent import Dependent
from sikei.events import EventMap, Event, EventEmitter
from sikei.container.di import DIContainer
from sikei.mediator import Mediator
from sikei.requests import Request, RequestHandler, RequestMap
@dataclass(frozen=True, kw_only=True)
class JoinMeetingCommand(Request):
meeting_id: int
user_id: int
is_late: bool = field(default=False)
class JoinMeetingCommandHandler(RequestHandler[JoinMeetingCommand, None]):
def __init__(self, meeting_api) -> None:
self._meeting_api = meeting_api
self._events: list[Event] = []
@property
def events(self) -> list[Event]:
return self._events
async def handle(self, request: JoinMeetingCommand) -> None:
self._meeting_api.join(request.meeting_id, request.user_id)
if request.is_late:
self._meeting_api.warn(request.user_id)
def setup_di() -> DIContainer:
external_container = Container()
external_container.bind(
bind_by_type(
Dependent(JoinMeetingCommandHandler, scope="request"),
JoinMeetingCommandHandler,
)
)
container = DIContainer()
container.attach_external_container(external_container)
return container
async def main() -> None:
container = setup_di()
request_map = RequestMap()
request_map.bind(JoinMeetingCommand, JoinMeetingCommandHandler)
event_emitter = EventEmitter(
event_map=EventMap(), container=container, message_broker=None
)
mediator = Mediator(
request_map=request_map,
event_emitter=event_emitter,
container=container,
)
await mediator.send(JoinMeetingCommand(user_id=1, meeting_id=1, is_late=True))
if __name__ == "__main__":
asyncio.run(main())
Further reading :scroll:
- Udi Dahan - Clarified CQRS
- Martin Fowler - CQRS
- Marting Fowler - What do you mean by “Event-Driven”?
- Vlad Khononov - Learning Domain-Driven Design
- Vaughn Vernon - Really Simple CQRS
License
This project is licensed under the terms of the MIT license.
UV
Using UV to sync, build and publish
uv sync
uv build
uv publish
Inform
__token__and use token created at pypi.org
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 sikei-0.2.0.tar.gz.
File metadata
- Download URL: sikei-0.2.0.tar.gz
- Upload date:
- Size: 18.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81eaa0fac317f69b9b6761cae840620c638c18600f718168e0d44f73f399594f
|
|
| MD5 |
be034fcde90d98787e488a27ef502bb2
|
|
| BLAKE2b-256 |
6ce0612509baf82dd81d5eb0e713cdb65169d69007b170fb62487a14c0f5d328
|
File details
Details for the file sikei-0.2.0-py3-none-any.whl.
File metadata
- Download URL: sikei-0.2.0-py3-none-any.whl
- Upload date:
- Size: 17.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.6.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
215320273563ab274aa9164d8989a2f5b9430bfe44152866ae0b5cb5983789a0
|
|
| MD5 |
fc973455d187642cf7ef3df316017b32
|
|
| BLAKE2b-256 |
1c2c700ea6dec9d4dabb444e2fb8777a67bf53308562169e97cfac819eeaed4f
|