wt_activerecord_index_spy 0.3.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 +7 -0
- data/.env.template +3 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +29 -0
- data/.github/workflows/main.yml +51 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.rubocop.yml +28 -0
- data/CHANGELOG.md +10 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/CONTRIBUTORS.md +3 -0
- data/Gemfile +23 -0
- data/LICENSE.md +33 -0
- data/README.md +188 -0
- data/Rakefile +60 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/wt_activerecord_index_spy.rb +71 -0
- data/lib/wt_activerecord_index_spy/aggregator.rb +59 -0
- data/lib/wt_activerecord_index_spy/notification_listener.rb +106 -0
- data/lib/wt_activerecord_index_spy/query_analyser.rb +61 -0
- data/lib/wt_activerecord_index_spy/query_analyser/mysql.rb +44 -0
- data/lib/wt_activerecord_index_spy/query_analyser/postgres.rb +54 -0
- data/lib/wt_activerecord_index_spy/results.html.erb +24 -0
- data/lib/wt_activerecord_index_spy/test_helpers.rb +36 -0
- data/lib/wt_activerecord_index_spy/test_models.rb +17 -0
- data/lib/wt_activerecord_index_spy/version.rb +5 -0
- data/wt_activerecord_index_spy.gemspec +43 -0
- metadata +187 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<table border="1px solid">
|
4
|
+
<thead style="font-weight: bold;">
|
5
|
+
<td>Level</td>
|
6
|
+
<td>Identifier</td>
|
7
|
+
<td>Query</td>
|
8
|
+
<td>Origin</td>
|
9
|
+
</thead>
|
10
|
+
<tbody>
|
11
|
+
<% (certain_results + uncertain_results)
|
12
|
+
.sort_by{ |item| [item.certainity_level, item.identifier, item.query] }
|
13
|
+
.each do |item| -%>
|
14
|
+
<tr>
|
15
|
+
<td><%= item.certainity_level %></td>
|
16
|
+
<td><%= item.identifier %></td>
|
17
|
+
<td><%= item.query %></td>
|
18
|
+
<td><%= item.origin %></td>
|
19
|
+
</tr>
|
20
|
+
<% end -%>
|
21
|
+
</tbody>
|
22
|
+
</table>
|
23
|
+
</body>
|
24
|
+
</html>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rspec/matchers"
|
4
|
+
|
5
|
+
module WtActiverecordIndexSpy
|
6
|
+
# This module defines the helper have_used_db_indexes to use in RSpec tests
|
7
|
+
module TestHelpers
|
8
|
+
extend RSpec::Matchers::DSL
|
9
|
+
|
10
|
+
matcher :have_used_db_indexes do |only_certains: false|
|
11
|
+
match do |actual|
|
12
|
+
WtActiverecordIndexSpy.watch_queries(ignore_queries_originated_in_test_code: false) do
|
13
|
+
actual.call
|
14
|
+
end
|
15
|
+
|
16
|
+
if only_certains
|
17
|
+
WtActiverecordIndexSpy.certain_results.empty?
|
18
|
+
else
|
19
|
+
WtActiverecordIndexSpy.results.empty?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
failure_message do |_actual|
|
24
|
+
"Some queries have not used indexes: #{WtActiverecordIndexSpy.results.to_h}"
|
25
|
+
end
|
26
|
+
|
27
|
+
failure_message_when_negated do |_actual|
|
28
|
+
"All queries have used indexes and this was not expected"
|
29
|
+
end
|
30
|
+
|
31
|
+
def supports_block_expectations?
|
32
|
+
true
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This class should not be required by the library because
|
4
|
+
# it's used only by tests.
|
5
|
+
# It should be placed in spec/support, but there is a test that
|
6
|
+
# checks the origin of the query, which would return true if
|
7
|
+
# the file was located in a "spec/" folder.
|
8
|
+
class User < ActiveRecord::Base
|
9
|
+
belongs_to :city
|
10
|
+
|
11
|
+
def self.some_method_with_a_query_missing_index
|
12
|
+
find_by(name: "any")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class City < ActiveRecord::Base
|
17
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/wt_activerecord_index_spy/version"
|
4
|
+
|
5
|
+
# rubocop:disable Metrics/BlockLength
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "wt_activerecord_index_spy"
|
8
|
+
spec.version = WtActiverecordIndexSpy::VERSION
|
9
|
+
spec.authors = ["Fabio Perrella"]
|
10
|
+
spec.email = ["fabio.perrella@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = "It checks if queries use an index"
|
13
|
+
spec.description = "It uses activerecord's notifications to run an explain" \
|
14
|
+
" query on each query that uses a WHERE statement"
|
15
|
+
spec.homepage = "https://github.com/fabioperrella/wt_activerecord_index_spy"
|
16
|
+
spec.license = "MIT"
|
17
|
+
spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
|
18
|
+
|
19
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
20
|
+
spec.metadata["source_code_uri"] = "https://github.com/fabioperrella/wt_activerecord_index_spy"
|
21
|
+
spec.metadata["changelog_uri"] = "https://github.com/fabioperrella/wt_activerecord_index_spy/blob/main/CHANGELOG.md"
|
22
|
+
|
23
|
+
# Specify which files should be added to the gem when it is released.
|
24
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
26
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
27
|
+
end
|
28
|
+
spec.bindir = "exe"
|
29
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
30
|
+
spec.require_paths = ["lib"]
|
31
|
+
|
32
|
+
# Uncomment to register a new dependency of your gem
|
33
|
+
spec.add_dependency "activerecord", ">= 4.0"
|
34
|
+
spec.add_dependency "activesupport", ">= 4.0"
|
35
|
+
spec.add_dependency "rspec", "~> 3.0"
|
36
|
+
|
37
|
+
spec.add_development_dependency "dotenv"
|
38
|
+
spec.add_development_dependency "gemfury"
|
39
|
+
spec.add_development_dependency "mysql2"
|
40
|
+
spec.add_development_dependency "pg"
|
41
|
+
spec.add_development_dependency "pry-byebug"
|
42
|
+
end
|
43
|
+
# rubocop:enable Metrics/BlockLength
|
metadata
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wt_activerecord_index_spy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabio Perrella
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-04-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: dotenv
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: gemfury
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: mysql2
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pg
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: pry-byebug
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
description: It uses activerecord's notifications to run an explain query on each
|
126
|
+
query that uses a WHERE statement
|
127
|
+
email:
|
128
|
+
- fabio.perrella@gmail.com
|
129
|
+
executables: []
|
130
|
+
extensions: []
|
131
|
+
extra_rdoc_files: []
|
132
|
+
files:
|
133
|
+
- ".env.template"
|
134
|
+
- ".github/ISSUE_TEMPLATE/bug_report.md"
|
135
|
+
- ".github/ISSUE_TEMPLATE/feature_request.md"
|
136
|
+
- ".github/PULL_REQUEST_TEMPLATE.md"
|
137
|
+
- ".github/workflows/main.yml"
|
138
|
+
- ".gitignore"
|
139
|
+
- ".rspec"
|
140
|
+
- ".rubocop.yml"
|
141
|
+
- CHANGELOG.md
|
142
|
+
- CODE_OF_CONDUCT.md
|
143
|
+
- CONTRIBUTORS.md
|
144
|
+
- Gemfile
|
145
|
+
- LICENSE.md
|
146
|
+
- README.md
|
147
|
+
- Rakefile
|
148
|
+
- bin/console
|
149
|
+
- bin/setup
|
150
|
+
- lib/wt_activerecord_index_spy.rb
|
151
|
+
- lib/wt_activerecord_index_spy/aggregator.rb
|
152
|
+
- lib/wt_activerecord_index_spy/notification_listener.rb
|
153
|
+
- lib/wt_activerecord_index_spy/query_analyser.rb
|
154
|
+
- lib/wt_activerecord_index_spy/query_analyser/mysql.rb
|
155
|
+
- lib/wt_activerecord_index_spy/query_analyser/postgres.rb
|
156
|
+
- lib/wt_activerecord_index_spy/results.html.erb
|
157
|
+
- lib/wt_activerecord_index_spy/test_helpers.rb
|
158
|
+
- lib/wt_activerecord_index_spy/test_models.rb
|
159
|
+
- lib/wt_activerecord_index_spy/version.rb
|
160
|
+
- wt_activerecord_index_spy.gemspec
|
161
|
+
homepage: https://github.com/fabioperrella/wt_activerecord_index_spy
|
162
|
+
licenses:
|
163
|
+
- MIT
|
164
|
+
metadata:
|
165
|
+
homepage_uri: https://github.com/fabioperrella/wt_activerecord_index_spy
|
166
|
+
source_code_uri: https://github.com/fabioperrella/wt_activerecord_index_spy
|
167
|
+
changelog_uri: https://github.com/fabioperrella/wt_activerecord_index_spy/blob/main/CHANGELOG.md
|
168
|
+
post_install_message:
|
169
|
+
rdoc_options: []
|
170
|
+
require_paths:
|
171
|
+
- lib
|
172
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: 2.5.0
|
177
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - ">="
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
requirements: []
|
183
|
+
rubygems_version: 3.0.3
|
184
|
+
signing_key:
|
185
|
+
specification_version: 4
|
186
|
+
summary: It checks if queries use an index
|
187
|
+
test_files: []
|