ruby_event_store 0.33.0 → 0.34.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ruby_event_store/batch_enumerator.rb +8 -0
- data/lib/ruby_event_store/client.rb +1 -1
- data/lib/ruby_event_store/deprecated_read_api_rewriter.rb +1 -1
- data/lib/ruby_event_store/errors.rb +12 -10
- data/lib/ruby_event_store/event.rb +2 -2
- data/lib/ruby_event_store/in_memory_repository.rb +2 -1
- data/lib/ruby_event_store/mappers/default.rb +6 -1
- data/lib/ruby_event_store/mappers/protobuf.rb +10 -8
- data/lib/ruby_event_store/spec/event_repository_lint.rb +39 -8
- data/lib/ruby_event_store/specification.rb +23 -5
- data/lib/ruby_event_store/specification_result.rb +23 -4
- data/lib/ruby_event_store/version.rb +1 -1
- data/ruby_event_store.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 212817e54f12a8231a77260d38f5c41980d0e0c4d465ac3fae5ef49fb5b5301d
|
4
|
+
data.tar.gz: c24731e1641aa7874d8417acda1550cd182df6d24c79f2f0906bdbb17b0e8e8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d13612719037ba3a5e703f9eb34280968957056a5bd4f53c169817cdeec59c1965c984aeb322843f826e7baa875cd25690f7073900718a0ae2c86fd747d0718e
|
7
|
+
data.tar.gz: eb230b36b3103386bbe315765a165842d1bc287400f6543f8c9b0625a42c7e85e9cbb8583b4fd8897f3429e26bdb021243aac6954802155d8417e37fd8f57063
|
@@ -255,7 +255,7 @@ module RubyEventStore
|
|
255
255
|
#
|
256
256
|
# @example Add data and metadata to existing events
|
257
257
|
#
|
258
|
-
# events = event_store.read.limit(10).
|
258
|
+
# events = event_store.read.limit(10).to_a
|
259
259
|
# events.each do |ev|
|
260
260
|
# ev.data[:tenant_id] = 1
|
261
261
|
# ev.metadata[:server_id] = "eu-west-2"
|
@@ -1,17 +1,19 @@
|
|
1
1
|
module RubyEventStore
|
2
|
-
WrongExpectedEventVersion
|
3
|
-
InvalidExpectedVersion
|
4
|
-
IncorrectStreamData
|
5
|
-
SubscriberNotExist
|
6
|
-
InvalidPageStart
|
7
|
-
InvalidPageSize
|
8
|
-
EventDuplicatedInStream
|
9
|
-
NotSupported
|
10
|
-
ReservedInternalName
|
11
|
-
InvalidHandler
|
2
|
+
WrongExpectedEventVersion = Class.new(StandardError)
|
3
|
+
InvalidExpectedVersion = Class.new(StandardError)
|
4
|
+
IncorrectStreamData = Class.new(StandardError)
|
5
|
+
SubscriberNotExist = Class.new(StandardError)
|
6
|
+
InvalidPageStart = Class.new(ArgumentError)
|
7
|
+
InvalidPageSize = Class.new(ArgumentError)
|
8
|
+
EventDuplicatedInStream = Class.new(StandardError)
|
9
|
+
NotSupported = Class.new(StandardError)
|
10
|
+
ReservedInternalName = Class.new(StandardError)
|
11
|
+
InvalidHandler = Class.new(StandardError)
|
12
|
+
ProtobufEncodingFailed = Class.new(StandardError)
|
12
13
|
|
13
14
|
class EventNotFound < StandardError
|
14
15
|
attr_reader :event_id
|
16
|
+
|
15
17
|
def initialize(event_id)
|
16
18
|
super("Event not found: #{event_id}")
|
17
19
|
@event_id = event_id
|
@@ -12,10 +12,10 @@ module RubyEventStore
|
|
12
12
|
# part of your domain such as remote_ip, request_id, correlation_id,
|
13
13
|
# causation_id etc.
|
14
14
|
# @return [Event]
|
15
|
-
def initialize(event_id: SecureRandom.uuid, metadata: nil, data:
|
15
|
+
def initialize(event_id: SecureRandom.uuid, metadata: nil, data: {})
|
16
16
|
@event_id = event_id.to_s
|
17
17
|
@metadata = Metadata.new(metadata.to_h)
|
18
|
-
@data = data
|
18
|
+
@data = data
|
19
19
|
end
|
20
20
|
|
21
21
|
attr_reader :event_id, :metadata, :data
|
@@ -34,6 +34,7 @@ module RubyEventStore
|
|
34
34
|
def read(spec)
|
35
35
|
events = spec.stream.global? ? global : stream_of(spec.stream.name)
|
36
36
|
events = events.select{|e| spec.with_ids.any?{|x| x.eql?(e.event_id)}} if spec.with_ids?
|
37
|
+
events = events.select{|e| spec.with_types.any?{|x| x.eql?(e.event_type)}} if spec.with_types?
|
37
38
|
events = events.reverse if spec.backward?
|
38
39
|
events = events.drop(index_of(events, spec.start) + 1) unless spec.head?
|
39
40
|
events = events[0...spec.limit] if spec.limit?
|
@@ -62,7 +63,7 @@ module RubyEventStore
|
|
62
63
|
|
63
64
|
def streams_of(event_id)
|
64
65
|
streams.select do |_, stream_events|
|
65
|
-
stream_events.any? { |event| event.event_id.
|
66
|
+
stream_events.any? { |event| event.event_id.eql?(event_id) }
|
66
67
|
end.map { |name, _| Stream.new(name) }
|
67
68
|
end
|
68
69
|
|
@@ -21,7 +21,7 @@ module RubyEventStore
|
|
21
21
|
event_type = events_class_remapping.fetch(record.event_type) { record.event_type }
|
22
22
|
Object.const_get(event_type).new(
|
23
23
|
event_id: record.event_id,
|
24
|
-
metadata: serializer.load(record.metadata),
|
24
|
+
metadata: symbolize(serializer.load(record.metadata)),
|
25
25
|
data: serializer.load(record.data)
|
26
26
|
)
|
27
27
|
end
|
@@ -30,6 +30,11 @@ module RubyEventStore
|
|
30
30
|
|
31
31
|
attr_reader :serializer, :events_class_remapping
|
32
32
|
|
33
|
+
def symbolize(hash)
|
34
|
+
hash.each_with_object({}) do |(k, v), memo|
|
35
|
+
memo[k.to_sym] = v
|
36
|
+
end
|
37
|
+
end
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
@@ -1,11 +1,5 @@
|
|
1
1
|
module RubyEventStore
|
2
2
|
class Proto < RubyEventStore::Event
|
3
|
-
def initialize(event_id: SecureRandom.uuid, metadata: nil, data:)
|
4
|
-
@event_id = event_id
|
5
|
-
@metadata = Metadata.new(metadata.to_h)
|
6
|
-
@data = data
|
7
|
-
end
|
8
|
-
|
9
3
|
def type
|
10
4
|
data.class.descriptor.name
|
11
5
|
end
|
@@ -47,8 +41,8 @@ module RubyEventStore
|
|
47
41
|
def event_to_serialized_record(domain_event)
|
48
42
|
SerializedRecord.new(
|
49
43
|
event_id: domain_event.event_id,
|
50
|
-
metadata: ProtobufNestedStruct::HashMapStringValue.dump(domain_event.metadata.each_with_object({}){|(k,v),h| h[k.to_s] =v
|
51
|
-
data:
|
44
|
+
metadata: ProtobufNestedStruct::HashMapStringValue.dump(domain_event.metadata.each_with_object({}) {|(k, v), h| h[k.to_s] = v}),
|
45
|
+
data: encode_data(domain_event.data),
|
52
46
|
event_type: domain_event.type
|
53
47
|
)
|
54
48
|
end
|
@@ -76,6 +70,14 @@ module RubyEventStore
|
|
76
70
|
Google::Protobuf::DescriptorPool.generated_pool.lookup(event_type).msgclass.decode(protobuf_data)
|
77
71
|
end
|
78
72
|
|
73
|
+
def encode_data(domain_event_data)
|
74
|
+
begin
|
75
|
+
domain_event_data.class.encode(domain_event_data)
|
76
|
+
rescue NoMethodError
|
77
|
+
raise ProtobufEncodingFailed
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
79
81
|
def require_optional_dependency
|
80
82
|
require 'protobuf_nested_struct'
|
81
83
|
rescue LoadError
|
@@ -15,6 +15,13 @@ module RubyEventStore
|
|
15
15
|
)
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
# @private
|
20
|
+
Type1 = Class.new(RubyEventStore::Event)
|
21
|
+
# @private
|
22
|
+
Type2 = Class.new(RubyEventStore::Event)
|
23
|
+
# @private
|
24
|
+
Type3 = Class.new(RubyEventStore::Event)
|
18
25
|
end
|
19
26
|
|
20
27
|
module RubyEventStore
|
@@ -983,6 +990,17 @@ module RubyEventStore
|
|
983
990
|
)
|
984
991
|
end
|
985
992
|
|
993
|
+
specify do
|
994
|
+
expect(repository.read(specification.in_batches.result)).to be_kind_of(Enumerator)
|
995
|
+
events = Array.new(10) { SRecord.new }
|
996
|
+
repository.append_to_stream(
|
997
|
+
events,
|
998
|
+
Stream.new("Dummy"),
|
999
|
+
ExpectedVersion.none
|
1000
|
+
)
|
1001
|
+
expect(repository.read(specification.in_batches.result)).to be_kind_of(Enumerator)
|
1002
|
+
end
|
1003
|
+
|
986
1004
|
specify do
|
987
1005
|
events = Array.new(400) { SRecord.new }
|
988
1006
|
repository.append_to_stream(
|
@@ -1157,10 +1175,9 @@ module RubyEventStore
|
|
1157
1175
|
|
1158
1176
|
specify do
|
1159
1177
|
skip unless test_link_events_to_stream
|
1160
|
-
event_1 = SRecord.new
|
1161
|
-
event_2 = SRecord.new
|
1162
|
-
event_3 = SRecord.new
|
1163
|
-
event_4 = SRecord.new
|
1178
|
+
event_1 = SRecord.new(event_id: '8a6f053e-3ce2-4c82-a55b-4d02c66ae6ea')
|
1179
|
+
event_2 = SRecord.new(event_id: '8cee1139-4f96-483a-a175-2b947283c3c7')
|
1180
|
+
event_3 = SRecord.new(event_id: 'd345f86d-b903-4d78-803f-38990c078d9e')
|
1164
1181
|
stream_a = Stream.new('Stream A')
|
1165
1182
|
stream_b = Stream.new('Stream B')
|
1166
1183
|
stream_c = Stream.new('Stream C')
|
@@ -1168,10 +1185,10 @@ module RubyEventStore
|
|
1168
1185
|
repository.append_to_stream([event_3], stream_b, version_any)
|
1169
1186
|
repository.link_to_stream(event_1.event_id, stream_c, version_none)
|
1170
1187
|
|
1171
|
-
expect(repository.streams_of(
|
1172
|
-
expect(repository.streams_of(
|
1173
|
-
expect(repository.streams_of(
|
1174
|
-
expect(repository.streams_of(
|
1188
|
+
expect(repository.streams_of('8a6f053e-3ce2-4c82-a55b-4d02c66ae6ea')).to eq [stream_a, stream_c]
|
1189
|
+
expect(repository.streams_of('8cee1139-4f96-483a-a175-2b947283c3c7')).to eq [stream_a]
|
1190
|
+
expect(repository.streams_of('d345f86d-b903-4d78-803f-38990c078d9e')).to eq [stream_b]
|
1191
|
+
expect(repository.streams_of('d10c8fe9-2163-418d-ba47-88c9a1f9391b')).to eq []
|
1175
1192
|
end
|
1176
1193
|
|
1177
1194
|
specify do
|
@@ -1194,6 +1211,20 @@ module RubyEventStore
|
|
1194
1211
|
'8a6f053e-3ce2-4c82-a55b-4d02c66ae6ea',
|
1195
1212
|
'd345f86d-b903-4d78-803f-38990c078d9e'
|
1196
1213
|
]).in_batches.result).to_a[0]).to eq([e1,e3])
|
1214
|
+
expect(repository.read(specification.with_id([]).result).to_a).to eq([])
|
1215
|
+
end
|
1216
|
+
|
1217
|
+
specify do
|
1218
|
+
e1 = SRecord.new(event_type: Type1.to_s)
|
1219
|
+
e2 = SRecord.new(event_type: Type2.to_s)
|
1220
|
+
e3 = SRecord.new(event_type: Type1.to_s)
|
1221
|
+
stream = Stream.new('Stream A')
|
1222
|
+
repository.append_to_stream([e1, e2, e3], stream, version_any)
|
1223
|
+
|
1224
|
+
expect(repository.read(specification.of_type([Type1]).result).to_a).to eq([e1,e3])
|
1225
|
+
expect(repository.read(specification.of_type([Type2]).result).to_a).to eq([e2])
|
1226
|
+
expect(repository.read(specification.of_type([Type3]).result).to_a).to eq([])
|
1227
|
+
expect(repository.read(specification.of_type([Type1, Type2, Type3]).result).to_a).to eq([e1,e2,e3])
|
1197
1228
|
end
|
1198
1229
|
end
|
1199
1230
|
end
|
@@ -91,6 +91,15 @@ module RubyEventStore
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
# Executes the query based on the specification built up to this point.
|
95
|
+
# Returns array of domain events.
|
96
|
+
# {http://railseventstore.org/docs/read/ Find out more}.
|
97
|
+
#
|
98
|
+
# @return [Array<Event, Proto>]
|
99
|
+
def to_a
|
100
|
+
each.to_a
|
101
|
+
end
|
102
|
+
|
94
103
|
# Specifies that events should be obtained in batches.
|
95
104
|
# {http://railseventstore.org/docs/read/ Find out more}.
|
96
105
|
#
|
@@ -143,6 +152,15 @@ module RubyEventStore
|
|
143
152
|
reader.one(read_last.result)
|
144
153
|
end
|
145
154
|
|
155
|
+
# Limits the query to certain event types.
|
156
|
+
# {http://railseventstore.org/docs/read/ Find out more}.
|
157
|
+
#
|
158
|
+
# @types [Array(Class)] types of event to look for.
|
159
|
+
# @return [Specification]
|
160
|
+
def of_type(types)
|
161
|
+
Specification.new(reader, result.dup{ |r| r.with_types = types })
|
162
|
+
end
|
163
|
+
|
146
164
|
# Limits the query to certain events by given even ids.
|
147
165
|
# {http://railseventstore.org/docs/read/ Find out more}.
|
148
166
|
#
|
@@ -152,7 +170,7 @@ module RubyEventStore
|
|
152
170
|
Specification.new(reader, result.dup{ |r| r.with_ids = event_ids })
|
153
171
|
end
|
154
172
|
|
155
|
-
#
|
173
|
+
# Reads single event from repository.
|
156
174
|
# Returns the event with specified id or nil if event is not found
|
157
175
|
# in specified collection of events.
|
158
176
|
# {http://railseventstore.org/docs/read/ Find out more}.
|
@@ -162,8 +180,8 @@ module RubyEventStore
|
|
162
180
|
reader.one(read_first.with_id([event_id]).result)
|
163
181
|
end
|
164
182
|
|
165
|
-
#
|
166
|
-
# Returns the event with specified id or raises [EventNotFound
|
183
|
+
# Reads single existing event from repository.
|
184
|
+
# Returns the event with specified id or raises [EventNotFound] error if
|
167
185
|
# event is not found in specified collection of events.
|
168
186
|
# {http://railseventstore.org/docs/read/ Find out more}.
|
169
187
|
#
|
@@ -172,13 +190,13 @@ module RubyEventStore
|
|
172
190
|
event(event_id) or raise EventNotFound.new(event_id)
|
173
191
|
end
|
174
192
|
|
175
|
-
#
|
193
|
+
# Reads all events of given ids from repository.
|
176
194
|
# Yields each event (found by id in specified collection of events)
|
177
195
|
# read from the store if block given. Otherwise, returns enumerable collection.
|
178
196
|
# {http://railseventstore.org/docs/read/ Find out more}.
|
179
197
|
#
|
180
198
|
# @yield [Event, Proto] event
|
181
|
-
# @return [Enumerator
|
199
|
+
# @return [Enumerator] Enumerator is returned when block not given
|
182
200
|
def events(event_ids)
|
183
201
|
with_id(event_ids).each
|
184
202
|
end
|
@@ -6,9 +6,10 @@ module RubyEventStore
|
|
6
6
|
stream: Stream.new(GLOBAL_STREAM),
|
7
7
|
read_as: :all,
|
8
8
|
batch_size: Specification::DEFAULT_BATCH_SIZE,
|
9
|
-
with_ids: nil
|
10
|
-
|
11
|
-
|
9
|
+
with_ids: nil,
|
10
|
+
with_types: nil)
|
11
|
+
@attributes = Struct.new(:direction, :start, :count, :stream, :read_as, :batch_size, :with_ids, :with_types)
|
12
|
+
.new(direction, start, count, stream, read_as, batch_size, with_ids, with_types)
|
12
13
|
freeze
|
13
14
|
end
|
14
15
|
|
@@ -89,7 +90,23 @@ module RubyEventStore
|
|
89
90
|
#
|
90
91
|
# @return [Boolean]
|
91
92
|
def with_ids?
|
92
|
-
!
|
93
|
+
!with_ids.nil?
|
94
|
+
end
|
95
|
+
|
96
|
+
# Event types to be read (if any given)
|
97
|
+
# {http://railseventstore.org/docs/read/ Find out more}.
|
98
|
+
#
|
99
|
+
# @return [Array|nil]
|
100
|
+
def with_types
|
101
|
+
attributes.with_types&.map(&:to_s)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Read by specified event types. True if event types have been specified.
|
105
|
+
# {http://railseventstore.org/docs/read/ Find out more}.
|
106
|
+
#
|
107
|
+
# @return [Boolean]
|
108
|
+
def with_types?
|
109
|
+
!(with_types || []).empty?
|
93
110
|
end
|
94
111
|
|
95
112
|
# Read strategy. True if items will be read in batches
|
@@ -163,6 +180,7 @@ module RubyEventStore
|
|
163
180
|
# * read_as
|
164
181
|
# * batch_size
|
165
182
|
# * with_ids
|
183
|
+
# * with_types
|
166
184
|
#
|
167
185
|
# @return [Integer]
|
168
186
|
def hash
|
@@ -175,6 +193,7 @@ module RubyEventStore
|
|
175
193
|
attributes.read_as,
|
176
194
|
batch_size,
|
177
195
|
with_ids,
|
196
|
+
with_types,
|
178
197
|
].hash ^ BIG_VALUE
|
179
198
|
end
|
180
199
|
|
data/ruby_event_store.gemspec
CHANGED
@@ -30,7 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
31
31
|
spec.add_development_dependency 'rake', '~> 10.0'
|
32
32
|
spec.add_development_dependency 'rspec', '~> 3.6'
|
33
|
-
spec.add_development_dependency 'mutant-rspec', '
|
33
|
+
spec.add_development_dependency 'mutant-rspec', '= 0.8.17'
|
34
34
|
spec.add_development_dependency 'parser'
|
35
35
|
spec.add_development_dependency 'unparser'
|
36
36
|
spec.add_development_dependency 'astrolabe'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
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.34.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arkency
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -70,14 +70,14 @@ dependencies:
|
|
70
70
|
name: mutant-rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 0.8.17
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.8.17
|
83
83
|
- !ruby/object:Gem::Dependency
|
@@ -225,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
225
|
version: '0'
|
226
226
|
requirements: []
|
227
227
|
rubyforge_project:
|
228
|
-
rubygems_version:
|
228
|
+
rubygems_version: 2.7.6
|
229
229
|
signing_key:
|
230
230
|
specification_version: 4
|
231
231
|
summary: Event Store in Ruby
|