sequent 3.2.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/lib/notices.rb +4 -0
  3. data/lib/sequent.rb +3 -0
  4. data/lib/sequent/application_record.rb +7 -0
  5. data/lib/sequent/configuration.rb +13 -0
  6. data/lib/sequent/core/aggregate_repository.rb +7 -1
  7. data/lib/sequent/core/command.rb +13 -2
  8. data/lib/sequent/core/command_record.rb +5 -2
  9. data/lib/sequent/core/command_service.rb +28 -12
  10. data/lib/sequent/core/event_publisher.rb +4 -0
  11. data/lib/sequent/core/event_record.rb +2 -1
  12. data/lib/sequent/core/event_store.rb +23 -4
  13. data/lib/sequent/core/helpers/attribute_support.rb +28 -7
  14. data/lib/sequent/core/helpers/mergable.rb +1 -0
  15. data/lib/sequent/core/persistors/active_record_persistor.rb +1 -1
  16. data/lib/sequent/core/persistors/replay_optimized_postgres_persistor.rb +2 -2
  17. data/lib/sequent/core/projector.rb +23 -1
  18. data/lib/sequent/core/stream_record.rb +1 -1
  19. data/lib/sequent/core/transactions/active_record_transaction_provider.rb +6 -4
  20. data/lib/sequent/generator.rb +1 -4
  21. data/lib/sequent/generator/generator.rb +4 -0
  22. data/lib/sequent/generator/project.rb +1 -1
  23. data/lib/sequent/generator/template_project/Gemfile +1 -1
  24. data/lib/sequent/generator/template_project/app/records/post_record.rb +1 -1
  25. data/lib/sequent/generator/template_project/spec/app/projectors/post_projector_spec.rb +1 -1
  26. data/lib/sequent/generator/template_project/spec/lib/post/post_command_handler_spec.rb +1 -1
  27. data/lib/sequent/migrations/executor.rb +78 -0
  28. data/lib/sequent/migrations/functions.rb +76 -0
  29. data/lib/sequent/migrations/migrations.rb +1 -0
  30. data/lib/sequent/migrations/planner.rb +118 -0
  31. data/lib/sequent/migrations/projectors.rb +6 -5
  32. data/lib/sequent/migrations/sql.rb +17 -0
  33. data/lib/sequent/migrations/view_schema.rb +74 -73
  34. data/lib/sequent/rake/migration_tasks.rb +2 -2
  35. data/lib/sequent/rake/tasks.rb +1 -1
  36. data/lib/sequent/sequent.rb +5 -1
  37. data/lib/sequent/support/database.rb +11 -6
  38. data/lib/sequent/test/command_handler_helpers.rb +4 -0
  39. data/lib/sequent/util/dry_run.rb +191 -0
  40. data/lib/sequent/util/skip_if_already_processing.rb +19 -5
  41. data/lib/sequent/util/util.rb +1 -0
  42. data/lib/version.rb +1 -1
  43. metadata +77 -36
@@ -55,7 +55,7 @@ module Sequent
55
55
 
56
56
  def create_event_store(db_config)
57
57
  event_store_schema = Sequent.configuration.event_store_schema_name
58
- sequent_schema = File.join(Sequent.configuration.database_config_directory, "#{event_store_schema}.rb")
58
+ sequent_schema = File.join(Sequent.configuration.database_schema_directory, "#{event_store_schema}.rb")
59
59
  fail "File #{sequent_schema} does not exist. Check your Sequent configuration." unless File.exists?(sequent_schema)
60
60
 
61
61
  Sequent::Support::Database.establish_connection(db_config)
@@ -117,7 +117,7 @@ module Sequent
117
117
  end
118
118
 
119
119
  task :delete_all => ['sequent:init', :init] do
