arel_extensions 2.3.3 → 2.5.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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +92 -43
  3. data/.gitignore +2 -1
  4. data/.rubocop.yml +131 -5
  5. data/Makefile +48 -0
  6. data/NEWS.md +22 -0
  7. data/README.md +32 -5
  8. data/Rakefile +5 -3
  9. data/arel_extensions.gemspec +3 -5
  10. data/dev/arelx.dockerfile +13 -16
  11. data/dev/compose.yaml +26 -28
  12. data/gemfiles/rails5.gemfile +15 -8
  13. data/gemfiles/rails5_1_4.gemfile +11 -9
  14. data/gemfiles/rails5_2.gemfile +16 -9
  15. data/gemfiles/rails6.gemfile +13 -7
  16. data/gemfiles/rails6_1.gemfile +13 -7
  17. data/gemfiles/rails7.gemfile +15 -9
  18. data/gemfiles/rails7_1.gemfile +15 -8
  19. data/gemfiles/rails7_2.gemfile +12 -6
  20. data/gemfiles/rails8.gemfile +40 -0
  21. data/gemfiles/rails8_1.gemfile +41 -0
  22. data/gemspecs/arel_extensions-v1.gemspec +3 -5
  23. data/gemspecs/arel_extensions-v2.gemspec +3 -5
  24. data/lib/arel_extensions/aliases.rb +3 -3
  25. data/lib/arel_extensions/attributes.rb +2 -0
  26. data/lib/arel_extensions/boolean_functions.rb +9 -7
  27. data/lib/arel_extensions/common_sql_functions.rb +5 -3
  28. data/lib/arel_extensions/comparators.rb +6 -4
  29. data/lib/arel_extensions/constants.rb +13 -0
  30. data/lib/arel_extensions/date_duration.rb +2 -0
  31. data/lib/arel_extensions/helpers.rb +18 -19
  32. data/lib/arel_extensions/insert_manager.rb +5 -1
  33. data/lib/arel_extensions/math.rb +40 -44
  34. data/lib/arel_extensions/math_functions.rb +29 -31
  35. data/lib/arel_extensions/nodes/aggregate_function.rb +4 -4
  36. data/lib/arel_extensions/nodes/blank.rb +6 -4
  37. data/lib/arel_extensions/nodes/byte_size.rb +11 -0
  38. data/lib/arel_extensions/nodes/case.rb +16 -13
  39. data/lib/arel_extensions/nodes/cast.rb +3 -5
  40. data/lib/arel_extensions/nodes/char_length.rb +11 -0
  41. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  42. data/lib/arel_extensions/nodes/collate.rb +1 -1
  43. data/lib/arel_extensions/nodes/concat.rb +6 -6
  44. data/lib/arel_extensions/nodes/date_diff.rb +40 -49
  45. data/lib/arel_extensions/nodes/duration.rb +2 -2
  46. data/lib/arel_extensions/nodes/format.rb +2 -2
  47. data/lib/arel_extensions/nodes/formatted_date.rb +2 -2
  48. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  49. data/lib/arel_extensions/nodes/function.rb +7 -7
  50. data/lib/arel_extensions/nodes/is_null.rb +2 -0
  51. data/lib/arel_extensions/nodes/json.rb +27 -15
  52. data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
  53. data/lib/arel_extensions/nodes/locate.rb +1 -1
  54. data/lib/arel_extensions/nodes/matches.rb +2 -2
  55. data/lib/arel_extensions/nodes/power.rb +2 -2
  56. data/lib/arel_extensions/nodes/rand.rb +2 -2
  57. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  58. data/lib/arel_extensions/nodes/replace.rb +3 -3
  59. data/lib/arel_extensions/nodes/rollup.rb +4 -4
  60. data/lib/arel_extensions/nodes/round.rb +3 -3
  61. data/lib/arel_extensions/nodes/select.rb +1 -1
  62. data/lib/arel_extensions/nodes/std.rb +4 -4
  63. data/lib/arel_extensions/nodes/substring.rb +52 -2
  64. data/lib/arel_extensions/nodes/then.rb +1 -1
  65. data/lib/arel_extensions/nodes/trim.rb +2 -2
  66. data/lib/arel_extensions/nodes/union.rb +3 -3
  67. data/lib/arel_extensions/nodes/union_all.rb +3 -3
  68. data/lib/arel_extensions/nodes/wday.rb +2 -2
  69. data/lib/arel_extensions/null_functions.rb +5 -7
  70. data/lib/arel_extensions/predications.rb +23 -19
  71. data/lib/arel_extensions/string_functions.rb +37 -28
  72. data/lib/arel_extensions/version.rb +3 -1
  73. data/lib/arel_extensions/visitors/convert_format.rb +2 -2
  74. data/lib/arel_extensions/visitors/ibm_db.rb +5 -5
  75. data/lib/arel_extensions/visitors/mssql.rb +111 -97
  76. data/lib/arel_extensions/visitors/mysql.rb +101 -67
  77. data/lib/arel_extensions/visitors/oracle.rb +113 -103
  78. data/lib/arel_extensions/visitors/oracle12.rb +5 -6
  79. data/lib/arel_extensions/visitors/postgresql.rb +119 -92
  80. data/lib/arel_extensions/visitors/sqlite.rb +72 -64
  81. data/lib/arel_extensions/visitors/to_sql.rb +85 -75
  82. data/lib/arel_extensions/visitors.rb +7 -7
  83. data/lib/arel_extensions/warning.rb +5 -5
  84. data/lib/arel_extensions.rb +47 -31
  85. data/test/arelx_test_helper.rb +8 -6
  86. data/test/config_loader.rb +9 -0
  87. data/test/database.yml +8 -6
  88. data/test/real_db_test.rb +33 -33
  89. data/test/support/fake_record.rb +3 -1
  90. data/test/visitors/test_bulk_insert_oracle.rb +2 -2
  91. data/test/visitors/test_bulk_insert_sqlite.rb +2 -2
  92. data/test/visitors/test_to_sql.rb +2 -2
  93. data/test/with_ar/all_agnostic_test.rb +214 -32
  94. data/test/with_ar/insert_agnostic_test.rb +2 -2
  95. data/test/with_ar/test_bulk_sqlite.rb +2 -2
  96. data/test/with_ar/test_math_sqlite.rb +2 -2
  97. data/test/with_ar/test_string_mysql.rb +2 -2
  98. data/test/with_ar/test_string_sqlite.rb +2 -2
  99. data/version_v1.rb +3 -1
  100. data/version_v2.rb +3 -1
  101. metadata +9 -33
  102. data/bin/compose +0 -6
  103. data/gemfiles/rails3.gemfile +0 -20
  104. data/gemfiles/rails4_2.gemfile +0 -38
