sequent 5.0.0 → 6.0.1

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/bin/sequent +1 -1
  3. data/db/sequent_schema.rb +3 -3
  4. data/lib/sequent/configuration.rb +19 -1
  5. data/lib/sequent/core/aggregate_root.rb +2 -6
  6. data/lib/sequent/core/aggregate_roots.rb +2 -6
  7. data/lib/sequent/core/command.rb +8 -12
  8. data/lib/sequent/core/command_service.rb +13 -2
  9. data/lib/sequent/core/core.rb +1 -0
  10. data/lib/sequent/core/event.rb +2 -2
  11. data/lib/sequent/core/event_store.rb +15 -2
  12. data/lib/sequent/core/ext/ext.rb +17 -0
  13. data/lib/sequent/core/helpers/attribute_support.rb +1 -0
  14. data/lib/sequent/core/helpers/default_validators.rb +3 -0
  15. data/lib/sequent/core/helpers/param_support.rb +2 -0
  16. data/lib/sequent/core/helpers/string_to_value_parsers.rb +5 -0
  17. data/lib/sequent/core/helpers/time_validator.rb +23 -0
  18. data/lib/sequent/core/helpers/value_validators.rb +11 -0
  19. data/lib/sequent/core/middleware/chain.rb +37 -0
  20. data/lib/sequent/core/middleware/middleware.rb +3 -0
  21. data/lib/sequent/core/projector.rb +3 -11
  22. data/lib/sequent/core/workflow.rb +3 -11
  23. data/lib/sequent/generator/template_project/Rakefile +2 -2
  24. data/lib/sequent/generator/template_project/db/sequent_schema.rb +3 -3
  25. data/lib/sequent/generator/template_project/spec/spec_helper.rb +1 -1
  26. data/lib/sequent/migrations/migrations.rb +1 -0
  27. data/lib/sequent/migrations/projectors.rb +2 -2
  28. data/lib/sequent/migrations/sequent_schema.rb +40 -0
  29. data/lib/sequent/migrations/view_schema.rb +39 -3
  30. data/lib/sequent/rake/migration_tasks.rb +36 -33
  31. data/lib/sequent/support/database.rb +29 -13
  32. data/lib/sequent/test/command_handler_helpers.rb +1 -1
  33. data/lib/sequent/test/database_helpers.rb +20 -0
  34. data/lib/sequent/test/time_comparison.rb +2 -5
  35. data/lib/sequent/test/{event_handler_helpers.rb → workflow_helpers.rb} +24 -10
  36. data/lib/sequent/test.rb +2 -1
  37. data/lib/sequent/util/dry_run.rb +1 -1
  38. data/lib/version.rb +1 -1
  39. metadata +22 -12
  40. data/lib/sequent/rake/tasks.rb +0 -121
@@ -79,6 +79,29 @@ module Sequent
79
79
 
80
80
  attr_reader :view_schema, :db_config, :logger
81
81
 
82
+ class << self
83
+ # @see #create_view_tables
84
+ # @param env [String] The environment used for connecting the database
85
+ def create_view_tables(env:)
86
+ fail ArgumentError, 'env is required' if env.blank?
87
+
88
+ db_config = Sequent::Support::Database.read_config(env)
89
+ Sequent::Support::Database.establish_connection(db_config)
90
+ new(db_config: db_config).create_view_tables
91
+ end
92
+
93
+ # @see #create_view_schema_if_not_exists
94
+ # @param env [String] The environment used for connecting the database
95
+ def create_view_schema_if_not_exists(env:)
96
+ fail ArgumentError, 'env is required' if env.blank?
97
+
98
+ db_config = Sequent::Support::Database.read_config(env)
99
+ Sequent::Support::Database.establish_connection(db_config)
100
+
101
+ new(db_config: db_config).create_view_schema_if_not_exists
102
+ end
103
+ end
104
+
82
105
  def initialize(db_config:)
83
106
  @db_config = db_config
