arel_extensions 2.2.2 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS.md +8 -3
- data/gemfiles/rails6_1.gemfile +8 -0
- data/gemfiles/rails7.gemfile +8 -0
- data/gemfiles/rails7_1.gemfile +9 -0
- data/gemfiles/rails7_2.gemfile +8 -0
- data/lib/arel_extensions/attributes.rb +3 -6
- data/lib/arel_extensions/nodes/aggregate_function.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +6 -0
- data/lib/arel_extensions/nodes/rollup.rb +1 -1
- data/lib/arel_extensions/string_functions.rb +1 -1
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +2 -2
- data/lib/arel_extensions/visitors/mysql.rb +35 -31
- data/lib/arel_extensions/visitors/oracle.rb +2 -1
- data/lib/arel_extensions/visitors/postgresql.rb +2 -1
- data/lib/arel_extensions/visitors/to_sql.rb +2 -1
- data/lib/arel_extensions/warning.rb +15 -0
- data/lib/arel_extensions.rb +2 -0
- data/test/arelx_test_helper.rb +18 -0
- data/test/with_ar/all_agnostic_test.rb +4 -4
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bec346d9bbce78a1d91d023e0291903cb1c61b115237681cb4d9b4174e5f370a
|
4
|
+
data.tar.gz: b2e307f12bdb154129d29179093a04e1c7cd632feb2ed4d5e706a97acbfd0526
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90fc4233e4699e6a7da8d7141351f21d1d33d72d9f3220a2b47f5f9e425bca147be2db7a1f062696b17b593cb5191bf5fe75be2f68022139c4e7fce6021a43a9
|
7
|
+
data.tar.gz: 5c49180d1bb19d6ad2338a509811010c0749bcb6beda93c9d1d8e68c46f4316bd9bf3cc22768695bf790c2d4f6ddd68d7378819dbf10ad38823cf55030c3aff9
|
data/NEWS.md
CHANGED
@@ -2,14 +2,19 @@
|
|
2
2
|
|
3
3
|
## [unreleased]
|
4
4
|
|
5
|
+
## Release v2.3.0/v1.5.0 (19-12-2024)
|
6
|
+
|
7
|
+
- Use ActiveSupport's deprecation machinery instead of Ruby's Warning module.
|
8
|
+
- Fix a bug with group concat that didn't correctly check for the separator value.
|
9
|
+
|
5
10
|
## Release v2.2.2/v1.4.2 (27-11-2024)
|
6
11
|
|
7
|
-
- Fix
|
8
|
-
- Always emit
|
12
|
+
- Fix deprecation warnings for `==` and `!=`, showing the true location.
|
13
|
+
- Always emit deprecation warnings for `==` and `!=`.
|
9
14
|
|
10
15
|
## Release v2.2.1/v1.4.1 (08-11-2024)
|
11
16
|
|
12
|
-
- Improved
|
17
|
+
- Improved deprecation warnings for `==` and `!=`, showing the location where they're called.
|
13
18
|
|
14
19
|
## Release v2.2.0/v1.4.0
|
15
20
|
|
data/gemfiles/rails6_1.gemfile
CHANGED
@@ -28,6 +28,14 @@ group :development, :test do
|
|
28
28
|
gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
|
29
29
|
gem 'jdbc-mssql', platforms: :jruby, require: true
|
30
30
|
gem 'jdbc-sqlite3', platforms: :jruby
|
31
|
+
|
32
|
+
# Ruby 3.4+ removes the following gems from the standard distribution.
|
33
|
+
# Warnings are emitted from 3.3 .
|
34
|
+
if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('3.3.0')
|
35
|
+
gem 'base64'
|
36
|
+
gem 'bigdecimal'
|
37
|
+
gem 'mutex_m'
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
gemspec path: Dir.pwd
|
data/gemfiles/rails7.gemfile
CHANGED
@@ -28,6 +28,14 @@ group :development, :test do
|
|
28
28
|
gem 'activerecord-jdbcmysql-adapter', platforms: :jruby
|
29
29
|
gem 'activerecord-jdbcpostgresql-adapter', platforms: :jruby
|
30
30
|
gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
|
31
|
+
|
32
|
+
# Ruby 3.4+ removes the following gems from the standard distribution.
|
33
|
+
# Warnings are emitted from 3.3 .
|
34
|
+
if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('3.3.0')
|
35
|
+
gem 'base64'
|
36
|
+
gem 'bigdecimal'
|
37
|
+
gem 'mutex_m'
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
gemspec path: Dir.pwd
|
data/gemfiles/rails7_1.gemfile
CHANGED
@@ -22,12 +22,21 @@ group :development, :test do
|
|
22
22
|
gem 'activerecord-oracle_enhanced-adapter', '~> 7.0.0' if ENV.has_key? 'ORACLE_HOME'
|
23
23
|
|
24
24
|
# for JRuby
|
25
|
+
gem 'jar-dependencies', '0.4.1', platforms: :jruby
|
25
26
|
gem 'jdbc-mssql', platforms: :jruby, require: true
|
26
27
|
gem 'jdbc-sqlite3', platform: :jruby
|
27
28
|
gem 'activerecord-jdbc-alt-adapter', '~> 71.0.0.alpha1', platform: :jruby, require: true
|
28
29
|
gem 'activerecord-jdbcmysql-adapter', platforms: :jruby
|
29
30
|
gem 'activerecord-jdbcpostgresql-adapter', platforms: :jruby
|
30
31
|
gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
|
32
|
+
|
33
|
+
# Ruby 3.4+ removes the following gems from the standard distribution.
|
34
|
+
# Warnings are emitted from 3.3 .
|
35
|
+
if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('3.3.0')
|
36
|
+
gem 'base64'
|
37
|
+
gem 'bigdecimal'
|
38
|
+
gem 'mutex_m'
|
39
|
+
end
|
31
40
|
end
|
32
41
|
|
33
42
|
gemspec path: Dir.pwd
|
data/gemfiles/rails7_2.gemfile
CHANGED
@@ -28,6 +28,14 @@ group :development, :test do
|
|
28
28
|
gem 'activerecord-jdbcmysql-adapter', platforms: :jruby
|
29
29
|
gem 'activerecord-jdbcpostgresql-adapter', platforms: :jruby
|
30
30
|
gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
|
31
|
+
|
32
|
+
# Ruby 3.4+ removes the following gems from the standard distribution.
|
33
|
+
# Warnings are emitted from 3.3 .
|
34
|
+
if Gem::Version.create(RUBY_VERSION) >= Gem::Version.create('3.3.0')
|
35
|
+
gem 'base64'
|
36
|
+
gem 'bigdecimal'
|
37
|
+
gem 'mutex_m'
|
38
|
+
end
|
31
39
|
end
|
32
40
|
|
33
41
|
gemspec path: Dir.pwd
|
@@ -17,18 +17,15 @@ module ArelExtensions
|
|
17
17
|
include ArelExtensions::NullFunctions
|
18
18
|
include ArelExtensions::StringFunctions
|
19
19
|
include ArelExtensions::Predications
|
20
|
+
include ArelExtensions::Warning
|
20
21
|
|
21
22
|
def ==(other)
|
22
|
-
if Gem::Version.create(ArelExtensions::VERSION) >= Gem::Version.create('2.2')
|
23
|
-
warn("#{caller(1..1).first} arel_extensions: `==` is now deprecated and will be removed soon. Use `.eq` instead.")
|
24
|
-
end
|
23
|
+
deprecated 'Use `.eq` instead.' if Gem::Version.create(ArelExtensions::VERSION) >= Gem::Version.create('2.2')
|
25
24
|
Arel::Nodes::Equality.new self, Arel.quoted(other, self)
|
26
25
|
end
|
27
26
|
|
28
27
|
def !=(other)
|
29
|
-
if Gem::Version.create(ArelExtensions::VERSION) >= Gem::Version.create('2.2')
|
30
|
-
warn("#{caller(1..1).first} arel_extensions: `!=` is now deprecated and will be removed soon. Use `.not_eq` instead.")
|
31
|
-
end
|
28
|
+
deprecated 'Use `.not_eq` instead.' if Gem::Version.create(ArelExtensions::VERSION) >= Gem::Version.create('2.2')
|
32
29
|
Arel::Nodes::NotEqual.new self, Arel.quoted(other, self)
|
33
30
|
end
|
34
31
|
end
|
@@ -4,8 +4,8 @@ module ArelExtensions
|
|
4
4
|
attr_accessor :order, :group
|
5
5
|
|
6
6
|
def initialize node, **opts
|
7
|
-
@order = Array(opts[:order]).map{|e| convert_to_node(e)}
|
8
|
-
@group = Array(opts[:group]).map{|e| convert_to_node(e)}
|
7
|
+
@order = Array.wrap(opts[:order]).map{|e| convert_to_node(e)}
|
8
|
+
@group = Array.wrap(opts[:group]).map{|e| convert_to_node(e)}
|
9
9
|
super [node]
|
10
10
|
end
|
11
11
|
end
|
@@ -1,5 +1,11 @@
|
|
1
1
|
require 'arel_extensions/predications'
|
2
2
|
|
3
|
+
# This is required for rails 6.1
|
4
|
+
# See https://github.com/thoughtbot/shoulda-matchers/issues/335
|
5
|
+
if !Array.respond_to?(:wrap)
|
6
|
+
require 'active_support/core_ext/array/wrap'
|
7
|
+
end
|
8
|
+
|
3
9
|
module ArelExtensions
|
4
10
|
module Nodes
|
5
11
|
class Function < Arel::Nodes::Function
|
@@ -144,7 +144,7 @@ module ArelExtensions
|
|
144
144
|
# concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
|
145
145
|
def group_concat(sep = nil, *orders, group: nil, order: nil)
|
146
146
|
if orders.present?
|
147
|
-
|
147
|
+
deprecated 'Use the kwarg `order` instead.', what: 'orders'
|
148
148
|
end
|
149
149
|
order_tabs = [orders].flatten.map{ |o|
|
150
150
|
if o.is_a?(Arel::Nodes::Ascending) || o.is_a?(Arel::Nodes::Descending)
|
@@ -608,13 +608,13 @@ module ArelExtensions
|
|
608
608
|
grouping_array_or_grouping_element o, collector
|
609
609
|
end
|
610
610
|
|
611
|
-
# TODO;
|
612
611
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
613
612
|
collector << '(STRING_AGG('
|
614
613
|
collector = visit o.left, collector
|
615
614
|
collector << Arel::Visitors::Oracle::COMMA
|
615
|
+
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
616
616
|
collector =
|
617
|
-
if
|
617
|
+
if 'NULL' != sep
|
618
618
|
visit o.separator, collector
|
619
619
|
else
|
620
620
|
visit Arel.quoted(','), collector
|
@@ -16,7 +16,7 @@ module ArelExtensions
|
|
16
16
|
|
17
17
|
# This helper method did not exist in rails < 5.2
|
18
18
|
if !Arel::Visitors::MySQL.method_defined?(:collect_nodes_for)
|
19
|
-
def collect_nodes_for(nodes, collector, spacer, connector =
|
19
|
+
def collect_nodes_for(nodes, collector, spacer, connector = ', ')
|
20
20
|
if nodes&.any?
|
21
21
|
collector << spacer
|
22
22
|
inject_join nodes, collector, connector
|
@@ -24,42 +24,45 @@ module ArelExtensions
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
27
|
+
if private_method_defined?(:visit_Arel_Nodes_SelectCore) || method_defined?(:visit_Arel_Nodes_SelectCore)
|
28
|
+
alias_method(:old_visit_Arel_Nodes_SelectCore, :visit_Arel_Nodes_SelectCore)
|
29
|
+
end
|
30
|
+
# The whole purpose of this override is to fix the behavior of RollUp.
|
31
|
+
# All other databases treat RollUp sanely, execpt MySQL which requires
|
32
|
+
# that it figures as the last element of a GROUP BY.
|
33
|
+
def visit_Arel_Nodes_SelectCore(o, collector)
|
34
|
+
collector << 'SELECT'
|
32
35
|
|
33
|
-
|
34
|
-
|
36
|
+
collector = collect_optimizer_hints(o, collector) if self.respond_to?(:collect_optimizer_hinsts)
|
37
|
+
collector = maybe_visit o.set_quantifier, collector
|
35
38
|
|
36
|
-
|
39
|
+
collect_nodes_for o.projections, collector, ' '
|
37
40
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
if o.source && !o.source.empty?
|
42
|
+
collector << ' FROM '
|
43
|
+
collector = visit o.source, collector
|
44
|
+
end
|
42
45
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
# The actual work
|
47
|
+
groups = o.groups
|
48
|
+
rollup = groups.select { |g| g.expr.class == Arel::Nodes::RollUp }.map { |r| r.expr.value }
|
49
|
+
if rollup && !rollup.empty?
|
50
|
+
groups = o.groups.reject { |g| g.expr.class == Arel::Nodes::RollUp }
|
51
|
+
groups << Arel::Nodes::RollUp.new(rollup)
|
52
|
+
end
|
53
|
+
# FIN
|
51
54
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
55
|
+
collect_nodes_for o.wheres, collector, ' WHERE ', ' AND '
|
56
|
+
collect_nodes_for groups, collector, ' GROUP BY '
|
57
|
+
collect_nodes_for o.havings, collector, ' HAVING ', ' AND '
|
58
|
+
collect_nodes_for o.windows, collector, ' WINDOW '
|
56
59
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
end
|
60
|
+
if o.respond_to?(:comment)
|
61
|
+
maybe_visit o.comment, collector
|
62
|
+
else
|
63
|
+
collector
|
62
64
|
end
|
65
|
+
end
|
63
66
|
|
64
67
|
# Math functions
|
65
68
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
@@ -199,7 +202,8 @@ module ArelExtensions
|
|
199
202
|
collector = visit order, collector
|
200
203
|
end
|
201
204
|
end
|
202
|
-
|
205
|
+
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
206
|
+
if 'NULL' != sep
|
203
207
|
collector << ' SEPARATOR '
|
204
208
|
collector = visit o.separator, collector
|
205
209
|
end
|
@@ -135,8 +135,9 @@ module ArelExtensions
|
|
135
135
|
collector << '(LISTAGG('
|
136
136
|
collector = visit o.left, collector
|
137
137
|
collector << COMMA
|
138
|
+
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
138
139
|
collector =
|
139
|
-
if
|
140
|
+
if 'NULL' != sep
|
140
141
|
visit o.separator, collector
|
141
142
|
else
|
142
143
|
visit Arel.quoted(','), collector
|
@@ -136,8 +136,9 @@ module ArelExtensions
|
|
136
136
|
o.order = nil
|
137
137
|
visit_Aggregate_For_AggregateFunction o, collector
|
138
138
|
collector << COMMA
|
139
|
+
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
139
140
|
collector =
|
140
|
-
if
|
141
|
+
if 'NULL' != sep
|
141
142
|
visit o.separator, collector
|
142
143
|
else
|
143
144
|
visit Arel.quoted(','), collector
|
@@ -112,7 +112,8 @@ module ArelExtensions
|
|
112
112
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
113
113
|
collector << 'GROUP_CONCAT('
|
114
114
|
collector = visit o.left, collector
|
115
|
-
|
115
|
+
sep = o.separator.is_a?(Arel::Nodes::Quoted) ? o.separator.expr : o.separator
|
116
|
+
if 'NULL' != sep
|
116
117
|
collector << COMMA
|
117
118
|
collector = visit o.separator, collector
|
118
119
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
def self.deprecator
|
3
|
+
@deprecator ||= ActiveSupport::Deprecation.new(ArelExtensions::VERSION, "arel_extensions")
|
4
|
+
end
|
5
|
+
|
6
|
+
module Warning
|
7
|
+
def deprecated msg, what: nil
|
8
|
+
kaller = caller(2..2).first
|
9
|
+
return if kaller.include?('lib/arel_extensions') && ENV['AREL_EXTENSIONS_IN_TEST'] != '1'
|
10
|
+
|
11
|
+
what = caller_locations(1, 1).first.label if what.nil?
|
12
|
+
ArelExtensions.deprecator.warn "#{kaller}: `#{what}` is now deprecated. #{msg}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/arel_extensions.rb
CHANGED
@@ -52,6 +52,7 @@ if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('7.1.0')
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
+
require 'arel_extensions/warning'
|
55
56
|
require 'arel_extensions/helpers'
|
56
57
|
require 'arel_extensions/version'
|
57
58
|
require 'arel_extensions/aliases'
|
@@ -256,6 +257,7 @@ class Arel::SelectManager
|
|
256
257
|
include ArelExtensions::SetFunctions
|
257
258
|
include ArelExtensions::Nodes
|
258
259
|
|
260
|
+
remove_method(:as) if method_defined?(:as)
|
259
261
|
def as table_name
|
260
262
|
Arel::Nodes::TableAlias.new(self, table_name)
|
261
263
|
end
|
data/test/arelx_test_helper.rb
CHANGED
@@ -6,6 +6,8 @@ require 'active_record'
|
|
6
6
|
|
7
7
|
require 'support/fake_record'
|
8
8
|
|
9
|
+
ENV['AREL_EXTENSIONS_IN_TEST'] = '1' # Useful for deprecation warnings.
|
10
|
+
|
9
11
|
def colored(color, msg)
|
10
12
|
/^xterm|-256color$/.match?(ENV['TERM']) ? "\x1b[#{color}m#{msg}\x1b[89m\x1b[0m" : "#{msg}"
|
11
13
|
end
|
@@ -40,6 +42,22 @@ db_and_gem =
|
|
40
42
|
}
|
41
43
|
end
|
42
44
|
|
45
|
+
module Warning
|
46
|
+
ARELX_IGNORED = [
|
47
|
+
'PG::Coder.new(hash)',
|
48
|
+
'rb_check_safe_obj', # ruby 3.0
|
49
|
+
'rb_tainted_str_new', # ruby 3.0
|
50
|
+
'Using the last argument', # ruby < 3.0
|
51
|
+
].freeze
|
52
|
+
|
53
|
+
def self.warn(message)
|
54
|
+
return if ARELX_IGNORED.any? { |msg| message.include?(msg) }
|
55
|
+
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
43
61
|
def load_lib(gems)
|
44
62
|
if gems && (RUBY_PLATFORM == 'java' || Arel::VERSION.to_i > 9)
|
45
63
|
gems.each do |gem|
|
@@ -242,10 +242,10 @@ module ArelExtensions
|
|
242
242
|
assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat)
|
243
243
|
|
244
244
|
skip 'No order in group_concat in SqlLite' if $sqlite
|
245
|
-
assert_equal 'Arthur,Lucas,Sophie', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.asc))
|
246
|
-
assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.desc))
|
247
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', [@score.asc, @name.asc]))
|
248
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @score.asc, @name.asc))
|
245
|
+
assert_equal 'Arthur,Lucas,Sophie', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: @name.asc))
|
246
|
+
assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: @name.desc))
|
247
|
+
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
|
248
|
+
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
|
249
249
|
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
|
250
250
|
end
|
251
251
|
|
data/version_v1.rb
CHANGED
data/version_v2.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arel_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yann Azoury
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-12-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -179,6 +179,7 @@ files:
|
|
179
179
|
- lib/arel_extensions/visitors/postgresql.rb
|
180
180
|
- lib/arel_extensions/visitors/sqlite.rb
|
181
181
|
- lib/arel_extensions/visitors/to_sql.rb
|
182
|
+
- lib/arel_extensions/warning.rb
|
182
183
|
- test/arelx_test_helper.rb
|
183
184
|
- test/database.yml
|
184
185
|
- test/real_db_test.rb
|