strong_migrations 0.7.9 → 0.8.0

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: c2fb3fbcc5caf98759ebe2ef05a4ef011eca91924e479647d36e2b261baf2c8e
4
- data.tar.gz: '0118bd4e05814f2d531a659a724237080763843bd6cb3ff0b880447348004585'
3
+ metadata.gz: 1f885cc0a8b0fb30e3bc4d000e82584fdf3850943563b4b426d3cfc39d70015c
4
+ data.tar.gz: d0dd29ea45ccc3b7c571e8bf03fa98c401d5489d1f5459488a0eff411cf6880e
5
5
  SHA512:
6
- metadata.gz: 7a04ea74876b44c645c9cba04c2f7b4932fcc0637eedd78b544dadf40272c84fb0461420e66c49c991c214f5d36b53acbface0347af25cb65c1e9c1251375886
7
- data.tar.gz: 8e97437c5eae3b3aa6508e08c21aa8caf648a03989e621d37c165d1a2412a3cc67784d0923d47e7f814475bb000c6e68e93bf5ce6ef5dbd83f03fc399bb85b4c
6
+ metadata.gz: c03a023d4c593d2868e524ca0f3e7ebd93e07e087e02f0d7090210b00fdb1fdc50d2abb74ab7df4131bddc6052fc5b9c10ce902ede8c708927476e40ad49d07f
7
+ data.tar.gz: 479e34db0101a15e1db1a593f01773da5665baa5cda3403ad32ea58dca00a0d0faee0ef813cf1975b7e9f99f1591e7f4f2be5c456c96fd6ae4633b48b6a0b3b4
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.8.0 (2022-02-09)
2
+
3
+ - Fixed error with versioned schema with Active Record 7.0.2+
4
+ - Dropped support for Ruby < 2.6 and Active Record < 5.2
5
+
1
6
  ## 0.7.9 (2021-12-15)
2
7
 
3
8
  - Fixed error with multiple databases with Active Record 7
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 Bob Remeika and David Waller, 2015-2021 Andrew Kane
1
+ Copyright (c) 2013 Bob Remeika and David Waller, 2015-2022 Andrew Kane
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -15,7 +15,7 @@ Supports for PostgreSQL, MySQL, and MariaDB
15
15
  Add this line to your application’s Gemfile:
16
16
 
17
17
  ```ruby
18
- gem 'strong_migrations'
18
+ gem "strong_migrations"
19
19
  ```
20
20
 
21
21
  And run:
@@ -119,6 +119,7 @@ end
119
119
  ```
120
120
 
121
121
  4. Deploy and run migration
122
+ 5. Remove the line added in step 1
122
123
 
123
124
  ### Adding a column with a default value
124
125
 
@@ -540,9 +541,7 @@ end
540
541
 
541
542
  #### Good
542
543
 
543
- Add the foreign key without validating existing rows, then validate them in a separate migration.
544
-
545
- For Rails 5.2+, use:
544
+ Add the foreign key without validating existing rows:
546
545
 
547
546
  ```ruby
548
547
  class AddForeignKeyOnUsers < ActiveRecord::Migration[7.0]
@@ -552,7 +551,7 @@ class AddForeignKeyOnUsers < ActiveRecord::Migration[7.0]
552
551
  end
553
552
  ```
554
553
 
555
- Then:
554
+ Then validate them in a separate migration.
556
555
 
557
556
  ```ruby
558
557
  class ValidateForeignKeyOnUsers < ActiveRecord::Migration[7.0]
@@ -562,30 +561,6 @@ class ValidateForeignKeyOnUsers < ActiveRecord::Migration[7.0]
562
561
  end