84
107
  @view_schema = Sequent.configuration.view_schema_name
@@ -98,6 +121,9 @@ module Sequent
98
121
  # the entire view schema without replaying the events
99
122
  def create_view_tables
100
123
  create_view_schema_if_not_exists
124
+ return if Sequent.migration_class == Sequent::Migrations::Projectors
125
+ return if Sequent.new_version == current_version
126
+
101
127
  in_view_schema do
102
128
  Sequent::Core::Migratable.all.flat_map(&:managed_tables).each do |table|
103
129
  sql_file = "#{Sequent.configuration.migration_sql_files_directory}/#{table.table_name}.sql"
@@ -112,6 +138,7 @@ module Sequent
112
138
  statements.each(&method(:exec_sql))
113
139
  end
114
140
  end
141
+ Versions.create!(version: Sequent.new_version)
115
142
  end
116
143
  end
117
144
 
@@ -119,8 +146,12 @@ module Sequent
119
146
  # Utility method that replays events for all managed_tables from all Sequent::Core::Projector's
120
147
  #
121
148
  # This method is mainly useful in test scenario's or development tasks
122
- def replay_all!
123
- replay!(Sequent.configuration.online_replay_persistor_class.new)
149
+ def replay_all!(group_exponent: 1)
150
+ replay!(
151
+ Sequent.configuration.online_replay_persistor_class.new,
152
+ projectors: Core::Migratable.projectors,
153
+ group_exponent: group_exponent,
154
+ )
124
155
  end
125
156
 
126
157
  ##
@@ -158,6 +189,8 @@ module Sequent
158
189
  # These tables will be called `table_name_VERSION`.
159
190
  # 3. Replay all events to populate the tables
160
191
  # It keeps track of all events that are already replayed.
192
+ # 4. Resets the table names of the activerecord models (projections)
193
+ # back to their original values (so without the VERSION suffix)
161
194
  #
162
195
  # If anything fails an exception is raised and everything is rolled back
163
196
  #
@@ -178,6 +211,7 @@ module Sequent
178
211
  in_view_schema do
179
212
  executor.create_indexes_after_execute_online(plan)
180
213
  end
214
+ executor.reset_table_names(plan)
181
215
  # rubocop:disable Lint/RescueException
182
216
  rescue Exception => e
183
217
  # rubocop:enable Lint/RescueException
@@ -391,7 +425,9 @@ module Sequent
391
425
  .where("NOT EXISTS (SELECT 1 FROM #{ReplayedIds.table_name} WHERE event_id = event_records.id)")
392
426
  end
393
427
  event_stream = event_stream.where('event_records.created_at > ?', 1.day.ago) if exclude_already_replayed
394
- event_stream.order('sequence_number ASC').select('id, event_type, event_json, sequence_number')
428
+ event_stream
429
+ .order('aggregate_id ASC, sequence_number ASC')
430
+ .select('id, event_type, event_json, sequence_number')
395
431
  end
396
432
 
397
433
  ## shortcut methods
@@ -6,6 +6,7 @@ require 'rake/tasklib'
6
6
 
7
7
  require 'sequent/support'
8
8
  require 'sequent/migrations/view_schema'
9
+ require 'sequent/migrations/sequent_schema'
9
10
 
10
11
  module Sequent
11
12
  module Rake
@@ -15,24 +16,35 @@ module Sequent
15
16
  def register_tasks!
16
17
  namespace :sequent do
17
18
  desc <<~EOS
18
- Rake task that runs before all sequent rake tasks. Hook applications can use to for instance run other rake tasks.
19
+ Set the SEQUENT_ENV to RAILS_ENV or RACK_ENV if not already set
19
20
  EOS
20
- task :init
21
+ task :set_env_var do
22
+ ENV['SEQUENT_ENV'] ||= ENV['RAILS_ENV'] || ENV['RACK_ENV']
23
+ end
24
+
25
+ desc <<~EOS
26
+ Rake task that runs before all sequent rake tasks and after the environment is set.
27
+ Hook applications can use to for instance run other rake tasks:
28
+
29
+ Rake::Task['sequent:init'].enhance(['my_task'])
30
+
31
+ EOS
32
+ task init: :set_env_var
21
33
 
