ruby_event_store 2.3.0 → 2.4.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.
Files changed (44) 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 +47 -45
  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 -11
  8. data/lib/ruby_event_store/event.rb +6 -14
  9. data/lib/ruby_event_store/expected_version.rb +3 -7
  10. data/lib/ruby_event_store/in_memory_repository.rb +42 -31
  11. data/lib/ruby_event_store/instrumented_dispatcher.rb +3 -4
  12. data/lib/ruby_event_store/instrumented_repository.rb +3 -4
  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/null_mapper.rb +0 -1
  18. data/lib/ruby_event_store/mappers/pipeline.rb +3 -10
  19. data/lib/ruby_event_store/mappers/pipeline_mapper.rb +1 -0
  20. data/lib/ruby_event_store/mappers/transformation/domain_event.rb +21 -21
  21. data/lib/ruby_event_store/mappers/transformation/encryption.rb +21 -25
  22. data/lib/ruby_event_store/mappers/transformation/event_class_remapper.rb +6 -5
  23. data/lib/ruby_event_store/mappers/transformation/stringify_metadata_keys.rb +6 -5
  24. data/lib/ruby_event_store/mappers/transformation/symbolize_metadata_keys.rb +6 -5
  25. data/lib/ruby_event_store/mappers/transformation/upcast.rb +2 -6
  26. data/lib/ruby_event_store/metadata.rb +43 -14
  27. data/lib/ruby_event_store/projection.rb +10 -18
  28. data/lib/ruby_event_store/record.rb +14 -26
  29. data/lib/ruby_event_store/serialized_record.rb +14 -26
  30. data/lib/ruby_event_store/serializers/yaml.rb +17 -0
  31. data/lib/ruby_event_store/spec/broker_lint.rb +27 -17
  32. data/lib/ruby_event_store/spec/event_lint.rb +1 -1
  33. data/lib/ruby_event_store/spec/event_repository_lint.rb +513 -556
  34. data/lib/ruby_event_store/spec/mapper_lint.rb +2 -2
  35. data/lib/ruby_event_store/spec/subscriptions_lint.rb +23 -22
  36. data/lib/ruby_event_store/specification.rb +20 -16
  37. data/lib/ruby_event_store/specification_reader.rb +2 -3
  38. data/lib/ruby_event_store/specification_result.rb +52 -46
  39. data/lib/ruby_event_store/stream.rb +3 -7
  40. data/lib/ruby_event_store/subscriptions.rb +13 -14
  41. data/lib/ruby_event_store/transform_keys.rb +1 -1
  42. data/lib/ruby_event_store/version.rb +1 -1
  43. data/lib/ruby_event_store.rb +1 -0
  44. metadata +6 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9170662f3f550d541b79d403aeacfdf734a41a2c48c90752a7a35218913c0ead
4
- data.tar.gz: 3fa3e5b0e60d839391da9669a74228847aa921903c5d5a7db35363945af5b0f9
3
+ metadata.gz: 21f9e0f89d5ab86baa4f840b70c2093d518e8077ee8380cce54144c0f123aaf0
4
+ data.tar.gz: 9927020649c8f492843ce48af29b020e7831efae54a949cb2e8078288254bed9
5
5
  SHA512:
6
- metadata.gz: f753b40d9b216d372dba8692c69b855ac8bb382664f853be628e094557aa391fe1076c98a934f437158622b65a2cf6b5353e6672facadb408ae43441576f49ce
7
- data.tar.gz: 7b909ee630098c28449eae7ca5dc0b018158ee3a8e240074a25bf71d602bb0529873487dd5d6f6f0ff495cd06b9b1ddfa3b1538fe42f91556fcd1a7cba666232
6
+ metadata.gz: 4763bae7c34f07594ff9757f6482de78c84550bec861210e89930624438025ad0882bb7476eba0f1b511b02b2ff17c63c82a39b9ab065586dfc2704e6b21b6ba
7
+ data.tar.gz: 7ed29eadf34c3b9c3e22169250dfc5c9da81f2fa6f470c57c39313f79125c14ea57f2fd0a2c30715a915417ae84eb1b69bd8ec06a6b01de94e5bc000bea2f8ba
@@ -3,9 +3,9 @@
3
3
  module RubyEventStore
