rails_event_store_active_record 1.3.1 → 2.0.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 +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
|