rails_event_store 3.1.0 → 3.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: 34751c7e5370bed62fd1c065729250ca3ac6e87ea7856309e92a3549a5890dc2
4
- data.tar.gz: eb23c0cdb91919123f9cbdb73d72b3c4f06f42e6df778c222255090e44599023
3
+ metadata.gz: f1fa1cf3a596ceaec4a25af51d2b58c5512c23db3ca384e354e346936ca7d9c2
4
+ data.tar.gz: 464e699f8ede102e3f3fb283a371e83daeeac3a1767c0650a7d4979d43788248
5
5
  SHA512:
6
- metadata.gz: d5840ed1e6857dd93de6a3accd353444fe844f502d54ae06c4e9c8317e5bd3e934106bd3f8a5d9466f0ba013c832d08c8f743caad5f1ef62077c4f70f06a27ec
7
- data.tar.gz: b2f08e52be50507ee34024197ac83ac724b233c89f5190fac65136008818465fdea7ec35fd14b05fff2547c389fd2a842bb90ef5775dfbd397048dd7fd660b87
6
+ metadata.gz: 42bc69755c4dcdf516d72f21a637153ac2459d76ce29bd58374e33642dc474a47358cd3cbfc5414445025ba73a38fe430ff15847ef97af2b4237df633faced0f
7
+ data.tar.gz: 5d9fb85db8a5141ffeedc2b79fd28b91b25546c6f4e9816ce8853bf0c38f43d919145367af67bd0dcb84d09b6e4d0577ed3ae9ddfa400f72b2ebdffa9f29f7d2
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_job"
4
+
5
+ module RailsEventStore
6
+ class ActiveJobBulkScheduler < ActiveJobScheduler
7
+ include BulkEnqueue
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_job"
4
+
5
+ module RailsEventStore
6
+ class ActiveJobIdOnlyBulkScheduler < ActiveJobIdOnlyScheduler
7
+ include BulkEnqueue
8
+ end
9
+ end
@@ -5,11 +5,17 @@ require "active_job"
5
5
  module RailsEventStore
6
6
  class ActiveJobIdOnlyScheduler
7
7
  def call(klass, record)
8
- klass.perform_later({ "event_id" => record.event_id })
8
+ klass.perform_later(payload_for(record))
9
9
  end
10
10
 
11
11
  def verify(subscriber)
12
12
  Class === subscriber && !!(subscriber < ActiveJob::Base)
13
13
  end
14
+
15
+ private
16
+
17
+ def payload_for(record)
18
+ { "event_id" => record.event_id }
19
+ end
14
20
  end
15
21
  end
@@ -9,7 +9,7 @@ module RailsEventStore
9
9
  end
10
10
 
11
11
  def call(klass, record)
12
- klass.perform_later(record.serialize(serializer).to_h.transform_keys(&:to_s))
12
+ klass.perform_later(payload_for(record))
13
13
  end
14
14
 
15
15
  def verify(subscriber)
@@ -22,6 +22,10 @@ module RailsEventStore
22
22
 
23
23
  private
24
24
 
25
+ def payload_for(record)
26
+ record.serialize(serializer).to_h.transform_keys(&:to_s)
27
+ end
28
+
25
29
  attr_reader :serializer
26
30
  end
27
31
  end
@@ -2,8 +2,16 @@
2
2
 
3
3
  module RailsEventStore
4
4
  class AfterCommitDispatcher
5
- def initialize(scheduler:)
5
+ # Flushing a buffering scheduler leans on Transaction#after_commit, which
6
+ # ActiveRecord grew in 7.2.
7
+ MINIMUM_RAILS_VERSION = Gem::Version.new("7.2")
8
+
9
+ def initialize(scheduler:, transaction_owner: ActiveRecord::Base)
6
10
  @scheduler = scheduler
11
+ @transaction_owner = transaction_owner
12
+ if buffering_scheduler? && !supported_rails_version?
13
+ raise "#{scheduler.class} requires Rails #{MINIMUM_RAILS_VERSION} or newer"
14
+ end
7
15
  end
8
16
 
9
17
  def call(subscriber, _, record)
@@ -11,13 +19,14 @@ module RailsEventStore
11
19
  end
12
20
 
13
21
  def run(&schedule_proc)
14
- connection = ActiveRecord::Base.try(:lease_connection) || ActiveRecord::Base.connection
15
- transaction = connection.current_transaction
22
+ transaction = current_transaction
16
23
 
17
24
  if transaction.joinable?
18
25
  transaction.add_record(async_record(schedule_proc))
26
+ transaction.after_commit { @scheduler.flush } if buffering_scheduler?
19
27
  else
20
28
  yield
29
+ @scheduler.flush if buffering_scheduler?
21
30
  end
22
31
  end
23
32
 
@@ -49,5 +58,20 @@ module RailsEventStore
49
58
 
50
59
  attr_reader :schedule_proc
51
60
  end
