rails_event_store_active_record-legacy 0.31.1 → 0.32.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 90c356dd9f786029d0cabab18986323200cb9685b058656872df46047b592e95
4
- data.tar.gz: e402c14adf601106d6ec821d7c7a756b315da0dfabba407318b7a91e3c7bfc30
3
+ metadata.gz: eff68a246249af3de610dcd3726b949438b066e9691bb11ab50a880cd9fec5be
4
+ data.tar.gz: 11e680a6c72139c632e4b450e319bd9e8f109694bb286921d38b0516d12b5efe
5
5
  SHA512:
6
- metadata.gz: 8ded3dc24789456a825fd175e8f3d413bb14825b955afd195bd9dba66d66d9ded7e2cd9f487e1a16934e33e2579162fe111eb833ad60682a8102c7ac93564c9a
7
- data.tar.gz: 6231ec58a6b48e98cfc0ccb464d005dcaab1ace1db806e86891598bc34f754a33a93b50006b9e60af83f2e055444f8742a52d7ee5310c72e5ae0265154d56aad
6
+ metadata.gz: f8f62c1d22349f5bd9986ab570c6c75394fc202a6507eb947dcde24f660f1b93bb6d01f19d41dee54370633a6633f046d93c057e8025cce7589323367e3c34ee
7
+ data.tar.gz: 5a806d547c43b3e067bcfa64569caee427d732f0c3199be9878f6160f5d453231f114036106ceb46c60ec9398c806f23c10e0ab320bbab80adbc09cb901b57db
data/Gemfile CHANGED
@@ -2,7 +2,8 @@ source "https://rubygems.org"
2
2
  gemspec
3
3
 
4
4
  gem 'ruby_event_store', path: '../ruby_event_store'
5
+ gem 'rails_event_store_active_record', path: '../rails_event_store_active_record'
5
6
 
6
7
  if v = ENV['RAILS_VERSION']
7
8
  gem 'rails', v
8
- end
9
+ end
data/Makefile CHANGED
@@ -26,14 +26,14 @@ test: ## Run unit tests
26
26
 
27
27
  mutate: test ## Run mutation tests
28
28
  @echo "Running mutation tests"
29
- @BUNDLE_GEMFILE=Gemfile DATABASE_URL=$(DATABASE_URL) bundle exec mutant --include lib \
29
+ @MUTATING=true BUNDLE_GEMFILE=Gemfile DATABASE_URL=$(DATABASE_URL) bundle exec mutant --include lib \
30
30
  $(addprefix --require ,$(REQUIRE)) \
31
31
  $(addprefix --ignore-subject ,$(IGNORE)) \
32
32
  --use rspec "$(SUBJECT)"
33
33
 
34
34
  mutate-fast: ## Run mutation tests with --fail-fast
35
35
  @echo "Running mutation tests with --fail-fast"
36
- @BUNDLE_GEMFILE=Gemfile DATABASE_URL=$(DATABASE_URL) bundle exec mutant --include lib \
36
+ @MUTATING=true BUNDLE_GEMFILE=Gemfile DATABASE_URL=$(DATABASE_URL) bundle exec mutant --include lib \
37
37
  $(addprefix --require ,$(REQUIRE)) \
38
38
  $(addprefix --ignore-subject ,$(IGNORE)) \
39
39
  --fail-fast \
@@ -1,5 +1,6 @@
1
1
  require "rails_event_store_active_record/legacy/version"
2
2
  require "rails_event_store_active_record/legacy/event_repository"
3
+ require "rails_event_store_active_record/legacy/generators/v1_v2_migration_generator"
3
4
 
4
5
  module RailsEventStoreActiveRecord
5
6
  LegacyEventRepository = Legacy::EventRepository
@@ -60,38 +60,40 @@ instead:
60
60
  end
61
61
 
62
62
  def read(spec)
63
- stream = LegacyEvent.order(id: order(spec.direction))
64
- stream = stream.limit(spec.count) if spec.limit?
63
+ stream = LegacyEvent.order(id: order(spec))
64
+ stream = stream.limit(spec.limit) if spec.limit?
65
65
  stream = stream.where(start_condition(spec)) unless spec.head?
66
- stream = stream.where(stream: spec.stream_name) unless spec.global_stream?
66
+ stream = stream.where(stream: spec.stream.name) unless spec.stream.global?
67
67
 
68
68
  if spec.batched?
69
69
  batch_reader = ->(offset, limit) { stream.offset(offset).limit(limit).map(&method(:build_event_entity)) }
70
- RubyEventStore::BatchEnumerator.new(spec.batch_size, total_limit(spec), batch_reader).each
70
+ RubyEventStore::BatchEnumerator.new(spec.batch_size, spec.limit, batch_reader).each
71
+ elsif spec.first?
72
+ build_event_entity(stream.first)
73
+ elsif spec.last?
74
+ build_event_entity(stream.last)
71
75
  else
