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.
- checksums.yaml +4 -4
- data/README.md +73 -6
- data/lib/active_record_doctor/printers/io_printer.rb +35 -6
- data/lib/active_record_doctor/railtie.rb +1 -1
- data/lib/active_record_doctor/tasks.rb +3 -0
- data/lib/active_record_doctor/tasks/base.rb +64 -0
- data/lib/active_record_doctor/tasks/extraneous_indexes.rb +4 -27
- data/lib/active_record_doctor/tasks/missing_foreign_keys.rb +6 -29
- data/lib/active_record_doctor/tasks/missing_non_null_constraint.rb +42 -0
- data/lib/active_record_doctor/tasks/missing_presence_validation.rb +39 -0
- data/lib/active_record_doctor/tasks/missing_unique_indexes.rb +51 -0
- data/lib/active_record_doctor/tasks/undefined_table_references.rb +6 -22
- data/lib/active_record_doctor/tasks/unindexed_deleted_at.rb +4 -25
- data/lib/active_record_doctor/tasks/unindexed_foreign_keys.rb +6 -29
- data/lib/active_record_doctor/version.rb +1 -1
- data/lib/tasks/active_record_doctor.rake +31 -0
- data/test/active_record_doctor/printers/io_printer_test.rb +4 -4
- data/test/active_record_doctor/tasks/extraneous_indexes_test.rb +70 -16
- data/test/active_record_doctor/tasks/missing_foreign_keys_test.rb +16 -8
- data/test/active_record_doctor/tasks/missing_non_null_constraint_test.rb +89 -0
- data/test/active_record_doctor/tasks/missing_presence_validation_test.rb +49 -0
- data/test/active_record_doctor/tasks/missing_unique_indexes_test.rb +95 -0
- data/test/active_record_doctor/tasks/unindexed_deleted_at_test.rb +23 -8
- data/test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb +16 -8
- data/test/dummy/app/models/application_record.rb +1 -1
- data/test/dummy/db/schema.rb +1 -50
- data/test/dummy/log/development.log +38 -498
- data/test/dummy/log/test.log +54108 -1571
- data/test/support/assertions.rb +11 -0
- data/test/support/forking_test.rb +28 -0
- data/test/support/temping.rb +25 -0
- data/test/test_helper.rb +0 -7
- metadata +34 -27
- data/lib/active_record_doctor/compatibility.rb +0 -11
- data/lib/tasks/active_record_doctor_tasks.rake +0 -27
- data/test/active_record_doctor/tasks/undefined_table_references_test.rb +0 -19
- data/test/dummy/app/models/comment.rb +0 -3
- data/test/dummy/app/models/contract.rb +0 -3
- data/test/dummy/app/models/employer.rb +0 -2
- data/test/dummy/app/models/profile.rb +0 -2
- data/test/dummy/app/models/user.rb +0 -3
- data/test/dummy/db/migrate/20160213101213_create_employers.rb +0 -15
- data/test/dummy/db/migrate/20160213101221_create_users.rb +0 -23
- data/test/dummy/db/migrate/20160213101232_create_profiles.rb +0 -15
- data/test/dummy/db/migrate/20160604081452_create_comments.rb +0 -11
- data/test/support/spy_printer.rb +0 -52
@@ -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.
|
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:
|
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/
|
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/
|
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/
|
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
|
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/
|
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/
|
237
|
+
- test/support/temping.rb
|
238
|
+
- test/support/forking_test.rb
|
239
|
+
- test/support/assertions.rb
|
@@ -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,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
|
data/test/support/spy_printer.rb
DELETED
@@ -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
|