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
@@ -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,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,37 +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(
23
- event_id: record.event_id,
24
- data: record.data,
25
- metadata: record.metadata.merge(
26
- timestamp: record.timestamp,
27
- valid_at: record.valid_at,
28
- ),
29
- )
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
+ )
30
29
  rescue NameError
31
30
  Event.new(
32
31
  event_id: record.event_id,
33
- data: record.data,
34
- metadata: record.metadata.merge(
35
- timestamp: record.timestamp,
36
- valid_at: record.valid_at,
37
- event_type: record.event_type,
38
- ),
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
+ )
39
39
  )
40
40
  end
41
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
 
@@ -7,13 +7,11 @@ require "forwardable"
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,29 +51,23 @@ 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
65
  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
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)
@@ -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