nullalign 0.0.1 → 0.0.2

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
  SHA1:
3
- metadata.gz: 5af4ac1d6d4cfd1977ef54a3f0474dbce25f9fea
4
- data.tar.gz: bad6def07e87ca11b13fac642d6f937314143f45
3
+ metadata.gz: 1af15eca93e06667b2a429e1c853c03c101a9425
4
+ data.tar.gz: 3ba414cae84fceaf9ff1e66f65322eb3e6b153bc
5
5
  SHA512:
6
- metadata.gz: d26458bc42d5646822a211380a7f558a1d99027423cf307df635bc90f7669278d49a9e79ae0cc2388c96a3fcbd9cd94fd3f73917210be8399328077e4a114623
7
- data.tar.gz: '091cdc67b563263fdf6e04a1fc56037f4bc26fdc1bc1c59c4a6cee2ef0704fcbeff6d818108bc854db6be6947a892701a18cfe2fbfa5999a1d222924fca6ebad'
6
+ metadata.gz: cb64c015c7b25c0c070d97157df4b5d027b77170884bafe5d15bfb2cbdae3f5a144be744ed4a7a750e0106da661e303a1c32f4a0c8f0f224cb08fe2cb9f91034
7
+ data.tar.gz: 46e03a6c9c628434afbbdf27f2be293eaa4ed7b68ceb146f14fa97f7b94b9e98ccbde3fff140ba73c35f7bc319064e6e6641937746d61e11d74aa2faaebb9ce6
data/CHANGELOG.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.0.2 Oct 23 2017
4
+ * Skip conditional validations
5
+
3
6
  ## v0.0.1 Sep 28 2017
4
7
 
5
8
  * Initial release
data/README.md CHANGED
@@ -47,6 +47,17 @@ or pull request if so!
47
47
  To disable nullalign, I could add a thing that checks column comments for a string
48
48
  like 'nonullalign' if people think that would be useful. Just let me know.
49
49
 