120
- result = ActiveRecord::Base.connection.execute("DELETE FROM #{Sequent.configuration.event_record_class.table_name} WHERE event_type = 'Sequent::Core::SnapshotEvent'")
120
+ result = Sequent::ApplicationRecord.connection.execute("DELETE FROM #{Sequent.configuration.event_record_class.table_name} WHERE event_type = 'Sequent::Core::SnapshotEvent'")
121
121
  Sequent.logger.info "Deleted #{result.cmd_tuples} aggregate snapshots from the event store"
122
122
  end
123
123
  end
@@ -57,7 +57,7 @@ module Sequent
57
57
 
58
58
  task :establish_connection do
59
59
  env_db = db_config(options.fetch(:environment))
60
- Sequent::Support::Database.establish_connection(env_db)
60
+ ActiveRecord::Base.establish_connection(env_db)
61
61
  end
62
62
 
63
63
  desc 'Migrate the database'
@@ -6,7 +6,7 @@ require_relative 'core/aggregate_root'
6
6
  require_relative 'core/projector'
7
7
  require_relative 'core/workflow'
8
8
  require_relative 'core/value_object'
9
- require_relative 'generator'
9
+ require_relative 'migrations/migrations'
10
10
 
11
11
  module Sequent
12
12
  def self.new_uuid
@@ -64,6 +64,10 @@ module Sequent
64
64
  configuration.aggregate_repository
65
65
  end
66
66
 
67
+ def self.dry_run(*commands)
68
+ Sequent::Util::DryRun.these_commands(commands)
69
+ end
70
+
67
71
  # Shortcut classes for easy usage
68
72
  Event = Sequent::Core::Event
69
73
  Command = Sequent::Core::Command
@@ -47,7 +47,7 @@ module Sequent
47
47
  def self.create_schema(schema)
48
48
  sql = "CREATE SCHEMA IF NOT EXISTS #{schema}"
49
49
  if user = ActiveRecord::Base.connection_config[:username]
50
- sql += " AUTHORIZATION #{user}"
50
+ sql += %Q{ AUTHORIZATION "#{user}"}
51
51
  end
52
52
  execute_sql(sql)
53
53
  end
@@ -61,12 +61,16 @@ module Sequent
61
61
 
62
62
  disconnect!
63
63
  original_search_paths = db_config['schema_search_path'].dup
64
- ActiveRecord::Base.configurations[env.to_s] = ActiveSupport::HashWithIndifferentAccess.new(db_config).stringify_keys
64
+
65
+ if ActiveRecord::VERSION::MAJOR < 6
66
+ ActiveRecord::Base.configurations[env.to_s] = ActiveSupport::HashWithIndifferentAccess.new(db_config).stringify_keys
67
+ end
68
+
65
69
  db_config['schema_search_path'] = search_path
70
+
66
71
  ActiveRecord::Base.establish_connection db_config
67
72
 
68
73
  yield
69
-
70
74
  ensure
71
75
  disconnect!
72
76
  db_config['schema_search_path'] = original_search_paths
@@ -95,14 +99,15 @@ module Sequent
95
99
  self.class.execute_sql(sql)
96
100
  end
97
101
 
98
- def migrate(migrations_path, verbose: true)
102
+ def migrate(migrations_path, schema_migration: ActiveRecord::SchemaMigration, verbose: true)
99
103
  ActiveRecord::Migration.verbose = verbose
100
- if ActiveRecord::VERSION::MAJOR >= 5 && ActiveRecord::VERSION::MINOR >= 2
104
+ if ActiveRecord::VERSION::MAJOR >= 6
105
+ ActiveRecord::MigrationContext.new([migrations_path], schema_migration).up
106
+ elsif ActiveRecord::VERSION::MAJOR >= 5 && ActiveRecord::VERSION::MINOR >= 2
101
107
  ActiveRecord::MigrationContext.new([migrations_path]).up
102
108
  else
103
109
  ActiveRecord::Migrator.migrate(migrations_path)
104
110
  end
105
-
106
111
  end
107
112
  end
108
113
  end
@@ -92,6 +92,10 @@ module Sequent
92
92
  @event_streams.has_key?(aggregate_id)
93
93
  end
