active_record_doctor 1.5.0 → 1.6.0

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +73 -6
  3. data/lib/active_record_doctor/printers/io_printer.rb +35 -6
  4. data/lib/active_record_doctor/railtie.rb +1 -1
  5. data/lib/active_record_doctor/tasks.rb +3 -0
  6. data/lib/active_record_doctor/tasks/base.rb +64 -0
  7. data/lib/active_record_doctor/tasks/extraneous_indexes.rb +4 -27
  8. data/lib/active_record_doctor/tasks/missing_foreign_keys.rb +6 -29
  9. data/lib/active_record_doctor/tasks/missing_non_null_constraint.rb +42 -0
  10. data/lib/active_record_doctor/tasks/missing_presence_validation.rb +39 -0
  11. data/lib/active_record_doctor/tasks/missing_unique_indexes.rb +51 -0
  12. data/lib/active_record_doctor/tasks/undefined_table_references.rb +6 -22
  13. data/lib/active_record_doctor/tasks/unindexed_deleted_at.rb +4 -25
  14. data/lib/active_record_doctor/tasks/unindexed_foreign_keys.rb +6 -29
  15. data/lib/active_record_doctor/version.rb +1 -1
  16. data/lib/tasks/active_record_doctor.rake +31 -0
  17. data/test/active_record_doctor/printers/io_printer_test.rb +4 -4
  18. data/test/active_record_doctor/tasks/extraneous_indexes_test.rb +70 -16
  19. data/test/active_record_doctor/tasks/missing_foreign_keys_test.rb +16 -8
  20. data/test/active_record_doctor/tasks/missing_non_null_constraint_test.rb +89 -0
  21. data/test/active_record_doctor/tasks/missing_presence_validation_test.rb +49 -0
  22. data/test/active_record_doctor/tasks/missing_unique_indexes_test.rb +95 -0
  23. data/test/active_record_doctor/tasks/unindexed_deleted_at_test.rb +23 -8
  24. data/test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb +16 -8
  25. data/test/dummy/app/models/application_record.rb +1 -1
  26. data/test/dummy/db/schema.rb +1 -50
  27. data/test/dummy/log/development.log +38 -498
  28. data/test/dummy/log/test.log +54108 -1571
  29. data/test/support/assertions.rb +11 -0
  30. data/test/support/forking_test.rb +28 -0
  31. data/test/support/temping.rb +25 -0
  32. data/test/test_helper.rb +0 -7
  33. metadata +34 -27
  34. data/lib/active_record_doctor/compatibility.rb +0 -11
  35. data/lib/tasks/active_record_doctor_tasks.rake +0 -27
  36. data/test/active_record_doctor/tasks/undefined_table_references_test.rb +0 -19
  37. data/test/dummy/app/models/comment.rb +0 -3
  38. data/test/dummy/app/models/contract.rb +0 -3
  39. data/test/dummy/app/models/employer.rb +0 -2
  40. data/test/dummy/app/models/profile.rb +0 -2
  41. data/test/dummy/app/models/user.rb +0 -3
  42. data/test/dummy/db/migrate/20160213101213_create_employers.rb +0 -15
  43. data/test/dummy/db/migrate/20160213101221_create_users.rb +0 -23
  44. data/test/dummy/db/migrate/20160213101232_create_profiles.rb +0 -15
  45. data/test/dummy/db/migrate/20160604081452_create_comments.rb +0 -11
  46. data/test/support/spy_printer.rb +0 -52