61
+
62
+ private
63
+
64
+ def buffering_scheduler?
65
+ BufferingScheduler === @scheduler
66
+ end
67
+
68
+ def supported_rails_version?
69
+ ActiveRecord.gem_version >= MINIMUM_RAILS_VERSION
70
+ end
71
+
72
+ def current_transaction
73
+ connection = @transaction_owner.try(:lease_connection) || @transaction_owner.connection
74
+ connection.current_transaction
75
+ end
52
76
  end
53
77
  end
@@ -4,8 +4,12 @@ require "ruby_event_store"
4
4
  require_relative "async_handler_helpers"
5
5
  require_relative "link_by_metadata"
6
6
  require_relative "after_commit_dispatcher"
7
+ require_relative "buffering_scheduler"
8
+ require_relative "bulk_enqueue"
7
9
  require_relative "active_job_scheduler"
10
+ require_relative "active_job_bulk_scheduler"
8
11
  require_relative "active_job_id_only_scheduler"
12
+ require_relative "active_job_id_only_bulk_scheduler"
9
13
  require_relative "client"
10
14
  require_relative "json_client"
11
15
  require_relative "version"
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsEventStore
4
+ module BufferingScheduler
5
+ BUFFER_KEY = :rails_event_store_scheduler_buffers
6
+
7
+ def flush
8
+ entries = buffers.delete(self) || []
9
+ return if entries.empty?
10
+
11
+ ship(entries)
12
+ end
13
+
14
+ private
15
+
16
+ def buffer
17
+ buffers[self] ||= []
18
+ end
19
+
20
+ # Keyed by thread as well as by scheduler identity, because #call and #flush
21
+ # run on the same thread inside commit_records, and two schedulers sharing a
22
+ # dispatcher must not drain each other's entries.
23
+ def buffers
24
+ Thread.current[BUFFER_KEY] ||= {}.compare_by_identity
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_job"
4
+
5
+ module RailsEventStore
6
+ module BulkEnqueue
7
+ include BufferingScheduler
8
+
9
+ def call(klass, record)
10
+ payload = payload_for(record)
11
+
12
+ if klass.instance_of?(ActiveJob::ConfiguredJob)
13
+ flush
14
+ klass.perform_later(payload)
15
+ else
16
+ buffer << klass.new(payload)
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def ship(jobs)
23
+ ActiveJob.perform_all_later(jobs)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.shared_examples "buffering scheduler" do |scheduler|
4
+ specify "declares itself buffering" do
5
+ expect(RailsEventStore::BufferingScheduler === scheduler).to be(true)
6
+ end
7
+
8
+ specify "#ship" do
9
+ expect(scheduler.respond_to?(:ship, true)).to be(true)
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsEventStore
4
- VERSION = "3.1.0"
4
+ VERSION = "3.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_event_store
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arkency
@@ -15,56 +15,56 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 3.1.0
18
+ version: 3.2.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 3.1.0
25
+ version: 3.2.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: ruby_event_store-browser
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - '='
31
31
  - !ruby/object:Gem::Version
32
- version: 3.1.0
32
+ version: 3.2.0
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: 3.1.0
39
+ version: 3.2.0
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: ruby_event_store-active_record
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 3.1.0
46
+ version: 3.2.0
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 3.1.0
53
+ version: 3.2.0
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: aggregate_root
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 3.1.0
60
+ version: 3.2.0
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 3.1.0
67
+ version: 3.2.0
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: activesupport
70
70
  requirement: !ruby/object:Gem::Requirement
@@ -143,17 +143,22 @@ files:
143
143
  - lib/generators/templates/spec_helper.erb
144
144
  - lib/generators/templates/test_helper.erb
145
145
  - lib/rails_event_store.rb
146
+ - lib/rails_event_store/active_job_bulk_scheduler.rb
147
+ - lib/rails_event_store/active_job_id_only_bulk_scheduler.rb
146
148
  - lib/rails_event_store/active_job_id_only_scheduler.rb
147
149
  - lib/rails_event_store/active_job_scheduler.rb
148
150
  - lib/rails_event_store/after_commit_dispatcher.rb
149
151
  - lib/rails_event_store/all.rb
150
152
  - lib/rails_event_store/async_handler_helpers.rb
151
153
  - lib/rails_event_store/browser.rb
154
+ - lib/rails_event_store/buffering_scheduler.rb
155
+ - lib/rails_event_store/bulk_enqueue.rb
152
156
  - lib/rails_event_store/client.rb
153
157
  - lib/rails_event_store/json_client.rb
154
158
  - lib/rails_event_store/link_by_metadata.rb
155
159
  - lib/rails_event_store/middleware.rb
156
160
  - lib/rails_event_store/railtie.rb
161
+ - lib/rails_event_store/spec/buffering_scheduler_lint.rb
157
162
  - lib/rails_event_store/version.rb
158
163
  homepage: https://railseventstore.org
159
164
  licenses:
@@ -178,7 +183,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
178
183
  - !ruby/object:Gem::Version
179
184
  version: '0'
180
185
  requirements: []
181
- rubygems_version: 3.6.9
186
+ rubygems_version: 4.0.16
182
187
  specification_version: 4
183
188
  summary: Rails wrapper for RubyEventStore with batteries included
184
189
  test_files: []