ruby_event_store 2.5.1 → 2.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e43f2327229617a89cfbd0ed495d5dcc3a96f056f4e7a7d3984826efaedd0ca
4
- data.tar.gz: 5668a001f159239b593831820696d1a645d170b47db38bccd6bddc36c2ac9a7e
3
+ metadata.gz: 81a9b613c69a42dd544741b6c9beda7f8bffe1e680eba7e4bd93c1fad1ef2f40
4
+ data.tar.gz: ada38679291f059d618a9232770d401f795deb3e0ce6b8c04e43604269a36353
5
5
  SHA512:
6
- metadata.gz: 3b125835ca8080259820933f625776dd85b0f0e385df47cd094b9fdef180b833b2bd11cd9177f9072c8ec696c65ce9837a844446d3a9b3898fda957d9b8a0ad6
7
- data.tar.gz: 1b4392aedb361795854cd30483383f4ae0c3b6ec88d141f52de4048e8a2f6afe70eb08257ac7aa4ef9b7606be10793757d25587d98ea6ce6e413a03708f09bb2
6
+ metadata.gz: 106d20e97c28f0595d5750aa61934a905b74aa8d9ecd28ac14176225c5a257082017da184c47d7a314cda09e142b5c1e31a20a9544bee2eeaf4973f8f158a745
7
+ data.tar.gz: b78ee185caefd7070b3cb82f355f03e6efd9299c367187fbbdde5cb65e75973d796dba103c7ddc3123a6eb7919992dab1cb84cef9717409632244cdf93a6a7eb
@@ -254,9 +254,9 @@ module RubyEventStore
254
254
  # @param metadata [Hash] metadata to set for events
255
255
  # @param block [Proc] block of code during which the metadata will be added
256
256
  # @return [Object] last value returned by the provided block
257
- def with_metadata(metadata, &block)
258
- previous_metadata = metadata()
259
- self.metadata = previous_metadata.merge(metadata)
257
+ def with_metadata(metadata_for_block, &block)
258
+ previous_metadata = metadata
259
+ self.metadata = previous_metadata.merge(metadata_for_block)
260
260
  block.call if block_given?
261
261
  ensure
262
262
  self.metadata = previous_metadata
@@ -62,9 +62,6 @@ module RubyEventStore
62
62
  other_event.event_id.eql?(event_id) && other_event.data.eql?(data)
63
63
  end
64
64
 
65
- # @private
66
- BIG_VALUE = 0b111111100100000010010010110011101011000101010101001100100110000
67
-
68
65
  # Generates a Fixnum hash value for this object. This function
69
66
  # have the property that a.eql?(b) implies a.hash == b.hash.
70
67
  #
@@ -77,7 +74,7 @@ module RubyEventStore
77
74
  # * data
78
75
  def hash
79
76
  # We don't use metadata because == does not use metadata
80
- [self.class, event_type, event_id, data].hash ^ BIG_VALUE
77
+ [event_type, event_id, data].hash ^ self.class.hash
81
78
  end
82
79
 
83
80
  # Reads correlation_id from metadata.
@@ -49,11 +49,8 @@ module RubyEventStore
49
49
  end
50
50
  end
51
51
 
52
- BIG_VALUE = 0b110111100100000010010010110011101011000101010101001100100110011
53
- private_constant :BIG_VALUE
54
-
55
52
  def hash
56
- [self.class, version].hash ^ BIG_VALUE
53
+ version.hash ^ self.class.hash
57
54
  end
58
55
 
