ruby_event_store 0.42.0 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f806b875525e8f268335372c58de01b45bf52e975cefe1a4359ff71eed9b137
4
- data.tar.gz: d7263a8da692d83db60d2568cd83d6e540d75d90f78c308a5617bb95472ec289
3
+ metadata.gz: 6c14775d70ee44777790b8b916ceee3b7801439494711a701aabb5a8904e8270
4
+ data.tar.gz: 9c11cdd6cc8a13a8e16749928acb174c1cc11ca5a5e56aae2d9338fbbb42f842
5
5
  SHA512:
6
- metadata.gz: ff355e361ebed03d0a0d1cf462213a6692540c8c3476ee1b5d08337be9e6bf2092e70a37161e8571ce59ce73b9c57ccb3c653dd1cd2914b6e1d8cb34ff88126e
7
- data.tar.gz: cd0031d809fa10271038a4233c36a4634d53527f8814212c32f990e3d2dfc1e8d264da0f03321e9fe448af357bd6677ff74ab76bd3844a3a7aed6c232cb891b9
6
+ metadata.gz: 15c4530f8da5f71f6e411296a7e228ccea5dc0a3b836cfa90d7ba6c9f1462881d85963d1f68e0995f7b86bf27f9ae4981a551e3fbd1aa8b5213238488144ecba
7
+ data.tar.gz: d925c31f958e72529c43fe4a006e74a0140b37bbddd667e1ac19cebca66963c59903a1aac136f1b080b2977b2019bb5e79c21bf9ab6bca5aa23c9f1db45293a8
data/Gemfile CHANGED
@@ -6,5 +6,5 @@ gemspec
6
6
  eval_gemfile File.expand_path('../support/bundler/Gemfile.shared', __dir__)
7
7
 
8
8
  gem 'protobuf_nested_struct'
9
- gem 'google-protobuf', '~> 3.7.0'
9
+ gem 'google-protobuf', '~> 3.12.2', '>= 3.12.2'
10
10
  gem 'activesupport', '~> 5.0'
@@ -36,6 +36,7 @@ require 'ruby_event_store/mappers/default'
36
36
  require 'ruby_event_store/mappers/forgotten_data'
37
37
  require 'ruby_event_store/mappers/encryption_mapper'
38
38
  require 'ruby_event_store/mappers/instrumented_mapper'
39
+ require 'ruby_event_store/mappers/json_mapper'
39
40
  require 'ruby_event_store/mappers/null_mapper'
40
41
  require 'ruby_event_store/mappers/protobuf'
41
42
  require 'ruby_event_store/batch_enumerator'
@@ -10,9 +10,10 @@ module RubyEventStore
10
10
 
11
11
  def each
12
12
  return to_enum unless block_given?
13
+
13
14
  0.step(total_limit - 1, batch_size) do |batch_offset|
14
- batch_limit = [batch_size, total_limit - batch_offset].min
15
- result = reader.call(batch_offset, batch_limit)
15
+ batch_limit = [batch_size, total_limit - batch_offset].min
16
+ result = reader.call(batch_offset, batch_limit)
16
17
 
17
18
  break if result.empty?
18
19
  yield result
@@ -29,6 +30,6 @@ module RubyEventStore
29
30
 
30
31
  private
31
32
 
32
- attr_accessor :batch_size, :total_limit, :reader
33
+ attr_reader :batch_size, :total_limit, :reader
33
34
  end
34
35
  end
@@ -8,7 +8,7 @@ module RubyEventStore
8
8
  end
9
9
 
10
10
  def call(event, serialized_event)
11
- subscribers = subscriptions.all_for(event.type)
11
+ subscribers = subscriptions.all_for(event.event_type)
12
12
  subscribers.each do |subscriber|
13
13
  dispatcher.call(subscriber, event, serialized_event)
14
14
  end
@@ -30,24 +30,10 @@ module RubyEventStore
30
30
 
31
31
  # Type of event. Used when matching with subscribed handlers.
32
32
  # @return [String]
33
- def type
33
+ def event_type
34
34
  self.class.name
35
35
  end
36
36
 
37
- # Returns a hash representation of the event.
38
- #
39
- # Metadata is converted to hash as well
40
- #
41
- # @return [Hash] with :event_id, :metadata, :data, :type keys
42
- def to_h
43
- {
44
- event_id: event_id,
45
- metadata: metadata.to_h,
46
- data: data,
47
- type: type,
48
- }
49
- end
50
-
51
37
  # Timestamp from metadata
52
38
  #
53
39
  # @return [Time, nil]
@@ -140,4 +126,4 @@ module RubyEventStore
140
126
 
141
127
  alias_method :eql?, :==
142
128
  end
