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
@@ -13,11 +13,20 @@ module RubyEventStore
13
13
  end
14
14
  end
15
15
 
16
- def verify(subscriber)
17
- dispatcher.verify(subscriber)
16
+ def method_missing(method_name, *arguments, **keyword_arguments, &block)
17
+ if respond_to?(method_name)
18
+ dispatcher.public_send(method_name, *arguments, **keyword_arguments, &block)
19
+ else
20
+ super
21
+ end
22
+ end
23
+
24
+ def respond_to_missing?(method_name, _include_private)
25
+ dispatcher.respond_to?(method_name)
18
26
  end
19
27
 
20
28
  private
29
+
21
30
  attr_reader :instrumentation, :dispatcher
22
31
  end
23
32
  end
@@ -25,14 +25,6 @@ module RubyEventStore
25
25
  end
26
26
  end
27
27
 
28
- def has_event?(event_id)
29
- repository.has_event?(event_id)
30
- end
31
-
32
- def last_stream_event(stream)
33
- repository.last_stream_event(stream)
34
- end
35
-
36
28
  def read(specification)
37
29
  instrumentation.instrument("read.repository.rails_event_store", specification: specification) do
38
30
  repository.read(specification)
@@ -57,7 +49,20 @@ module RubyEventStore
57
49
  end
58
50
  end
59
51
 
52
+ def method_missing(method_name, *arguments, **keyword_arguments, &block)
53
+ if respond_to?(method_name)
54
+ repository.public_send(method_name, *arguments, **keyword_arguments, &block)
55
+ else
56
+ super
57
+ end
58
+ end
59
+
60
+ def respond_to_missing?(method_name, _include_private)
61
+ repository.respond_to?(method_name)
62
+ end
63
+
60
64
  private
65
+
61
66
  attr_reader :repository, :instrumentation
62
67
  end
63
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
@@ -4,10 +4,12 @@ module RubyEventStore
4
4
  module Mappers
5
5
  class Default < PipelineMapper
6
6
  def initialize(events_class_remapping: {})
7
- super(Pipeline.new(
8
- Transformation::EventClassRemapper.new(events_class_remapping),
9
- Transformation::SymbolizeMetadataKeys.new,
10
- ))
7
+ super(
8
+ Pipeline.new(
9
+ Transformation::EventClassRemapper.new(events_class_remapping),
10
+ Transformation::SymbolizeMetadataKeys.new
11
+ )
12
+ )
11
13
  end
12
14
  end
13
15
  end
@@ -5,31 +5,22 @@ module RubyEventStore
5
5
  class EncryptionKey
6
6
  def initialize(cipher:, key:)
7
7
  @cipher = cipher
8
- @key = key
8
+ @key = key
9
9
  end
10
10
 
11
11
  def encrypt(message, iv)
12
- crypto = prepare_encrypt(cipher)
13
- crypto.iv = iv
12
+ crypto = prepare_encrypt(cipher)
13
+ crypto.iv = iv
14
14
  crypto.key = key
15
15
 
16
- if crypto.authenticated?
17
- encrypt_authenticated(crypto, message)
18
- else
19
- crypto.update(message) + crypto.final
20
- end
16
+ crypto.authenticated? ? encrypt_authenticated(crypto, message) : crypto.update(message) + crypto.final
21
17
  end
22
18
 
23
19
  def decrypt(message, iv)
24
- crypto = prepare_decrypt(cipher)
25
- crypto.iv = iv
20
+ crypto = prepare_decrypt(cipher)
21
+ crypto.iv = iv
26
22
  crypto.key = key
27
- ciphertext =
28
- if crypto.authenticated?
29
- ciphertext_from_authenticated(crypto, message)
30
- else
31
- message
32
- end
23
+ ciphertext = crypto.authenticated? ? ciphertext_from_authenticated(crypto, message) : message
33
24
  (crypto.update(ciphertext) + crypto.final).force_encoding("UTF-8")
34
25
  end
35
26
 
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'yaml'
4
-
5
3
  module RubyEventStore
6
4
  module Mappers
7
5
  class EncryptionMapper < PipelineMapper
