prosopite 0.2.1 → 1.0.3
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/Gemfile +1 -0
- data/Gemfile.lock +2 -2
- data/README.md +14 -0
- data/lib/prosopite/version.rb +1 -1
- data/lib/prosopite.rb +23 -9
- data/prosopite.gemspec +0 -2
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: faaeeb7c0908320a1eade29fde52c959c756f30d390bf3251427aca0d5737ea4
|
4
|
+
data.tar.gz: 9843d2c7d5991d992299197b5121a68adc8cd8bc0ba7f4878f89e6eba1c00565
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6e47da136f7e071d1d5466ee2e60fc6f571e8c129ca3f4331a200398b824891ec4dbdadcc7e244f2f51957df386aa3b20bf2b5b7e84a77510e64a3cba6fd465
|
7
|
+
data.tar.gz: b53e5014b44e8fbef56088cb15e4a6cbf1fc4e596316425cc1c5ce0a09eda29b9aa98ea94900eb3be3c2772bb0c77b7a4433f2650119ef20e4125718a3b8e812
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
prosopite (0.
|
5
|
-
pg_query (~> 1.3)
|
4
|
+
prosopite (1.0.3)
|
6
5
|
|
7
6
|
GEM
|
8
7
|
remote: https://rubygems.org/
|
@@ -44,6 +43,7 @@ DEPENDENCIES
|
|
44
43
|
activerecord
|
45
44
|
factory_bot
|
46
45
|
minitest
|
46
|
+
pg_query
|
47
47
|
prosopite!
|
48
48
|
pry
|
49
49
|
rake (~> 13.0)
|
data/README.md
CHANGED
@@ -97,6 +97,12 @@ Add this line to your application's Gemfile:
|
|
97
97
|
gem 'prosopite'
|
98
98
|
```
|
99
99
|
|
100
|
+
If you're **not** using MySQL/MariaDB, you should also add:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
gem 'pg_query'
|
104
|
+
```
|
105
|
+
|
100
106
|
And then execute:
|
101
107
|
|
102
108
|
$ bundle install
|
@@ -188,6 +194,14 @@ Prosopite.scan
|
|
188
194
|
Prosopite.finish
|
189
195
|
```
|
190
196
|
|
197
|
+
or
|
198
|
+
|
199
|
+
```ruby
|
200
|
+
Prosopite.scan do
|
201
|
+
<code to scan>
|
202
|
+
end
|
203
|
+
```
|
204
|
+
|
191
205
|
## Contributing
|
192
206
|
|
193
207
|
Bug reports and pull requests are welcome on GitHub at https://github.com/charkost/prosopite.
|
data/lib/prosopite/version.rb
CHANGED
data/lib/prosopite.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
require 'pg_query'
|
2
1
|
|
3
2
|
module Prosopite
|
3
|
+
DEFAULT_ALLOW_LIST = %w(active_record/associations/preloader active_record/validations/uniqueness)
|
4
|
+
|
4
5
|
class NPlusOneQueriesError < StandardError; end
|
5
6
|
class << self
|
6
7
|
attr_writer :raise,
|
@@ -22,6 +23,15 @@ module Prosopite
|
|
22
23
|
@allow_list ||= []
|
23
24
|
|
24
25
|
tc[:prosopite_scan] = true
|
26
|
+
|
27
|
+
if block_given?
|
28
|
+
begin
|
29
|
+
yield
|
30
|
+
finish
|
31
|
+
ensure
|
32
|
+
tc[:prosopite_scan] = false
|
33
|
+
end
|
34
|
+
end
|
25
35
|
end
|
26
36
|
|
27
37
|
def tc
|
@@ -56,12 +66,10 @@ module Prosopite
|
|
56
66
|
|
57
67
|
kaller = tc[:prosopite_query_caller][location_key]
|
58
68
|
|
59
|
-
|
69
|
+
is_allowed = kaller.any? { |f| @allow_list.concat(DEFAULT_ALLOW_LIST).any? { |s| f.include?(s) } }
|
70
|
+
if fingerprints.uniq.size == 1 && !is_allowed
|
60
71
|
queries = tc[:prosopite_query_holder][location_key]
|
61
|
-
|
62
|
-
unless kaller.any? { |f| f.include?('active_record/validations/uniqueness') }
|
63
|
-
tc[:prosopite_notifications][queries] = kaller
|
64
|
-
end
|
72
|
+
tc[:prosopite_notifications][queries] = kaller
|
65
73
|
end
|
66
74
|
end
|
67
75
|
end
|
@@ -71,6 +79,12 @@ module Prosopite
|
|
71
79
|
if ActiveRecord::Base.connection.adapter_name.downcase.include?('mysql')
|
72
80
|
mysql_fingerprint(query)
|
73
81
|
else
|
82
|
+
begin
|
83
|
+
require 'pg_query'
|
84
|
+
rescue LoadError => e
|
85
|
+
msg = "Could not load the 'pg_query' gem. Add `gem 'pg_query'` to your Gemfile"
|
86
|
+
raise LoadError, msg, e.backtrace
|
87
|
+
end
|
74
88
|
PgQuery.fingerprint(query)
|
75
89
|
end
|
76
90
|
end
|
@@ -100,7 +114,7 @@ module Prosopite
|
|
100
114
|
|
101
115
|
query.gsub!(/\btrue\b|\bfalse\b/i, "?")
|
102
116
|
|
103
|
-
query.gsub!(/[0-9+-][0-9a-f.
|
117
|
+
query.gsub!(/[0-9+-][0-9a-f.x+-]*/, "?")
|
104
118
|
query.gsub!(/[xb.+-]\?/, "?")
|
105
119
|
|
106
120
|
query.strip!
|
@@ -161,9 +175,9 @@ module Prosopite
|
|
161
175
|
return if @subscribed
|
162
176
|
|
163
177
|
ActiveSupport::Notifications.subscribe 'sql.active_record' do |_, _, _, _, data|
|
164
|
-
sql = data[:sql]
|
178
|
+
sql, name = data[:sql], data[:name]
|
165
179
|
|
166
|
-
if scan? && sql.include?('SELECT') && data[:cached].nil?
|
180
|
+
if scan? && name != "SCHEMA" && sql.include?('SELECT') && data[:cached].nil?
|
167
181
|
location_key = Digest::SHA1.hexdigest(caller.join)
|
168
182
|
|
169
183
|
tc[:prosopite_query_counter][location_key] += 1
|
data/prosopite.gemspec
CHANGED
@@ -24,8 +24,6 @@ Gem::Specification.new do |spec|
|
|
24
24
|
end
|
25
25
|
spec.require_paths = ["lib"]
|
26
26
|
|
27
|
-
spec.add_runtime_dependency 'pg_query', '~> 1.3'
|
28
|
-
|
29
27
|
spec.add_development_dependency "pry"
|
30
28
|
spec.add_development_dependency "minitest"
|
31
29
|
spec.add_development_dependency "factory_bot"
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prosopite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mpampis Kostas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: pg_query
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.3'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.3'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: pry
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|