arel_extensions 2.0.21 → 2.2.2

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 (138) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +1 -2
  3. data/.github/workflows/publish.yml +29 -0
  4. data/.github/workflows/release.yml +30 -0
  5. data/.github/workflows/ruby.yml +377 -80
  6. data/.gitignore +7 -6
  7. data/.rubocop.yml +62 -1
  8. data/CONTRIBUTING.md +102 -0
  9. data/Gemfile +2 -23
  10. data/NEWS.md +89 -0
  11. data/README.md +228 -84
  12. data/Rakefile +11 -4
  13. data/TODO +0 -1
  14. data/appveyor.yml +60 -22
  15. data/arel_extensions.gemspec +11 -12
  16. data/bin/build +15 -0
  17. data/bin/compose +6 -0
  18. data/bin/publish +8 -0
  19. data/dev/arelx.dockerfile +44 -0
  20. data/dev/compose.yaml +71 -0
  21. data/dev/postgres.dockerfile +5 -0
  22. data/dev/rbenv +189 -0
  23. data/gemfiles/rails3.gemfile +10 -10
  24. data/gemfiles/rails4_2.gemfile +38 -0
  25. data/gemfiles/rails5.gemfile +29 -0
  26. data/gemfiles/rails5_1_4.gemfile +13 -13
  27. data/gemfiles/rails5_2.gemfile +16 -14
  28. data/gemfiles/rails6.gemfile +18 -15
  29. data/gemfiles/rails6_1.gemfile +18 -15
  30. data/gemfiles/rails7.gemfile +33 -0
  31. data/gemfiles/rails7_1.gemfile +33 -0
  32. data/gemfiles/rails7_2.gemfile +33 -0
  33. data/gemspecs/arel_extensions-v1.gemspec +12 -13
  34. data/gemspecs/arel_extensions-v2.gemspec +11 -12
  35. data/init/mssql.sql +0 -0
  36. data/init/mysql.sql +0 -0
  37. data/init/oracle.sql +0 -0
  38. data/init/postgresql.sql +0 -0
  39. data/init/sqlite.sql +0 -0
  40. data/lib/arel_extensions/aliases.rb +14 -0
  41. data/lib/arel_extensions/attributes.rb +10 -2
  42. data/lib/arel_extensions/boolean_functions.rb +2 -4
  43. data/lib/arel_extensions/common_sql_functions.rb +12 -12
  44. data/lib/arel_extensions/comparators.rb +14 -14
  45. data/lib/arel_extensions/date_duration.rb +14 -9
  46. data/lib/arel_extensions/helpers.rb +62 -0
  47. data/lib/arel_extensions/insert_manager.rb +19 -17
  48. data/lib/arel_extensions/math.rb +48 -45
  49. data/lib/arel_extensions/math_functions.rb +18 -18
  50. data/lib/arel_extensions/nodes/abs.rb +0 -0
  51. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
  52. data/lib/arel_extensions/nodes/blank.rb +1 -1
  53. data/lib/arel_extensions/nodes/case.rb +10 -12
  54. data/lib/arel_extensions/nodes/cast.rb +6 -6
  55. data/lib/arel_extensions/nodes/ceil.rb +0 -0
  56. data/lib/arel_extensions/nodes/change_case.rb +0 -0
  57. data/lib/arel_extensions/nodes/coalesce.rb +1 -1
  58. data/lib/arel_extensions/nodes/collate.rb +9 -9
  59. data/lib/arel_extensions/nodes/concat.rb +2 -2
  60. data/lib/arel_extensions/nodes/date_diff.rb +33 -14
  61. data/lib/arel_extensions/nodes/duration.rb +0 -0
  62. data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
  63. data/lib/arel_extensions/nodes/floor.rb +0 -0
  64. data/lib/arel_extensions/nodes/format.rb +3 -2
  65. data/lib/arel_extensions/nodes/formatted_date.rb +42 -0
  66. data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
  67. data/lib/arel_extensions/nodes/function.rb +22 -26
  68. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  69. data/lib/arel_extensions/nodes/json.rb +15 -9
  70. data/lib/arel_extensions/nodes/length.rb +6 -0
  71. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  72. data/lib/arel_extensions/nodes/locate.rb +1 -1
  73. data/lib/arel_extensions/nodes/log10.rb +0 -0
  74. data/lib/arel_extensions/nodes/matches.rb +1 -1
  75. data/lib/arel_extensions/nodes/md5.rb +0 -0
  76. data/lib/arel_extensions/nodes/power.rb +0 -0
  77. data/lib/arel_extensions/nodes/rand.rb +0 -0
  78. data/lib/arel_extensions/nodes/repeat.rb +2 -2
  79. data/lib/arel_extensions/nodes/replace.rb +2 -10
  80. data/lib/arel_extensions/nodes/rollup.rb +36 -0
  81. data/lib/arel_extensions/nodes/round.rb +0 -0
  82. data/lib/arel_extensions/nodes/select.rb +10 -0
  83. data/lib/arel_extensions/nodes/soundex.rb +2 -2
  84. data/lib/arel_extensions/nodes/std.rb +0 -0
  85. data/lib/arel_extensions/nodes/substring.rb +1 -1
  86. data/lib/arel_extensions/nodes/sum.rb +0 -0
  87. data/lib/arel_extensions/nodes/then.rb +1 -1
  88. data/lib/arel_extensions/nodes/trim.rb +2 -2
  89. data/lib/arel_extensions/nodes/union.rb +5 -5
  90. data/lib/arel_extensions/nodes/union_all.rb +4 -4
  91. data/lib/arel_extensions/nodes/wday.rb +0 -0
  92. data/lib/arel_extensions/nodes.rb +0 -0
  93. data/lib/arel_extensions/null_functions.rb +16 -0
  94. data/lib/arel_extensions/predications.rb +10 -10
  95. data/lib/arel_extensions/railtie.rb +1 -1
  96. data/lib/arel_extensions/set_functions.rb +3 -3
  97. data/lib/arel_extensions/string_functions.rb +19 -10
  98. data/lib/arel_extensions/tasks.rb +2 -2
  99. data/lib/arel_extensions/version.rb +1 -1
  100. data/lib/arel_extensions/visitors/convert_format.rb +0 -0
  101. data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
  102. data/lib/arel_extensions/visitors/mssql.rb +394 -169
  103. data/lib/arel_extensions/visitors/mysql.rb +238 -151
  104. data/lib/arel_extensions/visitors/oracle.rb +170 -131
  105. data/lib/arel_extensions/visitors/oracle12.rb +16 -16
  106. data/lib/arel_extensions/visitors/postgresql.rb +170 -140
  107. data/lib/arel_extensions/visitors/sqlite.rb +88 -87
  108. data/lib/arel_extensions/visitors/to_sql.rb +185 -156
  109. data/lib/arel_extensions/visitors.rb +73 -60
  110. data/lib/arel_extensions.rb +173 -36
  111. data/test/arelx_test_helper.rb +49 -1
  112. data/test/database.yml +13 -7
  113. data/test/real_db_test.rb +101 -83
  114. data/test/support/fake_record.rb +8 -2
  115. data/test/test_comparators.rb +5 -5
  116. data/test/visitors/test_bulk_insert_oracle.rb +5 -5
  117. data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
  118. data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
  119. data/test/visitors/test_oracle.rb +14 -14
  120. data/test/visitors/test_to_sql.rb +121 -93
  121. data/test/with_ar/all_agnostic_test.rb +630 -320
  122. data/test/with_ar/insert_agnostic_test.rb +25 -18
  123. data/test/with_ar/test_bulk_sqlite.rb +11 -7
  124. data/test/with_ar/test_math_sqlite.rb +18 -14
  125. data/test/with_ar/test_string_mysql.rb +26 -22
  126. data/test/with_ar/test_string_sqlite.rb +26 -22
  127. data/version_v1.rb +1 -1
  128. data/version_v2.rb +1 -1
  129. metadata +24 -26
  130. data/.travis/oracle/download.js +0 -152
  131. data/.travis/oracle/download.sh +0 -30
  132. data/.travis/oracle/download_ojdbc.js +0 -116
  133. data/.travis/oracle/install.sh +0 -34
  134. data/.travis/setup_accounts.sh +0 -9
  135. data/.travis/sqlite3/extension-functions.sh +0 -6
  136. data/.travis.yml +0 -193
  137. data/gemfiles/rails4.gemfile +0 -29
  138. data/gemfiles/rails5_0.gemfile +0 -29
