ruby_event_store 2.2.0 → 2.4.1
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/batch_enumerator.rb +3 -3
- data/lib/ruby_event_store/broker.rb +5 -4
- data/lib/ruby_event_store/client.rb +75 -46
- data/lib/ruby_event_store/composed_dispatcher.rb +1 -3
- data/lib/ruby_event_store/correlated_commands.rb +4 -15
- data/lib/ruby_event_store/errors.rb +11 -10
- data/lib/ruby_event_store/event.rb +9 -14
- data/lib/ruby_event_store/expected_version.rb +3 -7
- data/lib/ruby_event_store/in_memory_repository.rb +100 -37
- data/lib/ruby_event_store/instrumented_dispatcher.rb +11 -2
- data/lib/ruby_event_store/instrumented_repository.rb +13 -8
- data/lib/ruby_event_store/link_by_metadata.rb +4 -21
- data/lib/ruby_event_store/mappers/default.rb +6 -4
- data/lib/ruby_event_store/mappers/encryption_key.rb +7 -16
- data/lib/ruby_event_store/mappers/encryption_mapper.rb +6 -6
- data/lib/ruby_event_store/mappers/forgotten_data.rb +1 -1
- data/lib/ruby_event_store/mappers/in_memory_encryption_key_repository.rb +1 -1
- data/lib/ruby_event_store/mappers/null_mapper.rb +0 -1
- data/lib/ruby_event_store/mappers/pipeline.rb +3 -10
- data/lib/ruby_event_store/mappers/pipeline_mapper.rb +1 -0
- data/lib/ruby_event_store/mappers/transformation/domain_event.rb +23 -13
- data/lib/ruby_event_store/mappers/transformation/encryption.rb +21 -25
- data/lib/ruby_event_store/mappers/transformation/event_class_remapper.rb +6 -5
- data/lib/ruby_event_store/mappers/transformation/stringify_metadata_keys.rb +6 -5
- data/lib/ruby_event_store/mappers/transformation/symbolize_metadata_keys.rb +6 -5
- data/lib/ruby_event_store/mappers/transformation/upcast.rb +2 -6
- data/lib/ruby_event_store/metadata.rb +46 -17
- data/lib/ruby_event_store/projection.rb +12 -20
- data/lib/ruby_event_store/record.rb +14 -26
- data/lib/ruby_event_store/serialized_record.rb +14 -26
- data/lib/ruby_event_store/serializers/yaml.rb +17 -0
- data/lib/ruby_event_store/spec/broker_lint.rb +38 -28
- data/lib/ruby_event_store/spec/event_lint.rb +10 -10
- data/lib/ruby_event_store/spec/event_repository_lint.rb +745 -741
- data/lib/ruby_event_store/spec/mapper_lint.rb +2 -2
- data/lib/ruby_event_store/spec/subscriptions_lint.rb +58 -57
- data/lib/ruby_event_store/specification.rb +20 -16
- data/lib/ruby_event_store/specification_reader.rb +2 -3
- data/lib/ruby_event_store/specification_result.rb +52 -46
- data/lib/ruby_event_store/stream.rb +3 -7
- data/lib/ruby_event_store/subscriptions.rb +14 -15
- data/lib/ruby_event_store/transform_keys.rb +1 -1
- data/lib/ruby_event_store/version.rb +1 -1
- data/lib/ruby_event_store.rb +44 -43
- metadata +6 -4
@@ -5,12 +5,12 @@ module RubyEventStore
|
|
5
5
|
StringsRequired = Class.new(StandardError)
|
6
6
|
def initialize(event_id:, data:, metadata:, event_type:, timestamp:, valid_at:)
|
7
7
|
raise StringsRequired unless [event_id, event_type].all? { |v| v.instance_of?(String) }
|
8
|
-
@event_id
|
9
|
-
@data
|
10
|
-
@metadata
|
8
|
+
@event_id = event_id
|
9
|
+
@data = data
|
10
|
+
@metadata = metadata
|
11
11
|
@event_type = event_type
|
12
|
-
@timestamp
|
13
|
-
@valid_at
|
12
|
+
@timestamp = timestamp
|
13
|
+
@valid_at = valid_at
|
14
14
|
@serialized_records = {}
|
15
15
|
freeze
|
16
16
|
end
|
@@ -19,24 +19,12 @@ module RubyEventStore
|
|
19
19
|
|
20
20
|
BIG_VALUE = 0b110011100100000010010010110011101011110101010101001100111110011
|
21
21
|
def hash
|
22
|
-
[
|
23
|
-
self.class,
|
24
|
-
event_id,
|
25
|
-
data,
|
26
|
-
metadata,
|
27
|
-
event_type,
|
28
|
-
timestamp,
|
29
|
-
valid_at,
|
30
|
-
].hash ^ BIG_VALUE
|
22
|
+
[self.class, event_id, data, metadata, event_type, timestamp, valid_at].hash ^ BIG_VALUE
|
31
23
|
end
|
32
24
|
|
33
25
|
def ==(other)
|
34
|
-
other.instance_of?(self.class) &&
|
35
|
-
other.
|
36
|
-
other.data.eql?(data) &&
|
37
|
-
other.metadata.eql?(metadata) &&
|
38
|
-
other.event_type.eql?(event_type) &&
|
39
|
-
other.timestamp.eql?(timestamp) &&
|
26
|
+
other.instance_of?(self.class) && other.event_id.eql?(event_id) && other.data.eql?(data) &&
|
27
|
+
other.metadata.eql?(metadata) && other.event_type.eql?(event_type) && other.timestamp.eql?(timestamp) &&
|
40
28
|
other.valid_at.eql?(valid_at)
|
41
29
|
end
|
42
30
|
|
@@ -47,19 +35,19 @@ module RubyEventStore
|
|
47
35
|
metadata: metadata,
|
48
36
|
event_type: event_type,
|
49
37
|
timestamp: timestamp,
|
50
|
-
valid_at: valid_at
|
38
|
+
valid_at: valid_at
|
51
39
|
}
|
52
40
|
end
|
53
41
|
|
54
42
|
def serialize(serializer)
|
55
43
|
@serialized_records[serializer] ||=
|
56
44
|
SerializedRecord.new(
|
57
|
-
event_id:
|
45
|
+
event_id: event_id,
|
58
46
|
event_type: event_type,
|
59
|
-
data:
|
60
|
-
metadata:
|
61
|
-
timestamp:
|
62
|
-
valid_at:
|
47
|
+
data: serializer.dump(data),
|
48
|
+
metadata: serializer.dump(metadata),
|
49
|
+
timestamp: timestamp.iso8601(TIMESTAMP_PRECISION),
|
50
|
+
valid_at: valid_at.iso8601(TIMESTAMP_PRECISION)
|
63
51
|
)
|
64
52
|
end
|
65
53
|
|
@@ -5,12 +5,12 @@ module RubyEventStore
|
|
5
5
|
StringsRequired = Class.new(StandardError)
|
6
6
|
def initialize(event_id:, data:, metadata:, event_type:, timestamp:, valid_at:)
|
7
7
|
raise StringsRequired unless [event_id, event_type].all? { |v| v.instance_of?(String) }
|
8
|
-
@event_id
|
9
|
-
@data
|
10
|
-
@metadata
|
8
|
+
@event_id = event_id
|
9
|
+
@data = data
|
10
|
+
@metadata = metadata
|
11
11
|
@event_type = event_type
|
12
|
-
@timestamp
|
13
|
-
@valid_at
|
12
|
+
@timestamp = timestamp
|
13
|
+
@valid_at = valid_at
|
14
14
|
freeze
|
15
15
|
end
|
16
16
|
|
@@ -18,24 +18,12 @@ module RubyEventStore
|
|
18
18
|
|
19
19
|
BIG_VALUE = 0b110011100100000010010010110011101011110101010101001100111110111
|
20
20
|
def hash
|
21
|
-
[
|
22
|
-
self.class,
|
23
|
-
event_id,
|
24
|
-
data,
|
25
|
-
metadata,
|
26
|
-
event_type,
|
27
|
-
timestamp,
|
28
|
-
valid_at,
|
29
|
-
].hash ^ BIG_VALUE
|
21
|
+
[self.class, event_id, data, metadata, event_type, timestamp, valid_at].hash ^ BIG_VALUE
|
30
22
|
end
|
31
23
|
|
32
24
|
def ==(other)
|
33
|
-
other.instance_of?(self.class) &&
|
34
|
-
other.
|
35
|
-
other.data.eql?(data) &&
|
36
|
-
other.metadata.eql?(metadata) &&
|
37
|
-
other.event_type.eql?(event_type) &&
|
38
|
-
other.timestamp.eql?(timestamp) &&
|
25
|
+
other.instance_of?(self.class) && other.event_id.eql?(event_id) && other.data.eql?(data) &&
|
26
|
+
other.metadata.eql?(metadata) && other.event_type.eql?(event_type) && other.timestamp.eql?(timestamp) &&
|
39
27
|
other.valid_at.eql?(valid_at)
|
40
28
|
end
|
41
29
|
|
@@ -46,18 +34,18 @@ module RubyEventStore
|
|
46
34
|
metadata: metadata,
|
47
35
|
event_type: event_type,
|
48
36
|
timestamp: timestamp,
|
49
|
-
valid_at: valid_at
|
37
|
+
valid_at: valid_at
|
50
38
|
}
|
51
39
|
end
|
52
40
|
|
53
41
|
def deserialize(serializer)
|
54
42
|
Record.new(
|
55
|
-
event_id:
|
43
|
+
event_id: event_id,
|
56
44
|
event_type: event_type,
|
57
|
-
data:
|
58
|
-
metadata:
|
59
|
-
timestamp:
|
60
|
-
valid_at:
|
45
|
+
data: serializer.load(data),
|
46
|
+
metadata: serializer.load(metadata),
|
47
|
+
timestamp: Time.iso8601(timestamp),
|
48
|
+
valid_at: Time.iso8601(valid_at)
|
61
49
|
)
|
62
50
|
end
|
63
51
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
module RubyEventStore
|
6
|
+
module Serializers
|
7
|
+
class YAML
|
8
|
+
def self.dump(value)
|
9
|
+
::YAML.dump(value)
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.load(serialized)
|
13
|
+
::YAML.respond_to?(:unsafe_load) ? ::YAML.unsafe_load(serialized) : ::YAML.load(serialized)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,63 +1,73 @@
|
|
1
1
|
RSpec.shared_examples :broker do |broker_klass|
|
2
|
-
let(:event) { instance_double(::RubyEventStore::Event, event_type:
|
3
|
-
let(:record) { instance_double(::RubyEventStore::Record)
|
2
|
+
let(:event) { instance_double(::RubyEventStore::Event, event_type: "EventType") }
|
3
|
+
let(:record) { instance_double(::RubyEventStore::Record) }
|
4
4
|
let(:handler) { HandlerClass.new }
|
5
5
|
let(:subscriptions) { ::RubyEventStore::Subscriptions.new }
|
6
6
|
let(:dispatcher) { ::RubyEventStore::Dispatcher.new }
|
7
7
|
let(:broker) { broker_klass.new(subscriptions: subscriptions, dispatcher: dispatcher) }
|
8
8
|
|
9
9
|
specify "no dispatch when no subscriptions" do
|
10
|
-
expect(subscriptions).to receive(:all_for).with(
|
10
|
+
expect(subscriptions).to receive(:all_for).with("EventType").and_return([])
|
11
11
|
expect(dispatcher).not_to receive(:call)
|
12
12
|
broker.call(event, record)
|
13
13
|
end
|
14
14
|
|
15
15
|
specify "calls subscription" do
|
16
|
-
expect(subscriptions).to receive(:all_for).with(
|
16
|
+
expect(subscriptions).to receive(:all_for).with("EventType").and_return([handler])
|
17
17
|
expect(dispatcher).to receive(:call).with(handler, event, record)
|
18
18
|
broker.call(event, record)
|
19
19
|
end
|
20
20
|
|
21
21
|
specify "calls subscribed class" do
|
22
|
-
expect(subscriptions).to receive(:all_for).with(
|
22
|
+
expect(subscriptions).to receive(:all_for).with("EventType").and_return([HandlerClass])
|
23
23
|
expect(dispatcher).to receive(:call).with(HandlerClass, event, record)
|
24
24
|
broker.call(event, record)
|
25
25
|
end
|
26
26
|
|
27
27
|
specify "calls all subscriptions" do
|
28
|
-
expect(subscriptions).to receive(:all_for).with(
|
28
|
+
expect(subscriptions).to receive(:all_for).with("EventType").and_return([handler, HandlerClass])
|
29
29
|
expect(dispatcher).to receive(:call).with(handler, event, record)
|
30
30
|
expect(dispatcher).to receive(:call).with(HandlerClass, event, record)
|
31
31
|
broker.call(event, record)
|
32
32
|
end
|
33
33
|
|
34
|
-
specify
|
35
|
-
expect { broker.add_subscription(nil, [])}.to raise_error(
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
specify "raise error when no subscriber" do
|
35
|
+
expect { broker.add_subscription(nil, []) }.to raise_error(
|
36
|
+
RubyEventStore::SubscriberNotExist,
|
37
|
+
"subscriber must be first argument or block"
|
38
|
+
)
|
39
|
+
expect { broker.add_global_subscription(nil) }.to raise_error(RubyEventStore::SubscriberNotExist),
|
40
|
+
"subscriber must be first argument or block"
|
41
|
+
expect { broker.add_thread_subscription(nil, []).call }.to raise_error(RubyEventStore::SubscriberNotExist),
|
42
|
+
"subscriber must be first argument or block"
|
43
|
+
expect { broker.add_thread_global_subscription(nil).call }.to raise_error(RubyEventStore::SubscriberNotExist),
|
44
|
+
"subscriber must be first argument or block"
|
39
45
|
end
|
40
46
|
|
41
|
-
specify
|
47
|
+
specify "raise error when wrong subscriber" do
|
42
48
|
allow(dispatcher).to receive(:verify).and_return(false)
|
43
|
-
expect
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
expect { broker.add_subscription(HandlerClass, []) }.to raise_error(
|
50
|
+
RubyEventStore::InvalidHandler,
|
51
|
+
/Handler HandlerClass is invalid for dispatcher .*Dispatcher/
|
52
|
+
)
|
53
|
+
expect { broker.add_global_subscription(HandlerClass) }.to raise_error(
|
54
|
+
RubyEventStore::InvalidHandler,
|
55
|
+
/is invalid for dispatcher/
|
56
|
+
)
|
57
|
+
expect { broker.add_thread_subscription(HandlerClass, []) }.to raise_error(
|
58
|
+
RubyEventStore::InvalidHandler,
|
59
|
+
/is invalid for dispatcher/
|
60
|
+
)
|
61
|
+
expect { broker.add_thread_global_subscription(HandlerClass) }.to raise_error(
|
62
|
+
RubyEventStore::InvalidHandler,
|
63
|
+
/is invalid for dispatcher/
|
64
|
+
)
|
55
65
|
end
|
56
66
|
|
57
67
|
specify "verify and add - local subscriptions" do
|
58
68
|
expect(dispatcher).to receive(:verify).with(handler).and_return(true)
|
59
|
-
expect(subscriptions).to receive(:add_subscription).with(handler, [
|
60
|
-
broker.add_subscription(handler, [
|
69
|
+
expect(subscriptions).to receive(:add_subscription).with(handler, ["EventType"])
|
70
|
+
broker.add_subscription(handler, ["EventType"])
|
61
71
|
end
|
62
72
|
|
63
73
|
specify "verify and add - global subscriptions" do
|
@@ -68,8 +78,8 @@ RSpec.shared_examples :broker do |broker_klass|
|
|
68
78
|
|
69
79
|
specify "verify and add - thread local subscriptions" do
|
70
80
|
expect(dispatcher).to receive(:verify).with(handler).and_return(true)
|
71
|
-
expect(subscriptions).to receive(:add_thread_subscription).with(handler, [
|
72
|
-
broker.add_thread_subscription(handler, [
|
81
|
+
expect(subscriptions).to receive(:add_thread_subscription).with(handler, ["EventType"])
|
82
|
+
broker.add_thread_subscription(handler, ["EventType"])
|
73
83
|
end
|
74
84
|
|
75
85
|
specify "verify and add - thread global subscriptions" do
|
@@ -1,36 +1,36 @@
|
|
1
1
|
RSpec.shared_examples :event do |event_class, data, metadata|
|
2
|
-
it
|
2
|
+
it "allows initialization" do
|
3
3
|
expect {
|
4
4
|
event_class.new(event_id: Object.new, data: data || Object.new, metadata: metadata || {})
|
5
5
|
}.not_to raise_error
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
8
|
+
it "provides event_id as string" do
|
9
9
|
event = event_class.new
|
10
10
|
expect(event.event_id).to be_an_instance_of(String)
|
11
|
-
expect(event.event_id).not_to eq
|
11
|
+
expect(event.event_id).not_to eq ""
|
12
12
|
expect(event.event_id).not_to eq nil
|
13
13
|
end
|
14
14
|
|
15
|
-
it
|
15
|
+
it "provides message_id as string" do
|
16
16
|
event = event_class.new
|
17
17
|
expect(event.message_id).to be_an_instance_of(String)
|
18
18
|
end
|
19
19
|
|
20
|
-
it
|
20
|
+
it "message_id is the same as event_id" do
|
21
21
|
event = event_class.new
|
22
22
|
expect(event.event_id).to eq event.message_id
|
23
23
|
end
|
24
24
|
|
25
|
-
it
|
26
|
-
event = event_class.new(event_id:
|
27
|
-
expect(event.event_id).to eq
|
25
|
+
it "exposes given event_id to string" do
|
26
|
+
event = event_class.new(event_id: 1_234_567_890)
|
27
|
+
expect(event.event_id).to eq "1234567890"
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
30
|
+
it "provides event type as string" do
|
31
31
|
event = event_class.new
|
32
32
|
expect(event.event_type).to be_an_instance_of(String)
|
33
|
-
expect(event.event_type).not_to eq
|
33
|
+
expect(event.event_type).not_to eq ""
|
34
34
|
expect(event.event_type).not_to eq nil
|
35
35
|
end
|
36
36
|
|