database_consistency 1.1.11 → 1.1.14
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/lib/database_consistency/checkers/association_checkers/foreign_key_checker.rb +8 -1
- data/lib/database_consistency/checkers/association_checkers/missing_index_checker.rb +36 -3
- data/lib/database_consistency/helper.rb +8 -0
- data/lib/database_consistency/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86037a5780e8f5f906a5232a9925b5e250177b6ebe653a81509167814dc87a2e
|
4
|
+
data.tar.gz: 91cafa728a48dd765a2b66fc41c9a2a4f2952d72737472c6f1f88af28d9053b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6ac7dbf5de3cc1cbfaa7aef08e86aad7c88b2e5734283ef130ab60582945312faf87828b949d6f2f2e551b2770faca8498ad70e6438bcc6416977df20441aa3
|
7
|
+
data.tar.gz: f31f3a0ad600d45e7fcfe6f9d9aad07a267dfc96de990e03f7e725e9644f09d95ce8b6f0c69de920676e7023a5cf2dc7058dce2506f0ead2f23ee543b2596e8f
|
@@ -9,10 +9,17 @@ module DatabaseConsistency
|
|
9
9
|
private
|
10
10
|
|
11
11
|
# We skip check when:
|
12
|
+
# - underlying models belong to different databases
|
12
13
|
# - association isn't belongs_to association
|
13
14
|
# - association is polymorphic
|
14
15
|
def preconditions
|
15
|
-
supported? &&
|
16
|
+
supported? &&
|
17
|
+
association.belongs_to? && !association.polymorphic? &&
|
18
|
+
same_database?
|
19
|
+
end
|
20
|
+
|
21
|
+
def same_database?
|
22
|
+
Helper.connection_config(model) == Helper.connection_config(association.klass)
|
16
23
|
end
|
17
24
|
|
18
25
|
def supported?
|
@@ -6,6 +6,7 @@ module DatabaseConsistency
|
|
6
6
|
class MissingIndexChecker < AssociationChecker
|
7
7
|
# Message templates
|
8
8
|
MISSING_INDEX = 'associated model should have proper index in the database'
|
9
|
+
MISSING_UNIQUE_INDEX = 'associated model should have proper unique index in the database'
|
9
10
|
|
10
11
|
private
|
11
12
|
|
@@ -28,6 +29,22 @@ module DatabaseConsistency
|
|
28
29
|
# | persisted | ok |
|
29
30
|
# | missing | fail |
|
30
31
|
def check
|
32
|
+
if unique_has_one_association?
|
33
|
+
check_unique_has_one
|
34
|
+
else
|
35
|
+
check_remaining
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_unique_has_one
|
40
|
+
if unique_index
|
41
|
+
report_template(:ok)
|
42
|
+
else
|
43
|
+
report_template(:fail, MISSING_UNIQUE_INDEX)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def check_remaining
|
31
48
|
if index
|
32
49
|
report_template(:ok)
|
33
50
|
else
|
@@ -35,9 +52,19 @@ module DatabaseConsistency
|
|
35
52
|
end
|
36
53
|
end
|
37
54
|
|
55
|
+
def unique_has_one_association?
|
56
|
+
association.scope.nil? && association.macro == :has_one && !association.options[:as].present?
|
57
|
+
end
|
58
|
+
|
59
|
+
def unique_index
|
60
|
+
@unique_index ||= association.klass.connection.indexes(association.klass.table_name).find do |index|
|
61
|
+
index_keys(index) == association_keys && index.unique
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
38
65
|
def index
|
39
66
|
@index ||= association.klass.connection.indexes(association.klass.table_name).find do |index|
|
40
|
-
index_keys(index) == association_keys
|
67
|
+
index_keys(index, limit: association_keys.size) == association_keys
|
41
68
|
end
|
42
69
|
end
|
43
70
|
|
@@ -45,10 +72,16 @@ module DatabaseConsistency
|
|
45
72
|
@association_keys ||= [association.foreign_key, association.type].compact.map(&:to_s).sort
|
46
73
|
end
|
47
74
|
|
48
|
-
def index_keys(index)
|
75
|
+
def index_keys(index, limit: nil)
|
49
76
|
return unless index.columns.is_a?(Array)
|
50
77
|
|
51
|
-
index.columns
|
78
|
+
columns = index.columns
|
79
|
+
|
80
|
+
if limit
|
81
|
+
columns.first(limit).sort
|
82
|
+
else
|
83
|
+
columns
|
84
|
+
end
|
52
85
|
end
|
53
86
|
end
|
54
87
|
end
|
@@ -13,6 +13,14 @@ module DatabaseConsistency
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def connection_config(klass)
|
17
|
+
if klass.respond_to?(:connection_config)
|
18
|
+
klass.connection_config
|
19
|
+
else
|
20
|
+
klass.connection_db_config.configuration_hash
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
16
24
|
# Returns list of models to check
|
17
25
|
def models
|
18
26
|
ActiveRecord::Base.descendants.delete_if(&:abstract_class?).delete_if do |klass|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: database_consistency
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evgeniy Demin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -199,7 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
199
|
- !ruby/object:Gem::Version
|
200
200
|
version: '0'
|
201
201
|
requirements: []
|
202
|
-
rubygems_version: 3.
|
202
|
+
rubygems_version: 3.0.3.1
|
203
203
|
signing_key:
|
204
204
|
specification_version: 4
|
205
205
|
summary: Provide an easy way to check the consistency of the database constraints
|