active_record_doctor 1.5.0 → 1.8.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 (99) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +152 -12
  3. data/lib/active_record_doctor.rb +20 -2
  4. data/lib/active_record_doctor/detectors.rb +13 -0
  5. data/lib/active_record_doctor/detectors/base.rb +64 -0
  6. data/lib/active_record_doctor/{tasks → detectors}/extraneous_indexes.rb +12 -29
  7. data/lib/active_record_doctor/detectors/incorrect_boolean_presence_validation.rb +40 -0
  8. data/lib/active_record_doctor/detectors/incorrect_dependent_option.rb +71 -0
  9. data/lib/active_record_doctor/{tasks → detectors}/missing_foreign_keys.rb +17 -35
  10. data/lib/active_record_doctor/detectors/missing_non_null_constraint.rb +60 -0
  11. data/lib/active_record_doctor/detectors/missing_presence_validation.rb +78 -0
  12. data/lib/active_record_doctor/detectors/missing_unique_indexes.rb +61 -0
  13. data/lib/active_record_doctor/detectors/undefined_table_references.rb +34 -0
  14. data/lib/active_record_doctor/detectors/unindexed_deleted_at.rb +29 -0
  15. data/lib/active_record_doctor/detectors/unindexed_foreign_keys.rb +48 -0
  16. data/lib/active_record_doctor/printers.rb +3 -1
  17. data/lib/active_record_doctor/printers/io_printer.rb +101 -26
  18. data/lib/active_record_doctor/railtie.rb +3 -1
  19. data/lib/active_record_doctor/task.rb +28 -0
  20. data/lib/active_record_doctor/version.rb +3 -1
  21. data/lib/generators/active_record_doctor/add_indexes/add_indexes_generator.rb +15 -11
  22. data/lib/tasks/active_record_doctor.rake +33 -0
  23. data/test/active_record_doctor/detectors/extraneous_indexes_test.rb +67 -0
  24. data/test/active_record_doctor/detectors/incorrect_boolean_presence_validation_test.rb +36 -0
  25. data/test/active_record_doctor/detectors/incorrect_dependent_option_test.rb +117 -0
  26. data/test/active_record_doctor/detectors/missing_foreign_keys_test.rb +24 -0
  27. data/test/active_record_doctor/detectors/missing_non_null_constraint_test.rb +102 -0
  28. data/test/active_record_doctor/detectors/missing_presence_validation_test.rb +107 -0
  29. data/test/active_record_doctor/detectors/missing_unique_indexes_test.rb +114 -0
  30. data/test/active_record_doctor/detectors/undefined_table_references_test.rb +44 -0
  31. data/test/active_record_doctor/detectors/unindexed_deleted_at_test.rb +67 -0
  32. data/test/active_record_doctor/detectors/unindexed_foreign_keys_test.rb +26 -0
  33. data/test/active_record_doctor/printers/io_printer_test.rb +23 -10
  34. data/test/model_factory.rb +78 -0
  35. data/test/setup.rb +126 -0
  36. metadata +93 -149
  37. data/Rakefile +0 -28
  38. data/lib/active_record_doctor/compatibility.rb +0 -11
  39. data/lib/active_record_doctor/tasks.rb +0 -4
  40. data/lib/active_record_doctor/tasks/undefined_table_references.rb +0 -34
  41. data/lib/active_record_doctor/tasks/unindexed_deleted_at.rb +0 -40
  42. data/lib/active_record_doctor/tasks/unindexed_foreign_keys.rb +0 -66
  43. data/lib/tasks/active_record_doctor_tasks.rake +0 -27
  44. data/test/active_record_doctor/tasks/extraneous_indexes_test.rb +0 -27
  45. data/test/active_record_doctor/tasks/missing_foreign_keys_test.rb +0 -19
  46. data/test/active_record_doctor/tasks/undefined_table_references_test.rb +0 -19
  47. data/test/active_record_doctor/tasks/unindexed_deleted_at_test.rb +0 -19
  48. data/test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb +0 -19
  49. data/test/dummy/README.rdoc +0 -28
  50. data/test/dummy/Rakefile +0 -6
  51. data/test/dummy/app/assets/javascripts/application.js +0 -13
  52. data/test/dummy/app/assets/stylesheets/application.css +0 -15
  53. data/test/dummy/app/controllers/application_controller.rb +0 -5
  54. data/test/dummy/app/helpers/application_helper.rb +0 -2
  55. data/test/dummy/app/models/application_record.rb +0 -3
  56. data/test/dummy/app/models/comment.rb +0 -3
  57. data/test/dummy/app/models/contract.rb +0 -3
  58. data/test/dummy/app/models/employer.rb +0 -2
  59. data/test/dummy/app/models/profile.rb +0 -2
  60. data/test/dummy/app/models/user.rb +0 -3
  61. data/test/dummy/app/views/layouts/application.html.erb +0 -14
  62. data/test/dummy/bin/bundle +0 -3
  63. data/test/dummy/bin/rails +0 -4
  64. data/test/dummy/bin/rake +0 -4
  65. data/test/dummy/bin/setup +0 -29
  66. data/test/dummy/config.ru +0 -4
  67. data/test/dummy/config/application.rb +0 -23
  68. data/test/dummy/config/boot.rb +0 -5
  69. data/test/dummy/config/database.yml +0 -19
  70. data/test/dummy/config/database.yml.travis +0 -5
  71. data/test/dummy/config/environment.rb +0 -5
  72. data/test/dummy/config/environments/development.rb +0 -41
  73. data/test/dummy/config/environments/production.rb +0 -79
  74. data/test/dummy/config/environments/test.rb +0 -47
  75. data/test/dummy/config/initializers/assets.rb +0 -11
  76. data/test/dummy/config/initializers/backtrace_silencers.rb +0 -7
  77. data/test/dummy/config/initializers/cookies_serializer.rb +0 -3
  78. data/test/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  79. data/test/dummy/config/initializers/inflections.rb +0 -16
  80. data/test/dummy/config/initializers/mime_types.rb +0 -4
  81. data/test/dummy/config/initializers/session_store.rb +0 -3
  82. data/test/dummy/config/initializers/wrap_parameters.rb +0 -14
  83. data/test/dummy/config/locales/en.yml +0 -23
  84. data/test/dummy/config/routes.rb +0 -56
  85. data/test/dummy/config/secrets.yml +0 -22
  86. data/test/dummy/db/migrate/20160213101213_create_employers.rb +0 -15
  87. data/test/dummy/db/migrate/20160213101221_create_users.rb +0 -23
  88. data/test/dummy/db/migrate/20160213101232_create_profiles.rb +0 -15
  89. data/test/dummy/db/migrate/20160604081452_create_comments.rb +0 -11
  90. data/test/dummy/db/migrate/base_migration.rb +0 -5
  91. data/test/dummy/db/schema.rb +0 -68
  92. data/test/dummy/log/development.log +0 -532
  93. data/test/dummy/log/test.log +0 -2699
  94. data/test/dummy/public/404.html +0 -67
  95. data/test/dummy/public/422.html +0 -67
  96. data/test/dummy/public/500.html +0 -66
  97. data/test/dummy/public/favicon.ico +0 -0
  98. data/test/support/spy_printer.rb +0 -52
  99. data/test/test_helper.rb +0 -20
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ActiveRecordDoctor::Detectors::UnindexedForeignKeysTest < Minitest::Test
4
+ def test_unindexed_foreign_key_is_reported
5
+ skip("MySQL always indexes foreign keys") if mysql?
6
+
7
+ create_table(:companies)
8
+ create_table(:users) do |t|
9
+ t.references :company, foreign_key: true, index: false
10
+ end
11
+
12
+ assert_problems(<<OUTPUT)
13
+ The following foreign keys should be indexed for performance reasons:
14
+ users company_id
15
+ OUTPUT
16
+ end
17
+
18
+ def test_indexed_foreign_key_is_not_reported
19
+ create_table(:companies)
20
+ create_table(:users) do |t|
21
+ t.references :company, foreign_key: true, index: true
22
+ end
23
+
24
+ refute_problems
25
+ end
26
+ end
@@ -1,20 +1,33 @@
1
- require 'test_helper'
1
+ # frozen_string_literal: true
2
2
 
