active_event_store 1.1.0 → 1.2.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: 40a03429293a097e9e128b80c543c1a8a6e605caf9c400d93b83753af4ff95d5
4
- data.tar.gz: c4576de3f33de50480e634e9fe8aa16ccb23a7acb23453e54f9ba23310dbc763
3
+ metadata.gz: 8710d5820746603d15b1d77b3bc01bbf70eb1943339041cf5c90fb80b15fd9b3
4
+ data.tar.gz: 8b7c765faf7eb4b781e64068b30a361e36110a775c81aea466fdc0a01a843624
5
5
  SHA512:
6
- metadata.gz: 3c80d23fe4f5f6be97c847f2b4cfd7e388793121b632e5edc7b24241f8fd36fc1078d1b15b2ca744e80d1ae75afae65ec1c925c87a35c9ec95da6c6dff671c2c
7
- data.tar.gz: 565fcba5bb1469be55feac9501d539ea6450f6682cb2a2773116e811cb1127c605ed9f393ea98055f8e30294758a1a3f30ce4b419eaec2e9727b8232364a4c01
6
+ metadata.gz: 7f00bc57582a15aa87279ca77fe58fcce032a1e1fab32c2567faefddbfc11a6697944c438e7794f91d030494441ce9662c62911ea0bd26cd2ec69e2f81fcf6bd
7
+ data.tar.gz: d793f2718e1e706ceea6d386e63527d55ade4a09c77a3ce9c2d6c25a1a6d2d32d162570dd239f58df3e1883106112f5ca152bd37845f9f3056eb7f42e9570370
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 1.2.0 (2024-01-25)
6
+
7
+ - Use custom pipeline mapper and domain event transformer. ([@Samsinite][])
8
+
5
9
  ## 1.1.0 (2023-08-24)
6
10
 
7
11
  - Require Ruby 2.7+. ([@palkan][])
@@ -37,3 +41,4 @@ Now `ActiveSupport.on_load(:active_event_store) { ... }` works.
37
41
  [@palkan]: https://github.com/palkan
38
42
  [@chriscz]: https://github.com/chriscz
39
43
  [@caws]: https://github.com/caws
44
+ [@Samsinite]: https://github.com/Samsinite
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2020-2021 Vladimir Dementyev
1
+ Copyright (c) 2020-2024 Vladimir Dementyev
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -87,10 +87,10 @@ You can also register events manually:
87
87
 
88
88
  ```ruby
89
89
  # by passing an event class
90
- ActiveEventStore.mapper.register_event MyEventClass
90
+ ActiveEventStore.mapping.register_event MyEventClass
91
91
 
92
92
  # or more precisely (in that case `event.type` must be equal to "my_event")
93
- ActiveEventStore.mapper.register "my_event", MyEventClass
93
+ ActiveEventStore.mapping.register "my_event", MyEventClass
94
94
  ```
95
95
 