@@ -2,18 +2,22 @@ require 'arelx_test_helper'
2
2
  require 'date'
3
3
 
4
4
  module ArelExtensions
5
- module WthAr
5
+ module WithAr
6
6
  class InsertManagerTest < Minitest::Test
7
- def setup_db
7
+ def connect_db
8
8
  ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
9
- if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
10
- @env_db = (RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
11
- skip "Platform not supported"
9
+ if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx') || (RUBY_PLATFORM == 'java')) # not supported
10
+ @env_db = (RUBY_PLATFORM == 'java' ? 'jdbc-sqlite' : 'sqlite')
11
+ skip "Platform not supported (DB: #{ENV['DB']}, RUBY_ENGINE: #{RUBY_ENGINE}, RUBY_PLATFORM: #{RUBY_PLATFORM})"
12
12
  else
13
13
  @env_db = ENV['DB']
14
14
  end
15
15
  ActiveRecord::Base.establish_connection(@env_db.try(:to_sym) || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
16
- ActiveRecord::Base.default_timezone = :utc
16
+ if ActiveRecord::VERSION::MAJOR >= 7
17
+ ActiveRecord.default_timezone = :utc
18
+ else
19
+ ActiveRecord::Base.default_timezone = :utc
20
+ end
17
21
  @cnx = ActiveRecord::Base.connection
18
22
  Arel::Table.engine = ActiveRecord::Base
19
23
  if File.exist?("init/#{@env_db}.sql")
@@ -22,6 +26,9 @@ module ArelExtensions
22
26
  @cnx.execute(sql) rescue $stderr << "can't create functions\n"
23
27
  end
24
28
  end
29
+ end
30
+
31
+ def setup_db
25
32
  @cnx.drop_table(:user_tests) rescue nil
26
33
  @cnx.create_table :user_tests do |t|
27
34
  t.column :age, :integer
@@ -29,7 +36,7 @@ module ArelExtensions
29
36
  t.column :comments, :text
30
37
  t.column :created_at, :date
31
38
  t.column :updated_at, :datetime
32
- t.column :score, :decimal, :precision => 20, :scale => 10
39
+ t.column :score, :decimal, precision: 20, scale: 10
33
40
  end
34
41
  if @env_db == 'oracle'
35
42
  @cnx.execute(%q[CREATE OR REPLACE trigger user_tests_trg
@@ -48,17 +55,18 @@ END;])
48
55
  end
49
56
 
50
57
  def setup
58
+ connect_db
51
59
  setup_db
52
60
  @table = Arel::Table.new(:user_tests)
53
- @cols = ['id', 'name', 'comments', 'created_at']
61
+ @cols = %w[id name comments created_at]
54
62
  @data = [
55
- [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'],
56
- [25, 'nom2', "sdfdsfdsfsdf", '2016-01-02']
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
+ [25, 'nom2', 'sdfdsfdsfsdf', '2016-01-02']
57
65
  ]
58
- @cols2 = ['name', 'comments', 'created_at']
66
+ @cols2 = %w[name comments created_at]
59
67
  @data2 = [
60
- ['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'],
61
- ['nom4', "sdfdsfdsfsdf", '2016-01-04']
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
+ %w[nom4 sdfdsfdsfsdf 2016-01-04]
62
70
  ]
63
71
  end
64
72
 
@@ -68,15 +76,14 @@ END;])
68
76
 
69
77
  # Math Functions
70
78
  def test_bulk_insert
71
- insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(Arel::Table.engine).into(@table)
79
+ insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(Arel::Table.engine).into(@table)
72
80
  insert_manager.bulk_insert(@cols, @data)
73
81
  @cnx.execute(insert_manager.to_sql)
74
- assert_equal 2, User.count, "insertions failed"
75
- insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(Arel::Table.engine).into(@table)
82
+ assert_equal 2, User.count, 'insertions failed'
83
+ insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(Arel::Table.engine).into(@table)
76
84
  insert_manager.bulk_insert(@cols2, @data2)
77
85
  @cnx.execute(insert_manager.to_sql)
78
- assert_equal 4, User.count, "insertions failed"
79
-
86
+ assert_equal 4, User.count, 'insertions failed'
80
87
  end
81
88
  end
82
89
  end
@@ -1,12 +1,16 @@
1
1
  require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
- module WthAr
4
+ module WithAr
5
5
  describe 'the sqlite visitor' do
6
6
  before do
7
7
  ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
8
8
  ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
9
- ActiveRecord::Base.default_timezone = :utc
9
+ if ActiveRecord::VERSION::MAJOR >= 7
10
+ ActiveRecord.default_timezone = :utc
11
+ else
12
+ ActiveRecord::Base.default_timezone = :utc
13
+ end
10
14
  @cnx = ActiveRecord::Base.connection
11
15
  Arel::Table.engine = ActiveRecord::Base
12
16
  @cnx.drop_table(:users) rescue nil
@@ -23,18 +27,18 @@ module ArelExtensions
23
27
  t.column :price, :decimal
24
28
  end
25
29
  @table = Arel::Table.new(:users)
26
- @cols = ['id', 'name', 'comments', 'created_at']
30
+ @cols = %w[id name comments created_at]
27
31
  @data = [
28
- [23, 'nom1', "sdfdsfdsfsdf", '2016-01-01'],
29
- [25, 'nom2', "sdfdsfdsfsdf", '2016-01-01']
32
+ [23, 'nom1', 'sdfdsfdsfsdf', '2016-01-01'],
33
+ [25, 'nom2', 'sdfdsfdsfsdf', '2016-01-01']
30
34
  ]
31
35
  end
32
36
  after do
33
37
  @cnx.drop_table(:users)
34
38
  end
35
39
 
36
- it "should import large set of data" do
37
- insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new().into(@table) : Arel::InsertManager.new(ActiveRecord::Base).into(@table)
40
+ it 'should import large set of data' do
41
+ insert_manager = Arel::VERSION.to_i > 6 ? Arel::InsertManager.new.into(@table) : Arel::InsertManager.new(ActiveRecord::Base).into(@table)
38
42
  insert_manager.bulk_insert(@cols, @data)
39
43
  _(insert_manager.to_sql)
40
44
  .must_be_like %Q[INSERT INTO "users" ("id", "name", "comments", "created_at")
@@ -1,12 +1,16 @@
1
1
  require 'arelx_test_helper'
2
2
 
3
3
  module ArelExtensions
4
- module WthAr
4
+ module WithAr
5
5
  describe 'the sqlite visitor can do maths' do
6
6
  before do
7
7
  ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
8
8
  ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
9
- ActiveRecord::Base.default_timezone = :utc
9
+ if ActiveRecord::VERSION::MAJOR >= 7
10
+ ActiveRecord.default_timezone = :utc
11
+ else
12
+ ActiveRecord::Base.default_timezone = :utc
13
+ end
10
14
  Arel::Table.engine = ActiveRecord::Base
11
15
  @cnx = ActiveRecord::Base.connection
12
16
  @cnx.drop_table(:users) rescue nil
@@ -24,15 +28,15 @@ module ArelExtensions
24
28
  end
25
29
  class User < ActiveRecord::Base
26
30
  end
27
- d = Date.new(2016, 5,23)
28
- User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
29
- User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
30
- User.create :age => 20, :name => "Camille", :created_at => d, :score => 20.16
31
- User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
32
- User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
33
- @laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
34
- User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
35
- @neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
31
+ d = Date.new(2016, 5, 23)
32
+ User.create age: 5, name: 'Lucas', created_at: d, score: 20.16
33
+ User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
34
+ User.create age: 20, name: 'Camille', created_at: d, score: 20.16
35
+ User.create age: 21, name: 'Arthur', created_at: d, score: 65.62
36
+ User.create age: 23, name: 'Myung', created_at: d, score: 20.16
37
+ @laure = User.create age: 25, name: 'Laure', created_at: d, score: 20.16
38
+ User.create age: nil, name: 'Test', created_at: d, score: 1.62
39
+ @neg = User.create age: -20, name: 'Negatif', created_at: d, score: 0.17
36
40
  @table = Arel::Table.new(:users)
37
41
  @age = @table[:age]
38
42
  end
@@ -41,10 +45,10 @@ module ArelExtensions
41
45
  @cnx.drop_table(:products)
42
46
  end
43
47
 
44
- it "should do maths" do
48
+ it 'should do maths' do
45
49
  # ABS
46
- assert_equal 20, User.where(:id => @neg.id).select(@age.abs.as("res")).first.res
47
- assert_equal 14, User.where(:id => @laure.id).select((@age - 39).abs.as("res")).first.res
50
+ assert_equal 20, User.where(id: @neg.id).select(@age.abs.as('res')).first.res
51
+ assert_equal 14, User.where(id: @laure.id).select((@age - 39).abs.as('res')).first.res
48
52
 
49
53
  # CEIL # require extensions
50
54
 
@@ -2,12 +2,16 @@ require 'arelx_test_helper'
2
2
  require 'date'
3
3
 
4
4
  module ArelExtensions
5
- module WthAr
5
+ module WithAr
6
6
  describe 'the mysql visitor can do string operations' do
7
7
  before do
8
8
  ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
9
9
  ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-mysql" : :mysql))
10
- ActiveRecord::Base.default_timezone = :utc
10
+ if ActiveRecord::VERSION::MAJOR >= 7
11
+ ActiveRecord.default_timezone = :utc
12
+ else
13
+ ActiveRecord::Base.default_timezone = :utc
14
+ end
11
15
  begin
12
16
  @cnx = ActiveRecord::Base.connection
13
17
  rescue => e
@@ -31,16 +35,16 @@ module ArelExtensions
31
35
  end
32
36
  class User < ActiveRecord::Base
33
37
  end
34
- d = Date.new(2016, 5,23)
35
- @lucas = User.create :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
36
- sophie = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
37
- @sophie = User.where(:id => sophie.id)
38
- User.create :age => 20, :name => "Camille", :created_at => d, :score => 20.16
39
- User.create :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
40
- User.create :age => 23, :name => "Myung", :created_at => d, :score => 20.16
41
- @laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
42
- User.create :age => nil, :name => "Test", :created_at => d, :score => 1.62
43
- @neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
38
+ d = Date.new(2016, 5, 23)
39
+ @lucas = User.create age: 5, name: 'Lucas', created_at: d, score: 20.16
40
+ sophie = User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
41
+ @sophie = User.where(id: sophie.id)
42
+ User.create age: 20, name: 'Camille', created_at: d, score: 20.16
43
+ User.create age: 21, name: 'Arthur', created_at: d, score: 65.62
44
+ User.create age: 23, name: 'Myung', created_at: d, score: 20.16
45
+ @laure = User.create age: 25, name: 'Laure', created_at: d, score: 20.16
46
+ User.create age: nil, name: 'Test', created_at: d, score: 1.62
47
+ @neg = User.create age: -20, name: 'Negatif', created_at: d, score: 0.17
44
48
  @table = Arel::Table.new(:users)
45
49
  @name = @table[:name]
46
50
  end
@@ -48,23 +52,23 @@ module ArelExtensions
48
52
  @cnx.drop_table(:users)
49
53
  end
50
54
 
51
- it "should do string operations" do
55
+ it 'should do string operations' do
52
56
  # concat
53
57
  d = Date.new(1997, 6, 15)
54
- assert_equal "SophiePhan", @sophie.select((@name + "Phan").as("res")).first.res
55
- assert_equal "Sophie2", @sophie.select((@name + 2).as("res")).first.res
56
- assert_equal "Sophie1997-06-15", @sophie.select((@name + d).as("res")).first.res
57
- assert_equal "Sophie15", @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as("res")).first.res
58
- assert_equal "SophieSophie", @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as("res")).first.res
59
- assert_equal "Sophie2016-05-23", @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as("res")).first.res
58
+ assert_equal 'SophiePhan', @sophie.select((@name + 'Phan').as('res')).first.res
59
+ assert_equal 'Sophie2', @sophie.select((@name + 2).as('res')).first.res
60
+ assert_equal 'Sophie1997-06-15', @sophie.select((@name + d).as('res')).first.res
61
+ assert_equal 'Sophie15', @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as('res')).first.res
62
+ assert_equal 'SophieSophie', @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as('res')).first.res
63
+ assert_equal 'Sophie2016-05-23', @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as('res')).first.res
60
64
  # concat Integer
