arsi 0.4.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: efe5a87bd8303daf7685c2d9e753b30ecdd8efa25f721b68cc5fea2ce1f9e96b
4
- data.tar.gz: e631bb40979d5791707bda82e29db2bf7b225c3f1424addd69131ae9b0d23753
3
+ metadata.gz: aea5ecd2b64166843083b97523f85c66b2c07246d291b2b44f6d4ed814ec6a42
4
+ data.tar.gz: 7810f158d8850861dfa9eafa974decf092b537503e82850269abbe67b7f415fc
5
5
  SHA512:
6
- metadata.gz: 75ab18df3d1ee8bc3e04dd51a69fa29e42a7904b8d6bb892341046ca98bc9f86217438ed80fb6d2e7721993a0e132ee601fa3b684e8a35babcb8ebaa9b616c27
7
- data.tar.gz: 79660da433f0d3110f05026156634132e6fa295a9f6e8155feec43e7ca8186811d3f2b023ce3ee7dccf024a7a20c083289f3e9b28b6d506453bb7ea1021c73fe
6
+ metadata.gz: f16b52a751b60ed9d6fe42f8dfe1989bc52b6e48e791c541d6dbfab83d969579507a062e82aa01789e992dd883869dc77c112e9e3f6553c7fd80da56a159eeef
7
+ data.tar.gz: 6b4f455f599f1ce7e68d5518efb85d6b23bfdd800ab58fbab807573a288f78196ba340016926b4aeab2971e66a88cd2f5c79062b9f58907aaf6f956d3371adc6
data/README.md CHANGED
@@ -1,6 +1,4 @@
1
- # ARSI - ActiveRecord SQL Inspector
2
-
3
- [![Build Status](https://travis-ci.org/zendesk/arsi.svg?branch=master)](https://travis-ci.org/zendesk/arsi)
1
+ # ARSI - ActiveRecord SQL Inspector [![CI](https://github.com/zendesk/arsi/actions/workflows/actions.yml/badge.svg)](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
- if ::Arel::VERSION[0].to_i >= 6
8
- def where_sql(engine = Arel::Table.engine)
9
- return if @ctx.wheres.empty?
7
+ def where_sql(engine = ::Arel::Table.engine)
8
+ return if @ctx.wheres.empty?
10
9
 
11
- viz = if ::Arel::VERSION[0].to_i > 6
12
- ::Arel::Visitors::WhereSql.new(engine.connection.visitor, engine.connection)
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
- attr_accessor :without_arsi
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 || !arsi_scopeable?
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 self.prepended(base)
25
- base.class_eval do
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 =~ Arsi::SCOPEABLE_REGEX }
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
@@ -1,3 +1,3 @@
1
1
  module Arsi
2
- VERSION = '0.4.0'
2
+ VERSION = '1.0.0'
3
3
  end
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.send(:include, ArelTreeManager)
10
- ActiveRecord::ConnectionAdapters::Mysql2Adapter.send(:prepend, Mysql2Adapter)
11
- ActiveRecord::Relation.send(:prepend, 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
- sql = arel.respond_to?(:ast) ? arel.where_sql : arel.to_s
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.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: 2019-12-19 00:00:00.000000000 Z
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: 4.2.0
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: 4.2.0
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: minitest
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: wwtd
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: '0'
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.0.4
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: []