3
- require 'active_record_doctor/printers/io_printer'
3
+ # Load all detectors
4
+ class ActiveRecordDoctor::Printers::IOPrinterTest < Minitest::Test
5
+ def test_all_detectors_have_printers
6
+ ActiveRecordDoctor::Detectors::Base.subclasses.each do |detector_class|
7
+ name = detector_class.name.demodulize.underscore.to_sym
4
8
 
5
- class ActiveRecordDoctor::Printers::IOPrinterTest < ActiveSupport::TestCase
6
- def test_print_unindexed_foreign_keys
7
- assert_equal(<<EOF, print_unindexed_foreign_keys({ "users" => ["profile_id", "account_id"], "account" => ["group_id"] }))
8
- account group_id
9
- users account_id profile_id
10
- EOF
9
+ assert(
10
+ ActiveRecordDoctor::Printers::IOPrinter.method_defined?(name),
11
+ "IOPrinter should define #{name}"
12
+ )
13
+ end
14
+ end
15
+
16
+ def test_unindexed_foreign_keys
17
+ # rubocop:disable Layout/LineLength
18
+ assert_equal(<<OUTPUT, unindexed_foreign_keys({ "users" => ["profile_id", "account_id"], "account" => ["group_id"] }))
19
+ The following foreign keys should be indexed for performance reasons:
20
+ account group_id
21
+ users account_id profile_id
22
+ OUTPUT
23
+ # rubocop:enable Layout/LineLength
11
24
  end