72
76
  stream.map(&method(:build_event_entity)).each
73
77
  end
74
78
  end
75
79
 
76
- private
77
-
78
- def total_limit(specification)
79
- specification.limit? ? specification.count : Float::INFINITY
80
+ def streams_of(event_id)
81
+ LegacyEvent.where(event_id: event_id)
82
+ .pluck(:stream)
83
+ .map{|name| RubyEventStore::Stream.new(name)}
80
84
  end
81
85
 
86
+ private
87
+
82
88
  def start_condition(specification)
83
89
  event_record =
84
90
  LegacyEvent.find_by!(event_id: specification.start)
85
- case specification.direction
86
- when :forward
87
- ['id > ?', event_record]
88
- else
89
- ['id < ?', event_record]
90
- end
91
+ condition = specification.forward? ? 'id > ?' : 'id < ?'
92
+ [condition, event_record]
91
93
  end
92
94
 
93
- def order(direction)
94
- {forward: 'ASC', backward: 'DESC'}.fetch(direction)
95
+ def order(spec)
96
+ spec.forward? ? 'ASC' : 'DESC'
95
97
  end
96
98
 
97
99
 
@@ -0,0 +1,99 @@
1
+ # This migration is not intended for live data migration
2
+ # It assumes no data is added at when it is running.
3
+ # So stop your application servers from accepting new requests
4
+ # and processing background jobs before running
5
+
6
+ # Make sure you have a backup before running on production
7
+
8
+ # 10_000_000 distinct stream names
9
+ # can cause around 2GB of RAM usage
10
+ # make sure you can run this migration on your production system
11
+ class MigrateResSchemaV1ToV2 < ActiveRecord::Migration<%= migration_version %>
12
+ def up
13
+ postgres = ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
14
+ mysql = ActiveRecord::Base.connection.adapter_name == "Mysql2"
15
+ sqlite = ActiveRecord::Base.connection.adapter_name == "SQLite"
16
+ rails_42 = Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new("5.0.0")
17
+ enable_extension "pgcrypto" if postgres
18
+ create_table(:event_store_events_in_streams, force: false) do |t|
19
+ t.string :stream, null: false
20
+ t.integer :position, null: true
21
+ if postgres
22
+ t.references :event, null: false, type: :uuid
23
+ else
24
+ t.references :event, null: false, type: :string
25
+ end
26
+ t.datetime :created_at, null: false
27
+ end
28
+ streams = {}
29
+ RailsEventStoreActiveRecord::Event.reset_column_information
30
+ RailsEventStoreActiveRecord::Event.find_each do |ev|
31
+ position = nil
32
+ if preserve_positions?(ev.stream)
33
+ streams[ev.stream] ||= -1
34
+ position = streams[ev.stream] += 1
35
+ end
36
+ RailsEventStoreActiveRecord::EventInStream.create!(
37
+ stream: ev.stream,
38
+ position: position,
39
+ event_id: ev.event_id,
40
+ created_at: ev.created_at,
41
+ )
42
+ RailsEventStoreActiveRecord::EventInStream.create!(
43
+ stream: 'all',
44
+ position: nil,
45
+ event_id: ev.event_id,
46
+ created_at: ev.created_at,
47
+ ) unless ev.stream == 'all'
48
+ end
49
+
50
+ add_index :event_store_events_in_streams, [:stream, :position], unique: true
51
+ add_index :event_store_events_in_streams, [:stream, :event_id], unique: true
52
+ add_index :event_store_events_in_streams, [:created_at]
53
+
54
+ remove_index :event_store_events, :event_type
55
+ remove_column :event_store_events, :stream
56
+ remove_column :event_store_events, :id
57
+ rename_column :event_store_events, :event_id, :id
58
+ change_column :event_store_events, :id, "uuid using id::uuid", default: -> { "gen_random_uuid()" } if postgres
59
+ change_column :event_store_events, :id, "string", limit: 36 if mysql || sqlite
60
+
61
+ case ActiveRecord::Base.connection.adapter_name
62
+ when "SQLite"
63
+ remove_index :event_store_events, name: :index_event_store_events_on_id
64
+ rename_table :event_store_events, :old_event_store_events
65
+ create_table(:event_store_events, id: false, force: false) do |t|
66
+ t.string :id, limit: 36, primary_key: true, null: false
67
+ t.string :event_type, null: false
68
+ t.text :metadata
69
+ t.text :data, null: false
70
+ t.datetime :created_at, null: false
71
+ end
72
+ add_index :event_store_events, :id, unique: true if rails_42
73
+ add_index :event_store_events, :created_at
74
+ execute <<-SQL
75
+ INSERT INTO event_store_events(id, event_type, metadata, data, created_at)
76
+ SELECT id, event_type, metadata, data, created_at FROM old_event_store_events;
77
+ SQL
78
+ drop_table :old_event_store_events
79
+ else
80
+ execute "ALTER TABLE event_store_events ADD PRIMARY KEY (id);"
81
+ remove_index :event_store_events, name: :index_event_store_events_on_id
82
+ end
83
+ end
84
+
85
+ def preserve_positions?(stream_name)
86
+ # https://railseventstore.org/docs/expected_version/
87
+ #
88
+ # return true if you use given stream for event sourcing
89
+ # (especially with AggregateRoot gem)
90
+ # return true if you use an Integer or :none as
91
+ # expected_version when publishing in this stream
92
+ #
93
+ # return false if use use :any (the default) as expected_version
94
+ # when publishing to this stream
95
+
96
+ raise NotImplementedError
97
+ # false
98
+ end
99
+ end
@@ -0,0 +1,31 @@
1
+ begin
2
+ require 'rails/generators'
3
+ rescue LoadError
4
+ end
5
+
6
+ module RailsEventStoreActiveRecord
7
+ module Legacy
8
+ class V1V2MigrationGenerator < Rails::Generators::Base
9
+ source_root File.expand_path(File.join(File.dirname(__FILE__), '../generators/templates'))
10
+
11
+ def create_migration
12
+ template "v1_v2_migration_template.rb", "db/migrate/#{timestamp}_migrate_res_schema_v1_to_v2.rb"
13
+ end
14
+
15
+ private
16
+
17
+ def rails_version
18
+ Rails::VERSION::STRING
19
+ end
20
+
21
+ def migration_version
22
+ return nil if Gem::Version.new(rails_version) < Gem::Version.new("5.0.0")
23
+ "[4.2]"
24
+ end
25
+
26
+ def timestamp
27
+ Time.now.strftime("%Y%m%d%H%M%S")
28
+ end
29
+ end
30
+ end
31
+ end if defined?(Rails::Generators::Base)
@@ -1,5 +1,5 @@
1
1
  module RailsEventStoreActiveRecord