8
- def initialize(key_repository, serializer: YAML, forgotten_data: ForgottenData.new)
9
- super(Pipeline.new(
10
- Transformation::Encryption.new(key_repository, serializer: serializer, forgotten_data: forgotten_data),
11
- ))
6
+ def initialize(key_repository, serializer: Serializers::YAML, forgotten_data: ForgottenData.new)
7
+ super(
8
+ Pipeline.new(
9
+ Transformation::Encryption.new(key_repository, serializer: serializer, forgotten_data: forgotten_data)
10
+ )
11
+ )
12
12
  end
13
13
  end
14
14
  end
@@ -3,7 +3,7 @@
3
3
  module RubyEventStore
4
4
  module Mappers
5
5
  class ForgottenData
6
- FORGOTTEN_DATA = 'FORGOTTEN_DATA'.freeze
6
+ FORGOTTEN_DATA = "FORGOTTEN_DATA".freeze
7
7
 
8
8
  def initialize(string = FORGOTTEN_DATA)
9
9
  @string = string
@@ -3,7 +3,7 @@
3
3
  module RubyEventStore
4
4
  module Mappers
5
5
  class InMemoryEncryptionKeyRepository
6
- DEFAULT_CIPHER = 'aes-256-gcm'.freeze
6
+ DEFAULT_CIPHER = "aes-256-gcm".freeze
7
7
 
8
8
  def initialize
9
9
  @keys = {}
@@ -3,7 +3,6 @@
3
3
  module RubyEventStore
4
4
  module Mappers
5
5
  class NullMapper < PipelineMapper
6
-
7
6
  def initialize
8
7
  super(Pipeline.new)
9
8
  end
@@ -4,22 +4,15 @@ module RubyEventStore
4
4
  module Mappers
5
5
  class Pipeline
6
6
  def initialize(*transformations, to_domain_event: Transformation::DomainEvent.new)
7
- @transformations = [
8
- to_domain_event,
9
- transformations,
10
- ].flatten.freeze
7
+ @transformations = [to_domain_event, transformations].flatten.freeze
11
8
  end
12
9
 
13
10
  def dump(domain_event)
14
- transformations.reduce(domain_event) do |item, transform|
15
- transform.dump(item)
16
- end
11
+ transformations.reduce(domain_event) { |item, transform| transform.dump(item) }
17
12
  end
18
13
 
19
14
  def load(record)
20
- transformations.reverse.reduce(record) do |item, transform|
21
- transform.load(item)
22
- end
15
+ transformations.reverse.reduce(record) { |item, transform| transform.load(item) }
23
16
  end
24
17
 
25
18
  attr_reader :transformations
@@ -16,6 +16,7 @@ module RubyEventStore
16
16
  end
17
17
 
18
18
  private
19
+
19
20
  attr_reader :pipeline
20
21
  end
21
22
  end
@@ -5,27 +5,37 @@ module RubyEventStore
5
5
  module Transformation
6
6
  class DomainEvent
7
7
  def dump(domain_event)
8
- metadata = domain_event.metadata.dup.to_h
8
+ metadata = domain_event.metadata.dup.to_h
9
9
  timestamp = metadata.delete(:timestamp)
10
- valid_at = metadata.delete(:valid_at)
10
+ valid_at = metadata.delete(:valid_at)
11
11
  Record.new(
12
- event_id: domain_event.event_id,
13
- metadata: metadata,
14
- data: domain_event.data,
12
+ event_id: domain_event.event_id,
13
+ metadata: metadata,
14
+ data: domain_event.data,
15
15
  event_type: domain_event.event_type,
16
- timestamp: timestamp,
17
- valid_at: valid_at,
16
+ timestamp: timestamp,
17
+ valid_at: valid_at
18
18
  )
19
19
  end
20
20
 
21
21
  def load(record)