12
25
 
13
26
  private
14
27
 
15
- def print_unindexed_foreign_keys(argument)
28
+ def unindexed_foreign_keys(argument)
16
29
  io = StringIO.new
17
- ActiveRecordDoctor::Printers::IOPrinter.new(io: io).print_unindexed_foreign_keys(argument)
30
+ ActiveRecordDoctor::Printers::IOPrinter.new(io).unindexed_foreign_keys(argument, {})
18
31
  io.string
19
32
  end
20
33
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ModelFactory
4
+ def self.cleanup
5
+ delete_models
6
+ drop_all_tables
7
+ GC.start
8
+ end
9
+
10
+ def self.drop_all_tables
11
+ connection = ActiveRecord::Base.connection
12
+ loop do
13
+ before = connection.tables.size
14
+ break if before.zero?
15
+
16
+ attempt_drop_all_tables(connection)
17
+ after = connection.tables.size
18
+
19
+ if before == after
20
+ raise("cannot delete temporary tables - most likely due to failing constraints")
21
+ end
22
+ end
23
+ end
24
+
25
+ def self.attempt_drop_all_tables(connection)
26
+ connection.tables.each do |table_name|
27
+ ActiveRecord::Migration.suppress_messages do
28
+ begin
29
+ connection.drop_table(table_name, force: :cascade)
30
+ rescue ActiveRecord::InvalidForeignKey, ActiveRecord::StatementInvalid
31
+ # The table cannot be dropped due to foreign key constraints so
32
+ # we'll try to drop it on another attempt.
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ def self.delete_models
39
+ Models.empty
40
+ end
41
+
42
+ def self.create_table(table_name, &block)
43
+ table_name = table_name.to_sym
44
+ ActiveRecord::Migration.suppress_messages do
45
+ ActiveRecord::Migration.create_table(table_name, &block)
46
+ end
47
+
48
+ # Return a proxy object allowing the caller to chain #create_model
49
+ # right after creating a table so that it can be followed by the model
50
+ # definition.
51
+ ModelDefinitionProxy.new(table_name)
52
+ end
53
+
54
+ def self.create_model(table_name, &block)
55
+ table_name = table_name.to_sym
56
+ klass = Class.new(ActiveRecord::Base, &block)
57
+ klass_name = table_name.to_s.classify
58
+ Models.const_set(klass_name, klass)
59
+ end
60
+
61
+ class ModelDefinitionProxy
62
+ def initialize(table_name)
63
+ @table_name = table_name
64
+ end
65
+
66
+ def create_model(&block)
67
+ ModelFactory.create_model(@table_name, &block)
68
+ end
69
+ end
70
+
71
+ module Models
72
+ def self.empty
73
+ constants.each do |name|
74
+ remove_const(name)
75
+ end
76
+ end
77
+ end
78
+ end
data/test/setup.rb ADDED
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Configure Active Record.
4
+
5
+ # We must import "uri" explicitly as otherwsie URI won't be accessible in
6
+ # Ruby 2.7.2 / Rails 6.
7
+ require "uri"
8
+
9
+ require "active_record"
10
+
11
+ # Connect to the database defined in the URL.
12
+ case ENV["DATABASE"]
13
+ when "postgresql"
14
+ require "pg"
15
+ DEFAULT_DATABASE_URL = "postgres:///active_record_doctor_test"
16
+ when "mysql"
17
+ require "mysql2"
18
+ DEFAULT_DATABASE_URL = "mysql2:///active_record_doctor_test"
19
+ when nil
20
+ # rubocop:disable Style/StderrPuts
21
+ $stderr.puts(<<ERROR)
22
+ The DATABASE environment variable is not set. It must be set before running the
23
+ test suite. Valid values are "mysql" and "postgresql".
24
+ ERROR
25
+ # rubocop:enable Style/StderrPuts
26
+ exit(1)
27
+ else raise("unrecognized database #{ENV['DATABASE']}")
28
+ end
29
+ ActiveRecord::Base.establish_connection(ENV.fetch("DATABASE_URL", DEFAULT_DATABASE_URL))
30
+
31
+ # We need to call #connection to enfore Active Record to actually establish
32
+ # the connection.
33
+ ActiveRecord::Base.connection
34
+
35
+ # We need to mock Rails because some detectors depend on .eager_load! This must
36
+ # happen AFTER loading active_record_doctor as otherwise it'd attempt to
37
+ # install a Railtie.
38
+ module Rails
39
+ class TestApplication
40
+ def eager_load!
41
+ end
42
+ end
43
+
44
+ def self.application
45
+ @application ||= TestApplication.new
46
+ end
47
+ end
48
+
49
+ # Load Active Record Doctor.
50
+ require "active_record_doctor"
51
+
52
+ # Configure the test suite.
53
+ require "minitest"
54
+ require "minitest/autorun"
55
+ require "minitest/fork_executor"
56
+
57
+ require_relative "model_factory"
58
+
59
+ # Prepare the test class.
60
+ class Minitest::Test
61
+ def setup
62
+ # Ensure all remnants of previous test runs, most likely in form of tables,
63
+ # are removed.
64
+ ModelFactory.cleanup
65
+ end
66
+
67
+ def teardown
68
+ ModelFactory.cleanup
69
+ end
70
+
71
+ private
72
+
73
+ def postgresql?
74
+ ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
75
+ end
76
+
77
+ def mysql?
78
+ ActiveRecord::Base.connection.adapter_name == "Mysql2"
79
+ end
80
+
81
+ def create_table(*args, &block)
82
+ ModelFactory.create_table(*args, &block)
83
+ end
84
+
85
+ def create_model(*args, &block)
86
+ ModelFactory.create_model(*args, &block)
87
+ end
88
+
89
+ # Return the detector class under test.
90
+ def detector_class
91
+ self.class.name.sub(/Test$/, "").constantize
92
+ end
93
+
94
+ # Run the appropriate detector. The detector name is inferred from the test class.
95
+ def run_detector
96
+ detector_class.run.first
97
+ end
98
+
99
+ def run_task
100
+ output = StringIO.new
101
+ printer = ActiveRecordDoctor::Printers::IOPrinter.new(output)
102
+ success = ActiveRecordDoctor::Task.new(detector_class, printer).run
103
+ [success, output.string]
104
+ end
105
+
106
+ def assert_problems(expected_output)
107
+ success, actual_output = run_task
108
+
109
+ assert_equal(expected_output, actual_output)
110
+ refute(success)
111
+ end
112
+
113
+ def refute_problems
114
+ success, actual_output = run_task
115
+
116
+ assert_equal("", actual_output)
117
+ assert(success)
118
+ end
119
+ end
120
+
121
+ # Filter out Minitest backtrace while allowing backtrace from other libraries
122
+ # to be shown.
123
+ Minitest.backtrace_filter = Minitest::BacktraceFilter.new
124
+
125
+ # Uncomment in case there's test case interference.
126
+ Minitest.parallel_executor = Minitest::ForkExecutor.new
metadata CHANGED
@@ -1,72 +1,100 @@
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.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Navis
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-30 00:00:00.000000000 Z
11
+ date: 2021-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: railties
14
+ name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: 4.2.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.2'
26
+ version: 4.2.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: activerecord
28
+ name: minitest-fork_executor
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '4.2'
34
- type: :runtime
33
+ version: 1.0.2
34
+ type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '4.2'
40
+ version: 1.0.2
41
41
  - !ruby/object:Gem::Dependency