96
96
  ### Publish events
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveEventStore
4
+ class DomainEvent < RubyEventStore::Mappers::Transformation::DomainEvent
5
+ attr_reader :mapping
6
+ def initialize(mapping:)
7
+ @mapping = mapping
8
+ end
9
+
10
+ def dump(event)
11
+ # lazily add type to mapping
12
+ # NOTE: use class name instead of a class to handle code reload
13
+ # in development (to avoid accessing orphaned classes)
14
+ mapping.register(event.event_type, event.class.name) unless mapping.exist?(event.event_type)
15
+
16
+ metadata = event.metadata.dup.to_h
17
+ timestamp = metadata[:timestamp]
18
+ valid_at = metadata[:valid_at]
19
+ RubyEventStore::Record.new(
20
+ event_id: event.event_id,
21
+ metadata: metadata,
22
+ data: event.data,
23
+ event_type: event.event_type,
24
+ timestamp: timestamp,
25
+ valid_at: valid_at
26
+ )
27
+ end
28
+
29
+ def load(record)
30
+ event_class = mapping.fetch(record.event_type) {
31
+ raise "Don't know how to deserialize event: \"#{record.event_type}\". " \
32
+ "Add explicit mapping: ActiveEventStore.mapping.register \"#{record.event_type}\", \"<Class Name>\""
33
+ }
34
+
35
+ Object
36
+ .const_get(event_class)
37
+ .new(
38
+ **record.data.symbolize_keys,
39
+ event_id: record.event_id,
40
+ metadata: record.metadata.merge(timestamp: record.timestamp, valid_at: record.valid_at)
41
+ )
42
+ end
43
+ end
44
+ end
@@ -1,54 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveEventStore
4
- using(Module.new {
5
- refine Hash do
6
- def symbolize_keys
7
- RubyEventStore::TransformKeys.symbolize(self)
8
- end
4
+ class Mapper < RubyEventStore::Mappers::PipelineMapper
5
+ def initialize(mapping:)
6
+ super(RubyEventStore::Mappers::Pipeline.new(
7
+ RubyEventStore::Mappers::Transformation::SymbolizeMetadataKeys.new,
8
+ to_domain_event: ActiveEventStore::DomainEvent.new(mapping: mapping)
9
+ ))
9
10
  end
10
- })
11
-
12
- # Custom mapper for RES events.
13
- #
14
- # See https://github.com/RailsEventStore/rails_event_store/blob/v0.35.0/ruby_event_store/lib/ruby_event_store/mappers/default.rb
15
- class Mapper
16
- def initialize(mapping:, serializer: ActiveEventStore.config.serializer)
17
- @serializer = serializer
18
- @mapping = mapping
19
- end
20
-
21
- def event_to_record(domain_event)
22
- # lazily add type to mapping
23
- # NOTE: use class name instead of a class to handle code reload
24
- # in development (to avoid accessing orphaned classes)
25
- mapping.register(domain_event.event_type, domain_event.class.name) unless mapping.exist?(domain_event.event_type)
26
-
27
- RubyEventStore::Record.new(
28
- event_id: domain_event.event_id,
29
- metadata: serializer.dump(domain_event.metadata.to_h),
30
- data: serializer.dump(domain_event.data),
31
- event_type: domain_event.event_type,
32
- timestamp: domain_event.timestamp,
33
- valid_at: domain_event.valid_at
34
- )
35
- end
36
-
37
- def record_to_event(record)
38
- event_class = mapping.fetch(record.event_type) {
39
- raise "Don't know how to deserialize event: \"#{record.event_type}\". " \
40
- "Add explicit mapping: ActiveEventStore.mapping.register \"#{record.event_type}\", \"<Class Name>\""
41
- }
42
-
43
- Object.const_get(event_class).new(
44
- **serializer.load(record.data).symbolize_keys,
45
- metadata: serializer.load(record.metadata).symbolize_keys,
46
- event_id: record.event_id
47
- )
48
- end
49
-
50
- private
51
-
52
- attr_reader :serializer, :mapping
53
11
  end
54
12
  end
@@ -142,7 +142,7 @@ module ActiveEventStore
142
142
  end
143
143
 
144
144
  def event_data_matches?(attributes, event)
145
- (attributes.nil? || attributes.all? { |k, v| v == event.public_send(k) })
145
+ attributes.nil? || attributes.all? { |k, v| v == event.public_send(k) }
146
146
  end
147
147
  end
148
148
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveEventStore # :nodoc:
4
- VERSION = "1.1.0"
4
+ VERSION = "1.2.0"
5
5
  end
@@ -5,6 +5,7 @@ require "rails_event_store"
5
5
  require "active_event_store/version"
6
6
 
7
7
  require "active_event_store/config"
8
+ require "active_event_store/domain_event"
8
9
  require "active_event_store/event"
9
10
  require "active_event_store/mapping"
10
11
  require "active_event_store/mapper"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_event_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Dementyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-25 00:00:00.000000000 Z
11
+ date: 2024-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails_event_store
@@ -107,6 +107,7 @@ files:
107
107
  - README.md
108
108
  - lib/active_event_store.rb
109
109
  - lib/active_event_store/config.rb
110
+ - lib/active_event_store/domain_event.rb
110
111
  - lib/active_event_store/engine.rb
111
112
  - lib/active_event_store/event.rb
112
113
  - lib/active_event_store/mapper.rb
@@ -142,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
143
  - !ruby/object:Gem::Version
143
144
  version: '0'
144
145
  requirements: []
145
- rubygems_version: 3.4.8
146
+ rubygems_version: 3.4.20
146
147
  signing_key:
147
148
  specification_version: 4
148
149
  summary: Rails Event Store in a more Rails way