143
- end
129
+ end
@@ -13,7 +13,7 @@ module RubyEventStore
13
13
  return unless event.metadata.has_key?(@key)
14
14
 
15
15
  @event_store.link(
16
- [event.message_id],
16
+ [event.event_id],
17
17
  stream_name: "#{@prefix}#{event.metadata.fetch(@key)}"
18
18
  )
19
19
  end
@@ -48,10 +48,10 @@ module RubyEventStore
48
48
 
49
49
  def call(event)
50
50
  @event_store.link(
51
- [event.message_id],
52
- stream_name: "#{@prefix}#{event.type}"
51
+ [event.event_id],
52
+ stream_name: "#{@prefix}#{event.event_type}"
53
53
  )
54
54
  end
55
55
  end
56
56
 
57
- end
57
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyEventStore
4
+ module Mappers
5
+ class JSONMapper < PipelineMapper
6
+ def initialize(events_class_remapping: {})
7
+ super(Pipeline.new(
8
+ transformations: [
9
+ Transformation::EventClassRemapper.new(events_class_remapping),
10
+ Transformation::SymbolizeMetadataKeys.new,
11
+ ],
12
+ ))
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,15 +2,9 @@
2
2
 
3
3
  module RubyEventStore
4
4
  class Proto < RubyEventStore::Event
5
- def type
5
+ def event_type
6
6
  data.class.descriptor.name
7
7
  end
8
-
9
- def ==(other_event)
10
- other_event.instance_of?(self.class) &&
11
- other_event.event_id.eql?(event_id) &&
12
- other_event.data == data # https://github.com/google/protobuf/issues/4455
13
- end
14
8
  end
15
9
 
16
10
  module Mappers
@@ -9,7 +9,7 @@ module RubyEventStore
9
9
  event_id: domain_event.event_id,
10
10
  metadata: domain_event.metadata.to_h,
11
11
  data: domain_event.data,
12
- event_type: domain_event.type
12
+ event_type: domain_event.event_type
13
13
  )
14
14
  end
15
15
 
@@ -82,14 +82,14 @@ module RubyEventStore
82
82
 
83
83
  def encrypt_data(data, meta)
84
84
  meta.reduce(data) do |acc, (key, value)|
85
- acc[key] = encrypt_attribute(acc, key, value)
85
+ acc[key] = encrypt_attribute(acc, key, value) if data.has_key?(key)
86
86
  acc
87
87
  end
88
88
  end
89
89
 
90
90
  def decrypt_data(data, meta)
91
91
  meta.reduce(data) do |acc, (key, value)|
92
- acc[key] = decrypt_attribute(data, key, value)
92
+ acc[key] = decrypt_attribute(data, key, value) if data.has_key?(key)
93
93
  acc
94
94
  end
95
95
  end
@@ -98,7 +98,7 @@ module RubyEventStore
98
98
  case meta
99
99
  when Leaf
100
100
  value = data.fetch(attribute)
101
- return unless value
101
+ return if value.nil?
102
102
 
103
103
  encryption_key = key_repository.key_of(meta.fetch(:identifier))
104
104
  encryption_key.encrypt(serializer.dump(value), meta.fetch(:iv))
@@ -9,8 +9,7 @@ module RubyEventStore
9
9
  end
10
10
 
11
11
  def dump(item)
12
- stringify = StringifyMetadataKeys.new
13
- metadata = ProtobufNestedStruct::HashMapStringValue.dump(stringify.dump(item).metadata)
12
+ metadata = ProtobufNestedStruct::HashMapStringValue.dump(item.metadata)
14
13
  item.merge(metadata: metadata)
15
14
  end
16
15
 
@@ -15,8 +15,8 @@ module RubyEventStore
15
15
 
16
16
  def initialize(streams: [])
17
17
  @streams = streams
18
- @handlers = Hash.new { ->(_, _) {} }
19
- @init = -> { Hash.new }
18
+ @handlers = {}
19
+ @init = -> { {} }
20
20
  end
21
21
 
22
22
  attr_reader :streams, :handlers
@@ -43,7 +43,7 @@ module RubyEventStore
43
43
  end
44
44
 
45
45
  def call(event)
46
- handlers.fetch(event.type).(current_state, event)
46
+ handlers.fetch(event.event_type).(current_state, event)
47
47
  end
48
48
 
49
49
  def handled_events
@@ -51,6 +51,7 @@ module RubyEventStore
51
51
  end
52
52
 
53
53
  def run(event_store, start: nil, count: PAGE_SIZE)
54
+ return initial_state if handled_events.empty?
54
55
  if streams.any?
55
56
  reduce_from_streams(event_store, start, count)
56
57
  else
@@ -83,6 +84,7 @@ module RubyEventStore
83
84
 
84
85
  def read_scope(event_store, stream, count, start)
