Package: eventsourcing
A library for event sourcing in Python."totally amazing and a pleasure to use""very clean and intuitive""a huge help and time saver"Pleaseread the docs. See alsoextension projects.InstallationUse pip to install thestable distributionfrom the Python Package Index.$ pip install eventsourcingPlease note, it is recommended to install Python
packages into a Python virtual environment.SynopsisDefine aggregates with theAggregateclass and the@eventdecorator.fromeventsourcing.domainimportAggregate,eventclassDog(Aggregate):@event('Registered')def__init__(self,name):self.name=nameself.tricks=[]@event('TrickAdded')defadd_trick(self,trick):self.tricks.append(trick)Define application objects with theApplicationclass.fromeventsourcing.applicationimportApplicationclassDogSchool(Application):defregister_dog(self,name):dog=Dog(name)self.save(dog)returndog.iddefadd_trick(self,dog_id,trick):dog=self.repository.get(dog_id)dog.add_trick(trick)self.save(dog)defget_dog(self,dog_id):dog=self.repository.get(dog_id)return{'name':dog.name,'tricks':tuple(dog.tricks)}Write a test.deftest_dog_school():# Construct application object.school=DogSchool()# Evolve application state.dog_id=school.register_dog('Fido')school.add_trick(dog_id,'roll over')school.add_trick(dog_id,'play dead')# Query application state.dog=school.get_dog(dog_id)assertdog['name']=='Fido'assertdog['tricks']==('roll over','play dead')# Select notifications.notifications=school.notification_log.select(start=1,limit=10)assertlen(notifications)==3Run the test with the default persistence module. Events are stored
in memory using Python objects.test_dog_school()Configure the application to run with an SQLite database. Other persistence modules are available.importosos.environ["PERSISTENCE_MODULE"]='eventsourcing.sqlite'os.environ["SQLITE_DBNAME"]='dog-school.db'Run the test with SQLite.test_dog_school()See thedocumentationfor more information.FeaturesAggregates and applications— base classes for event-sourced aggregates
and applications. Suggests how to structure an event-sourced application. All
classes are fully type-hinted to guide developers in using the library.Flexible event store— flexible persistence of aggregate events. Combines
an event mapper and an event recorder in ways that can be easily extended.
Mapper uses a transcoder that can be easily extended to support custom
model object types. Recorders supporting different databases can be easily
substituted and configured with environment variables.Application-level encryption and compression— encrypts and decrypts events inside the
application. This means data will be encrypted in transit across a network ("on the wire")
and at disk level including backups ("at rest"), which is a legal requirement in some
jurisdictions when dealing with personally identifiable information (PII) for example
the EU's GDPR. Compression reduces the size of stored aggregate events and snapshots, usually
by around 25% to 50% of the original size. Compression reduces the size of data
in the database and decreases transit time across a network.Snapshotting— reduces access-time for aggregates that have many events.Versioning- allows changes to be introduced after an application
has been deployed. Both aggregate events and aggregate snapshots can be versioned.Optimistic concurrency control— ensures a distributed or horizontally scaled
application doesn't become inconsistent due to concurrent method execution. Leverages
optimistic concurrency controls in adapted database management systems.Notifications and projections— reliable propagation of application
events with pull-based notifications allows the application state to be
projected accurately into replicas, indexes, view models, and other applications.
Supports materialized views and CQRS.Event-driven systems— reliable event processing. Event-driven systems
can be defined independently of particular persistence infrastructure and mode of
running.Detailed documentation— documentation provides general overview, introduction
of concepts, explanation of usage, and detailed descriptions of library classes.
All code is annotated with type hints.Worked examples— includes examples showing how to develop aggregates, applications
and systems.ExtensionsThe GitHub organisationEvent Sourcing in Pythonhosts extension projects for the Python eventsourcing library.
There are projects that adapt popular ORMs such asDjangoandSQLAlchemy.
There are projects that adapt specialist event stores such asAxon ServerandEventStoreDB.
There are projects that support popular NoSQL databases such asDynamoDB.
There are also projects that provide examples of using the
library with web frameworks such asFastAPIandFlask,
and for serving applications and running systems with efficient
inter-process communication technologies likegRPC.
And there are examples of event-sourced applications and systems
of event-sourced applications, such as thePaxos system,
which is used as the basis for areplicated state machine,
which is used as the basis for adistributed key-value store.ProjectThis project ishosted on GitHub.Please register questions, requests andissues on GitHub,
or post in the project's Slack channel.There is aSlack channelfor this project, which you arewelcome to join.Please refer to thedocumentationfor installation and usage guides.