arsi 0.4.0 → 1.0.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/README.md +1 -3
- data/lib/arsi/arel_tree_manager.rb +4 -16
- data/lib/arsi/relation.rb +10 -10
- data/lib/arsi/version.rb +1 -1
- data/lib/arsi.rb +21 -10
- metadata +11 -53
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aea5ecd2b64166843083b97523f85c66b2c07246d291b2b44f6d4ed814ec6a42
|
4
|
+
data.tar.gz: 7810f158d8850861dfa9eafa974decf092b537503e82850269abbe67b7f415fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f16b52a751b60ed9d6fe42f8dfe1989bc52b6e48e791c541d6dbfab83d969579507a062e82aa01789e992dd883869dc77c112e9e3f6553c7fd80da56a159eeef
|
7
|
+
data.tar.gz: 6b4f455f599f1ce7e68d5518efb85d6b23bfdd800ab58fbab807573a288f78196ba340016926b4aeab2971e66a88cd2f5c79062b9f58907aaf6f956d3371adc6
|
data/README.md
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
# ARSI - ActiveRecord SQL Inspector
|
2
|
-
|
3
|
-
[](https://travis-ci.org/zendesk/arsi)
|
1
|
+
# ARSI - ActiveRecord SQL Inspector [](https://github.com/zendesk/arsi/actions/workflows/actions.yml)
|
4
2
|
|
5
3
|
Block sql statements that are not scoped by id in `.update_all` and `.delete_all`.
|
6
4
|
|
@@ -4,23 +4,11 @@ module Arsi
|
|
4
4
|
module ArelTreeManager
|
5
5
|
# This is from Arel::SelectManager which inherits from Arel::TreeManager.
|
6
6
|
# We need where_sql on both Arel::UpdateManager and Arel::DeleteManager so we add it to the parent class.
|
7
|
-
|
8
|
-
|
9
|
-
return if @ctx.wheres.empty?
|
7
|
+
def where_sql(engine = ::Arel::Table.engine)
|
8
|
+
return if @ctx.wheres.empty?
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
else
|
14
|
-
::Arel::Visitors::WhereSql.new engine.connection
|
15
|
-
end
|
16
|
-
::Arel::Nodes::SqlLiteral.new viz.accept(@ctx, ::Arel::Collectors::SQLString.new).value
|
17
|
-
end
|
18
|
-
else
|
19
|
-
def where_sql
|
20
|
-
return if @ctx.wheres.empty?
|
21
|
-
viz = ::Arel::Visitors::WhereSql.new @engine.connection
|
22
|
-
::Arel::Nodes::SqlLiteral.new viz.accept @ctx
|
23
|
-
end
|
10
|
+
viz = ::Arel::Visitors::WhereSql.new(engine.connection.visitor, engine.connection)
|
11
|
+
::Arel::Nodes::SqlLiteral.new viz.accept(@ctx, ::Arel::Collectors::SQLString.new).value
|
24
12
|
end
|
25
13
|
end
|
26
14
|
end
|
data/lib/arsi/relation.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Arsi
|
2
2
|
module Relation
|
3
|
-
|
3
|
+
attr_writer :without_arsi
|
4
4
|
|
5
5
|
def without_arsi
|
6
6
|
if block_given?
|
@@ -14,26 +14,26 @@ module Arsi
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def without_arsi?
|
17
|
-
@without_arsi
|
17
|
+
return @without_arsi if defined?(@without_arsi) && @without_arsi
|
18
|
+
!arsi_scopeable?
|
19
|
+
end
|
20
|
+
|
21
|
+
def _update_record(*)
|
22
|
+
with_relation_in_connection { super }
|
18
23
|
end
|
19
24
|
|
20
25
|
def delete_all(*)
|
21
26
|
with_relation_in_connection { super }
|
22
27
|
end
|
23
28
|
|
24
|
-
def
|
25
|
-
|
26
|
-
alias_method :update_all_without_arsi, :update_all
|
27
|
-
def update_all(*args)
|
28
|
-
with_relation_in_connection { update_all_without_arsi(*args) }
|
29
|
-
end
|
30
|
-
end
|
29
|
+
def update_all(*)
|
30
|
+
with_relation_in_connection { super }
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def arsi_scopeable?
|
36
|
-
@klass.columns.any? { |c| c.name
|
36
|
+
@klass.columns.any? { |c| Arsi::SCOPEABLE_REGEX.match?(c.name) }
|
37
37
|
end
|
38
38
|
|
39
39
|
def with_relation_in_connection
|
data/lib/arsi/version.rb
CHANGED
data/lib/arsi.rb
CHANGED
@@ -6,9 +6,9 @@ require 'active_record/connection_adapters/mysql2_adapter'
|
|
6
6
|
|
7
7
|
module Arsi
|
8
8
|
class UnscopedSQL < StandardError; end
|
9
|
-
Arel::TreeManager.
|
10
|
-
ActiveRecord::ConnectionAdapters::Mysql2Adapter.
|
11
|
-
ActiveRecord::Relation.
|
9
|
+
Arel::TreeManager.include(ArelTreeManager)
|
10
|
+
ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(Mysql2Adapter)
|
11
|
+
ActiveRecord::Relation.prepend(Relation)
|
12
12
|
ActiveRecord::Querying.delegate(:without_arsi, :to => :relation)
|
13
13
|
|
14
14
|
@enabled = true
|
@@ -21,16 +21,15 @@ module Arsi
|
|
21
21
|
end
|
22
22
|
|
23
23
|
class << self
|
24
|
+
attr_reader :enabled
|
24
25
|
attr_accessor :violation_callback
|
25
26
|
|
26
|
-
def sql_check!(sql, relation)
|
27
|
-
return if !@enabled || relation.try(:without_arsi?)
|
28
|
-
return if sql =~ SQL_MATCHER
|
29
|
-
report_violation(sql, relation)
|
30
|
-
end
|
31
|
-
|
32
27
|
def arel_check!(arel, relation)
|
33
|
-
|
28
|
+
return unless @enabled
|
29
|
+
return if relation && relation.without_arsi?
|
30
|
+
|
31
|
+
# ::Arel::TreeManager, String, nil or ... ?
|
32
|
+
sql = arel.respond_to?(:where_sql) ? arel_where_sql(arel, relation) : arel.to_s
|
34
33
|
sql_check!(sql, relation)
|
35
34
|
end
|
36
35
|
|
@@ -52,6 +51,18 @@ module Arsi
|
|
52
51
|
|
53
52
|
private
|
54
53
|
|
54
|
+
def arel_where_sql(arel, relation)
|
55
|
+
return arel.where_sql if relation.nil?
|
56
|
+
return arel.where_sql unless relation.model.respond_to?(:arel_engine)
|
57
|
+
|
58
|
+
arel.where_sql(relation.model.arel_engine)
|
59
|
+
end
|
60
|
+
|
61
|
+
def sql_check!(sql, relation)
|
62
|
+
return if SQL_MATCHER.match?(sql)
|
63
|
+
report_violation(sql, relation)
|
64
|
+
end
|
65
|
+
|
55
66
|
def run_with_arsi(with_arsi)
|
56
67
|
previous, @enabled = @enabled, with_arsi
|
57
68
|
yield
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arsi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher Kintner
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: arel
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 5.0.0
|
48
48
|
- - "<"
|
49
49
|
- !ruby/object:Gem::Version
|
50
50
|
version: '6.0'
|
@@ -54,7 +54,7 @@ dependencies:
|
|
54
54
|
requirements:
|
55
55
|
- - ">="
|
56
56
|
- !ruby/object:Gem::Version
|
57
|
-
version:
|
57
|
+
version: 5.0.0
|
58
58
|
- - "<"
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: '6.0'
|
@@ -72,20 +72,6 @@ dependencies:
|
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '0'
|
75
|
-
- !ruby/object:Gem::Dependency
|
76
|
-
name: bundler
|
77
|
-
requirement: !ruby/object:Gem::Requirement
|
78
|
-
requirements:
|
79
|
-
- - ">="
|
80
|
-
- !ruby/object:Gem::Version
|
81
|
-
version: '0'
|
82
|
-
type: :development
|
83
|
-
prerelease: false
|
84
|
-
version_requirements: !ruby/object:Gem::Requirement
|
85
|
-
requirements:
|
86
|
-
- - ">="
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
version: '0'
|
89
75
|
- !ruby/object:Gem::Dependency
|
90
76
|
name: rake
|
91
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,21 +87,7 @@ dependencies:
|
|
101
87
|
- !ruby/object:Gem::Version
|
102
88
|
version: '0'
|
103
89
|
- !ruby/object:Gem::Dependency
|
104
|
-
name:
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - ">="
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '0'
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - ">="
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '0'
|
117
|
-
- !ruby/object:Gem::Dependency
|
118
|
-
name: minitest-rg
|
90
|
+
name: maxitest
|
119
91
|
requirement: !ruby/object:Gem::Requirement
|
120
92
|
requirements:
|
121
93
|
- - ">="
|
@@ -143,21 +115,7 @@ dependencies:
|
|
143
115
|
- !ruby/object:Gem::Version
|
144
116
|
version: '0'
|
145
117
|
- !ruby/object:Gem::Dependency
|
146
|
-
name:
|
147
|
-
requirement: !ruby/object:Gem::Requirement
|
148
|
-
requirements:
|
149
|
-
- - ">="
|
150
|
-
- !ruby/object:Gem::Version
|
151
|
-
version: '0'
|
152
|
-
type: :development
|
153
|
-
prerelease: false
|
154
|
-
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
requirements:
|
156
|
-
- - ">="
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
version: '0'
|
159
|
-
- !ruby/object:Gem::Dependency
|
160
|
-
name: byebug
|
118
|
+
name: single_cov
|
161
119
|
requirement: !ruby/object:Gem::Requirement
|
162
120
|
requirements:
|
163
121
|
- - ">="
|
@@ -187,7 +145,7 @@ homepage: https://github.com/zendesk/arsi
|
|
187
145
|
licenses:
|
188
146
|
- Apache License Version 2.0
|
189
147
|
metadata: {}
|
190
|
-
post_install_message:
|
148
|
+
post_install_message:
|
191
149
|
rdoc_options: []
|
192
150
|
require_paths:
|
193
151
|
- lib
|
@@ -195,15 +153,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
153
|
requirements:
|
196
154
|
- - ">="
|
197
155
|
- !ruby/object:Gem::Version
|
198
|
-
version:
|
156
|
+
version: 2.5.0
|
199
157
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
158
|
requirements:
|
201
159
|
- - ">="
|
202
160
|
- !ruby/object:Gem::Version
|
203
161
|
version: '0'
|
204
162
|
requirements: []
|
205
|
-
rubygems_version: 3.
|
206
|
-
signing_key:
|
163
|
+
rubygems_version: 3.3.5
|
164
|
+
signing_key:
|
207
165
|
specification_version: 4
|
208
166
|
summary: ActiveRecord SQL Inspector
|
209
167
|
test_files: []
|