94
94
 
95
+ def events_exists?(aggregate_id)
96
+ @event_streams[aggregate_id].present?
97
+ end
98
+
95
99
  private
96
100
 
97
101
  def to_event_streams(events)
@@ -0,0 +1,191 @@
1
+ require_relative '../test/command_handler_helpers'
2
+
3
+ module Sequent
4
+ module Util
5
+ ##
6
+ # Dry run provides the ability to inspect what would
7
+ # happen if the given commands would be executed
8
+ # without actually committing the results.
9
+ # You can inspect which commands are executed
10
+ # and what the resulting events would be
11
+ # with theSequent::Projector's and Sequent::Workflow's
12
+ # that would be invoked (without actually invoking them).
13
+ #
14
+ # Since the Workflow's are not actually invoked new commands
15
+ # resulting from this Workflow will of course not be in the result.
16
+ #
17
+ # Caution: Since the Sequent Configuration is shared between threads this method
18
+ # is not Thread safe.
19
+ #
20
+ # Example usage:
21
+ #
22
+ # result = Sequent.dry_run(create_foo_command, ping_foo_command)
23
+ #
24
+ # result.print(STDOUT)
25
+ #
26
+ module DryRun
27
+ EventInvokedHandler = Struct.new(:event, :handler)
28
+
29
+ ##
30
+ # Proxies the given EventStore implements commit_events
31
+ # that instead of publish and store just publishes the events.
32
+ class EventStoreProxy
33
+ attr_reader :command_with_events, :event_store
34
+
35
+ delegate :load_events_for_aggregates,
36
+ :load_events,
37
+ :publish_events,
38
+ :stream_exists?,
39
+ to: :event_store
40
+
41
+ def initialize(result)
42
+ @event_store = Sequent::Test::CommandHandlerHelpers::FakeEventStore.new
43
+ @command_with_events = {}
44
+ @result = result
45
+ end
46
+
47
+ def commit_events(command, streams_with_events)
48
+ event_store.commit_events(command, streams_with_events)
49
+
50
+ new_events = streams_with_events.flat_map { |_, events| events }
51
+ @result.published_command_with_events(command, new_events)
52
+ end
53
+ end
54
+
55
+ ##
56
+ # Records which Projector's and Workflow's are executed
57
+ #
58
+ class RecordingEventPublisher < Sequent::Core::EventPublisher
59
+ attr_reader :projectors, :workflows
60
+
61
+ def initialize(result)
62
+ @result = result
63
+ end
64
+
65
+ def process_event(event)
66
+ Sequent.configuration.event_handlers.each do |handler|
67
+ next unless handler.class.handles_message?(event)
68
+
69
+ if handler.is_a?(Sequent::Workflow)
70
+ @result.invoked_workflow(EventInvokedHandler.new(event, handler.class))
71
+ elsif handler.is_a?(Sequent::Projector)
72
+ @result.invoked_projector(EventInvokedHandler.new(event, handler.class))
73
+ else
74
+ fail "Unrecognized event_handler #{handler.class} called for event #{event.class}"
75
+ end
76
+ rescue
77
+ raise PublishEventError.new(handler.class, event)
78
+ end
79
+ end
80
+ end
81
+
82
+ ##
83
+ # Contains the result of a dry run.
84
+ #
85
+ # @see #tree
86
+ # @see #print
87
+ #
88
+ class Result
89
+ EventCalledHandlers = Struct.new(:event, :projectors, :workflows)
90
+
91
+ def initialize
92
+ @command_with_events = {}
93
+ @event_invoked_projectors = []
94
+ @event_invoked_workflows = []
95
+ end
96
+
97
+ def invoked_projector(event_invoked_handler)
98
+ event_invoked_projectors << event_invoked_handler
99
+ end
100
+
101
+ def invoked_workflow(event_invoked_handler)
102
+ event_invoked_workflows << event_invoked_handler
103
+ end
104
+
105
+ def published_command_with_events(command, events)
106
+ command_with_events[command] = events
107
+ end
108
+
109
+ ##
110
+ # Returns the command with events as a tree structure.
111
+ #
112
+ # {
113
+ # command => [
114
+ # EventCalledHandlers,
115
+ # EventCalledHandlers,
116
+ # EventCalledHandlers,
117
+ # ]
118
+ # }
119
+ #
120
+ # The EventCalledHandlers contains an Event with the
121
+ # lists of `Sequent::Projector`s and `Sequent::Workflow`s
122
+ # that were called.
123
+ #
124
+ def tree
125
+ command_with_events.reduce({}) do |memo, (command, events)|
126
+ events_to_handlers = events.map do |event|
127
+ for_current_event = ->(pair) { pair.event == event }
128
+ EventCalledHandlers.new(
129
+ event,
130
+ event_invoked_projectors.select(&for_current_event).map(&:handler),
131
+ event_invoked_workflows.select(&for_current_event).map(&:handler),
132
+ )
133
+ end
134
+ memo[command] = events_to_handlers
135
+ memo
136
+ end
137
+ end
138
+
139
+ ##
140
+ # Prints the output from #tree to the given `io`
141
+ #
142
+ def print(io)
143
+ tree.each_with_index do |(command, event_called_handlerss), index|
144
+ io.puts "+++++++++++++++++++++++++++++++++++" if index == 0
145
+ io.puts "Command: #{command.class} resulted in #{event_called_handlerss.length} events"
146
+ event_called_handlerss.each_with_index do |event_called_handlers, i|
147
+ io.puts "" if i > 0
148
+ io.puts "-- Event #{event_called_handlers.event.class} was handled by:"
149
+ io.puts "-- Projectors: [#{event_called_handlers.projectors.join(', ')}]"
150
+ io.puts "-- Workflows: [#{event_called_handlers.workflows.join(', ')}]"
151
+ end
152
+
153
+ io.puts "+++++++++++++++++++++++++++++++++++"
154
+ end
155
+ end
156
+
157
+ private
158
+
159
+ attr_reader :command_with_events, :event_invoked_projectors, :event_invoked_workflows
160
+ end
161
+
162
+ ##
163
+ # Main method of the DryRun.
164
+ #
165
+ # Caution: Since the Sequent Configuration is changed and is shared between threads this method
166
+ # is not Thread safe.
167
+ #
168
+ # After invocation the sequent configuration is reset to the state it was before
169
+ # invoking this method.
170
+ #
171
+ # @param commands - the commands to dry run
172
+ # @return Result - the Result of the dry run. See Result.
173
+ #
174
+ def self.these_commands(commands)
175
+ current_event_store = Sequent.configuration.event_store
176
+ current_event_publisher = Sequent.configuration.event_publisher
177
+ result = Result.new
178
+
179
+ Sequent.configuration.event_store = EventStoreProxy.new(result)
180
+ Sequent.configuration.event_publisher = RecordingEventPublisher.new(result)
181
+
182
+ Sequent.command_service.execute_commands(*commands)
183
+
184
+ result
185
+ ensure
186
+ Sequent.configuration.event_store = current_event_store
187
+ Sequent.configuration.event_publisher = current_event_publisher
188
+ end
189
+ end
190
+ end
191
+ end
@@ -1,15 +1,29 @@
1
1
  module Sequent