42
- name: rails
42
+ name: mysql2
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '4.2'
47
+ version: 0.5.3
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '4.2'
54
+ version: 0.5.3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: pg
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 1.1.4
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
69
- description:
68
+ version: 1.1.4
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 12.3.3
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 12.3.3
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.14.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.14.0
97
+ description:
70
98
  email:
71
99
  - contact@gregnavis.com
72
100
  executables: []
@@ -75,84 +103,45 @@ extra_rdoc_files: []
75
103
  files:
76
104
  - MIT-LICENSE.txt
77
105
  - README.md
78
- - Rakefile
79
106
  - lib/active_record_doctor.rb
80
- - lib/active_record_doctor/compatibility.rb
107
+ - lib/active_record_doctor/detectors.rb
108
+ - lib/active_record_doctor/detectors/base.rb
109
+ - lib/active_record_doctor/detectors/extraneous_indexes.rb
110
+ - lib/active_record_doctor/detectors/incorrect_boolean_presence_validation.rb
111
+ - lib/active_record_doctor/detectors/incorrect_dependent_option.rb
112
+ - lib/active_record_doctor/detectors/missing_foreign_keys.rb
113
+ - lib/active_record_doctor/detectors/missing_non_null_constraint.rb
114
+ - lib/active_record_doctor/detectors/missing_presence_validation.rb
115
+ - lib/active_record_doctor/detectors/missing_unique_indexes.rb
116
+ - lib/active_record_doctor/detectors/undefined_table_references.rb
117
+ - lib/active_record_doctor/detectors/unindexed_deleted_at.rb
118
+ - lib/active_record_doctor/detectors/unindexed_foreign_keys.rb
81
119
  - lib/active_record_doctor/printers.rb
