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 +4 -4
- data/lib/rails_event_store/active_job_bulk_scheduler.rb +9 -0
- data/lib/rails_event_store/active_job_id_only_bulk_scheduler.rb +9 -0
- data/lib/rails_event_store/active_job_id_only_scheduler.rb +7 -1
- data/lib/rails_event_store/active_job_scheduler.rb +5 -1
- data/lib/rails_event_store/after_commit_dispatcher.rb +27 -3
- data/lib/rails_event_store/all.rb +4 -0
- data/lib/rails_event_store/buffering_scheduler.rb +27 -0
- data/lib/rails_event_store/bulk_enqueue.rb +26 -0
- data/lib/rails_event_store/spec/buffering_scheduler_lint.rb +11 -0
- data/lib/rails_event_store/version.rb +1 -1
- metadata +15 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f1fa1cf3a596ceaec4a25af51d2b58c5512c23db3ca384e354e346936ca7d9c2
|
|
4
|
+
data.tar.gz: 464e699f8ede102e3f3fb283a371e83daeeac3a1767c0650a7d4979d43788248
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 42bc69755c4dcdf516d72f21a637153ac2459d76ce29bd58374e33642dc474a47358cd3cbfc5414445025ba73a38fe430ff15847ef97af2b4237df633faced0f
|
|
7
|
+
data.tar.gz: 5d9fb85db8a5141ffeedc2b79fd28b91b25546c6f4e9816ce8853bf0c38f43d919145367af67bd0dcb84d09b6e4d0577ed3ae9ddfa400f72b2ebdffa9f29f7d2
|
|
@@ -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(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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:
|
|
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: []
|