testoscope 0.1.5 → 0.1.6
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 +5 -5
- data/CHANGELOG.md +4 -0
- data/README.md +25 -15
- data/lib/testoscope.rb +3 -2
- data/lib/testoscope/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3b8d037184ba7ff1c1cd5e14d0dbeba4a9abf6787c83fd433a11701851f42059
|
4
|
+
data.tar.gz: 9e60451e44a9b04f4d14c0bb1142bc1bcb3635d3f62b5e524d9518ace953a6ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87e2e7cbe4068255d34828bce780296f765c8dd48ba19230a8e7f352783ab9948aae1d3de5cf9570e09f08c14bc74a7ffea862b0684ebe15b86e15da19bf724d
|
7
|
+
data.tar.gz: f5aefb8afd68f1830c51f5dabd0960297a7907a6011a0672befb198e6dd65a3fe16e62f968751493c489f05c937afef7bcb8d2da0ea273f1fab6f593e34d8ad6
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -42,7 +42,7 @@ and in ORM it doesn't look alarming:
|
|
42
42
|
|
43
43
|
sub_tags.where( name: names )
|
44
44
|
|
45
|
-
|
45
|
+
But when names is empty, we get a dummy request.
|
46
46
|
|
47
47
|
They are not a big deal from a performance perspective,
|
48
48
|
but you are occupying DB connection pool and cluttering your channel with empty noise.
|
@@ -61,21 +61,21 @@ In either cases you may have a problem, but also may not.
|
|
61
61
|
|
62
62
|
### How it works?
|
63
63
|
Testoscope hooks to exec_query of a connection adapter,
|
64
|
-
|
65
|
-
first with EXPLAIN
|
66
|
-
and the second -
|
64
|
+
when sql query reach exec_query it runs two times:
|
65
|
+
first with EXPLAIN for tstoscope to analyze,
|
66
|
+
and the second - for original a caller purpose.
|
67
67
|
|
68
|
-
After
|
68
|
+
After retrieving explain result, testoscope search for specified unintended behaviour markers,
|
69
69
|
like a Seq Scan substring in Postgres QUERY PLAN explained, and also collects indexes used by all queries for a final summary.
|
70
70
|
|
71
71
|
### Unintended Behaviours
|
72
|
-
By default
|
72
|
+
By default markers are preconfigured for PosgtreSQL and full list of tables:
|
73
73
|
|
74
74
|
config.unintened_key_words = ['Seq Scan', 'One-Time Filter']
|
75
75
|
config.tables = :all
|
76
76
|
|
77
77
|
But you can set any regexp you want to track inside EXPLAIN results,
|
78
|
-
and also you can track
|
78
|
+
and also you can track partial list of tables:
|
79
79
|
|
80
80
|
config.tables = ['cards', 'users']
|
81
81
|
|
@@ -85,32 +85,42 @@ and also you can track not all tables, but only specified ones:
|
|
85
85
|
Add this line to your application's Gemfile:
|
86
86
|
|
87
87
|
```ruby
|
88
|
-
|
88
|
+
group :test do
|
89
|
+
gem 'testoscope'
|
90
|
+
end
|
91
|
+
|
89
92
|
```
|
90
93
|
|
91
94
|
And then execute:
|
92
95
|
|
93
96
|
$ bundle
|
94
|
-
|
95
|
-
Or install it yourself as:
|
96
|
-
|
97
|
-
$ gem install testoscope
|
98
|
-
|
97
|
+
|
99
98
|
## Usage
|
100
99
|
|
101
100
|
In test_helper.rb:
|
102
101
|
|
103
102
|
require 'testoscope'
|
104
103
|
|
105
|
-
#since doubling all requests to DB is not free,
|
106
|
-
#you may use ENV variable to run on demand
|
104
|
+
# since doubling all requests to DB is not free,
|
105
|
+
# you may use ENV variable to run on demand
|
107
106
|
if ENV[:RUN_TESTOSCOPE]
|
108
107
|
Testoscope.configure { |c|
|
108
|
+
# include only trace from folders
|
109
109
|
c.back_trace_paths = [Rails.root.to_s]
|
110
|
+
|
111
|
+
# additionaly exclude subfolders
|
110
112
|
c.back_trace_exclude_paths = ["#{Rails.root.to_s}/test", "#{Rails.root.to_s}/spec"]
|
113
|
+
|
114
|
+
# unintended behaviour markers
|
111
115
|
c.unintened_key_words = ['Seq Scan', 'One-Time Filter']
|
116
|
+
|
117
|
+
# set true to raise error on unintended behaviour
|
112
118
|
c.raise_when_unintended = false
|
119
|
+
|
120
|
+
# true to analyze everything, false to analize only by demand using suspend_global_analyze
|
113
121
|
c.analyze = true
|
122
|
+
|
123
|
+
# :all - to complete list, or array of specific table names: [ 'users', 'comments' ... ]
|
114
124
|
c.tables = :all
|
115
125
|
}
|
116
126
|
|
data/lib/testoscope.rb
CHANGED
@@ -114,7 +114,8 @@ module Testoscope
|
|
114
114
|
self.add_unintended_behaviour( sql, explain, app_trace )
|
115
115
|
end
|
116
116
|
|
117
|
-
explain.scan(/Index Scan using \w
|
117
|
+
explain.scan(/Index Scan using (\w+)|Index Scan on (\w+)|Index Scan Backward using (\w+)/)
|
118
|
+
.each{|found| add_index_used(sql, explain, found.compact.first ) }
|
118
119
|
end
|
119
120
|
end
|
120
121
|
|
@@ -127,7 +128,7 @@ module Testoscope
|
|
127
128
|
module AdapterUpgrade
|
128
129
|
def exec_query(sql, name = "SQL", binds = [], prepare: false)
|
129
130
|
Testoscope.analyze(sql) {
|
130
|
-
super( 'EXPLAIN ' + sql, "EXPLAIN", binds, prepare: false)
|
131
|
+
super( sql['EXPLAIN'] ? sql : 'EXPLAIN ' + sql, "EXPLAIN", binds, prepare: false)
|
131
132
|
}
|
132
133
|
super( sql, name, binds, prepare: prepare )
|
133
134
|
end
|
data/lib/testoscope/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: testoscope
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alekseyl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- ".idea/testoscope.iml"
|
97
97
|
- ".idea/workspace.xml"
|
98
98
|
- ".travis.yml"
|
99
|
+
- CHANGELOG.md
|
99
100
|
- Gemfile
|
100
101
|
- LICENSE.txt
|
101
102
|
- README.md
|
@@ -127,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
128
|
version: '0'
|
128
129
|
requirements: []
|
129
130
|
rubyforge_project:
|
130
|
-
rubygems_version: 2.6
|
131
|
+
rubygems_version: 2.7.6
|
131
132
|
signing_key:
|
132
133
|
specification_version: 4
|
133
134
|
summary: This is simple and nice tool to inspect how application operates with current
|