22
34
  namespace :db do
23
35
  desc 'Creates the database and initializes the event_store schema for the current env'
24
36
  task create: ['sequent:init'] do
25
- ensure_rack_env_set!
37
+ ensure_sequent_env_set!
26
38
 
27
39
  db_config = Sequent::Support::Database.read_config(@env)
28
40
  Sequent::Support::Database.create!(db_config)
29
41
 
30
- create_event_store(db_config)
42
+ Sequent::Migrations::SequentSchema.create_sequent_schema_if_not_exists(env: @env, fail_if_exists: true)
31
43
  end
32
44
 
33
45
  desc 'Drops the database for the current env'
34
46
  task :drop, [:production] => ['sequent:init'] do |_t, args|
35
- ensure_rack_env_set!
47
+ ensure_sequent_env_set!
36
48
 
37
49
  if @env == 'production' && args[:production] != 'yes_drop_production'
38
50
  fail <<~OES
@@ -46,39 +58,30 @@ module Sequent
46
58
 
47
59
  desc 'Creates the view schema for the current env'
48
60
  task create_view_schema: ['sequent:init'] do
49
- ensure_rack_env_set!
61
+ ensure_sequent_env_set!
50
62
 
51
- db_config = Sequent::Support::Database.read_config(@env)
52
- Sequent::Support::Database.establish_connection(db_config)
53
- Sequent::Migrations::ViewSchema.new(db_config: db_config).create_view_schema_if_not_exists
63
+ Sequent::Migrations::ViewSchema.create_view_schema_if_not_exists(env: @env)
54
64
  end
55
65
 
56
66
  desc 'Creates the event_store schema for the current env'
57
67
  task create_event_store: ['sequent:init'] do
58
- ensure_rack_env_set!
59
- db_config = Sequent::Support::Database.read_config(@env)
60
- create_event_store(db_config)
68
+ ensure_sequent_env_set!
69
+ Sequent::Migrations::SequentSchema.create_sequent_schema_if_not_exists(env: @env, fail_if_exists: true)
61
70
  end
62
71
 
63
- # rubocop:disable Lint/NestedMethodDefinition
64
- def create_event_store(db_config)
65
- event_store_schema = Sequent.configuration.event_store_schema_name
66
- sequent_schema = File.join(Sequent.configuration.database_schema_directory, "#{event_store_schema}.rb")
67
- unless File.exist?(sequent_schema)
68
- fail "File #{sequent_schema} does not exist. Check your Sequent configuration."
69
- end
72
+ desc 'Utility tasks that can be used to guard against unsafe usage of rails db:migrate directly'
73
+ task :dont_use_db_migrate_directly do
74
+ fail <<~EOS unless ENV['SEQUENT_MIGRATION_SCHEMAS'].present?
75
+ Don't call rails db:migrate directly but wrap in your own task instead:
70
76
 
71
- Sequent::Support::Database.establish_connection(db_config)
72
- if Sequent::Support::Database.schema_exists?(event_store_schema)
73
- fail "Schema #{event_store_schema} already exists in the database"
74
- end
77
+ task :migrate_db do
78
+ ENV['SEQUENT_MIGRATION_SCHEMAS'] = 'public'
79
+ Rake::Task['db:migrate'].invoke
80
+ end
75
81
 
76
- Sequent::Support::Database.create_schema(event_store_schema)
77
- Sequent::Support::Database.with_schema_search_path(event_store_schema, db_config, @env) do
78
- load(sequent_schema)
79
- end
82
+ You can choose whatever name for migrate_db you like.
83
+ EOS
80
84
  end
81
- # rubocop:enable Lint/NestedMethodDefinition
82
85
  end
83
86
 
84
87
  namespace :migrate do