2
2
  module Util
3
- def self.skip_if_already_processing(already_processing_key, &block)
4
- return if Thread.current[already_processing_key]
3
+ ##
4
+ # Returns if the current Thread is already processing work
5
+ # given the +processing_key+ otherwise
6
+ # it yields the given +&block+.
7
+ #
8
+ # Useful in a Queue and Processing strategy
9
+ def self.skip_if_already_processing(processing_key, &block)
10
+ return if Thread.current[processing_key]
5
11
 
6
12
  begin
7
- Thread.current[already_processing_key] = true
13
+ Thread.current[processing_key] = true
8
14
 
9
- block.yield
15
+ yield
10
16
  ensure
11
- Thread.current[already_processing_key] = nil
17
+ Thread.current[processing_key] = nil
12
18
  end
13
19
  end
20
+
21
+ ##
22
+ # Reset the given +processing_key+ for the current Thread.
23
+ #
24
+ # Usefull to make a block protected by +skip_if_already_processing+ reentrant.
25
+ def self.done_processing(processing_key)
26
+ Thread.current[processing_key] = nil
27
+ end
14
28
  end
15
29
  end
@@ -1,3 +1,4 @@
1
1
  require_relative 'skip_if_already_processing'
2
2
  require_relative 'timer'
3
3
  require_relative 'printer'
