ruby_event_store 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 154e81d7d982c34b92400ed0fd52e37e7c1ba5de
4
- data.tar.gz: ec1660f106a05c033c5570cecfe45ae45a648114
3
+ metadata.gz: 7ae9a071c07547c47d1e9f3ecfdfdc451e9ce235
4
+ data.tar.gz: 9271a2095a44bceedbe8b4908a6deaff0be50d19
5
5
  SHA512:
6
- metadata.gz: 97ce3e03d40b9c95fcaf322324a1efe146f2d02647671937af37030271957ab0448657e19c08223649fa03c3b9961ef10c966ddbeaf7aa1c0095e3bf6d7b363e
7
- data.tar.gz: e15c18b34e6e661565754e84004ec22e29519f759b188ca3093c466d47f4e7d2af897df0d6935fbfd77be86f32bf5b108e25b50c09ebe6d55f27950df9e21116
6
+ metadata.gz: a86709c96b0819bbfccff72ae50d27c9813e0bdc7a30a48a6c5a1c41613a3e2aec81cd8def32d96c89e29147ed6d0e5087d664e98a2fcde1fd7b3783664a25a2
7
+ data.tar.gz: 77c426dfe5eb9e7314f4a86f3d15cddae2acf5b05064427eea7e64fc343cf27532a9d439a2ffd0a5546a5597c67be64a75eba9ecdb74fb249263eb8c12d5c83c
@@ -3,7 +3,7 @@ rvm:
3
3
  - 2.1.5
4
4
  before_install: gem install bundler
5
5
  gemfile: Gemfile
6
- script: bundle exec mutant --include lib --require ruby_event_store --use rspec "RubyEventStore*"
6
+ script: make mutate
7
7
  notifications:
8
8
  slack:
9
9
  secure: qCcGv1MmryEhPoHzTvZvgSv21UcC7j2Cfq0b0hmQWuYHrHN+jhqjhg7PuElNyr0mk6N1acIcVqOAWpS20ZkG/mipW2RBBXVEc9zVR10pvJnlKDmGKd4Vmj394VgIknn8ciruglw1LoJManf1bV7/Wm4ITMt3zCQqTMGclRUqA0l/dzK2z9zU35cT4v38nTGnoGVrPQx29FvpU3J/h9qC6kGllw3Bkic2nmpFABYOI49LQFF3/vdrbnK3Zo1rudHMV0lNoPg5Ntrbd6XHXUKrBGBcZmGSh3wW/mfYf9Tcft+5MwtCu4b70KnFknx7oFmBlU8JFYg2x5f1xNSIoRkDmLI5/jNDWJ3oLAtYjgY5CdBMlxnhhfnCBmbaxEJhTuscm2sIp+S+4+ggm8x/daIK3BUaBAV5BT8An52BXhQ/F6cdnYiSVn+5lGap/1wF2TWwnN/oVc+JVfATouG9FCygzMekUaji94JMKBtS+QgoLdAE5ufEGBeDONJELRD8Lca1R4uWSg2snf93GWoONca9aJfkIfXj3m+VaoAM9Bq9DGcOXwZESkltE2E+31Fznh5qYCRH1zgtgB0Hx8x7sdaxNQyybvgNS1R0lGnIU/NrUmREcUi5BYEI5YqygBtkTZ7F/nlYQgydKjjHJ6FG3oLc3ggxffE8oAdpuxvlUQ8ZN6o=
@@ -1,5 +1,12 @@
1
1
  ### HEAD
2
2
 
3
+ ### 0.6.0 (25.05.2016)
4
+
5
+ * Ability to provide a custom dispatcher to PubSub::Broker PR #12
6
+ * Add support for projections PR #13
7
+ * Added prettier message for case of missing #handle_event method. PR #14
8
+ * Make file to run all the things PR #15
9
+
3
10
  ### 0.5.0 (21.03.2016)
4
11
 
5
12
  * Change: Event class refactoring to make default values more explicit PR #11