@@ -89,7 +92,7 @@ module Sequent
89
92
 
90
93
  desc 'Prints the current version in the database'
91
94
  task current_version: ['sequent:init', :init] do
92
- ensure_rack_env_set!
95
+ ensure_sequent_env_set!
93
96
 
94
97
  Sequent::Support::Database.connect!(@env)
95
98
 
@@ -100,7 +103,7 @@ module Sequent
100
103
  Migrates the Projectors while the app is running. Call +sequent:migrate:offline+ after this successfully completed.
101
104
  EOS
102
105
  task online: ['sequent:init', :init] do
103
- ensure_rack_env_set!
106
+ ensure_sequent_env_set!
104
107
 
105
108
  db_config = Sequent::Support::Database.read_config(@env)
106
109
  view_schema = Sequent::Migrations::ViewSchema.new(db_config: db_config)
@@ -112,7 +115,7 @@ module Sequent
112
115
  Migrates the events inserted while +online+ was running. It is expected +sequent:migrate:online+ ran first.
113
116
  EOS
114
117
  task offline: ['sequent:init', :init] do
115
- ensure_rack_env_set!
118
+ ensure_sequent_env_set!
116
119
 
117
120
  db_config = Sequent::Support::Database.read_config(@env)
118
121
  view_schema = Sequent::Migrations::ViewSchema.new(db_config: db_config)
@@ -160,8 +163,8 @@ module Sequent
160
163
  private
161
164
 
162
165
  # rubocop:disable Naming/MemoizedInstanceVariableName
163
- def ensure_rack_env_set!
164
- @env ||= ENV['RACK_ENV'] || fail('RACK_ENV not set')
166
+ def ensure_sequent_env_set!
167
+ @env ||= ENV['SEQUENT_ENV'] || fail('SEQUENT_ENV not set')
165
168
  end
166
169
  # rubocop:enable Naming/MemoizedInstanceVariableName
167
170
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'erb'
3
4
  require 'active_support/hash_with_indifferent_access'
4
5
 
5
6
  module Sequent
@@ -30,17 +31,37 @@ module Sequent
30
31
  end
31
32
 
32
33
  def self.create!(db_config)
33
- ActiveRecord::Base.establish_connection(db_config.merge(database: 'postgres'))
34
- ActiveRecord::Base.connection.create_database(db_config[:database])
34
+ establish_connection(db_config, {database: 'postgres'})
35
+ ActiveRecord::Base.connection.create_database(get_db_config_attribute(db_config, :database))
35
36
  end
36
37
 
37
38
  def self.drop!(db_config)
38
- ActiveRecord::Base.establish_connection(db_config.merge(database: 'postgres'))
39
- ActiveRecord::Base.connection.drop_database(db_config[:database])
39
+ establish_connection(db_config, {database: 'postgres'})
40
+ ActiveRecord::Base.connection.drop_database(get_db_config_attribute(db_config, :database))
40
41
  end
41
42
 
42
- def self.establish_connection(db_config)
43
- ActiveRecord::Base.establish_connection(db_config)
43
+ def self.get_db_config_attribute(db_config, attribute)
44
+ if Sequent.configuration.can_use_multiple_databases?
45
+ db_config[Sequent.configuration.primary_database_key][attribute]
46
+ else
47
+ db_config[attribute]
48
+ end
49
+ end
50
+
51
+ def self.establish_connection(db_config, db_config_overrides = {})
52
+ if Sequent.configuration.can_use_multiple_databases?
53
+ db_config = db_config.deep_merge(
54
+ Sequent.configuration.primary_database_key => db_config_overrides,
55
+ ).stringify_keys
56
+ ActiveRecord.legacy_connection_handling = false
57
+ ActiveRecord::Base.configurations = db_config.stringify_keys
58
+ ActiveRecord::Base.connects_to database: {
59
+ Sequent.configuration.primary_database_role => Sequent.configuration.primary_database_key,
60
+ }
61
+ else
62
+ db_config = db_config.merge(db_config_overrides)
63
+ ActiveRecord::Base.establish_connection(db_config)
64
+ end
44
65
  end
