rails_event_store_active_record 1.3.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.mutant.yml +1 -0
- data/Gemfile +5 -10
- data/Gemfile.lock +245 -0
- data/Gemfile.rails_5_0 +13 -0
- data/Gemfile.rails_5_0.lock +217 -0
- data/Gemfile.rails_5_1 +13 -0
- data/Gemfile.rails_5_1.lock +217 -0
- data/Gemfile.rails_5_2 +13 -0
- data/Gemfile.rails_5_2.lock +225 -0
- data/Gemfile.rails_6_0 +13 -0
- data/Gemfile.rails_6_0.lock +241 -0
- data/Makefile +8 -15
- data/lib/rails_event_store_active_record/event.rb +1 -1
- data/lib/rails_event_store_active_record/event_repository.rb +45 -43
- data/lib/rails_event_store_active_record/event_repository_reader.rb +101 -37
- data/lib/rails_event_store_active_record/generators/{limit_for_event_id_generator.rb → add_valid_at_generator.rb} +2 -2
- data/lib/rails_event_store_active_record/generators/{index_by_event_type_generator.rb → created_at_precision_generator.rb} +2 -2
- data/lib/rails_event_store_active_record/generators/{binary_data_and_metadata_generator.rb → no_global_stream_entries_generator.rb} +2 -4
- data/lib/rails_event_store_active_record/generators/templates/add_valid_at_template.rb +14 -0
- data/lib/rails_event_store_active_record/generators/templates/create_event_store_events_template.rb +15 -9
- data/lib/rails_event_store_active_record/generators/templates/created_at_precision_template.rb +45 -0
- data/lib/rails_event_store_active_record/generators/templates/no_global_stream_entries_template.rb +59 -0
- data/lib/rails_event_store_active_record/index_violation_detector.rb +33 -18
- data/lib/rails_event_store_active_record/version.rb +1 -1
- data/lib/rails_event_store_active_record/with_abstract_base_class.rb +39 -0
- data/lib/rails_event_store_active_record/with_default_models.rb +9 -0
- data/lib/rails_event_store_active_record.rb +5 -3
- data/rails_event_store_active_record.gemspec +1 -3
- metadata +23 -13
- data/bin/console +0 -14
- data/bin/setup +0 -7
- data/lib/rails_event_store_active_record/generators/templates/binary_data_and_metadata_template.rb +0 -35
- data/lib/rails_event_store_active_record/generators/templates/index_by_event_type_template.rb +0 -7
- data/lib/rails_event_store_active_record/generators/templates/limit_for_event_id_template.rb +0 -8
@@ -2,28 +2,43 @@
|
|
2
2
|
|
3
3
|
module RailsEventStoreActiveRecord
|
4
4
|
class IndexViolationDetector
|
5
|
-
MYSQL5_PKEY_ERROR = "for key 'PRIMARY'".freeze
|
6
|
-
MYSQL8_PKEY_ERROR = "for key 'event_store_events.PRIMARY'".freeze
|
7
|
-
POSTGRES_PKEY_ERROR = 'event_store_events_pkey'.freeze
|
8
|
-
SQLITE3_PKEY_ERROR = 'event_store_events.id'.freeze
|
9
5
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
def initialize(event_store_events, event_store_events_in_streams)
|
7
|
+
@postgres_pkey_error = "Key (event_id)".freeze
|
8
|
+
@postgres_index_error = "Key (stream, event_id)".freeze
|
9
|
+
@mysql5_pkey_error = "for key 'index_#{event_store_events}_on_event_id'".freeze
|
10
|
+
@mysql8_pkey_error = "for key '#{event_store_events}.index_#{event_store_events}_on_event_id'".freeze
|
11
|
+
@mysql5_index_error = "for key 'index_#{event_store_events_in_streams}_on_stream_and_event_id'".freeze
|
12
|
+
@mysql8_index_error = "for key '#{event_store_events_in_streams}.index_#{event_store_events_in_streams}_on_stream_and_event_id'".freeze
|
13
|
+
@sqlite3_pkey_error = "constraint failed: #{event_store_events}.event_id".freeze
|
14
|
+
@sqlite3_index_error = "constraint failed: #{event_store_events_in_streams}.stream, #{event_store_events_in_streams}.event_id".freeze
|
15
|
+
end
|
14
16
|
|
15
17
|
def detect(message)
|
16
|
-
message
|
17
|
-
message
|
18
|
-
message
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
detect_postgres(message) ||
|
19
|
+
detect_mysql(message) ||
|
20
|
+
detect_sqlite(message)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def detect_postgres(message)
|
26
|
+
message.include?(@postgres_pkey_error) ||
|
27
|
+
message.include?(@postgres_index_error)
|
28
|
+
end
|
29
|
+
|
30
|
+
def detect_mysql(message)
|
31
|
+
message.include?(@mysql5_pkey_error) ||
|
32
|
+
message.include?(@mysql8_pkey_error) ||
|
33
|
+
message.include?(@mysql5_index_error) ||
|
34
|
+
message.include?(@mysql8_index_error)
|
35
|
+
end
|
36
|
+
|
37
|
+
def detect_sqlite(message)
|
38
|
+
message.include?(@sqlite3_pkey_error) ||
|
39
|
+
message.include?(@sqlite3_index_error)
|
25
40
|
end
|
26
41
|
end
|
27
42
|
|
28
43
|
private_constant(:IndexViolationDetector)
|
29
|
-
end
|
44
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsEventStoreActiveRecord
|
4
|
+
class WithAbstractBaseClass
|
5
|
+
def initialize(base_klass)
|
6
|
+
raise ArgumentError.new(
|
7
|
+
"#{base_klass} must be an abstract class that inherits from ActiveRecord::Base"
|
8
|
+
) unless base_klass < ActiveRecord::Base && base_klass.abstract_class?
|
9
|
+
@base_klass = base_klass
|
10
|
+
end
|
11
|
+
|
12
|
+
def call(instance_id: SecureRandom.hex)
|
13
|
+
[
|
14
|
+
build_event_klass(instance_id),
|
15
|
+
build_stream_klass(instance_id),
|
16
|
+
]
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def build_event_klass(instance_id)
|
21
|
+
Object.const_set("Event_#{instance_id}",
|
22
|
+
Class.new(@base_klass) do
|
23
|
+
self.primary_key = :id
|
24
|
+
self.table_name = 'event_store_events'
|
25
|
+
end
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def build_stream_klass(instance_id)
|
30
|
+
Object.const_set("EventInStream_#{instance_id}",
|
31
|
+
Class.new(@base_klass) do
|
32
|
+
self.primary_key = :id
|
33
|
+
self.table_name = 'event_store_events_in_streams'
|
34
|
+
belongs_to :event, primary_key: :event_id, class_name: "Event_#{instance_id}"
|
35
|
+
end
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rails_event_store_active_record/generators/migration_generator'
|
4
|
-
require 'rails_event_store_active_record/generators/
|
5
|
-
require 'rails_event_store_active_record/generators/
|
6
|
-
require 'rails_event_store_active_record/generators/
|
4
|
+
require 'rails_event_store_active_record/generators/add_valid_at_generator'
|
5
|
+
require 'rails_event_store_active_record/generators/created_at_precision_generator'
|
6
|
+
require 'rails_event_store_active_record/generators/no_global_stream_entries_generator'
|
7
7
|
require 'rails_event_store_active_record/event'
|
8
|
+
require 'rails_event_store_active_record/with_default_models'
|
9
|
+
require 'rails_event_store_active_record/with_abstract_base_class'
|
8
10
|
require 'rails_event_store_active_record/event_repository'
|
9
11
|
require 'rails_event_store_active_record/batch_enumerator'
|
10
12
|
require 'rails_event_store_active_record/event_repository_reader'
|
@@ -21,11 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
}
|
22
22
|
|
23
23
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
-
spec.bindir = 'exe'
|
25
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
24
|
spec.require_paths = ['lib']
|
27
25
|
|
28
|
-
spec.add_dependency 'ruby_event_store', '=
|
26
|
+
spec.add_dependency 'ruby_event_store', '= 2.0.0'
|
29
27
|
spec.add_dependency 'activesupport', '>= 3.0'
|
30
28
|
spec.add_dependency 'activemodel', '>= 3.0'
|
31
29
|
spec.add_dependency 'activerecord-import', '>= 1.0.2'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_event_store_active_record
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arkency
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby_event_store
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -74,28 +74,38 @@ executables: []
|
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
|
+
- ".mutant.yml"
|
77
78
|
- CHANGELOG.md
|
78
79
|
- Gemfile
|
80
|
+
- Gemfile.lock
|
81
|
+
- Gemfile.rails_5_0
|
82
|
+
- Gemfile.rails_5_0.lock
|
83
|
+
- Gemfile.rails_5_1
|
84
|
+
- Gemfile.rails_5_1.lock
|
85
|
+
- Gemfile.rails_5_2
|
86
|
+
- Gemfile.rails_5_2.lock
|
87
|
+
- Gemfile.rails_6_0
|
88
|
+
- Gemfile.rails_6_0.lock
|
79
89
|
- Makefile
|
80
90
|
- README.md
|
81
|
-
- bin/console
|
82
|
-
- bin/setup
|
83
91
|
- lib/rails_event_store_active_record.rb
|
84
92
|
- lib/rails_event_store_active_record/batch_enumerator.rb
|
85
93
|
- lib/rails_event_store_active_record/event.rb
|
86
94
|
- lib/rails_event_store_active_record/event_repository.rb
|
87
95
|
- lib/rails_event_store_active_record/event_repository_reader.rb
|
88
|
-
- lib/rails_event_store_active_record/generators/
|
89
|
-
- lib/rails_event_store_active_record/generators/
|
90
|
-
- lib/rails_event_store_active_record/generators/limit_for_event_id_generator.rb
|
96
|
+
- lib/rails_event_store_active_record/generators/add_valid_at_generator.rb
|
97
|
+
- lib/rails_event_store_active_record/generators/created_at_precision_generator.rb
|
91
98
|
- lib/rails_event_store_active_record/generators/migration_generator.rb
|
92
|
-
- lib/rails_event_store_active_record/generators/
|
99
|
+
- lib/rails_event_store_active_record/generators/no_global_stream_entries_generator.rb
|
100
|
+
- lib/rails_event_store_active_record/generators/templates/add_valid_at_template.rb
|
93
101
|
- lib/rails_event_store_active_record/generators/templates/create_event_store_events_template.rb
|
94
|
-
- lib/rails_event_store_active_record/generators/templates/
|
95
|
-
- lib/rails_event_store_active_record/generators/templates/
|
102
|
+
- lib/rails_event_store_active_record/generators/templates/created_at_precision_template.rb
|
103
|
+
- lib/rails_event_store_active_record/generators/templates/no_global_stream_entries_template.rb
|
96
104
|
- lib/rails_event_store_active_record/index_violation_detector.rb
|
97
105
|
- lib/rails_event_store_active_record/pg_linearized_event_repository.rb
|
98
106
|
- lib/rails_event_store_active_record/version.rb
|
107
|
+
- lib/rails_event_store_active_record/with_abstract_base_class.rb
|
108
|
+
- lib/rails_event_store_active_record/with_default_models.rb
|
99
109
|
- rails_event_store_active_record.gemspec
|
100
110
|
homepage: https://railseventstore.org
|
101
111
|
licenses:
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "rails_event_store_active_record"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start
|
data/bin/setup
DELETED
data/lib/rails_event_store_active_record/generators/templates/binary_data_and_metadata_template.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class BinaryDataAndMetadata < ActiveRecord::Migration<%= migration_version %>
|
4
|
-
def change
|
5
|
-
rails_42 = Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new("5.0.0")
|
6
|
-
|
7
|
-
case ActiveRecord::Base.connection.adapter_name
|
8
|
-
when "SQLite"
|
9
|
-
rename_table :event_store_events, :old_event_store_events
|
10
|
-
create_table(:event_store_events, id: false, force: false) do |t|
|
11
|
-
t.string :id, limit: 36, primary_key: true, null: false
|
12
|
-
t.string :event_type, null: false
|
13
|
-
t.binary :metadata
|
14
|
-
t.binary :data, null: false
|
15
|
-
t.datetime :created_at, null: false
|
16
|
-
end
|
17
|
-
add_index :event_store_events, :id, unique: true if rails_42
|
18
|
-
add_index :event_store_events, :created_at
|
19
|
-
add_index :event_store_events, :event_type
|
20
|
-
execute <<-SQL
|
21
|
-
INSERT INTO event_store_events(id, event_type, metadata, data, created_at)
|
22
|
-
SELECT id, event_type, metadata, data, created_at FROM old_event_store_events;
|
23
|
-
SQL
|
24
|
-
drop_table :old_event_store_events
|
25
|
-
when "PostgreSQL"
|
26
|
-
execute <<-SQL
|
27
|
-
ALTER TABLE event_store_events ALTER COLUMN data TYPE bytea USING convert_to(data, 'UTF8');
|
28
|
-
ALTER TABLE event_store_events ALTER COLUMN metadata TYPE bytea USING convert_to(metadata, 'UTF8');
|
29
|
-
SQL
|
30
|
-
else
|
31
|
-
change_column :event_store_events, :data, :binary
|
32
|
-
change_column :event_store_events, :metadata, :binary
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/rails_event_store_active_record/generators/templates/limit_for_event_id_template.rb
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class LimitForEventId < ActiveRecord::Migration<%= migration_version %>
|
4
|
-
def change
|
5
|
-
postgres = ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
|
6
|
-
change_column(:event_store_events_in_streams, :event_id, :string, limit: 36) unless postgres
|
7
|
-
end
|
8
|
-
end
|