82
120
  - lib/active_record_doctor/printers/io_printer.rb
83
121
  - lib/active_record_doctor/railtie.rb
84
- - lib/active_record_doctor/tasks.rb
85
- - lib/active_record_doctor/tasks/extraneous_indexes.rb
86
- - lib/active_record_doctor/tasks/missing_foreign_keys.rb
87
- - lib/active_record_doctor/tasks/undefined_table_references.rb
88
- - lib/active_record_doctor/tasks/unindexed_deleted_at.rb
89
- - lib/active_record_doctor/tasks/unindexed_foreign_keys.rb
122
+ - lib/active_record_doctor/task.rb
90
123
  - lib/active_record_doctor/version.rb
91
124
  - lib/generators/active_record_doctor/add_indexes/USAGE
92
125
  - lib/generators/active_record_doctor/add_indexes/add_indexes_generator.rb
93
- - lib/tasks/active_record_doctor_tasks.rake
126
+ - lib/tasks/active_record_doctor.rake
127
+ - test/active_record_doctor/detectors/extraneous_indexes_test.rb
128
+ - test/active_record_doctor/detectors/incorrect_boolean_presence_validation_test.rb
129
+ - test/active_record_doctor/detectors/incorrect_dependent_option_test.rb
130
+ - test/active_record_doctor/detectors/missing_foreign_keys_test.rb
131
+ - test/active_record_doctor/detectors/missing_non_null_constraint_test.rb
132
+ - test/active_record_doctor/detectors/missing_presence_validation_test.rb
133
+ - test/active_record_doctor/detectors/missing_unique_indexes_test.rb
134
+ - test/active_record_doctor/detectors/undefined_table_references_test.rb
135
+ - test/active_record_doctor/detectors/unindexed_deleted_at_test.rb
136
+ - test/active_record_doctor/detectors/unindexed_foreign_keys_test.rb
94
137
  - test/active_record_doctor/printers/io_printer_test.rb