@@ -0,0 +1,11 @@
1
+ class ActiveSupport::TestCase
2
+ private
3
+
4
+ def run_task
5
+ self.class.name.sub(/Test$/, '').constantize.run.first
6
+ end
7
+
8
+ def assert_result(expected_result)
9
+ assert_equal(expected_result.sort_by(&:to_s), run_task.sort_by(&:to_s))
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ class ActiveSupport::TestCase
2
+ def run
3
+ read_io, write_io = IO.pipe
4
+ read_io.binmode
5
+ write_io.binmode
6
+
7
+ if fork
8
+ # Parent: load the result sent from the child
9
+
10
+ write_io.close
11
+ result = Marshal.load(read_io)
12
+ read_io.close
13
+
14
+ Process.wait
15
+ else
16
+ # Child: just run normally, dump the result, and exit the process to
17
+ # avoid double-reporting.
18
+ result = super
19
+
20
+ read_io.close
21
+ Marshal.dump(result, write_io)
22
+ write_io.close
23
+ exit
24
+ end
25
+
26
+ result
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ require 'temping'
2
+
3
+ class ActiveSupport::TestCase
4
+ teardown do
5
+ Temping.teardown
6
+ end
7
+ end
8
+
9
+ # Temping 3.10.0 is broken because it removes the tables in the order of
10
+ # creation which fails if foreign key constraints are present.
11
+ class Temping
12
+ class << self
13
+ alias_method :old_teardown, :teardown
14
+
15
+ def teardown
16
+ @model_klasses.reverse!
17
+ old_teardown
18
+
19
+ # This hack is required to avoid leaking temporary model classes defined
20
+ # by Temping. If we don't clear the cache then they'll be kept around and
21
+ # returned as valid models which will break tests.
22
+ ActiveSupport::DescendantsTracker.class_variable_get(:@@direct_descendants).clear
23
+ end
24
+ end
25
+ end
data/test/test_helper.rb CHANGED
@@ -11,10 +11,3 @@ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
11
11
 
12
12
  # Load support files
13
13
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
14
-
15
- # Load fixtures from the engine
16
- if ActiveSupport::TestCase.respond_to?(:fixture_path=)
17
- ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
18
- ActionDispatch::IntegrationTest.fixture_path = ActiveSupport::TestCase.fixture_path
19
- ActiveSupport::TestCase.fixtures :all
20
- end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_doctor
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Navis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-30 00:00:00.000000000 Z
11
+ date: 2018-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -54,6 +54,20 @@ dependencies:
54
54
  version: '4.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pg
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "<="
60
+ - !ruby/object:Gem::Version
61
+ version: '0.20'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "<="
67
+ - !ruby/object:Gem::Version
68
+ version: '0.20'
69
+ - !ruby/object:Gem::Dependency
70
+ name: temping
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - ">="
@@ -77,24 +91,29 @@ files:
77
91
  - README.md
78
92
  - Rakefile
79
93
  - lib/active_record_doctor.rb
80
- - lib/active_record_doctor/compatibility.rb
81
94
  - lib/active_record_doctor/printers.rb
82
95
  - lib/active_record_doctor/printers/io_printer.rb
83
96
  - lib/active_record_doctor/railtie.rb
84
97
  - lib/active_record_doctor/tasks.rb
98
+ - lib/active_record_doctor/tasks/base.rb
85
99
  - lib/active_record_doctor/tasks/extraneous_indexes.rb
86
100
  - lib/active_record_doctor/tasks/missing_foreign_keys.rb
101
+ - lib/active_record_doctor/tasks/missing_non_null_constraint.rb
102
+ - lib/active_record_doctor/tasks/missing_presence_validation.rb
103
+ - lib/active_record_doctor/tasks/missing_unique_indexes.rb
87
104
  - lib/active_record_doctor/tasks/undefined_table_references.rb
88
105
  - lib/active_record_doctor/tasks/unindexed_deleted_at.rb
89
106
  - lib/active_record_doctor/tasks/unindexed_foreign_keys.rb
90
107
  - lib/active_record_doctor/version.rb
91
108
  - lib/generators/active_record_doctor/add_indexes/USAGE
92
109
  - lib/generators/active_record_doctor/add_indexes/add_indexes_generator.rb
93
- - lib/tasks/active_record_doctor_tasks.rake
110
+ - lib/tasks/active_record_doctor.rake
94
111
  - test/active_record_doctor/printers/io_printer_test.rb
