ruby_event_store 2.0.3 → 2.1.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/README.md +3 -1
- data/lib/ruby_event_store/client.rb +3 -3
- data/lib/ruby_event_store/in_memory_repository.rb +3 -3
- data/lib/ruby_event_store/instrumented_repository.rb +3 -3
- data/lib/ruby_event_store/mappers/default.rb +1 -28
- data/lib/ruby_event_store/mappers/encryption_mapper.rb +2 -0
- data/lib/ruby_event_store/mappers/instrumented_mapper.rb +0 -4
- data/lib/ruby_event_store/mappers/json_mapper.rb +7 -5
- data/lib/ruby_event_store/mappers/pipeline.rb +2 -26
- data/lib/ruby_event_store/mappers/pipeline_mapper.rb +0 -4
- data/lib/ruby_event_store/mappers/transformation/upcast.rb +37 -0
- data/lib/ruby_event_store/spec/event_repository_lint.rb +68 -70
- data/lib/ruby_event_store/spec/subscriptions_lint.rb +19 -0
- data/lib/ruby_event_store/subscriptions.rb +23 -9
- data/lib/ruby_event_store/transform_keys.rb +5 -5
- data/lib/ruby_event_store/version.rb +1 -1
- data/lib/ruby_event_store.rb +1 -2
- metadata +12 -16
- data/CHANGELOG.md +0 -93
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -121
- data/Makefile +0 -32
- data/lib/ruby_event_store/mappers/deprecated_wrapper.rb +0 -33
- data/lib/ruby_event_store/mappers/transformation/serialization.rb +0 -36
- data/ruby_event_store.gemspec +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88203a9b943002241df25fa83c6f067e7944810e66d713eeb11e8cebf13271e2
|
4
|
+
data.tar.gz: 1b032e898517d787a2e6d0cb6b15775792591abc094e68d2483590f916e69c9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 780c9e0f6064311d45be29c0553c47e65e679a3967b91e6caca48a55ef9c34a06070e421b1413c1a35634c6e45c1452204ac29fae2aa706fe7a0e46d1dd99f40
|
7
|
+
data.tar.gz: 66b7a11ce2d3b58a5f9c2690a7f7f998fc9130c302343923cdd5a57a63d6a398ea258cced2d1b3161e07d9fb081d04bd7c4f305d6576cae59bd6e50f50ba6a92
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
1
|
# RubyEventStore
|
2
2
|
|
3
|
-
|
3
|
+
Ruby implementation of an event store. Ships with in-memory event repository, generic instrumentation and dispatches events synchronously.
|
4
|
+
|
5
|
+
Find out more at [https://railseventstore.org](https://railseventstore.org/)
|
@@ -13,7 +13,7 @@ module RubyEventStore
|
|
13
13
|
|
14
14
|
|
15
15
|
@repository = repository
|
16
|
-
@mapper =
|
16
|
+
@mapper = mapper
|
17
17
|
@subscriptions = subscriptions
|
18
18
|
@broker = Broker.new(subscriptions: subscriptions, dispatcher: dispatcher)
|
19
19
|
@clock = clock
|
@@ -64,7 +64,7 @@ module RubyEventStore
|
|
64
64
|
# @param expected_version (see #publish)
|
65
65
|
# @return [self]
|
66
66
|
def link(event_ids, stream_name:, expected_version: :any)
|
67
|
-
repository.link_to_stream(event_ids, Stream.new(stream_name), ExpectedVersion.new(expected_version))
|
67
|
+
repository.link_to_stream(Array(event_ids), Stream.new(stream_name), ExpectedVersion.new(expected_version))
|
68
68
|
self
|
69
69
|
end
|
70
70
|
|
@@ -132,7 +132,7 @@ module RubyEventStore
|
|
132
132
|
# @param to [Class, String] type of events to get list of sybscribed handlers
|
133
133
|
# @return [Array<Object, Class>]
|
134
134
|
def subscribers_for(event_type)
|
135
|
-
subscriptions.all_for(event_type
|
135
|
+
subscriptions.all_for(event_type)
|
136
136
|
end
|
137
137
|
|
138
138
|
# Builder object for collecting temporary handlers (subscribers)
|
@@ -12,7 +12,7 @@ module RubyEventStore
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def append_to_stream(records, stream, expected_version)
|
15
|
-
serialized_records =
|
15
|
+
serialized_records = records.map { |record| record.serialize(serializer) }
|
16
16
|
|
17
17
|
with_synchronize(expected_version, stream) do |resolved_version|
|
18
18
|
raise WrongExpectedEventVersion unless last_stream_version(stream).equal?(resolved_version)
|
@@ -27,7 +27,7 @@ module RubyEventStore
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def link_to_stream(event_ids, stream, expected_version)
|
30
|
-
serialized_records =
|
30
|
+
serialized_records = event_ids.map { |id| read_event(id) }
|
31
31
|
|
32
32
|
with_synchronize(expected_version, stream) do |resolved_version|
|
33
33
|
raise WrongExpectedEventVersion unless last_stream_version(stream).equal?(resolved_version)
|
@@ -60,7 +60,7 @@ module RubyEventStore
|
|
60
60
|
serialized_records
|
61
61
|
.drop(offset)
|
62
62
|
.take(limit)
|
63
|
-
.map{|serialized_record| serialized_record.deserialize(serializer) }
|
63
|
+
.map { |serialized_record| serialized_record.deserialize(serializer) }
|
64
64
|
end
|
65
65
|
BatchEnumerator.new(spec.batch_size, serialized_records.size, batch_reader).each
|
66
66
|
elsif spec.first?
|
@@ -7,9 +7,9 @@ module RubyEventStore
|
|
7
7
|
@instrumentation = instrumentation
|
8
8
|
end
|
9
9
|
|
10
|
-
def append_to_stream(
|
11
|
-
instrumentation.instrument("append_to_stream.repository.rails_event_store", events:
|
12
|
-
repository.append_to_stream(
|
10
|
+
def append_to_stream(records, stream, expected_version)
|
11
|
+
instrumentation.instrument("append_to_stream.repository.rails_event_store", events: records, stream: stream) do
|
12
|
+
repository.append_to_stream(records, stream, expected_version)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
@@ -1,36 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'yaml'
|
4
|
-
|
5
3
|
module RubyEventStore
|
6
4
|
module Mappers
|
7
5
|
class Default < PipelineMapper
|
8
|
-
|
9
|
-
|
10
|
-
attr_reader :serializer
|
11
|
-
|
12
|
-
def initialize(serializer: UNSET, events_class_remapping: {})
|
13
|
-
case serializer
|
14
|
-
when UNSET
|
15
|
-
@serializer = YAML
|
16
|
-
else
|
17
|
-
warn <<~EOW
|
18
|
-
Passing serializer: to #{self.class} has been deprecated.
|
19
|
-
|
20
|
-
Pass it directly to the repository and the scheduler. For example:
|
21
|
-
|
22
|
-
Rails.configuration.event_store = RailsEventStore::Client.new(
|
23
|
-
mapper: RubyEventStore::Mappers::Default.new,
|
24
|
-
repository: RailsEventStoreActiveRecord::EventRepository.new(serializer: #{serializer}),
|
25
|
-
dispatcher: RubyEventStore::ComposedDispatcher.new(
|
26
|
-
RailsEventStore::AfterCommitAsyncDispatcher.new(scheduler: RailsEventStore::ActiveJobScheduler.new(serializer: #{serializer}),
|
27
|
-
RubyEventStore::Dispatcher.new
|
28
|
-
)
|
29
|
-
)
|
30
|
-
EOW
|
31
|
-
@serializer = serializer
|
32
|
-
end
|
33
|
-
|
6
|
+
def initialize(events_class_remapping: {})
|
34
7
|
super(Pipeline.new(
|
35
8
|
Transformation::EventClassRemapper.new(events_class_remapping),
|
36
9
|
Transformation::SymbolizeMetadataKeys.new,
|
@@ -2,12 +2,14 @@
|
|
2
2
|
|
3
3
|
module RubyEventStore
|
4
4
|
module Mappers
|
5
|
-
class JSONMapper <
|
5
|
+
class JSONMapper < Default
|
6
6
|
def initialize(events_class_remapping: {})
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
@@ -3,13 +3,10 @@
|
|
3
3
|
module RubyEventStore
|
4
4
|
module Mappers
|
5
5
|
class Pipeline
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(*transformations_, transformations: UNSET, to_domain_event: Transformation::DomainEvent.new)
|
6
|
+
def initialize(*transformations, to_domain_event: Transformation::DomainEvent.new)
|
9
7
|
@transformations = [
|
10
8
|
to_domain_event,
|
11
|
-
|
12
|
-
transformations_,
|
9
|
+
transformations,
|
13
10
|
].flatten.freeze
|
14
11
|
end
|
15
12
|
|
@@ -26,27 +23,6 @@ module RubyEventStore
|
|
26
23
|
end
|
27
24
|
|
28
25
|
attr_reader :transformations
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def deprecated_transformations(transformations)
|
33
|
-
case transformations
|
34
|
-
when UNSET
|
35
|
-
[]
|
36
|
-
else
|
37
|
-
warn <<~EOW
|
38
|
-
Passing transformations via keyword parameter is deprecated.
|
39
|
-
Please use positional arguments from now on.
|
40
|
-
|
41
|
-
Was:
|
42
|
-
RubyEventStore::Mappers::Pipeline.new(transformations: transformations)
|
43
|
-
|
44
|
-
Is now:
|
45
|
-
RubyEventStore::Mappers::Pipeline.new(*transformations)
|
46
|
-
EOW
|
47
|
-
transformations
|
48
|
-
end
|
49
|
-
end
|
50
26
|
end
|
51
27
|
end
|
52
28
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyEventStore
|
4
|
+
module Mappers
|
5
|
+
module Transformation
|
6
|
+
class Upcast
|
7
|
+
class RecordUpcaster
|
8
|
+
def initialize(upcast_map)
|
9
|
+
@upcast_map = upcast_map
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(record)
|
13
|
+
identity = lambda { |r| r }
|
14
|
+
new_record = @upcast_map.fetch(record.event_type, identity)[record]
|
15
|
+
if new_record.equal?(record)
|
16
|
+
record
|
17
|
+
else
|
18
|
+
call(new_record)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(upcast_map)
|
24
|
+
@record_upcaster = RecordUpcaster.new(upcast_map)
|
25
|
+
end
|
26
|
+
|
27
|
+
def dump(record)
|
28
|
+
record
|
29
|
+
end
|
30
|
+
|
31
|
+
def load(record)
|
32
|
+
@record_upcaster.call(record)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -105,8 +105,8 @@ module RubyEventStore
|
|
105
105
|
|
106
106
|
specify 'append_to_stream returns self' do
|
107
107
|
repository
|
108
|
-
.append_to_stream(event = SRecord.new, stream, version_none)
|
109
|
-
.append_to_stream(event = SRecord.new, stream, version_0)
|
108
|
+
.append_to_stream([event = SRecord.new], stream, version_none)
|
109
|
+
.append_to_stream([event = SRecord.new], stream, version_0)
|
110
110
|
end
|
111
111
|
|
112
112
|
specify 'link_to_stream returns self' do
|
@@ -114,12 +114,12 @@ module RubyEventStore
|
|
114
114
|
event1 = SRecord.new
|
115
115
|
repository
|
116
116
|
.append_to_stream([event0, event1], stream, version_none)
|
117
|
-
.link_to_stream(event0.event_id, stream_flow, version_none)
|
118
|
-
.link_to_stream(event1.event_id, stream_flow, version_0)
|
117
|
+
.link_to_stream([event0.event_id], stream_flow, version_none)
|
118
|
+
.link_to_stream([event1.event_id], stream_flow, version_0)
|
119
119
|
end
|
120
120
|
|
121
121
|
specify 'adds an initial event to a new stream' do
|
122
|
-
repository.append_to_stream(event = SRecord.new, stream, version_none)
|
122
|
+
repository.append_to_stream([event = SRecord.new], stream, version_none)
|
123
123
|
expect(read_events_forward(repository).first).to eq(event)
|
124
124
|
expect(read_events_forward(repository, stream).first).to eq(event)
|
125
125
|
expect(read_events_forward(repository, stream_other)).to be_empty
|
@@ -127,8 +127,8 @@ module RubyEventStore
|
|
127
127
|
|
128
128
|
specify 'links an initial event to a new stream' do
|
129
129
|
repository
|
130
|
-
.append_to_stream(event = SRecord.new, stream, version_none)
|
131
|
-
.link_to_stream(event.event_id, stream_flow, version_none)
|
130
|
+
.append_to_stream([event = SRecord.new], stream, version_none)
|
131
|
+
.link_to_stream([event.event_id], stream_flow, version_none)
|
132
132
|
|
133
133
|
expect(read_events_forward(repository, count: 1).first).to eq(event)
|
134
134
|
expect(read_events_forward(repository, stream).first).to eq(event)
|
@@ -494,7 +494,7 @@ module RubyEventStore
|
|
494
494
|
begin
|
495
495
|
100.times do |j|
|
496
496
|
eid = "0000000#{i}-#{sprintf("%04d", j)}-0000-0000-000000000000"
|
497
|
-
repository.link_to_stream(eid, stream_flow, version_any)
|
497
|
+
repository.link_to_stream([eid], stream_flow, version_any)
|
498
498
|
end
|
499
499
|
rescue WrongExpectedEventVersion
|
500
500
|
fail_occurred = true
|
@@ -581,7 +581,7 @@ module RubyEventStore
|
|
581
581
|
100.times do |j|
|
582
582
|
begin
|
583
583
|
eid = "0000000#{i}-#{sprintf("%04d", j)}-0000-0000-000000000000"
|
584
|
-
repository.link_to_stream(eid, stream, version_auto)
|
584
|
+
repository.link_to_stream([eid], stream, version_auto)
|
585
585
|
sleep(rand(concurrency_level) / 1000.0)
|
586
586
|
rescue WrongExpectedEventVersion, *helper.rescuable_concurrency_test_errors
|
587
587
|
fail_occurred +=1
|
@@ -607,7 +607,7 @@ module RubyEventStore
|
|
607
607
|
|
608
608
|
it 'appended event is stored in given stream' do
|
609
609
|
expected_event = SRecord.new
|
610
|
-
repository.append_to_stream(expected_event, stream, version_any)
|
610
|
+
repository.append_to_stream([expected_event], stream, version_any)
|
611
611
|
expect(read_events_forward(repository, count: 1).first).to eq(expected_event)
|
612
612
|
expect(read_events_forward(repository, stream).first).to eq(expected_event)
|
613
613
|
expect(read_events_forward(repository, stream_other)).to be_empty
|
@@ -615,14 +615,14 @@ module RubyEventStore
|
|
615
615
|
|
616
616
|
it 'data attributes are retrieved' do
|
617
617
|
event = SRecord.new(data: { "order_id" => 3 })
|
618
|
-
repository.append_to_stream(event, stream, version_any)
|
618
|
+
repository.append_to_stream([event], stream, version_any)
|
619
619
|
retrieved_event = read_events_forward(repository, count: 1).first
|
620
620
|
expect(retrieved_event.data).to eq({ "order_id" => 3 })
|
621
621
|
end
|
622
622
|
|
623
623
|
it 'metadata attributes are retrieved' do
|
624
624
|
event = SRecord.new(metadata: { "request_id" => 3 })
|
625
|
-
repository.append_to_stream(event, stream, version_any)
|
625
|
+
repository.append_to_stream([event], stream, version_any)
|
626
626
|
retrieved_event = read_events_forward(repository, count: 1).first
|
627
627
|
expect(retrieved_event.metadata).to eq({ "request_id" => 3 })
|
628
628
|
end
|
@@ -633,8 +633,8 @@ module RubyEventStore
|
|
633
633
|
metadata: { "request_id" => 4},
|
634
634
|
)
|
635
635
|
repository
|
636
|
-
.append_to_stream(event, stream, version_any)
|
637
|
-
.link_to_stream(event.event_id, stream_flow, version_any)
|
636
|
+
.append_to_stream([event], stream, version_any)
|
637
|
+
.link_to_stream([event.event_id], stream_flow, version_any)
|
638
638
|
retrieved_event = read_events_forward(repository, stream_flow).first
|
639
639
|
expect(retrieved_event.metadata).to eq({ "request_id" => 4 })
|
640
640
|
expect(retrieved_event.data).to eq({ "order_id" => 3 })
|
@@ -642,8 +642,8 @@ module RubyEventStore
|
|
642
642
|
end
|
643
643
|
|
644
644
|
it 'does not have deleted streams' do
|
645
|
-
repository.append_to_stream(e1 = SRecord.new, stream, version_none)
|
646
|
-
repository.append_to_stream(e2 = SRecord.new, stream_other, version_none)
|
645
|
+
repository.append_to_stream([e1 = SRecord.new], stream, version_none)
|
646
|
+
repository.append_to_stream([e2 = SRecord.new], stream_other, version_none)
|
647
647
|
|
648
648
|
repository.delete_stream(stream)
|
649
649
|
expect(read_events_forward(repository, stream)).to be_empty
|
@@ -653,8 +653,8 @@ module RubyEventStore
|
|
653
653
|
|
654
654
|
it 'does not have deleted streams with linked events' do
|
655
655
|
repository
|
656
|
-
.append_to_stream(e1 = SRecord.new, stream, version_none)
|
657
|
-
.link_to_stream(e1.event_id, stream_flow, version_none)
|
656
|
+
.append_to_stream([e1 = SRecord.new], stream, version_none)
|
657
|
+
.link_to_stream([e1.event_id], stream_flow, version_none)
|
658
658
|
|
659
659
|
repository.delete_stream(stream_flow)
|
660
660
|
expect(read_events_forward(repository, stream_flow)).to be_empty
|
@@ -663,7 +663,7 @@ module RubyEventStore
|
|
663
663
|
|
664
664
|
it 'has or has not domain event' do
|
665
665
|
just_an_id = 'd5c134c2-db65-4e87-b6ea-d196f8f1a292'
|
666
|
-
repository.append_to_stream(SRecord.new(event_id: just_an_id), stream, version_none)
|
666
|
+
repository.append_to_stream([SRecord.new(event_id: just_an_id)], stream, version_none)
|
667
667
|
|
668
668
|
expect(repository.has_event?(just_an_id)).to be_truthy
|
669
669
|
expect(repository.has_event?(just_an_id.clone)).to be_truthy
|
@@ -675,8 +675,8 @@ module RubyEventStore
|
|
675
675
|
end
|
676
676
|
|
677
677
|
it 'knows last event in stream' do
|
678
|
-
repository.append_to_stream(a =SRecord.new(event_id: '00000000-0000-0000-0000-000000000001'), stream, version_none)
|
679
|
-
repository.append_to_stream(b = SRecord.new(event_id: '00000000-0000-0000-0000-000000000002'), stream, version_0)
|
678
|
+
repository.append_to_stream([a =SRecord.new(event_id: '00000000-0000-0000-0000-000000000001')], stream, version_none)
|
679
|
+
repository.append_to_stream([b = SRecord.new(event_id: '00000000-0000-0000-0000-000000000002')], stream, version_0)
|
680
680
|
|
681
681
|
expect(repository.last_stream_event(stream)).to eq(b)
|
682
682
|
expect(repository.last_stream_event(stream_other)).to be_nil
|
@@ -706,11 +706,11 @@ module RubyEventStore
|
|
706
706
|
ab60114c-011d-4d58-ab31-7ba65d99975e
|
707
707
|
868cac42-3d19-4b39-84e8-cd32d65c2445
|
708
708
|
].map { |id| SRecord.new(event_id: id) }
|
709
|
-
repository.append_to_stream(SRecord.new, stream_other, version_none)
|
709
|
+
repository.append_to_stream([SRecord.new], stream_other, version_none)
|
710
710
|
events.each.with_index do |event, index|
|
711
|
-
repository.append_to_stream(event, stream, ExpectedVersion.new(index - 1))
|
711
|
+
repository.append_to_stream([event], stream, ExpectedVersion.new(index - 1))
|
712
712
|
end
|
713
|
-
repository.append_to_stream(SRecord.new, stream_other, version_0)
|
713
|
+
repository.append_to_stream([SRecord.new], stream_other, version_0)
|
714
714
|
|
715
715
|
expect(read_events_forward(repository, stream, count: 3)).to eq(events.first(3))
|
716
716
|
expect(read_events_forward(repository, stream, count: 100)).to eq(events)
|
@@ -741,13 +741,13 @@ module RubyEventStore
|
|
741
741
|
ab60114c-011d-4d58-ab31-7ba65d99975e
|
742
742
|
868cac42-3d19-4b39-84e8-cd32d65c2445
|
743
743
|
].map { |id| SRecord.new(event_id: id) }
|
744
|
-
repository.append_to_stream(SRecord.new, stream_other, version_none)
|
744
|
+
repository.append_to_stream([SRecord.new], stream_other, version_none)
|
745
745
|
events.each.with_index do |event, index|
|
746
746
|
repository
|
747
|
-
.append_to_stream(event, stream, ExpectedVersion.new(index - 1))
|
748
|
-
.link_to_stream(event.event_id, stream_flow, ExpectedVersion.new(index - 1))
|
747
|
+
.append_to_stream([event], stream, ExpectedVersion.new(index - 1))
|
748
|
+
.link_to_stream([event.event_id], stream_flow, ExpectedVersion.new(index - 1))
|
749
749
|
end
|
750
|
-
repository.append_to_stream(SRecord.new, stream_other, version_0)
|
750
|
+
repository.append_to_stream([SRecord.new], stream_other, version_0)
|
751
751
|
|
752
752
|
expect(read_events_forward(repository, stream_flow, count: 3)).to eq(events.first(3))
|
753
753
|
expect(read_events_forward(repository, stream_flow, count: 100)).to eq(events)
|
@@ -768,11 +768,11 @@ module RubyEventStore
|
|
768
768
|
s1 = stream
|
769
769
|
s2 = stream_other
|
770
770
|
repository
|
771
|
-
.append_to_stream(a = SRecord.new(event_id: '7010d298-ab69-4bb1-9251-f3466b5d1282'), s1, version_none)
|
772
|
-
.append_to_stream(b = SRecord.new(event_id: '34f88aca-aaba-4ca0-9256-8017b47528c5'), s2, version_none)
|
773
|
-
.append_to_stream(c = SRecord.new(event_id: '8e61c864-ceae-4684-8726-97c34eb8fc4f'), s1, version_0)
|
774
|
-
.append_to_stream(d = SRecord.new(event_id: '30963ed9-6349-450b-ac9b-8ea50115b3bd'), s2, version_0)
|
775
|
-
.append_to_stream(e = SRecord.new(event_id: '5bdc58b7-e8a7-4621-afd6-ccb828d72457'), s2, version_1)
|
771
|
+
.append_to_stream([a = SRecord.new(event_id: '7010d298-ab69-4bb1-9251-f3466b5d1282')], s1, version_none)
|
772
|
+
.append_to_stream([b = SRecord.new(event_id: '34f88aca-aaba-4ca0-9256-8017b47528c5')], s2, version_none)
|
773
|
+
.append_to_stream([c = SRecord.new(event_id: '8e61c864-ceae-4684-8726-97c34eb8fc4f')], s1, version_0)
|
774
|
+
.append_to_stream([d = SRecord.new(event_id: '30963ed9-6349-450b-ac9b-8ea50115b3bd')], s2, version_0)
|
775
|
+
.append_to_stream([e = SRecord.new(event_id: '5bdc58b7-e8a7-4621-afd6-ccb828d72457')], s2, version_1)
|
776
776
|
|
777
777
|
expect(read_events_forward(repository, s1)).to eq [a,c]
|
778
778
|
expect(read_events_backward(repository, s1)).to eq [c,a]
|
@@ -781,16 +781,16 @@ module RubyEventStore
|
|
781
781
|
it 'reads all stream linked events forward & backward' do
|
782
782
|
s1, fs1, fs2 = stream, stream_flow, stream_other
|
783
783
|
repository
|
784
|
-
.append_to_stream(a = SRecord.new(event_id: '7010d298-ab69-4bb1-9251-f3466b5d1282'), s1, version_none)
|
785
|
-
.append_to_stream(b = SRecord.new(event_id: '34f88aca-aaba-4ca0-9256-8017b47528c5'), s1, version_0)
|
786
|
-
.append_to_stream(c = SRecord.new(event_id: '8e61c864-ceae-4684-8726-97c34eb8fc4f'), s1, version_1)
|
787
|
-
.append_to_stream(d = SRecord.new(event_id: '30963ed9-6349-450b-ac9b-8ea50115b3bd'), s1, version_2)
|
788
|
-
.append_to_stream(e = SRecord.new(event_id: '5bdc58b7-e8a7-4621-afd6-ccb828d72457'), s1, version_3)
|
789
|
-
.link_to_stream('7010d298-ab69-4bb1-9251-f3466b5d1282', fs1, version_none)
|
790
|
-
.link_to_stream('34f88aca-aaba-4ca0-9256-8017b47528c5', fs2, version_none)
|
791
|
-
.link_to_stream('8e61c864-ceae-4684-8726-97c34eb8fc4f', fs1, version_0)
|
792
|
-
.link_to_stream('30963ed9-6349-450b-ac9b-8ea50115b3bd', fs2, version_0)
|
793
|
-
.link_to_stream('5bdc58b7-e8a7-4621-afd6-ccb828d72457', fs2, version_1)
|
784
|
+
.append_to_stream([a = SRecord.new(event_id: '7010d298-ab69-4bb1-9251-f3466b5d1282')], s1, version_none)
|
785
|
+
.append_to_stream([b = SRecord.new(event_id: '34f88aca-aaba-4ca0-9256-8017b47528c5')], s1, version_0)
|
786
|
+
.append_to_stream([c = SRecord.new(event_id: '8e61c864-ceae-4684-8726-97c34eb8fc4f')], s1, version_1)
|
787
|
+
.append_to_stream([d = SRecord.new(event_id: '30963ed9-6349-450b-ac9b-8ea50115b3bd')], s1, version_2)
|
788
|
+
.append_to_stream([e = SRecord.new(event_id: '5bdc58b7-e8a7-4621-afd6-ccb828d72457')], s1, version_3)
|
789
|
+
.link_to_stream(['7010d298-ab69-4bb1-9251-f3466b5d1282'], fs1, version_none)
|
790
|
+
.link_to_stream(['34f88aca-aaba-4ca0-9256-8017b47528c5'], fs2, version_none)
|
791
|
+
.link_to_stream(['8e61c864-ceae-4684-8726-97c34eb8fc4f'], fs1, version_0)
|
792
|
+
.link_to_stream(['30963ed9-6349-450b-ac9b-8ea50115b3bd'], fs2, version_0)
|
793
|
+
.link_to_stream(['5bdc58b7-e8a7-4621-afd6-ccb828d72457'], fs2, version_1)
|
794
794
|
|
795
795
|
expect(read_events_forward(repository, fs1)).to eq [a,c]
|
796
796
|
expect(read_events_backward(repository, fs1)).to eq [c,a]
|
@@ -810,7 +810,7 @@ module RubyEventStore
|
|
810
810
|
868cac42-3d19-4b39-84e8-cd32d65c2445
|
811
811
|
].map { |id| SRecord.new(event_id: id) }
|
812
812
|
events.each do |ev|
|
813
|
-
repository.append_to_stream(ev, Stream.new(SecureRandom.uuid), version_none)
|
813
|
+
repository.append_to_stream([ev], Stream.new(SecureRandom.uuid), version_none)
|
814
814
|
end
|
815
815
|
|
816
816
|
expect(read_events_forward(repository, count: 3)).to eq(events.first(3))
|
@@ -843,8 +843,8 @@ module RubyEventStore
|
|
843
843
|
].map { |id| SRecord.new(event_id: id) }
|
844
844
|
events.each do |ev|
|
845
845
|
repository
|
846
|
-
.append_to_stream(ev, Stream.new(SecureRandom.uuid), version_none)
|
847
|
-
.link_to_stream(ev.event_id, Stream.new(SecureRandom.uuid), version_none)
|
846
|
+
.append_to_stream([ev], Stream.new(SecureRandom.uuid), version_none)
|
847
|
+
.link_to_stream([ev.event_id], Stream.new(SecureRandom.uuid), version_none)
|
848
848
|
end
|
849
849
|
|
850
850
|
expect(read_events_forward(repository, count: 3)).to eq(events.first(3))
|
@@ -867,8 +867,8 @@ module RubyEventStore
|
|
867
867
|
96c920b1-cdd0-40f4-907c-861b9fff7d02
|
868
868
|
56404f79-0ba0-4aa0-8524-dc3436368ca0
|
869
869
|
].map{|id| SRecord.new(event_id: id) }
|
870
|
-
repository.append_to_stream(events.first, stream, version_none)
|
871
|
-
repository.append_to_stream(events.last, stream, version_0)
|
870
|
+
repository.append_to_stream([events.first], stream, version_none)
|
871
|
+
repository.append_to_stream([events.last], stream, version_0)
|
872
872
|
|
873
873
|
expect(read_events_forward(repository, from: "96c920b1-cdd0-40f4-907c-861b9fff7d02")).to eq([events.last])
|
874
874
|
expect(read_events_backward(repository, from: "56404f79-0ba0-4aa0-8524-dc3436368ca0")).to eq([events.first])
|
@@ -883,13 +883,13 @@ module RubyEventStore
|
|
883
883
|
|
884
884
|
it 'does not allow same event twice in a stream' do
|
885
885
|
repository.append_to_stream(
|
886
|
-
SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef"),
|
886
|
+
[SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef")],
|
887
887
|
stream,
|
888
888
|
version_none
|
889
889
|
)
|
890
890
|
expect do
|
891
891
|
repository.append_to_stream(
|
892
|
-
SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef"),
|
892
|
+
[SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef")],
|
893
893
|
stream,
|
894
894
|
version_0
|
895
895
|
)
|
@@ -898,13 +898,13 @@ module RubyEventStore
|
|
898
898
|
|
899
899
|
it 'does not allow same event twice' do
|
900
900
|
repository.append_to_stream(
|
901
|
-
SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef"),
|
901
|
+
[SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef")],
|
902
902
|
stream,
|
903
903
|
version_none
|
904
904
|
)
|
905
905
|
expect do
|
906
906
|
repository.append_to_stream(
|
907
|
-
SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef"),
|
907
|
+
[SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef")],
|
908
908
|
stream_other,
|
909
909
|
version_none
|
910
910
|
)
|
@@ -912,41 +912,39 @@ module RubyEventStore
|
|
912
912
|
end
|
913
913
|
|
914
914
|
it 'does not allow linking same event twice in a stream' do
|
915
|
-
repository.append_to_stream(
|
916
|
-
|
917
|
-
|
915
|
+
repository.append_to_stream(
|
916
|
+
[SRecord.new(event_id: "a1b49edb-7636-416f-874a-88f94b859bef")],
|
917
|
+
stream,
|
918
918
|
version_none
|
919
|
-
).link_to_stream("a1b49edb-7636-416f-874a-88f94b859bef", stream_flow, version_none)
|
919
|
+
).link_to_stream(["a1b49edb-7636-416f-874a-88f94b859bef"], stream_flow, version_none)
|
920
920
|
expect do
|
921
|
-
repository.link_to_stream("a1b49edb-7636-416f-874a-88f94b859bef", stream_flow, version_0)
|
921
|
+
repository.link_to_stream(["a1b49edb-7636-416f-874a-88f94b859bef"], stream_flow, version_0)
|
922
922
|
end.to raise_error(EventDuplicatedInStream)
|
923
923
|
end
|
924
924
|
|
925
925
|
it 'allows appending to GLOBAL_STREAM explicitly' do
|
926
926
|
event = SRecord.new(event_id: "df8b2ba3-4e2c-4888-8d14-4364855fa80e")
|
927
|
-
repository.append_to_stream(event, global_stream, version_any)
|
927
|
+
repository.append_to_stream([event], global_stream, version_any)
|
928
928
|
|
929
929
|
expect(read_events_forward(repository, count: 10)).to eq([event])
|
930
930
|
end
|
931
931
|
|
932
932
|
specify "events not persisted if append failed" do
|
933
|
-
repository.append_to_stream([
|
934
|
-
SRecord.new,
|
935
|
-
], stream, version_none)
|
933
|
+
repository.append_to_stream([SRecord.new], stream, version_none)
|
936
934
|
|
937
935
|
expect do
|
938
|
-
repository.append_to_stream(
|
939
|
-
SRecord.new(
|
940
|
-
|
941
|
-
|
942
|
-
|
936
|
+
repository.append_to_stream(
|
937
|
+
[SRecord.new(event_id: '9bedf448-e4d0-41a3-a8cd-f94aec7aa763')],
|
938
|
+
stream,
|
939
|
+
version_none
|
940
|
+
)
|
943
941
|
end.to raise_error(WrongExpectedEventVersion)
|
944
942
|
expect(repository.has_event?('9bedf448-e4d0-41a3-a8cd-f94aec7aa763')).to be_falsey
|
945
943
|
end
|
946
944
|
|
947
945
|
specify 'linking non-existent event' do
|
948
946
|
expect do
|
949
|
-
repository.link_to_stream('72922e65-1b32-4e97-8023-03ae81dd3a27', stream_flow, version_none)
|
947
|
+
repository.link_to_stream(['72922e65-1b32-4e97-8023-03ae81dd3a27'], stream_flow, version_none)
|
950
948
|
end.to raise_error do |err|
|
951
949
|
expect(err).to be_a(EventNotFound)
|
952
950
|
expect(err.event_id).to eq('72922e65-1b32-4e97-8023-03ae81dd3a27')
|
@@ -966,7 +964,7 @@ module RubyEventStore
|
|
966
964
|
expect(binary.valid_encoding?).to eq(true)
|
967
965
|
|
968
966
|
repository.append_to_stream(
|
969
|
-
event = SRecord.new(data: binary, metadata: binary),
|
967
|
+
[event = SRecord.new(data: binary, metadata: binary)],
|
970
968
|
stream,
|
971
969
|
version_none
|
972
970
|
)
|
@@ -1185,7 +1183,7 @@ module RubyEventStore
|
|
1185
1183
|
stream_c = Stream.new('Stream C')
|
1186
1184
|
repository.append_to_stream([event_1, event_2], stream_a, version_any)
|
1187
1185
|
repository.append_to_stream([event_3], stream_b, version_any)
|
1188
|
-
repository.link_to_stream(event_1.event_id, stream_c, version_none)
|
1186
|
+
repository.link_to_stream([event_1.event_id], stream_c, version_none)
|
1189
1187
|
|
1190
1188
|
expect(repository.streams_of('8a6f053e-3ce2-4c82-a55b-4d02c66ae6ea')).to eq [stream_a, stream_c]
|
1191
1189
|
expect(repository.streams_of('8cee1139-4f96-483a-a175-2b947283c3c7')).to eq [stream_a]
|
@@ -1281,7 +1279,7 @@ module RubyEventStore
|
|
1281
1279
|
|
1282
1280
|
specify 'timestamp precision' do
|
1283
1281
|
time = Time.utc(2020, 9, 11, 12, 26, 0, 123456)
|
1284
|
-
repository.append_to_stream(SRecord.new(timestamp: time), stream, version_none)
|
1282
|
+
repository.append_to_stream([SRecord.new(timestamp: time)], stream, version_none)
|
1285
1283
|
event = read_events_forward(repository, count: 1).first
|
1286
1284
|
|
1287
1285
|
expect(event.timestamp).to eq(time)
|
@@ -114,4 +114,23 @@ RSpec.shared_examples :subscriptions do |subscriptions_class|
|
|
114
114
|
|
115
115
|
expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler, handler])
|
116
116
|
end
|
117
|
+
|
118
|
+
it 'subscribes by type of event which is a class' do
|
119
|
+
handler = TestHandler.new
|
120
|
+
subscriptions.add_subscription(handler, [Test1DomainEvent])
|
121
|
+
subscriptions.add_thread_subscription(handler, [Test1DomainEvent])
|
122
|
+
|
123
|
+
expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler, handler])
|
124
|
+
expect(subscriptions.all_for(Test1DomainEvent)).to eq([handler, handler])
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'subscribes by type of event which is a class or string with custom type resolver' do
|
128
|
+
subscriptions = subscriptions_class.new(event_type_resolver: ->(type) { type.to_s.reverse })
|
129
|
+
handler = TestHandler.new
|
130
|
+
subscriptions.add_subscription(handler, [Test1DomainEvent])
|
131
|
+
subscriptions.add_thread_subscription(handler, ['Test1DomainEvent'])
|
132
|
+
|
133
|
+
expect(subscriptions.all_for('Test1DomainEvent')).to eq([handler, handler])
|
134
|
+
expect(subscriptions.all_for(Test1DomainEvent)).to eq([handler, handler])
|
135
|
+
end
|
117
136
|
end
|
@@ -4,14 +4,15 @@ require 'concurrent'
|
|
4
4
|
|
5
5
|
module RubyEventStore
|
6
6
|
class Subscriptions
|
7
|
-
def initialize
|
7
|
+
def initialize(event_type_resolver: default_event_type_resolver)
|
8
|
+
@event_type_resolver = event_type_resolver
|
8
9
|
@local = LocalSubscriptions.new
|
9
10
|
@global = GlobalSubscriptions.new
|
10
|
-
@thread
|
11
|
+
@thread = ThreadSubscriptions.new
|
11
12
|
end
|
12
13
|
|
13
14
|
def add_subscription(subscriber, event_types)
|
14
|
-
local.add(subscriber, event_types)
|
15
|
+
local.add(subscriber, resolve_event_types(event_types))
|
15
16
|
end
|
16
17
|
|
17
18
|
def add_global_subscription(subscriber)
|
@@ -19,7 +20,7 @@ module RubyEventStore
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def add_thread_subscription(subscriber, event_types)
|
22
|
-
thread.local.add(subscriber, event_types)
|
23
|
+
thread.local.add(subscriber, resolve_event_types(event_types))
|
23
24
|
end
|
24
25
|
|
25
26
|
def add_thread_global_subscription(subscriber)
|
@@ -27,12 +28,25 @@ module RubyEventStore
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def all_for(event_type)
|
30
|
-
|
31
|
+
resolved_event_type = resolve_event_type(event_type)
|
32
|
+
[local, global, thread].map{|r| r.all_for(resolved_event_type)}.reduce(&:+)
|
31
33
|
end
|
32
34
|
|
33
35
|
private
|
34
36
|
attr_reader :local, :global, :thread
|
35
37
|
|
38
|
+
def default_event_type_resolver
|
39
|
+
->(value) { value.to_s }
|
40
|
+
end
|
41
|
+
|
42
|
+
def resolve_event_types(event_types)
|
43
|
+
event_types.map(&method(:resolve_event_type))
|
44
|
+
end
|
45
|
+
|
46
|
+
def resolve_event_type(type)
|
47
|
+
@event_type_resolver.call(type)
|
48
|
+
end
|
49
|
+
|
36
50
|
class ThreadSubscriptions
|
37
51
|
def initialize
|
38
52
|
@local = ThreadLocalSubscriptions.new
|
@@ -51,8 +65,8 @@ module RubyEventStore
|
|
51
65
|
end
|
52
66
|
|
53
67
|
def add(subscription, event_types)
|
54
|
-
event_types.each{ |type| @subscriptions[type
|
55
|
-
->() {event_types.each{ |type| @subscriptions.fetch(type
|
68
|
+
event_types.each{ |type| @subscriptions[type] << subscription }
|
69
|
+
->() {event_types.each{ |type| @subscriptions.fetch(type).delete(subscription) } }
|
56
70
|
end
|
57
71
|
|
58
72
|
def all_for(event_type)
|
@@ -83,8 +97,8 @@ module RubyEventStore
|
|
83
97
|
end
|
84
98
|
|
85
99
|
def add(subscription, event_types)
|
86
|
-
event_types.each{ |type| @subscriptions.value[type
|
87
|
-
->() {event_types.each{ |type| @subscriptions.value.fetch(type
|
100
|
+
event_types.each{ |type| @subscriptions.value[type] << subscription }
|
101
|
+
->() {event_types.each{ |type| @subscriptions.value.fetch(type).delete(subscription) } }
|
88
102
|
end
|
89
103
|
|
90
104
|
def all_for(event_type)
|
@@ -4,23 +4,23 @@ module RubyEventStore
|
|
4
4
|
class TransformKeys
|
5
5
|
class << self
|
6
6
|
def stringify(data)
|
7
|
-
|
7
|
+
deep_transform(data, &:to_s)
|
8
8
|
end
|
9
9
|
|
10
10
|
def symbolize(data)
|
11
|
-
|
11
|
+
deep_transform(data, &:to_sym)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def
|
16
|
+
def deep_transform(data, &block)
|
17
17
|
data.each_with_object({}) do |(k, v), h|
|
18
18
|
h[yield(k)] =
|
19
19
|
case v
|
20
20
|
when Hash
|
21
|
-
|
21
|
+
deep_transform(v, &block)
|
22
22
|
when Array
|
23
|
-
v.map{|i| Hash === i ?
|
23
|
+
v.map{|i| Hash === i ? deep_transform(i, &block) : i}
|
24
24
|
else
|
25
25
|
v
|
26
26
|
end
|
data/lib/ruby_event_store.rb
CHANGED
@@ -24,12 +24,11 @@ require 'ruby_event_store/mappers/in_memory_encryption_key_repository'
|
|
24
24
|
require 'ruby_event_store/mappers/transformation/domain_event'
|
25
25
|
require 'ruby_event_store/mappers/transformation/encryption'
|
26
26
|
require 'ruby_event_store/mappers/transformation/event_class_remapper'
|
27
|
+
require 'ruby_event_store/mappers/transformation/upcast'
|
27
28
|
require 'ruby_event_store/mappers/transformation/stringify_metadata_keys'
|
28
29
|
require 'ruby_event_store/mappers/transformation/symbolize_metadata_keys'
|
29
|
-
require 'ruby_event_store/mappers/transformation/serialization'
|
30
30
|
require 'ruby_event_store/mappers/pipeline'
|
31
31
|
require 'ruby_event_store/mappers/pipeline_mapper'
|
32
|
-
require 'ruby_event_store/mappers/deprecated_wrapper'
|
33
32
|
require 'ruby_event_store/mappers/default'
|
34
33
|
require 'ruby_event_store/mappers/forgotten_data'
|
35
34
|
require 'ruby_event_store/mappers/encryption_mapper'
|
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.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arkency
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -30,17 +30,15 @@ dependencies:
|
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 1.1.6
|
33
|
-
description:
|
34
|
-
|
35
|
-
|
33
|
+
description: |
|
34
|
+
Ruby implementation of an event store. Ships with in-memory event repository, generic instrumentation
|
35
|
+
and dispatches events synchronously.
|
36
|
+
email: dev@arkency.com
|
36
37
|
executables: []
|
37
38
|
extensions: []
|
38
|
-
extra_rdoc_files:
|
39
|
+
extra_rdoc_files:
|
40
|
+
- README.md
|
39
41
|
files:
|
40
|
-
- CHANGELOG.md
|
41
|
-
- Gemfile
|
42
|
-
- Gemfile.lock
|
43
|
-
- Makefile
|
44
42
|
- README.md
|
45
43
|
- lib/ruby_event_store.rb
|
46
44
|
- lib/ruby_event_store/batch_enumerator.rb
|
@@ -59,7 +57,6 @@ files:
|
|
59
57
|
- lib/ruby_event_store/instrumented_repository.rb
|
60
58
|
- lib/ruby_event_store/link_by_metadata.rb
|
61
59
|
- lib/ruby_event_store/mappers/default.rb
|
62
|
-
- lib/ruby_event_store/mappers/deprecated_wrapper.rb
|
63
60
|
- lib/ruby_event_store/mappers/encryption_key.rb
|
64
61
|
- lib/ruby_event_store/mappers/encryption_mapper.rb
|
65
62
|
- lib/ruby_event_store/mappers/forgotten_data.rb
|
@@ -72,9 +69,9 @@ files:
|
|
72
69
|
- lib/ruby_event_store/mappers/transformation/domain_event.rb
|
73
70
|
- lib/ruby_event_store/mappers/transformation/encryption.rb
|
74
71
|
- lib/ruby_event_store/mappers/transformation/event_class_remapper.rb
|
75
|
-
- lib/ruby_event_store/mappers/transformation/serialization.rb
|
76
72
|
- lib/ruby_event_store/mappers/transformation/stringify_metadata_keys.rb
|
77
73
|
- lib/ruby_event_store/mappers/transformation/symbolize_metadata_keys.rb
|
74
|
+
- lib/ruby_event_store/mappers/transformation/upcast.rb
|
78
75
|
- lib/ruby_event_store/metadata.rb
|
79
76
|
- lib/ruby_event_store/null.rb
|
80
77
|
- lib/ruby_event_store/projection.rb
|
@@ -94,12 +91,11 @@ files:
|
|
94
91
|
- lib/ruby_event_store/subscriptions.rb
|
95
92
|
- lib/ruby_event_store/transform_keys.rb
|
96
93
|
- lib/ruby_event_store/version.rb
|
97
|
-
- ruby_event_store.gemspec
|
98
94
|
homepage: https://railseventstore.org
|
99
95
|
licenses:
|
100
96
|
- MIT
|
101
97
|
metadata:
|
102
|
-
homepage_uri: https://railseventstore.org
|
98
|
+
homepage_uri: https://railseventstore.org
|
103
99
|
changelog_uri: https://github.com/RailsEventStore/rails_event_store/releases
|
104
100
|
source_code_uri: https://github.com/RailsEventStore/rails_event_store
|
105
101
|
bug_tracker_uri: https://github.com/RailsEventStore/rails_event_store/issues
|
@@ -111,7 +107,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
107
|
requirements:
|
112
108
|
- - ">="
|
113
109
|
- !ruby/object:Gem::Version
|
114
|
-
version: '
|
110
|
+
version: '2.5'
|
115
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
112
|
requirements:
|
117
113
|
- - ">="
|
@@ -121,5 +117,5 @@ requirements: []
|
|
121
117
|
rubygems_version: 3.1.4
|
122
118
|
signing_key:
|
123
119
|
specification_version: 4
|
124
|
-
summary:
|
120
|
+
summary: Implementation of an event store in Ruby
|
125
121
|
test_files: []
|
data/CHANGELOG.md
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
Further changes can be tracked at [releases page](https://github.com/RailsEventStore/rails_event_store/releases).
|
2
|
-
|
3
|
-
### 0.14.0 (21.08.2017)
|
4
|
-
|
5
|
-
* Change: Add lint for 3rd party implementations of dispatcher
|
6
|
-
* Change: Deprecated MethodNotDefined error, use InvalidHandler instead
|
7
|
-
|
8
|
-
### 0.13.0 (15.10.2016)
|
9
|
-
|
10
|
-
* Change: Dropped ClosedStruct event (meta)data wrapping PR #34
|
11
|
-
Fix for Issue with ClosedStruct and object_id #33
|
12
|
-
* Change: Refactor RubyEventStore::Client to have the same methods signatures as RailsEventStore::Client (PR #35),
|
13
|
-
this will allow to remove most of the code form RailsEventStore::Client without breaking current
|
14
|
-
applications that use RailsEventStore::Client. This change is however a breaking one for RubyEventStore.
|
15
|
-
|
16
|
-
### 0.12.1 (11.08.2016)
|
17
|
-
|
18
|
-
* Fix: improve EventRepository specification tests (mutation tests)
|
19
|
-
|
20
|
-
### 0.12.0 (10.08.2016)
|
21
|
-
|
22
|
-
* Change: all public methods arguments with default values are now keyword arguments
|
23
|
-
|
24
|
-
### 0.11.0 (12.07.2016)
|
25
|
-
|
26
|
-
* Change: Call instead of handle_event, handle_event marked as deprecated in PR #18 is now removed PR #25
|
27
|
-
* Change: Rename RubyEventStore::Facade to RubyEventStore::Client PR #26
|
28
|
-
|
29
|
-
### 0.10.1 (12.07.2016)
|
30
|
-
|
31
|
-
* Added few new tests for repositories
|
32
|
-
|
33
|
-
### 0.10.0 (12.07.2016)
|
34
|
-
|
35
|
-
* Fix: When using `append_to_stream`, expected version is no longer compared using `equal?` commit bdbe4600073d278cbf1024e8d49801fec768f6a7
|
36
|
-
* Change: Creating events with data is now done using `data` keyword argument. Previously events were created using the syntax `OrderCreated.new(order_id: 123)`, now it has to be `OrderCreated.new(data: { order_id: 123 })`. PR #24
|
37
|
-
* Change: Access to `data` attributes in an event is now using `event.data.some_attribute` syntax. `event.data[:some_attribute]` won't work either. PR #24
|
38
|
-
* Change: Only events with the same name, event_id and data are equal - metadata is no longer taken into account PR #24
|
39
|
-
* Change: `metadata[:timestamp]` is now set when event is appended to the stream, not when it is initialized PR #24
|
40
|
-
* Change: Initialization of `RubyEventStore::Facade` is now using keyword arguments PR #24
|
41
|
-
* Add support to `metadata_proc` PR #24
|
42
|
-
* `ClosedStruct` is now a dependency PR #24
|
43
|
-
|
44
|
-
### 0.9.0 (24.06.2016)
|
45
|
-
|
46
|
-
* Change: Call instead of handle_event, handle_event stays for now but is deprecated PR #18
|
47
|
-
* Fix: Clarify Licensing terms #23 - MIT licence it is from now
|
48
|
-
|
49
|
-
### 0.8.0 (21.06.2016)
|
50
|
-
|
51
|
-
* Change: Possibility to create projection based on all events PR #19
|
52
|
-
|
53
|
-
### 0.7.0 (21.06.2016)
|
54
|
-
|
55
|
-
* Change: support for Dynamic subscriptions PR #20
|
56
|
-
* Change: Add lint for 3rd party implementations of event broker PR #21
|
57
|
-
|
58
|
-
### 0.6.0 (25.05.2016)
|
59
|
-
|
60
|
-
* Ability to provide a custom dispatcher to PubSub::Broker PR #12
|
61
|
-
* Add support for projections PR #13
|
62
|
-
* Added prettier message for case of missing #handle_event method. PR #14
|
63
|
-
* Make file to run all the things PR #15
|
64
|
-
|
65
|
-
### 0.5.0 (21.03.2016)
|
66
|
-
|
67
|
-
* Change: Event class refactoring to make default values more explicit PR #11
|
68
|
-
* Change: No nils, use symbols instead - :any & :none replaced meaningless nil value
|
69
|
-
* Change: Let event broker to be given as a dependency
|
70
|
-
* Change: Remove Event#event_type - use class instead PR #10
|
71
|
-
|
72
|
-
### 0.4.0 (17.03.2016)
|
73
|
-
|
74
|
-
* Change: Use class names to subscribe events PR #8
|
75
|
-
|
76
|
-
### 0.3.1 (13.03.2016)
|
77
|
-
|
78
|
-
* Fix Don't overwrite timestamps when reading from repository
|
79
|
-
|
80
|
-
### 0.3.0 (03.03.2016)
|
81
|
-
|
82
|
-
* Change: read_all_streams won't group_by results by stream name PR #4
|
83
|
-
* Change: new way of define attributes of domain event PR #5
|
84
|
-
* Change: reading forward and backward, refactored facade interface #6
|
85
|
-
* Change: in memory event repository is now part of the gem, with shared specification PR #7
|
86
|
-
|
87
|
-
### 0.2.0 (27.01.2016)
|
88
|
-
|
89
|
-
* Change: Return the event that the repository returns PR #2
|
90
|
-
|
91
|
-
### 0.1.0 (26.05.2015)
|
92
|
-
|
93
|
-
Initial version
|
data/Gemfile
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
3
|
-
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
eval_gemfile '../support/bundler/Gemfile.shared'
|
7
|
-
|
8
|
-
gem 'activesupport', '6.0.3.4'
|
9
|
-
gem 'concurrent-ruby', github: 'ruby-concurrency/concurrent-ruby', ref: 'c4cbc968c55e5b983dae953095761896220c46d1'
|
data/Gemfile.lock
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
GIT
|
2
|
-
remote: https://github.com/ruby-concurrency/concurrent-ruby.git
|
3
|
-
revision: c4cbc968c55e5b983dae953095761896220c46d1
|
4
|
-
ref: c4cbc968c55e5b983dae953095761896220c46d1
|
5
|
-
specs:
|
6
|
-
concurrent-ruby (1.1.7)
|
7
|
-
|
8
|
-
PATH
|
9
|
-
remote: .
|
10
|
-
specs:
|
11
|
-
ruby_event_store (2.0.3)
|
12
|
-
concurrent-ruby (~> 1.0, >= 1.1.6)
|
13
|
-
|
14
|
-
GEM
|
15
|
-
remote: https://oss:7AXfeZdAfCqL1PvHm2nvDJO6Zd9UW8IK@gem.mutant.dev/
|
16
|
-
specs:
|
17
|
-
abstract_type (0.0.7)
|
18
|
-
adamantium (0.2.0)
|
19
|
-
ice_nine (~> 0.11.0)
|
20
|
-
memoizable (~> 0.4.0)
|
21
|
-
anima (0.3.2)
|
22
|
-
abstract_type (~> 0.0.7)
|
23
|
-
adamantium (~> 0.2)
|
24
|
-
equalizer (~> 0.0.11)
|
25
|
-
ast (2.4.1)
|
26
|
-
concord (0.1.6)
|
27
|
-
adamantium (~> 0.2.0)
|
28
|
-
equalizer (~> 0.0.9)
|
29
|
-
diff-lcs (1.4.4)
|
30
|
-
equalizer (0.0.11)
|
31
|
-
i18n (1.8.5)
|
32
|
-
concurrent-ruby (~> 1.0)
|
33
|
-
ice_nine (0.11.2)
|
34
|
-
memoizable (0.4.2)
|
35
|
-
thread_safe (~> 0.3, >= 0.3.1)
|
36
|
-
minitest (5.14.2)
|
37
|
-
mprelude (0.1.0)
|
38
|
-
abstract_type (~> 0.0.7)
|
39
|
-
adamantium (~> 0.2.0)
|
40
|
-
concord (~> 0.1.5)
|
41
|
-
equalizer (~> 0.0.9)
|
42
|
-
ice_nine (~> 0.11.1)
|
43
|
-
procto (~> 0.0.2)
|
44
|
-
mutant-license (0.1.1.2.1627430819213747598431630701693729869473.0)
|
45
|
-
parser (3.0.0.0)
|
46
|
-
ast (~> 2.4.1)
|
47
|
-
procto (0.0.3)
|
48
|
-
rspec-core (3.10.1)
|
49
|
-
rspec-support (~> 3.10.0)
|
50
|
-
rspec-expectations (3.10.1)
|
51
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
52
|
-
rspec-support (~> 3.10.0)
|
53
|
-
rspec-mocks (3.10.1)
|
54
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
55
|
-
rspec-support (~> 3.10.0)
|
56
|
-
rspec-support (3.10.1)
|
57
|
-
thread_safe (0.3.6)
|
58
|
-
tzinfo (1.2.9)
|
59
|
-
thread_safe (~> 0.1)
|
60
|
-
unparser (0.5.6)
|
61
|
-
abstract_type (~> 0.0.7)
|
62
|
-
adamantium (~> 0.2.0)
|
63
|
-
anima (~> 0.3.1)
|
64
|
-
concord (~> 0.1.5)
|
65
|
-
diff-lcs (~> 1.3)
|
66
|
-
equalizer (~> 0.0.9)
|
67
|
-
mprelude (~> 0.1.0)
|
68
|
-
parser (>= 3.0.0)
|
69
|
-
procto (~> 0.0.2)
|
70
|
-
variable (0.0.1)
|
71
|
-
equalizer (~> 0.0.11)
|
72
|
-
zeitwerk (2.4.2)
|
73
|
-
|
74
|
-
GEM
|
75
|
-
remote: https://rubygems.org/
|
76
|
-
specs:
|
77
|
-
activesupport (6.0.3.4)
|
78
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
79
|
-
i18n (>= 0.7, < 2)
|
80
|
-
minitest (~> 5.1)
|
81
|
-
tzinfo (~> 1.1)
|
82
|
-
zeitwerk (~> 2.2, >= 2.2.2)
|
83
|
-
mutant (0.10.22)
|
84
|
-
abstract_type (~> 0.0.7)
|
85
|
-
adamantium (~> 0.2.0)
|
86
|
-
anima (~> 0.3.1)
|
87
|
-
ast (~> 2.2)
|
88
|
-
concord (~> 0.1.5)
|
89
|
-
diff-lcs (~> 1.3)
|
90
|
-
equalizer (~> 0.0.9)
|
91
|
-
ice_nine (~> 0.11.1)
|
92
|
-
memoizable (~> 0.4.2)
|
93
|
-
mprelude (~> 0.1.0)
|
94
|
-
parser (~> 3.0.0)
|
95
|
-
procto (~> 0.0.2)
|
96
|
-
unparser (~> 0.5.6)
|
97
|
-
variable (~> 0.0.1)
|
98
|
-
mutant-rspec (0.10.22)
|
99
|
-
mutant (= 0.10.22)
|
100
|
-
rspec-core (>= 3.8.0, < 4.0.0)
|
101
|
-
rake (13.0.3)
|
102
|
-
rspec (3.10.0)
|
103
|
-
rspec-core (~> 3.10.0)
|
104
|
-
rspec-expectations (~> 3.10.0)
|
105
|
-
rspec-mocks (~> 3.10.0)
|
106
|
-
|
107
|
-
PLATFORMS
|
108
|
-
ruby
|
109
|
-
|
110
|
-
DEPENDENCIES
|
111
|
-
activesupport (= 6.0.3.4)
|
112
|
-
concurrent-ruby!
|
113
|
-
mutant (~> 0.10.21)
|
114
|
-
mutant-license!
|
115
|
-
mutant-rspec (~> 0.10.21)
|
116
|
-
rake (>= 10.0)
|
117
|
-
rspec (~> 3.6)
|
118
|
-
ruby_event_store!
|
119
|
-
|
120
|
-
BUNDLED WITH
|
121
|
-
2.2.27
|
data/Makefile
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
GEM_VERSION = $(shell cat ../RES_VERSION)
|
2
|
-
GEM_NAME = ruby_event_store
|
3
|
-
REQUIRE = $(GEM_NAME)
|
4
|
-
IGNORE = RubyEventStore::InMemoryRepository\#with_synchronize \
|
5
|
-
RubyEventStore::Client\#initialize \
|
6
|
-
RubyEventStore::Client\#default_clock \
|
7
|
-
RubyEventStore::Client\#default_correlation_id_generator \
|
8
|
-
RubyEventStore::Client::Within\#add_thread_subscribers \
|
9
|
-
RubyEventStore::Client::Within\#add_thread_global_subscribers \
|
10
|
-
RubyEventStore::Client::Within\#call \
|
11
|
-
RubyEventStore::Mappers::InMemoryEncryptionKeyRepository\#prepare_encrypt \
|
12
|
-
RubyEventStore::Mappers::EncryptionKey\#prepare_encrypt \
|
13
|
-
RubyEventStore::Mappers::EncryptionKey\#prepare_decrypt \
|
14
|
-
RubyEventStore::Mappers::EncryptionKey\#prepare_auth_data \
|
15
|
-
RubyEventStore::Mappers::EncryptionKey\#encrypt_authenticated \
|
16
|
-
RubyEventStore::Mappers::EncryptionKey\#ciphertext_from_authenticated \
|
17
|
-
RubyEventStore::Mappers::Default\#serializer \
|
18
|
-
RubyEventStore::Mappers::JSONMapper\#serializer \
|
19
|
-
RubyEventStore::Mappers::NullMapper\#serializer \
|
20
|
-
RubyEventStore::Mappers::EncryptionMapper\#serializer \
|
21
|
-
RubyEventStore::Mappers::PipelineMapper\#serializer \
|
22
|
-
RubyEventStore::Mappers::DeprecatedWrapper\#serializer \
|
23
|
-
RubyEventStore::Mappers::InstrumentedMapper\#serializer \
|
24
|
-
RubyEventStore::Mappers::Transformation::Serialization*
|
25
|
-
|
26
|
-
SUBJECT ?= RubyEventStore*
|
27
|
-
|
28
|
-
include ../support/make/install.mk
|
29
|
-
include ../support/make/test.mk
|
30
|
-
include ../support/make/mutant.mk
|
31
|
-
include ../support/make/gem.mk
|
32
|
-
include ../support/make/help.mk
|
@@ -1,33 +0,0 @@
|
|
1
|
-
module RubyEventStore
|
2
|
-
module Mappers
|
3
|
-
class DeprecatedWrapper
|
4
|
-
def initialize(mapper)
|
5
|
-
@mapper = mapper
|
6
|
-
end
|
7
|
-
|
8
|
-
def serializer
|
9
|
-
@mapper.serializer
|
10
|
-
end
|
11
|
-
|
12
|
-
def event_to_record(any)
|
13
|
-
@mapper.event_to_record(any)
|
14
|
-
rescue NoMethodError => e
|
15
|
-
raise unless e.message =~ /undefined method `event_to_record/
|
16
|
-
warn <<~EOW
|
17
|
-
Deprecation: Please rename #{@mapper.class}#event_to_serialized_record to #{@mapper.class}#event_to_record.
|
18
|
-
EOW
|
19
|
-
@mapper.event_to_serialized_record(any)
|
20
|
-
end
|
21
|
-
|
22
|
-
def record_to_event(any)
|
23
|
-
@mapper.record_to_event(any)
|
24
|
-
rescue NoMethodError => e
|
25
|
-
raise unless e.message =~ /undefined method `record_to_event/
|
26
|
-
warn <<~EOW
|
27
|
-
Deprecation: Please rename #{@mapper.class}#serialized_record_to_event to #{@mapper.class}#record_to_event.
|
28
|
-
EOW
|
29
|
-
@mapper.serialized_record_to_event(any)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
|
5
|
-
module RubyEventStore
|
6
|
-
module Mappers
|
7
|
-
module Transformation
|
8
|
-
class Serialization
|
9
|
-
def initialize(serializer: YAML)
|
10
|
-
warn <<~EOW
|
11
|
-
#{self.class} has been deprecated and is effectively no-op. You should remove this transformation from your pipeline.
|
12
|
-
|
13
|
-
Instead, pass the serializer directly to the repository and the scheduler. For example:
|
14
|
-
|
15
|
-
Rails.configuration.event_store = RailsEventStore::Client.new(
|
16
|
-
mapper: RubyEventStore::Mappers::Default.new,
|
17
|
-
repository: RailsEventStoreActiveRecord::EventRepository.new(serializer: #{serializer}),
|
18
|
-
dispatcher: RubyEventStore::ComposedDispatcher.new(
|
19
|
-
RubyEventStore::ImmediateAsyncDispatcher.new(scheduler: ActiveJobScheduler.new(serializer: #{serializer}),
|
20
|
-
RubyEventStore::Dispatcher.new
|
21
|
-
)
|
22
|
-
)
|
23
|
-
EOW
|
24
|
-
end
|
25
|
-
|
26
|
-
def dump(item)
|
27
|
-
item
|
28
|
-
end
|
29
|
-
|
30
|
-
def load(item)
|
31
|
-
item
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/ruby_event_store.gemspec
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'ruby_event_store/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = 'ruby_event_store'
|
8
|
-
spec.version = RubyEventStore::VERSION
|
9
|
-
spec.licenses = ['MIT']
|
10
|
-
spec.authors = ['Arkency']
|
11
|
-
spec.email = ['dev@arkency.com']
|
12
|
-
|
13
|
-
spec.summary = %q{Event Store in Ruby}
|
14
|
-
spec.description = %q{Implementation of Event Store in Ruby}
|
15
|
-
spec.homepage = 'https://railseventstore.org'
|
16
|
-
spec.metadata = {
|
17
|
-
"homepage_uri" => "https://railseventstore.org/",
|
18
|
-
"changelog_uri" => "https://github.com/RailsEventStore/rails_event_store/releases",
|
19
|
-
"source_code_uri" => "https://github.com/RailsEventStore/rails_event_store",
|
20
|
-
"bug_tracker_uri" => "https://github.com/RailsEventStore/rails_event_store/issues",
|
21
|
-
}
|
22
|
-
|
23
|
-
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test/|spec/|features/|.mutant.yml)}) }
|
24
|
-
spec.require_paths = ['lib']
|
25
|
-
|
26
|
-
spec.add_dependency 'concurrent-ruby', '~> 1.0', '>= 1.1.6'
|
27
|
-
end
|