sql_safety_net 2.0.1 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|