95
- - test/active_record_doctor/tasks/extraneous_indexes_test.rb
96
- - test/active_record_doctor/tasks/missing_foreign_keys_test.rb
97
- - test/active_record_doctor/tasks/undefined_table_references_test.rb
98
- - test/active_record_doctor/tasks/unindexed_deleted_at_test.rb
99
- - test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb
100
- - test/dummy/README.rdoc
101
- - test/dummy/Rakefile
102
- - test/dummy/app/assets/javascripts/application.js
103
- - test/dummy/app/assets/stylesheets/application.css
104
- - test/dummy/app/controllers/application_controller.rb
105
- - test/dummy/app/helpers/application_helper.rb
106
- - 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
- - test/dummy/app/views/layouts/application.html.erb
113
- - test/dummy/bin/bundle
114
- - test/dummy/bin/rails
115
- - test/dummy/bin/rake
116
- - test/dummy/bin/setup
117
- - test/dummy/config.ru
118
- - test/dummy/config/application.rb
119
- - test/dummy/config/boot.rb
120
- - test/dummy/config/database.yml
121
- - test/dummy/config/database.yml.travis
122
- - test/dummy/config/environment.rb
123
- - test/dummy/config/environments/development.rb
124
- - test/dummy/config/environments/production.rb
125
- - test/dummy/config/environments/test.rb
126
- - test/dummy/config/initializers/assets.rb
127
- - test/dummy/config/initializers/backtrace_silencers.rb
128
- - test/dummy/config/initializers/cookies_serializer.rb
129
- - test/dummy/config/initializers/filter_parameter_logging.rb
130
- - test/dummy/config/initializers/inflections.rb
131
- - test/dummy/config/initializers/mime_types.rb
132
- - test/dummy/config/initializers/session_store.rb
133
- - test/dummy/config/initializers/wrap_parameters.rb
134
- - test/dummy/config/locales/en.yml
135
- - test/dummy/config/routes.rb
136
- - 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
- - test/dummy/db/migrate/base_migration.rb
142
- - test/dummy/db/schema.rb
143
- - test/dummy/log/development.log
144
- - test/dummy/log/test.log
145
- - test/dummy/public/404.html
146
- - test/dummy/public/422.html
147
- - test/dummy/public/500.html
148
- - test/dummy/public/favicon.ico
149
- - test/support/spy_printer.rb
150
- - test/test_helper.rb
138
+ - test/model_factory.rb
139
+ - test/setup.rb
151
140
  homepage: https://github.com/gregnavis/active_record_doctor
152
141
  licenses:
153
142
  - MIT
154
143
  metadata: {}
155
- post_install_message:
144
+ post_install_message:
156
145
  rdoc_options: []
157
146
  require_paths:
158
147
  - lib
@@ -160,73 +149,28 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
149
  requirements:
161
150
  - - ">="
162
151
  - !ruby/object:Gem::Version
163
- version: '0'
152
+ version: 2.1.0
164
153
  required_rubygems_version: !ruby/object:Gem::Requirement
165
154
  requirements:
166
155
  - - ">="
