database_consistency 2.0.4 → 3.0.5

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/bin/database_consistency +19 -2
  3. data/lib/database_consistency/checkers/association_checkers/association_checker.rb +11 -0
  4. data/lib/database_consistency/checkers/association_checkers/foreign_key_cascade_checker.rb +5 -4
  5. data/lib/database_consistency/checkers/association_checkers/foreign_key_checker.rb +1 -1
  6. data/lib/database_consistency/checkers/association_checkers/foreign_key_type_checker.rb +46 -35
  7. data/lib/database_consistency/checkers/association_checkers/missing_dependent_destroy_checker.rb +53 -0
  8. data/lib/database_consistency/checkers/base_checker.rb +1 -2
  9. data/lib/database_consistency/checkers/column_checkers/column_checker.rb +4 -0
  10. data/lib/database_consistency/checkers/column_checkers/missing_index_find_by_checker.rb +192 -0
  11. data/lib/database_consistency/checkers/column_checkers/null_constraint_checker.rb +1 -1
  12. data/lib/database_consistency/checkers/enum_checkers/enum_checker.rb +4 -0
  13. data/lib/database_consistency/checkers/index_checkers/index_checker.rb +4 -0
  14. data/lib/database_consistency/checkers/index_checkers/redundant_index_checker.rb +2 -2
  15. data/lib/database_consistency/checkers/index_checkers/unique_index_checker.rb +7 -4
  16. data/lib/database_consistency/checkers/model_checkers/model_checker.rb +4 -0
  17. data/lib/database_consistency/checkers/model_checkers/view_primary_key_checker.rb +36 -0
  18. data/lib/database_consistency/checkers/validator_checkers/missing_unique_index_checker.rb +16 -4
  19. data/lib/database_consistency/checkers/validator_checkers/validator_checker.rb +4 -0
  20. data/lib/database_consistency/checkers/validators_fraction_checkers/validators_fraction_checker.rb +4 -0
  21. data/lib/database_consistency/configuration.rb +8 -7
  22. data/lib/database_consistency/debug_context.rb +0 -1
  23. data/lib/database_consistency/files_helper.rb +53 -0
  24. data/lib/database_consistency/helper.rb +215 -2
  25. data/lib/database_consistency/prism_helper.rb +38 -0
  26. data/lib/database_consistency/rescue_error.rb +3 -3
  27. data/lib/database_consistency/version.rb +1 -1
  28. data/lib/database_consistency/writers/autofix/migration_base.rb +1 -1
  29. data/lib/database_consistency/writers/autofix_writer.rb +32 -1
  30. data/lib/database_consistency/writers/base_writer.rb +5 -4
  31. data/lib/database_consistency/writers/simple/association_foreign_type_missing_null_constraint.rb +1 -1
  32. data/lib/database_consistency/writers/simple/association_missing_index.rb +1 -1
  33. data/lib/database_consistency/writers/simple/association_missing_null_constraint.rb +1 -1
  34. data/lib/database_consistency/writers/simple/enum_values_inconsistent_with_ar_enum.rb +1 -1
  35. data/lib/database_consistency/writers/simple/enum_values_inconsistent_with_inclusion.rb +1 -1
  36. data/lib/database_consistency/writers/simple/has_one_missing_unique_index.rb +1 -1
  37. data/lib/database_consistency/writers/simple/implicit_order_column_missing.rb +1 -1
  38. data/lib/database_consistency/writers/simple/inconsistent_enum_type.rb +1 -1
  39. data/lib/database_consistency/writers/simple/inconsistent_types.rb +2 -2
  40. data/lib/database_consistency/writers/simple/length_validator_greater_limit.rb +1 -1
  41. data/lib/database_consistency/writers/simple/length_validator_lower_limit.rb +1 -1
  42. data/lib/database_consistency/writers/simple/length_validator_missing.rb +1 -1
  43. data/lib/database_consistency/writers/simple/missing_association_class.rb +1 -1
  44. data/lib/database_consistency/writers/simple/missing_dependent_destroy.rb +22 -0
  45. data/lib/database_consistency/writers/simple/missing_foreign_key.rb +1 -1
  46. data/lib/database_consistency/writers/simple/missing_foreign_key_cascade.rb +1 -1
  47. data/lib/database_consistency/writers/simple/missing_index_find_by.rb +32 -0
  48. data/lib/database_consistency/writers/simple/missing_table.rb +1 -1
  49. data/lib/database_consistency/writers/simple/missing_unique_index.rb +1 -1
  50. data/lib/database_consistency/writers/simple/missing_uniqueness_validation.rb +1 -1
  51. data/lib/database_consistency/writers/simple/null_constraint_association_misses_validator.rb +1 -1
  52. data/lib/database_consistency/writers/simple/null_constraint_misses_validator.rb +1 -1
  53. data/lib/database_consistency/writers/simple/null_constraint_missing.rb +1 -1
  54. data/lib/database_consistency/writers/simple/possible_null.rb +1 -1
  55. data/lib/database_consistency/writers/simple/redundant_case_insensitive_option.rb +1 -1
  56. data/lib/database_consistency/writers/simple/redundant_index.rb +1 -1
  57. data/lib/database_consistency/writers/simple/redundant_unique_index.rb +1 -1
  58. data/lib/database_consistency/writers/simple/small_primary_key.rb +1 -1
  59. data/lib/database_consistency/writers/simple/three_state_boolean.rb +1 -1
  60. data/lib/database_consistency/writers/simple/view_missing_primary_key.rb +21 -0
  61. data/lib/database_consistency/writers/simple/view_primary_key_column_missing.rb +21 -0
  62. data/lib/database_consistency.rb +14 -7
  63. metadata +13 -4
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'should have foreign key with on_delete: :%<cascade_option>s in the database'
10
+ 'should have a foreign key with on_delete: :%<cascade_option>s in the database'
11
11
  end
