online_migrations 0.14.0 → 0.14.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 296a1517b032cbd6d5fa3948f60f1a4f20c4142c8f4c7676c43998f9e941925d
4
- data.tar.gz: f61a7c6728a6ea1e834be61187b61e3ddf004f4314003752ec3ccf9a5b79afd9
3
+ metadata.gz: 330d5ed7f11aae3b85e7fb5aab5a1ea66d809da704cf193420b6d4206f72d82b
4
+ data.tar.gz: 36d47a6f2a1cae3de33331a4ec9e6b21fc7b3b8b09a7d5e9c34d1be6c92e5d35
5
5
  SHA512:
6
- metadata.gz: fd04da6b57f9862726ee45e6ed13b1032632099a089e26e691717b2e93009269b7f8a8cf3c828501ef97a86d3d13731d4cadb77d0b48f0cf25fea172502780c1
7
- data.tar.gz: '089a7f40afc28b9671669764ee98c760e4ee8649aab67a4d814b22ca8f5c52cf76afc8a5c9f95244d8be7b879d2b714fa38f07fff3c741bcc91e450077c96801'
6
+ metadata.gz: e07937136867b4b6bc2d0dfb2e5ccb8471faf6ce0339a247bc0c63d591cc163e084da731e86fc01ba839c7744a51e9c63e99ce632452e471f9eed98a95b9dd02
7
+ data.tar.gz: f1a33636d5fbd01f25a0cee32af0d74e377c804eaef0feee2c778c5318a93bbe8942dc03e8ea2bad0a610d0046a8d4e42b505d0991c7d215cc9842a24d5e5065
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## master (unreleased)
2
2
 
3
+ ## 0.14.1 (2024-02-21)
4
+
5
+ - Fix `MigrationRunner` to consider `run_background_migrations_inline` proc
6
+
3
7
  ## 0.14.0 (2024-02-01)
4
8
 
5
9
  - Add ability to configure whether background migrations should be run inline
data/README.md CHANGED
@@ -206,7 +206,7 @@ end
206
206
  end