4
+ require_relative 'dry_run'
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sequent
2
- VERSION = '3.2.2'
2
+ VERSION = '4.0.0'
3
3
  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: 3.2.2
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lars Vonk
@@ -9,10 +9,10 @@ authors:
9
9
  - Erik Rozendaal
10
10
  - Mike van Diepen
11
11
  - Stephan van Diepen
12
- autorequire:
12
+ autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2019-06-04 00:00:00.000000000 Z
15
+ date: 2021-02-24 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: activerecord
@@ -23,7 +23,7 @@ dependencies:
23
23
  version: '5.0'
24
24
  - - "<"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.3'
26
+ version: 6.0.4
27
27
  type: :runtime
28
28
  prerelease: false
29
29
  version_requirements: !ruby/object:Gem::Requirement
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: '5.0'
34
34
  - - "<"
35
35
  - !ruby/object:Gem::Version
36
- version: '5.3'
36
+ version: 6.0.4
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: activemodel
39
39
  requirement: !ruby/object:Gem::Requirement
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '5.0'
44
44
  - - "<"
45
45
  - !ruby/object:Gem::Version
46
- version: '5.3'
46
+ version: 6.0.4
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
@@ -53,21 +53,21 @@ dependencies:
53
53
  version: '5.0'
54
54
  - - "<"
55
55
  - !ruby/object:Gem::Version
56
- version: '5.3'
56
+ version: 6.0.4
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: pg
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
- version: '1.0'
63
+ version: '1.2'
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - "~>"
69
69
  - !ruby/object:Gem::Version
70
- version: '1.0'
70
+ version: '1.2'
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: postgresql_cursor
73
73
  requirement: !ruby/object:Gem::Requirement
@@ -88,42 +88,42 @@ dependencies:
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: '3.0'
91
+ version: '3'
92
92
  type: :runtime
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
- version: '3.0'
98
+ version: '3'
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: thread_safe
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: 0.3.5
105
+ version: 0.3.6
106
106
  type: :runtime
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - "~>"
111
111
  - !ruby/object:Gem::Version
112
- version: 0.3.5
112
+ version: 0.3.6
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: parallel
115
115
  requirement: !ruby/object:Gem::Requirement
116
116
  requirements:
117
117
  - - "~>"
118
118
  - !ruby/object:Gem::Version
119
- version: 1.12.1
119
+ version: '1.20'
120
120
  type: :runtime
121
121
  prerelease: false
122
122
  version_requirements: !ruby/object:Gem::Requirement
123
123
  requirements:
124
124
  - - "~>"
125
125
  - !ruby/object:Gem::Version
126
- version: 1.12.1
126
+ version: '1.20'
127
127
  - !ruby/object:Gem::Dependency
128
128
  name: bcrypt
129
129
  requirement: !ruby/object:Gem::Requirement
@@ -142,30 +142,64 @@ dependencies:
142
142
  name: parser
143
143
  requirement: !ruby/object:Gem::Requirement
144
144
  requirements:
145
- - - "~>"
145
+ - - ">="
146
146
  - !ruby/object:Gem::Version
147
- version: '2.5'
147
+ version: 2.6.5
148
+ - - "<="
149
+ - !ruby/object:Gem::Version
150
+ version: '3'
148
151
  type: :runtime
149
152
  prerelease: false
