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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ruby_event_store/batch_enumerator.rb +3 -3
  3. data/lib/ruby_event_store/broker.rb +5 -4
  4. data/lib/ruby_event_store/client.rb +75 -46
  5. data/lib/ruby_event_store/composed_dispatcher.rb +1 -3
  6. data/lib/ruby_event_store/correlated_commands.rb +4 -15
  7. data/lib/ruby_event_store/errors.rb +11 -10
  8. data/lib/ruby_event_store/event.rb +9 -14
  9. data/lib/ruby_event_store/expected_version.rb +3 -7
  10. data/lib/ruby_event_store/in_memory_repository.rb +100 -37
  11. data/lib/ruby_event_store/instrumented_dispatcher.rb +11 -2
  12. data/lib/ruby_event_store/instrumented_repository.rb +13 -8
  13. data/lib/ruby_event_store/link_by_metadata.rb +4 -21
  14. data/lib/ruby_event_store/mappers/default.rb +6 -4
  15. data/lib/ruby_event_store/mappers/encryption_key.rb +7 -16
  16. data/lib/ruby_event_store/mappers/encryption_mapper.rb +6 -6
  17. data/lib/ruby_event_store/mappers/forgotten_data.rb +1 -1
  18. data/lib/ruby_event_store/mappers/in_memory_encryption_key_repository.rb +1 -1
  19. data/lib/ruby_event_store/mappers/null_mapper.rb +0 -1
  20. data/lib/ruby_event_store/mappers/pipeline.rb +3 -10
  21. data/lib/ruby_event_store/mappers/pipeline_mapper.rb +1 -0
  22. data/lib/ruby_event_store/mappers/transformation/domain_event.rb +23 -13
  23. data/lib/ruby_event_store/mappers/transformation/encryption.rb +21 -25
  24. data/lib/ruby_event_store/mappers/transformation/event_class_remapper.rb +6 -5
  25. data/lib/ruby_event_store/mappers/transformation/stringify_metadata_keys.rb +6 -5
  26. data/lib/ruby_event_store/mappers/transformation/symbolize_metadata_keys.rb +6 -5
  27. data/lib/ruby_event_store/mappers/transformation/upcast.rb +2 -6
  28. data/lib/ruby_event_store/metadata.rb +46 -17
  29. data/lib/ruby_event_store/projection.rb +12 -20
  30. data/lib/ruby_event_store/record.rb +14 -26
  31. data/lib/ruby_event_store/serialized_record.rb +14 -26
  32. data/lib/ruby_event_store/serializers/yaml.rb +17 -0
  33. data/lib/ruby_event_store/spec/broker_lint.rb +38 -28
  34. data/lib/ruby_event_store/spec/event_lint.rb +10 -10
  35. data/lib/ruby_event_store/spec/event_repository_lint.rb +745 -741
  36. data/lib/ruby_event_store/spec/mapper_lint.rb +2 -2
  37. data/lib/ruby_event_store/spec/subscriptions_lint.rb +58 -57
  38. data/lib/ruby_event_store/specification.rb +20 -16
  39. data/lib/ruby_event_store/specification_reader.rb +2 -3
  40. data/lib/ruby_event_store/specification_result.rb +52 -46
  41. data/lib/ruby_event_store/stream.rb +3 -7
  42. data/lib/ruby_event_store/subscriptions.rb +14 -15
  43. data/lib/ruby_event_store/transform_keys.rb +1 -1
  44. data/lib/ruby_event_store/version.rb +1 -1
  45. data/lib/ruby_event_store.rb +44 -43
  46. 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 = event_id
9
- @data = data
10
- @metadata = metadata
8
+ @event_id = event_id
9
+ @data = data
10
+ @metadata = metadata
11
11
  @event_type = event_type
12
- @timestamp = timestamp
13
- @valid_at = 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.event_id.eql?(event_id) &&
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: event_id,
45
+ event_id: event_id,
58
46
  event_type: event_type,
59
- data: serializer.dump(data),
60
- metadata: serializer.dump(metadata),
61
- timestamp: timestamp.iso8601(TIMESTAMP_PRECISION),
62
- valid_at: valid_at.iso8601(TIMESTAMP_PRECISION),
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 = event_id
9
- @data = data
10
- @metadata = metadata
8
+ @event_id = event_id
9
+ @data = data
10
+ @metadata = metadata
11
11
  @event_type = event_type
12
- @timestamp = timestamp
13
- @valid_at = 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.event_id.eql?(event_id) &&
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: event_id,
43
+ event_id: event_id,
56
44
  event_type: event_type,
57
- data: serializer.load(data),
58
- metadata: serializer.load(metadata),
59
- timestamp: Time.iso8601(timestamp),
60
- valid_at: Time.iso8601(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: 'EventType') }
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('EventType').and_return([])
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('EventType').and_return([handler])
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('EventType').and_return([HandlerClass])
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('EventType').and_return([handler, HandlerClass])
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 'raise error when no subscriber' do
35
- expect { broker.add_subscription(nil, [])}.to raise_error(RubyEventStore::SubscriberNotExist, "subscriber must be first argument or block")
36
- expect { broker.add_global_subscription(nil)}.to raise_error(RubyEventStore::SubscriberNotExist), "subscriber must be first argument or block"
37
- expect { broker.add_thread_subscription(nil, []).call}.to raise_error(RubyEventStore::SubscriberNotExist), "subscriber must be first argument or block"
38
- expect { broker.add_thread_global_subscription(nil).call}.to raise_error(RubyEventStore::SubscriberNotExist), "subscriber must be first argument or block"
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 'raise error when wrong subscriber' do
47
+ specify "raise error when wrong subscriber" do
42
48
  allow(dispatcher).to receive(:verify).and_return(false)
43
- expect do
44
- broker.add_subscription(HandlerClass, [])
45
- end.to raise_error(RubyEventStore::InvalidHandler, /Handler HandlerClass is invalid for dispatcher .*Dispatcher/)
46
- expect do
47
- broker.add_global_subscription(HandlerClass)
48
- end.to raise_error(RubyEventStore::InvalidHandler, /is invalid for dispatcher/)
49
- expect do
50
- broker.add_thread_subscription(HandlerClass, [])
51
- end.to raise_error(RubyEventStore::InvalidHandler, /is invalid for dispatcher/)
52
- expect do
53
- broker.add_thread_global_subscription(HandlerClass)
54
- end.to raise_error(RubyEventStore::InvalidHandler, /is invalid for dispatcher/)
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, ['EventType'])
60
- broker.add_subscription(handler, ['EventType'])
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, ['EventType'])
72
- broker.add_thread_subscription(handler, ['EventType'])
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 'allows initialization' do
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 'provides event_id as string' do
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 'provides message_id as string' do
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 'message_id is the same as event_id' do
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 'exposes given event_id to string' do
26
- event = event_class.new(event_id: 1234567890)
27
- expect(event.event_id).to eq '1234567890'
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 'provides event type as string' do
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