online_migrations 0.8.1 → 0.8.2

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: 9bfe87b009fa9199b4deb0a1bf7e63dac043fa8f29c25f4f93c55fd136155f2d
4
- data.tar.gz: 0a95c4b4de358769bce7d3855f7df67c08d027279b523d0ea550a383b60cd6a8
3
+ metadata.gz: b4f89ce12461dd3b786e98ecbc1afc315a5013a0967e90b9307d47b080924723
4
+ data.tar.gz: 797f19c861514e843a7d6e6f3222d19f36b77fc30ff3cc1ac2808591fa339f75
5
5
  SHA512:
6
- metadata.gz: 95b0d869484b407b295426bf1b836f00ce71c297fc1ef35fe817e449f126ccbc7e7df512efc30c16cda9dfb9755c86e1b409f9787f40708341aba422128b0d60
7
- data.tar.gz: 42b829796b7fd0503416460775ac1c7596fce43621667a9144cd06b9000e35f8054398cadbf82f370b3e8ca988bcd7ce53b505982e8e5b3ed7e6991c71f373aa
6
+ metadata.gz: c4458f5096fc180bb27411fc800db6dce588473373c0945abf2121b67591dc031badb498582681e55128055a85105600be1de8851818e93bf1108f42d43dd24c
7
+ data.tar.gz: ec49dd203d5ded9638d623af2b35b6ca1980a182a54ecf57bcbaf9d910cfe8f3e2cbd0f90c7e4d94f76236be91ef373b50e29a65e59be6e12ef6b55ad21de91b
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## master (unreleased)
2
2
 
3
+ ## 0.8.2 (2023-09-26)
4
+
5
+ - Promote check constraint to `NOT NULL` on PostgreSQL >= 12 when changing column type
6
+ - Fix `safety_assured` with `revert`
7
+
3
8
  ## 0.8.1 (2023-08-04)
4
9
 
5
10
  - Fix `update_columns_in_batches` when multiple columns are passed
@@ -8,7 +13,7 @@
8
13
  ## 0.8.0 (2023-07-24)
9
14
 
10
15
  - Add check for `change_column_default`
11
- - Add check for `add_unique_key` (Active Record >= 7.1)
16
+ - Add check for `add_unique_constraint` (Active Record >= 7.1)
12
17
  - Add check for `add_column` with stored generated columns
13
18
 
14
19
  ## 0.7.3 (2023-05-30)