@@ -1,4 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'arel'
4
+ require 'arel_extensions/constants'
2
5
  require 'base64'
3
6
 
4
7
  require 'arel_extensions/railtie' if defined?(Rails::Railtie)
@@ -17,9 +20,9 @@ class Arel::Nodes::Casted
17
20
  include Arel::AliasPredication
18
21
 
19
22
  # They forget to define hash.
20
- if Gem::Version.new(Arel::VERSION) < Gem::Version.new('10.0.0')
23
+ if ArelExtensions::AREL_VERSION < ArelExtensions::V10
21
24
  def hash
22
- [self.class, self.val, self.attribute].hash
25
+ [self.class, val, attribute].hash
23
26
  end
24
27
  end
25
28
  end
@@ -35,8 +38,8 @@ class Arel::Nodes::Grouping
35
38
  end
36
39
 
37
40
  class Arel::Nodes::Ordering
38
- def eql? other
39
- self.hash.eql? other.hash
41
+ def eql?(other)
42
+ hash.eql? other.hash
40
43
  end
41
44
  end
42
45
 
@@ -45,7 +48,7 @@ class Arel::Nodes::Function
45
48
  include Arel::Expressions
46
49
  end
47
50
 
48
- if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('7.1.0')
51
+ if ArelExtensions::AREL_VERSION >= ArelExtensions::V7_1
49
52
  class Arel::Nodes::Case
