Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/RailsEventStore/rails_event_store
A Ruby implementation of an Event Store based on Active Record
https://github.com/RailsEventStore/rails_event_store
aggregate-root cqrs cqrs-es ddd domain-driven-design event-driven event-driven-architecture event-sourcing rails ruby
Last synced: 3 months ago
JSON representation
A Ruby implementation of an Event Store based on Active Record
- Host: GitHub
- URL: https://github.com/RailsEventStore/rails_event_store
- Owner: RailsEventStore
- License: mit
- Created: 2015-03-31T22:02:32.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2024-05-22T11:31:37.000Z (8 months ago)
- Last Synced: 2024-05-22T11:48:08.161Z (8 months ago)
- Topics: aggregate-root, cqrs, cqrs-es, ddd, domain-driven-design, event-driven, event-driven-architecture, event-sourcing, rails, ruby
- Language: Ruby
- Homepage: http://railseventstore.org
- Size: 12.7 MB
- Stars: 1,377
- Watchers: 34
- Forks: 122
- Open Issues: 65
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Support: support/bundler/Gemfile.database
Awesome Lists containing this project
- awesome-ruby - Rails Event Store (RES) - A library for publishing, consuming, storing and retrieving events. It's your best companion for going with an event-driven architecture for your Rails application. (Abstraction)
README
# Rails Event Store
[Rails Event Store (RES)](https://railseventstore.org/) is a library for publishing, consuming, storing and retrieving events. It's your best companion for going with an event-driven architecture for your Rails application.
You can use it:
* as your [Publish-Subscribe bus](https://railseventstore.org/docs/pubsub/)
* to decouple core business logic from external concerns in Hexagonal style architectures
* as [an alternative to ActiveRecord callbacks and Observers](https://blog.arkency.com/2016/05/domain-events-over-active-record-callbacks/)
* as a communication layer between loosely coupled components
* to react to published events synchronously or asynchronously
* to extract side-effects (notifications, metrics etc) from your controllers and services into event handlers
* to build an audit-log
* to create read-models
* to implement event-sourcing## Documentation
Documentation, tutorials and code samples are available at [https://railseventstore.org](https://railseventstore.org).
## Code status
This single repository hosts several gems and website with documentation — see the [contribution guide](https://railseventstore.org/contributing/).
We're aiming for 100% mutation coverage in this project. This is why:
- [Why I want to introduce mutation testing to the rails_event_store gem](https://blog.arkency.com/2015/04/why-i-want-to-introduce-mutation-testing-to-the-rails-event-store-gem/)
- [Mutation testing and continuous integration](https://blog.arkency.com/2015/05/mutation-testing-and-continuous-integration/)Whenever you fix a bug or add a new feature, we require that the coverage doesn't go down.
### RailsEventStore gems
| Name | CI | Version | Downloads |
|--------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
| [rails_event_store](/rails_event_store) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/rails_event_store_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/rails_event_store_test.yml) | [![Gem](https://img.shields.io/gem/v/rails_event_store?style=flat-square)](https://rubygems.org/gems/rails_event_store) | [![Gem](https://img.shields.io/gem/dt/rails_event_store?style=flat-square)](https://rubygems.org/gems/rails_event_store) |
| [rails_event_store_active_record](/ruby_event_store/active_record) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-active_record_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-active_record_test.yml) | [![Gem](https://img.shields.io/gem/v/rails_event_store_active_record?style=flat-square)](https://rubygems.org/gems/rails_event_store_active_record) | [![Gem](https://img.shields.io/gem/dt/rails_event_store_active_record?style=flat-square)](https://rubygems.org/gems/rails_event_store_active_record) |
| [ruby_event_store-active_record](/ruby_event_store/active_record) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-active_record_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-active_record_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-active_record?style=flat-square)](https://rubygems.org/gems/ruby_event_store-active_record) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-active_record?style=flat-square)](https://rubygems.org/gems/ruby_event_store-active_record) |
| [ruby_event_store](/ruby_event_store) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store?style=flat-square)](https://rubygems.org/gems/ruby_event_store) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store?style=flat-square)](https://rubygems.org/gems/ruby_event_store) |
| [ruby_event_store-browser](/ruby_event_store-browser) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-browser_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-browser_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-browser?style=flat-square)](https://rubygems.org/gems/ruby_event_store-browser) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-browser?style=flat-square)](https://rubygems.org/gems/ruby_event_store-browser) |
| [ruby_event_store-rspec](/ruby_event_store-rspec) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-rspec_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-rspec_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-rspec?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rspec) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-rspec?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rspec) |
| [aggregate_root](/aggregate_root) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/aggregate_root_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/aggregate_root_test.yml) | [![Gem](https://img.shields.io/gem/v/aggregate_root?style=flat-square)](https://rubygems.org/gems/aggregate_root) | [![Gem](https://img.shields.io/gem/dt/aggregate_root?style=flat-square)](https://rubygems.org/gems/aggregate_root) |### Contributed gems
| Name | CI | Version | Downloads |
|-----------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [ruby_event_store-outbox](/contrib/ruby_event_store-outbox) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-outbox_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-outbox_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-outbox?style=flat-square)](https://rubygems.org/gems/ruby_event_store-outbox) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-outbox?style=flat-square)](https://rubygems.org/gems/ruby_event_store-outbox) |
| [ruby_event_store-protobuf](/contrib/ruby_event_store-protobuf) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-protobuf_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-protobuf_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-protobuf?style=flat-square)](https://rubygems.org/gems/ruby_event_store-protobuf) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-protobuf?style=flat-square)](https://rubygems.org/gems/ruby_event_store-protobuf) |
| [ruby_event_store-profiler](/contrib/ruby_event_store-profiler) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-profiler_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-profiler_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-profiler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-profiler) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-profiler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-profiler) |
| [ruby_event_store-flipper](/contrib/ruby_event_store-flipper) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-flipper_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-flipper_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-flipper?style=flat-square)](https://rubygems.org/gems/ruby_event_store-flipper) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-flipper?style=flat-square)](https://rubygems.org/gems/ruby_event_store-flipper) |
| [ruby_event_store-transformations](/contrib/ruby_event_store-transformations) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-transformations_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-transformations_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-transformations?style=flat-square)](https://rubygems.org/gems/ruby_event_store-transformations) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-transformations?style=flat-square)](https://rubygems.org/gems/ruby_event_store-transformations) |
| [ruby_event_store-rom](/contrib/ruby_event_store-rom) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-rom_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-rom_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-rom?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rom) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-rom?style=flat-square)](https://rubygems.org/gems/ruby_event_store-rom) |
| [ruby_event_store-sidekiq_scheduler](/contrib/ruby_event_store-sidekiq_scheduler) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-sidekiq_scheduler_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-sidekiq_scheduler_test.yml) | [![Gem](https://img.shields.io/gem/v/ruby_event_store-sidekiq_scheduler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-sidekiq_scheduler) | [![Gem](https://img.shields.io/gem/dt/ruby_event_store-sidekiq_scheduler?style=flat-square)](https://rubygems.org/gems/ruby_event_store-sidekiq_scheduler) |### Unreleased contributed gems
| Name | CI |
|-------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [ruby_event_store-newrelic](/contrib/ruby_event_store-newrelic) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/ruby_event_store-newrelic_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/ruby_event_store-newrelic_test.yml) |
| [minitest-ruby_event_store](/contrib/minitest-ruby_event_store) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/minitest-ruby_event_store_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/minitest-ruby_event_store_test.yml) |
| [dres_rails](/contrib/distributed_rails_event_store/dres_rails) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/dres_rails_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/dres_rails_test.yml) |
| [dres_client](/contrib/distributed_rails_event_store/dres_client) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/RailsEventStore/rails_event_store/dres_client_test.yml?style=flat-square)](https://github.com/RailsEventStore/rails_event_store/actions/workflows/dres_client_test.yml) |## About
This repository is funded and maintained by [arkency](https://arkency.com). Make sure to check out our [Rails Architect Masterclass training](https://arkademy.dev) and long-term [support plans](https://railseventstore.org/support/) available.