ruby_event_store 2.9.1 → 2.11.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/client.rb +10 -10
- data/lib/ruby_event_store/event_type_resolver.rb +9 -0
- data/lib/ruby_event_store/mappers/transformation/preserve_types.rb +3 -3
- data/lib/ruby_event_store/spec/event_repository_lint.rb +1 -1
- data/lib/ruby_event_store/spec/subscriptions_lint.rb +18 -19
- data/lib/ruby_event_store/subscriptions.rb +3 -18
- data/lib/ruby_event_store/version.rb +1 -1
- data/lib/ruby_event_store.rb +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a13012b6cc672274f7818f51f777a864dd52e301023bdb2892a83adda5805550
|
4
|
+
data.tar.gz: 6f00d31f07180e67e20abe178d30f9f38606e813bc8ccf69c5f327687d6fb067
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a42330d20f5a09086428f5f83ea14383020ae027fa9ebaf36688e98e86a93f28808a214d384dbd3ee99d433027be42ac2556be9b7341b745f6b1e3b3ee4e7f9c
|
7
|
+
data.tar.gz: 421b823b296a89afc6f224ea340187520d48b762c412f9583172a0c89bc28822a9476bb418bc7f0fd5cc7ddada03360546c6293c8e53146e31d7debc97e193a7
|
@@ -10,7 +10,8 @@ module RubyEventStore
|
|
10
10
|
subscriptions: Subscriptions.new,
|
11
11
|
dispatcher: Dispatcher.new,
|
12
12
|
clock: default_clock,
|
13
|
-
correlation_id_generator: default_correlation_id_generator
|
13
|
+
correlation_id_generator: default_correlation_id_generator,
|
14
|
+
event_type_resolver: EventTypeResolver.new
|
14
15
|
)
|
15
16
|
@repository = repository
|
16
17
|
@mapper = mapper
|
@@ -19,6 +20,7 @@ module RubyEventStore
|
|
19
20
|
@clock = clock
|
20
21
|
@metadata = Concurrent::ThreadLocalVar.new
|
21
22
|
@correlation_id_generator = correlation_id_generator
|
23
|
+
@event_type_resolver = event_type_resolver
|
22
24
|
end
|
23
25
|
|
24
26
|
# Persists events and notifies subscribed handlers about them
|
@@ -142,7 +144,7 @@ module RubyEventStore
|
|
142
144
|
def subscribe(subscriber = nil, to:, &proc)
|
143
145
|
raise ArgumentError, "subscriber must be first argument or block, cannot be both" if subscriber && proc
|
144
146
|
subscriber ||= proc
|
145
|
-
broker.add_subscription(subscriber, to)
|
147
|
+
broker.add_subscription(subscriber, to.map { |event_klass| event_type_resolver.call(event_klass) })
|
146
148
|
end
|
147
149
|
|
148
150
|
# Subscribes a handler (subscriber) that will be invoked for all published events
|
@@ -172,11 +174,12 @@ module RubyEventStore
|
|
172
174
|
# which are active only during the invocation of the provided
|
173
175
|
# block of code.
|
174
176
|
class Within
|
175
|
-
def initialize(block, broker)
|
177
|
+
def initialize(block, broker, resolver)
|
176
178
|
@block = block
|
177
179
|
@broker = broker
|
178
180
|
@global_subscribers = []
|
179
181
|
@subscribers = Hash.new { [] }
|
182
|
+
@resolver = resolver
|
180
183
|
end
|
181
184
|
|
182
185
|
# Subscribes temporary handlers that
|
@@ -210,7 +213,7 @@ module RubyEventStore
|
|
210
213
|
# @return [self]
|
211
214
|
def subscribe(handler = nil, to:, &handler2)
|
212
215
|
raise ArgumentError if handler && handler2
|
213
|
-
@subscribers[handler || handler2] += Array(to)
|
216
|
+
@subscribers[handler || handler2] += Array(to).map { |event_klass| resolver.call(event_klass) }
|
214
217
|
self
|
215
218
|
end
|
216
219
|
|
@@ -228,6 +231,7 @@ module RubyEventStore
|
|
228
231
|
end
|
229
232
|
|
230
233
|
private
|
234
|
+
attr_reader :resolver
|
231
235
|
|
232
236
|
def add_thread_subscribers
|
233
237
|
@subscribers.map { |subscriber, types| @broker.add_thread_subscription(subscriber, types) }
|
@@ -245,7 +249,7 @@ module RubyEventStore
|
|
245
249
|
# @return [Within] builder object which collects temporary subscriptions
|
246
250
|
def within(&block)
|
247
251
|
raise ArgumentError if block.nil?
|
248
|
-
Within.new(block, broker)
|
252
|
+
Within.new(block, broker, event_type_resolver)
|
249
253
|
end
|
250
254
|
|
251
255
|
# Set additional metadata for all events published within the provided block
|
@@ -357,10 +361,6 @@ module RubyEventStore
|
|
357
361
|
|
358
362
|
protected
|
359
363
|
|
360
|
-
def event_type_resolver
|
361
|
-
subscriptions.event_type_resolver
|
362
|
-
end
|
363
|
-
|
364
364
|
def metadata=(value)
|
365
365
|
@metadata.value = value
|
366
366
|
end
|
@@ -373,6 +373,6 @@ module RubyEventStore
|
|
373
373
|
-> { SecureRandom.uuid }
|
374
374
|
end
|
375
375
|
|
376
|
-
attr_reader :repository, :mapper, :subscriptions, :broker, :clock, :correlation_id_generator
|
376
|
+
attr_reader :repository, :mapper, :subscriptions, :broker, :clock, :correlation_id_generator, :event_type_resolver
|
377
377
|
end
|
378
378
|
end
|
@@ -91,8 +91,8 @@ module RubyEventStore
|
|
91
91
|
end
|
92
92
|
data_types = types&.fetch(:data, nil)
|
93
93
|
metadata_types = types&.fetch(:metadata, nil)
|
94
|
-
data =
|
95
|
-
metadata =
|
94
|
+
data = restore_type(record.data, data_types)
|
95
|
+
metadata = restore_type(record.metadata, metadata_types)
|
96
96
|
|
97
97
|
Record.new(
|
98
98
|
event_id: record.event_id,
|
@@ -151,7 +151,7 @@ module RubyEventStore
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def restore_type(argument, type)
|
154
|
-
case
|
154
|
+
case type
|
155
155
|
when Hash
|
156
156
|
restore_types(argument, type)
|
157
157
|
when Array
|
@@ -69,7 +69,7 @@ module RubyEventStore
|
|
69
69
|
read_events(repository, specification.backward, stream, from: from, to: to, count: count)
|
70
70
|
end
|
71
71
|
|
72
|
-
|
72
|
+
specify "just created is empty" do
|
73
73
|
expect(read_events_forward(repository)).to be_empty
|
74
74
|
end
|
75
75
|
|
@@ -22,8 +22,8 @@ RSpec.shared_examples :subscriptions do |subscriptions_class|
|
|
22
22
|
another_handler = TestHandler.new
|
23
23
|
global_handler = TestHandler.new
|
24
24
|
|
25
|
-
subscriptions.add_subscription(handler, [Test1DomainEvent, Test3DomainEvent])
|
26
|
-
subscriptions.add_subscription(another_handler, [Test2DomainEvent])
|
25
|
+
subscriptions.add_subscription(handler, ['Test1DomainEvent', 'Test3DomainEvent'])
|
26
|
+
subscriptions.add_subscription(another_handler, ['Test2DomainEvent'])
|
27
27
|
subscriptions.add_global_subscription(global_handler)
|
28
28
|
|
29
29
|
expect(subscriptions.all_for("Test1DomainEvent")).to eq([handler, global_handler])
|
@@ -36,15 +36,14 @@ RSpec.shared_examples :subscriptions do |subscriptions_class|
|
|
36
36
|
another_handler = TestHandler.new
|
37
37
|
global_handler = TestHandler.new
|
38
38
|
|
39
|
-
subscriptions.add_thread_subscription(handler, [Test1DomainEvent, Test3DomainEvent])
|
40
|
-
subscriptions.add_thread_subscription(another_handler, [Test2DomainEvent])
|
39
|
+
subscriptions.add_thread_subscription(handler, ['Test1DomainEvent', 'Test3DomainEvent'])
|
40
|
+
subscriptions.add_thread_subscription(another_handler, ['Test2DomainEvent'])
|
41
41
|
subscriptions.add_thread_global_subscription(global_handler)
|
42
|
-
t =
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
end
|
42
|
+
t = Thread.new do
|
43
|
+
subscriptions.add_thread_subscription(handler, ['Test2DomainEvent'])
|
44
|
+
subscriptions.add_thread_global_subscription(another_handler)
|
45
|
+
expect(subscriptions.all_for('Test2DomainEvent')).to eq([another_handler, handler])
|
46
|
+
end
|
48
47
|
|
49
48
|
expect(subscriptions.all_for("Test1DomainEvent")).to eq([global_handler, handler])
|
50
49
|
expect(subscriptions.all_for("Test2DomainEvent")).to eq([global_handler, another_handler])
|
@@ -78,9 +77,9 @@ RSpec.shared_examples :subscriptions do |subscriptions_class|
|
|
78
77
|
it "revokes subscription" do
|
79
78
|
handler = TestHandler.new
|
80
79
|
|
81
|
-
revoke
|
82
|
-
expect(subscriptions.all_for(
|
83
|
-
expect(subscriptions.all_for(
|
80
|
+
revoke = subscriptions.add_subscription(handler, ['Test1DomainEvent', 'Test2DomainEvent'])
|
81
|
+
expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler])
|
82
|
+
expect(subscriptions.all_for('Test2DomainEvent')).to eq([handler])
|
84
83
|
revoke.()
|
85
84
|
expect(subscriptions.all_for("Test1DomainEvent")).to eq([])
|
86
85
|
expect(subscriptions.all_for("Test2DomainEvent")).to eq([])
|
@@ -100,9 +99,9 @@ RSpec.shared_examples :subscriptions do |subscriptions_class|
|
|
100
99
|
it "revokes thread subscription" do
|
101
100
|
handler = TestHandler.new
|
102
101
|
|
103
|
-
revoke
|
104
|
-
expect(subscriptions.all_for(
|
105
|
-
expect(subscriptions.all_for(
|
102
|
+
revoke = subscriptions.add_thread_subscription(handler, ['Test1DomainEvent', 'Test2DomainEvent'])
|
103
|
+
expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler])
|
104
|
+
expect(subscriptions.all_for('Test2DomainEvent')).to eq([handler])
|
106
105
|
revoke.()
|
107
106
|
expect(subscriptions.all_for("Test1DomainEvent")).to eq([])
|
108
107
|
expect(subscriptions.all_for("Test2DomainEvent")).to eq([])
|
@@ -116,10 +115,10 @@ RSpec.shared_examples :subscriptions do |subscriptions_class|
|
|
116
115
|
expect(subscriptions.all_for("Test1DomainEvent")).to eq([handler, handler])
|
117
116
|
end
|
118
117
|
|
119
|
-
it
|
118
|
+
it 'subscribes by type of event which is a class' do
|
120
119
|
handler = TestHandler.new
|
121
|
-
subscriptions.add_subscription(handler, [Test1DomainEvent])
|
122
|
-
subscriptions.add_thread_subscription(handler, [Test1DomainEvent])
|
120
|
+
subscriptions.add_subscription(handler, ['Test1DomainEvent'])
|
121
|
+
subscriptions.add_thread_subscription(handler, ['Test1DomainEvent'])
|
123
122
|
|
124
123
|
expect(subscriptions.all_for("Test1DomainEvent")).to eq([handler, handler])
|
125
124
|
end
|
@@ -4,15 +4,14 @@ require "concurrent"
|
|
4
4
|
|
5
5
|
module RubyEventStore
|
6
6
|
class Subscriptions
|
7
|
-
def initialize
|
8
|
-
@event_type_resolver = event_type_resolver
|
7
|
+
def initialize
|
9
8
|
@local = LocalSubscriptions.new
|
10
9
|
@global = GlobalSubscriptions.new
|
11
10
|
@thread = ThreadSubscriptions.new
|
12
11
|
end
|
13
12
|
|
14
13
|
def add_subscription(subscriber, event_types)
|
15
|
-
local.add(subscriber,
|
14
|
+
local.add(subscriber, event_types)
|
16
15
|
end
|
17
16
|
|
18
17
|
def add_global_subscription(subscriber)
|
@@ -20,7 +19,7 @@ module RubyEventStore
|
|
20
19
|
end
|
21
20
|
|
22
21
|
def add_thread_subscription(subscriber, event_types)
|
23
|
-
thread.local.add(subscriber,
|
22
|
+
thread.local.add(subscriber, event_types)
|
24
23
|
end
|
25
24
|
|
26
25
|
def add_thread_global_subscription(subscriber)
|
@@ -31,24 +30,10 @@ module RubyEventStore
|
|
31
30
|
[local, global, thread].map { |r| r.all_for(event_type) }.reduce(&:+)
|
32
31
|
end
|
33
32
|
|
34
|
-
attr_reader :event_type_resolver
|
35
|
-
|
36
33
|
private
|
37
34
|
|
38
35
|
attr_reader :local, :global, :thread
|
39
36
|
|
40
|
-
def default_event_type_resolver
|
41
|
-
->(value) { value.to_s }
|
42
|
-
end
|
43
|
-
|
44
|
-
def resolve_event_types(event_types)
|
45
|
-
event_types.map(&method(:resolve_event_type))
|
46
|
-
end
|
47
|
-
|
48
|
-
def resolve_event_type(type)
|
49
|
-
event_type_resolver.call(type)
|
50
|
-
end
|
51
|
-
|
52
37
|
class ThreadSubscriptions
|
53
38
|
def initialize
|
54
39
|
@local = ThreadLocalSubscriptions.new
|
data/lib/ruby_event_store.rb
CHANGED
@@ -46,3 +46,4 @@ require_relative "ruby_event_store/version"
|
|
46
46
|
require_relative "ruby_event_store/instrumented_repository"
|
47
47
|
require_relative "ruby_event_store/instrumented_dispatcher"
|
48
48
|
require_relative "ruby_event_store/instrumented_subscriptions"
|
49
|
+
require_relative "ruby_event_store/event_type_resolver"
|
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: 2.
|
4
|
+
version: 2.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arkency
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- lib/ruby_event_store/dispatcher.rb
|
51
51
|
- lib/ruby_event_store/errors.rb
|
52
52
|
- lib/ruby_event_store/event.rb
|
53
|
+
- lib/ruby_event_store/event_type_resolver.rb
|
53
54
|
- lib/ruby_event_store/expected_version.rb
|
54
55
|
- lib/ruby_event_store/immediate_async_dispatcher.rb
|
55
56
|
- lib/ruby_event_store/in_memory_repository.rb
|
@@ -118,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
118
119
|
- !ruby/object:Gem::Version
|
119
120
|
version: '0'
|
120
121
|
requirements: []
|
121
|
-
rubygems_version: 3.
|
122
|
+
rubygems_version: 3.4.10
|
122
123
|
signing_key:
|
123
124
|
specification_version: 4
|
124
125
|
summary: Implementation of an event store in Ruby
|