85
86
  scope = event_store.read.in_batches(count)
87
+ scope = scope.of_type(handled_events)
86
88
  scope = scope.stream(stream) if stream
87
89
  scope = scope.from(start) if start
88
90
  scope
@@ -93,7 +95,7 @@ module RubyEventStore
93
95
  end
94
96
 
95
97
  def transition(state, event)
96
- handlers[event.type].(state, event)
98
+ handlers.fetch(event.event_type).call(state, event)
97
99
  state
98
100
  end
99
101
  end
@@ -1,5 +1,5 @@
1
1
  RSpec.shared_examples :broker do |broker_klass|
2
- let(:event) { instance_double(::RubyEventStore::Event, type: 'EventType') }
2
+ let(:event) { instance_double(::RubyEventStore::Event, event_type: 'EventType') }
3
3
  let(:serialized_event) { instance_double(::RubyEventStore::SerializedRecord) }
4
4
  let(:handler) { HandlerClass.new }
5
5
  let(:subscriptions) { ::RubyEventStore::Subscriptions.new }
@@ -1,9 +1,7 @@
1
- RSpec.shared_examples :event do |event_class|
1
+ RSpec.shared_examples :event do |event_class, data, metadata|
2
2
  it 'allows initialization' do
3
3
  expect {
4
- metadata = double(:metadata)
5
- allow(metadata).to receive(:to_h).and_return({})
6
- event_class.new(event_id: Object.new, data: Object.new, metadata: metadata)
4
+ event_class.new(event_id: Object.new, data: data || Object.new, metadata: metadata || {})
7
5
  }.not_to raise_error
8
6
  end
9
7
 
@@ -29,11 +27,11 @@ RSpec.shared_examples :event do |event_class|
29
27
  expect(event.event_id).to eq '1234567890'
30
28
  end
31
29
 
32
- it 'provides type as string' do
30
+ it 'provides event type as string' do
33
31
  event = event_class.new
34
- expect(event.type).to be_an_instance_of(String)
35
- expect(event.type).not_to eq ''
36
- expect(event.type).not_to eq nil
32
+ expect(event.event_type).to be_an_instance_of(String)
33
+ expect(event.event_type).not_to eq ''
34
+ expect(event.event_type).not_to eq nil
37
35
  end
38
36
 
39
37
  it "provides data" do
@@ -5,7 +5,7 @@ module RubyEventStore
5
5
 
6
6
  expect(record).to be_kind_of(SerializedRecord)
7
7
  expect(record.event_id).to eq(domain_event.event_id)
8
- expect(record.event_type).to eq(domain_event.type)
8
+ expect(record.event_type).to eq(domain_event.event_type)
9
9
  end
10
10
 
11
11
  specify "serialize and deserialize gives equal event" do
@@ -151,7 +151,7 @@ module RubyEventStore
151
151
  def dup
152
152
  new_attributes = attributes.dup
153
153
  yield new_attributes if block_given?
154
- SpecificationResult.new(new_attributes.to_h)
154
+ SpecificationResult.new(**new_attributes.to_h)
155
155
  end
156
156
 
157
157
  # Two specification attributess are equal if:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyEventStore
4
- VERSION = "0.42.0"
4
+ VERSION = "1.1.1"
5
5
  end
@@ -25,5 +25,5 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ['lib']
27
27
 
28
- spec.add_dependency 'concurrent-ruby', '~> 1.0'
28
+ spec.add_dependency 'concurrent-ruby', '~> 1.0', '>= 1.1.6'
29
29
  end
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: 0.42.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arkency
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-30 00:00:00.000000000 Z
11
+ date: 2020-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.1.6
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,6 +27,9 @@ dependencies:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
29
  version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.1.6
27
33
  description: Implementation of Event Store in Ruby
28
34
  email:
29
35
  - dev@arkency.com
@@ -57,6 +63,7 @@ files:
57
63
  - lib/ruby_event_store/mappers/forgotten_data.rb
58
64
  - lib/ruby_event_store/mappers/in_memory_encryption_key_repository.rb
59
65
  - lib/ruby_event_store/mappers/instrumented_mapper.rb
66
+ - lib/ruby_event_store/mappers/json_mapper.rb
60
67
  - lib/ruby_event_store/mappers/null_mapper.rb
61
68
  - lib/ruby_event_store/mappers/pipeline.rb
62
69
  - lib/ruby_event_store/mappers/pipeline_mapper.rb
@@ -113,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
120
  - !ruby/object:Gem::Version
114
121
  version: '0'
115
122
  requirements: []
116
- rubygems_version: 3.0.6
123
+ rubygems_version: 3.0.3
117
124
  signing_key:
118
125
  specification_version: 4
119
126
  summary: Event Store in Ruby