12
12
 
13
13
  def attributes
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DatabaseConsistency
4
+ module Writers
5
+ module Simple
6
+ class MissingIndexFindBy < Base # :nodoc:
7
+ private
8
+
9
+ def template
10
+ 'column is used in find_by but is missing an index%<source_location>s'
11
+ end
12
+
13
+ def attributes
14
+ if report.source_location
15
+ count = report.total_findings_count || 1
16
+ count_str = count > 1 ? ", and #{count - 1} more" : ''
17
+ { source_location: " (found at #{report.source_location}#{count_str})" }
18
+ else
19
+ { source_location: '' }
20
+ end
21
+ end
22
+
23
+ def unique_attributes
24
+ {
25
+ table_or_model_name: report.table_or_model_name,
26
+ column_or_attribute_name: report.column_or_attribute_name
27
+ }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'should have a table in the database'
10
+ 'should have a corresponding table in the database'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'model should have proper unique index in the database'
10
+ 'model should have a unique index in the database'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'index is unique in the database but do not have uniqueness validator'
10
+ 'index is unique in the database but does not have a uniqueness validator'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'column is required in the database but do not have presence validator for association %<association_name>s'
10
+ 'column is NOT NULL but does not have a presence validator for association %<association_name>s'
11
11
  end
12
12
 
13
13
  def attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'column is required in the database but does not have a validator disallowing nil values'
10
+ 'column is NOT NULL but does not have a validator disallowing nil values'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'column should be required in the database'
10
+ 'column should be NOT NULL'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'column is required but there is possible null value insert'
10
+ 'column is NOT NULL but may receive a NULL value'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- "has case insensitive type and doesn't require case_sensitive: false option"
10
+ 'column has a case-insensitive type and does not need the case_sensitive: false option'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'index is redundant as %<covered_index_name>s covers it'
10
+ 'index is redundant because %<covered_index_name>s covers it'
11
11
  end
12
12
 
13
13
  def attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'index uniqueness is redundant as %<covered_index_name>s covers it'
10
+ 'index uniqueness is redundant because %<covered_index_name>s covers it'
11
11
  end
12
12
 
13
13
  def attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'column has int/serial type but recommended to have bigint/bigserial/uuid'
10
+ 'column has int/serial type but it is recommended to use bigint/bigserial/uuid'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -7,7 +7,7 @@ module DatabaseConsistency
7
7
  private
8
8
 
9
9
  def template
10
- 'boolean column should have NOT NULL constraint'
10
+ 'boolean column should be NOT NULL'
11
11
  end
12
12
 
