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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f837d273af4845f139d3dc53fd3131d4224383576939984865480b65a022ad07
4
- data.tar.gz: acba58e69f8a8a8b2083318e983bac226c0681fb5925e927a412fee573ccdc7b
3
+ metadata.gz: 86037a5780e8f5f906a5232a9925b5e250177b6ebe653a81509167814dc87a2e
4
+ data.tar.gz: 91cafa728a48dd765a2b66fc41c9a2a4f2952d72737472c6f1f88af28d9053b8
5
5
  SHA512:
6
- metadata.gz: 386730f70655e59069f9d90a42a8dcba7d4ed9fefb61ac0d6abcd56bce725be7a699441f7d8b357964c773e06f3d362c6d289d1dfc19c1e334d1b2e956e64875
7
- data.tar.gz: b37bee82b425c808658369824084fa92a93ff9a733464303b0343bfbf42f6c493286edafd87d051b78810c1d6b5d6eb85ba2fb09d637f10dca9bb22e35dce283
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? && association.belongs_to? && !association.polymorphic?
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[0...association_keys.size].sort
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|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DatabaseConsistency
4
- VERSION = '1.1.11'
4
+ VERSION = '1.1.14'
5
5
  end
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.11
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-01-15 00:00:00.000000000 Z
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.2.22
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