61
65
  assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
62
- assert_equal 1, User.where((User.arel_table[:age] + "1").eq(6)).count
66
+ assert_equal 1, User.where((User.arel_table[:age] + '1').eq(6)).count
63
67
  assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
64
68
 
65
69
  # Replace
66
- assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
67
- assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
70
+ assert_equal 'LucaX', User.where(id: @lucas).select(@name.replace('s', 'X').as('res')).first.res
71
+ assert_equal 'replace', User.where(id: @lucas).select(@name.replace(@name, 'replace').as('res')).first.res
68
72
  end
69
73
  end
70
74
  end
@@ -2,12 +2,16 @@ require 'arelx_test_helper'
2
2
  require 'date'
3
3
 
4
4
  module ArelExtensions
5
- module WthAr
5
+ module WithAr
6
6
  describe 'the sqlite visitor can do string operations' do
7
7
  before do
8
8
  ActiveRecord::Base.configurations = YAML.load_file('test/database.yml')
9
9
  ActiveRecord::Base.establish_connection(ENV['DB'] || (RUBY_PLATFORM == 'java' ? :"jdbc-sqlite" : :sqlite))
10
- ActiveRecord::Base.default_timezone = :utc
10
+ if ActiveRecord::VERSION::MAJOR >= 7
11
+ ActiveRecord.default_timezone = :utc
12
+ else
13
+ ActiveRecord::Base.default_timezone = :utc
14
+ end
11
15
  @cnx = ActiveRecord::Base.connection
