nandi 0.9.0 → 0.10.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 +4 -4
- data/README.md +10 -5
- data/lib/nandi/formatting.rb +1 -1
- data/lib/nandi/instructions.rb +2 -0
- data/lib/nandi/instructions/add_index.rb +8 -3
- data/lib/nandi/instructions/add_reference.rb +24 -0
- data/lib/nandi/instructions/remove_reference.rb +23 -0
- data/lib/nandi/migration.rb +27 -1
- data/lib/nandi/renderers/active_record/instructions.rb +12 -0
- data/lib/nandi/validation.rb +1 -0
- data/lib/nandi/validation/add_reference_validator.rb +50 -0
- data/lib/nandi/validation/each_validator.rb +2 -0
- data/lib/nandi/version.rb +1 -1
- data/lib/templates/nandi/renderers/active_record/instructions/add_reference/show.rb.erb +5 -0
- data/lib/templates/nandi/renderers/active_record/instructions/remove_reference/show.rb.erb +5 -0
- metadata +21 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff51dca733bf2e4a5bff9ff71ac930c6d849fa734106a31b1244777fb25db9c0
|
4
|
+
data.tar.gz: ceeaebbaee681e1a4e6e857ec32289d59d821b9c627f899b371b607c214b077a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa53ecf85370d256a09197547d0d99ceb4a3f731620f25341ea05b44364749ba452a3f375554f180879426b1b757f0b551cca1e86ede08f755070adcb62a879f
|
7
|
+
data.tar.gz: 80f8945b42a0931dced7e02e83ff0c43e4173009d9d5e6f74c876f18f5fe037280488cd524fce8683301001a86eacdcc9df6674ea649ef1ae71f2b9a1fa6c2f5
|
data/README.md
CHANGED
@@ -202,10 +202,10 @@ class AddReferenceOnFoosToBars < ActiveRecord::Migration[5.2]
|
|
202
202
|
set_statement_timeout(1_500)
|
203
203
|
|
204
204
|
def up
|
205
|
-
|
205
|
+
add_column(:foos, :bar_id, :bigint)
|
206
206
|
end
|
207
207
|
def down
|
208
|
-
|
208
|
+
remove_column(:foos, :bar_id)
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
@@ -268,10 +268,9 @@ Add a foreign key constraint. The generated SQL will include the NOT VALID param
|
|
268
268
|
### `#add_index(table, fields, **kwargs)`
|
269
269
|
Adds a new index to the database.
|
270
270
|
|
271
|
-
Nandi will
|
272
|
-
|
271
|
+
Nandi will
|
273
272
|
- add the `CONCURRENTLY` option, which means the change takes a less restrictive lock at the cost of not running in a DDL transaction
|
274
|
-
-
|
273
|
+
- default to the `BTREE` index type, as it is commonly a good fit.
|
275
274
|
|
276
275
|
Because index creation is particularly failure-prone, and because we cannot run in a transaction and therefore risk partially applied migrations that (in a Rails environment) require manual intervention, Nandi Validates that, if there is a add_index statement in the migration, it must be the only statement.
|
277
276
|
|
@@ -286,6 +285,12 @@ create_table :widgets do |t|
|
|
286
285
|
end
|
287
286
|
```
|
288
287
|
|
288
|
+
### `#add_reference(table, ref_name, **extra_args)`
|
289
|
+
Adds a new reference column. Nandi will validate that the foreign key flag is not set to true; use `add_foreign_key` and `validate_foreign_key` instead! Nandi will also set the `index: false` flag, as index creation is unsafe unless done concurrently in a separate migration.
|
290
|
+
|
291
|
+
### `#remove_reference(table, ref_name, **extra_args)`
|
292
|
+
Removes a reference column.
|
293
|
+
|
289
294
|
### `#remove_column(table, name, **extra_args)`
|
290
295
|
Remove an existing column.
|
291
296
|
|
data/lib/nandi/formatting.rb
CHANGED
data/lib/nandi/instructions.rb
CHANGED
@@ -5,6 +5,8 @@ require "nandi/instructions/remove_index"
|
|
5
5
|
require "nandi/instructions/create_table"
|
6
6
|
require "nandi/instructions/drop_table"
|
7
7
|
require "nandi/instructions/add_column"
|
8
|
+
require "nandi/instructions/add_reference"
|
9
|
+
require "nandi/instructions/remove_reference"
|
8
10
|
require "nandi/instructions/remove_column"
|
9
11
|
require "nandi/instructions/add_foreign_key"
|
10
12
|
require "nandi/instructions/drop_constraint"
|
@@ -21,11 +21,10 @@ module Nandi
|
|
21
21
|
name: name,
|
22
22
|
|
23
23
|
# Overrides and extra options
|
24
|
-
|
24
|
+
**extra_args_with_default_index_type,
|
25
25
|
|
26
26
|
# Mandatory values
|
27
27
|
algorithm: :concurrently,
|
28
|
-
using: :btree,
|
29
28
|
}
|
30
29
|
end
|
31
30
|
|
@@ -38,13 +37,19 @@ module Nandi
|
|
38
37
|
private
|
39
38
|
|
40
39
|
def name
|
41
|
-
:"idx_#{table
|
40
|
+
:"idx_#{table}_on_#{field_names}"
|
42
41
|
end
|
43
42
|
|
44
43
|
def field_names
|
45
44
|
field_names = fields.respond_to?(:map) ? fields.map(&:to_s).join("_") : fields
|
46
45
|
field_names.to_s.scan(/\w+/).join("_")
|
47
46
|
end
|
47
|
+
|
48
|
+
def extra_args_with_default_index_type
|
49
|
+
{
|
50
|
+
using: :btree,
|
51
|
+
}.merge(@extra_args)
|
52
|
+
end
|
48
53
|
end
|
49
54
|
end
|
50
55
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nandi
|
4
|
+
module Instructions
|
5
|
+
class AddReference
|
6
|
+
DEFAULT_EXTRA_ARGS = { index: false }.freeze
|
7
|
+
attr_reader :table, :ref_name, :extra_args
|
8
|
+
|
9
|
+
def initialize(table:, ref_name:, **kwargs)
|
10
|
+
@table = table
|
11
|
+
@ref_name = ref_name
|
12
|
+
@extra_args = DEFAULT_EXTRA_ARGS.merge(kwargs)
|
13
|
+
end
|
14
|
+
|
15
|
+
def procedure
|
16
|
+
:add_reference
|
17
|
+
end
|
18
|
+
|
19
|
+
def lock
|
20
|
+
Nandi::Migration::LockWeights::ACCESS_EXCLUSIVE
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nandi
|
4
|
+
module Instructions
|
5
|
+
class RemoveReference
|
6
|
+
attr_reader :table, :ref_name, :extra_args
|
7
|
+
|
8
|
+
def initialize(table:, ref_name:, **kwargs)
|
9
|
+
@table = table
|
10
|
+
@ref_name = ref_name
|
11
|
+
@extra_args = kwargs
|
12
|
+
end
|
13
|
+
|
14
|
+
def procedure
|
15
|
+
:remove_reference
|
16
|
+
end
|
17
|
+
|
18
|
+
def lock
|
19
|
+
Nandi::Migration::LockWeights::ACCESS_EXCLUSIVE
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/nandi/migration.rb
CHANGED
@@ -43,6 +43,7 @@ module Nandi
|
|
43
43
|
|
44
44
|
class << self
|
45
45
|
attr_reader :lock_timeout, :statement_timeout
|
46
|
+
|
46
47
|
# For sake both of correspondence with Postgres syntax and familiarity
|
47
48
|
# with activerecord-safe_migrations's identically named macros, we
|
48
49
|
# disable this cop.
|
@@ -111,7 +112,7 @@ module Nandi
|
|
111
112
|
# Nandi will:
|
112
113
|
# * add the `CONCURRENTLY` option, which means the change takes a less
|
113
114
|
# restrictive lock at the cost of not running in a DDL transaction
|
114
|
-
# *
|
115
|
+
# * default to the `BTREE` index type, as it is commonly a good fit.
|
115
116
|
#
|
116
117
|
# Because index creation is particularly failure-prone, and because
|
117
118
|
# we cannot run in a transaction and therefore risk partially applied
|
@@ -188,6 +189,31 @@ module Nandi
|
|
188
189
|
)
|
189
190
|
end
|
190
191
|
|
192
|
+
# Adds a new reference column. Nandi will validate that the foreign key flag
|
193
|
+
# is not set to true; use `add_foreign_key` and `validate_foreign_key` instead!
|
194
|
+
# @param table [Symbol, String] The name of the table to add the column to
|
195
|
+
# @param ref_name [Symbol, String] The referenced column name
|
196
|
+
# @param kwargs [Hash] Arbitrary options to be passed to the backend.
|
197
|
+
def add_reference(table, ref_name, **kwargs)
|
198
|
+
current_instructions << Instructions::AddReference.new(
|
199
|
+
table: table,
|
200
|
+
ref_name: ref_name,
|
201
|
+
**kwargs,
|
202
|
+
)
|
203
|
+
end
|
204
|
+
|
205
|
+
# Removes a reference column.
|
206
|
+
# @param table [Symbol, String] The name of the table to remove the reference from
|
207
|
+
# @param ref_name [Symbol, String] The referenced column name
|
208
|
+
# @param kwargs [Hash] Arbitrary options to be passed to the backend.
|
209
|
+
def remove_reference(table, ref_name, **kwargs)
|
210
|
+
current_instructions << Instructions::RemoveReference.new(
|
211
|
+
table: table,
|
212
|
+
ref_name: ref_name,
|
213
|
+
**kwargs,
|
214
|
+
)
|
215
|
+
end
|
216
|
+
|
191
217
|
# Remove an existing column.
|
192
218
|
# @param table [Symbol, String] The name of the table to remove the column
|
193
219
|
# from.
|
@@ -82,6 +82,18 @@ module Nandi
|
|
82
82
|
formatted_property :extra_args
|
83
83
|
end
|
84
84
|
|
85
|
+
class AddReferenceCell < Base
|
86
|
+
formatted_property :table
|
87
|
+
formatted_property :ref_name
|
88
|
+
formatted_property :extra_args
|
89
|
+
end
|
90
|
+
|
91
|
+
class RemoveReferenceCell < Base
|
92
|
+
formatted_property :table
|
93
|
+
formatted_property :ref_name
|
94
|
+
formatted_property :extra_args
|
95
|
+
end
|
96
|
+
|
85
97
|
class RemoveColumnCell < Base
|
86
98
|
formatted_property :table
|
87
99
|
formatted_property :name
|
data/lib/nandi/validation.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "nandi/validation/failure_helpers"
|
4
|
+
|
5
|
+
module Nandi
|
6
|
+
module Validation
|
7
|
+
class AddReferenceValidator
|
8
|
+
include Nandi::Validation::FailureHelpers
|
9
|
+
|
10
|
+
def self.call(instruction)
|
11
|
+
new(instruction).call
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(instruction)
|
15
|
+
@instruction = instruction
|
16
|
+
end
|
17
|
+
|
18
|
+
def call
|
19
|
+
foreign_key = instruction.extra_args.fetch(:foreign_key, false)
|
20
|
+
index = instruction.extra_args.fetch(:index, false)
|
21
|
+
|
22
|
+
collect_errors(
|
23
|
+
assert(
|
24
|
+
!foreign_key,
|
25
|
+
foreign_key_message,
|
26
|
+
),
|
27
|
+
assert(
|
28
|
+
!index,
|
29
|
+
index_message,
|
30
|
+
),
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def index_message
|
37
|
+
"Indexing a reference column on creation can make the table unavailable." \
|
38
|
+
"Use the `add_index` method in a separate migration to index the column."
|
39
|
+
end
|
40
|
+
|
41
|
+
def foreign_key_message
|
42
|
+
"Adding a foreign key constraint must be done in two separate migrations. " \
|
43
|
+
"Use the `add_foreign_key` and `validate_foreign_key` methods, or the " \
|
44
|
+
"nandi:foreign_key generator, to do this."
|
45
|
+
end
|
46
|
+
|
47
|
+
attr_reader :instruction
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/nandi/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nandi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GoCardless Engineering
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -100,28 +100,28 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 2.
|
103
|
+
version: 2.15.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 2.
|
110
|
+
version: 2.15.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: pry-byebug
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 3.
|
117
|
+
version: 3.9.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 3.
|
124
|
+
version: 3.9.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rails
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,22 +140,22 @@ dependencies:
|
|
140
140
|
name: rake
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- - "~>"
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '12.3'
|
146
143
|
- - ">="
|
147
144
|
- !ruby/object:Gem::Version
|
148
145
|
version: 12.3.3
|
146
|
+
- - "~>"
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '13.0'
|
149
149
|
type: :development
|
150
150
|
prerelease: false
|
151
151
|
version_requirements: !ruby/object:Gem::Requirement
|
152
152
|
requirements:
|
153
|
-
- - "~>"
|
154
|
-
- !ruby/object:Gem::Version
|
155
|
-
version: '12.3'
|
156
153
|
- - ">="
|
157
154
|
- !ruby/object:Gem::Version
|
158
155
|
version: 12.3.3
|
156
|
+
- - "~>"
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '13.0'
|
159
159
|
- !ruby/object:Gem::Dependency
|
160
160
|
name: rspec
|
161
161
|
requirement: !ruby/object:Gem::Requirement
|
@@ -190,14 +190,14 @@ dependencies:
|
|
190
190
|
requirements:
|
191
191
|
- - "~>"
|
192
192
|
- !ruby/object:Gem::Version
|
193
|
-
version: '0
|
193
|
+
version: '1.0'
|
194
194
|
type: :development
|
195
195
|
prerelease: false
|
196
196
|
version_requirements: !ruby/object:Gem::Requirement
|
197
197
|
requirements:
|
198
198
|
- - "~>"
|
199
199
|
- !ruby/object:Gem::Version
|
200
|
-
version: '0
|
200
|
+
version: '1.0'
|
201
201
|
- !ruby/object:Gem::Dependency
|
202
202
|
name: yard
|
203
203
|
requirement: !ruby/object:Gem::Requirement
|
@@ -252,6 +252,7 @@ files:
|
|
252
252
|
- lib/nandi/instructions/add_column.rb
|
253
253
|
- lib/nandi/instructions/add_foreign_key.rb
|
254
254
|
- lib/nandi/instructions/add_index.rb
|
255
|
+
- lib/nandi/instructions/add_reference.rb
|
255
256
|
- lib/nandi/instructions/change_column_default.rb
|
256
257
|
- lib/nandi/instructions/create_table.rb
|
257
258
|
- lib/nandi/instructions/drop_constraint.rb
|
@@ -260,6 +261,7 @@ files:
|
|
260
261
|
- lib/nandi/instructions/remove_column.rb
|
261
262
|
- lib/nandi/instructions/remove_index.rb
|
262
263
|
- lib/nandi/instructions/remove_not_null_constraint.rb
|
264
|
+
- lib/nandi/instructions/remove_reference.rb
|
263
265
|
- lib/nandi/instructions/validate_constraint.rb
|
264
266
|
- lib/nandi/lockfile.rb
|
265
267
|
- lib/nandi/migration.rb
|
@@ -273,6 +275,7 @@ files:
|
|
273
275
|
- lib/nandi/timeout_policies/concurrent.rb
|
274
276
|
- lib/nandi/validation.rb
|
275
277
|
- lib/nandi/validation/add_column_validator.rb
|
278
|
+
- lib/nandi/validation/add_reference_validator.rb
|
276
279
|
- lib/nandi/validation/each_validator.rb
|
277
280
|
- lib/nandi/validation/failure_helpers.rb
|
278
281
|
- lib/nandi/validation/remove_index_validator.rb
|
@@ -285,6 +288,7 @@ files:
|
|
285
288
|
- lib/templates/nandi/renderers/active_record/instructions/add_column/show.rb.erb
|
286
289
|
- lib/templates/nandi/renderers/active_record/instructions/add_foreign_key/show.rb.erb
|
287
290
|
- lib/templates/nandi/renderers/active_record/instructions/add_index/show.rb.erb
|
291
|
+
- lib/templates/nandi/renderers/active_record/instructions/add_reference/show.rb.erb
|
288
292
|
- lib/templates/nandi/renderers/active_record/instructions/change_column_default/show.rb.erb
|
289
293
|
- lib/templates/nandi/renderers/active_record/instructions/create_table/show.rb.erb
|
290
294
|
- lib/templates/nandi/renderers/active_record/instructions/drop_constraint/show.rb.erb
|
@@ -293,6 +297,7 @@ files:
|
|
293
297
|
- lib/templates/nandi/renderers/active_record/instructions/remove_column/show.rb.erb
|
294
298
|
- lib/templates/nandi/renderers/active_record/instructions/remove_index/show.rb.erb
|
295
299
|
- lib/templates/nandi/renderers/active_record/instructions/remove_not_null_constraint/show.rb.erb
|
300
|
+
- lib/templates/nandi/renderers/active_record/instructions/remove_reference/show.rb.erb
|
296
301
|
- lib/templates/nandi/renderers/active_record/instructions/validate_constraint/show.rb.erb
|
297
302
|
homepage: https://github.com/gocardless/nandi
|
298
303
|
licenses:
|
@@ -306,14 +311,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
306
311
|
requirements:
|
307
312
|
- - ">="
|
308
313
|
- !ruby/object:Gem::Version
|
309
|
-
version:
|
314
|
+
version: 2.4.0
|
310
315
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
311
316
|
requirements:
|
312
317
|
- - ">="
|
313
318
|
- !ruby/object:Gem::Version
|
314
319
|
version: '0'
|
315
320
|
requirements: []
|
316
|
-
rubygems_version: 3.
|
321
|
+
rubygems_version: 3.1.2
|
317
322
|
signing_key:
|
318
323
|
specification_version: 4
|
319
324
|
summary: Fear-free migrations for PostgreSQL
|