50
53
  include Arel::Math
51
54
  include Arel::Expressions
@@ -87,7 +90,7 @@ require 'arel_extensions/nodes/select'
87
90
  # adapter behave differently. It doesn't always proc, so we added this for
88
91
  # coverage.
89
92
  if defined?(Arel::Visitors::SQLServer)
90
- Arel::Visitors.const_set('MSSQL', Arel::Visitors::SQLServer)
93
+ Arel::Visitors.const_set(:MSSQL, Arel::Visitors::SQLServer)
91
94
  require 'arel_extensions/visitors/mssql'
92
95
  class Arel::Visitors::SQLServer
93
96
  include ArelExtensions::Visitors::MSSQL
@@ -95,11 +98,11 @@ if defined?(Arel::Visitors::SQLServer)
95
98
  end
96
99
 
97
100
  module Arel
98
- def self.column_of table_name, column_name
101
+ def self.column_of(table_name, column_name)
99
102
  ArelExtensions.column_of(table_name, column_name)
100
103
  end
101
104
 
102
- def self.duration s, expr
105
+ def self.duration(s, expr)
103
106
  ArelExtensions::Nodes::Duration.new("#{s}i", expr)
104
107
  end
105
108
 
@@ -108,11 +111,11 @@ module Arel
108
111
  Arel::Nodes::Equality.new(1, 0)
109
112
  end
110
113
 
111
- def self.grouping *v
114
+ def self.grouping(*v)
112
115
  Arel::Nodes::Grouping.new(*v)
113
116
  end
114
117
 