12
16
  Arel::Table.engine = ActiveRecord::Base
13
17
  @cnx.drop_table(:users) rescue nil
@@ -24,16 +28,16 @@ module ArelExtensions
24
28
  end
25
29
  class User < ActiveRecord::Base
26
30
  end
27
- d = Date.new(2016, 5,23)
28
- @lucas = User.create! :age => 5, :name => "Lucas", :created_at => d, :score => 20.16
29
- sophie = User.create :age => 15, :name => "Sophie", :created_at => d, :score => 20.16
30
- @sophie = User.where(:id => sophie.id)
31
- User.create! :age => 20, :name => "Camille", :created_at => d, :score => 20.16
32
- User.create! :age => 21, :name => "Arthur", :created_at => d, :score => 65.62
33
- User.create! :age => 23, :name => "Myung", :created_at => d, :score => 20.16
34
- @laure = User.create :age => 25, :name => "Laure", :created_at => d, :score =>20.16
35
- User.create! :age => nil, :name => "Test", :created_at => d, :score => 1.62
36
- @neg = User.create :age => -20, :name => "Negatif", :created_at => d, :score => 0.17
31
+ d = Date.new(2016, 5, 23)
32
+ @lucas = User.create! age: 5, name: 'Lucas', created_at: d, score: 20.16
33
+ sophie = User.create age: 15, name: 'Sophie', created_at: d, score: 20.16
34
+ @sophie = User.where(id: sophie.id)
35
+ User.create! age: 20, name: 'Camille', created_at: d, score: 20.16
36
+ User.create! age: 21, name: 'Arthur', created_at: d, score: 65.62
37
+ User.create! age: 23, name: 'Myung', created_at: d, score: 20.16
38
+ @laure = User.create age: 25, name: 'Laure', created_at: d, score: 20.16
39
+ User.create! age: nil, name: 'Test', created_at: d, score: 1.62
40
+ @neg = User.create age: -20, name: 'Negatif', created_at: d, score: 0.17
37
41
  @table = Arel::Table.new(:users)