4
4
  class BatchEnumerator
5
5
  def initialize(batch_size, total_limit, reader)
6
- @batch_size = batch_size
6
+ @batch_size = batch_size
7
7
  @total_limit = total_limit
8
- @reader = reader
8
+ @reader = reader
9
9
  end
10
10
 
11
11
  def each
@@ -13,7 +13,7 @@ module RubyEventStore
13
13
 
14
14
  0.step(total_limit - 1, batch_size) do |batch_offset|
15
15
  batch_limit = [batch_size, total_limit - batch_offset].min
16
- result = reader.call(batch_offset, batch_limit)
16
+ result = reader.call(batch_offset, batch_limit)
17
17
 
18
18
  break if result.empty?
19
19
  yield result
@@ -9,9 +9,7 @@ module RubyEventStore
9
9
 
10
10
  def call(event, record)
11
11
  subscribers = subscriptions.all_for(event.event_type)
12
- subscribers.each do |subscriber|
13
- dispatcher.call(subscriber, event, record)
14
- end
12
+ subscribers.each { |subscriber| dispatcher.call(subscriber, event, record) }
15
13
  end
16
14
 
17
15
  def add_subscription(subscriber, event_types)
@@ -35,11 +33,14 @@ module RubyEventStore
35
33
  end
36
34
 
37
35
  private
36
+
38
37
  attr_reader :dispatcher, :subscriptions
39
38
 
40
39
  def verify_subscription(subscriber)
41
40
  raise SubscriberNotExist, "subscriber must be first argument or block" unless subscriber
42
- raise InvalidHandler.new("Handler #{subscriber} is invalid for dispatcher #{dispatcher}") unless dispatcher.verify(subscriber)
41
+ unless dispatcher.verify(subscriber)
42
+ raise InvalidHandler.new("Handler #{subscriber} is invalid for dispatcher #{dispatcher}")
43
+ end
43
44
  end
44
45
  end
45
46
  end
@@ -4,24 +4,23 @@ require "concurrent"
4
4
 
5
5
  module RubyEventStore
6
6
  class Client
7
- def initialize(repository:,
8
- mapper: Mappers::Default.new,
9
- subscriptions: Subscriptions.new,
10
- dispatcher: Dispatcher.new,
11
- clock: default_clock,
12
- correlation_id_generator: default_correlation_id_generator)
13
-
14
-
15
- @repository = repository
16
- @mapper = mapper
17
- @subscriptions = subscriptions
18
- @broker = Broker.new(subscriptions: subscriptions, dispatcher: dispatcher)
19
- @clock = clock
20
- @metadata = Concurrent::ThreadLocalVar.new
7
+ def initialize(
8
+ repository:,
9
+ mapper: Mappers::Default.new,
10
+ subscriptions: Subscriptions.new,
11
+ dispatcher: Dispatcher.new,
12
+ clock: default_clock,
13
+ correlation_id_generator: default_correlation_id_generator
14
+ )
15
+ @repository = repository
16
+ @mapper = mapper
17
+ @subscriptions = subscriptions
18
+ @broker = Broker.new(subscriptions: subscriptions, dispatcher: dispatcher)
19
+ @clock = clock
20
+ @metadata = Concurrent::ThreadLocalVar.new
21
21
  @correlation_id_generator = correlation_id_generator
22
22
  end
23
23
 
24
-
25
24
  # Persists events and notifies subscribed handlers about them
26
25
  #
27
26
  # @param events [Array<Event>, Event] event(s)
@@ -30,13 +29,10 @@ module RubyEventStore
30
29
  # @return [self]
31
30
  def publish(events, stream_name: GLOBAL_STREAM, expected_version: :any)
32
31
  enriched_events = enrich_events_metadata(events)
33
- records = transform(enriched_events)
32
+ records = transform(enriched_events)
34
33
  append_records_to_stream(records, stream_name: stream_name, expected_version: expected_version)