22
- Object.const_get(record.event_type).new(
22
+ Object
23
+ .const_get(record.event_type)
24
+ .new(
25
+ event_id: record.event_id,
26
+ data: record.data,
27
+ metadata: record.metadata.merge(timestamp: record.timestamp, valid_at: record.valid_at)
28
+ )
29
+ rescue NameError
30
+ Event.new(
23
31
  event_id: record.event_id,
24
- metadata: record.metadata.merge(
25
- timestamp: record.timestamp,
26
- valid_at: record.valid_at,
27
- ),
28
- data: record.data,
32
+ data: record.data,
33
+ metadata:
34
+ record.metadata.merge(
35
+ timestamp: record.timestamp,
36
+ valid_at: record.valid_at,
37
+ event_type: record.event_type
38
+ )
29
39
  )
30
40
  end
31
41
  end
@@ -6,38 +6,38 @@ module RubyEventStore
6
6
  class Encryption
7
7
  class Leaf
8
8
  def self.===(hash)
9
- hash.keys.sort.eql? %i(cipher identifier iv)
9
+ hash.keys.sort.eql? %i[cipher identifier iv]
10
10
  end
11
11
  end
12
12
  private_constant :Leaf
13
13
 
14
14
  class MissingEncryptionKey < StandardError
15
15
  def initialize(key_identifier)
16
- super %Q|Could not find encryption key for '#{key_identifier}'|
16
+ super "Could not find encryption key for '#{key_identifier}'"
17
17
  end
18
18
  end
19
19
 
20
- def initialize(key_repository, serializer: YAML, forgotten_data: ForgottenData.new)
20
+ def initialize(key_repository, serializer: Serializers::YAML, forgotten_data: ForgottenData.new)
21
21
  @key_repository = key_repository
22
22
  @serializer = serializer
23
23
  @forgotten_data = forgotten_data
24
24
  end
25
25
 
26
26
  def dump(record)
27
- data = record.data
28
- metadata = record.metadata.dup
27
+ data = record.data
28
+ metadata = record.metadata.dup
29
29
  event_class = Object.const_get(record.event_type)
30
30
 
31
- crypto_description = encryption_metadata(data, encryption_schema(event_class))
31
+ crypto_description = encryption_metadata(data, encryption_schema(event_class))
32
32
  metadata[:encryption] = crypto_description unless crypto_description.empty?
33
33
 
34
34
  Record.new(
35
- event_id: record.event_id,
35
+ event_id: record.event_id,
36
36
  event_type: record.event_type,
37
- data: encrypt_data(deep_dup(data), crypto_description),
38
- metadata: metadata,
39
- timestamp: record.timestamp,
40
- valid_at: record.valid_at,
37
+ data: encrypt_data(deep_dup(data), crypto_description),
38
+ metadata: metadata,
39
+ timestamp: record.timestamp,
40
+ valid_at: record.valid_at
41
41
  )
42
42
  end
43
43
 
@@ -46,16 +46,17 @@ module RubyEventStore
46
46
  crypto_description = Hash(metadata.delete(:encryption))
47
47
 
48
48
  Record.new(
49
- event_id: record.event_id,
49
+ event_id: record.event_id,
50
50
  event_type: record.event_type,
51
- data: decrypt_data(record.data, crypto_description),
52
- metadata: metadata,
53
- timestamp: record.timestamp,
54
- valid_at: record.valid_at,
51
+ data: decrypt_data(record.data, crypto_description),
52
+ metadata: metadata,
53
+ timestamp: record.timestamp,
54
+ valid_at: record.valid_at
55
55
  )
56
56
  end
57
57
 
58
58
  private
59
+
59
60
  attr_reader :key_repository, :serializer, :forgotten_data
60
61
 
61
62
  def encryption_schema(event_class)
@@ -64,9 +65,7 @@ module RubyEventStore
64
65
 
65
66
  def deep_dup(hash)
66
67
  duplicate = hash.dup
67
- duplicate.each do |k, v|
68
- duplicate[k] = v.instance_of?(Hash) ? deep_dup(v) : v
69
- end
68
+ duplicate.each { |k, v| duplicate[k] = v.instance_of?(Hash) ? deep_dup(v) : v }
70
69
  duplicate
71
70
  end
72
71
 
@@ -79,11 +78,7 @@ module RubyEventStore
79
78
  key_identifier = value.call(data)
80
79
  encryption_key = key_repository.key_of(key_identifier)
81
80
  raise MissingEncryptionKey.new(key_identifier) unless encryption_key
82
- acc[key] = {
83
- cipher: encryption_key.cipher,
84
- iv: encryption_key.random_iv,
85
- identifier: key_identifier,
86
- }
81
+ acc[key] = { cipher: encryption_key.cipher, iv: encryption_key.random_iv, identifier: key_identifier }
87
82
  end
88
83
  acc
89
84
  end
@@ -122,7 +117,8 @@ module RubyEventStore
122
117
  cryptogram = data.fetch(attribute)
123
118
  return unless cryptogram
124
119
 
125
- encryption_key = key_repository.key_of(meta.fetch(:identifier), cipher: meta.fetch(:cipher)) or return forgotten_data
120
+ encryption_key = key_repository.key_of(meta.fetch(:identifier), cipher: meta.fetch(:cipher)) or
121
+ return forgotten_data
126
122
  serializer.load(encryption_key.decrypt(cryptogram, meta.fetch(:iv)))
127
123
  when Hash
128
124
  decrypt_data(data.fetch(attribute), meta)
@@ -14,16 +14,17 @@ module RubyEventStore
14
14
 
15
15
  def load(record)
16
16
  Record.new(
17
- event_id: record.event_id,
17
+ event_id: record.event_id,
18
18
  event_type: class_map[record.event_type] || record.event_type,
19
- data: record.data,
20
- metadata: record.metadata,
21
- timestamp: record.timestamp,
22
- valid_at: record.valid_at,
19
+ data: record.data,
20
+ metadata: record.metadata,
21
+ timestamp: record.timestamp,
22
+ valid_at: record.valid_at
23
23
  )
24
24
  end
25
25
 
26
26
  private
27
+
27
28
  attr_reader :class_map
28
29
  end
29
30
  end
@@ -13,14 +13,15 @@ module RubyEventStore
13
13
  end
14
14
 
15
15
  private
16
+
16
17
  def stringify(record)
17
18
  Record.new(
18
- event_id: record.event_id,
19
+ event_id: record.event_id,
19
20
  event_type: record.event_type,
20
- data: record.data,
21
- metadata: TransformKeys.stringify(record.metadata),
22
- timestamp: record.timestamp,
23
- valid_at: record.valid_at,
21
+ data: record.data,
22
+ metadata: TransformKeys.stringify(record.metadata),
23
+ timestamp: record.timestamp,
24
+ valid_at: record.valid_at
24
25
  )
25
26
  end
26
27
  end
@@ -13,14 +13,15 @@ module RubyEventStore
13
13
  end
14
14
 
15
15
  private
16
+
16
17
  def symbolize(record)
17
18
  Record.new(
18
- event_id: record.event_id,
19
+ event_id: record.event_id,
19
20
  event_type: record.event_type,
20
- data: record.data,
21
- metadata: TransformKeys.symbolize(record.metadata),
22
- timestamp: record.timestamp,
23
- valid_at: record.valid_at,
21
+ data: record.data,
22
+ metadata: TransformKeys.symbolize(record.metadata),
23
+ timestamp: record.timestamp,
24
+ valid_at: record.valid_at
24
25
  )
25
26
  end
26
27
  end
@@ -10,13 +10,9 @@ module RubyEventStore
10
10
  end
11
11
 
12
12
  def call(record)
13
- identity = lambda { |r| r }
13
+ identity = lambda { |r| r }
14
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
15
+ new_record.equal?(record) ? record : call(new_record)
20
16
  end
21
17
  end
22
18
 
@@ -1,19 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
4
- require 'time'
5
- require 'forwardable'
3
+ require "date"
4
+ require "time"
5
+ require "forwardable"
6
6
 
7
7
  module RubyEventStore
8
8
  class Metadata
9
9
  include Enumerable
10
- extend Forwardable
10
+ extend Forwardable
11
11
 
12
12
  def initialize(h = self)
13
13
  @h = {}
14
- h.each do |k, v|
15
- self[k] = (v)
16
- end
14
+ h.each { |k, v| self[k] = (v) }
17
15
  end
18
16
 
19
17
  def [](key)
@@ -22,23 +20,54 @@ module RubyEventStore
22
20
  end
23
21
 
24
22
  def []=(key, val)
25
- raise ArgumentError unless allowed_types.any?{|klass| klass === val }
23
+ raise ArgumentError unless allowed_types.any? { |klass| klass === val }
26
24
  raise ArgumentError unless Symbol === key
27
- @h[key]=val
25
+ @h[key] = val
28
26
  end
29
27
 
30
28
  def each(&block)
31
29
  @h.each(&block)
32
30
  end
33
31
 
34
- SAFE_HASH_METHODS = [:<, :<=, :>, :>=, :assoc, :clear, :compact, :compact!,
35
- :delete, :delete_if, :dig, :each_key, :each_pair,
36
- :each_value, :empty?, :fetch, :fetch_values,
37
- :flatten, :has_key?, :has_value?,
38
- :keep_if, :key, :key?, :keys, :length,
39
- :rassoc, :reject!, :select!, :shift, :size, :slice,
40
- :to_proc, :transform_keys, :transform_values,
41
- :value?, :values, :values_at]
32
+ SAFE_HASH_METHODS = %i[
33
+ <
34
+ <=
35
+ >
36
+ >=
37
+ assoc
38
+ clear
39
+ compact
40
+ compact!
41
+ delete
42
+ delete_if
43
+ dig
44
+ each_key
45
+ each_pair
46
+ each_value
47
+ empty?
48
+ fetch
49
+ fetch_values
50
+ flatten
51
+ has_key?
52
+ has_value?
53
+ keep_if
54
+ key
55
+ key?
56
+ keys
57
+ length
58
+ rassoc
59
+ reject!
60
+ select!
61
+ shift
62
+ size
63
+ slice
64
+ to_proc
65
+ transform_keys
66
+ transform_values
67
+ value?
68
+ values
69
+ values_at
70
+ ]
42
71
 
43
72
  delegate SAFE_HASH_METHODS => :@h
44
73
 
@@ -15,9 +15,9 @@ module RubyEventStore
15
15
  end
16
16
 
17
17
  def initialize(streams: [])
18
- @streams = streams
18
+ @streams = streams
19
19
  @handlers = {}
20
- @init = -> { {} }
20
+ @init = -> { {} }
21
21
  end
22
22
 
23
23
  attr_reader :streams, :handlers
@@ -28,9 +28,7 @@ module RubyEventStore
28
28
  end
29
29
 
30
30
  def when(events, handler)
31
- Array(events).each do |event|
32
- handlers[event.to_s] = handler
33
- end
31
+ Array(events).each { |event| handlers[event.to_s] = handler }
34
32
 
35
33
  self
36
34
  end
@@ -53,33 +51,27 @@ module RubyEventStore
53
51
 
54
52
  def run(event_store, start: nil, count: PAGE_SIZE)
55
53
  return initial_state if handled_events.empty?
56
- if streams.any?
57
- reduce_from_streams(event_store, start, count)
58
- else
59
- reduce_from_all_streams(event_store, start, count)
60
- end
54
+ streams.any? ? reduce_from_streams(event_store, start, count) : reduce_from_all_streams(event_store, start, count)
61
55
  end
62
56
 
63
57
  private
64
58
 
65
59
  def valid_starting_point?(start)
66
60
  return true unless start
67
- if streams.any?
68
- (start.instance_of?(Array) && start.size === streams.size)
69
- else
70
- start.instance_of?(String)
71
- end
61
+ streams.any? ? (start.instance_of?(Array) && start.size === streams.size) : start.instance_of?(String)
72
62
  end
73
63
 
74
64
  def reduce_from_streams(event_store, start, count)
75
- raise ArgumentError.new('Start must be an array with event ids') unless valid_starting_point?(start)
76
- streams.zip(start_events(start)).reduce(initial_state) do |state, (stream_name, start_event_id)|
77
- read_scope(event_store, stream_name, count, start_event_id).reduce(state, &method(:transition))
78
- end
65
+ raise ArgumentError.new("Start must be an array with event ids") unless valid_starting_point?(start)
66
+ streams
67
+ .zip(start_events(start))
68
+ .reduce(initial_state) do |state, (stream_name, start_event_id)|
69
+ read_scope(event_store, stream_name, count, start_event_id).reduce(state, &method(:transition))
70
+ end
79
71
  end
80
72
 
81
73
  def reduce_from_all_streams(event_store, start, count)
82
- raise ArgumentError.new('Start must be valid event id') unless valid_starting_point?(start)
74
+ raise ArgumentError.new("Start must be valid event id") unless valid_starting_point?(start)
83
75
  read_scope(event_store, nil, count, start).reduce(initial_state, &method(:transition))
84
76
  end
85
77