563
562
  ```
564
563
 
565
- For Rails < 5.2, use:
566
-
567
- ```ruby
568
- class AddForeignKeyOnUsers < ActiveRecord::Migration[5.1]
569
- def change
570
- safety_assured do
571
- execute 'ALTER TABLE "users" ADD CONSTRAINT "fk_rails_c1e9b98e31" FOREIGN KEY ("order_id") REFERENCES "orders" ("id") NOT VALID'
572
- end
573
- end
574
- end
575
- ```
576
-
577
- Then:
578
-
579
- ```ruby
580
- class ValidateForeignKeyOnUsers < ActiveRecord::Migration[5.1]
581
- def change
582
- safety_assured do
583
- execute 'ALTER TABLE "users" VALIDATE CONSTRAINT "fk_rails_c1e9b98e31"'
584
- end
585
- end
586
- end
587
- ```
588
-
589
564
  ### Adding a json column
590
565
 
591
566
  #### Bad
@@ -86,8 +86,7 @@ module StrongMigrations
86
86
  options ||= {}
87
87
  default = options[:default]
88
88
 
89
- if !default.nil? && !((postgresql? && postgresql_version >= Gem::Version.new("11")) || (mysql? && mysql_version >= Gem::Version.new("8.0.12")) || (mariadb? && mariadb_version >= Gem::Version.new("10.3.2")))
90
-
89
+ if !default.nil? && !add_column_default_safe?
91
90
  if options[:null] == false
92
91
  options = options.except(:null)
93
92
  append = "
@@ -230,8 +229,10 @@ Then add the foreign key in separate migrations."
230
229
  validate_code = constraint_str("ALTER TABLE %s VALIDATE CONSTRAINT %s", [table, constraint_name])
231
230
  remove_code = constraint_str("ALTER TABLE %s DROP CONSTRAINT %s", [table, constraint_name])
232
231
 
232
+ constraint_methods = ar_version >= 6.1
233
+
233
234
  validate_constraint_code =
234
- if ar_version >= 6.1
235
+ if constraint_methods
235
236
  String.new(command_str(:validate_check_constraint, [table, {name: constraint_name}]))
236
237
  else
237
238
  String.new(safety_assured_str(validate_code))
@@ -242,7 +243,7 @@ Then add the foreign key in separate migrations."
242
243
 
243
244
  validate_constraint_code << "\n #{command_str(:change_column_null, change_args)}"
244
245
 
245
- if ar_version >= 6.1
246
+ if constraint_methods
246
247
  validate_constraint_code << "\n #{command_str(:remove_check_constraint, [table, {name: constraint_name}])}"
247
248
  else
248
249
  validate_constraint_code << "\n #{safety_assured_str(remove_code)}"
@@ -252,7 +253,7 @@ Then add the foreign key in separate migrations."
252
253
  return safe_change_column_null(add_code, validate_code, change_args, remove_code) if StrongMigrations.safe_by_default
253
254
 
254
255
  add_constraint_code =
255
- if ar_version >= 6.1
256
+ if constraint_methods
256
257
  # only quote when needed
257
258
  expr_column = column.to_s =~ /\A[a-z0-9_]+\z/ ? column : connection.quote_column_name(column)
258
259
  command_str(:add_check_constraint, [table, "#{expr_column} IS NOT NULL", {name: constraint_name, validate: false}])
@@ -275,32 +276,14 @@ Then add the foreign key in separate migrations."
275
276
  from_table, to_table, options = args
276
277
  options ||= {}
277
278
 
278
- # always validated before 5.2
279
- validate = options.fetch(:validate, true) || ar_version < 5.2
279
+ validate = options.fetch(:validate, true)
280
280
 
281
281
  if postgresql? && validate
282
- if ar_version < 5.2
283
- # fk name logic from rails
284
- primary_key = options[:primary_key] || "id"
285
- column = options[:column] || "#{to_table.to_s.singularize}_id"
286
- hashed_identifier = Digest::SHA256.hexdigest("#{from_table}_#{column}_fk").first(10)
287
- fk_name = options[:name] || "fk_rails_#{hashed_identifier}"
288
-
289
- add_code = constraint_str("ALTER TABLE %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s) NOT VALID", [from_table, fk_name, column, to_table, primary_key])
290
- validate_code = constraint_str("ALTER TABLE %s VALIDATE CONSTRAINT %s", [from_table, fk_name])
291
-
292
- return safe_add_foreign_key_code(from_table, to_table, add_code, validate_code) if StrongMigrations.safe_by_default
293
-
294
- raise_error :add_foreign_key,
295
- add_foreign_key_code: safety_assured_str(add_code),
296
- validate_foreign_key_code: safety_assured_str(validate_code)
297
- else
298
- return safe_add_foreign_key(from_table, to_table, options) if StrongMigrations.safe_by_default
282
+ return safe_add_foreign_key(from_table, to_table, options) if StrongMigrations.safe_by_default
299
283
 
300
- raise_error :add_foreign_key,
301
- add_foreign_key_code: command_str("add_foreign_key", [from_table, to_table, options.merge(validate: false)]),
302
- validate_foreign_key_code: command_str("validate_foreign_key", [from_table, to_table])
303
- end
284
+ raise_error :add_foreign_key,
285
+ add_foreign_key_code: command_str("add_foreign_key", [from_table, to_table, options.merge(validate: false)]),
286
+ validate_foreign_key_code: command_str("validate_foreign_key", [from_table, to_table])
304
287
  end
305
288
  when :validate_foreign_key
306
289
  if postgresql? && writes_blocked?
@@ -598,5 +581,17 @@ Then add the foreign key in separate migrations."
598
581
  def new_table?(table)
599
582
  @new_tables.include?(table.to_s)
600
583
  end
584
+
585
+ def add_column_default_safe?
586
+ if postgresql?
587
+ postgresql_version >= Gem::Version.new("11")
588
+ elsif mysql?
589
+ mysql_version >= Gem::Version.new("8.0.12")
590
+ elsif mariadb?
591
+ mariadb_version >= Gem::Version.new("10.3.2")
592
+ else
593
+ false
594
+ end
595
+ end
601
596
  end
602
597
  end
@@ -9,6 +9,9 @@ module StrongMigrations
9
9
  def method_missing(method, *args)
10
10
  return super if is_a?(ActiveRecord::Schema)
11
11
 
12
+ # Active Record 7.0.2+ versioned schema
13
+ return super if defined?(ActiveRecord::Schema::Definition) && is_a?(ActiveRecord::Schema::Definition)
14
+
12
15
  strong_migrations_checker.perform(method, *args) do
13
16
  super
14
17
  end
@@ -56,21 +56,6 @@ module StrongMigrations
56
56
  end
57
57
  end
58
58
 
59
- def safe_add_foreign_key_code(from_table, to_table, add_code, validate_code)
60
- @migration.reversible do |dir|
61
- dir.up do
62
- @migration.safety_assured do
63
- @migration.execute(add_code)
64
- disable_transaction
65
- @migration.execute(validate_code)
66
- end
67
- end
68
- dir.down do
69
- @migration.remove_foreign_key(from_table, to_table)
70
- end
71
- end
72
- end
73
-
74
59
  def safe_add_check_constraint(table, expression, add_options, validate_options)
75
60
  @migration.reversible do |dir|
76
61
  dir.up do
@@ -1,3 +1,3 @@
1
1
  module StrongMigrations
2
- VERSION = "0.7.9"
2
+ VERSION = "0.8.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strong_migrations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.9
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-12-16 00:00:00.000000000 Z
13
+ date: 2022-02-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '5'
21
+ version: '5.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: '5'
28
+ version: '5.2'
29
29
  description:
30
30
  email:
31
31
  - andrew@ankane.org
@@ -61,14 +61,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
61
  requirements:
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: '2.4'
64
+ version: '2.6'
65
65
  required_rubygems_version: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  requirements: []
71
- rubygems_version: 3.1.6
71
+ rubygems_version: 3.3.3
72
72
  signing_key:
73
73
  specification_version: 4
74
74
  summary: Catch unsafe migrations in development