traceindex 0.0.1 → 0.0.2
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/.circleci/config.yml +53 -0
- data/.gitignore +0 -1
- data/README.md +8 -0
- data/lib/tasks/traceindex.rake +13 -2
- data/lib/traceindex.rb +27 -3
- data/spec/app.rb +3 -3
- data/spec/database.yml +18 -0
- data/spec/traceroute_spec.rb +74 -7
- data/traceindex.gemspec +1 -1
- metadata +5 -4
- data/spec/database.yml.sample +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32652626eba05019e1228a39ca642acb95940610c66cd3dd1c316baf0e8e3fcf
|
4
|
+
data.tar.gz: 234f0ad667a6af183f33d83b235648471b6708555e2136ff60319a8f742ad0de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db4abce12669dbd750471345fef3c4a1d8b0e27b0403f41e06cbd2b893158df290eee2010087f0056618c361fc44689e407a1893e1263328e14be077a7de1fdb
|
7
|
+
data.tar.gz: 3f731c2f5aaac5ead38371cb22dde681cb473325840858319cb3dad955f4f3dd25312339fbd4dc929caf99f7f8ca56f2fce17bf7613bd5eeb6ffad07ac188b24
|
@@ -0,0 +1,53 @@
|
|
1
|
+
version: 2.1
|
2
|
+
|
3
|
+
executors:
|
4
|
+
default:
|
5
|
+
working_directory: ~/app
|
6
|
+
docker:
|
7
|
+
- image: circleci/ruby:2.6
|
8
|
+
environment:
|
9
|
+
DB_USER: 'root'
|
10
|
+
DB_PASS: 'root'
|
11
|
+
DB_HOST: '127.0.0.1'
|
12
|
+
- image: circleci/mysql:8-ram
|
13
|
+
environment:
|
14
|
+
MYSQL_USER: root
|
15
|
+
MYSQL_ROOT_PASSWORD: root
|
16
|
+
MYSQL_DATABASE: traceindex_test
|
17
|
+
command: [--default-authentication-plugin=mysql_native_password]
|
18
|
+
|
19
|
+
commands:
|
20
|
+
setup_bundle:
|
21
|
+
steps:
|
22
|
+
- restore_cache:
|
23
|
+
key: bundle-{{ checksum "traceindex.gemspec" }}
|
24
|
+
- run:
|
25
|
+
name: install dependencies
|
26
|
+
command: |
|
27
|
+
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
28
|
+
- save_cache:
|
29
|
+
key: bundle-{{ checksum "traceindex.gemspec" }}
|
30
|
+
paths:
|
31
|
+
- vendor/bundle
|
32
|
+
|
33
|
+
wait_for_db:
|
34
|
+
steps:
|
35
|
+
- run:
|
36
|
+
name: Wait for DB
|
37
|
+
command: dockerize -wait tcp://127.0.0.1:3306 -timeout 1m
|
38
|
+
|
39
|
+
jobs:
|
40
|
+
test:
|
41
|
+
executor: default
|
42
|
+
steps:
|
43
|
+
- checkout
|
44
|
+
- setup_bundle
|
45
|
+
- wait_for_db
|
46
|
+
- run: bundle exec rspec ./spec
|
47
|
+
|
48
|
+
workflows:
|
49
|
+
version: 2
|
50
|
+
|
51
|
+
test:
|
52
|
+
jobs:
|
53
|
+
- test
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -29,6 +29,12 @@ If you want the rake task to fail when errors are found.
|
|
29
29
|
% FAIL_ON_ERROR=1 rake traceindex
|
30
30
|
```
|
31
31
|
|
32
|
+
If you want the rake task to ignore foreign_keys.
|
33
|
+
|
34
|
+
```
|
35
|
+
% IGNORE_FOREIGN_KEY=1 rake traceindex
|
36
|
+
```
|
37
|
+
|
32
38
|
## How do I tell it to ignore columns?
|
33
39
|
|
34
40
|
Create a .traceindex.yaml or .traceindex.yml file in your root directory.
|
@@ -41,6 +47,8 @@ ignore_models:
|
|
41
47
|
- ActiveStorage::Attachment
|
42
48
|
- ActionText::RichText
|
43
49
|
- ActionMailbox::InboundEmail
|
50
|
+
ignore_foreign_keys:
|
51
|
+
- users.created_user_id
|
44
52
|
```
|
45
53
|
|
46
54
|
## Copyright
|
data/lib/tasks/traceindex.rake
CHANGED
@@ -3,10 +3,21 @@ task traceindex: :environment do
|
|
3
3
|
traceindex = Traceindex.new(Rails.application)
|
4
4
|
column_names = traceindex.missing_index_column_names
|
5
5
|
|
6
|
-
|
6
|
+
unless column_names.empty?
|
7
7
|
puts "Missing index columns (#{column_names.size}):"
|
8
8
|
column_names.each { |column| puts " #{column}" }
|
9
|
+
end
|
10
|
+
|
11
|
+
if ENV['IGNORE_FOREIGN_KEY'].nil?
|
12
|
+
fk_column_names = traceindex.missing_foreign_keys
|
13
|
+
|
14
|
+
unless fk_column_names.empty?
|
15
|
+
puts "Missing foreign keys (#{fk_column_names.size}):"
|
16
|
+
fk_column_names.each { |column| puts " #{column}" }
|
17
|
+
end
|
18
|
+
end
|
9
19
|
|
10
|
-
|
20
|
+
if ENV['FAIL_ON_ERROR'] && (!column_names.empty? || !fk_column_names.empty?)
|
21
|
+
raise 'Missing indexes detected.'
|
11
22
|
end
|
12
23
|
end
|
data/lib/traceindex.rb
CHANGED
@@ -8,9 +8,10 @@ class Traceindex
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def initialize(app)
|
11
|
-
@app
|
12
|
-
@ignore_models
|
13
|
-
@ignore_columns
|
11
|
+
@app = app
|
12
|
+
@ignore_models = []
|
13
|
+
@ignore_columns = []
|
14
|
+
@ignore_foreign_keys = []
|
14
15
|
|
15
16
|
(config["ignore_models"] || []).each do |ignored_model|
|
16
17
|
@ignore_models << ignored_model
|
@@ -19,6 +20,10 @@ class Traceindex
|
|
19
20
|
(config["ignore_columns"] || []).each do |ignored_column|
|
20
21
|
@ignore_columns << ignored_column
|
21
22
|
end
|
23
|
+
|
24
|
+
(config["ignore_foreign_keys"] || []).each do |ignored_column|
|
25
|
+
@ignore_foreign_keys << ignored_column
|
26
|
+
end
|
22
27
|
end
|
23
28
|
|
24
29
|
def missing_index_column_names
|
@@ -41,6 +46,25 @@ class Traceindex
|
|
41
46
|
end
|
42
47
|
end
|
43
48
|
|
49
|
+
def missing_foreign_keys
|
50
|
+
models.each.with_object([]) do |model, missing_columns|
|
51
|
+
id_columns = model.columns.select {|column| column.name.end_with?("_id") }
|
52
|
+
|
53
|
+
foreign_keys = ActiveRecord::Base.connection.foreign_keys(model.table_name)
|
54
|
+
|
55
|
+
id_columns.each do |id_column|
|
56
|
+
if @ignore_foreign_keys.include?("#{model.table_name}.#{id_column.name}")
|
57
|
+
next
|
58
|
+
end
|
59
|
+
|
60
|
+
next unless foreign_keys.none? { |index| index.column == id_column.name }
|
61
|
+
missing_columns << "#{model.table_name}.#{id_column.name}"
|
62
|
+
end
|
63
|
+
rescue => e
|
64
|
+
puts e.message
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
44
68
|
private
|
45
69
|
|
46
70
|
def config_filename
|
data/spec/app.rb
CHANGED
@@ -12,13 +12,13 @@ module DummyApp
|
|
12
12
|
end
|
13
13
|
|
14
14
|
ActiveRecord::Base.establish_connection(
|
15
|
-
YAML.load(File.read('spec/database.yml'))['test']
|
15
|
+
YAML.load(ERB.new(File.read('spec/database.yml')).result)['test']
|
16
16
|
)
|
17
17
|
|
18
18
|
ActiveRecord::Schema.define version: 0 do
|
19
19
|
create_table :users, force: true do |t|
|
20
|
-
t.
|
21
|
-
t.integer
|
20
|
+
t.references :created_user, foreign_key: { to_table: :users }
|
21
|
+
t.integer :updated_user_id, index: false
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
data/spec/database.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
default: &default
|
2
|
+
adapter: mysql2
|
3
|
+
encoding: utf8mb4
|
4
|
+
charset: utf8mb4
|
5
|
+
collation: utf8mb4_general_ci
|
6
|
+
pool: 5
|
7
|
+
username: <%= ENV.fetch("DB_USER") { 'root' } %>
|
8
|
+
password: <%= ENV.fetch("DB_PASS") { '' } %>
|
9
|
+
host: <%= ENV.fetch("DB_HOST") { '127.0.0.1' } %>
|
10
|
+
socket: /tmp/mysql.sock
|
11
|
+
|
12
|
+
development:
|
13
|
+
<<: *default
|
14
|
+
database: traceindex_development
|
15
|
+
|
16
|
+
test:
|
17
|
+
<<: *default
|
18
|
+
database: traceindex_test
|
data/spec/traceroute_spec.rb
CHANGED
@@ -7,30 +7,97 @@ describe Traceindex do
|
|
7
7
|
expect(Traceindex::VERSION).not_to be nil
|
8
8
|
end
|
9
9
|
|
10
|
+
let(:traceindex) { Traceindex.new(Rails.application) }
|
11
|
+
|
12
|
+
after { File.delete '.traceindex.yml' if File.exists? '.traceindex.yml' }
|
13
|
+
|
10
14
|
describe '#missing_index_column_names' do
|
11
15
|
it 'missing index found.' do
|
12
|
-
traceindex = Traceindex.new(Rails.application)
|
13
16
|
expect(traceindex.missing_index_column_names).to eq(['users.updated_user_id'])
|
14
17
|
end
|
15
18
|
|
16
|
-
context 'If you have a configuration file' do
|
19
|
+
context 'If you have a configuration file(ignore_columns)' do
|
17
20
|
before do
|
18
21
|
File.open '.traceindex.yml', 'w' do |file|
|
19
22
|
file.puts 'ignore_columns:'
|
20
23
|
file.puts ' - users.updated_user_id'
|
21
|
-
file.puts 'ignore_models:'
|
22
|
-
file.puts ' - User'
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
-
|
27
|
+
it 'missing index not found.' do
|
28
|
+
expect(traceindex.missing_index_column_names).to eq([])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'If you have a configuration file(ignore_models)' do
|
33
|
+
before do
|
34
|
+
File.open '.traceindex.yml', 'w' do |file|
|
35
|
+
file.puts 'ignore_models:'
|
36
|
+
file.puts ' - User'
|
37
|
+
end
|
28
38
|
end
|
29
39
|
|
30
40
|
it 'missing index not found.' do
|
31
|
-
traceindex = Traceindex.new(Rails.application)
|
32
41
|
expect(traceindex.missing_index_column_names).to eq([])
|
33
42
|
end
|
34
43
|
end
|
44
|
+
|
45
|
+
context 'If you have a configuration file(ignore_foreign_keys)' do
|
46
|
+
before do
|
47
|
+
File.open '.traceindex.yml', 'w' do |file|
|
48
|
+
file.puts 'ignore_foreign_keys:'
|
49
|
+
file.puts ' - users.updated_user_id'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'missing index exists.' do
|
54
|
+
expect(traceindex.missing_index_column_names).to eq(['users.updated_user_id'])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#missing_foreign_keys' do
|
60
|
+
it 'missing index found.' do
|
61
|
+
expect(traceindex.missing_foreign_keys).to eq(['users.updated_user_id'])
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'If you have a configuration file(ignore_columns)' do
|
65
|
+
before do
|
66
|
+
File.open '.traceindex.yml', 'w' do |file|
|
67
|
+
file.puts 'ignore_columns:'
|
68
|
+
file.puts ' - users.updated_user_id'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'missing foreign keys exists.' do
|
73
|
+
expect(traceindex.missing_foreign_keys).to eq(['users.updated_user_id'])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
context 'If you have a configuration file(ignore_foreign_keys)' do
|
78
|
+
before do
|
79
|
+
File.open '.traceindex.yml', 'w' do |file|
|
80
|
+
file.puts 'ignore_foreign_keys:'
|
81
|
+
file.puts ' - users.updated_user_id'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'missing foreign keys not found.' do
|
86
|
+
expect(traceindex.missing_foreign_keys).to eq([])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'If you have a configuration file(ignore_models)' do
|
91
|
+
before do
|
92
|
+
File.open '.traceindex.yml', 'w' do |file|
|
93
|
+
file.puts 'ignore_models:'
|
94
|
+
file.puts ' - User'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'missing foreign keys not found.' do
|
99
|
+
expect(traceindex.missing_foreign_keys).to eq([])
|
100
|
+
end
|
101
|
+
end
|
35
102
|
end
|
36
103
|
end
|
data/traceindex.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: traceindex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akira Kusumoto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -74,6 +74,7 @@ executables: []
|
|
74
74
|
extensions: []
|
75
75
|
extra_rdoc_files: []
|
76
76
|
files:
|
77
|
+
- ".circleci/config.yml"
|
77
78
|
- ".gitignore"
|
78
79
|
- Gemfile
|
79
80
|
- MIT-LICENSE
|
@@ -82,7 +83,7 @@ files:
|
|
82
83
|
- lib/tasks/traceindex.rake
|
83
84
|
- lib/traceindex.rb
|
84
85
|
- spec/app.rb
|
85
|
-
- spec/database.yml
|
86
|
+
- spec/database.yml
|
86
87
|
- spec/spec_helper.rb
|
87
88
|
- spec/traceroute_spec.rb
|
88
89
|
- traceindex.gemspec
|
@@ -111,6 +112,6 @@ specification_version: 4
|
|
111
112
|
summary: A Rake task that helps you find the missing indexes for your Rails app
|
112
113
|
test_files:
|
113
114
|
- spec/app.rb
|
114
|
-
- spec/database.yml
|
115
|
+
- spec/database.yml
|
115
116
|
- spec/spec_helper.rb
|
116
117
|
- spec/traceroute_spec.rb
|
data/spec/database.yml.sample
DELETED