active_record_doctor 1.5.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
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