167
156
  - !ruby/object:Gem::Version
168
157
  version: '0'
169
158
  requirements: []
170
- rubyforge_project:
171
- rubygems_version: 2.5.2
172
- signing_key:
159
+ rubygems_version: 3.2.15
160
+ signing_key:
173
161
  specification_version: 4
174
- summary: A cure for your Active Record ailments.
162
+ summary: Identify database issues before they hit production.
175
163
  test_files:
176
- - test/test_helper.rb
164
+ - test/active_record_doctor/detectors/extraneous_indexes_test.rb
165
+ - test/active_record_doctor/detectors/incorrect_boolean_presence_validation_test.rb
166
+ - test/active_record_doctor/detectors/incorrect_dependent_option_test.rb
167
+ - test/active_record_doctor/detectors/missing_foreign_keys_test.rb
168
+ - test/active_record_doctor/detectors/missing_non_null_constraint_test.rb
169
+ - test/active_record_doctor/detectors/missing_presence_validation_test.rb
170
+ - test/active_record_doctor/detectors/missing_unique_indexes_test.rb
171
+ - test/active_record_doctor/detectors/undefined_table_references_test.rb
172
+ - test/active_record_doctor/detectors/unindexed_deleted_at_test.rb
173
+ - test/active_record_doctor/detectors/unindexed_foreign_keys_test.rb
177
174
  - test/active_record_doctor/printers/io_printer_test.rb
178
- - test/active_record_doctor/tasks/unindexed_deleted_at_test.rb
179
- - test/active_record_doctor/tasks/missing_foreign_keys_test.rb
180
- - test/active_record_doctor/tasks/extraneous_indexes_test.rb
181
- - test/active_record_doctor/tasks/undefined_table_references_test.rb
182
- - test/active_record_doctor/tasks/unindexed_foreign_keys_test.rb
183
- - test/dummy/README.rdoc
184
- - test/dummy/log/development.log
185
- - test/dummy/log/test.log
186
- - test/dummy/bin/rake
187
- - test/dummy/bin/rails
188
- - test/dummy/bin/setup
189
- - test/dummy/bin/bundle
190
- - test/dummy/app/helpers/application_helper.rb
191
- - test/dummy/app/controllers/application_controller.rb
192
- - test/dummy/app/assets/stylesheets/application.css
193
- - test/dummy/app/assets/javascripts/application.js
194
- - 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
- - test/dummy/app/models/application_record.rb
201
- - test/dummy/db/schema.rb
202
- - test/dummy/db/migrate/20160213101213_create_employers.rb
203
- - test/dummy/db/migrate/20160604081452_create_comments.rb
204
- - 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
- - test/dummy/public/404.html
208
- - test/dummy/public/500.html
209
- - test/dummy/public/422.html
210
- - test/dummy/public/favicon.ico
211
- - test/dummy/config/secrets.yml
212
- - test/dummy/config/application.rb
213
- - test/dummy/config/routes.rb
214
- - test/dummy/config/environments/development.rb
215
- - test/dummy/config/environments/test.rb
216
- - test/dummy/config/environments/production.rb
217
- - test/dummy/config/database.yml.travis
218
- - test/dummy/config/environment.rb
219
- - test/dummy/config/database.yml
220
- - test/dummy/config/locales/en.yml
221
- - test/dummy/config/initializers/wrap_parameters.rb
222
- - test/dummy/config/initializers/backtrace_silencers.rb
223
- - test/dummy/config/initializers/cookies_serializer.rb
224
- - test/dummy/config/initializers/session_store.rb
225
- - test/dummy/config/initializers/inflections.rb
226
- - test/dummy/config/initializers/filter_parameter_logging.rb
227
- - test/dummy/config/initializers/assets.rb
228
- - test/dummy/config/initializers/mime_types.rb
229
- - test/dummy/config/boot.rb
230
- - test/dummy/Rakefile
231
- - test/dummy/config.ru
232
- - test/support/spy_printer.rb
175
+ - test/model_factory.rb
176
+ - test/setup.rb