35
34
  enriched_events.zip(records) do |event, record|
36
- with_metadata(
37
- correlation_id: event.metadata.fetch(:correlation_id),
38
- causation_id: event.event_id,
39
- ) do
35
+ with_metadata(correlation_id: event.metadata.fetch(:correlation_id), causation_id: event.event_id) do
40
36
  broker.(event, record)
41
37
  end
42
38
  end
@@ -121,6 +117,16 @@ module RubyEventStore
121
117
  repository.global_position(event_id)
122
118
  end
123
119
 
120
+ # Checks whether event is linked in given stream
121
+ #
122
+ # @param event_id [String]
123
+ # @param stream_name [String]
124
+ # @return [Boolean] true if event is linked to given stream, false otherwise
125
+ def event_in_stream?(event_id, stream_name)
126
+ stream = Stream.new(stream_name)
127
+ stream.global? ? repository.has_event?(event_id) : repository.event_in_stream?(event_id, stream)
128
+ end
129
+
124
130
  # Subscribes a handler (subscriber) that will be invoked for published events of provided type.
125
131
  #
126
132
  # @overload subscribe(subscriber, to:)
@@ -170,7 +176,7 @@ module RubyEventStore
170
176
  @block = block
171
177
  @broker = broker
172
178
  @global_subscribers = []
173
- @subscribers = Hash.new {[]}
179
+ @subscribers = Hash.new { [] }
174
180
  end
175
181
 
176
182
  # Subscribes temporary handlers that
@@ -202,7 +208,7 @@ module RubyEventStore
202
208
  # @param to [Array<Class>] types of events to subscribe
203
209
  # @param handler [Proc] handler passed as proc
204
210
  # @return [self]
205
- def subscribe(handler=nil, to:, &handler2)
211
+ def subscribe(handler = nil, to:, &handler2)
206
212
  raise ArgumentError if handler && handler2
207
213
  @subscribers[handler || handler2] += Array(to)
208
214
  self
@@ -214,7 +220,7 @@ module RubyEventStore
214
220
  #
215
221
  # @return [Object] value returned by the invoked block of code
216
222
  def call
217
- unsubs = add_thread_global_subscribers
223
+ unsubs = add_thread_global_subscribers
218
224
  unsubs += add_thread_subscribers
219
225
  @block.call
220
226
  ensure
@@ -224,15 +230,11 @@ module RubyEventStore
224
230
  private
225
231
 
226
232
  def add_thread_subscribers
227
- @subscribers.map do |subscriber, types|
228
- @broker.add_thread_subscription(subscriber, types)
229
- end
233
+ @subscribers.map { |subscriber, types| @broker.add_thread_subscription(subscriber, types) }
230
234
  end
231
235
 
232
236
  def add_thread_global_subscribers
233
- @global_subscribers.map do |subscriber|
234
- @broker.add_thread_global_subscription(subscriber)
235
- end
237
+ @global_subscribers.map { |subscriber| @broker.add_thread_global_subscription(subscriber) }
236
238
  end
237
239
  end
238
240
 
@@ -265,19 +267,19 @@ module RubyEventStore
265
267
  #
266
268
  # @return [Event] deserialized event
267
269
  def deserialize(serializer:, event_type:, event_id:, data:, metadata:, timestamp: nil, valid_at: nil)
268
- extract_timestamp = lambda do |m|
269
- (m[:timestamp] || Time.parse(m.fetch("timestamp"))).iso8601
270
- end
270
+ extract_timestamp = lambda { |m| (m[:timestamp] || Time.parse(m.fetch("timestamp"))).iso8601 }
271
271
 