data/README.md CHANGED
@@ -143,7 +143,7 @@ Potentially dangerous operations:
143
143
  - [adding a reference](#adding-a-reference)
144
144
  - [adding a foreign key](#adding-a-foreign-key)
145
145
  - [adding an exclusion constraint](#adding-an-exclusion-constraint)
146
- - [adding a unique key](#adding-a-unique-key)
146
+ - [adding a unique constraint](#adding-a-unique-constraint)
147
147
  - [adding a json column](#adding-a-json-column)
148
148
  - [adding a stored generated column](#adding-a-stored-generated-column)
149
149
  - [using primary key with short integer type](#using-primary-key-with-short-integer-type)
@@ -880,16 +880,16 @@ end
880
880
 
881
881
  [Let us know](https://github.com/fatkodima/online_migrations/issues/new) if you have a safe way to do this (exclusion constraints cannot be marked `NOT VALID`).
882
882
 
883
- ### Adding a unique key
883
+ ### Adding a unique constraint
884
884
 
885
885
  :x: **Bad**
886
886
 
887
- Adding a unique key blocks reads and writes while the underlying index is being built.
887
+ Adding a unique constraint blocks reads and writes while the underlying index is being built.
888
888
 
889
889
  ```ruby
890
- class AddUniqueKey < ActiveRecord::Migration[7.1]
890
+ class AddUniqueConstraint < ActiveRecord::Migration[7.1]
891
891
  def change
892
- add_unique_key :sections, :position, deferrable: :deferred
892
+ add_unique_constraint :sections, :position, deferrable: :deferred
893
893
  end
894
894
  end
895
895
  ```
@@ -899,7 +899,7 @@ end
899
899
  A safer approach is to create a unique index first, and then create a unique key using that index.
900
900
 
901
901
  ```ruby
902
- class AddUniqueKeyAddIndex < ActiveRecord::Migration[7.1]
902
+ class AddUniqueConstraintAddIndex < ActiveRecord::Migration[7.1]
903
903
  disable_ddl_transaction!
904
904
 
905
905
  def change
@@ -909,13 +909,13 @@ end
909
909
  ```
910
910
 
911
911
  ```ruby
912
- class AddUniqueKey < ActiveRecord::Migration[7.1]
912
+ class AddUniqueConstraint < ActiveRecord::Migration[7.1]
913
913
  def up
914
- add_unique_key :sections, :position, deferrable: :deferred, using_index: "index_sections_on_position"
914
+ add_unique_constraint :sections, :position, deferrable: :deferred, using_index: "index_sections_on_position"
915
915
  end
916
916
 
917
917
  def down
918
- remove_unique_key :sections, :position
918
+ remove_unique_constraint :sections, :position
919
919
  end
920
920
  end
921
921
  ```
@@ -21,8 +21,8 @@ module OnlineMigrations
21
21
  migration = "#{namespace}::#{name}".safe_constantize ||
22
22
  "#{internal_namespace}::#{name}".safe_constantize
23
23
 
24
- raise NotFoundError.new("Background Migration #{name} not found", name) unless migration
25
- unless migration.is_a?(Class) && migration < self
24
+ raise NotFoundError.new("Background Migration #{name} not found", name) if migration.nil?
25
+ if !(migration.is_a?(Class) && migration < self)
26
26
  raise NotFoundError.new("#{name} is not a Background Migration", name)
27
27
  end
28
28
 
@@ -8,7 +8,7 @@ module OnlineMigrations
8
8
  relation = record.migration_relation
9
9
  migration_name = record.migration_name
10
10
 
11
- unless relation.is_a?(ActiveRecord::Relation)
11
+ if !relation.is_a?(ActiveRecord::Relation)
12
12
  record.errors.add(
13
13
  :migration_name,
14
14
  "#{migration_name}#relation must return an ActiveRecord::Relation object"
@@ -87,7 +87,7 @@ module OnlineMigrations
87
87
  end
88
88
 
89
89
  def throttler=(value)
90
- unless value.respond_to?(:call)
90
+ if !value.respond_to?(:call)
91
91
  raise ArgumentError, "background_migrations throttler must be a callable."
92
92
  end
93
93
 
@@ -13,7 +13,7 @@ module OnlineMigrations
13
13
  end
14
14
 
15
15
  def relation
16
- unless @record.respond_to?(association)
16
+ if !@record.respond_to?(association)
17
17
  raise ArgumentError, "'#{@record.class.name}' has no association called '#{association}'"
18
18
  end
19
19
 
@@ -16,7 +16,7 @@ module OnlineMigrations
16
16
  # https://github.com/rails/rails/pull/34727
17
17
  associations.inject(model.unscoped) do |relation, association|
18
18
  reflection = model.reflect_on_association(association)
19
- unless reflection
19
+ if reflection.nil?
20
20
  raise ArgumentError, "'#{model.name}' has no association called '#{association}'"
21
21
  end
22
22
 
@@ -11,12 +11,12 @@ module OnlineMigrations
11
11
  }
12
12
 
13
13
  def validate(record)
14
- return unless record.status_changed?
14
+ return if !record.status_changed?
15
15
 
16
16
  previous_status, new_status = record.status_change
17
17
  valid_new_statuses = VALID_STATUS_TRANSITIONS.fetch(previous_status, [])
18
18
 
19
- unless valid_new_statuses.include?(new_status)
19
+ if !valid_new_statuses.include?(new_status)
20
20
  record.errors.add(
21
21
  :status,
22
22
  "cannot transition background migration job from status #{previous_status} to #{new_status}"
@@ -29,12 +29,12 @@ module OnlineMigrations
29
29
  }
30
30
 
31
31
  def validate(record)
32
- return unless record.status_changed?
32
+ return if !record.status_changed?
33
33
 
34
34
  previous_status, new_status = record.status_change
35
35
  valid_new_statuses = VALID_STATUS_TRANSITIONS.fetch(previous_status, [])
36
36
 
37
- unless valid_new_statuses.include?(new_status)
37
+ if !valid_new_statuses.include?(new_status)
38
38
  record.errors.add(
39
39
  :status,
40
40
  "cannot transition background migration from status #{previous_status} to #{new_status}"
@@ -59,7 +59,7 @@ module OnlineMigrations
59
59
  def has_many_association(counter_association) # rubocop:disable Naming/PredicateName
60
60
  has_many_association = model.reflect_on_association(counter_association)
61
61
 
62
- unless has_many_association
62
+ if !has_many_association
63
63
  has_many = model.reflect_on_all_associations(:has_many)
64
64
 
65
65
  has_many_association = has_many.find do |association|
@@ -74,7 +74,7 @@ module OnlineMigrations
74
74
 
75
75
  counter_association = has_many_association.plural_name if has_many_association
76
76
  end
77
- raise ArgumentError, "'#{model.name}' has no association called '#{counter_association}'" unless has_many_association
77
+ raise ArgumentError, "'#{model.name}' has no association called '#{counter_association}'" if !has_many_association
78
78
 
79
79
  if has_many_association.is_a?(ActiveRecord::Reflection::ThroughReflection)
80
80
  has_many_association = has_many_association.through_reflection
@@ -14,7 +14,7 @@ module OnlineMigrations
14
14
  end
15
15
 
16
16
  def each_batch(of: 1000, column: relation.primary_key, start: nil, finish: nil, order: :asc)
17
- unless [:asc, :desc].include?(order)
17
+ if ![:asc, :desc].include?(order)
18
18
  raise ArgumentError, ":order must be :asc or :desc, got #{order.inspect}"
19
19
  end
20
20
 
@@ -26,7 +26,7 @@ module OnlineMigrations
26
26
 
27
27
  start_row = base_relation.uncached { base_relation.first }
28
28
 
29
- return unless start_row
29
+ return if !start_row
30
30
 
31
31
  start_id = start_row[column]
32
32
  arel_table = relation.arel_table
@@ -67,7 +67,7 @@ module OnlineMigrations
67
67
  # Retaining the results in the query cache would undermine the point of batching.
68
68
  batch_relation.uncached { yield batch_relation, index }
69
69
 
70
- break unless stop_row
70
+ break if !stop_row
71
71
  end
72
72
  end
73
73
 
@@ -113,21 +113,22 @@ module OnlineMigrations
113
113
 
114
114
  if raw_connection.server_version >= 11_00_00
115
115
  if primary_key(table_name) == column_name.to_s && old_col.type == :integer
116
- # If the column to be converted is a Primary Key, set it to
117
- # `NOT NULL DEFAULT 0` and we'll copy the correct values when backfilling.
118
- # That way, we skip the expensive validation step required to add
119
- # a `NOT NULL` constraint at the end of the process.
116
+ # For PG < 11 and Primary Key conversions, setting a column as the PK
117
+ # converts even check constraints to NOT NULL column constraints
118
+ # and forces an inline re-verification of the whole table.
119
+ # To avoid this, we instead set it to `NOT NULL DEFAULT 0` and we'll
120
+ # copy the correct values when backfilling.
120
121
  add_column(table_name, tmp_column_name, new_type,
121
122
  **old_col_options.merge(column_options).merge(default: old_col.default || 0, null: false))
122
123
  else
123
- unless old_col.default.nil?
124
+ if !old_col.default.nil?
124
125
  old_col_options = old_col_options.merge(default: old_col.default, null: old_col.null)
125
126
  end
126
127
  add_column(table_name, tmp_column_name, new_type, **old_col_options.merge(column_options))
127
128
  end
128
129
  else
129
130
  add_column(table_name, tmp_column_name, new_type, **old_col_options.merge(column_options))
130
- change_column_default(table_name, tmp_column_name, old_col.default) unless old_col.default.nil?
131
+ change_column_default(table_name, tmp_column_name, old_col.default) if !old_col.default.nil?
131
132
  end
132
133
  end
133
134
 
@@ -247,22 +248,7 @@ module OnlineMigrations
247
248
 
248
249
  # At this point we are sure there are no NULLs in this column
249
250
  transaction do
250
- # For PG < 11 and Primary Key conversions, setting a column as the PK
251
- # converts even check constraints to NOT NULL column constraints
252
- # and forces an inline re-verification of the whole table.
253
- #
254
- # For PG >= 12 we can "promote" CHECK constraint to NOT NULL constraint,
255
- # but for older versions we can set attribute as NOT NULL directly
256
- # through PG internal tables.
257
- # In-depth analysis of implications of this was made, so this approach
258
- # is considered safe - https://habr.com/ru/company/haulmont/blog/493954/ (in russian).
259
- execute(<<-SQL.strip_heredoc)
260
- UPDATE pg_catalog.pg_attribute
261
- SET attnotnull = true
262
- WHERE attrelid = #{quote(table_name)}::regclass
263
- AND attname = #{quote(tmp_column_name)}
264
- SQL
265
-
251
+ __set_not_null(table_name, tmp_column_name)
266
252
  remove_not_null_constraint(table_name, tmp_column_name)
267
253
  end
268
254
  end
@@ -389,7 +375,7 @@ module OnlineMigrations
389
375
  options.each do |option|
390
376
  if column.respond_to?(option)
391
377
  value = column.public_send(option)
392
- result[option] = value unless value.nil?
378
+ result[option] = value if !value.nil?
393
379
  end
394
380
  end
395
381
  result
@@ -417,7 +403,7 @@ module OnlineMigrations
417
403
  end
418
404
 
419
405
  # This is necessary as we can't properly rename indexes such as "taggings_idx".
420
- unless index.name.include?(from_column)
406
+ if !index.name.include?(from_column)
421
407
  raise "The index #{index.name} can not be copied as it does not " \
422
408
  "mention the old column. You have to rename this index manually first."
423
409
  end
@@ -482,6 +468,29 @@ module OnlineMigrations
482
468
  end
483
469
  end
484
470
 
471
+ def __set_not_null(table_name, column_name)
472
+ # For PG >= 12 we can "promote" CHECK constraint to NOT NULL constraint:
473
+ # https://github.com/postgres/postgres/commit/bbb96c3704c041d139181c6601e5bc770e045d26
474
+ if raw_connection.server_version >= 12_00_00
475
+ execute(<<-SQL.strip_heredoc)
476
+ ALTER TABLE #{quote_table_name(table_name)}
477
+ ALTER #{quote_column_name(column_name)}
478
+ SET NOT NULL
479
+ SQL
480
+ else
481
+ # For older versions we can set attribute as NOT NULL directly
482
+ # through PG internal tables.
483
+ # In-depth analysis of implications of this was made, so this approach
484
+ # is considered safe - https://habr.com/ru/company/haulmont/blog/493954/ (in russian).
485
+ execute(<<-SQL.strip_heredoc)
486
+ UPDATE pg_catalog.pg_attribute
487
+ SET attnotnull = true
488
+ WHERE attrelid = #{quote(table_name)}::regclass
489
+ AND attname = #{quote(column_name)}
490
+ SQL
491
+ end
492
+ end
493
+
485
494
  def __check_constraints_for(table_name, column_name)
486
495
  __check_constraints(table_name).select { |c| c["column_name"] == column_name }
487
496
  end
@@ -7,11 +7,22 @@ require "set"
7
7
  module OnlineMigrations
8
8
  # @private
9
9
  class CommandChecker
10
+ class << self
11
+ attr_accessor :safe
12
+
13
+ def safety_assured
14
+ prev_value = safe
15
+ self.safe = true
16
+ yield
17
+ ensure
18
+ self.safe = prev_value
19
+ end
20
+ end
21
+
10
22
  attr_accessor :direction
11
23
 
12
24
  def initialize(migration)
13
25
  @migration = migration
14
- @safe = false
15
26
  @new_tables = []
16
27
  @new_columns = []
17
28
  @lock_timeout_checked = false
@@ -19,19 +30,11 @@ module OnlineMigrations
19
30
  @removed_indexes = []
20
31
  end
21
32
 
22
- def safety_assured
23
- prev_value = @safe
24
- @safe = true
25
- yield
26
- ensure
27
- @safe = prev_value
28
- end
29
-
30
33
  def check(command, *args, &block)
31
34
  check_database_version
32
35
  check_lock_timeout
33
36
 
34
- unless safe?
37
+ if !safe?
35
38
  do_check(command, *args, &block)
36
39
 
37
40
  run_custom_checks(command, args)
@@ -101,7 +104,7 @@ module OnlineMigrations
101
104
  end
102
105
 
103
106
  def safe?
104
- @safe ||
107
+ self.class.safe ||
105
108
  ENV["SAFETY_ASSURED"] ||
106
109
  (direction == :down && !OnlineMigrations.config.check_down) ||
107
110
  version <= OnlineMigrations.config.start_after
@@ -477,7 +480,7 @@ module OnlineMigrations
477
480
  bad_foreign_key: bad_foreign_key
478
481
  end
479
482
 
480
- unless options[:polymorphic]
483
+ if !options[:polymorphic]
481
484
  type = (options[:type] || (Utils.ar_version >= 5.1 ? :bigint : :integer)).to_sym
482
485
  column_name = "#{ref_name}_id"
483
486
 
@@ -507,9 +510,9 @@ module OnlineMigrations
507
510
  existing_indexes = connection.indexes(table_name)
508
511
 
509
512
  @removed_indexes.each do |removed_index|
510
- next unless removed_index.intersect?(index)
513
+ next if !removed_index.intersect?(index)
511
514
 
512
- unless existing_indexes.any? { |existing_index| removed_index.covered_by?(existing_index) }
515
+ if existing_indexes.none? { |existing_index| removed_index.covered_by?(existing_index) }
513
516
  raise_error :replace_index
514
517
  end
515
518
  end
@@ -560,7 +563,7 @@ module OnlineMigrations
560
563
  end
561
564
 
562
565
  def add_exclusion_constraint(table_name, _expression, **_options)
563
- unless new_or_small_table?(table_name)
566
+ if !new_or_small_table?(table_name)
564
567
  raise_error :add_exclusion_constraint
565
568
  end
566
569
  end
@@ -575,15 +578,15 @@ module OnlineMigrations
575
578
  end
576
579
  end
577
580
 
578
- def add_unique_key(table_name, column_name = nil, **options)
581
+ def add_unique_constraint(table_name, column_name = nil, **options)
579
582
  return if new_or_small_table?(table_name) || options[:using_index] || !column_name
580
583
 
581
584
  index_name = index_name(table_name, column_name)
582
585
 
583
- raise_error :add_unique_key,
586
+ raise_error :add_unique_constraint,
584
587
  add_index_code: command_str(:add_index, table_name, column_name, unique: true, name: index_name, algorithm: :concurrently),
585
- add_code: command_str(:add_unique_key, table_name, **options.merge(using_index: index_name)),
586
- remove_code: command_str(:remove_unique_key, table_name, column_name)
588
+ add_code: command_str(:add_unique_constraint, table_name, **options.merge(using_index: index_name)),
589
+ remove_code: command_str(:remove_unique_constraint, table_name, column_name)
587
590
  end
588
591
 
589
592
  # Implementation is from Active Record
@@ -98,7 +98,7 @@ module OnlineMigrations
98
98
 
99
99
  def invert_revert_initialize_columns_rename(args)
100
100
  _table, old_new_column_hash = args
101
- unless old_new_column_hash
101
+ if !old_new_column_hash
102
102
  raise ActiveRecord::IrreversibleMigration,
103
103
  "revert_initialize_columns_rename is only reversible if given a hash of old and new columns."
104
104
  end
@@ -107,7 +107,7 @@ module OnlineMigrations
107
107
 
108
108
  def invert_finalize_table_rename(args)
109
109
  _table_name, new_name = args
110
- unless new_name
110
+ if !new_name
111
111
  raise ActiveRecord::IrreversibleMigration,
112
112
  "finalize_table_rename is only reversible if given a new_name."
113
113
  end
@@ -115,7 +115,7 @@ module OnlineMigrations
115
115
  end
116
116
 
117
117
  def invert_revert_initialize_column_type_change(args)
118
- unless args[2]
118
+ if !args[2]
119
119
  raise ActiveRecord::IrreversibleMigration,
120
120
  "revert_initialize_column_type_change is only reversible if given a new_type."
121
121
  end
@@ -141,7 +141,7 @@ module OnlineMigrations
141
141
  end
142
142
 
143
143
  def invert_remove_text_limit_constraint(args)
144
- unless args[2]
144
+ if !args[2]
145
145
  raise ActiveRecord::IrreversibleMigration, "remove_text_limit_constraint is only reversible if given a limit."
146
146
  end
147
147
 
@@ -261,7 +261,7 @@ module OnlineMigrations
261
261
 
262
262
  private
263
263
  def ensure_supports_multiple_dbs
264
- unless Utils.supports_multiple_dbs?
264
+ if !Utils.supports_multiple_dbs?
265
265
  raise "OnlineMigrations does not support multiple databases for Active Record < 6.1"
266
266
  end
267
267
  end
@@ -438,9 +438,9 @@ class <%= migration_name %> < <%= migration_parent %>
438
438
  end
439
439
  end",
440
440
 
441
- add_unique_key:
442
- "Adding a unique key blocks reads and writes while the underlying index is being built.
443
- A safer approach is to create a unique index first, and then create a unique key using that index.
441
+ add_unique_constraint:
442
+ "Adding a unique constraint blocks reads and writes while the underlying index is being built.
443
+ A safer approach is to create a unique index first, and then create a unique constraint using that index.
444
444
 
445
445
  class <%= migration_name %>AddIndex < <%= migration_parent %>
446
446
  disable_ddl_transaction!
@@ -36,7 +36,7 @@ module OnlineMigrations
36
36
  # safety_assured { remove_column(:users, :some_column) }
37
37
  #
38
38
  def safety_assured(&block)
39
- command_checker.safety_assured(&block)
39
+ command_checker.class.safety_assured(&block)
40
40
  end
41
41
 
42
42
  # Stop running migrations.
@@ -87,7 +87,7 @@ module OnlineMigrations
87
87
  value = Arel.sql(value.call.to_s) if value.is_a?(Proc)
88
88
 
89
89
  # Ignore subqueries in conditions
90
- unless value.is_a?(Arel::Nodes::SqlLiteral) && value.to_s =~ /select\s+/i
90
+ if !value.is_a?(Arel::Nodes::SqlLiteral) || value.to_s !~ /select\s+/i
91
91
  arel_column = model.arel_table[column_name]
92
92
  if value.nil?
93
93
  arel_column.not_eq(nil)
@@ -665,7 +665,7 @@ module OnlineMigrations
665
665
  __ensure_not_in_transaction!
666
666
 
667
667
  column_name = "#{ref_name}_id"
668
- unless column_exists?(table_name, column_name)
668
+ if !column_exists?(table_name, column_name)
669
669
  type = options[:type] || (Utils.ar_version >= 5.1 ? :bigint : :integer)
670
670
  allow_null = options.fetch(:null, true)
671
671
  add_column(table_name, column_name, type, null: allow_null)
@@ -139,7 +139,7 @@ module OnlineMigrations
139
139
  private_constant :FUNCTION_CALL_RE
140
140
 
141
141
  def volatile_default?(connection, type, value)
142
- return false unless value.is_a?(Proc) || (type.to_s == "uuid" && value.is_a?(String))
142
+ return false if !(value.is_a?(Proc) || (type.to_s == "uuid" && value.is_a?(String)))
143
143
 
144
144
  value = value.call if value.is_a?(Proc)
145
145
  return false if !value.is_a?(String)
@@ -13,7 +13,13 @@ module OnlineMigrations
13
13
  stdout_logger.level = @activerecord_logger_was.level
14
14
  stdout_logger = ActiveSupport::TaggedLogging.new(stdout_logger)
15
15
 
16
- combined_logger = stdout_logger.extend(ActiveSupport::Logger.broadcast(@activerecord_logger_was))
16
+ combined_logger =
17
+ # Broadcasting logs API was changed in https://github.com/rails/rails/pull/48615.
18
+ if Utils.ar_version >= 7.1
19
+ ActiveSupport::BroadcastLogger.new(stdout_logger, @activerecord_logger_was)
20
+ else
21
+ stdout_logger.extend(ActiveSupport::Logger.broadcast(@activerecord_logger_was))
22
+ end
17
23
 
18
24
  ActiveRecord::Base.logger = combined_logger
19
25
  set_verbose_query_logs(false)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OnlineMigrations
4
- VERSION = "0.8.1"
4
+ VERSION = "0.8.2"
5
5
  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.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - fatkodima
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-04 00:00:00.000000000 Z
11
+ date: 2023-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  requirements: []
105
- rubygems_version: 3.4.6
105
+ rubygems_version: 3.4.10
106
106
  signing_key:
107
107
  specification_version: 4
108
108
  summary: Catch unsafe PostgreSQL migrations in development and run them easier in