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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +1 -2
- data/.github/workflows/publish.yml +29 -0
- data/.github/workflows/release.yml +30 -0
- data/.github/workflows/ruby.yml +377 -80
- data/.gitignore +7 -6
- data/.rubocop.yml +62 -1
- data/CONTRIBUTING.md +102 -0
- data/Gemfile +2 -23
- data/NEWS.md +89 -0
- data/README.md +228 -84
- data/Rakefile +11 -4
- data/TODO +0 -1
- data/appveyor.yml +60 -22
- data/arel_extensions.gemspec +11 -12
- data/bin/build +15 -0
- data/bin/compose +6 -0
- data/bin/publish +8 -0
- data/dev/arelx.dockerfile +44 -0
- data/dev/compose.yaml +71 -0
- data/dev/postgres.dockerfile +5 -0
- data/dev/rbenv +189 -0
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4_2.gemfile +38 -0
- data/gemfiles/rails5.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +13 -13
- data/gemfiles/rails5_2.gemfile +16 -14
- data/gemfiles/rails6.gemfile +18 -15
- data/gemfiles/rails6_1.gemfile +18 -15
- data/gemfiles/rails7.gemfile +33 -0
- data/gemfiles/rails7_1.gemfile +33 -0
- data/gemfiles/rails7_2.gemfile +33 -0
- data/gemspecs/arel_extensions-v1.gemspec +12 -13
- data/gemspecs/arel_extensions-v2.gemspec +11 -12
- data/init/mssql.sql +0 -0
- data/init/mysql.sql +0 -0
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +0 -0
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/aliases.rb +14 -0
- data/lib/arel_extensions/attributes.rb +10 -2
- data/lib/arel_extensions/boolean_functions.rb +2 -4
- data/lib/arel_extensions/common_sql_functions.rb +12 -12
- data/lib/arel_extensions/comparators.rb +14 -14
- data/lib/arel_extensions/date_duration.rb +14 -9
- data/lib/arel_extensions/helpers.rb +62 -0
- data/lib/arel_extensions/insert_manager.rb +19 -17
- data/lib/arel_extensions/math.rb +48 -45
- data/lib/arel_extensions/math_functions.rb +18 -18
- data/lib/arel_extensions/nodes/abs.rb +0 -0
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -0
- data/lib/arel_extensions/nodes/blank.rb +1 -1
- data/lib/arel_extensions/nodes/case.rb +10 -12
- data/lib/arel_extensions/nodes/cast.rb +6 -6
- data/lib/arel_extensions/nodes/ceil.rb +0 -0
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +1 -1
- data/lib/arel_extensions/nodes/collate.rb +9 -9
- data/lib/arel_extensions/nodes/concat.rb +2 -2
- data/lib/arel_extensions/nodes/date_diff.rb +33 -14
- data/lib/arel_extensions/nodes/duration.rb +0 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +0 -0
- data/lib/arel_extensions/nodes/floor.rb +0 -0
- data/lib/arel_extensions/nodes/format.rb +3 -2
- data/lib/arel_extensions/nodes/formatted_date.rb +42 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +2 -2
- data/lib/arel_extensions/nodes/function.rb +22 -26
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +15 -9
- data/lib/arel_extensions/nodes/length.rb +6 -0
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +1 -1
- data/lib/arel_extensions/nodes/log10.rb +0 -0
- data/lib/arel_extensions/nodes/matches.rb +1 -1
- data/lib/arel_extensions/nodes/md5.rb +0 -0
- data/lib/arel_extensions/nodes/power.rb +0 -0
- data/lib/arel_extensions/nodes/rand.rb +0 -0
- data/lib/arel_extensions/nodes/repeat.rb +2 -2
- data/lib/arel_extensions/nodes/replace.rb +2 -10
- data/lib/arel_extensions/nodes/rollup.rb +36 -0
- data/lib/arel_extensions/nodes/round.rb +0 -0
- data/lib/arel_extensions/nodes/select.rb +10 -0
- data/lib/arel_extensions/nodes/soundex.rb +2 -2
- data/lib/arel_extensions/nodes/std.rb +0 -0
- data/lib/arel_extensions/nodes/substring.rb +1 -1
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- 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 +5 -5
- data/lib/arel_extensions/nodes/union_all.rb +4 -4
- data/lib/arel_extensions/nodes/wday.rb +0 -0
- data/lib/arel_extensions/nodes.rb +0 -0
- data/lib/arel_extensions/null_functions.rb +16 -0
- data/lib/arel_extensions/predications.rb +10 -10
- data/lib/arel_extensions/railtie.rb +1 -1
- data/lib/arel_extensions/set_functions.rb +3 -3
- data/lib/arel_extensions/string_functions.rb +19 -10
- data/lib/arel_extensions/tasks.rb +2 -2
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/convert_format.rb +0 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +20 -20
- data/lib/arel_extensions/visitors/mssql.rb +394 -169
- data/lib/arel_extensions/visitors/mysql.rb +238 -151
- data/lib/arel_extensions/visitors/oracle.rb +170 -131
- data/lib/arel_extensions/visitors/oracle12.rb +16 -16
- data/lib/arel_extensions/visitors/postgresql.rb +170 -140
- data/lib/arel_extensions/visitors/sqlite.rb +88 -87
- data/lib/arel_extensions/visitors/to_sql.rb +185 -156
- data/lib/arel_extensions/visitors.rb +73 -60
- data/lib/arel_extensions.rb +173 -36
- data/test/arelx_test_helper.rb +49 -1
- data/test/database.yml +13 -7
- data/test/real_db_test.rb +101 -83
- data/test/support/fake_record.rb +8 -2
- data/test/test_comparators.rb +5 -5
- data/test/visitors/test_bulk_insert_oracle.rb +5 -5
- data/test/visitors/test_bulk_insert_sqlite.rb +5 -5
- data/test/visitors/test_bulk_insert_to_sql.rb +5 -5
- data/test/visitors/test_oracle.rb +14 -14
- data/test/visitors/test_to_sql.rb +121 -93
- data/test/with_ar/all_agnostic_test.rb +630 -320
- data/test/with_ar/insert_agnostic_test.rb +25 -18
- data/test/with_ar/test_bulk_sqlite.rb +11 -7
- data/test/with_ar/test_math_sqlite.rb +18 -14
- data/test/with_ar/test_string_mysql.rb +26 -22
- data/test/with_ar/test_string_sqlite.rb +26 -22
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +24 -26
- data/.travis/oracle/download.js +0 -152
- data/.travis/oracle/download.sh +0 -30
- data/.travis/oracle/download_ojdbc.js +0 -116
- data/.travis/oracle/install.sh +0 -34
- data/.travis/setup_accounts.sh +0 -9
- data/.travis/sqlite3/extension-functions.sh +0 -6
- data/.travis.yml +0 -193
- data/gemfiles/rails4.gemfile +0 -29
- 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
|
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`.
|