rein 3.5.0 → 4.0.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 +5 -5
- data/CHANGELOG.md +31 -25
- data/README.md +74 -0
- data/lib/rein.rb +4 -0
- data/lib/rein/constraint/check.rb +40 -0
- data/lib/rein/constraint/exclusion.rb +61 -0
- data/lib/rein/constraint/foreign_key.rb +2 -2
- data/lib/rein/constraint/inclusion.rb +2 -2
- data/lib/rein/constraint/length.rb +4 -4
- data/lib/rein/constraint/match.rb +4 -4
- data/lib/rein/constraint/null.rb +2 -2
- data/lib/rein/constraint/numericality.rb +4 -4
- data/lib/rein/constraint/presence.rb +2 -2
- data/lib/rein/constraint/primary_key.rb +2 -2
- data/lib/rein/constraint/unique.rb +2 -2
- data/lib/rein/schema.rb +2 -2
- data/lib/rein/type/enum.rb +3 -3
- data/lib/rein/version.rb +1 -1
- data/lib/rein/view.rb +2 -2
- metadata +19 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 24623f32cadd63604381d8dad8884880eae0bd4b14e9cbe9b374e35f95bf75a1
|
4
|
+
data.tar.gz: b6dcaf5464e761520a435e4bc16c6a4476b229dd9bccae99e135931ed169acdd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff7356d2879f6e6a485d2978fdef2dafe2eb0e3e26e1ea1574dda769b0e1026f474c34f1d141ecb1ae92e2736de7348544df70fdc11445c3c39895e4b7b1aaf1
|
7
|
+
data.tar.gz: f0ce01bb2a2033370962318d8a49719763df2b5b1fbc46ffe381ba582a294a58c7dcb610bb766ca8213d70ea4f29ff06e9d479691a65f537a598e4ffff59a1f7
|
data/CHANGELOG.md
CHANGED
@@ -1,50 +1,56 @@
|
|
1
|
-
|
1
|
+
## 4.0.0 (2019-01-28)
|
2
2
|
|
3
|
-
|
3
|
+
* Add exclusion constraints
|
4
|
+
* Add check constraints
|
4
5
|
|
5
|
-
|
6
|
+
## 3.5.0 (2018-05-09)
|
6
7
|
|
7
|
-
|
8
|
+
* Add support for ActiveRecord 5.2
|
8
9
|
|
9
|
-
|
10
|
+
## 3.4.0 (2018-03-23)
|
11
|
+
|
12
|
+
* Wrap column and table names in foreign key constraints
|
10
13
|
|
11
14
|
## 3.3.0
|
12
|
-
|
15
|
+
|
16
|
+
* Add unique constraint
|
13
17
|
|
14
18
|
## 3.2.0
|
15
|
-
|
16
|
-
|
19
|
+
|
20
|
+
* Add match constraint
|
21
|
+
* Fix the rollback of change view migrations
|
17
22
|
|
18
23
|
## 3.1.0
|
19
|
-
|
24
|
+
|
25
|
+
* Add length constraint
|
20
26
|
|
21
27
|
## 3.0.0
|
22
28
|
|
23
|
-
|
24
|
-
|
25
|
-
|
29
|
+
* Dropped MySQL support
|
30
|
+
* Reversible migrations
|
31
|
+
* Add `index` option to `add_foreign_key_constraint`
|
26
32
|
|
27
33
|
## 2.1.0
|
28
34
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
35
|
+
* Add `if` option to inclusion constraints
|
36
|
+
* Add `name` option to constraints
|
37
|
+
* Add null constraint
|
38
|
+
* Ensure presence constraint enforces not null
|
33
39
|
|
34
40
|
## 2.0.0
|
35
41
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
42
|
+
* Add support for enumerated types
|
43
|
+
* Add `if` option to numericality constraints
|
44
|
+
* Add `if` option to presence constraints
|
45
|
+
* Fix a bug in presence contraints
|
40
46
|
|
41
47
|
## 1.1.0
|
42
48
|
|
43
|
-
|
44
|
-
|
45
|
-
|
49
|
+
* Update README
|
50
|
+
* Code cleanups
|
51
|
+
* Disable monkey patching in rspec
|
46
52
|
|
47
53
|
## 1.0.0
|
48
54
|
|
49
|
-
|
50
|
-
|
55
|
+
* Fix `Mysql2Adapter` for Rails 3.2
|
56
|
+
* Add `column` option to `add_primary_key`
|
data/README.md
CHANGED
@@ -21,12 +21,14 @@ advantage of reversible Rails migrations.
|
|
21
21
|
* [Constraint Types](#constraint-types)
|
22
22
|
* [Foreign Key Constraints](#foreign-key-constraints)
|
23
23
|
* [Unique Constraints](#unique-constraints)
|
24
|
+
* [Exclusion Constraints](#exclusion-constraints)
|
24
25
|
* [Inclusion Constraints](#inclusion-constraints)
|
25
26
|
* [Length Constraints](#length-constraints)
|
26
27
|
* [Match Constraints](#match-constraints)
|
27
28
|
* [Numericality Constraints](#numericality-constraints)
|
28
29
|
* [Presence Constraints](#presence-constraints)
|
29
30
|
* [Null Constraints](#null-constraints)
|
31
|
+
* [Check Constraints](#check-constraints)
|
30
32
|
* [Data Types](#data-types)
|
31
33
|
* [Enumerated Types](#enumerated-types)
|
32
34
|
* [Views](#views)
|
@@ -159,6 +161,58 @@ a transaction, then you can set the `deferrable` option to `false`:
|
|
159
161
|
add_unique_constraint :authors, :name, deferrable: false
|
160
162
|
```
|
161
163
|
|
164
|
+
### Exclusion Constraints
|
165
|
+
|
166
|
+
An exclusion constraint is a lot like a unique constraint, but more general.
|
167
|
+
Whereas a unique constraint forbids two rows from having all constrained columns be *equal*,
|
168
|
+
an exclusion constraint forbids two rows from having all constrained columns be *some relationship*,
|
169
|
+
where the relationship is up to you (and can be different for each column).
|
170
|
+
For instance you can prevent two ranges from overlapping with the `&&` operator.
|
171
|
+
You can read more in
|
172
|
+
[the Postgres docs](https://www.postgresql.org/docs/9.0/static/ddl-constraints.html#DDL-CONSTRAINTS-EXCLUSION)
|
173
|
+
or [a slideshow by the author, Jeff Davis](https://www.slideshare.net/pgconf/not-just-unique-exclusion-constraints).
|
174
|
+
|
175
|
+
For example, no two people should own copyright to a book at the same time:
|
176
|
+
|
177
|
+
```ruby
|
178
|
+
add_exclusion_constraint :book_owners, [[:book_id, '='], [:owned_during, '&&']], using: :gist
|
179
|
+
```
|
180
|
+
|
181
|
+
By default, the database checks exclusion constraints immediately (i.e. as soon as
|
182
|
+
a record is created or updated). If a record with an excluded value exists,
|
183
|
+
then the database will raise an error.
|
184
|
+
|
185
|
+
Sometimes it is necessary to wait until the end of a transaction to do the
|
186
|
+
checking (e.g. maybe you want to move the date a copyright changed hands). To do so, you
|
187
|
+
need to tell the database to *defer* checking the constraint until the end of
|
188
|
+
the current transaction:
|
189
|
+
|
190
|
+
```sql
|
191
|
+
BEGIN;
|
192
|
+
SET CONSTRAINTS book_owners_exclude DEFERRED;
|
193
|
+
UPDATE book_owners
|
194
|
+
SET owned_during = tsrange(lower(owned_during), '1943-12-22')
|
195
|
+
WHERE book_id = 1 AND owner_id = 1;
|
196
|
+
UPDATE book_owners
|
197
|
+
SET owned_during = tsrange('1943-12-22', upper(owned_during))
|
198
|
+
WHERE book_id = 1 AND owner_id = 2;
|
199
|
+
COMMIT;
|
200
|
+
```
|
201
|
+
|
202
|
+
If you *always* want to defer checking a unique constraint, then you can set
|
203
|
+
the `deferred` option to `true`:
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
add_exclusion_constraint :book_owners, [[:book_id, '='], [:owned_during, '&&']], using: :gist, deferred: true
|
207
|
+
```
|
208
|
+
|
209
|
+
If you really don't want the ability to optionally defer a unique constraint in
|
210
|
+
a transaction, then you can set the `deferrable` option to `false`:
|
211
|
+
|
212
|
+
```ruby
|
213
|
+
add_exclusion_constraint :book_owners, [[:book_id, '='], [:owned_during, '&&']], using: :gist, deferrable: false
|
214
|
+
```
|
215
|
+
|
162
216
|
### Inclusion Constraints
|
163
217
|
|
164
218
|
An inclusion constraint specifies the possible values that a column value can
|
@@ -370,6 +424,26 @@ To remove a null constraint:
|
|
370
424
|
remove_null_constraint :books, :due_date
|
371
425
|
```
|
372
426
|
|
427
|
+
### Check Constraints
|
428
|
+
|
429
|
+
A check constraint lets you enforce any predicate about the current row.
|
430
|
+
You can use this if none of the other higher-level constraint types work for you.
|
431
|
+
|
432
|
+
For example, we can add a constraint to enforce that a book's title
|
433
|
+
never starts with an "r":
|
434
|
+
|
435
|
+
```ruby
|
436
|
+
add_check_constraint :books, "substring(title FROM 1 FOR 1) IS DISTINCT FROM 'r'", name: 'no_r_titles'
|
437
|
+
```
|
438
|
+
|
439
|
+
Note these types must have a `name` option.
|
440
|
+
|
441
|
+
To remove a check constraint:
|
442
|
+
|
443
|
+
```ruby
|
444
|
+
remove_check_constraint :books, "substring(title FROM 1 FOR 1) IS DISTINCT FROM 'r'", name: 'no_r_titles'
|
445
|
+
```
|
446
|
+
|
373
447
|
## Data Types
|
374
448
|
|
375
449
|
### Enumerated Types
|
data/lib/rein.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_record'
|
2
|
+
require 'rein/constraint/check'
|
2
3
|
require 'rein/constraint/foreign_key'
|
3
4
|
require 'rein/constraint/inclusion'
|
4
5
|
require 'rein/constraint/length'
|
@@ -8,12 +9,14 @@ require 'rein/constraint/numericality'
|
|
8
9
|
require 'rein/constraint/presence'
|
9
10
|
require 'rein/constraint/primary_key'
|
10
11
|
require 'rein/constraint/unique'
|
12
|
+
require 'rein/constraint/exclusion'
|
11
13
|
require 'rein/schema'
|
12
14
|
require 'rein/type/enum'
|
13
15
|
require 'rein/view'
|
14
16
|
|
15
17
|
module ActiveRecord
|
16
18
|
class Migration # :nodoc:
|
19
|
+
include Rein::Constraint::Check
|
17
20
|
include Rein::Constraint::ForeignKey
|
18
21
|
include Rein::Constraint::Inclusion
|
19
22
|
include Rein::Constraint::Length
|
@@ -23,6 +26,7 @@ module ActiveRecord
|
|
23
26
|
include Rein::Constraint::Presence
|
24
27
|
include Rein::Constraint::PrimaryKey
|
25
28
|
include Rein::Constraint::Unique
|
29
|
+
include Rein::Constraint::Exclusion
|
26
30
|
include Rein::Schema
|
27
31
|
include Rein::Type::Enum
|
28
32
|
include Rein::View
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'active_support/inflector'
|
2
|
+
require 'rein/util'
|
3
|
+
|
4
|
+
module Rein
|
5
|
+
module Constraint
|
6
|
+
# This module contains methods for defining check constraints.
|
7
|
+
module Check
|
8
|
+
def add_check_constraint(*args)
|
9
|
+
reversible do |dir|
|
10
|
+
dir.up { _add_check_constraint(*args) }
|
11
|
+
dir.down { _remove_check_constraint(*args) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def remove_check_constraint(*args)
|
16
|
+
reversible do |dir|
|
17
|
+
dir.up { _remove_check_constraint(*args) }
|
18
|
+
dir.down { _add_check_constraint(*args) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def _add_check_constraint(table_name, predicate, options = {})
|
25
|
+
raise 'Generic CHECK constraints must have a name' unless options[:name].present?
|
26
|
+
name = Util.wrap_identifier(options[:name])
|
27
|
+
sql = "ALTER TABLE #{Util.wrap_identifier(table_name)}"
|
28
|
+
sql << " ADD CONSTRAINT #{name}"
|
29
|
+
sql << " CHECK (#{predicate})"
|
30
|
+
execute(sql)
|
31
|
+
end
|
32
|
+
|
33
|
+
def _remove_check_constraint(table_name, _predicate, options = {})
|
34
|
+
raise 'Generic CHECK constraints must have a name' unless options[:name].present?
|
35
|
+
name = Util.wrap_identifier(options[:name])
|
36
|
+
execute("ALTER TABLE #{Util.wrap_identifier(table_name)} DROP CONSTRAINT #{name}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'rein/util'
|
2
|
+
|
3
|
+
module Rein
|
4
|
+
module Constraint
|
5
|
+
# This module contains methods for defining exclusion constraints.
|
6
|
+
module Exclusion
|
7
|
+
include ActiveRecord::ConnectionAdapters::Quoting
|
8
|
+
|
9
|
+
def add_exclusion_constraint(*args)
|
10
|
+
reversible do |dir|
|
11
|
+
dir.up { _add_exclusion_constraint_adapter(*args) }
|
12
|
+
dir.down { _remove_exclusion_constraint_adapter(*args) }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def remove_exclusion_constraint(*args)
|
17
|
+
reversible do |dir|
|
18
|
+
dir.up { _remove_exclusion_constraint_adapter(*args) }
|
19
|
+
dir.down { _add_exclusion_constraint_adapter(*args) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def _add_exclusion_constraint_adapter(*args)
|
26
|
+
if args[1].is_a? Array
|
27
|
+
_add_exclusion_constraint(*args)
|
28
|
+
else
|
29
|
+
_add_exclusion_constraint(args[0], [[args[1], args[2]]], args[3] || {})
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def _remove_exclusion_constraint_adapter(*args)
|
34
|
+
if args[1].is_a? Array
|
35
|
+
_remove_exclusion_constraint(*args)
|
36
|
+
else
|
37
|
+
_remove_exclusion_constraint(args[0], [[args[1], args[2]]], args[3] || {})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def _add_exclusion_constraint(table, attributes, options = {})
|
42
|
+
name = Util.constraint_name(table, attributes.map { |att| att[0] }.join('_'), 'exclude', options)
|
43
|
+
table = Util.wrap_identifier(table)
|
44
|
+
attributes = attributes.map do |attribute|
|
45
|
+
"#{Util.wrap_identifier(attribute[0])} WITH #{attribute[1]}"
|
46
|
+
end
|
47
|
+
initially = options[:deferred] ? 'DEFERRED' : 'IMMEDIATE'
|
48
|
+
using = options[:using] ? " USING #{options[:using]}" : ''
|
49
|
+
sql = "ALTER TABLE #{table} ADD CONSTRAINT #{name} EXCLUDE#{using} (#{attributes.join(', ')})"
|
50
|
+
sql << " DEFERRABLE INITIALLY #{initially}" unless options[:deferrable] == false
|
51
|
+
execute(sql)
|
52
|
+
end
|
53
|
+
|
54
|
+
def _remove_exclusion_constraint(table, attributes, options = {})
|
55
|
+
name = Util.constraint_name(table, attributes.map { |att| att[0] }.join('_'), 'exclude', options)
|
56
|
+
table = Util.wrap_identifier(table)
|
57
|
+
execute("ALTER TABLE #{table} DROP CONSTRAINT #{name}")
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -7,14 +7,14 @@ module Rein
|
|
7
7
|
module ForeignKey
|
8
8
|
def add_foreign_key_constraint(*args)
|
9
9
|
reversible do |dir|
|
10
|
-
dir.up
|
10
|
+
dir.up { _add_foreign_key_constraint(*args) }
|
11
11
|
dir.down { _remove_foreign_key_constraint(*args) }
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
def remove_foreign_key_constraint(*args)
|
16
16
|
reversible do |dir|
|
17
|
-
dir.up
|
17
|
+
dir.up { _remove_foreign_key_constraint(*args) }
|
18
18
|
dir.down { _add_foreign_key_constraint(*args) }
|
19
19
|
end
|
20
20
|
end
|
@@ -8,14 +8,14 @@ module Rein
|
|
8
8
|
|
9
9
|
def add_inclusion_constraint(*args)
|
10
10
|
reversible do |dir|
|
11
|
-
dir.up
|
11
|
+
dir.up { _add_inclusion_constraint(*args) }
|
12
12
|
dir.down { _remove_inclusion_constraint(*args) }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def remove_inclusion_constraint(*args)
|
17
17
|
reversible do |dir|
|
18
|
-
dir.up
|
18
|
+
dir.up { _remove_inclusion_constraint(*args) }
|
19
19
|
dir.down { _add_inclusion_constraint(*args) }
|
20
20
|
end
|
21
21
|
end
|
@@ -15,14 +15,14 @@ module Rein
|
|
15
15
|
|
16
16
|
def add_length_constraint(*args)
|
17
17
|
reversible do |dir|
|
18
|
-
dir.up
|
18
|
+
dir.up { _add_length_constraint(*args) }
|
19
19
|
dir.down { _remove_length_constraint(*args) }
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def remove_length_constraint(*args)
|
24
24
|
reversible do |dir|
|
25
|
-
dir.up
|
25
|
+
dir.up { _remove_length_constraint(*args) }
|
26
26
|
dir.down { _add_length_constraint(*args) }
|
27
27
|
end
|
28
28
|
end
|
@@ -34,10 +34,10 @@ module Rein
|
|
34
34
|
table = Util.wrap_identifier(table)
|
35
35
|
attribute = Util.wrap_identifier(attribute)
|
36
36
|
attribute_length = "length(#{attribute})"
|
37
|
-
conditions = OPERATORS.slice(*options.keys).map
|
37
|
+
conditions = OPERATORS.slice(*options.keys).map do |key, operator|
|
38
38
|
value = options[key]
|
39
39
|
[attribute_length, operator, value].join(' ')
|
40
|
-
|
40
|
+
end.join(' AND ')
|
41
41
|
conditions = Util.conditions_with_if(conditions, options)
|
42
42
|
execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
|
43
43
|
end
|
@@ -13,14 +13,14 @@ module Rein
|
|
13
13
|
|
14
14
|
def add_match_constraint(*args)
|
15
15
|
reversible do |dir|
|
16
|
-
dir.up
|
16
|
+
dir.up { _add_match_constraint(*args) }
|
17
17
|
dir.down { _remove_match_constraint(*args) }
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
21
|
def remove_match_constraint(*args)
|
22
22
|
reversible do |dir|
|
23
|
-
dir.up
|
23
|
+
dir.up { _remove_match_constraint(*args) }
|
24
24
|
dir.down { _add_match_constraint(*args) }
|
25
25
|
end
|
26
26
|
end
|
@@ -31,10 +31,10 @@ module Rein
|
|
31
31
|
name = Util.constraint_name(table, attribute, 'match', options)
|
32
32
|
table = Util.wrap_identifier(table)
|
33
33
|
attribute = Util.wrap_identifier(attribute)
|
34
|
-
conditions = OPERATORS.slice(*options.keys).map
|
34
|
+
conditions = OPERATORS.slice(*options.keys).map do |key, operator|
|
35
35
|
value = options[key]
|
36
36
|
[attribute, operator, "'#{value}'"].join(' ')
|
37
|
-
|
37
|
+
end.join(' AND ')
|
38
38
|
conditions = Util.conditions_with_if(conditions, options)
|
39
39
|
execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
|
40
40
|
end
|
data/lib/rein/constraint/null.rb
CHANGED
@@ -8,14 +8,14 @@ module Rein
|
|
8
8
|
|
9
9
|
def add_null_constraint(*args)
|
10
10
|
reversible do |dir|
|
11
|
-
dir.up
|
11
|
+
dir.up { _add_null_constraint(*args) }
|
12
12
|
dir.down { _remove_null_constraint(*args) }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def remove_null_constraint(*args)
|
17
17
|
reversible do |dir|
|
18
|
-
dir.up
|
18
|
+
dir.up { _remove_null_constraint(*args) }
|
19
19
|
dir.down { _add_null_constraint(*args) }
|
20
20
|
end
|
21
21
|
end
|
@@ -15,14 +15,14 @@ module Rein
|
|
15
15
|
|
16
16
|
def add_numericality_constraint(*args)
|
17
17
|
reversible do |dir|
|
18
|
-
dir.up
|
18
|
+
dir.up { _add_numericality_constraint(*args) }
|
19
19
|
dir.down { _remove_numericality_constraint(*args) }
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def remove_numericality_constraint(*args)
|
24
24
|
reversible do |dir|
|
25
|
-
dir.up
|
25
|
+
dir.up { _remove_numericality_constraint(*args) }
|
26
26
|
dir.down { _add_numericality_constraint(*args) }
|
27
27
|
end
|
28
28
|
end
|
@@ -33,10 +33,10 @@ module Rein
|
|
33
33
|
name = Util.constraint_name(table, attribute, 'numericality', options)
|
34
34
|
table = Util.wrap_identifier(table)
|
35
35
|
attribute = Util.wrap_identifier(attribute)
|
36
|
-
conditions = OPERATORS.slice(*options.keys).map
|
36
|
+
conditions = OPERATORS.slice(*options.keys).map do |key, operator|
|
37
37
|
value = options[key]
|
38
38
|
[attribute, operator, value].join(' ')
|
39
|
-
|
39
|
+
end.join(' AND ')
|
40
40
|
conditions = Util.conditions_with_if(conditions, options)
|
41
41
|
execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
|
42
42
|
end
|
@@ -8,14 +8,14 @@ module Rein
|
|
8
8
|
|
9
9
|
def add_presence_constraint(*args)
|
10
10
|
reversible do |dir|
|
11
|
-
dir.up
|
11
|
+
dir.up { _add_presence_constraint(*args) }
|
12
12
|
dir.down { _remove_presence_constraint(*args) }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def remove_presence_constraint(*args)
|
17
17
|
reversible do |dir|
|
18
|
-
dir.up
|
18
|
+
dir.up { _remove_presence_constraint(*args) }
|
19
19
|
dir.down { _add_presence_constraint(*args) }
|
20
20
|
end
|
21
21
|
end
|
@@ -4,14 +4,14 @@ module Rein
|
|
4
4
|
module PrimaryKey
|
5
5
|
def add_primary_key(*args)
|
6
6
|
reversible do |dir|
|
7
|
-
dir.up
|
7
|
+
dir.up { _add_primary_key(*args) }
|
8
8
|
dir.down { _remove_primary_key(*args) }
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
12
|
def remove_primary_key(*args)
|
13
13
|
reversible do |dir|
|
14
|
-
dir.up
|
14
|
+
dir.up { _remove_primary_key(*args) }
|
15
15
|
dir.down { _add_primary_key(*args) }
|
16
16
|
end
|
17
17
|
end
|
@@ -8,14 +8,14 @@ module Rein
|
|
8
8
|
|
9
9
|
def add_unique_constraint(*args)
|
10
10
|
reversible do |dir|
|
11
|
-
dir.up
|
11
|
+
dir.up { _add_unique_constraint(*args) }
|
12
12
|
dir.down { _remove_unique_constraint(*args) }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def remove_unique_constraint(*args)
|
17
17
|
reversible do |dir|
|
18
|
-
dir.up
|
18
|
+
dir.up { _remove_unique_constraint(*args) }
|
19
19
|
dir.down { _add_unique_constraint(*args) }
|
20
20
|
end
|
21
21
|
end
|
data/lib/rein/schema.rb
CHANGED
@@ -3,14 +3,14 @@ module Rein
|
|
3
3
|
module Schema
|
4
4
|
def create_schema(*args)
|
5
5
|
reversible do |dir|
|
6
|
-
dir.up
|
6
|
+
dir.up { _create_schema(*args) }
|
7
7
|
dir.down { _drop_schema(*args) }
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
def drop_schema(*args)
|
12
12
|
reversible do |dir|
|
13
|
-
dir.up
|
13
|
+
dir.up { _drop_schema(*args) }
|
14
14
|
dir.down { _create_schema(*args) }
|
15
15
|
end
|
16
16
|
end
|
data/lib/rein/type/enum.rb
CHANGED
@@ -8,14 +8,14 @@ module Rein
|
|
8
8
|
|
9
9
|
def create_enum_type(*args)
|
10
10
|
reversible do |dir|
|
11
|
-
dir.up
|
11
|
+
dir.up { _create_enum_type(*args) }
|
12
12
|
dir.down { _drop_enum_type(*args) }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def drop_enum_type(*args)
|
17
17
|
reversible do |dir|
|
18
|
-
dir.up
|
18
|
+
dir.up { _drop_enum_type(*args) }
|
19
19
|
dir.down { _create_enum_type(*args) }
|
20
20
|
end
|
21
21
|
end
|
@@ -31,7 +31,7 @@ module Rein
|
|
31
31
|
execute("CREATE TYPE #{enum_name} AS ENUM (#{enum_values})")
|
32
32
|
end
|
33
33
|
|
34
|
-
def _drop_enum_type(enum_name)
|
34
|
+
def _drop_enum_type(enum_name, *)
|
35
35
|
execute("DROP TYPE #{enum_name}")
|
36
36
|
end
|
37
37
|
end
|
data/lib/rein/version.rb
CHANGED
data/lib/rein/view.rb
CHANGED
@@ -3,14 +3,14 @@ module Rein
|
|
3
3
|
module View
|
4
4
|
def create_view(*args)
|
5
5
|
reversible do |dir|
|
6
|
-
dir.up
|
6
|
+
dir.up { _create_view(*args) }
|
7
7
|
dir.down { _drop_view(*args) }
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
def drop_view(*args)
|
12
12
|
reversible do |dir|
|
13
|
-
dir.up
|
13
|
+
dir.up { _drop_view(*args) }
|
14
14
|
dir.down { _create_view(*args) }
|
15
15
|
end
|
16
16
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rein
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Bassett
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -56,84 +56,84 @@ dependencies:
|
|
56
56
|
requirements:
|
57
57
|
- - "~>"
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version:
|
59
|
+
version: 2.2.0
|
60
60
|
type: :development
|
61
61
|
prerelease: false
|
62
62
|
version_requirements: !ruby/object:Gem::Requirement
|
63
63
|
requirements:
|
64
64
|
- - "~>"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
66
|
+
version: 2.2.0
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
|
-
name:
|
68
|
+
name: pg
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
71
|
- - "~>"
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
73
|
+
version: 0.21.0
|
74
74
|
type: :development
|
75
75
|
prerelease: false
|
76
76
|
version_requirements: !ruby/object:Gem::Requirement
|
77
77
|
requirements:
|
78
78
|
- - "~>"
|
79
79
|
- !ruby/object:Gem::Version
|
80
|
-
version:
|
80
|
+
version: 0.21.0
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
|
-
name:
|
82
|
+
name: bundler
|
83
83
|
requirement: !ruby/object:Gem::Requirement
|
84
84
|
requirements:
|
85
85
|
- - "~>"
|
86
86
|
- !ruby/object:Gem::Version
|
87
|
-
version:
|
87
|
+
version: 2.0.1
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
92
|
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
94
|
+
version: 2.0.1
|
95
95
|
- !ruby/object:Gem::Dependency
|
96
96
|
name: rake
|
97
97
|
requirement: !ruby/object:Gem::Requirement
|
98
98
|
requirements:
|
99
99
|
- - "~>"
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version:
|
101
|
+
version: 12.3.2
|
102
102
|
type: :development
|
103
103
|
prerelease: false
|
104
104
|
version_requirements: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
106
|
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version:
|
108
|
+
version: 12.3.2
|
109
109
|
- !ruby/object:Gem::Dependency
|
110
110
|
name: rspec
|
111
111
|
requirement: !ruby/object:Gem::Requirement
|
112
112
|
requirements:
|
113
113
|
- - "~>"
|
114
114
|
- !ruby/object:Gem::Version
|
115
|
-
version:
|
115
|
+
version: 3.8.0
|
116
116
|
type: :development
|
117
117
|
prerelease: false
|
118
118
|
version_requirements: !ruby/object:Gem::Requirement
|
119
119
|
requirements:
|
120
120
|
- - "~>"
|
121
121
|
- !ruby/object:Gem::Version
|
122
|
-
version:
|
122
|
+
version: 3.8.0
|
123
123
|
- !ruby/object:Gem::Dependency
|
124
124
|
name: rubocop
|
125
125
|
requirement: !ruby/object:Gem::Requirement
|
126
126
|
requirements:
|
127
127
|
- - "~>"
|
128
128
|
- !ruby/object:Gem::Version
|
129
|
-
version:
|
129
|
+
version: 0.63.1
|
130
130
|
type: :development
|
131
131
|
prerelease: false
|
132
132
|
version_requirements: !ruby/object:Gem::Requirement
|
133
133
|
requirements:
|
134
134
|
- - "~>"
|
135
135
|
- !ruby/object:Gem::Version
|
136
|
-
version:
|
136
|
+
version: 0.63.1
|
137
137
|
description: Rein adds bunch of methods to your ActiveRecord migrations so you can
|
138
138
|
easily tame your database.
|
139
139
|
email: josh.bassett@gmail.com
|
@@ -145,6 +145,8 @@ files:
|
|
145
145
|
- LICENSE.md
|
146
146
|
- README.md
|
147
147
|
- lib/rein.rb
|
148
|
+
- lib/rein/constraint/check.rb
|
149
|
+
- lib/rein/constraint/exclusion.rb
|
148
150
|
- lib/rein/constraint/foreign_key.rb
|
149
151
|
- lib/rein/constraint/inclusion.rb
|
150
152
|
- lib/rein/constraint/length.rb
|
@@ -178,8 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
180
|
- !ruby/object:Gem::Version
|
179
181
|
version: '0'
|
180
182
|
requirements: []
|
181
|
-
|
182
|
-
rubygems_version: 2.6.13
|
183
|
+
rubygems_version: 3.0.0
|
183
184
|
signing_key:
|
184
185
|
specification_version: 4
|
185
186
|
summary: Database constraints made easy for ActiveRecord.
|