115
- def self.json *expr
118
+ def self.json(*expr)
116
119
  ArelExtensions::Nodes::Json.new(
117
120
  if expr.length == 1
118
121
  expr.first
@@ -147,7 +150,7 @@ module Arel
147
150
  Arel.quoted(nil)
148
151
  end
149
152
 
150
- def self.quoted *args
153
+ def self.quoted(*args)
151
154
  Arel::Nodes.build_quoted(*args)
152
155
  end
153
156
 
@@ -159,7 +162,7 @@ module Arel
159
162
  Arel::Nodes::RollUp.new(args)
160
163
  end
161
164
 
162
- def self.shorten s
165
+ def self.shorten(s)
163
166
  Base64.urlsafe_encode64(Digest::MD5.new.digest(s)).tr('=', '').tr('-', '_')
164
167
  end
165
168
 
@@ -168,9 +171,9 @@ module Arel
168
171
  Arel::Nodes::Equality.new(1, 1)
169
172
  end
170
173
 
171
- def self.tuple *v
174
+ def self.tuple(*v)
172
175
  tmp = Arel.grouping(nil)
173
- Arel.grouping v.map{|e| tmp.convert_to_node(e)}
176
+ Arel.grouping(v.map { |e| tmp.convert_to_node(e) })
174
177
  end
175
178
 
176
179
  # For instance
@@ -178,7 +181,7 @@ module Arel
178
181
  # ```
179
182
  # Arel.when(at[field].is_null).then(0).else(1)
180
183
  # ```
181
- def self.when condition
184
+ def self.when(condition)
182
185
  ArelExtensions::Nodes::Case.new.when(condition)
183
186
  end
184
187
  end
@@ -199,12 +202,20 @@ class Arel::Nodes::Function
199
202
  include ArelExtensions::NullFunctions
200
203
  include ArelExtensions::Predications
201
204
 
202
- alias_method(:old_as, :as) rescue nil
203
- def as other
204
- res = Arel::Nodes::As.new(self.clone, Arel.sql(other))
205
- if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('9.0.0')
206
- self.alias = Arel.sql(other)
205
+ if ArelExtensions::ACTIVE_RECORD_VERSION >= ArelExtensions::V8_1
206
+ attr_accessor :alias
207
+ alias old_initialize initialize
208
+
209
+ def initialize(expr, aliaz = nil)
210
+ old_initialize(expr)
211
+ self.alias = aliaz
207
212
  end
213
+ end
214
+
215
+ alias old_as as rescue nil
216
+ def as(other)
217
+ res = Arel::Nodes::As.new(clone, Arel.sql(other))
218
+ self.alias = Arel.sql(other)
208
219
  res
209
220
  end
210
221
  end
@@ -225,7 +236,8 @@ class Arel::Nodes::Unary
225
236
  include ArelExtensions::MathFunctions
226
237
  include ArelExtensions::Comparators
227
238
  include ArelExtensions::Predications
228
- def eql? other
239
+
240
+ def eql?(other)
229
241
  hash == other.hash
230
242
  end
231
243
  end
@@ -237,7 +249,8 @@ class Arel::Nodes::Binary
237
249
  include ArelExtensions::Comparators
238
250
  include ArelExtensions::BooleanFunctions
239
251
  include ArelExtensions::Predications
240
- def eql? other
252
+
253
+ def eql?(other)
241
254
  hash == other.hash
242
255
  end
243
256
  end
@@ -258,12 +271,12 @@ class Arel::SelectManager
258
271
  include ArelExtensions::Nodes
259
272
 
260
273
  remove_method(:as) if method_defined?(:as)
261
- def as table_name
274
+ def as(table_name)
262
275
  Arel::Nodes::TableAlias.new(self, table_name)
263
276
  end
264
277
 
265
278
  # Install an alias, if present.
266
- def xas table_name
279
+ def xas(table_name)
267
280
  if table_name.present?
268
281
  as table_name
269
282
  else
@@ -277,12 +290,12 @@ class Arel::Nodes::As
277
290
  end
278
291
 
279
292
  class Arel::Table
280
- alias_method(:old_alias, :alias) rescue nil
293
+ alias old_alias alias rescue nil
281
294
 
282
295
  # activerecord 7.1 removed the alias. We might need to remove our dependency
283
296
  # on the alias if it proves problematic.
284
- if !self.respond_to?(:table_name)
285
- alias :table_name :name
297
+ if !respond_to?(:table_name)
298
+ alias table_name name
286
299
  end
287
300
 
288
301
  def alias(name = "#{self.name}_2")
@@ -297,14 +310,17 @@ end
297
310
  class Arel::Nodes::TableAlias
298
311
  def method_missing(*args)
299
312
  met = args.shift.to_sym
300
- if self.relation.respond_to?(met)
301
- self.relation.send(met, args)
313
+ if relation.respond_to?(met)
314
+ relation.send(met, args)
302
315
  else
303
316
  super(met, *args)
304
317
  end
305
318
  end
306
- end
307
319
 
320
+ def respond_to_missing?(method_name, include_private = false)
321
+ relation.respond_to?(method_name) || super
322
+ end
323
+ end
308
324
 
309
325
  class Arel::Attributes::Attribute
310
326
  def to_sql(engine = Arel::Table.engine)
@@ -325,7 +341,7 @@ class Arel::Nodes::Node
325
341
  end
326
342
 
327
343
  require 'active_record'
328
- if ActiveRecord.version >= Gem::Version.create('7.2')
344
+ if ArelExtensions::ACTIVE_RECORD_VERSION >= ArelExtensions::V7_2
329
345
  class ActiveRecord::Relation::WhereClause
330
346
  def except_predicates(columns)
331
347
  attrs = columns.extract! { |node| node.is_a?(Arel::Attribute) }
@@ -1,11 +1,13 @@
1
- require 'rubygems'
2
- require 'minitest/autorun'
3
- require 'fileutils'
4
- require 'arel'
5
1
  require 'active_record'
6
-
2
+ require 'arel'
3
+ require 'arel_extensions/constants'
4
+ require 'fileutils'
5
+ require 'minitest/autorun'
6
+ require 'rubygems'
7
7
  require 'support/fake_record'
8
8
 
9
+ require_relative './config_loader'
10
+
9
11
  ENV['AREL_EXTENSIONS_IN_TEST'] = '1' # Useful for deprecation warnings.
10
12
 
11
13
  def colored(color, msg)
@@ -59,7 +61,7 @@ end
59
61
 
60
62
 
61
63
  def load_lib(gems)
62
- if gems && (RUBY_PLATFORM == 'java' || Arel::VERSION.to_i > 9)
64
+ if gems && (RUBY_PLATFORM == 'java' || ArelExtensions::AREL_VERSION > ArelExtensions::V9_0)
63
65
  gems.each do |gem|
64
66
  begin
65
67
  require gem
@@ -0,0 +1,9 @@
1
+ require 'erb'
2
+ require 'yaml'
3
+
4
+ module ConfigLoader
5
+ def self.load(path)
6
+ yaml_content = ERB.new(File.read(path)).result
7
+ YAML.load(yaml_content)
8
+ end
9
+ end
data/test/database.yml CHANGED
@@ -1,3 +1,4 @@
1
+ # Updated to use ENV vars mapped in compose.yml
1
2
  sqlite:
2
3
  adapter: sqlite3
3
4
  database: ":memory:"
@@ -10,27 +11,28 @@ mysql:
10
11
  adapter: mysql2
11
12
  database: arelx_test
12
13
  username: root
13
- host: 127.0.0.1
14
+ host: <%= ENV.fetch('MYSQL_HOST', '127.0.0.1') %>
14
15
  port: 3306
15
- encoding: utf8
16
+ encoding: utf8mb4
16
17
  jdbc-mysql:
17
18
  adapter: jdbcmysql
18
19
  database: arelx_test
19
20
  username: root
20
- encoding: utf8
21
+ encoding: utf8mb4
22
+ host: <%= ENV.fetch('MYSQL_HOST', '127.0.0.1') %>
21
23
  postgresql:
22
24
  adapter: postgresql
23
25
  database: arelx_test
24
26
  username: postgres
25
27
  password: secret
26
- host: 127.0.0.1
28
+ host: <%= ENV.fetch('POSTGRES_HOST', '127.0.0.1') %>
27
29
  port: 5432
28
30
  jdbc-postgresql:
29
31
  adapter: jdbcpostgresql
30
32
  database: arelx_test
31
33
  username: postgres
32
34
  password: secret
33
- host: 127.0.0.1
35
+ host: <%= ENV.fetch('POSTGRES_HOST', '127.0.0.1') %>
34
36
  port: 5432
35
37
  oracle:
36
38
  adapter: oracle_enhanced
@@ -48,7 +50,7 @@ ibm_db:
48
50
  database: arelx_test
49
51
  mssql:
50
52
  adapter: sqlserver
51
- host: localhost
53
+ host: <%= ENV.fetch('MSSQL_HOST', 'localhost') %>
52
54
  database: master
53
55
  username: sa
54
56
  password: Password12!
data/test/real_db_test.rb CHANGED
@@ -6,9 +6,9 @@ $:.unshift "#{File.dirname(__FILE__)}../../lib"
6
6
  require 'arel_extensions'
7
7
 
8
8
  def setup_db
9
- ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
9
+ ActiveRecord::Base.configurations = ConfigLoader.load('test/database.yml')
10
10
  ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
11
- if ActiveRecord::VERSION::MAJOR >= 7
11
+ if ACTIVE_RECORD_VERSION >= V7_0
12
12
  ActiveRecord.default_timezone = :utc
13
13
  else
14
14
  ActiveRecord::Base.default_timezone = :utc
@@ -72,24 +72,24 @@ class ListTest < Minitest::Test
72
72
  end
73
73
 
74
74
  def test_abs
75
- assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:age].abs).as('res')).first.res
76
- assert_equal 14, User.where(User.arel_table[:name].eq('Laure')).select(((User.arel_table[:age] - 39).abs).as('res')).first.res
75
+ assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select(User.arel_table[:age].abs.as('res')).first.res
76
+ assert_equal 14, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:age] - 39).abs.as('res')).first.res
77
77
  end
