sequent 5.0.0 → 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
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