272
272
  mapper.record_to_event(
273
- SerializedRecord.new(
274
- event_type: event_type,
275
- event_id: event_id,
276
- data: data,
277
- metadata: metadata,
278
- timestamp: timestamp || timestamp_ = extract_timestamp[serializer.load(metadata)],
279
- valid_at: valid_at || timestamp_,
280
- ).deserialize(serializer)
273
+ SerializedRecord
274
+ .new(
275
+ event_type: event_type,
276
+ event_id: event_id,
277
+ data: data,
278
+ metadata: metadata,
279
+ timestamp: timestamp || timestamp_ = extract_timestamp[serializer.load(metadata)],
280
+ valid_at: valid_at || timestamp_
281
+ )
282
+ .deserialize(serializer)
281
283
  )
282
284
  end
283
285
 
@@ -338,14 +340,14 @@ module RubyEventStore
338
340
 
339
341
  def enrich_events_metadata(events)
340
342
  events = Array(events)
341
- events.each{|event| enrich_event_metadata(event) }
343
+ events.each { |event| enrich_event_metadata(event) }
342
344
  events
343
345
  end
344
346
 
345
347
  def enrich_event_metadata(event)
346
348
  metadata.each { |key, value| event.metadata[key] ||= value }
347
- event.metadata[:timestamp] ||= clock.call
348
- event.metadata[:valid_at] ||= event.metadata.fetch(:timestamp)
349
+ event.metadata[:timestamp] ||= clock.call
350
+ event.metadata[:valid_at] ||= event.metadata.fetch(:timestamp)
349
351
  event.metadata[:correlation_id] ||= correlation_id_generator.call
350
352
  end
351
353
 
@@ -364,11 +366,11 @@ module RubyEventStore
364
366
  end
365
367
 
366
368
  def default_clock
367
- ->{ Time.now.utc.round(TIMESTAMP_PRECISION) }
369
+ -> { Time.now.utc.round(TIMESTAMP_PRECISION) }
368
370
  end
369
371
 
370
372
  def default_correlation_id_generator
371
- ->{ SecureRandom.uuid }
373
+ -> { SecureRandom.uuid }
372
374
  end
373
375
 
374
376
  attr_reader :repository, :mapper, :subscriptions, :broker, :clock, :correlation_id_generator
@@ -16,9 +16,7 @@ module RubyEventStore
16
16
  end
17
17
 
18
18
  def verify(subscriber)
19
- @dispatchers.any? do |dispatcher|
20
- dispatcher.verify(subscriber)
21
- end
19
+ @dispatchers.any? { |dispatcher| dispatcher.verify(subscriber) }
22
20
  end
23
21
  end
24
22
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  module RubyEventStore
4
4
  class CorrelatedCommands
5
-
6
5
  def initialize(event_store, command_bus)
7
6
  @event_store = event_store
8
7
  @command_bus = command_bus
@@ -13,23 +12,13 @@ module RubyEventStore
13
12
 
14
13
  def call(command)
15
14
  correlation_id = event_store.metadata[:correlation_id]
16
- causation_id = event_store.metadata[:causation_id]
15
+ causation_id = event_store.metadata[:causation_id]
17
16
 
18
17
  if correlation_id && causation_id
19
- command.correlate_with(MiniEvent.new(
20
- correlation_id,
21
- causation_id,
22
- )) if command.respond_to?(:correlate_with)
23
- event_store.with_metadata(
24
- causation_id: command.message_id,
25
- ) do
26
- command_bus.call(command)
27
- end
18
+ command.correlate_with(MiniEvent.new(correlation_id, causation_id)) if command.respond_to?(:correlate_with)
19
+ event_store.with_metadata(causation_id: command.message_id) { command_bus.call(command) }
28
20
  else
29
- event_store.with_metadata(
30
- correlation_id: command.message_id,
31
- causation_id: command.message_id,
32
- ) do
21
+ event_store.with_metadata(correlation_id: command.message_id, causation_id: command.message_id) do
33
22
  command_bus.call(command)
34
23
  end
35
24
  end
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyEventStore
4
- Error = Class.new(StandardError)
4
+ Error = Class.new(StandardError)
5
5
  WrongExpectedEventVersion = Class.new(Error)