95
112
  - test/active_record_doctor/tasks/extraneous_indexes_test.rb
96
113
  - test/active_record_doctor/tasks/missing_foreign_keys_test.rb
97
- - test/active_record_doctor/tasks/undefined_table_references_test.rb
114
+ - test/active_record_doctor/tasks/missing_non_null_constraint_test.rb
115
+ - test/active_record_doctor/tasks/missing_presence_validation_test.rb
116
+ - test/active_record_doctor/tasks/missing_unique_indexes_test.rb
98
117
  - test/active_record_doctor/tasks/unindexed_deleted_at_test.rb
99
118
  - test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb
100
119
  - test/dummy/README.rdoc
@@ -104,11 +123,6 @@ files:
104
123
  - test/dummy/app/controllers/application_controller.rb
105
124
  - test/dummy/app/helpers/application_helper.rb
106
125
  - test/dummy/app/models/application_record.rb
107
- - test/dummy/app/models/comment.rb
108
- - test/dummy/app/models/contract.rb
109
- - test/dummy/app/models/employer.rb
110
- - test/dummy/app/models/profile.rb
111
- - test/dummy/app/models/user.rb
112
126
  - test/dummy/app/views/layouts/application.html.erb
113
127
  - test/dummy/bin/bundle
114
128
  - test/dummy/bin/rails
@@ -134,10 +148,6 @@ files:
134
148
  - test/dummy/config/locales/en.yml
135
149
  - test/dummy/config/routes.rb
136
150
  - test/dummy/config/secrets.yml
137
- - test/dummy/db/migrate/20160213101213_create_employers.rb
138
- - test/dummy/db/migrate/20160213101221_create_users.rb
139
- - test/dummy/db/migrate/20160213101232_create_profiles.rb
140
- - test/dummy/db/migrate/20160604081452_create_comments.rb
141
151
  - test/dummy/db/migrate/base_migration.rb
142
152
  - test/dummy/db/schema.rb
143
153
  - test/dummy/log/development.log
@@ -146,7 +156,9 @@ files:
146
156
  - test/dummy/public/422.html
147
157
  - test/dummy/public/500.html
148
158
  - test/dummy/public/favicon.ico
149
- - test/support/spy_printer.rb
159
+ - test/support/assertions.rb
160
+ - test/support/forking_test.rb
161
+ - test/support/temping.rb
150
162
  - test/test_helper.rb
151
163
  homepage: https://github.com/gregnavis/active_record_doctor
152
164
  licenses:
@@ -168,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
180
  version: '0'
169
181
  requirements: []
170
182
  rubyforge_project:
171
- rubygems_version: 2.5.2
183
+ rubygems_version: 2.4.5
172
184
  signing_key:
173
185
  specification_version: 4
174
186
  summary: A cure for your Active Record ailments.
@@ -178,8 +190,10 @@ test_files:
178
190
  - test/active_record_doctor/tasks/unindexed_deleted_at_test.rb
179
191
  - test/active_record_doctor/tasks/missing_foreign_keys_test.rb
180
192
  - test/active_record_doctor/tasks/extraneous_indexes_test.rb
181
- - test/active_record_doctor/tasks/undefined_table_references_test.rb
193
+ - test/active_record_doctor/tasks/missing_non_null_constraint_test.rb
194
+ - test/active_record_doctor/tasks/missing_presence_validation_test.rb
182
195
  - test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb
196
+ - test/active_record_doctor/tasks/missing_unique_indexes_test.rb
183
197
  - test/dummy/README.rdoc
184
198
  - test/dummy/log/development.log
185
199
  - test/dummy/log/test.log
@@ -192,18 +206,9 @@ test_files:
192
206
  - test/dummy/app/assets/stylesheets/application.css
193
207
  - test/dummy/app/assets/javascripts/application.js
194
208
  - test/dummy/app/views/layouts/application.html.erb
