ruby_event_store 2.19.2 → 3.0.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/lib/ruby_event_store/broker.rb +1 -1
- data/lib/ruby_event_store/client.rb +2 -6
- data/lib/ruby_event_store/in_memory_repository.rb +2 -9
- data/lib/ruby_event_store/instrumented_broker.rb +14 -42
- data/lib/ruby_event_store/instrumented_dispatcher.rb +1 -15
- data/lib/ruby_event_store/instrumented_repository.rb +8 -39
- data/lib/ruby_event_store/instrumented_subscriptions.rb +2 -2
- data/lib/ruby_event_store/mappers/default.rb +2 -12
- data/lib/ruby_event_store/mappers/instrumented_batch_mapper.rb +2 -18
- data/lib/ruby_event_store/mappers/instrumented_mapper.rb +2 -32
- data/lib/ruby_event_store/projection.rb +9 -70
- data/lib/ruby_event_store/spec/broker_lint.rb +2 -2
- data/lib/ruby_event_store/specification.rb +0 -8
- data/lib/ruby_event_store/sync_scheduler.rb +1 -14
- data/lib/ruby_event_store/version.rb +1 -1
- data/lib/ruby_event_store.rb +0 -6
- metadata +2 -8
- data/lib/ruby_event_store/deprecated.rb +0 -98
- data/lib/ruby_event_store/dispatcher.rb +0 -6
- data/lib/ruby_event_store/immediate_async_dispatcher.rb +0 -6
- data/lib/ruby_event_store/mappers/json_mapper.rb +0 -16
- data/lib/ruby_event_store/mappers/null_mapper.rb +0 -11
- data/lib/ruby_event_store/mappers/transformation/event_class_remapper.rb +0 -32
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 05b8bd1227176e2a6d41cd4429f90f79a47ce98c13b03e81ba24cf6b61f0a118
|
|
4
|
+
data.tar.gz: 5100c038a126708538e6a9eecac435dacb9b58d2c0feacb9689daaab2217439c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 176ada1f03146d76a5a58ae8f7803fe029dd0fb265fa94b15da5412e7c98689b8be388ef977f77cdb56b54be3f4b420b6ffc291547f56b74136a9456f2c7341a
|
|
7
|
+
data.tar.gz: fd9befc69d34e4ca120520c4e0724b2dc031adfe2f9f35dc4a9f52e2d8977f61424988b85fd5c00983d228701bf5a10d628f7aa50be6c96f75507f5a63252760
|
|
@@ -99,9 +99,7 @@ module RubyEventStore
|
|
|
99
99
|
# @param expected_version (see #publish)
|
|
100
100
|
# @return [self]
|
|
101
101
|
def link(event_ids, stream_name:, expected_version: :any)
|
|
102
|
-
|
|
103
|
-
Passing `nil` to link is deprecated and will raise ArgumentError in RubyEventStore 3.0.
|
|
104
|
-
EOW
|
|
102
|
+
raise ArgumentError, "event_ids must not be nil" if event_ids.nil? || Array(event_ids).any?(&:nil?)
|
|
105
103
|
@repository.link_to_stream(Array(event_ids), Stream.new(stream_name), ExpectedVersion.new(expected_version))
|
|
106
104
|
self
|
|
107
105
|
end
|
|
@@ -384,9 +382,7 @@ module RubyEventStore
|
|
|
384
382
|
end
|
|
385
383
|
|
|
386
384
|
def enrich_events_metadata(events)
|
|
387
|
-
|
|
388
|
-
Passing `nil` to publish/append is deprecated and will raise ArgumentError in RubyEventStore 3.0.
|
|
389
|
-
EOW
|
|
385
|
+
raise ArgumentError, "events must not be nil" if events.nil? || Array(events).any?(&:nil?)
|
|
390
386
|
events = Array(events)
|
|
391
387
|
events.each { |event| enrich_event_metadata(event) }
|
|
392
388
|
end
|
|
@@ -22,12 +22,11 @@ module RubyEventStore
|
|
|
22
22
|
attr_reader :event_id, :position
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
def initialize(serializer: NULL
|
|
25
|
+
def initialize(serializer: NULL)
|
|
26
26
|
@serializer = serializer
|
|
27
27
|
@streams = Hash.new { |h, k| h[k] = Array.new }
|
|
28
28
|
@mutex = Mutex.new
|
|
29
29
|
@storage = Hash.new
|
|
30
|
-
@ensure_supported_any_usage = ensure_supported_any_usage
|
|
31
30
|
end
|
|
32
31
|
|
|
33
32
|
def append_to_stream(records, stream, expected_version)
|
|
@@ -239,13 +238,7 @@ module RubyEventStore
|
|
|
239
238
|
(resolved_version.nil? && !stream_positions.compact.empty?) ||
|
|
240
239
|
(!resolved_version.nil? && stream_positions.include?(nil))
|
|
241
240
|
|
|
242
|
-
if violation
|
|
243
|
-
if @ensure_supported_any_usage
|
|
244
|
-
raise UnsupportedVersionAnyUsage
|
|
245
|
-
else
|
|
246
|
-
Deprecations.warn(:any_version_with_specific_position)
|
|
247
|
-
end
|
|
248
|
-
end
|
|
241
|
+
raise UnsupportedVersionAnyUsage if violation
|
|
249
242
|
end
|
|
250
243
|
|
|
251
244
|
attr_reader :streams, :mutex, :storage, :serializer
|
|
@@ -9,34 +9,28 @@ module RubyEventStore
|
|
|
9
9
|
|
|
10
10
|
def call(topic, event, record)
|
|
11
11
|
instrumentation.instrument("call.broker.ruby_event_store", topic: topic, event: event, record: record) do
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
broker.call(event, record)
|
|
22
|
-
end
|
|
12
|
+
if broker.public_method(:call).arity == 3
|
|
13
|
+
broker.call(topic, event, record)
|
|
14
|
+
else
|
|
15
|
+
warn <<~EOW
|
|
16
|
+
Message broker shall support topics.
|
|
17
|
+
Topic WILL BE IGNORED in the current broker.
|
|
18
|
+
Modify the broker implementation to pass topic as an argument to broker.call method.
|
|
19
|
+
EOW
|
|
20
|
+
broker.call(event, record)
|
|
23
21
|
end
|
|
24
22
|
end
|
|
25
23
|
end
|
|
26
24
|
|
|
27
25
|
def add_subscription(subscriber, topics)
|
|
28
26
|
instrumentation.instrument("add_subscription.broker.ruby_event_store", subscriber: subscriber, topics: topics) do
|
|
29
|
-
|
|
30
|
-
broker.add_subscription(subscriber, topics)
|
|
31
|
-
end
|
|
27
|
+
broker.add_subscription(subscriber, topics)
|
|
32
28
|
end
|
|
33
29
|
end
|
|
34
30
|
|
|
35
31
|
def add_global_subscription(subscriber)
|
|
36
32
|
instrumentation.instrument("add_global_subscription.broker.ruby_event_store", subscriber: subscriber) do
|
|
37
|
-
|
|
38
|
-
broker.add_global_subscription(subscriber)
|
|
39
|
-
end
|
|
33
|
+
broker.add_global_subscription(subscriber)
|
|
40
34
|
end
|
|
41
35
|
end
|
|
42
36
|
|
|
@@ -45,28 +39,18 @@ module RubyEventStore
|
|
|
45
39
|
"add_thread_subscription.broker.ruby_event_store",
|
|
46
40
|
subscriber: subscriber,
|
|
47
41
|
topics: topics,
|
|
48
|
-
)
|
|
49
|
-
deprecated_instrument(
|
|
50
|
-
"add_thread_subscription.broker.rails_event_store",
|
|
51
|
-
subscriber: subscriber,
|
|
52
|
-
topics: topics,
|
|
53
|
-
) { broker.add_thread_subscription(subscriber, topics) }
|
|
54
|
-
end
|
|
42
|
+
) { broker.add_thread_subscription(subscriber, topics) }
|
|
55
43
|
end
|
|
56
44
|
|
|
57
45
|
def add_thread_global_subscription(subscriber)
|
|
58
46
|
instrumentation.instrument("add_thread_global_subscription.broker.ruby_event_store", subscriber: subscriber) do
|
|
59
|
-
|
|
60
|
-
broker.add_thread_global_subscription(subscriber)
|
|
61
|
-
end
|
|
47
|
+
broker.add_thread_global_subscription(subscriber)
|
|
62
48
|
end
|
|
63
49
|
end
|
|
64
50
|
|
|
65
51
|
def all_subscriptions_for(topic)
|
|
66
52
|
instrumentation.instrument("all_subscriptions_for.broker.ruby_event_store", topic: topic) do
|
|
67
|
-
|
|
68
|
-
broker.all_subscriptions_for(topic)
|
|
69
|
-
end
|
|
53
|
+
broker.all_subscriptions_for(topic)
|
|
70
54
|
end
|
|
71
55
|
end
|
|
72
56
|
|
|
@@ -85,17 +69,5 @@ module RubyEventStore
|
|
|
85
69
|
private
|
|
86
70
|
|
|
87
71
|
attr_reader :instrumentation, :broker
|
|
88
|
-
|
|
89
|
-
def deprecated_instrument(name, payload, &block)
|
|
90
|
-
canonical_name = name.sub("rails_event_store", "ruby_event_store")
|
|
91
|
-
old_listeners = instrumentation.notifier.all_listeners_for(name)
|
|
92
|
-
new_listeners = instrumentation.notifier.all_listeners_for(canonical_name)
|
|
93
|
-
if (old_listeners - new_listeners).any?
|
|
94
|
-
Deprecations.warn(:instrumentation_renamed)
|
|
95
|
-
instrumentation.instrument(name, payload, &block)
|
|
96
|
-
else
|
|
97
|
-
yield
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
72
|
end
|
|
101
73
|
end
|
|
@@ -9,9 +9,7 @@ module RubyEventStore
|
|
|
9
9
|
|
|
10
10
|
def call(subscriber, event, record)
|
|
11
11
|
instrumentation.instrument("call.dispatcher.ruby_event_store", event: event, subscriber: subscriber) do
|
|
12
|
-
|
|
13
|
-
dispatcher.call(subscriber, event, record)
|
|
14
|
-
end
|
|
12
|
+
dispatcher.call(subscriber, event, record)
|
|
15
13
|
end
|
|
16
14
|
end
|
|
17
15
|
|
|
@@ -30,17 +28,5 @@ module RubyEventStore
|
|
|
30
28
|
private
|
|
31
29
|
|
|
32
30
|
attr_reader :instrumentation, :dispatcher
|
|
33
|
-
|
|
34
|
-
def deprecated_instrument(name, payload, &block)
|
|
35
|
-
canonical_name = name.sub("rails_event_store", "ruby_event_store")
|
|
36
|
-
old_listeners = instrumentation.notifier.all_listeners_for(name)
|
|
37
|
-
new_listeners = instrumentation.notifier.all_listeners_for(canonical_name)
|
|
38
|
-
if (old_listeners - new_listeners).any?
|
|
39
|
-
Deprecations.warn(:instrumentation_renamed)
|
|
40
|
-
instrumentation.instrument(name, payload, &block)
|
|
41
|
-
else
|
|
42
|
-
yield
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
31
|
end
|
|
46
32
|
end
|
|
@@ -11,62 +11,43 @@ module RubyEventStore
|
|
|
11
11
|
instrumentation.instrument(
|
|
12
12
|
"append_to_stream.repository.ruby_event_store",
|
|
13
13
|
records: records,
|
|
14
|
-
events: records,
|
|
15
14
|
stream: stream,
|
|
16
|
-
)
|
|
17
|
-
deprecated_instrument(
|
|
18
|
-
"append_to_stream.repository.rails_event_store",
|
|
19
|
-
{ records: records, events: records, stream: stream },
|
|
20
|
-
) { repository.append_to_stream(records, stream, expected_version) }
|
|
21
|
-
end
|
|
15
|
+
) { repository.append_to_stream(records, stream, expected_version) }
|
|
22
16
|
end
|
|
23
17
|
|
|
24
18
|
def link_to_stream(event_ids, stream, expected_version)
|
|
25
19
|
instrumentation.instrument("link_to_stream.repository.ruby_event_store", event_ids: event_ids, stream: stream) do
|
|
26
|
-
|
|
27
|
-
repository.link_to_stream(event_ids, stream, expected_version)
|
|
28
|
-
end
|
|
20
|
+
repository.link_to_stream(event_ids, stream, expected_version)
|
|
29
21
|
end
|
|
30
22
|
end
|
|
31
23
|
|
|
32
24
|
def delete_stream(stream)
|
|
33
25
|
instrumentation.instrument("delete_stream.repository.ruby_event_store", stream: stream) do
|
|
34
|
-
|
|
35
|
-
repository.delete_stream(stream)
|
|
36
|
-
end
|
|
26
|
+
repository.delete_stream(stream)
|
|
37
27
|
end
|
|
38
28
|
end
|
|
39
29
|
|
|
40
30
|
def read(specification)
|
|
41
31
|
instrumentation.instrument("read.repository.ruby_event_store", specification: specification) do
|
|
42
|
-
|
|
43
|
-
repository.read(specification)
|
|
44
|
-
end
|
|
32
|
+
repository.read(specification)
|
|
45
33
|
end
|
|
46
34
|
end
|
|
47
35
|
|
|
48
36
|
def count(specification)
|
|
49
37
|
instrumentation.instrument("count.repository.ruby_event_store", specification: specification) do
|
|
50
|
-
|
|
51
|
-
repository.count(specification)
|
|
52
|
-
end
|
|
38
|
+
repository.count(specification)
|
|
53
39
|
end
|
|
54
40
|
end
|
|
55
41
|
|
|
56
42
|
def update_messages(records)
|
|
57
|
-
instrumentation.instrument("update_messages.repository.ruby_event_store", records: records
|
|
58
|
-
|
|
59
|
-
"update_messages.repository.rails_event_store",
|
|
60
|
-
{ records: records, messages: records },
|
|
61
|
-
) { repository.update_messages(records) }
|
|
43
|
+
instrumentation.instrument("update_messages.repository.ruby_event_store", records: records) do
|
|
44
|
+
repository.update_messages(records)
|
|
62
45
|
end
|
|
63
46
|
end
|
|
64
47
|
|
|
65
48
|
def streams_of(event_id)
|
|
66
49
|
instrumentation.instrument("streams_of.repository.ruby_event_store", event_id: event_id) do
|
|
67
|
-
|
|
68
|
-
repository.streams_of(event_id)
|
|
69
|
-
end
|
|
50
|
+
repository.streams_of(event_id)
|
|
70
51
|
end
|
|
71
52
|
end
|
|
72
53
|
|
|
@@ -85,17 +66,5 @@ module RubyEventStore
|
|
|
85
66
|
private
|
|
86
67
|
|
|
87
68
|
attr_reader :repository, :instrumentation
|
|
88
|
-
|
|
89
|
-
def deprecated_instrument(name, payload, &block)
|
|
90
|
-
canonical_name = name.sub("rails_event_store", "ruby_event_store")
|
|
91
|
-
old_listeners = instrumentation.notifier.all_listeners_for(name)
|
|
92
|
-
new_listeners = instrumentation.notifier.all_listeners_for(canonical_name)
|
|
93
|
-
if (old_listeners - new_listeners).any?
|
|
94
|
-
Deprecations.warn(:instrumentation_renamed)
|
|
95
|
-
instrumentation.instrument(name, payload, &block)
|
|
96
|
-
else
|
|
97
|
-
yield
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
69
|
end
|
|
101
70
|
end
|
|
@@ -42,9 +42,9 @@ module RubyEventStore
|
|
|
42
42
|
private
|
|
43
43
|
|
|
44
44
|
def instrument(args)
|
|
45
|
-
instrumentation.instrument("add.subscriptions.
|
|
45
|
+
instrumentation.instrument("add.subscriptions.ruby_event_store", args) do
|
|
46
46
|
unsubscribe = yield
|
|
47
|
-
-> { instrumentation.instrument("remove.subscriptions.
|
|
47
|
+
-> { instrumentation.instrument("remove.subscriptions.ruby_event_store", args) { unsubscribe.call } }
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
|
|
@@ -3,18 +3,8 @@
|
|
|
3
3
|
module RubyEventStore
|
|
4
4
|
module Mappers
|
|
5
5
|
class Default < PipelineMapper
|
|
6
|
-
def initialize
|
|
7
|
-
|
|
8
|
-
Deprecations.warn(:events_class_remapping_option)
|
|
9
|
-
super(
|
|
10
|
-
Pipeline.new(
|
|
11
|
-
Transformation::EventClassRemapper.new(events_class_remapping),
|
|
12
|
-
Transformation::SymbolizeMetadataKeys.new,
|
|
13
|
-
),
|
|
14
|
-
)
|
|
15
|
-
else
|
|
16
|
-
super(Pipeline.new(Transformation::SymbolizeMetadataKeys.new))
|
|
17
|
-
end
|
|
6
|
+
def initialize
|
|
7
|
+
super(Pipeline.new(Transformation::SymbolizeMetadataKeys.new))
|
|
18
8
|
end
|
|
19
9
|
end
|
|
20
10
|
end
|
|
@@ -10,35 +10,19 @@ module RubyEventStore
|
|
|
10
10
|
|
|
11
11
|
def events_to_records(events)
|
|
12
12
|
instrumentation.instrument("events_to_records.mapper.ruby_event_store", domain_events: events) do
|
|
13
|
-
|
|
14
|
-
mapper.events_to_records(events)
|
|
15
|
-
end
|
|
13
|
+
mapper.events_to_records(events)
|
|
16
14
|
end
|
|
17
15
|
end
|
|
18
16
|
|
|
19
17
|
def records_to_events(records)
|
|
20
18
|
instrumentation.instrument("records_to_events.mapper.ruby_event_store", records: records) do
|
|
21
|
-
|
|
22
|
-
mapper.records_to_events(records)
|
|
23
|
-
end
|
|
19
|
+
mapper.records_to_events(records)
|
|
24
20
|
end
|
|
25
21
|
end
|
|
26
22
|
|
|
27
23
|
private
|
|
28
24
|
|
|
29
25
|
attr_reader :instrumentation, :mapper
|
|
30
|
-
|
|
31
|
-
def deprecated_instrument(name, payload, &block)
|
|
32
|
-
canonical_name = name.sub("rails_event_store", "ruby_event_store")
|
|
33
|
-
old_listeners = instrumentation.notifier.all_listeners_for(name)
|
|
34
|
-
new_listeners = instrumentation.notifier.all_listeners_for(canonical_name)
|
|
35
|
-
if (old_listeners - new_listeners).any?
|
|
36
|
-
Deprecations.warn(:instrumentation_renamed)
|
|
37
|
-
instrumentation.instrument(name, payload, &block)
|
|
38
|
-
else
|
|
39
|
-
yield
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
26
|
end
|
|
43
27
|
end
|
|
44
28
|
end
|
|
@@ -10,49 +10,19 @@ module RubyEventStore
|
|
|
10
10
|
|
|
11
11
|
def event_to_record(event)
|
|
12
12
|
instrumentation.instrument("event_to_record.mapper.ruby_event_store", event: event) do
|
|
13
|
-
|
|
14
|
-
"serialize.mapper.ruby_event_store",
|
|
15
|
-
{ domain_event: event },
|
|
16
|
-
canonical: "event_to_record.mapper.ruby_event_store",
|
|
17
|
-
key: :instrumented_mapper_serialize_deprecated,
|
|
18
|
-
) do
|
|
19
|
-
deprecated_instrument("serialize.mapper.rails_event_store", { domain_event: event }) do
|
|
20
|
-
mapper.event_to_record(event)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
13
|
+
mapper.event_to_record(event)
|
|
23
14
|
end
|
|
24
15
|
end
|
|
25
16
|
|
|
26
17
|
def record_to_event(record)
|
|
27
18
|
instrumentation.instrument("record_to_event.mapper.ruby_event_store", record: record) do
|
|
28
|
-
|
|
29
|
-
"deserialize.mapper.ruby_event_store",
|
|
30
|
-
{ record: record },
|
|
31
|
-
canonical: "record_to_event.mapper.ruby_event_store",
|
|
32
|
-
key: :instrumented_mapper_serialize_deprecated,
|
|
33
|
-
) do
|
|
34
|
-
deprecated_instrument("deserialize.mapper.rails_event_store", { record: record }) do
|
|
35
|
-
mapper.record_to_event(record)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
19
|
+
mapper.record_to_event(record)
|
|
38
20
|
end
|
|
39
21
|
end
|
|
40
22
|
|
|
41
23
|
private
|
|
42
24
|
|
|
43
25
|
attr_reader :instrumentation, :mapper
|
|
44
|
-
|
|
45
|
-
def deprecated_instrument(name, payload, canonical: nil, key: :instrumentation_renamed, &block)
|
|
46
|
-
canonical_name = canonical || name.sub("rails_event_store", "ruby_event_store")
|
|
47
|
-
old_listeners = instrumentation.notifier.all_listeners_for(name)
|
|
48
|
-
new_listeners = instrumentation.notifier.all_listeners_for(canonical_name)
|
|
49
|
-
if (old_listeners - new_listeners).any?
|
|
50
|
-
Deprecations.warn(key)
|
|
51
|
-
instrumentation.instrument(name, payload, &block)
|
|
52
|
-
else
|
|
53
|
-
yield
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
26
|
end
|
|
57
27
|
end
|
|
58
28
|
end
|
|
@@ -5,15 +5,15 @@ module RubyEventStore
|
|
|
5
5
|
ANONYMOUS_CLASS = "#<Class:".freeze
|
|
6
6
|
private_constant :ANONYMOUS_CLASS
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
Deprecations.warn(:projection_new_constructor) unless _internal
|
|
10
|
-
@handlers = {}
|
|
11
|
-
@init = -> { initial_state }
|
|
12
|
-
@streams = []
|
|
13
|
-
end
|
|
8
|
+
private_class_method :new
|
|
14
9
|
|
|
15
10
|
def self.init(initial_state = nil)
|
|
16
|
-
new(initial_state
|
|
11
|
+
new(initial_state)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def initialize(initial_state)
|
|
15
|
+
@handlers = {}
|
|
16
|
+
@init = -> { initial_state }
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def on(*event_klasses, &block)
|
|
@@ -28,61 +28,10 @@ module RubyEventStore
|
|
|
28
28
|
self
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
-
def call(
|
|
31
|
+
def call(scope)
|
|
32
32
|
return initial_state if handled_events.empty?
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
scopes.reduce(initial_state) { |state, scope| scope.of_type(handled_events).reduce(state, &method(:transition)) }
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def self.from_stream(stream_or_streams)
|
|
40
|
-
streams = Array(stream_or_streams)
|
|
41
|
-
raise(ArgumentError, "At least one stream must be given") if streams.empty?
|
|
42
|
-
projection = new(_internal: true)
|
|
43
|
-
projection.instance_variable_set(:@streams, streams)
|
|
44
|
-
projection
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def self.from_all_streams
|
|
48
|
-
new(_internal: true)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def init(handler)
|
|
52
|
-
@init = handler
|
|
53
|
-
self
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def when(events, handler)
|
|
57
|
-
Array(events).each do |event_klass|
|
|
58
|
-
name = event_klass.to_s
|
|
59
|
-
@handlers[name] = ->(state, event) do
|
|
60
|
-
handler.call(state, event)
|
|
61
|
-
state
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
self
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def run(event_store, start: nil, count: PAGE_SIZE)
|
|
68
|
-
if @streams.any?
|
|
69
|
-
raise ArgumentError, "Start must be an array with event ids" unless valid_start_for_streams?(start)
|
|
70
|
-
scopes =
|
|
71
|
-
@streams
|
|
72
|
-
.zip(start || [])
|
|
73
|
-
.map do |stream, start_event_id|
|
|
74
|
-
scope = event_store.read.stream(stream).in_batches(count)
|
|
75
|
-
scope = scope.from(start_event_id) if start_event_id
|
|
76
|
-
scope
|
|
77
|
-
end
|
|
78
|
-
else
|
|
79
|
-
raise ArgumentError, "Start must be valid event id" unless valid_start_for_all_streams?(start)
|
|
80
|
-
scope = event_store.read.in_batches(count)
|
|
81
|
-
scope = scope.from(start) if start
|
|
82
|
-
scopes = [scope]
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
call(*scopes)
|
|
34
|
+
scope.of_type(handled_events).reduce(initial_state, &method(:transition))
|
|
86
35
|
end
|
|
87
36
|
|
|
88
37
|
private
|
|
@@ -98,15 +47,5 @@ module RubyEventStore
|
|
|
98
47
|
def transition(state, event)
|
|
99
48
|
@handlers.fetch(event.event_type).call(state, event)
|
|
100
49
|
end
|
|
101
|
-
|
|
102
|
-
def valid_start_for_streams?(start)
|
|
103
|
-
return true unless start
|
|
104
|
-
start.instance_of?(Array) && start.size == @streams.size
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def valid_start_for_all_streams?(start)
|
|
108
|
-
return true unless start
|
|
109
|
-
start.instance_of?(String)
|
|
110
|
-
end
|
|
111
50
|
end
|
|
112
51
|
end
|
|
@@ -5,7 +5,7 @@ RSpec.shared_examples "broker" do |broker_klass|
|
|
|
5
5
|
let(:record) { instance_double(::RubyEventStore::Record) }
|
|
6
6
|
let(:handler) { HandlerClass.new }
|
|
7
7
|
let(:subscriptions) { ::RubyEventStore::Subscriptions.new }
|
|
8
|
-
let(:dispatcher) { ::RubyEventStore::
|
|
8
|
+
let(:dispatcher) { ::RubyEventStore::SyncScheduler.new }
|
|
9
9
|
let(:broker) { broker_klass.new(subscriptions: subscriptions, dispatcher: dispatcher) }
|
|
10
10
|
|
|
11
11
|
specify "no dispatch when no subscriptions" do
|
|
@@ -56,7 +56,7 @@ RSpec.shared_examples "broker" do |broker_klass|
|
|
|
56
56
|
allow(dispatcher).to receive(:verify).and_return(false)
|
|
57
57
|
expect { broker.add_subscription(HandlerClass, []) }.to raise_error(
|
|
58
58
|
RubyEventStore::InvalidHandler,
|
|
59
|
-
/Handler HandlerClass is invalid for dispatcher .*
|
|
59
|
+
/Handler HandlerClass is invalid for dispatcher .*SyncScheduler/,
|
|
60
60
|
)
|
|
61
61
|
expect { broker.add_global_subscription(HandlerClass) }.to raise_error(
|
|
62
62
|
RubyEventStore::InvalidHandler,
|
|
@@ -245,10 +245,6 @@ module RubyEventStore
|
|
|
245
245
|
)
|
|
246
246
|
end
|
|
247
247
|
|
|
248
|
-
def in_batches_of(batch_size = DEFAULT_BATCH_SIZE)
|
|
249
|
-
in_batches(batch_size)
|
|
250
|
-
end
|
|
251
|
-
|
|
252
248
|
# Specifies that only first event should be read.
|
|
253
249
|
# {https://railseventstore.org/docs/core-concepts/read Find out more}.
|
|
254
250
|
#
|
|
@@ -292,10 +288,6 @@ module RubyEventStore
|
|
|
292
288
|
Specification.new(reader, result.dup { |r| r.with_types = types.flatten })
|
|
293
289
|
end
|
|
294
290
|
|
|
295
|
-
def of_types(*types)
|
|
296
|
-
of_type(*types)
|
|
297
|
-
end
|
|
298
|
-
|
|
299
291
|
# Limits the query to certain events by given even ids.
|
|
300
292
|
# {https://railseventstore.org/docs/core-concepts/read Find out more}.
|
|
301
293
|
#
|
|
@@ -3,24 +3,11 @@
|
|
|
3
3
|
module RubyEventStore
|
|
4
4
|
class SyncScheduler
|
|
5
5
|
def call(subscriber, event, _)
|
|
6
|
-
if Class === subscriber
|
|
7
|
-
Deprecations.warn(:class_subscriber)
|
|
8
|
-
subscriber = subscriber.new
|
|
9
|
-
end
|
|
10
6
|
subscriber.call(event)
|
|
11
7
|
end
|
|
12
8
|
|
|
13
9
|
def verify(subscriber)
|
|
14
|
-
|
|
15
|
-
Deprecations.warn(:class_subscriber)
|
|
16
|
-
begin
|
|
17
|
-
subscriber.new.respond_to?(:call)
|
|
18
|
-
rescue ArgumentError
|
|
19
|
-
false
|
|
20
|
-
end
|
|
21
|
-
else
|
|
22
|
-
subscriber.respond_to?(:call)
|
|
23
|
-
end
|
|
10
|
+
subscriber.respond_to?(:call)
|
|
24
11
|
end
|
|
25
12
|
end
|
|
26
13
|
end
|
data/lib/ruby_event_store.rb
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
require_relative "ruby_event_store/deprecations"
|
|
4
4
|
require_relative "ruby_event_store/sync_scheduler"
|
|
5
|
-
require_relative "ruby_event_store/dispatcher"
|
|
6
5
|
require_relative "ruby_event_store/subscriptions"
|
|
7
6
|
require_relative "ruby_event_store/broker"
|
|
8
7
|
require_relative "ruby_event_store/in_memory_repository"
|
|
@@ -25,7 +24,6 @@ require_relative "ruby_event_store/mappers/encryption_key"
|
|
|
25
24
|
require_relative "ruby_event_store/mappers/in_memory_encryption_key_repository"
|
|
26
25
|
require_relative "ruby_event_store/mappers/transformation/domain_event"
|
|
27
26
|
require_relative "ruby_event_store/mappers/transformation/encryption"
|
|
28
|
-
require_relative "ruby_event_store/mappers/transformation/event_class_remapper"
|
|
29
27
|
require_relative "ruby_event_store/mappers/transformation/upcast"
|
|
30
28
|
require_relative "ruby_event_store/mappers/transformation/stringify_metadata_keys"
|
|
31
29
|
require_relative "ruby_event_store/mappers/transformation/symbolize_metadata_keys"
|
|
@@ -38,14 +36,11 @@ require_relative "ruby_event_store/mappers/forgotten_data"
|
|
|
38
36
|
require_relative "ruby_event_store/mappers/encryption_mapper"
|
|
39
37
|
require_relative "ruby_event_store/mappers/instrumented_mapper"
|
|
40
38
|
require_relative "ruby_event_store/mappers/instrumented_batch_mapper"
|
|
41
|
-
require_relative "ruby_event_store/mappers/json_mapper"
|
|
42
|
-
require_relative "ruby_event_store/mappers/null_mapper"
|
|
43
39
|
require_relative "ruby_event_store/serializers/yaml"
|
|
44
40
|
require_relative "ruby_event_store/batch_enumerator"
|
|
45
41
|
require_relative "ruby_event_store/correlated_commands"
|
|
46
42
|
require_relative "ruby_event_store/link_by_metadata"
|
|
47
43
|
require_relative "ruby_event_store/immediate_dispatcher"
|
|
48
|
-
require_relative "ruby_event_store/immediate_async_dispatcher"
|
|
49
44
|
require_relative "ruby_event_store/composed_dispatcher"
|
|
50
45
|
require_relative "ruby_event_store/composed_broker"
|
|
51
46
|
require_relative "ruby_event_store/version"
|
|
@@ -54,4 +49,3 @@ require_relative "ruby_event_store/instrumented_dispatcher"
|
|
|
54
49
|
require_relative "ruby_event_store/instrumented_subscriptions"
|
|
55
50
|
require_relative "ruby_event_store/instrumented_broker"
|
|
56
51
|
require_relative "ruby_event_store/event_type_resolver"
|
|
57
|
-
require_relative "ruby_event_store/deprecated"
|
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:
|
|
4
|
+
version: 3.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Arkency
|
|
@@ -47,14 +47,11 @@ files:
|
|
|
47
47
|
- lib/ruby_event_store/composed_dispatcher.rb
|
|
48
48
|
- lib/ruby_event_store/constants.rb
|
|
49
49
|
- lib/ruby_event_store/correlated_commands.rb
|
|
50
|
-
- lib/ruby_event_store/deprecated.rb
|
|
51
50
|
- lib/ruby_event_store/deprecations.rb
|
|
52
|
-
- lib/ruby_event_store/dispatcher.rb
|
|
53
51
|
- lib/ruby_event_store/errors.rb
|
|
54
52
|
- lib/ruby_event_store/event.rb
|
|
55
53
|
- lib/ruby_event_store/event_type_resolver.rb
|
|
56
54
|
- lib/ruby_event_store/expected_version.rb
|
|
57
|
-
- lib/ruby_event_store/immediate_async_dispatcher.rb
|
|
58
55
|
- lib/ruby_event_store/immediate_dispatcher.rb
|
|
59
56
|
- lib/ruby_event_store/in_memory_repository.rb
|
|
60
57
|
- lib/ruby_event_store/instrumented_broker.rb
|
|
@@ -70,13 +67,10 @@ files:
|
|
|
70
67
|
- lib/ruby_event_store/mappers/in_memory_encryption_key_repository.rb
|
|
71
68
|
- lib/ruby_event_store/mappers/instrumented_batch_mapper.rb
|
|
72
69
|
- lib/ruby_event_store/mappers/instrumented_mapper.rb
|
|
73
|
-
- lib/ruby_event_store/mappers/json_mapper.rb
|
|
74
|
-
- lib/ruby_event_store/mappers/null_mapper.rb
|
|
75
70
|
- lib/ruby_event_store/mappers/pipeline.rb
|
|
76
71
|
- lib/ruby_event_store/mappers/pipeline_mapper.rb
|
|
77
72
|
- lib/ruby_event_store/mappers/transformation/domain_event.rb
|
|
78
73
|
- lib/ruby_event_store/mappers/transformation/encryption.rb
|
|
79
|
-
- lib/ruby_event_store/mappers/transformation/event_class_remapper.rb
|
|
80
74
|
- lib/ruby_event_store/mappers/transformation/preserve_types.rb
|
|
81
75
|
- lib/ruby_event_store/mappers/transformation/stringify_metadata_keys.rb
|
|
82
76
|
- lib/ruby_event_store/mappers/transformation/symbolize_metadata_keys.rb
|
|
@@ -125,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
125
119
|
- !ruby/object:Gem::Version
|
|
126
120
|
version: '0'
|
|
127
121
|
requirements: []
|
|
128
|
-
rubygems_version:
|
|
122
|
+
rubygems_version: 3.7.1
|
|
129
123
|
specification_version: 4
|
|
130
124
|
summary: Implementation of an event store in Ruby
|
|
131
125
|
test_files: []
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module RubyEventStore
|
|
4
|
-
Deprecations.register(
|
|
5
|
-
:dispatcher_renamed,
|
|
6
|
-
"`RubyEventStore::Dispatcher` is deprecated and will be removed in the next major release.\n" \
|
|
7
|
-
"Use `RubyEventStore::SyncScheduler` instead.",
|
|
8
|
-
)
|
|
9
|
-
Deprecations.deprecate(Dispatcher, :initialize, key: :dispatcher_renamed)
|
|
10
|
-
|
|
11
|
-
Deprecations.register(
|
|
12
|
-
:immediate_async_dispatcher_renamed,
|
|
13
|
-
"`RubyEventStore::ImmediateAsyncDispatcher` is deprecated and will be removed in the next major release.\n" \
|
|
14
|
-
"Use `RubyEventStore::ImmediateDispatcher` instead.",
|
|
15
|
-
)
|
|
16
|
-
Deprecations.deprecate(ImmediateAsyncDispatcher, :initialize, key: :immediate_async_dispatcher_renamed)
|
|
17
|
-
|
|
18
|
-
Deprecations.register(
|
|
19
|
-
:class_subscriber,
|
|
20
|
-
"Passing a class as a subscriber is deprecated and will be removed in the next major release.\n" \
|
|
21
|
-
"Pass an instance or lambda instead, e.g. subscribe(MyHandler.new, to: [MyEvent]).",
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
Deprecations.register(
|
|
25
|
-
:null_mapper,
|
|
26
|
-
"`RubyEventStore::Mappers::NullMapper` is deprecated and will be removed in the next major release.\n" \
|
|
27
|
-
"Use `RubyEventStore::Mappers::Default.new` instead.",
|
|
28
|
-
)
|
|
29
|
-
Deprecations.deprecate(Mappers::NullMapper, :initialize, key: :null_mapper)
|
|
30
|
-
|
|
31
|
-
Deprecations.register(
|
|
32
|
-
:events_class_remapping_option,
|
|
33
|
-
"`events_class_remapping` option in `RubyEventStore::Mappers::Default` is deprecated and will be removed in the next major release.\n" \
|
|
34
|
-
"Use `RubyEventStore::Mappers::Transformation::Upcast` instead.",
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
Deprecations.register(
|
|
38
|
-
:event_class_remapper,
|
|
39
|
-
"`RubyEventStore::Mappers::Transformation::EventClassRemapper` is deprecated and will be removed in the next major release.\n" \
|
|
40
|
-
"Use `RubyEventStore::Mappers::Transformation::Upcast` instead.",
|
|
41
|
-
)
|
|
42
|
-
Deprecations.deprecate(Mappers::Transformation::EventClassRemapper, :initialize, key: :event_class_remapper)
|
|
43
|
-
|
|
44
|
-
Deprecations.register(
|
|
45
|
-
:any_version_with_specific_position,
|
|
46
|
-
"Mixing expected version :any and specific position (or :auto) is deprecated and will raise UnsupportedVersionAnyUsage in RubyEventStore 3.0.",
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
Deprecations.register(
|
|
50
|
-
:projection_new_constructor,
|
|
51
|
-
"RubyEventStore::Projection.new is deprecated and will be removed in the next major release.\n" \
|
|
52
|
-
"Use Projection.init(initial_state) instead.",
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
Deprecations.register(
|
|
56
|
-
:projection_multiple_scopes,
|
|
57
|
-
"Passing multiple scopes to RubyEventStore::Projection#call is deprecated and will be removed in the next major release.\n" \
|
|
58
|
-
"Use a single scope instead, e.g. call(event_store.read.stream(\"stream_name\")).",
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
Deprecations.register(
|
|
62
|
-
:projection_old_api,
|
|
63
|
-
"RubyEventStore::Projection from_stream/from_all_streams/init/when/run API is deprecated and will be removed in the next major release.\n" \
|
|
64
|
-
"Use Projection.init(initial_state).on(EventClass) { |state, event| new_state }.call(scope) instead.",
|
|
65
|
-
)
|
|
66
|
-
Deprecations.deprecate_class_method(Projection, :from_stream, key: :projection_old_api)
|
|
67
|
-
Deprecations.deprecate_class_method(Projection, :from_all_streams, key: :projection_old_api)
|
|
68
|
-
Deprecations.deprecate(Projection, :init, key: :projection_old_api)
|
|
69
|
-
Deprecations.deprecate(Projection, :when, key: :projection_old_api)
|
|
70
|
-
Deprecations.deprecate(Projection, :run, key: :projection_old_api)
|
|
71
|
-
|
|
72
|
-
Deprecations.register(
|
|
73
|
-
:instrumentation_renamed,
|
|
74
|
-
"Instrumentation event names *.rails_event_store are deprecated and will be removed in the next major release.\n" \
|
|
75
|
-
"Use *.ruby_event_store instead.",
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
Deprecations.register(
|
|
79
|
-
:instrumented_mapper_serialize_deprecated,
|
|
80
|
-
"Instrumentation event names serialize.mapper.ruby_event_store and deserialize.mapper.ruby_event_store are deprecated and will be removed in the next major release.\n" \
|
|
81
|
-
"Use event_to_record.mapper.ruby_event_store and record_to_event.mapper.ruby_event_store instead.\n" \
|
|
82
|
-
"The domain_event: payload key in serialize.mapper.ruby_event_store has been renamed to event: in event_to_record.mapper.ruby_event_store.",
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
Deprecations.register(
|
|
86
|
-
:specification_in_batches_of,
|
|
87
|
-
"RubyEventStore::Specification#in_batches_of is deprecated and will be removed in the next major release.\n\n" \
|
|
88
|
-
"Use #in_batches instead.",
|
|
89
|
-
)
|
|
90
|
-
Deprecations.deprecate(Specification, :in_batches_of, key: :specification_in_batches_of)
|
|
91
|
-
|
|
92
|
-
Deprecations.register(
|
|
93
|
-
:specification_of_types,
|
|
94
|
-
"RubyEventStore::Specification#of_types is deprecated and will be removed in the next major release.\n\n" \
|
|
95
|
-
"Use #of_type instead.",
|
|
96
|
-
)
|
|
97
|
-
Deprecations.deprecate(Specification, :of_types, key: :specification_of_types)
|
|
98
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module RubyEventStore
|
|
4
|
-
module Mappers
|
|
5
|
-
class JSONMapper < Default
|
|
6
|
-
def initialize(events_class_remapping: {})
|
|
7
|
-
warn <<~EOW
|
|
8
|
-
Please replace RubyEventStore::Mappers::JSONMapper with RubyEventStore::Mappers::Default
|
|
9
|
-
|
|
10
|
-
They're now identical and the former will be removed in next major release.
|
|
11
|
-
EOW
|
|
12
|
-
super
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module RubyEventStore
|
|
4
|
-
module Mappers
|
|
5
|
-
module Transformation
|
|
6
|
-
class EventClassRemapper
|
|
7
|
-
def initialize(class_map)
|
|
8
|
-
@class_map = class_map
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def dump(record)
|
|
12
|
-
record
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def load(record)
|
|
16
|
-
Record.new(
|
|
17
|
-
event_id: record.event_id,
|
|
18
|
-
event_type: class_map[record.event_type] || record.event_type,
|
|
19
|
-
data: record.data,
|
|
20
|
-
metadata: record.metadata,
|
|
21
|
-
timestamp: record.timestamp,
|
|
22
|
-
valid_at: record.valid_at,
|
|
23
|
-
)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
attr_reader :class_map
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|