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 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: []