195
- - test/dummy/app/models/profile.rb
196
- - test/dummy/app/models/comment.rb
197
- - test/dummy/app/models/contract.rb
198
- - test/dummy/app/models/employer.rb
199
- - test/dummy/app/models/user.rb
200
209
  - test/dummy/app/models/application_record.rb
201
210
  - test/dummy/db/schema.rb
202
- - test/dummy/db/migrate/20160213101213_create_employers.rb
203
- - test/dummy/db/migrate/20160604081452_create_comments.rb
204
211
  - test/dummy/db/migrate/base_migration.rb
205
- - test/dummy/db/migrate/20160213101232_create_profiles.rb
206
- - test/dummy/db/migrate/20160213101221_create_users.rb
207
212
  - test/dummy/public/404.html
208
213
  - test/dummy/public/500.html
209
214
  - test/dummy/public/422.html
@@ -229,4 +234,6 @@ test_files:
229
234
  - test/dummy/config/boot.rb
230
235
  - test/dummy/Rakefile
231
236
  - test/dummy/config.ru
232
- - test/support/spy_printer.rb
237
+ - test/support/temping.rb
238
+ - test/support/forking_test.rb
239
+ - test/support/assertions.rb
@@ -1,11 +0,0 @@
1
- module ActiveRecordDoctor
2
- module Compatibility
3
- def connection_tables
4
- if Rails::VERSION::MAJOR == 5
5
- connection.data_sources
6
- else
7
- connection.tables
8
- end
9
- end
10
- end
11
- end
@@ -1,27 +0,0 @@
1
- require "active_record_doctor/tasks/unindexed_foreign_keys"
2
- require "active_record_doctor/tasks/extraneous_indexes"
3
- require "active_record_doctor/tasks/missing_foreign_keys"
4
- require "active_record_doctor/tasks/undefined_table_references"
5
- require "active_record_doctor/tasks/unindexed_deleted_at"
6
-
7
- namespace :active_record_doctor do
8
- task :unindexed_foreign_keys => :environment do
9
- ActiveRecordDoctor::Tasks::UnindexedForeignKeys.run
10
- end
11
-
12
- task :extraneous_indexes => :environment do
13
- ActiveRecordDoctor::Tasks::ExtraneousIndexes.run
14
- end
15
-
16
- task :missing_foreign_keys => :environment do
17
- ActiveRecordDoctor::Tasks::MissingForeignKeys.run
18
- end
19
-
20
- task :undefined_table_references => :environment do
21
- exit(ActiveRecordDoctor::Tasks::UndefinedTableReferences.run)
22
- end
23
-
24
- task :unindexed_soft_delete => :environment do
25
- ActiveRecordDoctor::Tasks::UnindexedDeletedAt.run
26
- end
27
- end
@@ -1,19 +0,0 @@
1
- require 'test_helper'
2
-
3
- require 'active_record_doctor/tasks/undefined_table_references'
4
-
5
- class ActiveRecordDoctor::Tasks::UndefinedTableReferencesTest < ActiveSupport::TestCase
6
- def test_undefined_table_references_are_reported
7
- result = run_task
8
-
9
- assert_equal([Contract], result)
10
- end
11
-
12
- private
13
-
14
- def run_task
15
- printer = SpyPrinter.new
16
- ActiveRecordDoctor::Tasks::UndefinedTableReferences.new(printer: printer).run
17
- printer.undefined_table_references
18
- end
19
- end
@@ -1,3 +0,0 @@
1
- class Comment < ActiveRecord::Base
2
- belongs_to :commentable, polymorphic: true
3
- end
@@ -1,3 +0,0 @@
1
- class Contract < ApplicationRecord
2
- self.table_name = 'contract_records'
3
- end
@@ -1,2 +0,0 @@
1
- class Employer < ActiveRecord::Base
2
- end
@@ -1,2 +0,0 @@
1
- class Profile < ActiveRecord::Base
2
- end
@@ -1,3 +0,0 @@
1
- class User < ActiveRecord::Base
2
- belongs_to :profile
3
- end
@@ -1,15 +0,0 @@
1
- require_relative 'base_migration'
2
-
3
- class CreateEmployers < BaseMigration
4
- def change
5
- create_table :employers do |t|
6
- t.string :name
7
- t.datetime :deleted_at
8
-
9
- t.timestamps null: false
10
- end
11
-
12
- add_index :employers, :id, where: 'deleted_at IS NULL'
13
- add_index :employers, :name, where: 'deleted_at IS NULL'
14
- end
15
- end
@@ -1,23 +0,0 @@
1
- require_relative 'base_migration'
2
-
3
- class CreateUsers < BaseMigration
4
- def change
5
- create_table :users do |t|
6
- t.string :email
7
- t.string :first_name
8
- t.string :last_name
9
- t.references :profile, foreign_key: false
10
- t.references :employer, foreign_key: true
11
- t.string :country_code, null: false
12
-
13
- t.timestamps null: false
14
- end
15
- add_index :users, [:last_name, :first_name, :email]
16
- add_index :users, [:last_name, :first_name]
17
- add_index :users, [:last_name, :first_name], unique: true, name: :unique_index_on_users_last_name_and_first_name
18
- add_index :users, :last_name
19
- add_index :users, :email
20
- add_index :users, :email, unique: true, name: :unique_index_on_users_email
21
- add_index :users, [:employer_id, :country_code]
22
- end
23
- end
@@ -1,15 +0,0 @@
1
- require_relative 'base_migration'
2
-
3
- class CreateProfiles < BaseMigration
4
- def change
5
- create_table :profiles do |t|
6
- t.string :first_name
7
- t.string :last_name
8
- t.datetime :deleted_at
9
-
10
- t.timestamps null: false
11
- end
12
-
13
- add_index :profiles, [:first_name, :last_name]
14
- end
15
- end
@@ -1,11 +0,0 @@
1
- require_relative 'base_migration'
2
-
3
- class CreateComments < BaseMigration
4
- def change
5
- create_table :comments do |t|
6
- t.references :commentable, polymorphic: true, index: true
7
-
8
- t.timestamps null: false
9
- end
10
- end
11
- end
@@ -1,52 +0,0 @@
1
- class SpyPrinter
2
- attr_reader :unindexed_foreign_keys, :extraneous_indexes,
3
- :missing_foreign_keys, :undefined_table_references, :unindexed_deleted_at
4
-
5
- def initialize
6
- @unindexed_foreign_keys = nil
7
- @extraneous_indexes = nil
8
- @missing_foreign_keys = nil
9
- @undefined_table_references = nil
10
- @unindexed_deleted_at = nil
11
- end
12
-
13
- def print_unindexed_foreign_keys(argument)
14
- if @unindexed_foreign_keys
15
- fail("print_unindexed_foreign_keys cannot be called twice")
16
- else
17
- @unindexed_foreign_keys = argument
18
- end
19
- end
20
-
21
- def print_extraneous_indexes(argument)
22
- if @extraneous_indexes
23
- fail("print_extraneous_indexes cannot be called twice")
24
- else
25
- @extraneous_indexes = argument
26
- end
27
- end
28
-
29
- def print_missing_foreign_keys(argument)
30
- if @missing_foreign_keys
31
- fail("print_missing_foreign_keys cannot be called twice")
32
- else
33
- @missing_foreign_keys = argument
34
- end
35
- end
36
-
37
- def print_undefined_table_references(argument)
38
- if @undefined_table_references
39
- fail("print_undefined_table_references cannot be called twice")
40
- else
41
- @undefined_table_references = argument
42
- end
43
- end
44
-
45
- def print_unindexed_deleted_at(argument)
46
- if @unindexed_deleted_at
47
- fail("print_unindexed_deleted_at cannot be called twice")
48
- else
49
- @unindexed_deleted_at = argument
50
- end
51
- end
52
- end