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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 961b6916b6be373dc20de369d54d11923cfa30d239c2e10bd12e4eb8c44d45b8
4
- data.tar.gz: 37dc7daf235cf6daaf473ac1b0ca0b863d864a87e4d279ba7a6dd625e67e44f5
3
+ metadata.gz: f1fa1cf3a596ceaec4a25af51d2b58c5512c23db3ca384e354e346936ca7d9c2
4
+ data.tar.gz: 464e699f8ede102e3f3fb283a371e83daeeac3a1767c0650a7d4979d43788248
5
5
  SHA512:
6
- metadata.gz: a882bfda0aa706b2c7122920046876af2d8c15f344e2e0bfc82fa4fd01a869b8f8eea72ba5d1bdf9495be3947a1ef3def6e51ac935be6e10595658de8aa6cf6b
7
- data.tar.gz: 7d6a3651f4bb068d8641ae609ceaa7c14fd3b51ef68cd74f5eef891f28970a784a7b43788c59c5466885ec355371b90bf655fd5cf537e42e2b701326ae908501
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
@@ -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,12 +19,14 @@ module RailsEventStore
11
19
  end
12
20
 
13
21
  def run(&schedule_proc)
14
- transaction = ActiveRecord::Base.connection.current_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 RubyEventStore::Browser::App.for(event_store_locator: -> { Rails.configuration.event_store })
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsEventStore
4
- VERSION = "3.0.1"
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.0.1
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.1
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.1
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.1
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.1
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.1
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.1
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.1
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.1
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: '2.7'
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: 3.7.1
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: []