38
42
  @name = @table[:name]
39
43
  end
@@ -41,23 +45,23 @@ module ArelExtensions
41
45
  @cnx.drop_table(:users)
42
46
  end
43
47
 
44
- it "should do string operations" do
48
+ it 'should do string operations' do
45
49
  # concat
46
50
  d = Date.new(1997, 6, 15)
47
- assert_equal "SophiePhan", @sophie.select((@name + "Phan").as("res")).first.res
48
- assert_equal "Sophie2", @sophie.select((@name + 2).as("res")).first.res
49
- assert_equal "Sophie1997-06-15", @sophie.select((@name + d).as("res")).first.res
50
- assert_equal "Sophie15", @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as("res")).first.res
51
- assert_equal "SophieSophie", @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as("res")).first.res
52
- assert_equal "Sophie2016-05-23", @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as("res")).first.res
51
+ assert_equal 'SophiePhan', @sophie.select((@name + 'Phan').as('res')).first.res
52
+ assert_equal 'Sophie2', @sophie.select((@name + 2).as('res')).first.res
53
+ assert_equal 'Sophie1997-06-15', @sophie.select((@name + d).as('res')).first.res
54
+ assert_equal 'Sophie15', @sophie.select((User.arel_table[:name] + User.arel_table[:age]).as('res')).first.res
55
+ assert_equal 'SophieSophie', @sophie.select((User.arel_table[:name] + User.arel_table[:name]).as('res')).first.res
56
+ assert_equal 'Sophie2016-05-23', @sophie.select((User.arel_table[:name] + User.arel_table[:created_at]).as('res')).first.res
53
57
  # concat Integer