2
2
  module Legacy
3
- VERSION = "0.31.1"
3
+ VERSION = "0.32.0"
4
4
  end
5
5
  end
@@ -35,10 +35,12 @@ Gem::Specification.new do |spec|
35
35
  spec.add_development_dependency 'sqlite3', '1.3.13'
36
36
  spec.add_development_dependency 'pg', '0.21'
37
37
  spec.add_development_dependency 'mysql2', '0.4.10'
38
+ spec.add_development_dependency 'fakefs', '~> 0.11.2'
38
39
  spec.add_development_dependency 'childprocess'
39
- spec.add_development_dependency 'mutant-rspec', '~> 0.8.14'
40
+ spec.add_development_dependency 'mutant-rspec', '~> 0.8.17'
40
41
 
41
- spec.add_dependency 'ruby_event_store', '= 0.31.1'
42
+ spec.add_dependency 'ruby_event_store', '= 0.32.0'
43
+ spec.add_dependency 'rails_event_store_active_record', '= 0.32.0'
42
44
  spec.add_dependency 'activesupport', '>= 3.0'
43
45
  spec.add_dependency 'activemodel', '>= 3.0'
44
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_event_store_active_record-legacy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.31.1
4
+ version: 0.32.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arkency
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-17 00:00:00.000000000 Z
11
+ date: 2018-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - '='
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.4.10
111
+ - !ruby/object:Gem::Dependency
112
+ name: fakefs
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.11.2
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.11.2
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: childprocess
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -128,28 +142,42 @@ dependencies:
128
142
  requirements:
129
143
  - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: 0.8.14
145
+ version: 0.8.17
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: 0.8.14
152
+ version: 0.8.17
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: ruby_event_store
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - '='
144
158
  - !ruby/object:Gem::Version
145
- version: 0.31.1
159
+ version: 0.32.0
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 0.32.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: rails_event_store_active_record
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.32.0
146
174
  type: :runtime
147
175
  prerelease: false
148
176
  version_requirements: !ruby/object:Gem::Requirement
149
177
  requirements:
150
178
  - - '='
151
179
  - !ruby/object:Gem::Version
152
- version: 0.31.1
180
+ version: 0.32.0
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: activesupport
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -192,6 +220,8 @@ files:
192
220
  - README.md
193
221
  - lib/rails_event_store_active_record/legacy.rb
194
222
  - lib/rails_event_store_active_record/legacy/event_repository.rb
223
+ - lib/rails_event_store_active_record/legacy/generators/templates/v1_v2_migration_template.rb
224
+ - lib/rails_event_store_active_record/legacy/generators/v1_v2_migration_generator.rb
195
225
  - lib/rails_event_store_active_record/legacy/version.rb
196
226
  - rails_event_store_active_record-legacy.gemspec
197
227
  homepage: https://railseventstore.org