ruby_event_store 2.2.0 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
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