207
207
  ```
208
208
 
209
- 4. Remove column ignoring from `User` model
209
+ 4. Remove column ignoring from step 1
210
210
  5. Deploy
211
211
 
212
212
  ### Adding a column with a default value
@@ -30,7 +30,12 @@ module OnlineMigrations
30
30
 
31
31
  alias_attribute :name, :migration_name
32
32
 
33
- enum status: STATUSES.index_with(&:to_s)
33
+ # Avoid deprecation warnings.
34
+ if Utils.ar_version >= 7
35
+ enum :status, STATUSES.index_with(&:to_s)
36
+ else
37
+ enum status: STATUSES.index_with(&:to_s)
38
+ end
34
39
 
35
40
  belongs_to :parent, class_name: name, optional: true
36
41
  has_many :children, class_name: name, foreign_key: :parent_id, dependent: :delete_all
@@ -307,7 +307,7 @@ module OnlineMigrations
307
307
  # perform_action_on_relation_in_background("User", { invite_token: nil }, :generate_invite_token)
308
308
  #
309
309
  # @note This method is better suited for large tables (10/100s of millions of records).
310
- # For smaller tables it is probably better and easier to directly delete associated records.
310
+ # For smaller tables it is probably better and easier to directly perform the action on associated records.
311
311
  #
312
312
  def perform_action_on_relation_in_background(model_name, conditions, action, updates: nil, **options)
313
313
  model_name = model_name.name if model_name.is_a?(Class)
@@ -37,7 +37,12 @@ module OnlineMigrations
37
37
  scope :except_succeeded, -> { where.not(status: :succeeded) }
38
38
  scope :attempts_exceeded, -> { where("attempts >= max_attempts") }
39
39
 
40
- enum status: STATUSES.index_with(&:to_s)
40
+ # Avoid deprecation warnings.
41
+ if Utils.ar_version >= 7
42
+ enum :status, STATUSES.index_with(&:to_s)
43
+ else
44
+ enum status: STATUSES.index_with(&:to_s)
45
+ end
41
46
 
42
47
  delegate :migration_class, :migration_object, :migration_relation, :batch_column_name,
43
48
  :arguments, :batch_pause, to: :migration
@@ -51,7 +51,11 @@ module OnlineMigrations
51
51
  # @note This method should not be used in production environments
52
52
  #
53
53
  def run_all_migration_jobs
54
- raise "This method is not intended for use in production environments" if !Utils.developer_env?
54
+ run_inline = OnlineMigrations.config.run_background_migrations_inline
55
+ if run_inline && !run_inline.call
56
+ raise "This method is not intended for use in production environments"
57
+ end
58
+
55
59
  return if migration.completed?
56
60
 
57
61
  mark_as_running
@@ -100,7 +100,7 @@ module OnlineMigrations
100
100
  end
101
101
 
102
102
  def set_statement_timeout
103
- if !@statement_timeout_set
103
+ if !defined?(@statement_timeout_set)
104
104
  if (statement_timeout = OnlineMigrations.config.statement_timeout)
105
105
  # TODO: inline this method call after deprecated `disable_statement_timeout` method removal.
106
106
  connection.__set_statement_timeout(statement_timeout)
@@ -5,7 +5,7 @@ module OnlineMigrations
5
5
  module DatabaseTasks
6
6
  def migrate(*)
7
7
  super
8
- rescue => e # rubocop:disable Style/RescueStandardError
8
+ rescue => e
9
9
  if e.cause.is_a?(OnlineMigrations::Error)
10
10
  # strip cause
11
11
  def e.cause
@@ -295,7 +295,7 @@ end
295
295
  Active Record caches database columns at runtime, so if you drop a column, it can cause exceptions until your app reboots.
296
296
  A safer approach is to:
297
297
 
298
- 1. Ignore the column(s):
298
+ 1. Ignore the column:
299
299
 
300
300
  class <%= model %> < ApplicationRecord
301
301
  self.ignored_columns = <%= columns %>
@@ -310,7 +310,7 @@ A safer approach is to:
310
310
  end
311
311
  end
312
312
 
313
- 4. Remove columns ignoring
313
+ 4. Remove column ignoring from step 1
314
314
  5. Deploy
315
315
  <% end %>",
316
316
 
@@ -78,7 +78,7 @@ module OnlineMigrations
78
78
  end
79
79
 
80
80
  # @private
81
- module SchemaCache7
81
+ module SchemaCache71
82
82
  # Active Record >= 7.1 changed signature of the methods,
83
83
  # see https://github.com/rails/rails/pull/48716.
84
84
  def primary_keys(connection, table_name)
@@ -154,4 +154,82 @@ module OnlineMigrations
154
154
  columns << new_column.freeze
155
155
  end
156
156
  end
157
+
158
+ # @private
159
+ module SchemaCache72
160
+ # Active Record >= 7.2 changed signature of the methods,
161
+ # see https://github.com/rails/rails/pull/48716.
162
+ def primary_keys(pool, table_name)
163
+ if (renamed_table = renamed_table?(pool, table_name))
164
+ super(pool, renamed_table)
165
+ elsif renamed_column?(pool, table_name)
166
+ super(pool, column_rename_table(table_name))
167
+ else
168
+ super
169
+ end
170
+ end
171
+
172
+ def columns(pool, table_name)
173
+ if (renamed_table = renamed_table?(pool, table_name))
174
+ super(pool, renamed_table)
175
+ elsif renamed_column?(pool, table_name)
176
+ columns = super(pool, column_rename_table(table_name))
177
+ OnlineMigrations.config.column_renames[table_name].each do |old_column_name, new_column_name|
178
+ duplicate_column(old_column_name, new_column_name, columns)
179
+ end
180
+ columns
181
+ else
182
+ super.reject { |column| column.name.end_with?("_for_type_change") }
183
+ end
184
+ end
185
+
186
+ def indexes(pool, table_name)
187
+ if (renamed_table = renamed_table?(pool, table_name))
188
+ super(pool, renamed_table)
189
+ elsif renamed_column?(pool, table_name)
190
+ super(pool, column_rename_table(table_name))
191
+ else
192
+ super
193
+ end
194
+ end
195
+
196
+ def clear_data_source_cache!(pool, name)
197
+ if (renamed_table = renamed_table?(pool, name))
198
+ super(pool, renamed_table)
199
+ end
200
+
201
+ if renamed_column?(pool, name)
202
+ super(pool, column_rename_table(name))
203
+ end
204
+
205
+ super
206
+ end
207
+
208
+ private
209
+ def renamed_table?(pool, table_name)
210
+ table_renames = OnlineMigrations.config.table_renames
211
+ if table_renames.key?(table_name)
212
+ views = pool.with_connection(&:views)
213
+ table_renames[table_name] if views.include?(table_name)
214
+ end
215
+ end
216
+
217
+ def renamed_column?(pool, table_name)
218
+ column_renames = OnlineMigrations.config.column_renames
219
+ column_renames.key?(table_name) && pool.with_connection(&:views).include?(table_name)
220
+ end
221
+
222
+ def column_rename_table(table_name)
223
+ "#{table_name}_column_rename"
224
+ end
225
+
226
+ def duplicate_column(old_column_name, new_column_name, columns)
227
+ old_column = columns.find { |column| column.name == old_column_name }
228
+ new_column = old_column.dup
229
+ # Active Record defines only reader for :name
230
+ new_column.instance_variable_set(:@name, new_column_name)
231
+ # Correspond to the Active Record freezing of each column
232
+ columns << new_column.freeze
233
+ end
234
+ end
157
235
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OnlineMigrations
4
- VERSION = "0.14.0"
4
+ VERSION = "0.14.1"
5
5
  end
@@ -7,6 +7,7 @@ require "online_migrations/utils"
7
7
  require "online_migrations/change_column_type_helpers"
8
8
  require "online_migrations/background_migrations/migration_helpers"
9
9
  require "online_migrations/schema_statements"
10
+ require "online_migrations/schema_cache"
10
11
  require "online_migrations/migration"
11
12
  require "online_migrations/migrator"
12
13
  require "online_migrations/schema_dumper"
@@ -29,11 +30,6 @@ module OnlineMigrations
29
30
  autoload :CommandChecker
30
31
  autoload :BackgroundMigration
31
32
 
32
- autoload_at "online_migrations/schema_cache" do
33
- autoload :SchemaCache
34
- autoload :SchemaCache7
35
- end
36
-
37
33
  autoload_at "online_migrations/lock_retrier" do
38
34
  autoload :LockRetrier
39
35
  autoload :ConstantLockRetrier
@@ -102,8 +98,10 @@ module OnlineMigrations
102
98
  ActiveRecord::Tasks::DatabaseTasks.singleton_class.prepend(OnlineMigrations::DatabaseTasks)
103
99
  ActiveRecord::Migration::CommandRecorder.include(OnlineMigrations::CommandRecorder)
104
100
 
105
- if OnlineMigrations::Utils.ar_version >= 7.1
106
- ActiveRecord::ConnectionAdapters::SchemaCache.prepend(OnlineMigrations::SchemaCache7)
101
+ if OnlineMigrations::Utils.ar_version >= 7.2
102
+ ActiveRecord::ConnectionAdapters::SchemaCache.prepend(OnlineMigrations::SchemaCache72)
103
+ elsif OnlineMigrations::Utils.ar_version >= 7.1
104
+ ActiveRecord::ConnectionAdapters::SchemaCache.prepend(OnlineMigrations::SchemaCache71)
107
105
  else
108
106
  ActiveRecord::ConnectionAdapters::SchemaCache.prepend(OnlineMigrations::SchemaCache)
109
107
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: online_migrations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - fatkodima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-01 00:00:00.000000000 Z
11
+ date: 2024-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord