consistency_fail 0.3.0 → 0.3.1
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.
- data/bin/consistency_fail +6 -1
- data/lib/consistency_fail.rb +1 -0
- data/lib/consistency_fail/introspectors/has_one.rb +1 -1
- data/lib/consistency_fail/introspectors/polymorphic.rb +43 -0
- data/lib/consistency_fail/reporter.rb +5 -0
- data/lib/consistency_fail/reporters/polymorphic.rb +13 -0
- data/lib/consistency_fail/version.rb +1 -1
- data/spec/introspectors/has_one_spec.rb +10 -2
- data/spec/introspectors/polymorphic_spec.rb +77 -0
- data/spec/reporter_spec.rb +16 -0
- metadata +6 -2
data/bin/consistency_fail
CHANGED
@@ -14,7 +14,7 @@ $:<< File.join(File.dirname(__FILE__), "..", "lib")
|
|
14
14
|
require "consistency_fail"
|
15
15
|
|
16
16
|
def problems(models, introspector)
|
17
|
-
|
17
|
+
models.map do |m|
|
18
18
|
[m, introspector.missing_indexes(m)]
|
19
19
|
end.reject do |m, indexes|
|
20
20
|
indexes.empty?
|
@@ -38,6 +38,11 @@ problems = problems(models.all, introspector)
|
|
38
38
|
reporter.report_has_one_problems(problems)
|
39
39
|
success &&= problems.empty?
|
40
40
|
|
41
|
+
introspector = ConsistencyFail::Introspectors::Polymorphic.new
|
42
|
+
problems = problems(models.all, introspector)
|
43
|
+
reporter.report_polymorphic_problems(problems)
|
44
|
+
success &&= problems.empty?
|
45
|
+
|
41
46
|
if success
|
42
47
|
exit 0
|
43
48
|
else
|
data/lib/consistency_fail.rb
CHANGED
@@ -2,4 +2,5 @@ require 'consistency_fail/models'
|
|
2
2
|
require 'consistency_fail/introspectors/table_data'
|
3
3
|
require 'consistency_fail/introspectors/validates_uniqueness_of'
|
4
4
|
require 'consistency_fail/introspectors/has_one'
|
5
|
+
require 'consistency_fail/introspectors/polymorphic'
|
5
6
|
require 'consistency_fail/reporter'
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'consistency_fail/index'
|
2
|
+
|
3
|
+
module ConsistencyFail
|
4
|
+
module Introspectors
|
5
|
+
class Polymorphic
|
6
|
+
def instances(model)
|
7
|
+
model.reflect_on_all_associations.select do |a|
|
8
|
+
a.macro == :has_one && a.options[:as].to_s.length > 0
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def desired_indexes(model)
|
13
|
+
instances(model).map do |a|
|
14
|
+
as = a.options[:as]
|
15
|
+
as_type = "#{as}_type"
|
16
|
+
as_id = "#{as}_id"
|
17
|
+
|
18
|
+
ConsistencyFail::Index.new(
|
19
|
+
a.class_name.constantize,
|
20
|
+
a.table_name.to_s,
|
21
|
+
[as_type, as_id]
|
22
|
+
)
|
23
|
+
end.compact
|
24
|
+
end
|
25
|
+
private :desired_indexes
|
26
|
+
|
27
|
+
def missing_indexes(model)
|
28
|
+
desired = desired_indexes(model)
|
29
|
+
|
30
|
+
existing_indexes = desired.inject([]) do |acc, d|
|
31
|
+
acc += TableData.new.unique_indexes_by_table(d.model,
|
32
|
+
d.model.connection,
|
33
|
+
d.table_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
desired.reject do |index|
|
37
|
+
existing_indexes.include?(index)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'consistency_fail/reporters/validates_uniqueness_of'
|
2
2
|
require 'consistency_fail/reporters/has_one'
|
3
|
+
require 'consistency_fail/reporters/polymorphic'
|
3
4
|
|
4
5
|
module ConsistencyFail
|
5
6
|
class Reporter
|
@@ -10,5 +11,9 @@ module ConsistencyFail
|
|
10
11
|
def report_has_one_problems(indexes_by_model)
|
11
12
|
ConsistencyFail::Reporters::HasOne.new.report(indexes_by_model)
|
12
13
|
end
|
14
|
+
|
15
|
+
def report_polymorphic_problems(indexes_by_model)
|
16
|
+
ConsistencyFail::Reporters::Polymorphic.new.report(indexes_by_model)
|
17
|
+
end
|
13
18
|
end
|
14
19
|
end
|
@@ -17,7 +17,7 @@ describe ConsistencyFail::Introspectors::HasOne do
|
|
17
17
|
|
18
18
|
it "finds one" do
|
19
19
|
model = fake_ar_model("User")
|
20
|
-
association = double("association", :macro => :has_one)
|
20
|
+
association = double("association", :macro => :has_one, :options => {})
|
21
21
|
model.stub!(:reflect_on_all_associations).and_return([association])
|
22
22
|
|
23
23
|
subject.instances(model).should == [association]
|
@@ -30,11 +30,19 @@ describe ConsistencyFail::Introspectors::HasOne do
|
|
30
30
|
|
31
31
|
subject.instances(model).should == []
|
32
32
|
end
|
33
|
+
|
34
|
+
it "finds one, but it's a polymorphic association" do
|
35
|
+
model = fake_ar_model("User")
|
36
|
+
association = double("association", :macro => :has_one, :options => {:as => "addressable"})
|
37
|
+
model.stub!(:reflect_on_all_associations).and_return([association])
|
38
|
+
|
39
|
+
subject.instances(model).should == []
|
40
|
+
end
|
33
41
|
end
|
34
42
|
|
35
43
|
describe "finding missing indexes" do
|
36
44
|
before do
|
37
|
-
@association = double("association", :macro => :has_one)
|
45
|
+
@association = double("association", :macro => :has_one, :options => {})
|
38
46
|
@model = fake_ar_model("User", :table_exists? => true,
|
39
47
|
:table_name => "users",
|
40
48
|
:class_name => "User",
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'consistency_fail/introspectors/table_data'
|
3
|
+
require 'consistency_fail/introspectors/polymorphic'
|
4
|
+
|
5
|
+
describe ConsistencyFail::Introspectors::Polymorphic do
|
6
|
+
def introspector(model)
|
7
|
+
ConsistencyFail::Introspectors::Polymorphic.new(model)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "instances of polymorphic" do
|
11
|
+
it "finds none" do
|
12
|
+
model = fake_ar_model("User")
|
13
|
+
model.stub(:reflect_on_all_associations).and_return([])
|
14
|
+
|
15
|
+
subject.instances(model).should == []
|
16
|
+
end
|
17
|
+
|
18
|
+
it "finds one" do
|
19
|
+
model = fake_ar_model("User")
|
20
|
+
association = double("association", :macro => :has_one, :options => {:as => "addressable"})
|
21
|
+
model.stub!(:reflect_on_all_associations).and_return([association])
|
22
|
+
|
23
|
+
subject.instances(model).should == [association]
|
24
|
+
end
|
25
|
+
|
26
|
+
it "finds other has_one associations, but not polymorphic" do
|
27
|
+
model = fake_ar_model("User")
|
28
|
+
validation = double("association", :macro => :has_one, :options => {})
|
29
|
+
model.stub!(:reflect_on_all_associations).and_return([validation])
|
30
|
+
|
31
|
+
subject.instances(model).should == []
|
32
|
+
end
|
33
|
+
|
34
|
+
it "finds other non has_one associations" do
|
35
|
+
model = fake_ar_model("User")
|
36
|
+
validation = double("association", :macro => :has_many)
|
37
|
+
model.stub!(:reflect_on_all_associations).and_return([validation])
|
38
|
+
|
39
|
+
subject.instances(model).should == []
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "finding missing indexes" do
|
44
|
+
before do
|
45
|
+
@association = double("association", :macro => :has_one, :options => {:as => "addressable"})
|
46
|
+
@model = fake_ar_model("User", :table_exists? => true,
|
47
|
+
:table_name => "users",
|
48
|
+
:class_name => "User",
|
49
|
+
:reflect_on_all_associations => [@association])
|
50
|
+
@address_class = double("Address Class")
|
51
|
+
@address_string = "Address"
|
52
|
+
@address_string.stub(:constantize).and_return(@address_class)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "finds one" do
|
56
|
+
@association.stub!(:table_name => :addresses, :class_name => @address_string)
|
57
|
+
@address_class.stub_chain(:connection, :indexes).with("addresses").and_return([])
|
58
|
+
|
59
|
+
indexes = subject.missing_indexes(@model)
|
60
|
+
indexes.should == [ConsistencyFail::Index.new(fake_ar_model("Address"), "addresses", ["addressable_type", "addressable_id"])]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "finds none when they're already in place" do
|
64
|
+
@association.stub!(:table_name => :addresses, :class_name => @address_string)
|
65
|
+
index = ConsistencyFail::Index.new(double('model'), "addresses", ["addressable_type", "addressable_id"])
|
66
|
+
|
67
|
+
fake_connection = double("connection")
|
68
|
+
@address_class.stub_chain(:connection).and_return(fake_connection)
|
69
|
+
|
70
|
+
ConsistencyFail::Introspectors::TableData.stub_chain(:new, :unique_indexes_by_table).
|
71
|
+
with(@address_class, fake_connection, "addresses").
|
72
|
+
and_return([index])
|
73
|
+
|
74
|
+
subject.missing_indexes(@model).should == []
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/spec/reporter_spec.rb
CHANGED
@@ -71,4 +71,20 @@ describe ConsistencyFail::Reporter do
|
|
71
71
|
@fake_out.string.should =~ /Friend\s+users\s+\(email\)/m
|
72
72
|
end
|
73
73
|
end
|
74
|
+
|
75
|
+
context "polymorphic" do
|
76
|
+
it "says everything's good" do
|
77
|
+
subject.report_polymorphic_problems([])
|
78
|
+
|
79
|
+
@fake_out.string.should =~ /Hooray!/
|
80
|
+
end
|
81
|
+
|
82
|
+
it "shows a missing compound index on a single model" do
|
83
|
+
missing_indexes = [ConsistencyFail::Index.new(double('model'), "addresses", ["addressable_type", "addressable_id"])]
|
84
|
+
|
85
|
+
subject.report_polymorphic_problems(fake_ar_model("Address", :table_name => "addresses") => missing_indexes)
|
86
|
+
|
87
|
+
@fake_out.string.should =~ /Address\s+addresses\s+\(addressable_type, addressable_id\)/m
|
88
|
+
end
|
89
|
+
end
|
74
90
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: consistency_fail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -76,16 +76,19 @@ files:
|
|
76
76
|
- lib/consistency_fail/enforcer.rb
|
77
77
|
- lib/consistency_fail/index.rb
|
78
78
|
- lib/consistency_fail/introspectors/has_one.rb
|
79
|
+
- lib/consistency_fail/introspectors/polymorphic.rb
|
79
80
|
- lib/consistency_fail/introspectors/table_data.rb
|
80
81
|
- lib/consistency_fail/introspectors/validates_uniqueness_of.rb
|
81
82
|
- lib/consistency_fail/models.rb
|
82
83
|
- lib/consistency_fail/reporter.rb
|
83
84
|
- lib/consistency_fail/reporters/base.rb
|
84
85
|
- lib/consistency_fail/reporters/has_one.rb
|
86
|
+
- lib/consistency_fail/reporters/polymorphic.rb
|
85
87
|
- lib/consistency_fail/reporters/validates_uniqueness_of.rb
|
86
88
|
- lib/consistency_fail/version.rb
|
87
89
|
- spec/index_spec.rb
|
88
90
|
- spec/introspectors/has_one_spec.rb
|
91
|
+
- spec/introspectors/polymorphic_spec.rb
|
89
92
|
- spec/introspectors/table_data_spec.rb
|
90
93
|
- spec/introspectors/validates_uniqueness_of_spec.rb
|
91
94
|
- spec/models_spec.rb
|
@@ -118,6 +121,7 @@ summary: A tool to detect missing unique indexes
|
|
118
121
|
test_files:
|
119
122
|
- spec/index_spec.rb
|
120
123
|
- spec/introspectors/has_one_spec.rb
|
124
|
+
- spec/introspectors/polymorphic_spec.rb
|
121
125
|
- spec/introspectors/table_data_spec.rb
|
122
126
|
- spec/introspectors/validates_uniqueness_of_spec.rb
|
123
127
|
- spec/models_spec.rb
|