ruby_event_store 2.9.1 → 2.10
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/lib/ruby_event_store/client.rb +10 -10
- data/lib/ruby_event_store/event_type_resolver.rb +9 -0
- 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: 20f2bfe7214045324bd5fbe76b4e279b79f7b4a363fc3096fa0c940f6b661a9d
|
4
|
+
data.tar.gz: 1d80b75cdc741164a713a27f0650ade6d53d35b64c3622877c7dff1b131856ae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 648428aaada1d0bb4e088699fe5360db5546f9809eab9e3e0a7527a3475e563b8066d1cadd90c2ecbee2e7a2af4db32925877b5a5baa9990233f00fa3ed9ae7f
|
7
|
+
data.tar.gz: 64635cdbbdc428f7ce43e3339fa0a1f45df31ace522753702ba5d6cc955181b9f664ec318b78578b14360a18f1a4393ca7e2c512241247ea85600657dc3e0318
|
@@ -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
|
@@ -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.10'
|
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-19 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.8
|
122
123
|
signing_key:
|
123
124
|
specification_version: 4
|
124
125
|
summary: Implementation of an event store in Ruby
|