6
- InvalidExpectedVersion = Class.new(Error)
7
- IncorrectStreamData = Class.new(Error)
8
- SubscriberNotExist = Class.new(Error)
9
- InvalidPageStart = Class.new(Error)
10
- InvalidPageStop = Class.new(Error)
11
- InvalidPageSize = Class.new(Error)
12
- EventDuplicatedInStream = Class.new(Error)
13
- ReservedInternalName = Class.new(Error)
14
- InvalidHandler = Class.new(Error)
15
- EventNotFoundInStream = Class.new(Error)
6
+ InvalidExpectedVersion = Class.new(Error)
7
+ IncorrectStreamData = Class.new(Error)
8
+ SubscriberNotExist = Class.new(Error)
9
+ InvalidPageStart = Class.new(Error)
10
+ InvalidPageStop = Class.new(Error)
11
+ InvalidPageSize = Class.new(Error)
12
+ EventDuplicatedInStream = Class.new(Error)
13
+ ReservedInternalName = Class.new(Error)
14
+ InvalidHandler = Class.new(Error)
15
+ EventNotFoundInStream = Class.new(Error)
16
16
 
17
17
  class EventNotFound < Error
18
18
  attr_reader :event_id
@@ -3,7 +3,6 @@
3
3
  require "securerandom"
4
4
 
5
5
  module RubyEventStore
6
-
7
6
  # Data structure representing an event
8
7
  class Event
9
8
  # Instantiates a new event
@@ -17,7 +16,7 @@ module RubyEventStore
17
16
  def initialize(event_id: SecureRandom.uuid, metadata: nil, data: {})
18
17
  @event_id = event_id.to_s
19
18
  @metadata = Metadata.new(metadata.to_h)
20
- @data = data
19
+ @data = data
21
20
  end
22
21
 
23
22
  attr_reader :event_id, :metadata, :data
@@ -59,10 +58,8 @@ module RubyEventStore
59
58
  # Event equality ignores metadata!
60
59
  # @return [TrueClass, FalseClass]
61
60
  def ==(other_event)
62
- other_event.instance_of?(self.class) &&
63
- other_event.event_type.eql?(event_type) &&
64
- other_event.event_id.eql?(event_id) &&
65
- other_event.data.eql?(data)
61
+ other_event.instance_of?(self.class) && other_event.event_type.eql?(event_type) &&
62
+ other_event.event_id.eql?(event_id) && other_event.data.eql?(data)
66
63
  end
67
64
 
68
65
  # @private
@@ -80,12 +77,7 @@ module RubyEventStore
80
77
  # * data
81
78
  def hash
82
79
  # We don't use metadata because == does not use metadata
83
- [
84
- self.class,
85
- event_type,
86
- event_id,
87
- data
88
- ].hash ^ BIG_VALUE
80
+ [self.class, event_type, event_id, data].hash ^ BIG_VALUE
89
81
  end
90
82
 
91
83
  # Reads correlation_id from metadata.
@@ -119,7 +111,7 @@ module RubyEventStore
119
111
  # @param val [String]
120
112
  # @return [String]
121
113
  def causation_id=(val)
122
- metadata[:causation_id]= val
114
+ metadata[:causation_id] = val
123
115
  end
124
116
 
125
117
  # Sets correlation_id and causation_id in metadata based
@@ -130,7 +122,7 @@ module RubyEventStore
130
122
  # @return [String] set causation_id
131
123
  def correlate_with(other_message)
132
124
  self.correlation_id = other_message.correlation_id || other_message.message_id
133
- self.causation_id = other_message.message_id
125
+ self.causation_id = other_message.message_id
134
126
  self
135
127
  end
136
128
 
@@ -21,7 +21,7 @@ module RubyEventStore
21
21
 
22
22
  def initialize(version)
23
23
  @version = version
24
- invalid_version! unless [Integer, :any, :none, :auto].any? {|i| i === version}
24
+ invalid_version! unless [Integer, :any, :none, :auto].any? { |i| i === version }
25
25
  end
26
26
 
27
27
  def any?
@@ -53,15 +53,11 @@ module RubyEventStore
53
53
  private_constant :BIG_VALUE
54
54
 
55
55
  def hash