59
56
  def ==(other_expected_version)
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyEventStore
4
+ class InstrumentedSubscriptions
5
+ def initialize(subscriptions, instrumentation)
6
+ @subscriptions = subscriptions
7
+ @instrumentation = instrumentation
8
+ end
9
+
10
+ def add_subscription(subscriber, event_types)
11
+ instrument(subscriber: subscriber, event_types: event_types) do
12
+ subscriptions.add_subscription(subscriber, event_types)
13
+ end
14
+ end
15
+
16
+ def add_global_subscription(subscriber)
17
+ instrument(subscriber: subscriber) do
18
+ subscriptions.add_global_subscription(subscriber)
19
+ end
20
+ end
21
+
22
+ def add_thread_subscription(subscriber, event_types)
23
+ instrument(subscriber: subscriber, event_types: event_types) do
24
+ subscriptions.add_thread_subscription(subscriber, event_types)
25
+ end
26
+ end
27
+
28
+ def add_thread_global_subscription(subscriber)
29
+ instrument(subscriber: subscriber) do
30
+ subscriptions.add_thread_global_subscription(subscriber)
31
+ end
32
+ end
33
+
34
+ def method_missing(method_name, *arguments, &block)
35
+ if respond_to?(method_name)
36
+ subscriptions.public_send(method_name, *arguments, &block)
37
+ else
38
+ super
39
+ end
40
+ end
41
+
42
+ def respond_to_missing?(method_name, _include_private)
43
+ subscriptions.respond_to?(method_name)
44
+ end
45
+
46
+ private
47
+
48
+ def instrument(args)
49
+ instrumentation.instrument("add.subscriptions.rails_event_store", args) do
50
+ unsubscribe = yield
51
+ ->() {
52
+ instrumentation.instrument("remove.subscriptions.rails_event_store", args) do
53
+ unsubscribe.call
54
+ end
55
+ }
56
+ end
57
+ end
58
+
59
+ attr_reader :instrumentation, :subscriptions
60
+ end
61
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyEventStore
4
+ module Mappers
5
+ module Transformation
6
+ class PreserveTypes
7
+ def initialize(type_resolver: ->(type) { type.to_s } )
8
+ @registered_type_serializers = {}
9
+ @type_resolver = type_resolver
10
+ end
11
+
12
+ def register(type, serializer:, deserializer:)
13
+ @registered_type_serializers[@type_resolver.(type)] = {
14
+ serializer: serializer,
15
+ deserializer: deserializer
16
+ }
17
+ self
18
+ end
19
+
20
+ def dump(record)
21
+ data = transform(record.data)
22
+ metadata = transform(record.metadata)
23
+ if (metadata.respond_to?(:[]=))
24
+ metadata[:types] = {
25
+ data: store_type(record.data),
26
+ metadata: store_type(record.metadata),
27
+ }
28
+ end
29
+
30
+ Record.new(
31
+ event_id: record.event_id,
32
+ event_type: record.event_type,
33
+ data: data,
34
+ metadata: metadata,
35
+ timestamp: record.timestamp,
36
+ valid_at: record.valid_at,
37
+ )
38
+ end
39
+
40
+ def load(record)
41
+ types = record.metadata.delete(:types) rescue nil
42
+ data_types = types&.fetch(:data, nil)
43
+ metadata_types = types&.fetch(:metadata, nil)
44
+ data = data_types ? restore_type(record.data, data_types) : record.data
45
+ metadata = metadata_types ? restore_type(record.metadata, metadata_types) : record.metadata
46
+
47
+ Record.new(
48
+ event_id: record.event_id,
49
+ event_type: record.event_type,
50
+ data: data,
51
+ metadata: metadata,
52
+ timestamp: record.timestamp,
53
+ valid_at: record.valid_at,
54
+ )
55
+ end
56
+
57
+ private
58
+ PASS_THROUGH = ->(v) { v }
59
+
60
+ def transform_hash(argument)
61
+ argument.each_with_object({}) do |(key, value), hash|
62
+ hash[transform(key)] = transform(value)
63
+ end
64
+ end
65
+
66
+ def transform(argument)
67
+ case argument
68
+ when Hash
69
+ transform_hash(argument)
70
+ when Array
71
+ argument.map{|i| transform(i)}
72
+ else
73
+ serializer_of(argument.class).call(argument)
74
+ end
75
+ end
76
+
77
+ def store_types(argument)
78
+ argument.each_with_object({}) do |(key, value), hash|
79
+ hash[transform(key)] = [store_type(key), store_type(value)]
80
+ end
81
+ end
82
+
83
+ def store_type(argument)
84
+ case argument
85
+ when Hash
86
+ store_types(argument)
87
+ when Array
88
+ argument.map{|i| store_type(i)}
89
+ else
90
+ argument.class.name
91
+ end
92
+ end
93
+
94
+ def restore_types(argument, types)
95
+ argument.each_with_object({}) do |(key, value), hash|
96
+ key_type, value_type = types.fetch(key.to_sym)
97
+ restored_key = restore_type(key, key_type)
98
+ hash[restored_key] = restore_type(value, value_type)
99
+ end
100
+ end
101
+
102
+ def restore_type(argument, type)
103
+ case argument
104
+ when Hash
105
+ restore_types(argument, type)
106
+ when Array
107
+ argument.each_with_index.map{|a,idx| restore_type(a, type.fetch(idx))}
108
+ else
109
+ deserializer_of(type).call(argument)
110
+ end
111
+ end
112
+
113
+ def serializer_of(type)
114
+ @registered_type_serializers.dig(@type_resolver.(type), :serializer) || PASS_THROUGH
115
+ end
116
+
117
+ def deserializer_of(type)
118
+ @registered_type_serializers.dig(type, :deserializer) || PASS_THROUGH
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -17,9 +17,8 @@ module RubyEventStore
17
17
 