78
78
 
79
79
  def test_ceil
80
80
  if !$sqlite || !$load_extension_disabled
81
- assert_equal 1, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:score].ceil).as('res')).first.res
82
- assert_equal 66, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:score].ceil).as('res')).first.res
81
+ assert_equal 1, User.where(User.arel_table[:name].eq('Negatif')).select(User.arel_table[:score].ceil.as('res')).first.res
82
+ assert_equal 66, User.where(User.arel_table[:name].eq('Arthur')).select(User.arel_table[:score].ceil.as('res')).first.res
83
83
  end
84
84
  end
85
85
 
86
86
  def test_coalesce
87
87
  if /pgsql/i.match?(@cnx.adapter_name)
88
- assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].coalesce(100)).as('res')).first.res
89
- assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].coalesce('Null', 'default')).as('res')).first.res
88
+ assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select(User.arel_table[:age].coalesce(100).as('res')).first.res
89
+ assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select(User.arel_table[:name].coalesce('Null', 'default').as('res')).first.res
90
90
  else
91
- assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].coalesce('Null', 20)).as('res')).first.res
92
- assert_equal 20, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].coalesce(nil, 20)).as('res')).first.res
91
+ assert_equal 'Camille', User.where(User.arel_table[:name].eq('Camille')).select(User.arel_table[:name].coalesce('Null', 20).as('res')).first.res
92
+ assert_equal 20, User.where(User.arel_table[:name].eq('Test')).select(User.arel_table[:age].coalesce(nil, 20).as('res')).first.res
93
93
  end