13
13
  def unique_attributes
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DatabaseConsistency
4
+ module Writers
5
+ module Simple
6
+ class ViewMissingPrimaryKey < Base # :nodoc:
7
+ private
8
+
9
+ def template
10
+ 'model backed by a database view should have primary_key set'
11
+ end
12
+
13
+ def unique_attributes
14
+ {
15
+ table_or_model_name: report.table_or_model_name
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DatabaseConsistency
4
+ module Writers
5
+ module Simple
6
+ class ViewPrimaryKeyColumnMissing < Base # :nodoc:
7
+ private
8
+
9
+ def template
10
+ 'model backed by a database view has primary_key set to a non-existent column'
11
+ end
12
+
13
+ def unique_attributes
14
+ {
15
+ table_or_model_name: report.table_or_model_name
16
+ }
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,14 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_record'
4
- require 'active_support/inflector'
5
-
6
- ActiveSupport::Inflector.inflections do |inflect|
7
- inflect.irregular 'index', 'indexes'
8
- end
9
4
 
10
5
  require 'database_consistency/version'
11
6
  require 'database_consistency/helper'
7
+ require 'database_consistency/files_helper'
8
+ require 'database_consistency/prism_helper'
12
9
  require 'database_consistency/configuration'
13
10
  require 'database_consistency/rescue_error'
14
11
  require 'database_consistency/errors'
@@ -48,6 +45,10 @@ require 'database_consistency/writers/simple/three_state_boolean'
48
45
  require 'database_consistency/writers/simple/missing_association_class'
49
46
  require 'database_consistency/writers/simple/missing_table'
50
47
  require 'database_consistency/writers/simple/implicit_order_column_missing'
48
+ require 'database_consistency/writers/simple/missing_dependent_destroy'
49
+ require 'database_consistency/writers/simple/missing_index_find_by'
50
+ require 'database_consistency/writers/simple/view_missing_primary_key'
51
+ require 'database_consistency/writers/simple/view_primary_key_column_missing'
51
52
  require 'database_consistency/writers/simple_writer'
52
53
 
53
54
  require 'database_consistency/writers/autofix/helpers/migration'
@@ -81,6 +82,7 @@ require 'database_consistency/checkers/enum_checkers/enum_type_checker'
81
82
 
82
83
  require 'database_consistency/checkers/model_checkers/model_checker'
83
84
  require 'database_consistency/checkers/model_checkers/missing_table_checker'
85
+ require 'database_consistency/checkers/model_checkers/view_primary_key_checker'
84
86
 
85
87
  require 'database_consistency/checkers/association_checkers/association_checker'
86
88
  require 'database_consistency/checkers/association_checkers/missing_index_checker'
@@ -88,6 +90,7 @@ require 'database_consistency/checkers/association_checkers/foreign_key_checker'
88
90
  require 'database_consistency/checkers/association_checkers/foreign_key_type_checker'
89
91
  require 'database_consistency/checkers/association_checkers/foreign_key_cascade_checker'
90
92
  require 'database_consistency/checkers/association_checkers/missing_association_class_checker'
93
+ require 'database_consistency/checkers/association_checkers/missing_dependent_destroy_checker'
91
94
 
92
95
  require 'database_consistency/checkers/column_checkers/column_checker'
93
96
  require 'database_consistency/checkers/column_checkers/null_constraint_checker'
@@ -96,6 +99,7 @@ require 'database_consistency/checkers/column_checkers/primary_key_type_checker'
96
99
  require 'database_consistency/checkers/column_checkers/enum_value_checker'
97
100
  require 'database_consistency/checkers/column_checkers/three_state_boolean_checker'
98
101
  require 'database_consistency/checkers/column_checkers/implicit_ordering_checker'
102
+ require 'database_consistency/checkers/column_checkers/missing_index_find_by_checker'
99
103
 
100
104
  require 'database_consistency/checkers/validator_checkers/validator_checker'
101
105
  require 'database_consistency/checkers/validator_checkers/missing_unique_index_checker'
@@ -112,12 +116,15 @@ require 'database_consistency/checkers/index_checkers/redundant_unique_index_che
112
116
  # The root module
113
117
  module DatabaseConsistency
114
118
  class << self
115
- def run(*args, **opts) # rubocop:disable Metrics/MethodLength
119
+ def run(*args, **opts) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
116
120
  configuration = Configuration.new(*args)
121
+
122
+ Writers::AutofixWriter.validate_scope!(opts[:only_checkers]) if opts[:autofix]
123
+
117
124
  reports = Processors.reports(configuration)
118
125
 
119
126
  if opts[:autofix]
120
- Writers::AutofixWriter.write(reports, config: configuration)
127
+ Writers::AutofixWriter.write(reports, config: configuration, opts: opts[:only_checkers])
121
128
 
122
129
  0
123
130
  elsif opts[:todo]
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: 2.0.4
4
+ version: 3.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evgeniy Demin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-07 00:00:00.000000000 Z
11
+ date: 2026-05-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -151,12 +151,14 @@ files:
151
151
  - lib/database_consistency/checkers/association_checkers/foreign_key_checker.rb
152
152
  - lib/database_consistency/checkers/association_checkers/foreign_key_type_checker.rb
153
153
  - lib/database_consistency/checkers/association_checkers/missing_association_class_checker.rb
154
+ - lib/database_consistency/checkers/association_checkers/missing_dependent_destroy_checker.rb
154
155
  - lib/database_consistency/checkers/association_checkers/missing_index_checker.rb
155
156
  - lib/database_consistency/checkers/base_checker.rb
156
157
  - lib/database_consistency/checkers/column_checkers/column_checker.rb
157
158
  - lib/database_consistency/checkers/column_checkers/enum_value_checker.rb
158
159
  - lib/database_consistency/checkers/column_checkers/implicit_ordering_checker.rb
159
160
  - lib/database_consistency/checkers/column_checkers/length_constraint_checker.rb
161
+ - lib/database_consistency/checkers/column_checkers/missing_index_find_by_checker.rb
160
162
  - lib/database_consistency/checkers/column_checkers/null_constraint_checker.rb
161
163
  - lib/database_consistency/checkers/column_checkers/primary_key_type_checker.rb
162
164
  - lib/database_consistency/checkers/column_checkers/three_state_boolean_checker.rb
@@ -168,6 +170,7 @@ files:
168
170
  - lib/database_consistency/checkers/index_checkers/unique_index_checker.rb
169
171
  - lib/database_consistency/checkers/model_checkers/missing_table_checker.rb
170
172
  - lib/database_consistency/checkers/model_checkers/model_checker.rb
173
+ - lib/database_consistency/checkers/model_checkers/view_primary_key_checker.rb
171
174
  - lib/database_consistency/checkers/validator_checkers/case_sensitive_unique_validation_checker.rb
172
175
  - lib/database_consistency/checkers/validator_checkers/missing_unique_index_checker.rb
173
176
  - lib/database_consistency/checkers/validator_checkers/validator_checker.rb
@@ -179,7 +182,9 @@ files:
179
182
  - lib/database_consistency/databases/types/sqlite.rb
180
183
  - lib/database_consistency/debug_context.rb
181
184
  - lib/database_consistency/errors.rb
185
+ - lib/database_consistency/files_helper.rb
182
186
  - lib/database_consistency/helper.rb
187
+ - lib/database_consistency/prism_helper.rb
183
188
  - lib/database_consistency/processors/associations_processor.rb
184
189
  - lib/database_consistency/processors/base_processor.rb
185
190
  - lib/database_consistency/processors/columns_processor.rb
@@ -225,8 +230,10 @@ files:
225
230
  - lib/database_consistency/writers/simple/length_validator_lower_limit.rb
226
231
  - lib/database_consistency/writers/simple/length_validator_missing.rb
227
232
  - lib/database_consistency/writers/simple/missing_association_class.rb
233
+ - lib/database_consistency/writers/simple/missing_dependent_destroy.rb
228
234
  - lib/database_consistency/writers/simple/missing_foreign_key.rb
229
235
  - lib/database_consistency/writers/simple/missing_foreign_key_cascade.rb
236
+ - lib/database_consistency/writers/simple/missing_index_find_by.rb
230
237
  - lib/database_consistency/writers/simple/missing_table.rb
231
238
  - lib/database_consistency/writers/simple/missing_unique_index.rb
232
239
  - lib/database_consistency/writers/simple/missing_uniqueness_validation.rb
@@ -239,6 +246,8 @@ files:
239
246
  - lib/database_consistency/writers/simple/redundant_unique_index.rb
240
247
  - lib/database_consistency/writers/simple/small_primary_key.rb
241
248
  - lib/database_consistency/writers/simple/three_state_boolean.rb
249
+ - lib/database_consistency/writers/simple/view_missing_primary_key.rb
250
+ - lib/database_consistency/writers/simple/view_primary_key_column_missing.rb
242
251
  - lib/database_consistency/writers/simple_writer.rb
243
252
  - lib/database_consistency/writers/todo_writer.rb
244
253
  homepage: https://github.com/djezzzl/database_consistency
@@ -266,14 +275,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
266
275
  requirements:
267
276
  - - ">="
268
277
  - !ruby/object:Gem::Version
269
- version: 2.4.0
278
+ version: 2.6.0
270
279
  required_rubygems_version: !ruby/object:Gem::Requirement
271
280
  requirements:
272
281
  - - ">="
273
282
  - !ruby/object:Gem::Version
274
283
  version: '0'
275
284
  requirements: []
276
- rubygems_version: 3.2.33
285
+ rubygems_version: 3.4.19
277
286
  signing_key:
278
287
  specification_version: 4
279
288
  summary: Provide an easy way to check the consistency of the database constraints