18
18
  attr_reader :event_id, :data, :metadata, :event_type, :timestamp, :valid_at
19
19
 
20
- BIG_VALUE = 0b110011100100000010010010110011101011110101010101001100111110011
21
20
  def hash
22
- [self.class, event_id, data, metadata, event_type, timestamp, valid_at].hash ^ BIG_VALUE
21
+ [event_id, data, metadata, event_type, timestamp, valid_at].hash ^ self.class.hash
23
22
  end
24
23
 
25
24
  def ==(other)
@@ -16,9 +16,8 @@ module RubyEventStore
16
16
 
17
17
  attr_reader :event_id, :data, :metadata, :event_type, :timestamp, :valid_at
18
18
 
19
- BIG_VALUE = 0b110011100100000010010010110011101011110101010101001100111110111
20
19
  def hash
21
- [self.class, event_id, data, metadata, event_type, timestamp, valid_at].hash ^ BIG_VALUE
20
+ [event_id, data, metadata, event_type, timestamp, valid_at].hash ^ self.class.hash
22
21
  end
23
22
 
24
23
  def ==(other)
@@ -1407,6 +1407,15 @@ module RubyEventStore
1407
1407
  )
1408
1408
  expect(repository.read(specification.result).count).to eq(0)
1409
1409
  end
1410
+
1411
+ specify "linking empty list of commits to stream should be a no-op" do
1412
+ repository.link_to_stream(
1413
+ [],
1414
+ RubyEventStore::Stream.new("whatever-non-globa"),
1415
+ RubyEventStore::ExpectedVersion.any
1416
+ )
1417
+ expect(repository.read(specification.result).count).to eq(0)
1418
+ end
1410
1419
  end
1411
1420
 
1412
1421
  ::RSpec::Matchers.define :eq_ids do |expected_ids|
@@ -43,7 +43,7 @@ module RubyEventStore
43
43
  Specification.new(reader, result.dup { |r| r.stop = stop })
44
44
  end
45
45
 
46
- # Limits the query to events that later than given time.
46
+ # Limits the query to events that occurred before given time.
47
47
  # {http://railseventstore.org/docs/read/ Find out more}.
48
48
  #
49
49
  # @param time [Time]
@@ -59,7 +59,7 @@ module RubyEventStore
59
59
  )
60
60
  end
61
61
 
62
- # Limits the query to events that occurred on given time or later.
62
+ # Limits the query to events that occurred on or before given time.
63
63
  # {http://railseventstore.org/docs/read/ Find out more}.
64
64
  #
65
65
  # @param time [Time]
@@ -75,7 +75,7 @@ module RubyEventStore
75
75
  )
76
76
  end
77
77
 
78
- # Limits the query to events that occurred earlier than given time.
78
+ # Limits the query to events that occurred after given time.
79
79
  # {http://railseventstore.org/docs/read/ Find out more}.
80
80
  #
81
81
  # @param time [Time]
@@ -91,7 +91,7 @@ module RubyEventStore
91
91
  )
92
92
  end
93
93
 
94
- # Limits the query to events that occurred on given time or earlier.
94
+ # Limits the query to events that occurred on or after given time.
95
95
  # {http://railseventstore.org/docs/read/ Find out more}.
96
96
  #
97
97
  # @param time [Time]
@@ -244,9 +244,6 @@ module RubyEventStore
244
244
  other_spec.hash.eql?(hash)
245
245
  end
246
246
 
247
- # @private
248
- BIG_VALUE = 0b100010010100011110111101100001011111100101001010111110101000000
249
-
250
247
  # Generates a Fixnum hash value for this object. This function
251
248
  # have the property that a.eql?(b) implies a.hash == b.hash.
252
249
  #
@@ -273,7 +270,6 @@ module RubyEventStore
273
270
  # @return [Integer]
274
271
  def hash