56
- [
57
- self.class,
58
- version
59
- ].hash ^ BIG_VALUE
56
+ [self.class, version].hash ^ BIG_VALUE
60
57
  end
61
58
 
62
59
  def ==(other_expected_version)
63
- other_expected_version.instance_of?(self.class) &&
64
- other_expected_version.version.equal?(version)
60
+ other_expected_version.instance_of?(self.class) && other_expected_version.version.equal?(version)
65
61
  end
66
62
 
67
63
  alias_method :eql?, :==
@@ -26,7 +26,7 @@ module RubyEventStore
26
26
  def initialize(serializer: NULL, ensure_supported_any_usage: false)
27
27
  @serializer = serializer
28
28
  @streams = Hash.new { |h, k| h[k] = Array.new }
29
- @mutex = Mutex.new
29
+ @mutex = Mutex.new
30
30
  @storage = Hash.new
31
31
  @ensure_supported_any_usage = ensure_supported_any_usage
32
32
  end
@@ -36,7 +36,9 @@ module RubyEventStore
36
36
 
37
37
  with_synchronize(expected_version, stream) do |resolved_version|
38
38
  ensure_supported_any_usage(resolved_version, stream)
39
- raise WrongExpectedEventVersion unless resolved_version.nil? || last_stream_version(stream).equal?(resolved_version)
39
+ unless resolved_version.nil? || last_stream_version(stream).equal?(resolved_version)
40
+ raise WrongExpectedEventVersion
41
+ end
40
42
 
41
43
  serialized_records.each_with_index do |serialized_record, index|
42
44
  raise EventDuplicatedInStream if has_event?(serialized_record.event_id)
@@ -52,7 +54,9 @@ module RubyEventStore
52
54
 
53
55
  with_synchronize(expected_version, stream) do |resolved_version|
54
56
  ensure_supported_any_usage(resolved_version, stream)
55
- raise WrongExpectedEventVersion unless resolved_version.nil? || last_stream_version(stream).equal?(resolved_version)
57
+ unless resolved_version.nil? || last_stream_version(stream).equal?(resolved_version)
58
+ raise WrongExpectedEventVersion
59
+ end
56
60
 
57
61
  serialized_records.each_with_index do |serialized_record, index|
58
62
  raise EventDuplicatedInStream if has_event_in_stream?(serialized_record.event_id, stream.name)
@@ -91,9 +95,7 @@ module RubyEventStore
91
95
  serialized_records.last&.deserialize(serializer)
92
96
  else
93
97
  Enumerator.new do |y|
94
- serialized_records.each do |serialized_record|
95
- y << serialized_record.deserialize(serializer)
96
- end
98
+ serialized_records.each { |serialized_record| y << serialized_record.deserialize(serializer) }
97
99
  end
98
100
  end
99
101
  end
@@ -106,26 +108,26 @@ module RubyEventStore
106
108
  records.each do |record|
107
109
  read_event(record.event_id)
108
110
  serialized_record =
109
- Record.new(
110
- event_id: record.event_id,
111
- event_type: record.event_type,
112
- data: record.data,
113
- metadata: record.metadata,
114
- timestamp: Time.iso8601(storage.fetch(record.event_id).timestamp),
115
- valid_at: record.valid_at,
116
- ).serialize(serializer)
111
+ Record
112
+ .new(
113
+ event_id: record.event_id,
114
+ event_type: record.event_type,
115
+ data: record.data,
116
+ metadata: record.metadata,
117
+ timestamp: Time.iso8601(storage.fetch(record.event_id).timestamp),
118
+ valid_at: record.valid_at
119
+ )
120
+ .serialize(serializer)
117
121
  storage[record.event_id] = serialized_record
118
122
  end
119
123
  end
120
124
 
121
125
  def streams_of(event_id)
122
- streams
123
- .select { |name,| has_event_in_stream?(event_id, name) }
124
- .map { |name,| Stream.new(name) }
126
+ streams.select { |name,| has_event_in_stream?(event_id, name) }.map { |name,| Stream.new(name) }
125
127
  end