54
58
  assert_equal 1, User.where((User.arel_table[:age] + 10).eq(33)).count
55
- assert_equal 1, User.where((User.arel_table[:age] + "1").eq(6)).count
59
+ assert_equal 1, User.where((User.arel_table[:age] + '1').eq(6)).count
56
60
  assert_equal 1, User.where((User.arel_table[:age] + User.arel_table[:age]).eq(10)).count
57
61
 
58
62
  # Replace
59
- assert_equal "LucaX", User.where(:id => @lucas).select(@name.replace("s","X").as("res")).first.res
60
- assert_equal "replace", User.where(:id => @lucas).select(@name.replace(@name,"replace").as("res")).first.res
63
+ assert_equal 'LucaX', User.where(id: @lucas).select(@name.replace('s', 'X').as('res')).first.res
64
+ assert_equal 'replace', User.where(id: @lucas).select(@name.replace(@name, 'replace').as('res')).first.res
61
65
  end
62
66
  end
63
67
  end
data/version_v1.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.2.24".freeze
2
+ VERSION = '1.4.2'.freeze
3
3
  end
data/version_v2.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "2.0.21".freeze
2
+ VERSION = '2.2.2'.freeze
3
3
  end
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.0.21
4
+ version: 2.2.2
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: 2021-03-25 00:00:00.000000000 Z
13
+ date: 2024-11-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
@@ -40,20 +40,6 @@ dependencies:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '5.9'
43
- - !ruby/object:Gem::Dependency
44
- name: rdoc
45
- requirement: !ruby/object:Gem::Requirement
46
- requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '4.0'
50
- type: :development
51
- prerelease: false
52
- version_requirements: !ruby/object:Gem::Requirement
53
- requirements:
54
- - - "~>"
55
- - !ruby/object:Gem::Version
56
- version: '4.0'
57
43
  - !ruby/object:Gem::Dependency
58
44
  name: rake
59
45
  requirement: !ruby/object:Gem::Requirement
@@ -81,32 +67,39 @@ extra_rdoc_files:
81
67
  - functions.html
82
68
  files:
83
69
  - ".codeclimate.yml"
70
+ - ".github/workflows/publish.yml"
71
+ - ".github/workflows/release.yml"
84
72
  - ".github/workflows/ruby.yml"
85
73
  - ".gitignore"
86
74
  - ".rubocop.yml"
87
- - ".travis.yml"
88
- - ".travis/oracle/download.js"
89
- - ".travis/oracle/download.sh"
90
- - ".travis/oracle/download_ojdbc.js"
91
- - ".travis/oracle/install.sh"
92
- - ".travis/setup_accounts.sh"
93
- - ".travis/sqlite3/extension-functions.sh"
75
+ - CONTRIBUTING.md
94
76
  - Gemfile
95
77
  - MIT-LICENSE.txt
78
+ - NEWS.md
96
79
  - README.md
97
80
  - Rakefile