45
66
 
46
67
  def self.disconnect!
@@ -62,25 +83,20 @@ module Sequent
62
83
  execute_sql "DROP SCHEMA if exists #{schema_name} cascade"
63
84
  end
64
85
 
65
- def self.with_schema_search_path(search_path, db_config, env = ENV['RACK_ENV'])
86
+ def self.with_schema_search_path(search_path, db_config, env = ENV['SEQUENT_ENV'])
66
87
  fail ArgumentError, 'env is required' unless env
67
88
 
68
89
  disconnect!
69
- original_search_paths = db_config[:schema_search_path].dup
70
90
 
71
91
  if ActiveRecord::VERSION::MAJOR < 6
72
92
  ActiveRecord::Base.configurations[env.to_s] =
73
93
  ActiveSupport::HashWithIndifferentAccess.new(db_config).stringify_keys
74
94
  end
75
95
 
76
- db_config[:schema_search_path] = search_path
77
-
78
- ActiveRecord::Base.establish_connection db_config
79
-
96
+ establish_connection(db_config, {schema_search_path: search_path})
80
97
  yield
81
98
  ensure
82
99
  disconnect!
83
- db_config[:schema_search_path] = original_search_paths
84
100
  establish_connection(db_config)
85
101
  end
86
102
 
@@ -125,7 +125,7 @@ module Sequent
125
125
  def aggregate_type_for_event(event)
126
126
  @event_to_aggregate_type ||= ThreadSafe::Cache.new
127
127
  @event_to_aggregate_type.fetch_or_store(event.class) do |klass|
128
- Sequent::Core::AggregateRoots.all.find { |x| x.message_mapping.key?(klass) }
128
+ Sequent::Core::AggregateRoot.descendants.find { |x| x.message_mapping.key?(klass) }
129
129
  end
130
130
  end