94
94
  end
95
95
 
@@ -115,45 +115,45 @@ class ListTest < Minitest::Test
115
115
 
116
116
  def test_date_duration
117
117
  # Year
118
- assert_equal 2016, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:created_at].year).as('res')).first.res.to_i
118
+ assert_equal 2016, User.where(User.arel_table[:name].eq('Lucas')).select(User.arel_table[:created_at].year.as('res')).first.res.to_i
119
119
  assert_equal 0, User.where(User.arel_table[:created_at].year.eq('2012')).count
120
120
  # Month
121
- assert_equal 5, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:created_at].month).as('res')).first.res.to_i
121
+ assert_equal 5, User.where(User.arel_table[:name].eq('Camille')).select(User.arel_table[:created_at].month.as('res')).first.res.to_i
122
122
  assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
123
123
  # Week
124
- assert_equal 21, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:created_at].week).as('res')).first.res.to_i
124
+ assert_equal 21, User.where(User.arel_table[:name].eq('Arthur')).select(User.arel_table[:created_at].week.as('res')).first.res.to_i
125
125
  assert_equal 8, User.where(User.arel_table[:created_at].month.eq('05')).count
126
126
  # Day
127
- assert_equal 23, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:created_at].day).as('res')).first.res.to_i
127
+ assert_equal 23, User.where(User.arel_table[:name].eq('Laure')).select(User.arel_table[:created_at].day.as('res')).first.res.to_i
128
128
  assert_equal 0, User.where(User.arel_table[:created_at].day.eq('05')).count
129
129
  end
130
130
 
131
131
  def test_length
132
- assert_equal 7, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].length).as('res')).first.res
133
- assert_equal 5, User.where(User.arel_table[:name].eq('Laure')).select((User.arel_table[:name].length).as('res')).first.res
132
+ assert_equal 7, User.where(User.arel_table[:name].eq('Camille')).select(User.arel_table[:name].length.as('res')).first.res
133
+ assert_equal 5, User.where(User.arel_table[:name].eq('Laure')).select(User.arel_table[:name].length.as('res')).first.res
134
134
  end
135
135
 
136
136
  def test_locate
137
137
  if !$sqlite || !$load_extension_disabled
138
- assert_equal 1, User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].locate('C')).as('res')).first.res
139
- assert_equal 0, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].locate('z')).as('res')).first.res
140
- assert_equal 5, User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].locate('s')).as('res')).first.res
138
+ assert_equal 1, User.where(User.arel_table[:name].eq('Camille')).select(User.arel_table[:name].locate('C').as('res')).first.res
139
+ assert_equal 0, User.where(User.arel_table[:name].eq('Lucas')).select(User.arel_table[:name].locate('z').as('res')).first.res
140
+ assert_equal 5, User.where(User.arel_table[:name].eq('Lucas')).select(User.arel_table[:name].locate('s').as('res')).first.res
141
141
  end