98
81
  - SQL_Challenges.md
99
82
  - TODO
100
83
  - appveyor.yml
101
84
  - arel_extensions.gemspec
85
+ - bin/build
86
+ - bin/compose
87
+ - bin/publish
88
+ - dev/arelx.dockerfile
89
+ - dev/compose.yaml
90
+ - dev/postgres.dockerfile
91
+ - dev/rbenv
102
92
  - functions.html
103
93
  - gemfiles/rails3.gemfile
104
- - gemfiles/rails4.gemfile
105
- - gemfiles/rails5_0.gemfile
94
+ - gemfiles/rails4_2.gemfile
95
+ - gemfiles/rails5.gemfile
106
96
  - gemfiles/rails5_1_4.gemfile
107
97
  - gemfiles/rails5_2.gemfile
108
98
  - gemfiles/rails6.gemfile
109
99
  - gemfiles/rails6_1.gemfile
100
+ - gemfiles/rails7.gemfile
101
+ - gemfiles/rails7_1.gemfile
102
+ - gemfiles/rails7_2.gemfile
110
103
  - gemspecs/arel_extensions-v1.gemspec
111
104
  - gemspecs/arel_extensions-v2.gemspec
112
105
  - generate_gems.sh
@@ -116,11 +109,13 @@ files:
116
109
  - init/postgresql.sql
117
110
  - init/sqlite.sql
118
111
  - lib/arel_extensions.rb
112
+ - lib/arel_extensions/aliases.rb
119
113
  - lib/arel_extensions/attributes.rb
120
114
  - lib/arel_extensions/boolean_functions.rb
121
115
  - lib/arel_extensions/common_sql_functions.rb
122
116
  - lib/arel_extensions/comparators.rb
123
117
  - lib/arel_extensions/date_duration.rb
118
+ - lib/arel_extensions/helpers.rb
124
119
  - lib/arel_extensions/insert_manager.rb
125
120
  - lib/arel_extensions/math.rb
126
121
  - lib/arel_extensions/math_functions.rb
@@ -140,6 +135,7 @@ files:
140
135
  - lib/arel_extensions/nodes/find_in_set.rb
141
136
  - lib/arel_extensions/nodes/floor.rb
142
137
  - lib/arel_extensions/nodes/format.rb
138
+ - lib/arel_extensions/nodes/formatted_date.rb
143
139
  - lib/arel_extensions/nodes/formatted_number.rb
144
140
  - lib/arel_extensions/nodes/function.rb
145
141
  - lib/arel_extensions/nodes/is_null.rb
@@ -154,7 +150,9 @@ files:
154
150
  - lib/arel_extensions/nodes/rand.rb
155
151
  - lib/arel_extensions/nodes/repeat.rb
156
152
  - lib/arel_extensions/nodes/replace.rb
153
+ - lib/arel_extensions/nodes/rollup.rb
157
154
  - lib/arel_extensions/nodes/round.rb
155
+ - lib/arel_extensions/nodes/select.rb
158
156
  - lib/arel_extensions/nodes/soundex.rb
159
157
  - lib/arel_extensions/nodes/std.rb
160
158
  - lib/arel_extensions/nodes/substring.rb
@@ -222,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
222
220
  - !ruby/object:Gem::Version
223
221
  version: '0'
224
222
  requirements: []
225
- rubygems_version: 3.1.2
223
+ rubygems_version: 3.4.19
226
224
  signing_key:
227
225
  specification_version: 4
228
226
  summary: Extending Arel
