/kant

A CQRS and Event Sourcing for Python

Primary LanguagePythonMIT LicenseMIT

Kant Framework

WARNING: This repository is unmaintained

A CQRS and Event Sourcing framework, safe for humans.

Build Status codecov.io PyPI Package latest release Supported versions Supported implementations Join the chat at https://gitter.im/kant-es/Lobby Code style: black

Feature Support

  • Event Store
  • Optimistic concurrency control
  • JSON serialization
  • SQLAlchemy Projections
  • Snapshots [IN PROGRESS]

Kant officially supports Python 3.5-3.6.

Getting started

Create declarative events

from kant import events

class BankAccountCreated(events.Event):
    id = events.CUIDField(primary_key=True)
    owner = events.CharField()

class DepositPerformed(events.Event):
    amount = events.DecimalField()

Create aggregate to apply events

from kant import aggregates

class BankAccount(aggregates.Aggregate):
    id = aggregates.CUIDField()
    owner = aggregates.CharField()
    balance = aggregates.DecimalField()

    def apply_bank_account_created(self, event):
        self.id = event.id
        self.owner = event.owner
        self.balance = 0

    def apply_deposit_performed(self, event):
        self.balance += event.amount

Now, save the events

from kant.eventstore import connect

await connect(user='user', password='user', database='database')

# create event store for bank_account
conn.create_keyspace('bank_account')

# create events
bank_account_created = BankAccountCreated(
    id=123,
    owner='John Doe',
)
deposit_performed = DepositPerformed(
    amount=20,
)

bank_account = BankAccount()
bank_account.dispatch([bank_account_created, deposit_performed])
bank_account.save()

stored_bank_account = BankAccount.objects.get(123)

Installing

To install Kant, simply use pipenv (or pip)

$ pipenv install kant

Contributing

Please, read the contribute guide CONTRIBUTING.