131
131
 
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sequent
4
+ module Test
5
+ module DatabaseHelpers
6
+ ALLOWED_ENVS = %w[development test spec].freeze
7
+
8
+ class << self
9
+ # Utility method to let Sequent handle creation of sequent_schema and view_schema
10
+ # rather than using the available rake tasks.
11
+ def maintain_test_database_schema(env: 'test')
12
+ fail ArgumentError, "env must one of [#{ALLOWED_ENVS.join(',')}] '#{env}'" unless ALLOWED_ENVS.include?(env)
13
+
14
+ Migrations::SequentSchema.create_sequent_schema_if_not_exists(env: env, fail_if_exists: false)
15
+ Migrations::ViewSchema.create_view_tables(env: env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -17,11 +17,8 @@ module Sequent
17
17
  # omit nsec in datetime comparisons
18
18
  def <=>(other)
19
19
  if other&.is_a?(DateTimePatches::Normalize)
20
- result = normalize.iso8601 <=> other.normalize.iso8601
21
- return result unless result == 0
22
-
23
- # use usec here, which *truncates* the nsec (ie. like Postgres)
24
- return normalize.usec <=> other.normalize.usec
20
+ precision = Sequent.configuration.time_precision
21
+ return normalize.iso8601(precision) <=> other.normalize.iso8601(precision)
25
22
  end
26
23
  public_send(:'___<=>', other)
27
24
  end
@@ -5,7 +5,7 @@ module Sequent
5
5
  ##
6
6
  # Use in tests
7
7
  #
8
- # This provides a nice DSL for testing your event handlers.
8
+ # This provides a nice DSL for testing your Workflows.
9
9
  # E.g.
10
10
  #
11
11
  # when_event UserWasRegistered.new(args)
@@ -14,12 +14,15 @@ module Sequent
14
14
  # Example for Rspec config
15
15
  #
16
16
  # RSpec.configure do |config|
17
- # config.include Sequent::Test::WorkflowHelpers
17
+ # config.include Sequent::Test::WorkflowHelpers, workflows: true
18
18
  # end
19
19
  #
20
- # Then in a spec
20
+ # Please note that you **must** add the metadata tag `workflows` since
21
+ # the WorkflowHelpers will use a `FakeCommandService` to track
22
+ # the commands enqueued for execution. You can set the metadata
23
+ # on group level or on an individual spec.
21
24
  #
22
- # describe SendWelcomeMailWorkflow do
25
+ # describe SendWelcomeMailWorkflow, workflows: true do
23
26
  # let(:workflow) { SendWelcomeMailWorkflow.new }
24
27
  #
25
28
  # it "sends a welcome mail" do
@@ -75,7 +78,9 @@ module Sequent
75
78
  end
76
79
 
77
80
  def when_event(event)
78
- workflow.handle_message event
81
+ fake_transaction_provider.transactional do
82
+ workflow.handle_message event
83
+ end
79
84
  end
80
85
 
81
86
  def then_commands(*commands)
@@ -86,13 +91,22 @@ module Sequent
86
91
  end
87
92
 
88
93
  def self.included(spec)
94
+ fail "Missing metadata argument `workflows: true` when including #{name}" unless spec.metadata[:workflows]
95
+
89
96
  spec.let(:fake_command_service) { FakeCommandService.new }
90
97
  spec.let(:fake_transaction_provider) { FakeTransactionProvider.new }
91
- spec.before do
92
- Sequent.configure do |c|
93
- c.command_service = fake_command_service
94
- c.transaction_provider = fake_transaction_provider
95
- end
98
+ spec.let(:old_config) { Sequent.configuration }
99
+ spec.before :each, :workflows do
100
+ new_config = old_config.dup
101
+
102
+ new_config.command_service = fake_command_service
103
+ new_config.transaction_provider = fake_transaction_provider
104
+
105
+ Sequent::Configuration.restore(new_config)
106
+ end
107
+
108
+ spec.after :each, :workflows do
109
+ Sequent::Configuration.restore(old_config)
96
110
  end
97
111
  end
98
112
  end
data/lib/sequent/test.rb CHANGED
@@ -3,4 +3,5 @@
3
3
  require_relative 'sequent'
4
4
  require_relative 'test/command_handler_helpers'
5
5
  require_relative 'test/event_stream_helpers'
6
- require_relative 'test/event_handler_helpers'
6
+ require_relative 'test/workflow_helpers'
7
+ require_relative 'test/database_helpers'
@@ -66,7 +66,7 @@ module Sequent
66
66
  end
67
67
 
68
68
  def process_event(event)
69
- [*Sequent::Core::Workflows.all, *Sequent::Core::Projectors.all].each do |handler_class|
69
+ [*Sequent::Core::Workflow.descendants, *Sequent::Core::Projector.descendants].each do |handler_class|
70
70
  next unless handler_class.handles_message?(event)
71
71
 
72
72
  if handler_class < Sequent::Workflow
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sequent
4
- VERSION = '5.0.0'
4
+ VERSION = '6.0.1'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequent
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 6.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Vonk
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2022-06-16 00:00:00.000000000 Z
15
+ date: 2023-09-28 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activemodel
@@ -119,7 +119,7 @@ dependencies:
119
119
  version: 2.6.5
120
120
  - - "<"
121
121
  - !ruby/object:Gem::Version
122
- version: '3.2'
122
+ version: '3.3'
123
123
  type: :runtime
124
124
  prerelease: false
125
125
  version_requirements: !ruby/object:Gem::Requirement
@@ -129,7 +129,7 @@ dependencies:
129
129
  version: 2.6.5
130
130
  - - "<"
131
131
  - !ruby/object:Gem::Version
132
- version: '3.2'
132
+ version: '3.3'
133
133
  - !ruby/object:Gem::Dependency
134
134
  name: pg
135
135
  requirement: !ruby/object:Gem::Requirement
@@ -260,16 +260,22 @@ dependencies:
260
260
  name: rubocop
261
261
  requirement: !ruby/object:Gem::Requirement
262
262
  requirements:
263
- - - "<"
263
+ - - "~>"
264
+ - !ruby/object:Gem::Version
265
+ version: '1.56'
266
+ - - ">="
264
267
  - !ruby/object:Gem::Version
265
- version: '1.21'
268
+ version: 1.56.3
266
269
  type: :development
267
270
  prerelease: false
268
271
  version_requirements: !ruby/object:Gem::Requirement
269
272
  requirements:
270
- - - "<"
273
+ - - "~>"
274
+ - !ruby/object:Gem::Version
275
+ version: '1.56'
276
+ - - ">="
271
277
  - !ruby/object:Gem::Version
272
- version: '1.21'
278
+ version: 1.56.3
273
279
  - !ruby/object:Gem::Dependency
274
280
  name: simplecov
275
281
  requirement: !ruby/object:Gem::Requirement
@@ -304,7 +310,7 @@ email:
304
310
  - bforma@zilverline.com
305
311
  - erozendaal@zilverline.com
306
312
  - mvdiepen@zilverline.com
307
- - svdiepen@zilverline.com
313
+ - stephan@vandiepen.info
308
314
  executables:
309
315
  - sequent
310
316
  extensions: []
@@ -370,9 +376,12 @@ files:
370
376
  - lib/sequent/core/helpers/string_support.rb
371
377
  - lib/sequent/core/helpers/string_to_value_parsers.rb
372
378
  - lib/sequent/core/helpers/string_validator.rb
379
+ - lib/sequent/core/helpers/time_validator.rb
373
380
  - lib/sequent/core/helpers/type_conversion_support.rb
374
381
  - lib/sequent/core/helpers/uuid_helper.rb
375
382
  - lib/sequent/core/helpers/value_validators.rb
383
+ - lib/sequent/core/middleware/chain.rb
384
+ - lib/sequent/core/middleware/middleware.rb
376
385
  - lib/sequent/core/persistors/active_record_persistor.rb
377
386
  - lib/sequent/core/persistors/persistor.rb
378
387
  - lib/sequent/core/persistors/persistors.rb
@@ -425,10 +434,10 @@ files:
425
434
  - lib/sequent/migrations/migrations.rb
426
435
  - lib/sequent/migrations/planner.rb
427
436
  - lib/sequent/migrations/projectors.rb
437
+ - lib/sequent/migrations/sequent_schema.rb
428
438
  - lib/sequent/migrations/sql.rb
429
439
  - lib/sequent/migrations/view_schema.rb
430
440
  - lib/sequent/rake/migration_tasks.rb
431
- - lib/sequent/rake/tasks.rb
432
441
  - lib/sequent/sequent.rb
433
442
  - lib/sequent/support.rb
434
443
  - lib/sequent/support/database.rb
@@ -436,9 +445,10 @@ files:
436
445
  - lib/sequent/support/view_schema.rb
437
446
  - lib/sequent/test.rb
438
447
  - lib/sequent/test/command_handler_helpers.rb
439
- - lib/sequent/test/event_handler_helpers.rb
448
+ - lib/sequent/test/database_helpers.rb
440
449
  - lib/sequent/test/event_stream_helpers.rb
441
450
  - lib/sequent/test/time_comparison.rb
451
+ - lib/sequent/test/workflow_helpers.rb
442
452
  - lib/sequent/util/dry_run.rb
443
453
  - lib/sequent/util/printer.rb
444
454
  - lib/sequent/util/skip_if_already_processing.rb
@@ -464,7 +474,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
464
474
  - !ruby/object:Gem::Version
465
475
  version: '0'
466
476
  requirements: []
467
- rubygems_version: 3.3.7
477
+ rubygems_version: 3.4.10
468
478
  signing_key:
469
479
  specification_version: 4
470
480
  summary: Event sourcing framework for Ruby