sql_safety_net 2.0.1 → 2.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/.gitignore +6 -7
- data/Appraisals +20 -0
- data/Rakefile +20 -0
- data/gemfiles/rails_3.2.gemfile +9 -0
- data/gemfiles/rails_4.0.gemfile +9 -0
- data/gemfiles/rails_4.1.gemfile +9 -0
- data/gemfiles/rails_4.2.gemfile +9 -0
- data/lib/sql_safety_net/connection_adapter.rb +14 -13
- data/lib/sql_safety_net/version.rb +1 -1
- data/spec/connection_adapter_spec.rb +19 -16
- data/spec/spec_helper.rb +0 -6
- data/sql_safety_net.gemspec +8 -7
- metadata +47 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bea9f78919f0aeda8e3d9a7e63d91c951f6fce7
|
4
|
+
data.tar.gz: ec3d635668247f26bf19b93eacacaef930e2e328
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de20705e4e92e7c9979640ed70aaebe0c1b7079ec688e530a96220cdd3da383175533b71269b4ea06843ea50488d0c21a90d97fce0bd40d7bb8bacd8d7b4d137
|
7
|
+
data.tar.gz: 0078dcbd525431aaa892514e7543c29794f74b56b8949be06cc4bb7e47a4334fd65233e5d8a9ee8d2edca98113d97e80281b85c0734a1b12a0cfd03afc69a0d3
|
data/.gitignore
CHANGED
data/Appraisals
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Install gems for all appraisal definitions:
|
2
|
+
#
|
3
|
+
# $ appraisal install
|
4
|
+
#
|
5
|
+
# To run tests on different versions:
|
6
|
+
#
|
7
|
+
# $ appraisal activerecord_x.x rspec spec
|
8
|
+
|
9
|
+
[
|
10
|
+
[ '3.2', '~> 3.2.0' ],
|
11
|
+
[ '4.0', '~> 4.0.0' ],
|
12
|
+
[ '4.1', '~> 4.1.0' ],
|
13
|
+
[ '4.2', '~> 4.2.0' ],
|
14
|
+
].each do |ver_name, ver_req|
|
15
|
+
appraise "rails_#{ver_name}" do
|
16
|
+
gem 'activerecord', ver_req
|
17
|
+
gem 'activesupport', ver_req
|
18
|
+
gem 'actionpack', ver_req
|
19
|
+
end
|
20
|
+
end
|
data/Rakefile
CHANGED
@@ -1 +1,21 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
# Note: if you get this error: "Bundler could not find compatible versions for gem ..."
|
5
|
+
# try deleting Gemfile.lock (usually happens when switching branches).
|
6
|
+
|
7
|
+
task default: :appraise_all
|
8
|
+
|
9
|
+
# This is slightly different from 'appraisal COMMAND' because it continues even if a definition fails.
|
10
|
+
desc "Run rspecs for all appraisals"
|
11
|
+
task :appraise_all do
|
12
|
+
success_map = {}
|
13
|
+
`bundle exec appraisal list`.lines.map(&:chomp).each do |appraise_def|
|
14
|
+
success = system('appraisal', appraise_def, 'rspec', 'spec')
|
15
|
+
success_map[appraise_def] = success
|
16
|
+
end
|
17
|
+
puts "\n===== Test Summary ====="
|
18
|
+
success_map.each do |appraise_def, success|
|
19
|
+
puts "#{appraise_def}: #{success ? 'no failures (but check pending)' : 'failed'}"
|
20
|
+
end
|
21
|
+
end
|
@@ -35,24 +35,17 @@ module SqlSafetyNet
|
|
35
35
|
results = yield
|
36
36
|
elapsed_time = Time.now - start_time
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
sql = "#{sql} #{binds.collect{|col, val| [col.name, val]}.inspect}"
|
41
|
-
end
|
42
|
-
rows = results.size
|
38
|
+
# In Rails 4, results is an ActiveRecord::Result, so use #count
|
39
|
+
row_count = results.count
|
43
40
|
result_size = 0
|
44
41
|
results.each do |row|
|
45
42
|
values = row.is_a?(Hash) ? row.values : row
|
46
43
|
values.each{|val| result_size += val.to_s.size if val}
|
47
44
|
end
|
48
45
|
cached = CacheStore.in_fetch_block?
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
else
|
53
|
-
sql_str = to_sql(sql, binds)
|
54
|
-
end
|
55
|
-
query_info = QueryInfo.new(sql_str, :elapsed_time => elapsed_time, :rows => rows, :result_size => result_size, :cached => cached)
|
46
|
+
|
47
|
+
query_info = QueryInfo.new(append_binds(sql, binds), :elapsed_time => elapsed_time,
|
48
|
+
:rows => row_count, :result_size => result_size, :cached => cached)
|
56
49
|
queries << query_info
|
57
50
|
|
58
51
|
# If connection includes a query plan analyzer then alert on issues in the query plan.
|
@@ -67,6 +60,14 @@ module SqlSafetyNet
|
|
67
60
|
yield
|
68
61
|
end
|
69
62
|
end
|
70
|
-
|
63
|
+
|
64
|
+
# the returned string is for display only; it's not valid sql
|
65
|
+
def append_binds(sql_str, binds)
|
66
|
+
if binds.empty?
|
67
|
+
sql_str
|
68
|
+
else
|
69
|
+
"#{sql_str} #{binds.map {|col, val| [col.name, val] }.inspect}"
|
70
|
+
end
|
71
|
+
end
|
71
72
|
end
|
72
73
|
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SqlSafetyNet::ConnectionAdapter do
|
4
|
+
# ActiveRecord 4's conn.select returns an ActiveRecord::Result. This normalizes it so we can test on both AR 3.2 & 4.x
|
5
|
+
def hashify_select_result(results)
|
6
|
+
results.respond_to?(:to_hash) ? results.to_hash : results
|
7
|
+
end
|
4
8
|
|
5
9
|
let(:connection){ SqlSafetyNet::TestModel.connection }
|
6
10
|
|
@@ -17,7 +21,9 @@ describe SqlSafetyNet::ConnectionAdapter do
|
|
17
21
|
|
18
22
|
it "should analyze queries in the select method" do
|
19
23
|
connection.should_receive(:analyze_query).with("select name, value from test_models", "SQL", []).and_yield
|
20
|
-
|
24
|
+
hashify_select_result(
|
25
|
+
connection.send(:select, "select name, value from test_models", "SQL")
|
26
|
+
).should == [{"name"=>"test", "value"=>10}]
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
@@ -34,7 +40,7 @@ describe SqlSafetyNet::ConnectionAdapter do
|
|
34
40
|
it "should analyze select statements" do
|
35
41
|
SqlSafetyNet::QueryAnalysis.capture do |analysis|
|
36
42
|
results = connection.send(:select, "select name, value from test_models order by name")
|
37
|
-
results.should == [{"name" => "foo", "value" => 100}, {"name" => "test", "value" => 10}]
|
43
|
+
hashify_select_result(results).should == [{"name" => "foo", "value" => 100}, {"name" => "test", "value" => 10}]
|
38
44
|
analysis.queries.size.should == 1
|
39
45
|
query_info = analysis.queries.first
|
40
46
|
query_info.sql.should == "select name, value from test_models order by name"
|
@@ -44,20 +50,17 @@ describe SqlSafetyNet::ConnectionAdapter do
|
|
44
50
|
end
|
45
51
|
end
|
46
52
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
query_info.result_size.should == 6
|
59
|
-
query_info.elapsed_time.should > 0
|
60
|
-
end
|
53
|
+
it "should analyze select statements using bind variables" do
|
54
|
+
SqlSafetyNet::QueryAnalysis.capture do |analysis|
|
55
|
+
name_column = SqlSafetyNet::TestModel.columns_hash["name"]
|
56
|
+
results = connection.send(:select, "select name, value from test_models where name = ? order by name", "SQL", [[name_column, "foo"]])
|
57
|
+
hashify_select_result(results).should == [{"name" => "foo", "value" => 100}]
|
58
|
+
analysis.queries.size.should == 1
|
59
|
+
query_info = analysis.queries.first
|
60
|
+
query_info.sql.should == 'select name, value from test_models where name = ? order by name [["name", "foo"]]'
|
61
|
+
query_info.rows.should == 1
|
62
|
+
query_info.result_size.should == 6
|
63
|
+
query_info.elapsed_time.should > 0
|
61
64
|
end
|
62
65
|
end
|
63
66
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,5 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
active_record_version = ENV['ACTIVE_RECORD_VERSION'] || ">=3.2.0"
|
4
|
-
gem 'activerecord', active_record_version
|
5
|
-
gem 'activesupport', active_record_version
|
6
1
|
require 'active_support/all'
|
7
2
|
require 'active_record'
|
8
|
-
puts "Testing against activerecord #{ActiveRecord::VERSION::STRING}"
|
9
3
|
|
10
4
|
begin
|
11
5
|
require 'simplecov'
|
data/sql_safety_net.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'sql_safety_net/version'
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'sql_safety_net'
|
7
|
-
spec.version = SqlSafetyNet::VERSION
|
7
|
+
spec.version = SqlSafetyNet::VERSION.dup # ruby 1.9 needs dup
|
8
8
|
spec.authors = ['Brian Durand', 'Milan Dobrota']
|
9
9
|
spec.email = ['mdobrota@tribpub.com']
|
10
10
|
spec.summary = 'Debug SQL statements in ActiveRecord'
|
@@ -16,12 +16,13 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
17
|
spec.require_paths = ['lib']
|
18
18
|
|
19
|
-
spec.add_runtime_dependency 'activesupport', '
|
20
|
-
spec.add_runtime_dependency 'activerecord', '
|
21
|
-
spec.add_runtime_dependency 'actionpack', '
|
19
|
+
spec.add_runtime_dependency 'activesupport', '>= 3.2.0', '< 4.3'
|
20
|
+
spec.add_runtime_dependency 'activerecord' , '>= 3.2.0', '< 4.3'
|
21
|
+
spec.add_runtime_dependency 'actionpack' , '>= 3.2.0', '< 4.3'
|
22
22
|
|
23
|
-
spec.add_development_dependency 'rspec', '~> 2.
|
23
|
+
spec.add_development_dependency 'rspec' , '~> 2.99'
|
24
24
|
spec.add_development_dependency 'sqlite3-ruby', '>= 0'
|
25
|
-
spec.add_development_dependency 'bundler', '~> 1.7'
|
26
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
25
|
+
spec.add_development_dependency 'bundler' , '~> 1.7'
|
26
|
+
spec.add_development_dependency 'rake' , '~> 10.0'
|
27
|
+
spec.add_development_dependency 'appraisal' , '~> 2.0'
|
27
28
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sql_safety_net
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Durand
|
@@ -9,64 +9,82 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-09-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 3.2.0
|
21
|
+
- - "<"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: '4.3'
|
21
24
|
type: :runtime
|
22
25
|
prerelease: false
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
24
27
|
requirements:
|
25
|
-
- - "
|
28
|
+
- - ">="
|
26
29
|
- !ruby/object:Gem::Version
|
27
30
|
version: 3.2.0
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.3'
|
28
34
|
- !ruby/object:Gem::Dependency
|
29
35
|
name: activerecord
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
31
37
|
requirements:
|
32
|
-
- - "
|
38
|
+
- - ">="
|
33
39
|
- !ruby/object:Gem::Version
|
34
40
|
version: 3.2.0
|
41
|
+
- - "<"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '4.3'
|
35
44
|
type: :runtime
|
36
45
|
prerelease: false
|
37
46
|
version_requirements: !ruby/object:Gem::Requirement
|
38
47
|
requirements:
|
39
|
-
- - "
|
48
|
+
- - ">="
|
40
49
|
- !ruby/object:Gem::Version
|
41
50
|
version: 3.2.0
|
51
|
+
- - "<"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '4.3'
|
42
54
|
- !ruby/object:Gem::Dependency
|
43
55
|
name: actionpack
|
44
56
|
requirement: !ruby/object:Gem::Requirement
|
45
57
|
requirements:
|
46
|
-
- - "
|
58
|
+
- - ">="
|
47
59
|
- !ruby/object:Gem::Version
|
48
60
|
version: 3.2.0
|
61
|
+
- - "<"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '4.3'
|
49
64
|
type: :runtime
|
50
65
|
prerelease: false
|
51
66
|
version_requirements: !ruby/object:Gem::Requirement
|
52
67
|
requirements:
|
53
|
-
- - "
|
68
|
+
- - ">="
|
54
69
|
- !ruby/object:Gem::Version
|
55
70
|
version: 3.2.0
|
71
|
+
- - "<"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '4.3'
|
56
74
|
- !ruby/object:Gem::Dependency
|
57
75
|
name: rspec
|
58
76
|
requirement: !ruby/object:Gem::Requirement
|
59
77
|
requirements:
|
60
78
|
- - "~>"
|
61
79
|
- !ruby/object:Gem::Version
|
62
|
-
version: 2.
|
80
|
+
version: '2.99'
|
63
81
|
type: :development
|
64
82
|
prerelease: false
|
65
83
|
version_requirements: !ruby/object:Gem::Requirement
|
66
84
|
requirements:
|
67
85
|
- - "~>"
|
68
86
|
- !ruby/object:Gem::Version
|
69
|
-
version: 2.
|
87
|
+
version: '2.99'
|
70
88
|
- !ruby/object:Gem::Dependency
|
71
89
|
name: sqlite3-ruby
|
72
90
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,6 +127,20 @@ dependencies:
|
|
109
127
|
- - "~>"
|
110
128
|
- !ruby/object:Gem::Version
|
111
129
|
version: '10.0'
|
130
|
+
- !ruby/object:Gem::Dependency
|
131
|
+
name: appraisal
|
132
|
+
requirement: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - "~>"
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '2.0'
|
137
|
+
type: :development
|
138
|
+
prerelease: false
|
139
|
+
version_requirements: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - "~>"
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '2.0'
|
112
144
|
description: Debug SQL statements in ActiveRecord by displaying warnings on bad queries.
|
113
145
|
email:
|
114
146
|
- mdobrota@tribpub.com
|
@@ -117,10 +149,15 @@ extensions: []
|
|
117
149
|
extra_rdoc_files: []
|
118
150
|
files:
|
119
151
|
- ".gitignore"
|
152
|
+
- Appraisals
|
120
153
|
- Gemfile
|
121
154
|
- License.txt
|
122
155
|
- README.rdoc
|
123
156
|
- Rakefile
|
157
|
+
- gemfiles/rails_3.2.gemfile
|
158
|
+
- gemfiles/rails_4.0.gemfile
|
159
|
+
- gemfiles/rails_4.1.gemfile
|
160
|
+
- gemfiles/rails_4.2.gemfile
|
124
161
|
- lib/sql_safety_net.rb
|
125
162
|
- lib/sql_safety_net/cache_store.rb
|
126
163
|
- lib/sql_safety_net/configuration.rb
|