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
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,102 @@
1
+ # Contributing
2
+
3
+ Your PRs are welcome.
4
+
5
+ ## Local Development
6
+
7
+ Let's say you want to develop/test for `ruby 2.7.5` and `rails 5.2`.
8
+
9
+ You will need to fix your ruby version:
10
+
11
+ ```bash
12
+ rbenv install 2.7.5
13
+ rbenv local 2.7.5
14
+ ```
15
+
16
+ Fix your gemfiles:
17
+
18
+ ```bash
19
+ bundle config set --local gemfile ./gemfiles/rails6.gemfile
20
+ cp gemspecs/arel_extensions-v2.gemspec arel_extensions.gemspec
21
+ ```
22
+
23
+ Or by copying:
24
+
25
+ ```bash
26
+ cp gemfiles/gemfiles/rails6.gemfile Gemfiles
27
+ cp gemspecs/arel_extensions-v2.gemspec arel_extensions.gemspec
28
+ ```
29
+
30
+ Install dependencies:
31
+ ```bash
32
+ bundle install
33
+ ```
34
+
35
+ > [!IMPORTANT]
36
+ > Sometimes you might need to delete `vendor` dirs.
37
+ > If you use `bundle config set --local gemfile`, it will be in `gemfiles/vendor`.
38
+ > If you just `cp gemfiles/…`, it will be in `vendor`.
39
+
40
+ Develop, then test:
41
+
42
+ ```bash
43
+ bundle exec rake test:to_sql
44
+ ```
45
+
46
+ Refer to the [Version Compatibility](#version-compatibility) section to correctly
47
+ set your gemfile.
48
+
49
+ ## Testing many DBs without installing them
50
+
51
+ We provide a `docker compose` to set up some databases for testing:
52
+
53
+ ```bash
54
+ docker compose -f dev/compose.yaml up --exit-code-from arelx
55
+ ```
56
+
57
+ Or simply call `bin/compose`.
58
+
59
+ The databases, versions of arelx, and versions of ruby are all read from the
60
+ matrixes defined in `.github/workflow/ruby.yml`. To test a specific
61
+ configuration, all you have to do is comment the versions you're not
62
+ insterested in.
63
+
64
+ > [!IMPORTANT]
65
+ > This methods conflicts with the [Local development](#local-development) method.
66
+ > If you find yourself jumping between both, make sure you delete `Gemfile.lock`
67
+ > and `vendor/`.
68
+
69
+ ### VSCode
70
+
71
+ You can use the following `launch.json` to debug:
72
+
73
+ ```json
74
+ {
75
+ "version": "0.2.0",
76
+ "configurations": [
77
+ {
78
+ "type": "rdbg",
79
+ "name": "Debug DB",
80
+ "request": "launch",
81
+ "cwd": "${workspaceRoot}",
82
+ "script": "test/with_ar/all_agnostic_test.rb",
83
+ "command": "bundle exec ruby -Ilib -Itest",
84
+ "env": {
85
+ "DB": "postgresql"
86
+ },
87
+ "useBundler": false,
88
+ "askParameters": false
89
+ },
90
+ {
91
+ "type": "rdbg",
92
+ "name": "Debug to_sql",
93
+ "request": "launch",
94
+ "cwd": "${workspaceRoot}",
95
+ "script": "test/visitors/test_to_sql.rb",
96
+ "command": "bundle exec ruby -Ilib -Itest",
97
+ "useBundler": false,
98
+ "askParameters": false
99
+ }
100
+ ]
101
+ }
102
+ ```
data/Gemfile CHANGED
@@ -1,24 +1,3 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
- gemspec
4
-
5
- group :development, :test do
6
- gem "sqlite3", '<= 1.3.13', platforms: [:mri, :mswin, :x64_mingw, :mingw]
7
- gem "mysql2", '0.4.10', platforms: [:mri, :mswin, :x64_mingw, :mingw]
8
- gem "pg", '< 1', platforms: [:mri, :mingw, :x64_mingw, :mswin]
9
-
10
- gem "jdbc-sqlite3", platforms: :jruby
11
- gem "activerecord-jdbcsqlite3-adapter", platforms: :jruby
12
- gem "activerecord-jdbcmysql-adapter", platforms: :jruby
13
- gem "activerecord-jdbcpostgresql-adapter", platforms: :jruby
14
-
15
- gem "tiny_tds", '~> 1.3.0',require: false, platforms: [:mri,:mingw, :x64_mingw, :mswin]
16
- gem "activerecord-sqlserver-adapter", '~> 4.2.0', platforms: [:mri, :mingw, :x64_mingw, :mswin]
17
-
18
- gem 'ruby-oci8', platforms: [:mri, :mswin, :x64_mingw, :mingw]
19
- gem 'activerecord-oracle_enhanced-adapter', '~> 1.6.0'
20
-
21
- gem 'activesupport', '~> 4.0'
22
- gem 'activemodel', '~> 4.0'
23
- gem 'activerecord', '~> 4.0'
24
- end
3
+ gemspec path: Dir.pwd
data/NEWS.md ADDED
@@ -0,0 +1,89 @@
1
+ # News
2
+
3
+ ## [unreleased]
4
+
5
+ ## Release v2.2.2/v1.4.2 (27-11-2024)
6
+
7
+ - Fix deprecartion warnings for `==` and `!=`, showing the true location.
8
+ - Always emit deprecartion warnings for `==` and `!=`.
9
+
10
+ ## Release v2.2.1/v1.4.1 (08-11-2024)
11
+
12
+ - Improved deprecartion warnings for `==` and `!=`, showing the location where they're called.
13
+
14
+ ## Release v2.2.0/v1.4.0
15
+
16
+ - MS SQL: restrict date-quoting to Arel <= 6 (Rails 4.2)
17
+ - MS SQL: turn on warnings on requires only when gem is found
18
+ - Rails: 7.2 support for mysql, postgres, and sqlite.
19
+ - Attributes: deprecate `==` and `!=`. They're causing issues with
20
+ `active_record`, and they're not sanitary.
21
+
22
+ ## Release v2.1.11/v1.3.11
23
+
24
+ - MS SQL: turn on warnings on requires only when necessary.
25
+
26
+ ## Release v2.1.10/v1.3.10
27
+
28
+ - MS SQL: add support for jruby 9.4 via [activerecord-jdbc-alt-adapter](https://rubygems.org/gems/activerecord-jdbc-alt-adapter/)
29
+
30
+ ## Release v2.1.9/v1.3.9
31
+
32
+ ### Bug Fixes
33
+
34
+ - Postgres:
35
+ - Datetime formatting in postgres now behaves like mysql: if the target
36
+ timezone is a string, we automatically consider that you're trying to
37
+ convert from `UTC`.
38
+ - Datetime casting will now automatically ask for a
39
+ `timestamp without timezone`, also aligning with the expected befavior
40
+ in mysql. This also makes casting work better with timezone conversion,
41
+ especially if you don't pass the timezone from which you're converting
42
+ to.
43
+ ```ruby
44
+ scope
45
+ .select(Arel.quoted('2022-02-01 10:42:00')
46
+ .cast(:datetime)
47
+ .format_date('%Y/%m/%d %H:%M:%S', 'Europe/Paris')
48
+ .as('res'))
49
+ ```
50
+ Will produce:
51
+ ```sql
52
+ SELECT TO_CHAR(
53
+ CAST('2022-02-01 10:42:00' AS timestamp without time zone) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris',
54
+ 'YYYY/MM/DD HH24:MI:SS'
55
+ )
56
+ AS "res"
57
+ -- …
58
+ ```
59
+
60
+ ## Release v2.1.7/v1.3.7
61
+
62
+ ### New Features
63
+
64
+ - `o.format_date` as an alternative to `o.format`
65
+ The actual behavior of `format` is inconsistent across DB vendors: in mysql we
66
+ can format dates and numbers with it, and in the other ones we only format
67
+ dates.
68
+
69
+ We're planning on normalizing this behavior. We want `format` to "cleverly"
70
+ format dates or numbers, and `format_date` / `format_number` to strictly
71
+ format dates / numbers.
72
+
73
+ The introduction of `format_date` is the first step in this direction.
74
+
75
+ ## Release v2.1.6/v1.3.6
76
+
77
+ ### Bug Fixes
78
+
79
+ - This used to fail.
80
+ ```
81
+ Arel.when(a).then(b).format('%Y-%m-%d')
82
+ ```
83
+
84
+ ### New Features
85
+
86
+ - `o.present`, a synonym for `o.not_blank`
87
+ - `o.coalesce_blank(a, b, c)`
88
+ - `o.if_present`, if the value is `null` or blank, then it returns `null`,
89
+ otherwise, it returns the value. Inspired by rails' `presence`.