pg-eyeballs 1.0.0 → 1.1.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 +4 -4
- data/Appraisals +7 -0
- data/Gemfile +1 -0
- data/README.md +17 -7
- data/gemfiles/activerecord_4.gemfile +11 -0
- data/gemfiles/activerecord_4.gemfile.lock +83 -0
- data/gemfiles/activerecord_5.gemfile +11 -0
- data/gemfiles/activerecord_5.gemfile.lock +80 -0
- data/lib/eyeballs/inspector.rb +17 -14
- data/lib/eyeballs/version.rb +1 -1
- data/pg-eyeballs.gemspec +1 -1
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ecb0ed349340e392cd51a2d08f8a3fb406718ee
|
4
|
+
data.tar.gz: d88af55b891ed2700cadaac3e952f1fcbb9db2c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe3eb5223f725effb48c363429741ae5c4e9722067c8871b2eefb0acaa338f133b1d8d15ef2e81395ed3541e827f0d4305cd82a9b0d5d70a5cb15b4473f936b3
|
7
|
+
data.tar.gz: 49d459f9e8b2de48050bb791a03223ba619172dde4484c04b934272f10081caae16347aa1ad1fc88487b6488efdcb871f12e2485f975b323ae546f4c42033727
|
data/Appraisals
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
`pg-eyeballs` is a ruby gem that gives you detailed information about how the
|
5
5
|
SQL queries created by the active record code you write are executed by the database.
|
6
6
|
It gives you an easy, ruby friendly way to see the output of the Postgres
|
7
|
-
[`EXPLAIN` command](https://www.postgresql.org/docs/9.4/static/using-explain.html) and integrates with the popular query analysis tool [`gocmdpev`](https://github.com/simon-engledew/gocmdpev).
|
7
|
+
[`EXPLAIN` command](https://www.postgresql.org/docs/9.4/static/using-explain.html) and integrates with the popular query analysis tool [`gocmdpev`](https://github.com/simon-engledew/gocmdpev).
|
8
8
|
|
9
9
|
Using it you can see:
|
10
10
|
- What queries were run
|
@@ -48,7 +48,7 @@ more than one query, for instance when it has a `preload` or with certain
|
|
48
48
|
subqueries
|
49
49
|
```ruby
|
50
50
|
User.all.preload(:profiles).eyeballs.explain(options: [:verbose], format: :yaml)
|
51
|
-
['- Plan:
|
51
|
+
['- Plan:
|
52
52
|
Node Type: "Seq Scan"
|
53
53
|
Relation Name: "users"
|
54
54
|
Schema: "public"
|
@@ -57,10 +57,10 @@ User.all.preload(:profiles).eyeballs.explain(options: [:verbose], format: :yaml)
|
|
57
57
|
Total Cost: 22.30
|
58
58
|
Plan Rows: 1230
|
59
59
|
Plan Width: 36
|
60
|
-
Output:
|
60
|
+
Output:
|
61
61
|
- "id"
|
62
|
-
- "email"',
|
63
|
-
'- Plan:
|
62
|
+
- "email"',
|
63
|
+
'- Plan:
|
64
64
|
Node Type: "Seq Scan"
|
65
65
|
Relation Name: "profiles"
|
66
66
|
Schema: "public"
|
@@ -69,7 +69,7 @@ User.all.preload(:profiles).eyeballs.explain(options: [:verbose], format: :yaml)
|
|
69
69
|
Total Cost: 36.75
|
70
70
|
Plan Rows: 11
|
71
71
|
Plan Width: 8
|
72
|
-
Output:
|
72
|
+
Output:
|
73
73
|
- "id"
|
74
74
|
- "user_id"
|
75
75
|
Filter: "(profiles.user_id = 1)"'
|
@@ -179,6 +179,11 @@ To use, also from inside your Rails project directory, run
|
|
179
179
|
eyeballs User.preload(:profiles)
|
180
180
|
```
|
181
181
|
|
182
|
+
## Compatibility
|
183
|
+
|
184
|
+
`pg-eyeballs` has been tested with Rails versions 4 and 5. It may work on
|
185
|
+
earlier versions, but I haven't tried it.
|
186
|
+
|
182
187
|
## Development
|
183
188
|
|
184
189
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -189,8 +194,13 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
189
194
|
|
190
195
|
Bug reports and pull requests are welcome on GitHub at https://github.com/bradurani/pg-eyeballs. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
191
196
|
|
197
|
+
### Running the tests
|
198
|
+
|
199
|
+
First, `bundle install`. After this, if you are using the default
|
200
|
+
database, first thing is to run `createdb eyeballs_test`. After this
|
201
|
+
you can run the tests with `rake`.
|
202
|
+
|
192
203
|
|
193
204
|
## License
|
194
205
|
|
195
206
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
196
|
-
|
@@ -0,0 +1,83 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
pg-eyeballs (1.0.1)
|
5
|
+
activerecord (>= 4.0, < 6.0)
|
6
|
+
pg
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
activemodel (4.2.7.1)
|
12
|
+
activesupport (= 4.2.7.1)
|
13
|
+
builder (~> 3.1)
|
14
|
+
activerecord (4.2.7.1)
|
15
|
+
activemodel (= 4.2.7.1)
|
16
|
+
activesupport (= 4.2.7.1)
|
17
|
+
arel (~> 6.0)
|
18
|
+
activesupport (4.2.7.1)
|
19
|
+
i18n (~> 0.7)
|
20
|
+
json (~> 1.7, >= 1.7.7)
|
21
|
+
minitest (~> 5.1)
|
22
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
23
|
+
tzinfo (~> 1.1)
|
24
|
+
appraisal (2.1.0)
|
25
|
+
bundler
|
26
|
+
rake
|
27
|
+
thor (>= 0.14.0)
|
28
|
+
arel (6.0.3)
|
29
|
+
awesome_print (1.7.0)
|
30
|
+
builder (3.2.2)
|
31
|
+
byebug (9.0.6)
|
32
|
+
coderay (1.1.1)
|
33
|
+
database_cleaner (1.5.3)
|
34
|
+
diff-lcs (1.2.5)
|
35
|
+
i18n (0.7.0)
|
36
|
+
json (1.8.3)
|
37
|
+
method_source (0.8.2)
|
38
|
+
minitest (5.9.1)
|
39
|
+
pg (0.19.0)
|
40
|
+
pry (0.10.4)
|
41
|
+
coderay (~> 1.1.0)
|
42
|
+
method_source (~> 0.8.1)
|
43
|
+
slop (~> 3.4)
|
44
|
+
pry-byebug (3.4.0)
|
45
|
+
byebug (~> 9.0)
|
46
|
+
pry (~> 0.10)
|
47
|
+
rake (10.5.0)
|
48
|
+
rspec (3.5.0)
|
49
|
+
rspec-core (~> 3.5.0)
|
50
|
+
rspec-expectations (~> 3.5.0)
|
51
|
+
rspec-mocks (~> 3.5.0)
|
52
|
+
rspec-core (3.5.4)
|
53
|
+
rspec-support (~> 3.5.0)
|
54
|
+
rspec-expectations (3.5.0)
|
55
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
56
|
+
rspec-support (~> 3.5.0)
|
57
|
+
rspec-mocks (3.5.0)
|
58
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
59
|
+
rspec-support (~> 3.5.0)
|
60
|
+
rspec-support (3.5.0)
|
61
|
+
slop (3.6.0)
|
62
|
+
thor (0.19.1)
|
63
|
+
thread_safe (0.3.5)
|
64
|
+
tzinfo (1.2.2)
|
65
|
+
thread_safe (~> 0.1)
|
66
|
+
|
67
|
+
PLATFORMS
|
68
|
+
ruby
|
69
|
+
|
70
|
+
DEPENDENCIES
|
71
|
+
activerecord (>= 4.0.0, <= 5.0.0)
|
72
|
+
appraisal
|
73
|
+
awesome_print
|
74
|
+
bundler (~> 1.12)
|
75
|
+
database_cleaner
|
76
|
+
pg-eyeballs!
|
77
|
+
pry
|
78
|
+
pry-byebug
|
79
|
+
rake (~> 10.0)
|
80
|
+
rspec (~> 3.0)
|
81
|
+
|
82
|
+
BUNDLED WITH
|
83
|
+
1.13.2
|
@@ -0,0 +1,80 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../
|
3
|
+
specs:
|
4
|
+
pg-eyeballs (1.0.1)
|
5
|
+
activerecord (>= 4.0, < 6.0)
|
6
|
+
pg
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
activemodel (5.0.0.1)
|
12
|
+
activesupport (= 5.0.0.1)
|
13
|
+
activerecord (5.0.0.1)
|
14
|
+
activemodel (= 5.0.0.1)
|
15
|
+
activesupport (= 5.0.0.1)
|
16
|
+
arel (~> 7.0)
|
17
|
+
activesupport (5.0.0.1)
|
18
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
19
|
+
i18n (~> 0.7)
|
20
|
+
minitest (~> 5.1)
|
21
|
+
tzinfo (~> 1.1)
|
22
|
+
appraisal (2.1.0)
|
23
|
+
bundler
|
24
|
+
rake
|
25
|
+
thor (>= 0.14.0)
|
26
|
+
arel (7.1.2)
|
27
|
+
awesome_print (1.7.0)
|
28
|
+
byebug (9.0.6)
|
29
|
+
coderay (1.1.1)
|
30
|
+
concurrent-ruby (1.0.2)
|
31
|
+
database_cleaner (1.5.3)
|
32
|
+
diff-lcs (1.2.5)
|
33
|
+
i18n (0.7.0)
|
34
|
+
method_source (0.8.2)
|
35
|
+
minitest (5.9.1)
|
36
|
+
pg (0.19.0)
|
37
|
+
pry (0.10.4)
|
38
|
+
coderay (~> 1.1.0)
|
39
|
+
method_source (~> 0.8.1)
|
40
|
+
slop (~> 3.4)
|
41
|
+
pry-byebug (3.4.0)
|
42
|
+
byebug (~> 9.0)
|
43
|
+
pry (~> 0.10)
|
44
|
+
rake (10.5.0)
|
45
|
+
rspec (3.5.0)
|
46
|
+
rspec-core (~> 3.5.0)
|
47
|
+
rspec-expectations (~> 3.5.0)
|
48
|
+
rspec-mocks (~> 3.5.0)
|
49
|
+
rspec-core (3.5.4)
|
50
|
+
rspec-support (~> 3.5.0)
|
51
|
+
rspec-expectations (3.5.0)
|
52
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
53
|
+
rspec-support (~> 3.5.0)
|
54
|
+
rspec-mocks (3.5.0)
|
55
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
56
|
+
rspec-support (~> 3.5.0)
|
57
|
+
rspec-support (3.5.0)
|
58
|
+
slop (3.6.0)
|
59
|
+
thor (0.19.1)
|
60
|
+
thread_safe (0.3.5)
|
61
|
+
tzinfo (1.2.2)
|
62
|
+
thread_safe (~> 0.1)
|
63
|
+
|
64
|
+
PLATFORMS
|
65
|
+
ruby
|
66
|
+
|
67
|
+
DEPENDENCIES
|
68
|
+
activerecord (>= 5.0.0, <= 6.0.0)
|
69
|
+
appraisal
|
70
|
+
awesome_print
|
71
|
+
bundler (~> 1.12)
|
72
|
+
database_cleaner
|
73
|
+
pg-eyeballs!
|
74
|
+
pry
|
75
|
+
pry-byebug
|
76
|
+
rake (~> 10.0)
|
77
|
+
rspec (~> 3.0)
|
78
|
+
|
79
|
+
BUNDLED WITH
|
80
|
+
1.13.2
|
data/lib/eyeballs/inspector.rb
CHANGED
@@ -23,9 +23,9 @@ module Eyeballs
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def queries
|
26
|
-
@
|
27
|
-
build_sql(
|
28
|
-
|
26
|
+
@relation.connection.to_sql(query_array).map { |query|
|
27
|
+
build_sql(query)
|
28
|
+
}
|
29
29
|
end
|
30
30
|
|
31
31
|
def to_s(options: OPTIONS)
|
@@ -53,7 +53,7 @@ module Eyeballs
|
|
53
53
|
to_hash_array.each do |h|
|
54
54
|
system("echo '#{h.to_json}' | gocmdpev")
|
55
55
|
end
|
56
|
-
nil
|
56
|
+
nil
|
57
57
|
end
|
58
58
|
|
59
59
|
private
|
@@ -66,20 +66,20 @@ module Eyeballs
|
|
66
66
|
|
67
67
|
def validate_format!(format)
|
68
68
|
unless FORMATS.include?(format)
|
69
|
-
raise Eyeballs::UnknownFormatError, "Unknown Format #{format}"
|
69
|
+
raise Eyeballs::UnknownFormatError, "Unknown Format #{format}"
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
def validate_options!(options)
|
74
74
|
options.each do |option|
|
75
75
|
unless OPTIONS.include?(option)
|
76
|
-
raise Eyeballs::UnknownOptionError, "Unknown Option #{option}"
|
76
|
+
raise Eyeballs::UnknownOptionError, "Unknown Option #{option}"
|
77
77
|
end
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
81
|
def explain_query(query, format, options)
|
82
|
-
"EXPLAIN (#{explain_options(format, options)}) #{query}"
|
82
|
+
"EXPLAIN (#{explain_options(format, options)}) #{query}"
|
83
83
|
end
|
84
84
|
|
85
85
|
def explain_options(format, options)
|
@@ -91,15 +91,18 @@ module Eyeballs
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def build_sql(query_binding)
|
94
|
-
|
95
|
-
|
96
|
-
cast_type = b[0].cast_type
|
97
|
-
cast_value = cast_type.type_cast_for_database(b[1])
|
98
|
-
quoted_value = @relation.connection.quote(cast_value)
|
94
|
+
query_binding[1].each.with_index.reduce(query_binding[0]) do |sql,(value, index)|
|
95
|
+
sql.sub("$#{index + 1}", @relation.connection.quote(extract_value(value)))
|
99
96
|
end
|
100
|
-
|
101
|
-
|
97
|
+
end
|
98
|
+
|
99
|
+
def extract_value(value)
|
100
|
+
if value.is_a?(Array) #Rails 4
|
101
|
+
value.last
|
102
|
+
elsif value.is_a?(ActiveRecord::Relation::QueryAttribute) #Rails 5
|
103
|
+
value.value
|
102
104
|
end
|
103
105
|
end
|
106
|
+
|
104
107
|
end
|
105
108
|
end
|
data/lib/eyeballs/version.rb
CHANGED
data/pg-eyeballs.gemspec
CHANGED
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency "rspec", "~> 3.0"
|
33
33
|
spec.add_development_dependency "database_cleaner"
|
34
34
|
|
35
|
-
spec.add_dependency "activerecord", ">=4.0", "<
|
35
|
+
spec.add_dependency "activerecord", ">=4.0", "<6.0"
|
36
36
|
spec.add_dependency "pg"
|
37
37
|
|
38
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg-eyeballs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Urani
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -75,7 +75,7 @@ dependencies:
|
|
75
75
|
version: '4.0'
|
76
76
|
- - "<"
|
77
77
|
- !ruby/object:Gem::Version
|
78
|
-
version: '
|
78
|
+
version: '6.0'
|
79
79
|
type: :runtime
|
80
80
|
prerelease: false
|
81
81
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -85,7 +85,7 @@ dependencies:
|
|
85
85
|
version: '4.0'
|
86
86
|
- - "<"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
88
|
+
version: '6.0'
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: pg
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,6 +113,7 @@ files:
|
|
113
113
|
- ".gitignore"
|
114
114
|
- ".rspec"
|
115
115
|
- ".travis.yml"
|
116
|
+
- Appraisals
|
116
117
|
- CODE_OF_CONDUCT.md
|
117
118
|
- Gemfile
|
118
119
|
- LICENSE
|
@@ -122,6 +123,10 @@ files:
|
|
122
123
|
- bin/gocmdpev
|
123
124
|
- bin/setup
|
124
125
|
- circle.yml
|
126
|
+
- gemfiles/activerecord_4.gemfile
|
127
|
+
- gemfiles/activerecord_4.gemfile.lock
|
128
|
+
- gemfiles/activerecord_5.gemfile
|
129
|
+
- gemfiles/activerecord_5.gemfile.lock
|
125
130
|
- gocmdpev.png
|
126
131
|
- lib/eyeballs/errors.rb
|
127
132
|
- lib/eyeballs/includes.rb
|