126
128
 
127
129
  def position_in_stream(event_id, stream)
128
- event_in_stream = streams[stream.name].find {|event_in_stream| event_in_stream.event_id.eql?(event_id) }
130
+ event_in_stream = streams[stream.name].find { |event_in_stream| event_in_stream.event_id.eql?(event_id) }
129
131
  raise EventNotFoundInStream if event_in_stream.nil?
130
132
  event_in_stream.position
131
133
  end
@@ -134,20 +136,33 @@ module RubyEventStore
134
136
  storage.keys.index(event_id) or raise EventNotFound.new(event_id)
135
137
  end
136
138
 
139
+ def event_in_stream?(event_id, stream)
140
+ !streams[stream.name].find { |event_in_stream| event_in_stream.event_id.eql?(event_id) }.nil?
141
+ end
142
+
137
143
  private
144
+
138
145
  def read_scope(spec)
139
146
  serialized_records = serialized_records_of_stream(spec.stream)
140
147
  serialized_records = ordered(serialized_records, spec)
141
- serialized_records = serialized_records.select{|e| spec.with_ids.any?{|x| x.eql?(e.event_id)}} if spec.with_ids?
142
- serialized_records = serialized_records.select{|e| spec.with_types.any?{|x| x.eql?(e.event_type)}} if spec.with_types?
148
+ serialized_records = serialized_records.select { |e| spec.with_ids.any? { |x| x.eql?(e.event_id) } } if spec
149
+ .with_ids?
150
+ serialized_records = serialized_records.select { |e| spec.with_types.any? { |x| x.eql?(e.event_type) } } if spec
151
+ .with_types?
143
152
  serialized_records = serialized_records.reverse if spec.backward?
144
153
  serialized_records = serialized_records.drop(index_of(serialized_records, spec.start) + 1) if spec.start
145
154
  serialized_records = serialized_records.take(index_of(serialized_records, spec.stop)) if spec.stop
146
155
  serialized_records = serialized_records.take(spec.limit) if spec.limit?
147
- serialized_records = serialized_records.select { |sr| Time.iso8601(sr.timestamp) < spec.older_than } if spec.older_than
148
- serialized_records = serialized_records.select { |sr| Time.iso8601(sr.timestamp) <= spec.older_than_or_equal } if spec.older_than_or_equal
149
- serialized_records = serialized_records.select { |sr| Time.iso8601(sr.timestamp) > spec.newer_than } if spec.newer_than
150
- serialized_records = serialized_records.select { |sr| Time.iso8601(sr.timestamp) >= spec.newer_than_or_equal } if spec.newer_than_or_equal
156
+ serialized_records = serialized_records.select { |sr| Time.iso8601(sr.timestamp) < spec.older_than } if spec
157
+ .older_than
158
+ serialized_records =
159
+ serialized_records.select { |sr| Time.iso8601(sr.timestamp) <= spec.older_than_or_equal } if spec
160
+ .older_than_or_equal
161
+ serialized_records = serialized_records.select { |sr| Time.iso8601(sr.timestamp) > spec.newer_than } if spec
162
+ .newer_than
163
+ serialized_records =
164
+ serialized_records.select { |sr| Time.iso8601(sr.timestamp) >= spec.newer_than_or_equal } if spec
165
+ .newer_than_or_equal
151
166
  serialized_records
152
167
  end
153
168
 
@@ -189,9 +204,7 @@ module RubyEventStore
189
204
  # conditions more likely. And we only use mutex.synchronize for writing
190
205
  # not for the whole read+write algorithm.
191
206
  Thread.pass
192
- mutex.synchronize do
193
- block.call(resolved_version)
194
- end
207
+ mutex.synchronize { block.call(resolved_version) }
195
208
  end
196
209
 
197
210
  def has_event_in_stream?(event_id, stream_name)
@@ -199,13 +212,11 @@ module RubyEventStore
199
212
  end
200
213
 
201
214
  def index_of(source, event_id)
202
- source.index {|item| item.event_id.eql?(event_id)}
215
+ source.index { |item| item.event_id.eql?(event_id) }
203
216
  end