150
153
  version_requirements: !ruby/object:Gem::Requirement
151
154
  requirements:
152
- - - "~>"
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: 2.6.5
158
+ - - "<="
153
159
  - !ruby/object:Gem::Version
154
- version: '2.5'
160
+ version: '3'
161
+ - !ruby/object:Gem::Dependency
162
+ name: i18n
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ type: :runtime
169
+ prerelease: false
170
+ version_requirements: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ - !ruby/object:Gem::Dependency
176
+ name: tzinfo
177
+ requirement: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "<="
180
+ - !ruby/object:Gem::Version
181
+ version: 1.2.7
182
+ type: :runtime
183
+ prerelease: false
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "<="
187
+ - !ruby/object:Gem::Version
188
+ version: 1.2.7
155
189
  - !ruby/object:Gem::Dependency
156
190
  name: rspec
157
191
  requirement: !ruby/object:Gem::Requirement
158
192
  requirements:
159
193
  - - "~>"
160
194
  - !ruby/object:Gem::Version
161
- version: '3.2'
195
+ version: '3.10'
162
196
  type: :development
163
197
  prerelease: false
164
198
  version_requirements: !ruby/object:Gem::Requirement
165
199
  requirements:
166
200
  - - "~>"
167
201
  - !ruby/object:Gem::Version
168
- version: '3.2'
202
+ version: '3.10'
169
203
  - !ruby/object:Gem::Dependency
170
204
  name: timecop
171
205
  requirement: !ruby/object:Gem::Requirement
@@ -186,70 +220,70 @@ dependencies:
186
220
  requirements:
187
221
  - - "~>"
188
222
  - !ruby/object:Gem::Version
189
- version: '3.2'
223
+ version: '3.10'
190
224
  type: :development
191
225
  prerelease: false
192
226
  version_requirements: !ruby/object:Gem::Requirement
193
227
  requirements:
194
228
  - - "~>"
195
229
  - !ruby/object:Gem::Version
196
- version: '3.2'
230
+ version: '3.10'
197
231
  - !ruby/object:Gem::Dependency
198
232
  name: rspec-collection_matchers
199
233
  requirement: !ruby/object:Gem::Requirement
200
234
  requirements:
201
235
  - - "~>"
202
236
  - !ruby/object:Gem::Version
203
- version: '1.1'
237
+ version: '1.2'
204
238
  type: :development
205
239
  prerelease: false
206
240
  version_requirements: !ruby/object:Gem::Requirement
207
241
  requirements:
208
242
  - - "~>"
209
243
  - !ruby/object:Gem::Version
210
- version: '1.1'
244
+ version: '1.2'
211
245
  - !ruby/object:Gem::Dependency
212
246
  name: rake
213
247
  requirement: !ruby/object:Gem::Requirement
214
248
  requirements:
215
249
  - - "~>"
216
250
  - !ruby/object:Gem::Version
217
- version: '10.4'
251
+ version: '13'
218
252
  type: :development
219
253
  prerelease: false
220
254
  version_requirements: !ruby/object:Gem::Requirement
221
255
  requirements:
222
256
  - - "~>"
223
257
  - !ruby/object:Gem::Version
224
- version: '10.4'
258
+ version: '13'
225
259
  - !ruby/object:Gem::Dependency
226
260
  name: pry
227
261
  requirement: !ruby/object:Gem::Requirement
228
262
  requirements:
229
263
  - - "~>"
230
264
  - !ruby/object:Gem::Version
231
- version: '0.10'
265
+ version: '0.13'
232
266
  type: :development
233
267
  prerelease: false
234
268
  version_requirements: !ruby/object:Gem::Requirement
235
269
  requirements:
236
270
  - - "~>"
237
271
  - !ruby/object:Gem::Version
238
- version: '0.10'
272
+ version: '0.13'
239
273
  - !ruby/object:Gem::Dependency
240
274
  name: simplecov
241
275
  requirement: !ruby/object:Gem::Requirement
242
276
  requirements:
