arel_extensions 2.1.4 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +41 -89
- data/.gitignore +7 -6
- data/.rubocop.yml +37 -0
- data/Gemfile +3 -3
- data/README.md +1 -0
- data/appveyor.yml +73 -0
- data/gemfiles/rails3.gemfile +5 -5
- data/gemfiles/rails4.gemfile +7 -7
- data/gemfiles/rails5_0.gemfile +6 -6
- data/gemfiles/rails5_1_4.gemfile +6 -6
- data/gemfiles/rails5_2.gemfile +6 -5
- data/gemfiles/rails6.gemfile +5 -4
- data/gemfiles/rails6_1.gemfile +5 -4
- data/gemfiles/rails7.gemfile +5 -4
- data/lib/arel_extensions/common_sql_functions.rb +2 -2
- data/lib/arel_extensions/helpers.rb +12 -12
- data/lib/arel_extensions/math.rb +32 -17
- data/lib/arel_extensions/nodes/cast.rb +2 -2
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +1 -1
- data/lib/arel_extensions/nodes/date_diff.rb +6 -6
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +2 -2
- data/lib/arel_extensions/nodes/union.rb +3 -3
- data/lib/arel_extensions/nodes/union_all.rb +2 -2
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +30 -17
- data/lib/arel_extensions/visitors/mysql.rb +15 -10
- data/lib/arel_extensions/visitors/oracle.rb +22 -17
- data/lib/arel_extensions/visitors/postgresql.rb +17 -12
- data/lib/arel_extensions/visitors/sqlite.rb +4 -4
- data/lib/arel_extensions/visitors/to_sql.rb +4 -1
- data/lib/arel_extensions.rb +10 -0
- data/test/arelx_test_helper.rb +1 -1
- data/test/real_db_test.rb +5 -5
- data/test/support/fake_record.rb +1 -1
- data/test/visitors/test_bulk_insert_oracle.rb +3 -3
- data/test/visitors/test_bulk_insert_sqlite.rb +1 -1
- data/test/visitors/test_bulk_insert_to_sql.rb +1 -1
- data/test/visitors/test_to_sql.rb +6 -6
- data/test/with_ar/all_agnostic_test.rb +67 -60
- data/test/with_ar/insert_agnostic_test.rb +3 -3
- data/test/with_ar/test_bulk_sqlite.rb +1 -1
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +3 -2
data/test/support/fake_record.rb
CHANGED
@@ -7,10 +7,10 @@ module ArelExtensions
|
|
7
7
|
@conn = FakeRecord::Base.new
|
8
8
|
@visitor = Arel::Visitors::Oracle.new @conn.connection
|
9
9
|
@table = Arel::Table.new(:users)
|
10
|
-
@cols = [
|
10
|
+
@cols = %w[name comments created_at]
|
11
11
|
@data = [
|
12
|
-
[
|
13
|
-
[
|
12
|
+
%w[nom1 sdfdsfdsfsdf 2016-01-01],
|
13
|
+
%w[nom2 sdfdsfdsfsdf 2016-01-01]
|
14
14
|
]
|
15
15
|
end
|
16
16
|
|
@@ -8,7 +8,7 @@ module ArelExtensions
|
|
8
8
|
@visitor = Arel::Visitors::SQLite.new @conn.connection
|
9
9
|
@table = Arel::Table.new(:users)
|
10
10
|
Arel::Table.engine = @conn
|
11
|
-
@cols = [
|
11
|
+
@cols = %w[id name comments created_at]
|
12
12
|
@data = [
|
13
13
|
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
14
14
|
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
@@ -8,7 +8,7 @@ module ArelExtensions
|
|
8
8
|
Arel::Table.engine = @conn
|
9
9
|
@visitor = Arel::Visitors::ToSql.new @conn.connection
|
10
10
|
@table = Arel::Table.new(:users)
|
11
|
-
@cols = [
|
11
|
+
@cols = %w[id name comments created_at]
|
12
12
|
@data = [
|
13
13
|
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
14
14
|
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
@@ -11,7 +11,7 @@ module ArelExtensions
|
|
11
11
|
# test become flaky.
|
12
12
|
#
|
13
13
|
# The first time `Arel::Table.engine` is called
|
14
|
-
# from `
|
14
|
+
# from `ArelExtensions.column_of_via_arel_table(table_name, column_name)`
|
15
15
|
# in `lib/arel_extensions/helpers.rb`
|
16
16
|
# will almost always fail. It's important to note that when the test
|
17
17
|
# fails, it's always on 1 test case, and every subsequent test that
|
@@ -273,13 +273,13 @@ module ArelExtensions
|
|
273
273
|
c = @table.project(@table[:name])
|
274
274
|
_(compile(c.union_all(c)))
|
275
275
|
.must_be_like %{(SELECT "users"."name" FROM "users") UNION ALL (SELECT "users"."name" FROM "users")}
|
276
|
-
_(
|
276
|
+
_(c.union_all(c).to_sql)
|
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
|
-
_((
|
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
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}
|
@@ -576,7 +576,7 @@ module ArelExtensions
|
|
576
576
|
end
|
577
577
|
end
|
578
578
|
|
579
|
-
puts
|
579
|
+
puts "AREL VERSION: #{Arel::VERSION}"
|
580
580
|
end
|
581
581
|
end
|
582
582
|
end
|
@@ -193,16 +193,16 @@ module ArelExtensions
|
|
193
193
|
assert_equal 'Test Laure', t(@laure, Arel.quoted('Test ') + @name)
|
194
194
|
|
195
195
|
skip 'No group_concat in SqlServer before 2017' if @env_db == 'mssql'
|
196
|
-
assert_equal 'Lucas Sophie', t(User.where(name: [
|
197
|
-
assert_equal 'Lucas,Sophie', t(User.where(name: [
|
198
|
-
assert_equal 'Lucas,Sophie', t(User.where(name: [
|
196
|
+
assert_equal 'Lucas Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat(' '))
|
197
|
+
assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat(','))
|
198
|
+
assert_equal 'Lucas,Sophie', t(User.where(name: %w[Lucas Sophie]), @name.group_concat)
|
199
199
|
|
200
200
|
skip 'No order in group_concat in SqlLite' if $sqlite
|
201
|
-
assert_equal 'Arthur,Lucas,Sophie', t(User.where(name: [
|
202
|
-
assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: [
|
203
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: [
|
204
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: [
|
205
|
-
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: [
|
201
|
+
assert_equal 'Arthur,Lucas,Sophie', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.asc))
|
202
|
+
assert_equal 'Sophie,Lucas,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @name.desc))
|
203
|
+
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', [@score.asc, @name.asc]))
|
204
|
+
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', @score.asc, @name.asc))
|
205
|
+
assert_equal 'Lucas,Sophie,Arthur', t(User.where(name: %w[Lucas Sophie Arthur]), @name.group_concat(',', order: [@score.asc, @name.asc]))
|
206
206
|
end
|
207
207
|
|
208
208
|
def test_length
|
@@ -419,27 +419,32 @@ module ArelExtensions
|
|
419
419
|
}
|
420
420
|
}
|
421
421
|
|
422
|
-
skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if
|
422
|
+
skip "Unsupported timezone conversion for DB=#{ENV['DB']}" if !%w[mssql mysql oracle postgresql].include?(ENV['DB'])
|
423
|
+
# TODO: Standarize timezone conversion across all databases.
|
424
|
+
# This test case will be refactored and should work the same across all vendors.
|
425
|
+
if ENV['DB'] == 'mssql' && /Microsoft SQL Server (\d+)/.match(ActiveRecord::Base.connection.select_value('SELECT @@version'))[1].to_i < 2016
|
426
|
+
skip "SQL Server < 2016 is not currently supported"
|
427
|
+
end
|
423
428
|
|
424
429
|
tz = ENV['DB'] == 'mssql' ? time_zones['mssql'] : time_zones['posix']
|
425
430
|
|
426
431
|
assert_equal '2014/03/03 12:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', tz['utc']))
|
427
|
-
assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {
|
428
|
-
assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {
|
432
|
+
assert_equal '2014/03/03 09:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['sao_paulo']}))
|
433
|
+
assert_equal '2014/03/03 02:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['tahiti']}))
|
429
434
|
|
430
435
|
# Skipping conversion from UTC to the desired timezones fails in SQL
|
431
436
|
# Server and Postgres. This is mainly due to the fact that timezone
|
432
437
|
# information is not preserved in the column itself.
|
433
438
|
#
|
434
439
|
# MySQL is happy to consider that times by default are in UTC.
|
435
|
-
assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {
|
440
|
+
assert_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
436
441
|
refute_equal '2014/03/03 13:42:00', t(@lucas, @updated_at.format('%Y/%m/%d %H:%M:%S', tz['paris'])) if !['mysql'].include?(ENV['DB'])
|
437
442
|
|
438
443
|
# Winter/Summer time
|
439
|
-
assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).format('%Y/%m/%d %H:%M:%S', {
|
444
|
+
assert_equal '2014/08/03 14:42:00', t(@lucas, (@updated_at + 5.months).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
440
445
|
if ENV['DB'] == 'mssql'
|
441
|
-
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {
|
442
|
-
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {
|
446
|
+
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
447
|
+
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', {tz['utc'] => tz['paris']}))
|
443
448
|
else
|
444
449
|
assert_equal '2022/02/01 11:42:00', t(@lucas, Arel.quoted('2022-02-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
|
445
450
|
assert_equal '2022/08/01 12:42:00', t(@lucas, Arel.quoted('2022-08-01 10:42:00').cast(:datetime).format('%Y/%m/%d %H:%M:%S', tz['paris']))
|
@@ -463,7 +468,7 @@ module ArelExtensions
|
|
463
468
|
end
|
464
469
|
|
465
470
|
def test_format_iso_year_of_week
|
466
|
-
skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if [
|
471
|
+
skip "Unsupported ISO year of week for DB=#{ENV['DB']}" if %w[mssql sqlite].include?(ENV['DB'])
|
467
472
|
assert_equal '2014', t(@lucas, @updated_at.format('%G'))
|
468
473
|
|
469
474
|
{
|
@@ -480,7 +485,7 @@ module ArelExtensions
|
|
480
485
|
end
|
481
486
|
|
482
487
|
def test_format_date_with_names
|
483
|
-
skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if [
|
488
|
+
skip "#{ENV['DB']} does not support a variety of word-based formatting for month and day names" if %w[mssql sqlite].include?(ENV['DB'])
|
484
489
|
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
|
485
490
|
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
|
486
491
|
|
@@ -491,9 +496,9 @@ module ArelExtensions
|
|
491
496
|
|
492
497
|
def switch_to_lang(lang)
|
493
498
|
languages = {
|
494
|
-
'mssql' => {
|
495
|
-
'mysql' => {
|
496
|
-
'postgresql' => {
|
499
|
+
'mssql' => {en: 'English', fr: 'French'},
|
500
|
+
'mysql' => {en: 'en_US', fr: 'fr_FR'},
|
501
|
+
'postgresql' => {en: 'en_US.utf8', fr: 'fr_FR.utf8'}
|
497
502
|
}
|
498
503
|
|
499
504
|
sql = {
|
@@ -513,27 +518,29 @@ module ArelExtensions
|
|
513
518
|
#
|
514
519
|
# Tests should assert one single thing in principle, but until we
|
515
520
|
# refactor this whole thing, we'll have to do tricks of this sort.
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
521
|
+
begin
|
522
|
+
switch_to_lang(:en)
|
523
|
+
case ENV['DB']
|
524
|
+
when 'mysql', 'postgresql'
|
525
|
+
assert_equal 'Mon, 03 Mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
|
526
|
+
assert_equal 'Monday, 03 March 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
|
527
|
+
when 'mssql'
|
528
|
+
assert_equal 'Monday, 03 March 2014', t(@lucas, @updated_at.format('%A, %d %B %y'))
|
529
|
+
end
|
530
|
+
switch_to_lang(:fr)
|
531
|
+
case ENV['DB']
|
532
|
+
when 'mysql'
|
533
|
+
assert_equal 'lun, 03 mar 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
|
534
|
+
assert_equal 'lundi, 03 mars 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
|
535
|
+
when 'postgresql'
|
536
|
+
assert_equal 'Lun., 03 Mars 14', t(@lucas, @updated_at.format('%a, %d %b %y'))
|
537
|
+
assert_equal 'Lundi, 03 Mars 14', t(@lucas, @updated_at.format('%A, %d %B %y'))
|
538
|
+
when 'mssql'
|
539
|
+
assert_equal 'lundi, 03 mars 2014', t(@lucas, @updated_at.format('%A, %d %B %y'))
|
540
|
+
end
|
541
|
+
ensure
|
542
|
+
switch_to_lang(:en)
|
534
543
|
end
|
535
|
-
ensure
|
536
|
-
switch_to_lang(:en)
|
537
544
|
end
|
538
545
|
|
539
546
|
def test_coalesce
|
@@ -602,8 +609,8 @@ module ArelExtensions
|
|
602
609
|
def test_datetime_diff
|
603
610
|
assert_equal 0, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 42)).to_i
|
604
611
|
if @env_db == 'oracle' && Arel::VERSION.to_i > 6 # in rails 5, result is multiplied by 24*60*60 = 86400...
|
605
|
-
assert_equal 42 *
|
606
|
-
assert_equal(-3600 *
|
612
|
+
assert_equal 42 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
613
|
+
assert_equal(-3600 * 86_400, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
607
614
|
else
|
608
615
|
assert_equal 42, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 12, 41, 18)).to_i
|
609
616
|
assert_equal(-3600, t(@lucas, @updated_at - Time.utc(2014, 3, 3, 13, 42)).to_i)
|
@@ -658,12 +665,12 @@ module ArelExtensions
|
|
658
665
|
# TODO; cast types
|
659
666
|
def test_cast_types
|
660
667
|
assert_equal '5', t(@lucas, @age.cast(:string))
|
661
|
-
skip 'jdbc adapters does not work properly here (v52 works fine)' if RUBY_PLATFORM
|
668
|
+
skip 'jdbc adapters does not work properly here (v52 works fine)' if RUBY_PLATFORM.match?(/java/i)
|
662
669
|
if @env_db == 'mysql' || @env_db == 'postgresql' || @env_db == 'oracle' || @env_db == 'mssql'
|
663
670
|
assert_equal 1, t(@laure, Arel.when(@duration.cast(:time).cast(:string).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle' || @env_db == 'mssql'
|
664
671
|
assert_equal 1, t(@laure, Arel.when(@duration.cast(:time).eq('12:42:21')).then(1).else(0)) unless @env_db == 'oracle'
|
665
|
-
assert_equal '20.16', t(@laure, @score.cast(:string)).gsub(/
|
666
|
-
assert_equal '20.161', t(@laure, @score.cast(:string) + 1).gsub(/
|
672
|
+
assert_equal '20.16', t(@laure, @score.cast(:string)).gsub(/0*\z/, '')
|
673
|
+
assert_equal '20.161', t(@laure, @score.cast(:string) + 1).gsub(/0*1\z/, '1')
|
667
674
|
assert_equal 21.16, t(@laure, @score.cast(:string).cast(:decimal) + 1)
|
668
675
|
assert_equal 21, t(@laure, @score.cast(:string).cast(:int) + 1)
|
669
676
|
|
@@ -747,8 +754,8 @@ module ArelExtensions
|
|
747
754
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(23)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
748
755
|
assert_equal 2, User.select('*').from((@ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(20)) + @ut.project(@age).where(@age.eq(21))).as('my_union')).length
|
749
756
|
|
750
|
-
assert_equal 3, User.find_by_sql(
|
751
|
-
assert_equal 3, User.find_by_sql(
|
757
|
+
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0))).to_sql).length
|
758
|
+
assert_equal 3, User.find_by_sql(@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21))).to_sql).length
|
752
759
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.gt(22)).union_all(@ut.project(@age).where(@age.lt(0)))).as('my_union')).length
|
753
760
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(23))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
754
761
|
assert_equal 3, User.select('*').from((@ut.project(@age).where(@age.eq(20)).union_all(@ut.project(@age).where(@age.eq(20))).union_all(@ut.project(@age).where(@age.eq(21)))).as('my_union')).length
|
@@ -786,10 +793,10 @@ module ArelExtensions
|
|
786
793
|
assert_includes ['$ 6,56e1 €', '$ 6,56e+01 €'], t(@arthur, @score.format_number('$ %.2e €', 'fr_FR'))
|
787
794
|
assert_includes ['$ 6,56E1 €', '$ 6,56E+01 €'], t(@arthur, @score.format_number('$ %.2E €', 'fr_FR'))
|
788
795
|
assert_includes ['$ 6,562E1 €', '$ 6,562E+01 €'], t(@arthur, @score.format_number('$ %.3E €', 'fr_FR'))
|
789
|
-
assert_equal '123 456 765,6', t(@arthur, (@score +
|
790
|
-
assert_equal '123456765,6', t(@arthur, (@score +
|
791
|
-
assert_equal '123,456,765.6', t(@arthur, (@score +
|
792
|
-
assert_equal ' 123,456,765.6', t(@arthur, (@score +
|
796
|
+
assert_equal '123 456 765,6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'sv_SE')).tr("\u00A0", ' ') # some DBMS put no-break space here (it makes sense thus)
|
797
|
+
assert_equal '123456765,6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'fr_FR')).delete("\u00A0") # because SqlServer does it like no one else
|
798
|
+
assert_equal '123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%.1f', 'en_US'))
|
799
|
+
assert_equal ' 123,456,765.6', t(@arthur, (@score + 123_456_700).format_number('%16.1f', 'en_US'))
|
793
800
|
assert_equal '$ 0,00 €', t(@arthur, @score.when(65.62).then(Arel.sql('null')).else(1).format_number('$ %.2f €', 'fr_FR'))
|
794
801
|
assert_equal '$ 0,00 €', t(@arthur, (@score - 65.62).format_number('$ %.2f €', 'fr_FR'))
|
795
802
|
end
|
@@ -811,7 +818,7 @@ module ArelExtensions
|
|
811
818
|
assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('arrete')).then('1').else('0'))
|
812
819
|
assert_equal '1', t(@arthur, Arel.when(@comments.ai_matches('àrrétè')).then('1').else('0'))
|
813
820
|
assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('arretez')).then('1').else('0'))
|
814
|
-
if
|
821
|
+
if !%w[oracle postgresql mysql].include?(@env_db) # AI => CI
|
815
822
|
assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrete')).then('1').else('0'))
|
816
823
|
assert_equal '0', t(@arthur, Arel.when(@comments.ai_matches('Arrêté')).then('1').else('0'))
|
817
824
|
end
|
@@ -915,7 +922,7 @@ module ArelExtensions
|
|
915
922
|
end
|
916
923
|
|
917
924
|
def test_alias_shortened
|
918
|
-
if [
|
925
|
+
if %w[postgresql oracle].include?(@env_db)
|
919
926
|
new_alias = Arel.shorten('azerty' * 15)
|
920
927
|
at = User.arel_table.alias('azerty' * 15)
|
921
928
|
assert_equal "\"user_tests\" \"#{new_alias}\"".downcase, User.arel_table.alias('azerty' * 15).to_sql.downcase
|
@@ -956,23 +963,23 @@ module ArelExtensions
|
|
956
963
|
skip "Can't be tested on travis"
|
957
964
|
# creation
|
958
965
|
assert_equal 'Arthur', t(@arthur, Arel.json(@name))
|
959
|
-
assert_equal [
|
966
|
+
assert_equal %w[Arthur Arthur], parse_json(t(@arthur, Arel.json(@name, @name)))
|
960
967
|
assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 'ArthurArthur'}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => @name + @name})))
|
961
968
|
assert_equal ({'Arthur' => 'Arthur', 'Arthur2' => 1}), parse_json(t(@arthur, Arel.json({@name => @name, @name + '2' => 1})))
|
962
|
-
assert_equal
|
969
|
+
assert_equal [{'age' => 21}, {'name' => 'Arthur', 'score' => 65.62}], parse_json(t(@arthur, Arel.json([{age: @age}, {name: @name, score: @score}])))
|
963
970
|
|
964
971
|
# aggregate
|
965
972
|
assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure'}),
|
966
973
|
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name}).group(false)))
|
967
974
|
assert_equal ({'5' => 'Lucas', '15' => 'Sophie', '23' => 'Myung', '25' => 'Laure', 'Laure' => 25, 'Lucas' => 5, 'Myung' => 23, 'Sophie' => 15}),
|
968
975
|
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16), Arel.json({@age => @name, @name => @age}).group(false)))
|
969
|
-
assert_equal
|
976
|
+
assert_equal [{'5' => 'Lucas'}, {'15' => 'Sophie'}, {'23' => 'Myung'}, {'25' => 'Laure'}],
|
970
977
|
parse_json(t(User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score), Arel.json({@age => @name}).group(true, [@age])))
|
971
978
|
|
972
979
|
# puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_sql
|
973
980
|
# puts User.group(:score).where(@age.is_not_null).where(@score == 20.16).select(@score, Arel.json({@age => @name}).group(true,[@age])).to_a
|
974
981
|
|
975
|
-
skip 'Not Yet Implemented' if $sqlite || [
|
982
|
+
skip 'Not Yet Implemented' if $sqlite || %w[oracle mssql].include?(@env_db)
|
976
983
|
# get
|
977
984
|
h1 = Arel.json({@name => @name + @name, @name + '2' => 1})
|
978
985
|
assert_equal 'ArthurArthur', parse_json(t(@arthur, h1.get(@name)))
|
@@ -981,13 +988,13 @@ module ArelExtensions
|
|
981
988
|
assert_equal 21, parse_json(t(@arthur, h2.get(0).get('age')))
|
982
989
|
assert_nil t(@arthur, h2.get('age'))
|
983
990
|
# set
|
984
|
-
assert_equal ({'Arthur' => [
|
991
|
+
assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1}), parse_json(t(@arthur, h1.set(@name, %w[toto tata])))
|
985
992
|
assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.set(@name + '3', 2)))
|
986
993
|
assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => nil}), parse_json(t(@arthur, h1.set(@name + '3', nil)))
|
987
994
|
assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1, 'Arthur3' => {'a' => 2}}), parse_json(t(@arthur, h1.set(@name + '3', {a: 2})))
|
988
995
|
# merge
|
989
|
-
assert_equal ({'Arthur' => [
|
990
|
-
assert_equal ({'Arthur' => [
|
996
|
+
assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata]}, {@name + '3' => 2})))
|
997
|
+
assert_equal ({'Arthur' => %w[toto tata], 'Arthur2' => 1, 'Arthur3' => 2}), parse_json(t(@arthur, h1.merge({@name => %w[toto tata], @name + '3' => 2})))
|
991
998
|
assert_equal ({'Arthur' => 'ArthurArthur', 'Arthur2' => 1}), parse_json(t(@arthur, h1.merge({})))
|
992
999
|
end
|
993
1000
|
|
@@ -58,15 +58,15 @@ END;])
|
|
58
58
|
connect_db
|
59
59
|
setup_db
|
60
60
|
@table = Arel::Table.new(:user_tests)
|
61
|
-
@cols = [
|
61
|
+
@cols = %w[id name comments created_at]
|
62
62
|
@data = [
|
63
63
|
[23, 'nom1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.', '2016-01-01'],
|
64
64
|
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-02']
|
65
65
|
]
|
66
|
-
@cols2 = [
|
66
|
+
@cols2 = %w[name comments created_at]
|
67
67
|
@data2 = [
|
68
68
|
['nom3', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.', '2016-01-01'],
|
69
|
-
[
|
69
|
+
%w[nom4 sdfdsfdsfsdf 2016-01-04]
|
70
70
|
]
|
71
71
|
end
|
72
72
|
|
@@ -27,7 +27,7 @@ module ArelExtensions
|
|
27
27
|
t.column :price, :decimal
|
28
28
|
end
|
29
29
|
@table = Arel::Table.new(:users)
|
30
|
-
@cols = [
|
30
|
+
@cols = %w[id name comments created_at]
|
31
31
|
@data = [
|
32
32
|
[23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
|
33
33
|
[25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
|
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.1.
|
4
|
+
version: 2.1.5
|
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: 2022-
|
13
|
+
date: 2022-07-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- Rakefile
|
91
91
|
- SQL_Challenges.md
|
92
92
|
- TODO
|
93
|
+
- appveyor.yml
|
93
94
|
- arel_extensions.gemspec
|
94
95
|
- functions.html
|
95
96
|
- gemfiles/rails3.gemfile
|