142
142
  end
143
143
 
144
144
  def test_isnull
145
145
  if /pgsql/i.match?(ActiveRecord::Base.connection.adapter_name)
146
- assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull(100)).as('res')).first.res
146
+ assert_equal 100, User.where(User.arel_table[:name].eq('Test')).select(User.arel_table[:age].isnull(100).as('res')).first.res
147
147
  else
148
- assert_equal 'default', User.where(User.arel_table[:name].eq('Test')).select((User.arel_table[:age].isnull('default')).as('res')).first.res
149
- assert_equal 'Test', User.where((User.arel_table[:age].isnull('default')).eq('default')).select(User.arel_table[:name]).first.name.to_s
148
+ assert_equal 'default', User.where(User.arel_table[:name].eq('Test')).select(User.arel_table[:age].isnull('default').as('res')).first.res
149
+ assert_equal 'Test', User.where(User.arel_table[:age].isnull('default').eq('default')).select(User.arel_table[:name]).first.name.to_s
150
150
  end
151
151
  end
152
152
 
153
153
  def test_floor
154
154
  if !$sqlite || !$load_extension_disabled
155
- assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select((User.arel_table[:score].floor).as('res')).first.res
156
- assert_equal 65, User.where(User.arel_table[:name].eq('Arthur')).select((User.arel_table[:score].floor).as('res')).first.res
155
+ assert_equal 0, User.where(User.arel_table[:name].eq('Negatif')).select(User.arel_table[:score].floor.as('res')).first.res
156
+ assert_equal 65, User.where(User.arel_table[:name].eq('Arthur')).select(User.arel_table[:score].floor.as('res')).first.res
157
157
  end
158
158
  end
159
159
 
@@ -210,19 +210,19 @@ class ListTest < Minitest::Test
210
210
  end
211
211
 
212
212
  def test_replace
213
- assert_equal 'LucaX', User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].replace('s', 'X')).as('res')).first.res
214
- assert_equal 'replace', User.where(User.arel_table[:name].eq('Lucas')).select((User.arel_table[:name].replace(User.arel_table[:name], 'replace')).as('res')).first.res
213
+ assert_equal 'LucaX', User.where(User.arel_table[:name].eq('Lucas')).select(User.arel_table[:name].replace('s', 'X').as('res')).first.res
214
+ assert_equal 'replace', User.where(User.arel_table[:name].eq('Lucas')).select(User.arel_table[:name].replace(User.arel_table[:name], 'replace').as('res')).first.res
215
215
  end
216
216
 
217
217
  def test_round
218
- assert_equal 1, User.where(((User.arel_table[:age]).round(0)).eq(5.0)).count
219
- assert_equal 0, User.where(((User.arel_table[:age]).round(-1)).eq(6.0)).count
218
+ assert_equal 1, User.where(User.arel_table[:age].round(0).eq(5.0)).count
219
+ assert_equal 0, User.where(User.arel_table[:age].round(-1).eq(6.0)).count
220
220
  end
221
221
 
222
222
  def test_Soundex
223
223
  if !$sqlite || !$load_extension_disabled
224
- assert_equal 'C540', User.where(User.arel_table[:name].eq('Camille')).select((User.arel_table[:name].soundex).as('res')).first.res.to_s
225
- assert_equal 8, User.where((User.arel_table[:name].soundex).eq(User.arel_table[:name].soundex)).count
224
+ assert_equal 'C540', User.where(User.arel_table[:name].eq('Camille')).select(User.arel_table[:name].soundex.as('res')).first.res.to_s
225
+ assert_equal 8, User.where(User.arel_table[:name].soundex.eq(User.arel_table[:name].soundex)).count
226
226
  end
227
227
  end
228
228
 
@@ -230,8 +230,8 @@ class ListTest < Minitest::Test
230
230
  # .take(50) because of limit by ORDER BY
231
231
  assert_equal 110, User.select((User.arel_table[:age].sum + 1).as('res')).take(50).first.res
232
232
  assert_equal 218, User.select((User.arel_table[:age].sum + User.arel_table[:age].sum).as('res')).take(50).first.res