243
277
  - - "~>"
244
278
  - !ruby/object:Gem::Version
245
- version: 0.14.1
279
+ version: '0.21'
246
280
  type: :development
247
281
  prerelease: false
248
282
  version_requirements: !ruby/object:Gem::Requirement
249
283
  requirements:
250
284
  - - "~>"
251
285
  - !ruby/object:Gem::Version
252
- version: 0.14.1
286
+ version: '0.21'
253
287
  description: Sequent is a CQRS and event sourcing framework for Ruby.
254
288
  email:
255
289
  - lars.vonk@gmail.com
@@ -264,7 +298,9 @@ extra_rdoc_files: []
264
298
  files:
265
299
  - bin/sequent
266
300
  - db/sequent_schema.rb
301
+ - lib/notices.rb
267
302
  - lib/sequent.rb
303
+ - lib/sequent/application_record.rb
268
304
  - lib/sequent/configuration.rb
269
305
  - lib/sequent/core/aggregate_repository.rb
270
306
  - lib/sequent/core/aggregate_root.rb
@@ -318,6 +354,7 @@ files:
318
354
  - lib/sequent/generator/aggregate.rb
319
355
  - lib/sequent/generator/command.rb
320
356
  - lib/sequent/generator/event.rb
357
+ - lib/sequent/generator/generator.rb
321
358
  - lib/sequent/generator/project.rb
322
359
  - lib/sequent/generator/template_aggregate/template_aggregate.rb
323
360
  - lib/sequent/generator/template_aggregate/template_aggregate/commands.rb
@@ -344,9 +381,13 @@ files:
344
381
  - lib/sequent/generator/template_project/spec/app/projectors/post_projector_spec.rb
345
382
  - lib/sequent/generator/template_project/spec/lib/post/post_command_handler_spec.rb
346
383
  - lib/sequent/generator/template_project/spec/spec_helper.rb
384
+ - lib/sequent/migrations/executor.rb
385
+ - lib/sequent/migrations/functions.rb
347
386
  - lib/sequent/migrations/migrate_events.rb
348
387
  - lib/sequent/migrations/migrations.rb
388
+ - lib/sequent/migrations/planner.rb
349
389
  - lib/sequent/migrations/projectors.rb
390
+ - lib/sequent/migrations/sql.rb
350
391
  - lib/sequent/migrations/view_schema.rb
351
392
  - lib/sequent/rake/migration_tasks.rb
352
393
  - lib/sequent/rake/tasks.rb
@@ -360,6 +401,7 @@ files:
360
401
  - lib/sequent/test/event_handler_helpers.rb
361
402
  - lib/sequent/test/event_stream_helpers.rb
362
403
  - lib/sequent/test/time_comparison.rb
404
+ - lib/sequent/util/dry_run.rb
363
405
  - lib/sequent/util/printer.rb
364
406
  - lib/sequent/util/skip_if_already_processing.rb
365
407
  - lib/sequent/util/timer.rb
@@ -369,7 +411,7 @@ homepage: https://github.com/zilverline/sequent
369
411
  licenses:
370
412
  - MIT
371
413
  metadata: {}
372
- post_install_message:
414
+ post_install_message:
373
415
  rdoc_options: []
374
416
  require_paths:
375
417
  - lib
@@ -377,16 +419,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
377
419
  requirements:
378
420
  - - ">="
379
421
  - !ruby/object:Gem::Version
380
- version: '0'
422
+ version: '2.7'
381
423
  required_rubygems_version: !ruby/object:Gem::Requirement
382
424
  requirements:
383
425
  - - ">="
384
426
  - !ruby/object:Gem::Version
385
427
  version: '0'
386
428
  requirements: []
387
- rubyforge_project:
388
- rubygems_version: 2.7.6
389
- signing_key:
429
+ rubygems_version: 3.2.3
430
+ signing_key:
390
431
  specification_version: 4
391
432
  summary: Event sourcing framework for Ruby
392
433
  test_files: []