275
272
  [
276
- self.class,
277
273
  get_direction,
278
274
  start,
279
275
  stop,
@@ -288,7 +284,7 @@ module RubyEventStore
288
284
  batch_size,
289
285
  with_ids,
290
286
  with_types
291
- ].hash ^ BIG_VALUE
287
+ ].hash ^ self.class.hash
292
288
  end
293
289
 
294
290
  private
@@ -13,9 +13,8 @@ module RubyEventStore
13
13
 
14
14
  attr_reader :name
15
15
 
16
- BIG_VALUE = 0b111111100100000010010010110011101011000101010101001100100110011
17
16
  def hash
18
- [self.class, name].hash ^ BIG_VALUE
17
+ name.hash ^ self.class.hash
19
18
  end
20
19
 
21
20
  def ==(other_stream)
@@ -23,7 +22,5 @@ module RubyEventStore
23
22
  end
24
23
 
25
24
  alias_method :eql?, :==
26
-
27
- private_constant :BIG_VALUE
28
25
  end
29
26
  end
@@ -14,16 +14,15 @@ module RubyEventStore
14
14
  private
15
15
 
16
16
  def deep_transform(data, &block)
17
- data.each_with_object({}) do |(k, v), h|
18
- h[yield(k)] =
19
- case v
20
- when Hash
21
- deep_transform(v, &block)
22
- when Array
23
- v.map { |i| Hash === i ? deep_transform(i, &block) : i }
24
- else
25
- v
26
- end
17
+ case data
18
+ when Hash
19
+ data.each_with_object({}) do |(key, value), hash|
20
+ hash[yield(key)] = deep_transform(value, &block)
21
+ end
22
+ when Array
23
+ data.map { |i| deep_transform(i, &block) }
24
+ else
25
+ data
27
26
  end
28
27
  end
29
28
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyEventStore
4
- VERSION = "2.5.1"
4
+ VERSION = "2.6.0"
5
5
  end
@@ -27,6 +27,7 @@ require_relative "ruby_event_store/mappers/transformation/event_class_remapper"
27
27
  require_relative "ruby_event_store/mappers/transformation/upcast"
28
28
  require_relative "ruby_event_store/mappers/transformation/stringify_metadata_keys"
29
29
  require_relative "ruby_event_store/mappers/transformation/symbolize_metadata_keys"
30
+ require_relative "ruby_event_store/mappers/transformation/preserve_types"
30
31
  require_relative "ruby_event_store/mappers/pipeline"
31
32
  require_relative "ruby_event_store/mappers/pipeline_mapper"
32
33
  require_relative "ruby_event_store/mappers/default"
@@ -44,3 +45,4 @@ require_relative "ruby_event_store/composed_dispatcher"
44
45
  require_relative "ruby_event_store/version"
45
46
  require_relative "ruby_event_store/instrumented_repository"
46
47
  require_relative "ruby_event_store/instrumented_dispatcher"
48
+ require_relative "ruby_event_store/instrumented_subscriptions"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_event_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arkency
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-06-24 00:00:00.000000000 Z
11
+ date: 2022-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -55,6 +55,7 @@ files:
55
55
  - lib/ruby_event_store/in_memory_repository.rb
56
56
  - lib/ruby_event_store/instrumented_dispatcher.rb
57
57
  - lib/ruby_event_store/instrumented_repository.rb
58
+ - lib/ruby_event_store/instrumented_subscriptions.rb
58
59
  - lib/ruby_event_store/link_by_metadata.rb
59
60
  - lib/ruby_event_store/mappers/default.rb
60
61
  - lib/ruby_event_store/mappers/encryption_key.rb
@@ -69,6 +70,7 @@ files:
69
70
  - lib/ruby_event_store/mappers/transformation/domain_event.rb
70
71
  - lib/ruby_event_store/mappers/transformation/encryption.rb
71
72
  - lib/ruby_event_store/mappers/transformation/event_class_remapper.rb
73
+ - lib/ruby_event_store/mappers/transformation/preserve_types.rb
72
74
  - lib/ruby_event_store/mappers/transformation/stringify_metadata_keys.rb
73
75
  - lib/ruby_event_store/mappers/transformation/symbolize_metadata_keys.rb
74
76
  - lib/ruby_event_store/mappers/transformation/upcast.rb
@@ -116,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
116
118
  - !ruby/object:Gem::Version
117
119
  version: '0'
118
120
  requirements: []
119
- rubygems_version: 3.3.7
121
+ rubygems_version: 3.3.26
120
122
  signing_key:
121
123
  specification_version: 4
122
124
  summary: Implementation of an event store in Ruby