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.
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