schema_validations 2.2.0 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -0
- data/gemfiles/activerecord-5.0/Gemfile.base +1 -1
- data/lib/schema_validations.rb +1 -0
- data/lib/schema_validations/active_record/validations.rb +6 -1
- data/lib/schema_validations/validators/not_nil_validator.rb +11 -0
- data/lib/schema_validations/version.rb +1 -1
- data/spec/validations_spec.rb +135 -72
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d32813f578be832c807834e301af6646a5de2e8
|
4
|
+
data.tar.gz: 8f6d05bc4a8ee9230d2db146823ffa87ac2b16a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e41b110b12a186b3cacce1280ae74279e83b8b8be5296cdcedd43fe27fa258609ce79226b6b8c9cf0b034ac78633c319d696a76c6cc67d119119defb396edabd
|
7
|
+
data.tar.gz: ae10f5ffc2434e9e0f4470225fed144f37bc217864f487c8b391df20836d43f42029136a75213b4117623199ec967a97f8f97f87bb804038885becdb2f090e22
|
data/README.md
CHANGED
@@ -187,6 +187,11 @@ Earlier versions of SchemaValidations supported:
|
|
187
187
|
|
188
188
|
## Release Notes
|
189
189
|
|
190
|
+
### 2.2.1
|
191
|
+
|
192
|
+
* Bug fix: don't create presence validation for `null: false` with a
|
193
|
+
default defined (#18, #49)
|
194
|
+
|
190
195
|
### 2.2.0
|
191
196
|
|
192
197
|
* Works with AR 5.0. Thanks to [@plicjo](https://github.coms/plicjo).
|
data/lib/schema_validations.rb
CHANGED
@@ -123,7 +123,12 @@ module SchemaValidations
|
|
123
123
|
if datatype == :boolean
|
124
124
|
validate_logged :validates_inclusion_of, name, :in => [true, false], :message => :blank
|
125
125
|
else
|
126
|
-
|
126
|
+
if !column.default.nil? && column.default.blank?
|
127
|
+
validate_logged :validates_with, SchemaValidations::Validators::NotNilValidator, attributes: [name]
|
128
|
+
else
|
129
|
+
# Validate presence
|
130
|
+
validate_logged :validates_presence_of, name
|
131
|
+
end
|
127
132
|
end
|
128
133
|
end
|
129
134
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module SchemaValidations
|
2
|
+
module Validators
|
3
|
+
# Validates that the field is not nil?
|
4
|
+
# (Unlike the standard PresenceValidator which uses #blank?)
|
5
|
+
class NotNilValidator < ActiveModel::EachValidator
|
6
|
+
def validate_each(record, attr_name, value)
|
7
|
+
record.errors.add(attr_name, :blank, options) if value.nil?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/spec/validations_spec.rb
CHANGED
@@ -5,34 +5,34 @@ describe "Validations" do
|
|
5
5
|
before(:each) do
|
6
6
|
ActiveRecord::Schema.define do
|
7
7
|
|
8
|
-
create_table :articles, :
|
9
|
-
t.string :title, :
|
10
|
-
t.text :content, :
|
8
|
+
create_table :articles, force: true do |t|
|
9
|
+
t.string :title, limit: 50
|
10
|
+
t.text :content, null: false
|
11
11
|
t.integer :state
|
12
12
|
t.integer :votes
|
13
|
-
t.float :average_mark, :
|
14
|
-
t.boolean :active, :
|
15
|
-
t.decimal :max10, :
|
16
|
-
t.decimal :arbitrary, :
|
17
|
-
t.decimal :max100, :
|
13
|
+
t.float :average_mark, null: false
|
14
|
+
t.boolean :active, null: false
|
15
|
+
t.decimal :max10, precision: 2, scale: 1
|
16
|
+
t.decimal :arbitrary, precision: nil, scale: nil
|
17
|
+
t.decimal :max100, precision: 2, scale: nil
|
18
18
|
end
|
19
|
-
add_index :articles, :title, :
|
20
|
-
add_index :articles, [:state, :active], :
|
19
|
+
add_index :articles, :title, unique: true
|
20
|
+
add_index :articles, [:state, :active], unique: true
|
21
21
|
|
22
|
-
create_table :reviews, :
|
23
|
-
t.integer :article_id, :
|
24
|
-
t.string :author, :
|
25
|
-
t.string :content, :
|
22
|
+
create_table :reviews, force: true do |t|
|
23
|
+
t.integer :article_id, null: false
|
24
|
+
t.string :author, null: false
|
25
|
+
t.string :content, limit: 200
|
26
26
|
t.string :type
|
27
|
-
t.timestamps :
|
27
|
+
t.timestamps null: false
|
28
28
|
end
|
29
|
-
add_index :reviews, :article_id, :
|
29
|
+
add_index :reviews, :article_id, unique: true
|
30
30
|
|
31
|
-
create_table :article_reviews, :
|
31
|
+
create_table :article_reviews, force: true do |t|
|
32
32
|
t.integer :article_id
|
33
33
|
t.integer :review_id
|
34
34
|
end
|
35
|
-
add_index :article_reviews, [:article_id, :review_id], :
|
35
|
+
add_index :article_reviews, [:article_id, :review_id], unique: true
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -43,8 +43,8 @@ describe "Validations" do
|
|
43
43
|
|
44
44
|
class Review < ActiveRecord::Base
|
45
45
|
belongs_to :article
|
46
|
-
belongs_to :news_article, :
|
47
|
-
schema_validations :
|
46
|
+
belongs_to :news_article, class_name: 'Article', foreign_key: :article_id
|
47
|
+
schema_validations except: :content
|
48
48
|
end
|
49
49
|
|
50
50
|
class ArticleReview < ActiveRecord::Base
|
@@ -81,15 +81,15 @@ describe "Validations" do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it "should check title length" do
|
84
|
-
expect(Article.new(:
|
84
|
+
expect(Article.new(title: 'a' * 100).error_on(:title).size).to eq(1)
|
85
85
|
end
|
86
86
|
|
87
87
|
it "should validate state numericality" do
|
88
|
-
expect(Article.new(:
|
88
|
+
expect(Article.new(state: 'unknown').error_on(:state).size).to eq(1)
|
89
89
|
end
|
90
90
|
|
91
91
|
it "should validate if state is integer" do
|
92
|
-
expect(Article.new(:
|
92
|
+
expect(Article.new(state: 1.23).error_on(:state).size).to eq(1)
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should validate the range of votes" do
|
@@ -115,28 +115,28 @@ describe "Validations" do
|
|
115
115
|
expect(Article.new(max100: -100).error_on(:max100).size).to eq(1)
|
116
116
|
end
|
117
117
|
|
118
|
-
it "should not validate the range of arbitrary decimal", :
|
118
|
+
it "should not validate the range of arbitrary decimal", mysql: :skip do # mysql provides a default precision
|
119
119
|
expect(Article.new(arbitrary: Float::MAX).error_on(:arbitrary).size).to eq(0)
|
120
120
|
end
|
121
121
|
|
122
122
|
it "should validate average_mark numericality" do
|
123
|
-
expect(Article.new(:
|
123
|
+
expect(Article.new(average_mark: "high").error_on(:average_mark).size).to eq(1)
|
124
124
|
end
|
125
125
|
|
126
126
|
it "should validate boolean fields" do
|
127
|
-
expect(Article.new(:
|
127
|
+
expect(Article.new(active: nil).error_on(:active).size).to eq(1)
|
128
128
|
end
|
129
129
|
|
130
130
|
it "should validate title uniqueness" do
|
131
131
|
article1 = Article.create(valid_article_attributes)
|
132
|
-
article2 = Article.new(:
|
132
|
+
article2 = Article.new(title: valid_article_attributes[:title])
|
133
133
|
expect(article2.error_on(:title).size).to eq(1)
|
134
134
|
article1.destroy
|
135
135
|
end
|
136
136
|
|
137
137
|
it "should validate state uniqueness in scope of 'active' value" do
|
138
138
|
article1 = Article.create(valid_article_attributes)
|
139
|
-
article2 = Article.new(valid_article_attributes.merge(:
|
139
|
+
article2 = Article.new(valid_article_attributes.merge(title: 'SchemaPlus 2.0 released'))
|
140
140
|
expect(article2).not_to be_valid
|
141
141
|
article2.toggle(:active)
|
142
142
|
expect(article2).to be_valid
|
@@ -151,9 +151,9 @@ describe "Validations" do
|
|
151
151
|
it "should validate uniqueness of belongs_to association" do
|
152
152
|
article = Article.create(valid_article_attributes)
|
153
153
|
expect(article).to be_valid
|
154
|
-
review1 = Review.create(:
|
154
|
+
review1 = Review.create(article: article, author: 'michal')
|
155
155
|
expect(review1).to be_valid
|
156
|
-
review2 = Review.new(:
|
156
|
+
review2 = Review.new(article: article, author: 'michal')
|
157
157
|
expect(review2.error_on(:article_id).size).to be >= 1
|
158
158
|
end
|
159
159
|
|
@@ -162,18 +162,81 @@ describe "Validations" do
|
|
162
162
|
end
|
163
163
|
|
164
164
|
it "should not validate uniqueness when scope is absent" do
|
165
|
-
article_review_1 = ArticleReview.create(:
|
165
|
+
article_review_1 = ArticleReview.create(article_id: 1, review_id: nil)
|
166
166
|
expect(article_review_1).to be_valid
|
167
167
|
|
168
|
-
article_review_2 = ArticleReview.create(:
|
168
|
+
article_review_2 = ArticleReview.create(article_id: 1, review_id: nil)
|
169
169
|
expect(article_review_2).to be_valid
|
170
170
|
|
171
|
-
article_review_3 = ArticleReview.create(:
|
171
|
+
article_review_3 = ArticleReview.create(article_id: nil, review_id: 1)
|
172
172
|
expect(article_review_3).to be_valid
|
173
173
|
|
174
|
-
article_review_4 = ArticleReview.create(:
|
174
|
+
article_review_4 = ArticleReview.create(article_id: nil, review_id: 1)
|
175
175
|
expect(article_review_4).to be_valid
|
176
176
|
end
|
177
|
+
|
178
|
+
context 'when NOT NULL validations' do
|
179
|
+
before(:each) do
|
180
|
+
ActiveRecord::Schema.define do
|
181
|
+
create_table :anti_nulls, force: true do |t|
|
182
|
+
t.string :no_default, null: false
|
183
|
+
t.string :blank_default, default: '', null: false
|
184
|
+
t.string :non_blank_default, default: 'not blank', null: false
|
185
|
+
end
|
186
|
+
end
|
187
|
+
with_auto_validations do
|
188
|
+
class AntiNull < ActiveRecord::Base
|
189
|
+
def self.all_blank
|
190
|
+
@all_blank ||= AntiNull.new(
|
191
|
+
no_default: '',
|
192
|
+
blank_default: '',
|
193
|
+
non_blank_default: ''
|
194
|
+
)
|
195
|
+
end
|
196
|
+
|
197
|
+
def self.all_non_blank
|
198
|
+
@all_non_blank ||= AntiNull.new(
|
199
|
+
no_default: 'foo',
|
200
|
+
blank_default: 'bar',
|
201
|
+
non_blank_default: 'baz'
|
202
|
+
)
|
203
|
+
end
|
204
|
+
|
205
|
+
def self.all_nil
|
206
|
+
@all_nil ||= AntiNull.new(
|
207
|
+
no_default: nil,
|
208
|
+
blank_default: nil,
|
209
|
+
non_blank_default: nil
|
210
|
+
)
|
211
|
+
end
|
212
|
+
|
213
|
+
def self.non_null_with(**fields)
|
214
|
+
opts = { no_default: 'foo' }.merge!(fields)
|
215
|
+
AntiNull.new **opts
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'should fail validation on empty fields only if the default value is not blank' do
|
224
|
+
expect(AntiNull.all_nil.error_on(:no_default).size).to eq(1)
|
225
|
+
expect(AntiNull.all_nil.error_on(:blank_default).size).to eq(1)
|
226
|
+
expect(AntiNull.all_nil.error_on(:non_blank_default).size).to eq(1)
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'should fail validation on empty fields only if the default value is not blank' do
|
230
|
+
expect(AntiNull.all_blank.error_on(:no_default).size).to eq(1)
|
231
|
+
expect(AntiNull.all_blank.error_on(:non_blank_default).size).to eq(1)
|
232
|
+
expect(AntiNull.all_blank.error_on(:blank_default)).to be_empty
|
233
|
+
end
|
234
|
+
|
235
|
+
it 'should not fail if fields are neither nil nor empty' do
|
236
|
+
expect(AntiNull.all_non_blank).to be_valid
|
237
|
+
end
|
238
|
+
|
239
|
+
end
|
177
240
|
end
|
178
241
|
|
179
242
|
context "auto-created but changed" do
|
@@ -182,62 +245,62 @@ describe "Validations" do
|
|
182
245
|
class Article < ActiveRecord::Base ; end
|
183
246
|
class Review < ActiveRecord::Base
|
184
247
|
belongs_to :article
|
185
|
-
belongs_to :news_article, :
|
248
|
+
belongs_to :news_article, class_name: 'Article', foreign_key: :article_id
|
186
249
|
end
|
187
250
|
end
|
188
251
|
@too_big_content = 'a' * 1000
|
189
252
|
end
|
190
253
|
|
191
254
|
it "would normally have an error" do
|
192
|
-
@review = Review.new(:
|
255
|
+
@review = Review.new(content: @too_big_content)
|
193
256
|
expect(@review.error_on(:content).size).to eq(1)
|
194
257
|
expect(@review.error_on(:author).size).to eq(1)
|
195
258
|
end
|
196
259
|
|
197
260
|
it "shouldn't validate fields passed to :except option" do
|
198
|
-
Review.schema_validations :
|
199
|
-
@review = Review.new(:
|
261
|
+
Review.schema_validations except: :content
|
262
|
+
@review = Review.new(content: @too_big_content)
|
200
263
|
expect(@review.errors_on(:content).size).to eq(0)
|
201
264
|
expect(@review.error_on(:author).size).to eq(1)
|
202
265
|
end
|
203
266
|
|
204
267
|
it "shouldn't validate the fields in default whitelist" do
|
205
|
-
Review.schema_validations :
|
268
|
+
Review.schema_validations except: :content
|
206
269
|
expect(Review.new.error_on(:updated_at).size).to eq(0)
|
207
270
|
expect(Review.new.error_on(:created_at).size).to eq(0)
|
208
271
|
end
|
209
272
|
|
210
273
|
it "shouldn't validate the fields in whitelist" do
|
211
|
-
Review.schema_validations :
|
274
|
+
Review.schema_validations except: :content, whitelist: [:updated_at]
|
212
275
|
expect(Review.new.error_on(:updated_at).size).to eq(0)
|
213
276
|
expect(Review.new.error_on(:created_at).size).to eq(1)
|
214
277
|
end
|
215
278
|
|
216
279
|
it "shouldn't validate types passed to :except_type option using full validation" do
|
217
|
-
Review.schema_validations :
|
218
|
-
@review = Review.new(:
|
280
|
+
Review.schema_validations except_type: :validates_length_of
|
281
|
+
@review = Review.new(content: @too_big_content)
|
219
282
|
expect(@review.errors_on(:content).size).to eq(0)
|
220
283
|
expect(@review.error_on(:author).size).to eq(1)
|
221
284
|
end
|
222
285
|
|
223
286
|
it "shouldn't validate types passed to :except_type option using shorthand" do
|
224
|
-
Review.schema_validations :
|
225
|
-
@review = Review.new(:
|
287
|
+
Review.schema_validations except_type: :length
|
288
|
+
@review = Review.new(content: @too_big_content)
|
226
289
|
expect(@review.errors_on(:content).size).to eq(0)
|
227
290
|
expect(@review.error_on(:author).size).to eq(1)
|
228
291
|
end
|
229
292
|
|
230
293
|
it "should only validate type passed to :only_type option" do
|
231
|
-
Review.schema_validations :
|
232
|
-
@review = Review.new(:
|
294
|
+
Review.schema_validations only_type: :length
|
295
|
+
@review = Review.new(content: @too_big_content)
|
233
296
|
expect(@review.error_on(:content).size).to eq(1)
|
234
297
|
expect(@review.errors_on(:author).size).to eq(0)
|
235
298
|
end
|
236
299
|
|
237
300
|
|
238
301
|
it "shouldn't create validations if locally disabled" do
|
239
|
-
Review.schema_validations :
|
240
|
-
@review = Review.new(:
|
302
|
+
Review.schema_validations auto_create: false
|
303
|
+
@review = Review.new(content: @too_big_content)
|
241
304
|
expect(@review.errors_on(:content).size).to eq(0)
|
242
305
|
expect(@review.error_on(:author).size).to eq(0)
|
243
306
|
end
|
@@ -251,23 +314,23 @@ describe "Validations" do
|
|
251
314
|
before(:each) do
|
252
315
|
class Review < ActiveRecord::Base
|
253
316
|
belongs_to :article
|
254
|
-
belongs_to :news_article, :
|
317
|
+
belongs_to :news_article, class_name: 'Article', foreign_key: :article_id
|
255
318
|
end
|
256
319
|
@too_big_content = 'a' * 1000
|
257
320
|
end
|
258
321
|
|
259
322
|
it "should not create validation" do
|
260
|
-
expect(Review.new(:
|
323
|
+
expect(Review.new(content: @too_big_title).errors_on(:content).size).to eq(0)
|
261
324
|
end
|
262
325
|
|
263
326
|
it "should create validation if locally enabled explicitly" do
|
264
|
-
Review.schema_validations :
|
265
|
-
expect(Review.new(:
|
327
|
+
Review.schema_validations auto_create: true
|
328
|
+
expect(Review.new(content: @too_big_content).error_on(:content).size).to eq(1)
|
266
329
|
end
|
267
330
|
|
268
331
|
it "should create validation if locally enabled implicitly" do
|
269
332
|
Review.schema_validations
|
270
|
-
expect(Review.new(:
|
333
|
+
expect(Review.new(content: @too_big_content).error_on(:content).size).to eq(1)
|
271
334
|
end
|
272
335
|
|
273
336
|
end
|
@@ -275,18 +338,18 @@ describe "Validations" do
|
|
275
338
|
context "manually invoked" do
|
276
339
|
before(:each) do
|
277
340
|
class Article < ActiveRecord::Base ; end
|
278
|
-
Article.schema_validations :
|
341
|
+
Article.schema_validations only: [:title, :state]
|
279
342
|
|
280
343
|
class Review < ActiveRecord::Base
|
281
344
|
belongs_to :dummy_association
|
282
|
-
schema_validations :
|
345
|
+
schema_validations except: :content
|
283
346
|
end
|
284
347
|
end
|
285
348
|
|
286
349
|
it "should validate fields passed to :only option" do
|
287
350
|
too_big_title = 'a' * 100
|
288
351
|
wrong_state = 'unknown'
|
289
|
-
article = Article.new(:
|
352
|
+
article = Article.new(title: too_big_title, state: wrong_state)
|
290
353
|
expect(article.error_on(:title).size).to eq(1)
|
291
354
|
expect(article.error_on(:state).size).to eq(1)
|
292
355
|
end
|
@@ -317,7 +380,7 @@ describe "Validations" do
|
|
317
380
|
belongs_to :article
|
318
381
|
end
|
319
382
|
@columns = Review.content_columns.dup
|
320
|
-
Review.schema_validations :
|
383
|
+
Review.schema_validations only: [:title]
|
321
384
|
end
|
322
385
|
|
323
386
|
it "shouldn't validate associations not included in :only option" do
|
@@ -352,9 +415,9 @@ describe "Validations" do
|
|
352
415
|
context "when used with enum" do
|
353
416
|
it "does not validate numericality" do
|
354
417
|
class Article < ActiveRecord::Base
|
355
|
-
enum :
|
418
|
+
enum state: [:happy, :sad]
|
356
419
|
end
|
357
|
-
expect(Article.new(valid_article_attributes.merge(:
|
420
|
+
expect(Article.new(valid_article_attributes.merge(state: :happy))).to be_valid
|
358
421
|
end
|
359
422
|
end if ActiveRecord::Base.respond_to? :enum
|
360
423
|
|
@@ -366,11 +429,11 @@ describe "Validations" do
|
|
366
429
|
context 'without scope' do
|
367
430
|
before do
|
368
431
|
ActiveRecord::Schema.define do
|
369
|
-
create_table :books, :
|
432
|
+
create_table :books, force: true do |t|
|
370
433
|
t.string :title
|
371
434
|
end
|
372
435
|
|
373
|
-
add_index :books, :title, :
|
436
|
+
add_index :books, :title, unique: true
|
374
437
|
end
|
375
438
|
|
376
439
|
with_auto_validations do
|
@@ -390,12 +453,12 @@ describe "Validations" do
|
|
390
453
|
context 'within a scope' do
|
391
454
|
before do
|
392
455
|
ActiveRecord::Schema.define do
|
393
|
-
create_table :folders, :
|
456
|
+
create_table :folders, force: true do |t|
|
394
457
|
t.integer :parent_id
|
395
458
|
t.string :name
|
396
459
|
end
|
397
460
|
|
398
|
-
add_index :folders, [:parent_id, :name], :
|
461
|
+
add_index :folders, [:parent_id, :name], unique: true
|
399
462
|
end
|
400
463
|
|
401
464
|
with_auto_validations do
|
@@ -408,10 +471,10 @@ describe "Validations" do
|
|
408
471
|
it "should validate the uniqueness in a case insensitive manner" do
|
409
472
|
mixed_case_name = 'Schema Validations'
|
410
473
|
parent_folder = Folder.create
|
411
|
-
Folder.create(:
|
474
|
+
Folder.create(parent: parent_folder, name: mixed_case_name)
|
412
475
|
|
413
|
-
expect(Folder.new(:
|
414
|
-
expect(Folder.new(:
|
476
|
+
expect(Folder.new(parent: parent_folder, name: mixed_case_name)).not_to be_valid
|
477
|
+
expect(Folder.new(parent: parent_folder, name: mixed_case_name.downcase)).not_to be_valid
|
415
478
|
end
|
416
479
|
end
|
417
480
|
end
|
@@ -419,7 +482,7 @@ describe "Validations" do
|
|
419
482
|
context 'with optimistic locking' do
|
420
483
|
before do
|
421
484
|
ActiveRecord::Schema.define do
|
422
|
-
create_table :optimistics, :
|
485
|
+
create_table :optimistics, force: true do |t|
|
423
486
|
t.integer :lock_version
|
424
487
|
end
|
425
488
|
end
|
@@ -448,11 +511,11 @@ describe "Validations" do
|
|
448
511
|
|
449
512
|
def valid_article_attributes
|
450
513
|
{
|
451
|
-
:
|
452
|
-
:
|
453
|
-
:
|
454
|
-
:
|
455
|
-
:
|
514
|
+
title: 'SchemaPlus released!',
|
515
|
+
content: "Database matters. Get full use of it but don't write unecessary code. Get SchemaPlus!",
|
516
|
+
state: 3,
|
517
|
+
average_mark: 9.78,
|
518
|
+
active: true
|
456
519
|
}
|
457
520
|
end
|
458
521
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schema_validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ronen Barzel
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-02-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: schema_plus_columns
|
@@ -188,6 +188,7 @@ files:
|
|
188
188
|
- lib/schema_validations/active_record/type.rb
|
189
189
|
- lib/schema_validations/active_record/validations.rb
|
190
190
|
- lib/schema_validations/railtie.rb
|
191
|
+
- lib/schema_validations/validators/not_nil_validator.rb
|
191
192
|
- lib/schema_validations/version.rb
|
192
193
|
- schema_dev.yml
|
193
194
|
- schema_validations.gemspec
|