rein 3.0.0 → 3.1.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/CHANGELOG.md +3 -0
- data/README.md +49 -0
- data/lib/rein.rb +2 -0
- data/lib/rein/constraint/length.rb +49 -0
- data/lib/rein/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc7bf976b250a0cfaa15db1ec4a937afcdf9e6af
|
4
|
+
data.tar.gz: 79dcf97dbe8bdb932f42198675c9cc229f5f9ac3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a2353e83aeae5a7f05787725a25c553689efb27c7093315e48a900ad0ed2e35069f8c6706571cb8b41080c6e04cff484e1574e9768d4f15bf11f7f6d2458ec7
|
7
|
+
data.tar.gz: 2cfeef3a3d05f9c483309fb0585bfc2733b1862dbb0b73dbccace17f652e28a606d53553f1b3cbe7d0dbbf59eea3c501cdbeb2c5bb772198db94008ba6e2bb33
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -23,6 +23,7 @@ advantage of reversible Rails migrations.
|
|
23
23
|
* [Constraint types](#constraint-types)
|
24
24
|
* [Foreign key constraints](#foreign-key-constraints)
|
25
25
|
* [Inclusion constraints](#inclusion-constraints)
|
26
|
+
* [Length constraints](#length-constraints)
|
26
27
|
* [Numericality constraints](#numericality-constraints)
|
27
28
|
* [Presence constraints](#presence-constraints)
|
28
29
|
* [Null constraints](#null-constraints)
|
@@ -146,6 +147,54 @@ add_inclusion_constraint :books, :state,
|
|
146
147
|
name: "books_state_is_valid"
|
147
148
|
```
|
148
149
|
|
150
|
+
### Length constraints
|
151
|
+
|
152
|
+
A length constraint specifies the range of values that the length of a string
|
153
|
+
column value can take.
|
154
|
+
|
155
|
+
For example, we can ensure that the `call_number` can only ever be a
|
156
|
+
value between 1 and 255:
|
157
|
+
|
158
|
+
```ruby
|
159
|
+
add_length_constraint :books, :call_number,
|
160
|
+
greater_than_or_equal_to: 1,
|
161
|
+
less_than_or_equal_to: 255
|
162
|
+
```
|
163
|
+
|
164
|
+
Here's all the options for constraining the values:
|
165
|
+
|
166
|
+
- `equal_to`
|
167
|
+
- `not_equal_to`
|
168
|
+
- `less_than`
|
169
|
+
- `less_than_or_equal_to`
|
170
|
+
- `greater_than`
|
171
|
+
- `greater_than_or_equal_to`
|
172
|
+
|
173
|
+
You may also include an `if` option to enforce the constraint only under
|
174
|
+
certain conditions, like so:
|
175
|
+
|
176
|
+
```ruby
|
177
|
+
add_length_constraint :books, :call_number,
|
178
|
+
greater_than_or_equal_to: 1,
|
179
|
+
less_than_or_equal_to: 12,
|
180
|
+
if: "status = 'published'"
|
181
|
+
```
|
182
|
+
|
183
|
+
You may optionally provide a `name` option to customize the name:
|
184
|
+
|
185
|
+
```ruby
|
186
|
+
add_length_constraint :books, :call_number,
|
187
|
+
greater_than_or_equal_to: 1,
|
188
|
+
less_than_or_equal_to: 12,
|
189
|
+
name: "books_call_number_is_valid"
|
190
|
+
```
|
191
|
+
|
192
|
+
To remove a length constraint:
|
193
|
+
|
194
|
+
```ruby
|
195
|
+
remove_length_constraint :books, :call_number
|
196
|
+
```
|
197
|
+
|
149
198
|
### Numericality constraints
|
150
199
|
|
151
200
|
A numericality constraint specifies the range of values that a numeric column
|
data/lib/rein.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "active_record"
|
2
2
|
require "rein/constraint/foreign_key"
|
3
3
|
require "rein/constraint/inclusion"
|
4
|
+
require "rein/constraint/length"
|
4
5
|
require "rein/constraint/null"
|
5
6
|
require "rein/constraint/numericality"
|
6
7
|
require "rein/constraint/presence"
|
@@ -13,6 +14,7 @@ module ActiveRecord
|
|
13
14
|
class Migration # :nodoc:
|
14
15
|
include Rein::Constraint::ForeignKey
|
15
16
|
include Rein::Constraint::Inclusion
|
17
|
+
include Rein::Constraint::Length
|
16
18
|
include Rein::Constraint::Null
|
17
19
|
include Rein::Constraint::Numericality
|
18
20
|
include Rein::Constraint::Presence
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "rein/util"
|
2
|
+
|
3
|
+
module Rein
|
4
|
+
module Constraint
|
5
|
+
# This module contains methods for defining length constraints.
|
6
|
+
module Length
|
7
|
+
OPERATORS = {
|
8
|
+
greater_than: :>,
|
9
|
+
greater_than_or_equal_to: :>=,
|
10
|
+
equal_to: :"=",
|
11
|
+
not_equal_to: :"!=",
|
12
|
+
less_than: :<,
|
13
|
+
less_than_or_equal_to: :<=
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
def add_length_constraint(*args)
|
17
|
+
reversible do |dir|
|
18
|
+
dir.up { _add_length_constraint(*args) }
|
19
|
+
dir.down { _remove_length_constraint(*args) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def remove_length_constraint(*args)
|
24
|
+
reversible do |dir|
|
25
|
+
dir.up { _remove_length_constraint(*args) }
|
26
|
+
dir.down { _add_length_constraint(*args) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def _add_length_constraint(table, attribute, options = {})
|
33
|
+
name = Util.constraint_name(table, attribute, "length", options)
|
34
|
+
attribute_length = "length(#{attribute})"
|
35
|
+
conditions = OPERATORS.slice(*options.keys).map do |key, operator|
|
36
|
+
value = options[key]
|
37
|
+
[attribute_length, operator, value].join(" ")
|
38
|
+
end.join(" AND ")
|
39
|
+
conditions = Util.conditions_with_if(conditions, options)
|
40
|
+
execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
|
41
|
+
end
|
42
|
+
|
43
|
+
def _remove_length_constraint(table, attribute, options = {})
|
44
|
+
name = Util.constraint_name(table, attribute, "length", options)
|
45
|
+
execute("ALTER TABLE #{table} DROP CONSTRAINT #{name}")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/rein/version.rb
CHANGED
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: 3.
|
4
|
+
version: 3.1.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: 2017-
|
11
|
+
date: 2017-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- lib/rein.rb
|
148
148
|
- lib/rein/constraint/foreign_key.rb
|
149
149
|
- lib/rein/constraint/inclusion.rb
|
150
|
+
- lib/rein/constraint/length.rb
|
150
151
|
- lib/rein/constraint/null.rb
|
151
152
|
- lib/rein/constraint/numericality.rb
|
152
153
|
- lib/rein/constraint/presence.rb
|
@@ -176,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
176
177
|
version: '0'
|
177
178
|
requirements: []
|
178
179
|
rubyforge_project:
|
179
|
-
rubygems_version: 2.
|
180
|
+
rubygems_version: 2.5.2
|
180
181
|
signing_key:
|
181
182
|
specification_version: 4
|
182
183
|
summary: Database constraints made easy for ActiveRecord.
|