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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea7a4a5e12e9e4a35319a230ebf3b4310db0e0d02582da4840d93c85d714cca6
4
- data.tar.gz: 22f1bda30e928de04e48ceea8de894e67cbd1e1c14d44d7b72c98cfc5c25a87c
3
+ metadata.gz: 4568758138c9d89d766860d327ee3233771f8a0e25924288b57513088a4894f8
4
+ data.tar.gz: 06c17d87d50c76db362a083a358c731828359ca0195db29062b1a1e8346feabf
5
5
  SHA512:
6
- metadata.gz: de787c78a923844c619250378ede3267f4b72e89b207dce90a1b085938c3f2d9ebb441d6780dc00321a71130064f28546f89278c8e00fb3e54122783d9749ae2
7
- data.tar.gz: ee136b4e0cc3cde3289679b3a487bd21982085e96c42e1964dc8bce66ff9367f3e2f4b4edebbf1b5534013c4e7e019af2934fc64157367d0c004aad68f5b6d01
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
- AREL_WHERE_SQL_ARITY_1 = ::Arel::VERSION[0].to_i < 7
6
- AREL_WHERE_SQL_ENGINE_ACCESSOR = ::Arel::VERSION[0].to_i < 9
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
- # This is from Arel::SelectManager which inherits from Arel::TreeManager.
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 self.prepended(base)
26
- base.class_eval do
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 =~ Arsi::SCOPEABLE_REGEX }
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
@@ -1,3 +1,3 @@
1
1
  module Arsi
2
- VERSION = '0.4.3'
2
+ VERSION = '1.1.0'
3
3
  end
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::TreeManager.send(:include, ArelTreeManager)
10
- ActiveRecord::ConnectionAdapters::Mysql2Adapter.send(:prepend, Mysql2Adapter)
11
- ActiveRecord::Relation.send(:prepend, Relation)
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
- sql = arel.respond_to?(:ast) ? arel.where_sql : arel.to_s
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: 0.4.3
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-02-28 00:00:00.000000000 Z
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: '6.0'
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: '6.0'
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: minitest
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: '0'
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.8
149
+ rubygems_version: 3.3.5
178
150
  signing_key:
179
151
  specification_version: 4
180
152
  summary: ActiveRecord SQL Inspector