@@ -1,152 +0,0 @@
1
- // vim: set et sw=2 ts=2:
2
- "use strict";
3
- var env = process.env;
4
- var url = require('url');
5
- var Promise = require('bluebird');
6
- var Phantom = Promise.promisifyAll(require('node-phantom-simple'));
7
-
8
- var login = {
9
- begin: url.parse(env['ORACLE_LOGIN_BEGIN'] || "https://www.oracle.com/webapps/redirect/signon?nexturl=https://www.oracle.com/favicon.ico"),
10
- end: url.parse(env['ORCALE_LOGIN_END'] || "https://www.oracle.com/favicon.ico"),
11
- };
12
- delete env['ORACLE_LOGIN_BEGIN'];
13
- delete env['ORACLE_LOGIN_END'];
14
-
15
- var credentials = Object.keys(env)
16
- .filter(function (key) { return key.indexOf('ORACLE_LOGIN_') == 0 })
17
- .map(function (key) { return [key.substr(13), env[key]] });
18
-
19
- if (credentials.length <= 0) {
20
- console.error("Missing ORACLE_LOGIN environment variables!");
21
- process.exit(1);
22
- }
23
-
24
- Phantom.createAsync({ parameters: { 'ssl-protocol': 'tlsv1' } }).then(function (browser) {
25
- browser = Promise.promisifyAll(browser, { suffix: 'Promise' });
26
- browser.addCookie({'name': 'oraclelicense', 'value': "accept-" + env['ORACLE_COOKIE'] + "-cookie", 'domain': '.oracle.com' });
27
-
28
- // Open a tab, configure it
29
- return browser.createPagePromise().then(function (page) {
30
- page = Promise.promisifyAll(page, { suffix: 'Promise' });
31
-
32
- var received = "";
33
- page.onNavigationRequested = function () { console.info("%s %j", (new Date()).toISOString(), arguments["0"]); };
34
- page.onResourceError = console.error.bind(console);
35
- page.onResourceReceived = function (response) { if (response.stage == "end") received = response.url; };
36
- page.set('settings.loadImages', false);
37
-
38
- return page
39
- .setPromise('settings.userAgent', env['USER_AGENT']) // PhantomJS configures the UA per tab
40
-
41
- // Begin login, wait for the login page
42
- .then(function () {
43
- return page.openPromise(login.begin.href).then(function (status) {
44
- if (status != 'success') throw "Unable to connect to " + login.begin.host;
45
-
46
- return new Promise(function (resolve, reject) {
47
- var deadline = Date.now() + 6000;
48
- var interval = 100;
49
-
50
- var check = function () {
51
- if (deadline < Date.now()) return reject("Timeout waiting for form");
52
-
53
- page.evaluate(function () {
54
- return window['jQuery'] && document.querySelectorAll('input[type=password]').length;
55
- }, function (err, result) {
56
- if (result) { resolve(); } else { setTimeout(check, interval); }
57
- });
58
- };
59
-
60
- check();
61
- });
62
- })
63
- .tapCatch(function (err) {
64
- return page.getPromise('plainText').then(function (text) {
65
- console.error("Unable to load login page. Last response was:\n" + text);
66
- });
67
- });
68
- })
69
-
70
- // Submit the login form
71
- .then(function () {
72
- return page.evaluatePromise(function (credentials) {
73
- var $form = jQuery(document.forms[0]);
74
- return credentials.filter(function (tuple) {
75
- return $form.find("[name='"+tuple[0]+"']").val(tuple[1]).length == 0;
76
- })
77
- .map(function (tuple) { return tuple[0]; });
78
- }, credentials)
79
- .then(function (unapplied) {
80
- if (unapplied.length > 0) {
81
- console.warn("Unable to use all ORACLE_LOGIN environment variables: %j", unapplied);
82
- }
83
- return page.evaluatePromise(function () {
84
- jQuery(function () { document.forms[0].submit(); });
85
- });
86
- });
87
- })
88
-
89
- // Wait for login result
90
- .then(function () {
91
- return new Promise(function (resolve, reject) {
92
- var deadline = Date.now() + 6000;
93
- var interval = 100;
94
-
95
- var check = function () {
96
- if (deadline < Date.now()) return reject("Timeout waiting for " + login.end.href);
97
- if (received == login.end.href) { resolve(); } else { setTimeout(check, interval); }
98
- };
99
-
100
- check();
101
- })
102
- .tapCatch(function (err) {
103
- return page.getPromise('plainText').then(function (text) {
104
- console.error("Unable to load login result. Last response was:\n" + text);
105
- });
106
- });
107
- })
108
-
109
- // Export cookies for cURL
110
- .then(function () {
111
- return browser.getPromise('cookies').then(function (cookies) {
112
- var data = "";
113
- for (var i = 0; i < cookies.length; ++i) {
114
- var cookie = cookies[i];
115
- data += cookie.domain + "\tTRUE\t" + cookie.path + "\t"
116
- + (cookie.secure ? "TRUE" : "FALSE") + "\t0\t"
117
- + cookie.name + "\t" + cookie.value + "\n";
118
- }
119
- return Promise.promisify(require('fs').writeFile)(env['COOKIES'], data);
120
- });
121
- })
122
-
123
- // Download file using cURL
124
- .then(function () {
125
- return browser.exitPromise().then(function () {
126
- var cmd = ['curl', [
127
- '--cookie', env['COOKIES'],
128
- '--cookie-jar', env['COOKIES'],
129
- '--location',
130
- '--output', env['ORACLE_DOWNLOAD_FILE'],
131
- '--user-agent', env['USER_AGENT'],
132
- "https://edelivery.oracle.com/akam/otn/linux/" + env['ORACLE_FILE']
133
- ]];
134
-
135
- console.info("Executing %j", cmd);
136
-
137
- var child_process = require('child_process');
138
- var child = child_process.spawn.apply(child_process, cmd.concat({ stdio: [0, 1, 2] }));
139
- child.on('exit', process.exit);
140
- });
141
- })
142
- .catch(function (err) {
143
- console.error(err);
144
- browser.on('exit', function () { process.exit(1); });
145
- browser.exit();
146
- });
147
- });
148
- })
149
- .catch(function (err) {
150
- console.error(err);
151
- process.exit(1);
152
- });