@@ -0,0 +1,27 @@
1
+ # Contributing to RubyEventStore
2
+
3
+ Any kind of contribution is welcomed. Here is a few guidelines that we need contributors to follow.
4
+
5
+ ## Found a bug? Have a question?
6
+
7
+ * [Create a new issue](https://github.com/arkency/ruby_event_store/issues/new), assuming one does not already exist.
8
+ * Clearly describe the issue including steps to reproduce when it is a bug.
9
+ * If possible provide a Pull Request with failing test case.
10
+
11
+ ## Getting Started
12
+
13
+ * Make sure you have a [GitHub account](https://github.com/signup/free).
14
+ * [Fork the repository](https://help.github.com/articles/fork-a-repo/) on GitHub.
15
+
16
+ ## Making Changes
17
+
18
+ * Create a feature branch from where you want to base your work.
19
+ * Do your work. Please try to keep your commits small and focussed.
20
+ * Make sure you have added the necessary tests for your changes.
21
+ * Push your changes to a feature branch in your fork of the repository.
22
+ * Submit a pull request to the RubyEventStore repository.
23
+
24
+ # Additional Resources
25
+
26
+ * [General GitHub documentation](http://help.github.com/)
27
+ * [GitHub pull request documentation](http://help.github.com/send-pull-requests/)
@@ -0,0 +1,21 @@
1
+ install-bundler: ## Install gem dependencies
2
+ @echo "Installing gem dependencies"
3
+ @bundle install
4
+
5
+ install: install-bundler ## Prepare current development environment
6
+
7
+ test: ## Run tests
8
+ @echo "Running basic tests - beware: this won't guarantee build pass"
9
+ @bundle exec rspec
10
+
11
+ mutate: test ## Run mutation tests
12
+ @echo "Running mutation tests - only 100% free mutation will be accepted"
13
+ @bundle exec mutant --include lib --require ruby_event_store --use rspec "RubyEventStore*"
14
+
15
+ .PHONY: help
16
+
17
+ help:
18
+ @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
19
+
20
+ .DEFAULT_GOAL := help
21
+
data/README.md CHANGED
@@ -2,10 +2,19 @@
2
2
  [![Gem Version](https://badge.fury.io/rb/ruby_event_store.svg)](http://badge.fury.io/rb/ruby_event_store)
3
3
  [![Code Climate](https://codeclimate.com/github/arkency/ruby_event_store/badges/gpa.svg)](https://codeclimate.com/github/arkency/ruby_event_store)
4
4
  [![Test Coverage](https://codeclimate.com/github/arkency/ruby_event_store/badges/coverage.svg)](https://codeclimate.com/github/arkency/ruby_event_store/coverage)
5
+ [![Join the chat at https://gitter.im/arkency/rails_event_store](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/arkency/rails_event_store?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5
6
 
6
7
  # RubyEventStore
7
8
 
8
- A Ruby implementation of an EventStore. It is an integral part of `rails_event_store` gem.
9
+ A Ruby implementation of an EventStore. It is an integral part of [rails_event_store](http://github.com/arkency/rails_event_store) gem.
10
+
11
+ # Documentation
12
+
13
+ All documentation and sample codes are available at [http://railseventstore.arkency.com](http://railseventstore.arkency.com)
14
+
15
+ # Contributing
16
+
17
+ Check the contribution guide on [CONTRIBUTING.md](https://github.com/arkency/ruby_event_store/blob/master/CONTRIBUTING.md)
9
18
 
10
19
  ## About
11
20
 
@@ -1,5 +1,6 @@
1
1
  require 'ruby_event_store/pub_sub/broker'
2
2
  require 'ruby_event_store/in_memory_repository'
3
+ require 'ruby_event_store/projection'
3
4
  require 'ruby_event_store/errors'
4
5
  require 'ruby_event_store/constants'
5
6
  require 'ruby_event_store/facade'
@@ -0,0 +1,56 @@
1
+ module RubyEventStore
2
+ class Projection
3
+ private_class_method :new
4
+
5
+ def self.from_stream(*streams)
6
+ raise(ArgumentError, "At least one stream must be given") if streams.empty?
7
+ new(streams)
8
+ end
9
+
10
+ def initialize(streams)
11
+ @streams = streams
12
+ @handlers = Hash.new { ->(_, _) {} }
13
+ @init = -> { Hash.new }
14
+ end
15
+
16
+ attr_reader :streams, :handlers
17
+
18
+ def init(handler)
19
+ @init = handler
20
+ self
21
+ end
22
+
23
+ def when(event, handler)
24
+ @handlers[event] = handler
25
+ self
26
+ end
27
+
28
+ def initial_state
29
+ @init.call
30
+ end
31
+
32
+ def current_state
33
+ @current_state ||= initial_state
34
+ end
35
+
36
+ def handle_event(event)
37
+ handlers[event.class].(current_state, event)
38
+ end
39
+
40
+ def handled_events
41
+ handlers.keys
42
+ end
43
+
44
+ def call(event_store)
45
+ streams.reduce(initial_state) do |state, stream|
46
+ event_store.read_stream_events_forward(stream).reduce(state, &method(:transition))
47
+ end
48
+ end
49
+
50
+ private
51
+ def transition(state, event)
52
+ handlers[event.class].(state, event)
53
+ state
54
+ end
55
+ end
56
+ end
@@ -1,10 +1,12 @@
1
1
  module RubyEventStore
2
2
  module PubSub
3
3
  class Broker
4
+ DEFAULT_DISPATCHER = ->(subscriber, event) { subscriber.handle_event(event) }
4
5
 
5
- def initialize
6
+ def initialize(dispatcher = DEFAULT_DISPATCHER)
6
7
  @subscribers = Hash.new {|hsh, key| hsh[key] = [] }
7
8
  @global_subscribers = []
9
+ @dispatcher = dispatcher
8
10
  end
9
11
 
10
12
  def add_subscriber(subscriber, event_types)
@@ -19,16 +21,16 @@ module RubyEventStore
19
21
 
20
22
  def notify_subscribers(event)
21
23
  all_subscribers_for(event.class).each do |subscriber|
22
- subscriber.handle_event(event)
24
+ dispatcher.call(subscriber, event)
23
25
  end
24
26
  end
25
27
 
26
28
  private
27
- attr_reader :subscribers
29
+ attr_reader :subscribers, :dispatcher
28
30
 
29
31
  def verify_subscriber(subscriber)
30
32
  raise SubscriberNotExist if subscriber.nil?
31
- raise MethodNotDefined unless subscriber.methods.include? :handle_event
33
+ ensure_method_defined(subscriber)
32
34
  end
33
35
 
34
36
  def subscribe(subscriber, event_types)
@@ -37,9 +39,19 @@ module RubyEventStore
37
39
  end
38
40
  end
39
41
 
42
+ def ensure_method_defined(subscriber)
43
+ unless subscriber.methods.include? :handle_event
44
+ raise MethodNotDefined.new(method_not_defined_message(subscriber))
45
+ end
46
+ end
47
+
40
48
  def all_subscribers_for(event_type)
41
49
  subscribers[event_type] + @global_subscribers
42
50
  end
51
+
52
+ def method_not_defined_message(subscriber)
53
+ "#handle_event method is not found in #{subscriber.class} subscriber. Are you sure it is a valid subscriber?"
54
+ end
43
55
  end
44
56
  end
45
57
  end
@@ -1,3 +1,3 @@
1
1
  module RubyEventStore
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_event_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - rybex
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-03-21 00:00:00.000000000 Z
12
+ date: 2016-05-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -92,7 +92,9 @@ files:
92
92
  - ".gitignore"
93
93
  - ".travis.yml"
94
94
  - CHANGELOG.md
95
+ - CONTRIBUTING.md
95
96
  - Gemfile
97
+ - Makefile
96
98
  - README.md
97
99
  - Rakefile
98
100
  - lib/ruby_event_store.rb
@@ -101,6 +103,7 @@ files:
101
103
  - lib/ruby_event_store/event.rb
102
104
  - lib/ruby_event_store/facade.rb
103
105
  - lib/ruby_event_store/in_memory_repository.rb
106
+ - lib/ruby_event_store/projection.rb
104
107
  - lib/ruby_event_store/pub_sub/broker.rb
105
108
  - lib/ruby_event_store/spec/event_repository_lint.rb
106
109
  - lib/ruby_event_store/version.rb