rails_event_store 3.0.1 → 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/generators/rails_event_store/browser_views_generator.rb +21 -0
- 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 -2
- data/lib/rails_event_store/all.rb +4 -0
- data/lib/rails_event_store/browser.rb +8 -1
- 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 +17 -11
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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rails/generators"
|
|
4
|
+
require "ruby_event_store/browser"
|
|
5
|
+
|
|
6
|
+
module RailsEventStore
|
|
7
|
+
module Generators
|
|
8
|
+
class BrowserViewsGenerator < Rails::Generators::Base
|
|
9
|
+
source_root RubyEventStore::Browser::Renderer::VIEWS_ROOT
|
|
10
|
+
|
|
11
|
+
def copy_views
|
|
12
|
+
directory ".", "app/views/ruby_event_store_browser"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def instructions
|
|
16
|
+
say "Browser picks these views up automatically. Delete the files you do not customize - " \
|
|
17
|
+
"anything missing falls back to the views built into the gem."
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
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(
|
|
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,12 +19,14 @@ module RailsEventStore
|
|
|
11
19
|
end
|
|
12
20
|
|
|
13
21
|
def run(&schedule_proc)
|
|
14
|
-
transaction =
|
|
22
|
+
transaction = current_transaction
|
|
15
23
|
|
|
16
24
|
if transaction.joinable?
|
|
17
25
|
transaction.add_record(async_record(schedule_proc))
|
|
26
|
+
transaction.after_commit { @scheduler.flush } if buffering_scheduler?
|
|
18
27
|
else
|
|
19
28
|
yield
|
|
29
|
+
@scheduler.flush if buffering_scheduler?
|
|
20
30
|
end
|
|
21
31
|
end
|
|
22
32
|
|
|
@@ -48,5 +58,20 @@ module RailsEventStore
|
|
|
48
58
|
|
|
49
59
|
attr_reader :schedule_proc
|
|
50
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
|
|
51
76
|
end
|
|
52
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"
|
|
@@ -5,7 +5,14 @@ require "rails/engine"
|
|
|
5
5
|
|
|
6
6
|
module RailsEventStore
|
|
7
7
|
class Browser < Rails::Engine
|
|
8
|
-
endpoint
|
|
8
|
+
endpoint(
|
|
9
|
+
lambda do |env|
|
|
10
|
+
RubyEventStore::Browser::App.for(
|
|
11
|
+
event_store_locator: -> { Rails.configuration.event_store },
|
|
12
|
+
views_root: Rails.root.join("app/views/ruby_event_store_browser"),
|
|
13
|
+
).call(env)
|
|
14
|
+
end
|
|
15
|
+
)
|
|
9
16
|
|
|
10
17
|
railtie_name "ruby_event_store_browser_app"
|
|
11
18
|
end
|
|
@@ -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.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.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.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.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.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.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.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.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.0
|
|
67
|
+
version: 3.2.0
|
|
68
68
|
- !ruby/object:Gem::Dependency
|
|
69
69
|
name: activesupport
|
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -133,6 +133,7 @@ extra_rdoc_files:
|
|
|
133
133
|
files:
|
|
134
134
|
- README.md
|
|
135
135
|
- lib/generators/rails_event_store/bounded_context_generator.rb
|
|
136
|
+
- lib/generators/rails_event_store/browser_views_generator.rb
|
|
136
137
|
- lib/generators/rails_event_store/rspec_generator.rb
|
|
137
138
|
- lib/generators/rails_event_store/test_unit_generator.rb
|
|
138
139
|
- lib/generators/templates/bc_spec.erb
|
|
@@ -142,17 +143,22 @@ files:
|
|
|
142
143
|
- lib/generators/templates/spec_helper.erb
|
|
143
144
|
- lib/generators/templates/test_helper.erb
|
|
144
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
|
|
145
148
|
- lib/rails_event_store/active_job_id_only_scheduler.rb
|
|
146
149
|
- lib/rails_event_store/active_job_scheduler.rb
|
|
147
150
|
- lib/rails_event_store/after_commit_dispatcher.rb
|
|
148
151
|
- lib/rails_event_store/all.rb
|
|
149
152
|
- lib/rails_event_store/async_handler_helpers.rb
|
|
150
153
|
- lib/rails_event_store/browser.rb
|
|
154
|
+
- lib/rails_event_store/buffering_scheduler.rb
|
|
155
|
+
- lib/rails_event_store/bulk_enqueue.rb
|
|
151
156
|
- lib/rails_event_store/client.rb
|
|
152
157
|
- lib/rails_event_store/json_client.rb
|
|
153
158
|
- lib/rails_event_store/link_by_metadata.rb
|
|
154
159
|
- lib/rails_event_store/middleware.rb
|
|
155
160
|
- lib/rails_event_store/railtie.rb
|
|
161
|
+
- lib/rails_event_store/spec/buffering_scheduler_lint.rb
|
|
156
162
|
- lib/rails_event_store/version.rb
|
|
157
163
|
homepage: https://railseventstore.org
|
|
158
164
|
licenses:
|
|
@@ -170,14 +176,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
170
176
|
requirements:
|
|
171
177
|
- - ">="
|
|
172
178
|
- !ruby/object:Gem::Version
|
|
173
|
-
version: '
|
|
179
|
+
version: '3.3'
|
|
174
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
181
|
requirements:
|
|
176
182
|
- - ">="
|
|
177
183
|
- !ruby/object:Gem::Version
|
|
178
184
|
version: '0'
|
|
179
185
|
requirements: []
|
|
180
|
-
rubygems_version:
|
|
186
|
+
rubygems_version: 4.0.16
|
|
181
187
|
specification_version: 4
|
|
182
188
|
summary: Rails wrapper for RubyEventStore with batteries included
|
|
183
189
|
test_files: []
|