ruby_event_store 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/lib/ruby_event_store/errors.rb +3 -1
- data/lib/ruby_event_store/event.rb +16 -8
- data/lib/ruby_event_store/facade.rb +58 -27
- data/lib/ruby_event_store/in_memory_repository.rb +71 -0
- data/lib/ruby_event_store/spec/event_repository_lint.rb +105 -0
- data/lib/ruby_event_store/version.rb +1 -1
- data/lib/ruby_event_store.rb +1 -5
- data/ruby_event_store.gemspec +4 -4
- metadata +14 -16
- data/lib/ruby_event_store/actions/append_event_to_stream.rb +0 -32
- data/lib/ruby_event_store/actions/delete_stream_events.rb +0 -23
- data/lib/ruby_event_store/actions/read_all_events.rb +0 -22
- data/lib/ruby_event_store/actions/read_all_streams.rb +0 -21
- data/lib/ruby_event_store/actions/read_events_batch.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 029ad3dcd5fb3e1b025f0702bcb48cf0ed96e5cb
|
4
|
+
data.tar.gz: 958e78c130cc76ebffbfa341016f3f0673796d98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9039b6d85500d4635fcc2331dcae5989defa2d8f6eda64f6f4f8e0e5b501a04f483f7f74705fe4a7a7ca69ed99164b9c1f16ec3a288216a4886cc15b535a776d
|
7
|
+
data.tar.gz: 96e7bc7166c8e0bd9b86277c273a90cd8643f07360b5dbf017087f3e00606fb66706f3a5c1005cf051345c382122ec0604d9248f78ae24b3817b28b1b15ff061
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
### HEAD
|
2
|
+
|
3
|
+
### 0.3.0 (03.03.2016)
|
4
|
+
|
5
|
+
* Change: read_all_streams won't group_by results by stream name PR #4
|
6
|
+
* Change: new way of define attributes of domain event PR #5
|
7
|
+
* Change: reading forward and backward, refactored facade interface #6
|
8
|
+
* Change: in memory event repository is now part of the gem, with shared specification PR #7
|
9
|
+
|
10
|
+
### 0.2.0 (27.01.2016)
|
11
|
+
|
12
|
+
* Change: Return the event that the repository returns PR #2
|
13
|
+
|
14
|
+
### 0.1.0 (26.05.2015)
|
15
|
+
|
16
|
+
Initial version
|
@@ -3,11 +3,15 @@ require 'securerandom'
|
|
3
3
|
module RubyEventStore
|
4
4
|
class Event
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
def initialize(**args)
|
7
|
+
attributes(args).each do |key, value|
|
8
|
+
singleton_class.__send__(:define_method, key) { value }
|
9
|
+
end
|
10
|
+
|
11
|
+
@event_type = args[:event_type] || event_name
|
12
|
+
@event_id = (args[:event_id] || generate_id).to_s
|
13
|
+
@metadata = (args[:metadata] || {}).merge!(timestamp)
|
14
|
+
@data = attributes(args)
|
11
15
|
end
|
12
16
|
attr_reader :event_type, :event_id, :metadata, :data
|
13
17
|
|
@@ -15,15 +19,19 @@ module RubyEventStore
|
|
15
19
|
{
|
16
20
|
event_type: event_type,
|
17
21
|
event_id: event_id,
|
18
|
-
metadata: metadata
|
22
|
+
metadata: metadata,
|
19
23
|
data: data
|
20
24
|
}
|
21
25
|
end
|
22
26
|
|
23
27
|
private
|
24
28
|
|
25
|
-
def
|
26
|
-
{
|
29
|
+
def attributes(args)
|
30
|
+
args.reject { |k| [:event_type, :event_id, :metadata].include? k }
|
31
|
+
end
|
32
|
+
|
33
|
+
def timestamp
|
34
|
+
{ timestamp: Time.now.utc }
|
27
35
|
end
|
28
36
|
|
29
37
|
def generate_id
|
@@ -1,29 +1,55 @@
|
|
1
1
|
module RubyEventStore
|
2
2
|
class Facade
|
3
|
-
|
4
3
|
def initialize(repository)
|
5
4
|
@repository = repository
|
6
5
|
end
|
7
6
|
attr_reader :repository
|
8
7
|
|
9
8
|
def publish_event(event_data, stream_name = GLOBAL_STREAM, expected_version = nil)
|
10
|
-
|
9
|
+
event = append_to_stream(stream_name, event_data, expected_version)
|
10
|
+
event_broker.notify_subscribers(event)
|
11
|
+
end
|
12
|
+
|
13
|
+
def append_to_stream(stream_name, event_data, expected_version = nil)
|
14
|
+
raise WrongExpectedEventVersion if version_incorrect?(stream_name, expected_version)
|
15
|
+
repository.create(event_data, stream_name)
|
11
16
|
end
|
12
17
|
|
13
18
|
def delete_stream(stream_name)
|
14
|
-
|
19
|
+
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
20
|
+
repository.delete_stream(stream_name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def read_events_forward(stream_name, start, count)
|
24
|
+
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
25
|
+
page = Page.new(repository, start, count)
|
26
|
+
repository.read_events_forward(stream_name, page.start, page.count)
|
27
|
+
end
|
28
|
+
|
29
|
+
def read_events_backward(stream_name, start, count)
|
30
|
+
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
31
|
+
page = Page.new(repository, start, count)
|
32
|
+
repository.read_events_backward(stream_name, page.start, page.count)
|
33
|
+
end
|
34
|
+
|
35
|
+
def read_stream_events_forward(stream_name)
|
36
|
+
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
37
|
+
repository.read_stream_events_forward(stream_name)
|
15
38
|
end
|
16
39
|
|
17
|
-
def
|
18
|
-
|
40
|
+
def read_stream_events_backward(stream_name)
|
41
|
+
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
42
|
+
repository.read_stream_events_backward(stream_name)
|
19
43
|
end
|
20
44
|
|
21
|
-
def
|
22
|
-
|
45
|
+
def read_all_streams_forward(start, count)
|
46
|
+
page = Page.new(repository, start, count)
|
47
|
+
repository.read_all_streams_forward(page.start, page.count)
|
23
48
|
end
|
24
49
|
|
25
|
-
def
|
26
|
-
|
50
|
+
def read_all_streams_backward(start, count)
|
51
|
+
page = Page.new(repository, start, count)
|
52
|
+
repository.read_all_streams_backward(page.start, page.count)
|
27
53
|
end
|
28
54
|
|
29
55
|
def subscribe(subscriber, event_types)
|
@@ -36,29 +62,34 @@ module RubyEventStore
|
|
36
62
|
|
37
63
|
private
|
38
64
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
65
|
+
class Page
|
66
|
+
def initialize(repository, start, count)
|
67
|
+
if start.instance_of?(Symbol)
|
68
|
+
raise InvalidPageStart unless [:head].include?(start)
|
69
|
+
else
|
70
|
+
start = start.to_s
|
71
|
+
raise InvalidPageStart if start.empty?
|
72
|
+
raise EventNotFound unless repository.has_event?(start)
|
73
|
+
end
|
74
|
+
raise InvalidPageSize unless count > 0
|
75
|
+
@start = start
|
76
|
+
@count = count
|
77
|
+
end
|
78
|
+
attr_reader :start, :count
|
50
79
|
end
|
51
80
|
|
52
|
-
def
|
53
|
-
|
81
|
+
def event_broker
|
82
|
+
@event_broker ||= PubSub::Broker.new
|
54
83
|
end
|
55
84
|
|
56
|
-
def
|
57
|
-
|
85
|
+
def version_incorrect?(stream_name, expected_version)
|
86
|
+
unless expected_version.nil?
|
87
|
+
find_last_event_version(stream_name) != expected_version
|
88
|
+
end
|
58
89
|
end
|
59
90
|
|
60
|
-
def
|
61
|
-
|
91
|
+
def find_last_event_version(stream_name)
|
92
|
+
repository.last_stream_event(stream_name).event_id
|
62
93
|
end
|
63
94
|
end
|
64
|
-
end
|
95
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
module RubyEventStore
|
4
|
+
class InMemoryRepository
|
5
|
+
def initialize
|
6
|
+
@all = Array.new
|
7
|
+
@streams = Hash.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def create(event, stream_name)
|
11
|
+
stream = read_stream_events_forward(stream_name)
|
12
|
+
all.push(event)
|
13
|
+
stream.push(event)
|
14
|
+
streams[stream_name] = stream
|
15
|
+
event
|
16
|
+
end
|
17
|
+
|
18
|
+
def delete_stream(stream_name)
|
19
|
+
removed = read_stream_events_forward(stream_name).map(&:event_id)
|
20
|
+
streams.delete(stream_name)
|
21
|
+
all.delete_if{|ev| removed.include?(ev.event_id)}
|
22
|
+
end
|
23
|
+
|
24
|
+
def has_event?(event_id)
|
25
|
+
all.any?{ |item| item.event_id.eql?(event_id) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def last_stream_event(stream_name)
|
29
|
+
read_stream_events_forward(stream_name).last
|
30
|
+
end
|
31
|
+
|
32
|
+
def read_events_forward(stream_name, start_event_id, count)
|
33
|
+
source = read_stream_events_forward(stream_name)
|
34
|
+
read_batch(source, start_event_id, count)
|
35
|
+
end
|
36
|
+
|
37
|
+
def read_events_backward(stream_name, start_event_id, count)
|
38
|
+
source = read_stream_events_backward(stream_name)
|
39
|
+
read_batch(source, start_event_id, count)
|
40
|
+
end
|
41
|
+
|
42
|
+
def read_stream_events_forward(stream_name)
|
43
|
+
streams[stream_name] || Array.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def read_stream_events_backward(stream_name)
|
47
|
+
read_stream_events_forward(stream_name).reverse
|
48
|
+
end
|
49
|
+
|
50
|
+
def read_all_streams_forward(start_event_id, count)
|
51
|
+
read_batch(all, start_event_id, count)
|
52
|
+
end
|
53
|
+
|
54
|
+
def read_all_streams_backward(start_event_id, count)
|
55
|
+
read_batch(all.reverse, start_event_id, count)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
attr_accessor :streams, :all
|
60
|
+
|
61
|
+
def read_batch(source, start_event_id, count)
|
62
|
+
return source[0..count-1] if start_event_id.equal?(:head)
|
63
|
+
start_index = index_of(source, start_event_id)
|
64
|
+
source[start_index+1..start_index+count]
|
65
|
+
end
|
66
|
+
|
67
|
+
def index_of(source, event_id)
|
68
|
+
source.index{ |item| item.event_id.eql?(event_id) }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
RSpec.shared_examples :event_repository do |repository_class|
|
2
|
+
TestDomainEvent = Class.new(RubyEventStore::Event)
|
3
|
+
subject(:repository) { repository_class.new }
|
4
|
+
|
5
|
+
it 'just created is empty' do
|
6
|
+
expect(repository.read_all_streams_forward(:head, 1)).to be_empty
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'what you get is what you gave' do
|
10
|
+
created = repository.create(event = TestDomainEvent.new, 'stream')
|
11
|
+
expect(created.object_id).to eq event.object_id
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'created event is stored in given stream' do
|
15
|
+
expected_event = {event_type: 'TestDomainEvent', data: {}}
|
16
|
+
created = repository.create(TestDomainEvent.new, 'stream')
|
17
|
+
expect_to_be_like_event(created, expected_event)
|
18
|
+
expect_to_be_like_event(repository.read_all_streams_forward(:head, 1).first, expected_event)
|
19
|
+
expect_to_be_like_event(repository.read_stream_events_forward('stream').first, expected_event)
|
20
|
+
expect(repository.read_stream_events_forward('other_stream')).to be_empty
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'does not have deleted streams' do
|
24
|
+
repository.create(TestDomainEvent.new, 'stream')
|
25
|
+
repository.create(TestDomainEvent.new, 'other_stream')
|
26
|
+
|
27
|
+
expect(repository.read_stream_events_forward('stream').count).to eq 1
|
28
|
+
expect(repository.read_stream_events_forward('other_stream').count).to eq 1
|
29
|
+
expect(repository.read_all_streams_forward(:head, 10).count).to eq 2
|
30
|
+
|
31
|
+
repository.delete_stream('stream')
|
32
|
+
expect(repository.read_stream_events_forward('stream')).to be_empty
|
33
|
+
expect(repository.read_stream_events_forward('other_stream').count).to eq 1
|
34
|
+
expect(repository.read_all_streams_forward(:head, 10).count).to eq 1
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'has or has not domain event' do
|
38
|
+
repository.create(TestDomainEvent.new(event_id: 'just an id'), 'stream')
|
39
|
+
|
40
|
+
expect(repository.has_event?('just an id')).to be_truthy
|
41
|
+
expect(repository.has_event?('any other id')).to be_falsey
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'knows last event in stream' do
|
45
|
+
repository.create(TestDomainEvent.new(event_id: 'event 1'), 'stream')
|
46
|
+
repository.create(TestDomainEvent.new(event_id: 'event 2'), 'stream')
|
47
|
+
|
48
|
+
expect(repository.last_stream_event('stream').event_id).to eq('event 2')
|
49
|
+
expect(repository.last_stream_event('other_stream')).to be_nil
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'reads batch of events from stream forward & backward' do
|
53
|
+
event_ids = (1..10).to_a.map(&:to_s)
|
54
|
+
event_ids.each do |id|
|
55
|
+
repository.create(TestDomainEvent.new(event_id: id), 'stream')
|
56
|
+
end
|
57
|
+
|
58
|
+
expect(repository.read_events_forward('stream', :head, 3).map(&:event_id)).to eq ['1','2','3']
|
59
|
+
expect(repository.read_events_forward('stream', :head, 100).map(&:event_id)).to eq event_ids
|
60
|
+
expect(repository.read_events_forward('stream', '5', 4).map(&:event_id)).to eq ['6','7','8','9']
|
61
|
+
expect(repository.read_events_forward('stream', '5', 100).map(&:event_id)).to eq ['6','7','8','9','10']
|
62
|
+
|
63
|
+
expect(repository.read_events_backward('stream', :head, 3).map(&:event_id)).to eq ['10','9','8']
|
64
|
+
expect(repository.read_events_backward('stream', :head, 100).map(&:event_id)).to eq event_ids.reverse
|
65
|
+
expect(repository.read_events_backward('stream', '5', 4).map(&:event_id)).to eq ['4','3','2','1']
|
66
|
+
expect(repository.read_events_backward('stream', '5', 100).map(&:event_id)).to eq ['4','3','2','1']
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
it 'reads all stream events forward & backward' do
|
71
|
+
repository.create(TestDomainEvent.new(event_id: '1'), 'stream')
|
72
|
+
repository.create(TestDomainEvent.new(event_id: '2'), 'other_stream')
|
73
|
+
repository.create(TestDomainEvent.new(event_id: '3'), 'stream')
|
74
|
+
repository.create(TestDomainEvent.new(event_id: '4'), 'other_stream')
|
75
|
+
repository.create(TestDomainEvent.new(event_id: '5'), 'other_stream')
|
76
|
+
|
77
|
+
expect(repository.read_stream_events_forward('stream').map(&:event_id)).to eq ['1','3']
|
78
|
+
expect(repository.read_stream_events_backward('stream').map(&:event_id)).to eq ['3','1']
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'reads batch of events from all streams forward & backward' do
|
82
|
+
event_ids = (1..10).to_a.map(&:to_s)
|
83
|
+
event_ids.each do |id|
|
84
|
+
repository.create(TestDomainEvent.new(event_id: id), SecureRandom.uuid)
|
85
|
+
end
|
86
|
+
|
87
|
+
expect(repository.read_all_streams_forward(:head, 3).map(&:event_id)).to eq ['1','2','3']
|
88
|
+
expect(repository.read_all_streams_forward(:head, 100).map(&:event_id)).to eq event_ids
|
89
|
+
expect(repository.read_all_streams_forward('5', 4).map(&:event_id)).to eq ['6','7','8','9']
|
90
|
+
expect(repository.read_all_streams_forward('5', 100).map(&:event_id)).to eq ['6','7','8','9','10']
|
91
|
+
|
92
|
+
expect(repository.read_all_streams_backward(:head, 3).map(&:event_id)).to eq ['10','9','8']
|
93
|
+
expect(repository.read_all_streams_backward(:head, 100).map(&:event_id)).to eq event_ids.reverse
|
94
|
+
expect(repository.read_all_streams_backward('5', 4).map(&:event_id)).to eq ['4','3','2','1']
|
95
|
+
expect(repository.read_all_streams_backward('5', 100).map(&:event_id)).to eq ['4','3','2','1']
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def expect_to_be_like_event(actual, expected)
|
101
|
+
expect(actual.event_type).to eq expected[:event_type]
|
102
|
+
expect(actual.data).to eq expected[:data]
|
103
|
+
if expected.key? :event_id then expect(actual.event_id).to eq expected[:event_id] else true end
|
104
|
+
end
|
105
|
+
end
|
data/lib/ruby_event_store.rb
CHANGED
@@ -1,9 +1,5 @@
|
|
1
|
-
require 'ruby_event_store/actions/append_event_to_stream'
|
2
|
-
require 'ruby_event_store/actions/read_all_events'
|
3
|
-
require 'ruby_event_store/actions/read_events_batch'
|
4
|
-
require 'ruby_event_store/actions/delete_stream_events'
|
5
|
-
require 'ruby_event_store/actions/read_all_streams'
|
6
1
|
require 'ruby_event_store/pub_sub/broker'
|
2
|
+
require 'ruby_event_store/in_memory_repository'
|
7
3
|
require 'ruby_event_store/errors'
|
8
4
|
require 'ruby_event_store/constants'
|
9
5
|
require 'ruby_event_store/facade'
|
data/ruby_event_store.gemspec
CHANGED
@@ -9,9 +9,9 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["rybex", "mpraglowski"]
|
10
10
|
spec.email = ["tomek.rybka@gmail.com", "m@praglowski.com"]
|
11
11
|
|
12
|
-
spec.summary = %q{
|
12
|
+
spec.summary = %q{Event Store in Ruby}
|
13
13
|
spec.description = %q{Implementation of Event Store in Ruby}
|
14
|
-
spec.homepage = ''
|
14
|
+
spec.homepage = 'https://github.com/arkency/ruby_event_store'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
17
|
spec.bindir = "exe"
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.8"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
-
spec.add_development_dependency 'rspec'
|
24
|
-
spec.add_development_dependency 'pry'
|
23
|
+
spec.add_development_dependency 'rspec', "~> 3.2"
|
24
|
+
spec.add_development_dependency 'pry', "~> 0"
|
25
25
|
spec.add_development_dependency 'mutant-rspec', '~> 0.7.9'
|
26
26
|
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.
|
4
|
+
version: 0.3.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-
|
12
|
+
date: 2016-03-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -43,28 +43,28 @@ dependencies:
|
|
43
43
|
name: rspec
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '
|
48
|
+
version: '3.2'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - "
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '
|
55
|
+
version: '3.2'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: pry
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- - "
|
60
|
+
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '0'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- - "
|
67
|
+
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
- !ruby/object:Gem::Dependency
|
@@ -91,23 +91,21 @@ extra_rdoc_files: []
|
|
91
91
|
files:
|
92
92
|
- ".gitignore"
|
93
93
|
- ".travis.yml"
|
94
|
+
- CHANGELOG.md
|
94
95
|
- Gemfile
|
95
96
|
- README.md
|
96
97
|
- Rakefile
|
97
98
|
- lib/ruby_event_store.rb
|
98
|
-
- lib/ruby_event_store/actions/append_event_to_stream.rb
|
99
|
-
- lib/ruby_event_store/actions/delete_stream_events.rb
|
100
|
-
- lib/ruby_event_store/actions/read_all_events.rb
|
101
|
-
- lib/ruby_event_store/actions/read_all_streams.rb
|
102
|
-
- lib/ruby_event_store/actions/read_events_batch.rb
|
103
99
|
- lib/ruby_event_store/constants.rb
|
104
100
|
- lib/ruby_event_store/errors.rb
|
105
101
|
- lib/ruby_event_store/event.rb
|
106
102
|
- lib/ruby_event_store/facade.rb
|
103
|
+
- lib/ruby_event_store/in_memory_repository.rb
|
107
104
|
- lib/ruby_event_store/pub_sub/broker.rb
|
105
|
+
- lib/ruby_event_store/spec/event_repository_lint.rb
|
108
106
|
- lib/ruby_event_store/version.rb
|
109
107
|
- ruby_event_store.gemspec
|
110
|
-
homepage:
|
108
|
+
homepage: https://github.com/arkency/ruby_event_store
|
111
109
|
licenses: []
|
112
110
|
metadata: {}
|
113
111
|
post_install_message:
|
@@ -126,8 +124,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
124
|
version: '0'
|
127
125
|
requirements: []
|
128
126
|
rubyforge_project:
|
129
|
-
rubygems_version: 2.2.
|
127
|
+
rubygems_version: 2.2.3
|
130
128
|
signing_key:
|
131
129
|
specification_version: 4
|
132
|
-
summary:
|
130
|
+
summary: Event Store in Ruby
|
133
131
|
test_files: []
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module RubyEventStore
|
2
|
-
module Actions
|
3
|
-
class AppendEventToStream
|
4
|
-
|
5
|
-
def initialize(repository)
|
6
|
-
@repository = repository
|
7
|
-
end
|
8
|
-
|
9
|
-
def call(stream_name, event, expected_version)
|
10
|
-
raise WrongExpectedEventVersion if version_incorrect?(stream_name, expected_version)
|
11
|
-
save_event(event, stream_name)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
attr_reader :repository
|
16
|
-
|
17
|
-
def version_incorrect?(stream_name, expected_version)
|
18
|
-
unless expected_version.nil?
|
19
|
-
find_last_event_version(stream_name) != expected_version
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def find_last_event_version(stream_name)
|
24
|
-
repository.last_stream_event(stream_name).event_id
|
25
|
-
end
|
26
|
-
|
27
|
-
def save_event(event, stream_name)
|
28
|
-
repository.create(event.to_h.merge!(stream: stream_name))
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module RubyEventStore
|
2
|
-
module Actions
|
3
|
-
class DeleteStreamEvents
|
4
|
-
|
5
|
-
def initialize(repository)
|
6
|
-
@repository = repository
|
7
|
-
end
|
8
|
-
|
9
|
-
def call(stream_name)
|
10
|
-
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
11
|
-
delete_stream(stream_name)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
attr_reader :repository
|
16
|
-
|
17
|
-
def delete_stream(stream_name)
|
18
|
-
repository.delete({stream: stream_name})
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module RubyEventStore
|
2
|
-
module Actions
|
3
|
-
class ReadAllEvents
|
4
|
-
|
5
|
-
def initialize(repository)
|
6
|
-
@repository = repository
|
7
|
-
end
|
8
|
-
|
9
|
-
def call(stream_name)
|
10
|
-
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
11
|
-
get_all_events(stream_name)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
attr_reader :repository
|
16
|
-
|
17
|
-
def get_all_events(stream_name)
|
18
|
-
repository.load_all_events_forward(stream_name)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module RubyEventStore
|
2
|
-
module Actions
|
3
|
-
class ReadAllStreams
|
4
|
-
|
5
|
-
def initialize(repository)
|
6
|
-
@repository = repository
|
7
|
-
end
|
8
|
-
|
9
|
-
def call
|
10
|
-
get_all_events.group_by { |event| event.stream }
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
attr_reader :repository
|
15
|
-
|
16
|
-
def get_all_events
|
17
|
-
repository.get_all_events
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module RubyEventStore
|
2
|
-
module Actions
|
3
|
-
class ReadEventsBatch
|
4
|
-
|
5
|
-
def initialize(repository)
|
6
|
-
@repository = repository
|
7
|
-
end
|
8
|
-
|
9
|
-
def call(stream_name, start, count)
|
10
|
-
raise IncorrectStreamData if stream_name.nil? || stream_name.empty?
|
11
|
-
event = find_event(start)
|
12
|
-
get_events_batch(stream_name, event.id, count)
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
attr_reader :repository
|
17
|
-
|
18
|
-
def get_events_batch(stream_name, start, count)
|
19
|
-
repository.load_events_batch(stream_name, start, count)
|
20
|
-
end
|
21
|
-
|
22
|
-
def find_event(start)
|
23
|
-
event = repository.find({event_id: start})
|
24
|
-
raise EventNotFound if event.nil?
|
25
|
-
event
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|