204
217
 
205
218
  def compute_position(resolved_version, index)
206
- unless resolved_version.nil?
207
- resolved_version + index + 1
208
- end
219
+ resolved_version + index + 1 unless resolved_version.nil?
209
220
  end
210
221
 
211
222
  def add_to_stream(stream, serialized_record, resolved_version, index)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "ruby2_keywords"
4
-
5
3
  module RubyEventStore
6
4
  class InstrumentedDispatcher
7
5
  def initialize(dispatcher, instrumentation)
@@ -15,9 +13,9 @@ module RubyEventStore
15
13
  end
16
14
  end
17
15
 
18
- ruby2_keywords def method_missing(method_name, *arguments, &block)
16
+ def method_missing(method_name, *arguments, **keyword_arguments, &block)
19
17
  if respond_to?(method_name)
20
- dispatcher.public_send(method_name, *arguments, &block)
18
+ dispatcher.public_send(method_name, *arguments, **keyword_arguments, &block)
21
19
  else
22
20
  super
23
21
  end
@@ -28,6 +26,7 @@ module RubyEventStore
28
26
  end
29
27
 
30
28
  private
29
+
31
30
  attr_reader :instrumentation, :dispatcher
32
31
  end
33
32
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "ruby2_keywords"
4
-
5
3
  module RubyEventStore
6
4
  class InstrumentedRepository
7
5
  def initialize(repository, instrumentation)
@@ -51,9 +49,9 @@ module RubyEventStore
51
49
  end
52
50
  end
53
51
 
54
- ruby2_keywords def method_missing(method_name, *arguments, &block)
52
+ def method_missing(method_name, *arguments, **keyword_arguments, &block)
55
53
  if respond_to?(method_name)
56
- repository.public_send(method_name, *arguments, &block)
54
+ repository.public_send(method_name, *arguments, **keyword_arguments, &block)
57
55
  else
58
56
  super
59
57
  end
@@ -64,6 +62,7 @@ module RubyEventStore
64
62
  end
65
63
 
66
64
  private
65
+
67
66
  attr_reader :repository, :instrumentation
68
67
  end
69
68
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  module RubyEventStore
4
4
  class LinkByMetadata
5
-
6
5
  def initialize(event_store:, key:, prefix: nil)
7
6
  @event_store = event_store
8
7
  @key = key
@@ -12,31 +11,19 @@ module RubyEventStore
12
11
  def call(event)
13
12
  return unless event.metadata.has_key?(@key)
14
13
 
15
- @event_store.link(
16
- [event.event_id],
17
- stream_name: "#{@prefix}#{event.metadata.fetch(@key)}"
18
- )
14
+ @event_store.link([event.event_id], stream_name: "#{@prefix}#{event.metadata.fetch(@key)}")
19
15
  end
20
-
21
16
  end
22
17
 
23
18
  class LinkByCorrelationId < LinkByMetadata
24
19
  def initialize(event_store:, prefix: nil)
25
- super(
26
- event_store: event_store,
27
- prefix: prefix,
28
- key: :correlation_id,
29
- )
20
+ super(event_store: event_store, prefix: prefix, key: :correlation_id)
30
21
  end
31
22
  end
32
23
 
33
24
  class LinkByCausationId < LinkByMetadata
34
25
  def initialize(event_store:, prefix: nil)
35
- super(
36
- event_store: event_store,
37
- prefix: prefix,
38
- key: :causation_id,
39
- )
26
+ super(event_store: event_store, prefix: prefix, key: :causation_id)
40
27
  end
41
28
  end
42
29
 
@@ -47,11 +34,7 @@ module RubyEventStore
47
34
  end
48
35
 
49
36
  def call(event)
50
- @event_store.link(
51
- [event.event_id],
52
- stream_name: "#{@prefix}#{event.event_type}"
53
- )
37
+ @event_store.link([event.event_id], stream_name: "#{@prefix}#{event.event_type}")
54
38
  end
55
39
  end
56
-
57
40
  end