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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.mutant.yml +1 -0
  3. data/Gemfile +5 -10
  4. data/Gemfile.lock +245 -0
  5. data/Gemfile.rails_5_0 +13 -0
  6. data/Gemfile.rails_5_0.lock +217 -0
  7. data/Gemfile.rails_5_1 +13 -0
  8. data/Gemfile.rails_5_1.lock +217 -0
  9. data/Gemfile.rails_5_2 +13 -0
  10. data/Gemfile.rails_5_2.lock +225 -0
  11. data/Gemfile.rails_6_0 +13 -0
  12. data/Gemfile.rails_6_0.lock +241 -0
  13. data/Makefile +8 -15
  14. data/lib/rails_event_store_active_record/event.rb +1 -1
  15. data/lib/rails_event_store_active_record/event_repository.rb +45 -43
  16. data/lib/rails_event_store_active_record/event_repository_reader.rb +101 -37
  17. data/lib/rails_event_store_active_record/generators/{limit_for_event_id_generator.rb → add_valid_at_generator.rb} +2 -2
  18. data/lib/rails_event_store_active_record/generators/{index_by_event_type_generator.rb → created_at_precision_generator.rb} +2 -2
  19. data/lib/rails_event_store_active_record/generators/{binary_data_and_metadata_generator.rb → no_global_stream_entries_generator.rb} +2 -4
  20. data/lib/rails_event_store_active_record/generators/templates/add_valid_at_template.rb +14 -0
  21. data/lib/rails_event_store_active_record/generators/templates/create_event_store_events_template.rb +15 -9
  22. data/lib/rails_event_store_active_record/generators/templates/created_at_precision_template.rb +45 -0
  23. data/lib/rails_event_store_active_record/generators/templates/no_global_stream_entries_template.rb +59 -0
  24. data/lib/rails_event_store_active_record/index_violation_detector.rb +33 -18
  25. data/lib/rails_event_store_active_record/version.rb +1 -1
  26. data/lib/rails_event_store_active_record/with_abstract_base_class.rb +39 -0
  27. data/lib/rails_event_store_active_record/with_default_models.rb +9 -0
  28. data/lib/rails_event_store_active_record.rb +5 -3
  29. data/rails_event_store_active_record.gemspec +1 -3
  30. metadata +23 -13
  31. data/bin/console +0 -14
  32. data/bin/setup +0 -7
  33. data/lib/rails_event_store_active_record/generators/templates/binary_data_and_metadata_template.rb +0 -35
  34. data/lib/rails_event_store_active_record/generators/templates/index_by_event_type_template.rb +0 -7
  35. 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
- MYSQL5_INDEX_ERROR = "for key 'index_event_store_events_in_streams_on_stream_and_event_id'".freeze
11
- MYSQL8_INDEX_ERROR = "for key 'event_store_events_in_streams.index_event_store_events_in_streams_on_stream_and_event_id'".freeze
12
- POSTGRES_INDEX_ERROR = 'Key (stream, event_id)'.freeze
13
- SQLITE3_INDEX_ERROR = 'event_store_events_in_streams.stream, event_store_events_in_streams.event_id'.freeze
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.include?(MYSQL5_PKEY_ERROR) ||
17
- message.include?(MYSQL8_PKEY_ERROR) ||
18
- message.include?(POSTGRES_PKEY_ERROR) ||
19
- message.include?(SQLITE3_PKEY_ERROR) ||
20
-
21
- message.include?(MYSQL5_INDEX_ERROR) ||
22
- message.include?(MYSQL8_INDEX_ERROR) ||
23
- message.include?(POSTGRES_INDEX_ERROR) ||
24
- message.include?(SQLITE3_INDEX_ERROR)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsEventStoreActiveRecord
4
- VERSION = "1.3.1"
4
+ VERSION = "2.0.0"
5
5
  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
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RailsEventStoreActiveRecord
4
+ class WithDefaultModels
5
+ def call
6
+ [Event, EventInStream]
7
+ end
8
+ end
9
+ 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/index_by_event_type_generator'
5
- require 'rails_event_store_active_record/generators/limit_for_event_id_generator'
6
- require 'rails_event_store_active_record/generators/binary_data_and_metadata_generator'
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', '= 1.3.1'
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: 1.3.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arkency
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-05 00:00:00.000000000 Z
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: 1.3.1
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: 1.3.1
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/binary_data_and_metadata_generator.rb
89
- - lib/rails_event_store_active_record/generators/index_by_event_type_generator.rb
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/templates/binary_data_and_metadata_template.rb
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/index_by_event_type_template.rb
95
- - lib/rails_event_store_active_record/generators/templates/limit_for_event_id_template.rb
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
@@ -1,7 +0,0 @@
1
- #!/bin/bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
-
5
- bundle install
6
-
7
- # Do any other automated setup that you need to do here
@@ -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
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class IndexByEventType < ActiveRecord::Migration<%= migration_version %>
4
- def change
5
- add_index :event_store_events, :event_type unless index_exists? :event_store_events, :event_type
6
- end
7
- end
@@ -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