50
+ ## Contributors
51
+
52
+ * [Tom Copeland](https://thomasleecopeland.com) - author
53
+ * [Woongcheol Yang](https://github.com/woongy) - support for conditional validations
54
+
55
+ ## Tests
56
+
57
+ You can run the tests with:
58
+
59
+ bundle exec rspec
60
+
50
61
  ## License
51
62
 
52
63
  Released under the MIT License. See the LICENSE file for further details.
@@ -5,7 +5,7 @@ module Nullalign
5
5
  class ValidatesPresenceOf
6
6
  def instances(model)
7
7
  model.validators.select do |v|
8
- v.class == ActiveRecord::Validations::PresenceValidator
8
+ v.class == ActiveRecord::Validations::PresenceValidator && (v.options.keys & %i(on if unless)).empty?
9
9
  end
10
10
  end
11
11
 
@@ -1,3 +1,3 @@
1
1
  module Nullalign
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/nullalign.gemspec CHANGED
@@ -16,7 +16,7 @@ non-null constraint to go with it.
16
16
  EOF
17
17
  s.license = "MIT"
18
18
 
19
- s.add_development_dependency "activerecord", "~>3.0"
19
+ s.add_development_dependency "activerecord", "~>4.0"
20
20
  s.add_development_dependency "sqlite3", "~>1.3"
21
21
  s.add_development_dependency "rspec", "~>3.2"
22
22
 
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Nullalign::Introspectors::TableData do
4
+
5
+ describe "finding nonnull constraints" do
6
+ it "finds none when the table does not exist" do
7
+ expect(subject.nonnull_constraints(Nonexistent)).to be_empty
8
+ end
9
+
10
+ it "gets one" do
11
+ expect(
12
+ Nullalign::Introspectors::TableData.new.nonnull_constraints_by_table(
13
+ CorrectAccount,
14
+ CorrectAccount.table_name
15
+ )[1].column
16
+ ).to eq "email"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Nullalign::Introspectors::ValidatesPresenceOf do
4
+
5
+ describe "finding missing nonnull constraints" do
6
+ it "finds one" do
7
+ indexes = subject.missing_nonnull_constraints(WrongAccount)
8
+
9
+ expect(indexes).to eq([
10
+ Nullalign::NonnullConstraint.new(
11
+ WrongAccount,
12
+ WrongAccount.table_name,
13
+ "email"
14
+ )
15
+ ])
16
+ end
17
+
18
+ it "finds none when they're already in place" do
19
+ expect(subject.missing_nonnull_constraints(CorrectAccount)).to be_empty
20
+ end
21
+
22
+ it 'finds none if there is an if condition' do
23
+ expect(subject.missing_nonnull_constraints(WithIfAccount)).to be_empty
24
+ end
25
+
26
+ it 'finds none if there is an on condition' do
27
+ expect(subject.missing_nonnull_constraints(WithOnAccount)).to be_empty
28
+ end
29
+
30
+ it 'finds none if there is an unless condition' do
31
+ expect(subject.missing_nonnull_constraints(WithUnlessAccount)).to be_empty
32
+ end
33
+
34
+ end
35
+
36
+ end
data/spec/models_spec.rb CHANGED
@@ -37,14 +37,13 @@ describe Nullalign::Models do
37
37
  end
38
38
 
39
39
  it "gets all models" do
40
- # TODO fails, but why?
41
- # model_a = double(:name => "animal")
42
- # model_b = double(:name => "cat")
43
- # model_c = double(:name => "beach_ball")
44
- #
45
- # allow(ActiveRecord::Base).to receive(:send).with(:descendants).and_return([model_a, model_b, model_c])
46
- #
47
- # expect(models([]).all).to eq([model_a, model_c, model_b])
40
+ model_a = double(:name => "animal")
41
+ model_b = double(:name => "cat")
42
+ model_c = double(:name => "beach_ball")
43
+
44
+ allow(ActiveRecord::Base).to receive(:descendants).and_return([model_a, model_b, model_c])
45
+
46
+ expect(models([]).all).to eq([model_a, model_c, model_b])
48
47
  end
49
48
 
50
49
  end
@@ -0,0 +1,53 @@
1
+ describe Nullalign::NonnullConstraint do
2
+
3
+ let(:nonnull_constraint) do
4
+ Nullalign::NonnullConstraint.new(
5
+ CorrectAccount,
6
+ CorrectAccount.table_name,
7
+ "city"
8
+ )
9
+ end
10
+
11
+ describe "value objectiness" do
12
+ it "holds onto model, table name, and columns" do
13
+ expect(nonnull_constraint.model).to eq(CorrectAccount)
14
+ expect(nonnull_constraint.table_name).to eq("correct_accounts")
15
+ expect(nonnull_constraint.column).to eq(
16
+ "city"
17
+ )
18
+ end
19
+ end
20
+
21
+ describe "equality test" do
22
+ it "passes when everything matches" do
23
+ expect(nonnull_constraint).to eq(
24
+ Nullalign::NonnullConstraint.new(
25
+ "CorrectAccount".constantize,
26
+ "correct_accounts",
27
+ "city"
28
+ )
29
+ )
30
+ end
31
+
32
+ it "fails when tables are different" do
33
+ expect(nonnull_constraint).not_to eq(
34
+ Nullalign::NonnullConstraint.new(
35
+ NewCorrectAccount,
36
+ NewCorrectAccount.table_name,
37
+ "city"
38
+ )
39
+ )
40
+ end
41
+
42
+ it "fails when columns are different" do
43
+ expect(nonnull_constraint).not_to eq(
44
+ Nullalign::NonnullConstraint.new(
45
+ CorrectAccount,
46
+ NewCorrectAccount.table_name,
47
+ "city"
48
+ )
49
+ )
50
+ end
51
+ end
52
+
53
+ end
@@ -0,0 +1,27 @@
1
+ describe Nullalign::Reporter do
2
+
3
+ context "validates_presence_of" do
4
+ it "says everything's good" do
5
+ expect {
6
+ subject.report_validates_presence_problems([])
7
+ }.to output(/Hooray!/).to_stdout
8
+ end
9
+
10
+ it "shows a missing constraint on a single model" do
11
+ missing_constraints = [
12
+ Nullalign::NonnullConstraint.new(
13
+ WrongAccount,
14
+ WrongAccount.table_name,
15
+ "email"
16
+ )
17
+ ]
18
+
19
+ expect {
20
+ subject.report_validates_presence_problems(
21
+ WrongAccount => missing_constraints
22
+ )
23
+ }.to output(/wrong_accounts:\s+email/).to_stdout
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,5 @@
1
+ class WithIfAccount < ActiveRecord::Base
2
+
3
+ validates :email, presence: true, if: -> { rand > 0.5 }
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ class WithOnAccount < ActiveRecord::Base
2
+
3
+ validates :email, presence: true, on: -> { rand > 0.5 }
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ class WithUnlessAccount < ActiveRecord::Base
2
+
3
+ validates :email, presence: true, unless: -> { rand > 0.5 }
4
+
5
+ end
@@ -11,6 +11,21 @@ ActiveRecord::Schema.define(version: 0) do
11
11
  t.timestamps
12
12
  end
13
13
 
14
+ create_table :with_if_accounts do |t|
15
+ t.string :email
16
+ t.timestamps
17
+ end
18
+
19
+ create_table :with_on_accounts do |t|
20
+ t.string :email
21
+ t.timestamps
22
+ end
23
+
24
+ create_table :with_unless_accounts do |t|
25
+ t.string :email
26
+ t.timestamps
27
+ end
28
+
14
29
  execute 'CREATE VIEW new_correct_people AS '\
15
30
  'SELECT * FROM correct_people '\
16
31
  'WHERE created_at = updated_at'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nullalign
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Copeland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-28 00:00:00.000000000 Z
11
+ date: 2017-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
19
+ version: '4.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.0'
26
+ version: '4.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: sqlite3
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,12 +80,19 @@ files:
80
80
  - lib/nullalign/reporters/validates_presence_of.rb
81
81
  - lib/nullalign/version.rb
82
82
  - nullalign.gemspec
83
+ - spec/introspectors/table_data_spec.rb
84
+ - spec/introspectors/validates_presence_of_spec.rb
83
85
  - spec/models_spec.rb
86
+ - spec/nonnull_constraint_spec.rb
87
+ - spec/reporter_spec.rb
84
88
  - spec/spec_helper.rb
85
89
  - spec/support/active_record.rb
86
90
  - spec/support/models/correct_account.rb
87
91
  - spec/support/models/new_correct_account.rb
88
92
  - spec/support/models/nonexistent.rb
93
+ - spec/support/models/with_if_account.rb
94
+ - spec/support/models/with_on_account.rb
95
+ - spec/support/models/with_unless_account.rb
89
96
  - spec/support/models/wrong_account.rb
90
97
  - spec/support/schema.rb
91
98
  homepage: http://github.com/tcopeland/nullalign
@@ -113,11 +120,18 @@ signing_key:
113
120
  specification_version: 4
114
121
  summary: A tool to detect missing non-null constraints
115
122
  test_files:
123
+ - spec/introspectors/table_data_spec.rb
124
+ - spec/introspectors/validates_presence_of_spec.rb
116
125
  - spec/models_spec.rb
126
+ - spec/nonnull_constraint_spec.rb
127
+ - spec/reporter_spec.rb
117
128
  - spec/spec_helper.rb
118
129
  - spec/support/active_record.rb
119
130
  - spec/support/models/correct_account.rb
120
131
  - spec/support/models/new_correct_account.rb
121
132
  - spec/support/models/nonexistent.rb
133
+ - spec/support/models/with_if_account.rb
134
+ - spec/support/models/with_on_account.rb
135
+ - spec/support/models/with_unless_account.rb
122
136
  - spec/support/models/wrong_account.rb
123
137
  - spec/support/schema.rb