233
- assert_equal 327, User.select(((User.arel_table[:age] * 3).sum).as('res')).take(50).first.res
234
- assert_equal 2245, User.select(((User.arel_table[:age] * User.arel_table[:age]).sum).as('res')).take(50).first.res
233
+ assert_equal 327, User.select((User.arel_table[:age] * 3).sum.as('res')).take(50).first.res
234
+ assert_equal 2245, User.select((User.arel_table[:age] * User.arel_table[:age]).sum.as('res')).take(50).first.res
235
235
  end
236
236
 
237
237
  def test_trim
@@ -244,7 +244,7 @@ class ListTest < Minitest::Test
244
244
 
245
245
  def test_wday
246
246
  d = Date.new(2016, 06, 26)
247
- assert_equal 1, User.where(User.arel_table[:name].eq('Myung')).select((User.arel_table[:created_at].wday).as('res')).first.res.to_i
247
+ assert_equal 1, User.where(User.arel_table[:name].eq('Myung')).select(User.arel_table[:created_at].wday.as('res')).first.res.to_i
248
248
  assert_equal 0, User.select(d.wday).as('res').first.to_i
249
249
  end
250
250
  end
@@ -1,3 +1,5 @@
1
+ require 'arel_extensions/constants'
2
+
1
3
  module FakeRecord
2
4
  class Column < Struct.new(:name, :type)
3
5
  end
@@ -146,7 +148,7 @@ module FakeRecord
146
148
  connection_pool.connection
147
149
  end
148
150
 
149
- if ActiveRecord.version >= Gem::Version.create('7.2')
151
+ if ArelExtensions::ACTIVE_RECORD_VERSION >= ArelExtensions::V7_2
150
152
  def with_connection(*args, **kwargs, &block)
151
153
  connection_pool.with_connection(*args, **kwargs, &block)
152
154
  end
@@ -15,7 +15,7 @@ module ArelExtensions
15
15
  end
16
16
 
17
17
  def compile node
18
- if Arel::VERSION.to_i > 5
18
+ if AREL_VERSION > V5
19
19
  @visitor.accept(node, Arel::Collectors::SQLString.new).value
20
20
  else
21
21
  @visitor.accept(node)
@@ -23,7 +23,7 @@ module ArelExtensions
23
23
  end
24
24
 
25
25
  it 'should import large set of data in Oracle' do
26
- insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
26
+ insert_manager = AREL_VERSION > V6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
27
27
  insert_manager.bulk_insert(@cols, @data)
28
28
  _(compile(insert_manager.ast))
29
29
  .must_be_like %Q[INSERT INTO "users" ("name", "comments", "created_at")
@@ -16,7 +16,7 @@ module ArelExtensions
16
16
  end
17
17
 
18
18
  def compile node
19
- if Arel::VERSION.to_i > 5
19
+ if AREL_VERSION > V5
20
20
  @visitor.accept(node, Arel::Collectors::SQLString.new).value
21
21
  else
22
22
  @visitor.accept(node)
@@ -24,7 +24,7 @@ module ArelExtensions
24
24
  end
25
25
 
26
26
  it 'should import large set of data' do
27
- insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
27
+ insert_manager = AREL_VERSION > V6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(@conn).into(@table)
28
28
  insert_manager.bulk_insert(@cols, @data)
29
29
  _(compile(insert_manager.ast))
30
30
  .must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at")
@@ -277,11 +277,11 @@ module ArelExtensions
277
277
  .must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
278
278
  _(c.union_all(c.union_all(c)).to_sql)
279
279
  .must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
280
- _((c.union_all(c)).union_all(c).to_sql)
280
+ _(c.union_all(c).union_all(c).to_sql)
281
281
  .must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
282
282
  _(c.union_all(c).union_all(c).to_sql)
283
283
  .must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
284
- _((c.union_all(c)).as('union_table').to_sql)
284
+ _(c.union_all(c).as('union_table').to_sql)
285
285
  .must_be_like %{((SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")) union_table}
286
286
  end
287
287