arsi 0.4.3 → 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/lib/arsi/arel_tree_manager.rb +5 -22
- data/lib/arsi/relation.rb +7 -8
- data/lib/arsi/version.rb +1 -1
- data/lib/arsi.rb +20 -10
- metadata +7 -35
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4568758138c9d89d766860d327ee3233771f8a0e25924288b57513088a4894f8
|
|
4
|
+
data.tar.gz: 06c17d87d50c76db362a083a358c731828359ca0195db29062b1a1e8346feabf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 38b1cdb07c23ac73a838702f89ecb5239e341cc9df2220def0a414dea33c946fe258606c0b0ef88dce980675ee87ba75407c115456a91b370f50312fc0638247
|
|
7
|
+
data.tar.gz: 4c603a0b1fdb9fca7ee7c9dd02869f9d29df4e127b7ba65a939ec4f0c42087275aad6be0b16189de22034e56fa679947d4427ead5ff80ff94ca39f528e556c0a
|
|
@@ -2,29 +2,12 @@ require 'arel'
|
|
|
2
2
|
|
|
3
3
|
module Arsi
|
|
4
4
|
module ArelTreeManager
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
# This is inspired from Arel::SelectManager, a subclass of Arel::TreeManager
|
|
6
|
+
# just like Arel::UpdateManager and Arel::DeleteManager.
|
|
7
|
+
def where_sql(engine = ::Arel::Table.engine)
|
|
8
|
+
return if @ast.wheres.empty?
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
# We need where_sql on both Arel::UpdateManager and Arel::DeleteManager so we add it to the parent class.
|
|
10
|
-
def where_sql(provided_engine = :none)
|
|
11
|
-
return if @ctx.wheres.empty?
|
|
12
|
-
|
|
13
|
-
selected_engine = provided_engine
|
|
14
|
-
if selected_engine == :none
|
|
15
|
-
selected_engine = if AREL_WHERE_SQL_ENGINE_ACCESSOR
|
|
16
|
-
self.engine || ::Arel::Table.engine
|
|
17
|
-
else
|
|
18
|
-
Arel::Table.engine
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
viz = if AREL_WHERE_SQL_ARITY_1
|
|
23
|
-
::Arel::Visitors::WhereSql.new selected_engine.connection
|
|
24
|
-
else
|
|
25
|
-
::Arel::Visitors::WhereSql.new(selected_engine.connection.visitor, selected_engine.connection)
|
|
26
|
-
end
|
|
27
|
-
::Arel::Nodes::SqlLiteral.new viz.accept(@ctx, ::Arel::Collectors::SQLString.new).value
|
|
10
|
+
::Arel::Nodes::SqlLiteral.new("WHERE #{::Arel::Nodes::And.new(@ast.wheres).to_sql(engine)}")
|
|
28
11
|
end
|
|
29
12
|
end
|
|
30
13
|
end
|
data/lib/arsi/relation.rb
CHANGED
|
@@ -18,23 +18,22 @@ module Arsi
|
|
|
18
18
|
!arsi_scopeable?
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
def _update_record(*)
|
|
22
|
+
with_relation_in_connection { super }
|
|
23
|
+
end
|
|
24
|
+
|
|
21
25
|
def delete_all(*)
|
|
22
26
|
with_relation_in_connection { super }
|
|
23
27
|
end
|
|
24
28
|
|
|
25
|
-
def
|
|
26
|
-
|
|
27
|
-
alias_method :update_all_without_arsi, :update_all
|
|
28
|
-
def update_all(*args)
|
|
29
|
-
with_relation_in_connection { update_all_without_arsi(*args) }
|
|
30
|
-
end
|
|
31
|
-
end
|
|
29
|
+
def update_all(*)
|
|
30
|
+
with_relation_in_connection { super }
|
|
32
31
|
end
|
|
33
32
|
|
|
34
33
|
private
|
|
35
34
|
|
|
36
35
|
def arsi_scopeable?
|
|
37
|
-
@klass.columns.any? { |c| c.name
|
|
36
|
+
@klass.columns.any? { |c| Arsi::SCOPEABLE_REGEX.match?(c.name) }
|
|
38
37
|
end
|
|
39
38
|
|
|
40
39
|
def with_relation_in_connection
|
data/lib/arsi/version.rb
CHANGED
data/lib/arsi.rb
CHANGED
|
@@ -6,9 +6,10 @@ require 'active_record/connection_adapters/mysql2_adapter'
|
|
|
6
6
|
|
|
7
7
|
module Arsi
|
|
8
8
|
class UnscopedSQL < StandardError; end
|
|
9
|
-
Arel::
|
|
10
|
-
|
|
11
|
-
ActiveRecord::
|
|
9
|
+
Arel::UpdateManager.include(ArelTreeManager)
|
|
10
|
+
Arel::DeleteManager.include(ArelTreeManager)
|
|
11
|
+
ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(Mysql2Adapter)
|
|
12
|
+
ActiveRecord::Relation.prepend(Relation)
|
|
12
13
|
ActiveRecord::Querying.delegate(:without_arsi, :to => :relation)
|
|
13
14
|
|
|
14
15
|
@enabled = true
|
|
@@ -24,15 +25,12 @@ module Arsi
|
|
|
24
25
|
attr_reader :enabled
|
|
25
26
|
attr_accessor :violation_callback
|
|
26
27
|
|
|
27
|
-
def sql_check!(sql, relation)
|
|
28
|
-
return if !@enabled || relation.try(:without_arsi?)
|
|
29
|
-
return if sql =~ SQL_MATCHER
|
|
30
|
-
report_violation(sql, relation)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
28
|
def arel_check!(arel, relation)
|
|
34
29
|
return unless @enabled
|
|
35
|
-
|
|
30
|
+
return if relation && relation.without_arsi?
|
|
31
|
+
|
|
32
|
+
# ::Arel::TreeManager, String, nil or ... ?
|
|
33
|
+
sql = arel.respond_to?(:where_sql) ? arel_where_sql(arel, relation) : arel.to_s
|
|
36
34
|
sql_check!(sql, relation)
|
|
37
35
|
end
|
|
38
36
|
|
|
@@ -54,6 +52,18 @@ module Arsi
|
|
|
54
52
|
|
|
55
53
|
private
|
|
56
54
|
|
|
55
|
+
def arel_where_sql(arel, relation)
|
|
56
|
+
return arel.where_sql if relation.nil?
|
|
57
|
+
return arel.where_sql unless relation.model.respond_to?(:arel_engine)
|
|
58
|
+
|
|
59
|
+
arel.where_sql(relation.model.arel_engine)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def sql_check!(sql, relation)
|
|
63
|
+
return if SQL_MATCHER.match?(sql)
|
|
64
|
+
report_violation(sql, relation)
|
|
65
|
+
end
|
|
66
|
+
|
|
57
67
|
def run_with_arsi(with_arsi)
|
|
58
68
|
previous, @enabled = @enabled, with_arsi
|
|
59
69
|
yield
|
metadata
CHANGED
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: arsi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Christopher Kintner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-09-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: arel
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0'
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: mysql2
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -47,7 +33,7 @@ dependencies:
|
|
|
47
33
|
version: 5.0.0
|
|
48
34
|
- - "<"
|
|
49
35
|
- !ruby/object:Gem::Version
|
|
50
|
-
version: '
|
|
36
|
+
version: '7.1'
|
|
51
37
|
type: :runtime
|
|
52
38
|
prerelease: false
|
|
53
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -57,7 +43,7 @@ dependencies:
|
|
|
57
43
|
version: 5.0.0
|
|
58
44
|
- - "<"
|
|
59
45
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: '
|
|
46
|
+
version: '7.1'
|
|
61
47
|
- !ruby/object:Gem::Dependency
|
|
62
48
|
name: bump
|
|
63
49
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -87,21 +73,7 @@ dependencies:
|
|
|
87
73
|
- !ruby/object:Gem::Version
|
|
88
74
|
version: '0'
|
|
89
75
|
- !ruby/object:Gem::Dependency
|
|
90
|
-
name:
|
|
91
|
-
requirement: !ruby/object:Gem::Requirement
|
|
92
|
-
requirements:
|
|
93
|
-
- - ">="
|
|
94
|
-
- !ruby/object:Gem::Version
|
|
95
|
-
version: '0'
|
|
96
|
-
type: :development
|
|
97
|
-
prerelease: false
|
|
98
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
99
|
-
requirements:
|
|
100
|
-
- - ">="
|
|
101
|
-
- !ruby/object:Gem::Version
|
|
102
|
-
version: '0'
|
|
103
|
-
- !ruby/object:Gem::Dependency
|
|
104
|
-
name: minitest-rg
|
|
76
|
+
name: maxitest
|
|
105
77
|
requirement: !ruby/object:Gem::Requirement
|
|
106
78
|
requirements:
|
|
107
79
|
- - ">="
|
|
@@ -167,14 +139,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
167
139
|
requirements:
|
|
168
140
|
- - ">="
|
|
169
141
|
- !ruby/object:Gem::Version
|
|
170
|
-
version:
|
|
142
|
+
version: 2.5.0
|
|
171
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
172
144
|
requirements:
|
|
173
145
|
- - ">="
|
|
174
146
|
- !ruby/object:Gem::Version
|
|
175
147
|
version: '0'
|
|
176
148
|
requirements: []
|
|
177
|
-
rubygems_version: 3.3.
|
|
149
|
+
rubygems_version: 3.3.5
|
|
178
150
|
signing_key:
|
|
179
151
|
specification_version: 4
|
|
180
152
|
summary: ActiveRecord SQL Inspector
|