arel_extensions 1.5.3 → 2.0.0.rc3
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 +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +90 -239
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +10 -10
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -48
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +7 -5
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +43 -44
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +36 -82
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +192 -423
- data/lib/arel_extensions/visitors/mysql.rb +212 -354
- data/lib/arel_extensions/visitors/oracle.rb +178 -221
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -257
- data/lib/arel_extensions/visitors/sqlite.rb +126 -140
- data/lib/arel_extensions/visitors/to_sql.rb +237 -299
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -226
- data/test/database.yml +7 -15
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +117 -120
- data/test/support/fake_record.rb +3 -9
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +11 -11
- data/test/visitors/test_bulk_insert_sqlite.rb +13 -12
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +366 -721
- data/test/with_ar/insert_agnostic_test.rb +21 -27
- data/test/with_ar/test_bulk_sqlite.rb +16 -17
- data/test/with_ar/test_math_sqlite.rb +26 -26
- data/test/with_ar/test_string_mysql.rb +33 -31
- data/test/with_ar/test_string_sqlite.rb +34 -30
- metadata +37 -47
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -403
- data/CONTRIBUTING.md +0 -102
- data/NEWS.md +0 -109
- data/bin/build +0 -15
- data/bin/compose +0 -6
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -44
- data/dev/compose.yaml +0 -71
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails4_2.gemfile +0 -38
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/helpers.rb +0 -62
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -92
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
data/CONTRIBUTING.md
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
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/NEWS.md
DELETED
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# News
|
|
2
|
-
|
|
3
|
-
## [unreleased]
|
|
4
|
-
|
|
5
|
-
## Release v2.3.3/v1.5.3 (11-02-2025)
|
|
6
|
-
|
|
7
|
-
- Fix the `&` operator which does `find_in_set` for mysql and postgres, accepting strings and integers.
|
|
8
|
-
- Add `regex_matches`, an alias for `=~`.
|
|
9
|
-
|
|
10
|
-
## Release v2.3.2/v1.5.2 (02-01-2025)
|
|
11
|
-
|
|
12
|
-
- Fix a subtle bug on table access as in `table[:col]` in certain situations.
|
|
13
|
-
- `==` and `!=` deprecation warnings can stem from `arel` itself, so now we don't emit them because they're plain wrong.
|
|
14
|
-
|
|
15
|
-
## Release v2.3.1/v1.5.1 (20-12-2024)
|
|
16
|
-
|
|
17
|
-
- Fallback to Ruby's Warning module if ActiveSupport doesn't exist. Relevant for old Rails versions.
|
|
18
|
-
- Added documentation on how to _"properly"_ configure the deprecator in a Rails application.
|
|
19
|
-
|
|
20
|
-
## Release v2.3.0/v1.5.0 (19-12-2024)
|
|
21
|
-
|
|
22
|
-
- Use ActiveSupport's deprecation machinery instead of Ruby's Warning module.
|
|
23
|
-
- Fix a bug with group concat that didn't correctly check for the separator value.
|
|
24
|
-
|
|
25
|
-
## Release v2.2.2/v1.4.2 (27-11-2024)
|
|
26
|
-
|
|
27
|
-
- Fix deprecation warnings for `==` and `!=`, showing the true location.
|
|
28
|
-
- Always emit deprecation warnings for `==` and `!=`.
|
|
29
|
-
|
|
30
|
-
## Release v2.2.1/v1.4.1 (08-11-2024)
|
|
31
|
-
|
|
32
|
-
- Improved deprecation warnings for `==` and `!=`, showing the location where they're called.
|
|
33
|
-
|
|
34
|
-
## Release v2.2.0/v1.4.0
|
|
35
|
-
|
|
36
|
-
- MS SQL: restrict date-quoting to Arel <= 6 (Rails 4.2)
|
|
37
|
-
- MS SQL: turn on warnings on requires only when gem is found
|
|
38
|
-
- Rails: 7.2 support for mysql, postgres, and sqlite.
|
|
39
|
-
- Attributes: deprecate `==` and `!=`. They're causing issues with
|
|
40
|
-
`active_record`, and they're not sanitary.
|
|
41
|
-
|
|
42
|
-
## Release v2.1.11/v1.3.11
|
|
43
|
-
|
|
44
|
-
- MS SQL: turn on warnings on requires only when necessary.
|
|
45
|
-
|
|
46
|
-
## Release v2.1.10/v1.3.10
|
|
47
|
-
|
|
48
|
-
- MS SQL: add support for jruby 9.4 via [activerecord-jdbc-alt-adapter](https://rubygems.org/gems/activerecord-jdbc-alt-adapter/)
|
|
49
|
-
|
|
50
|
-
## Release v2.1.9/v1.3.9
|
|
51
|
-
|
|
52
|
-
### Bug Fixes
|
|
53
|
-
|
|
54
|
-
- Postgres:
|
|
55
|
-
- Datetime formatting in postgres now behaves like mysql: if the target
|
|
56
|
-
timezone is a string, we automatically consider that you're trying to
|
|
57
|
-
convert from `UTC`.
|
|
58
|
-
- Datetime casting will now automatically ask for a
|
|
59
|
-
`timestamp without timezone`, also aligning with the expected befavior
|
|
60
|
-
in mysql. This also makes casting work better with timezone conversion,
|
|
61
|
-
especially if you don't pass the timezone from which you're converting
|
|
62
|
-
to.
|
|
63
|
-
```ruby
|
|
64
|
-
scope
|
|
65
|
-
.select(Arel.quoted('2022-02-01 10:42:00')
|
|
66
|
-
.cast(:datetime)
|
|
67
|
-
.format_date('%Y/%m/%d %H:%M:%S', 'Europe/Paris')
|
|
68
|
-
.as('res'))
|
|
69
|
-
```
|
|
70
|
-
Will produce:
|
|
71
|
-
```sql
|
|
72
|
-
SELECT TO_CHAR(
|
|
73
|
-
CAST('2022-02-01 10:42:00' AS timestamp without time zone) AT TIME ZONE 'UTC' AT TIME ZONE 'Europe/Paris',
|
|
74
|
-
'YYYY/MM/DD HH24:MI:SS'
|
|
75
|
-
)
|
|
76
|
-
AS "res"
|
|
77
|
-
-- …
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Release v2.1.7/v1.3.7
|
|
81
|
-
|
|
82
|
-
### New Features
|
|
83
|
-
|
|
84
|
-
- `o.format_date` as an alternative to `o.format`
|
|
85
|
-
The actual behavior of `format` is inconsistent across DB vendors: in mysql we
|
|
86
|
-
can format dates and numbers with it, and in the other ones we only format
|
|
87
|
-
dates.
|
|
88
|
-
|
|
89
|
-
We're planning on normalizing this behavior. We want `format` to "cleverly"
|
|
90
|
-
format dates or numbers, and `format_date` / `format_number` to strictly
|
|
91
|
-
format dates / numbers.
|
|
92
|
-
|
|
93
|
-
The introduction of `format_date` is the first step in this direction.
|
|
94
|
-
|
|
95
|
-
## Release v2.1.6/v1.3.6
|
|
96
|
-
|
|
97
|
-
### Bug Fixes
|
|
98
|
-
|
|
99
|
-
- This used to fail.
|
|
100
|
-
```
|
|
101
|
-
Arel.when(a).then(b).format('%Y-%m-%d')
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### New Features
|
|
105
|
-
|
|
106
|
-
- `o.present`, a synonym for `o.not_blank`
|
|
107
|
-
- `o.coalesce_blank(a, b, c)`
|
|
108
|
-
- `o.if_present`, if the value is `null` or blank, then it returns `null`,
|
|
109
|
-
otherwise, it returns the value. Inspired by rails' `presence`.
|
data/bin/build
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#! /usr/bin/env sh
|
|
2
|
-
set -e
|
|
3
|
-
|
|
4
|
-
# VERSION ~> 1
|
|
5
|
-
echo "Packaging v1"
|
|
6
|
-
cp ./version_v1.rb lib/arel_extensions/version.rb
|
|
7
|
-
cp ./gemspecs/arel_extensions-v1.gemspec ./arel_extensions.gemspec
|
|
8
|
-
gem build ./arel_extensions.gemspec
|
|
9
|
-
|
|
10
|
-
# VERSION ~> 2
|
|
11
|
-
echo "Packaging v2"
|
|
12
|
-
cp ./version_v2.rb lib/arel_extensions/version.rb
|
|
13
|
-
cp ./gemspecs/arel_extensions-v2.gemspec ./arel_extensions.gemspec
|
|
14
|
-
gem build ./arel_extensions.gemspec
|
|
15
|
-
|
data/bin/compose
DELETED
data/bin/publish
DELETED
data/dev/arelx.dockerfile
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
FROM ubuntu:22.04
|
|
2
|
-
|
|
3
|
-
ENV RBENV_ROOT=/opt/rbenv
|
|
4
|
-
ENV PATH=${RBENV_ROOT}/shims:${RBENV_ROOT}/bin:${PATH}
|
|
5
|
-
ENV APP_HOME=/app
|
|
6
|
-
# I know there's a more reliable way, but this is simpler.
|
|
7
|
-
ENV IN_DOCKER=true
|
|
8
|
-
ENV DEBIAN_FRONTEND=noninteractive
|
|
9
|
-
|
|
10
|
-
RUN mkdir -p $APP_HOME
|
|
11
|
-
|
|
12
|
-
RUN apt-get update -q && apt-get install -y \
|
|
13
|
-
curl bundler build-essential git gnupg locales \
|
|
14
|
-
libbz2-dev libffi-dev liblzma-dev lsb-release libsqlite3-dev libyaml-dev \
|
|
15
|
-
make openjdk-17-jdk-headless ruby-dev ruby-full tzdata zlib1g-dev \
|
|
16
|
-
&& ln -fs /usr/share/zoneinfo/UTC /etc/localtime \
|
|
17
|
-
&& dpkg-reconfigure --frontend noninteractive tzdata
|
|
18
|
-
|
|
19
|
-
RUN curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg \
|
|
20
|
-
&& echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list \
|
|
21
|
-
&& curl https://packages.microsoft.com/keys/microsoft.asc | tee /etc/apt/trusted.gpg.d/microsoft.asc \
|
|
22
|
-
&& curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | tee /etc/apt/sources.list.d/mssql-release.list \
|
|
23
|
-
&& apt-get update -q
|
|
24
|
-
|
|
25
|
-
RUN ACCEPT_EULA=y DEBIAN_FRONTEND=noninteractive apt-get install -y \
|
|
26
|
-
freetds-dev libmysqlclient-dev mysql-client msodbcsql18 mssql-tools18 unixodbc-dev libpq-dev \
|
|
27
|
-
&& echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc \
|
|
28
|
-
&& apt-get clean \
|
|
29
|
-
&& rm -rf /var/lib/apt/lists/* \
|
|
30
|
-
&& locale-gen en_US.UTF-8
|
|
31
|
-
|
|
32
|
-
RUN /bin/bash -c "source ~/.bashrc"
|
|
33
|
-
|
|
34
|
-
RUN mkdir -p ${RBENV_ROOT} \
|
|
35
|
-
&& git clone https://github.com/rbenv/rbenv.git ${RBENV_ROOT} \
|
|
36
|
-
&& git clone --depth 1 https://github.com/rbenv/ruby-build.git ${RBENV_ROOT}/plugins/ruby-build \
|
|
37
|
-
&& rbenv init - \
|
|
38
|
-
&& rbenv global system
|
|
39
|
-
|
|
40
|
-
WORKDIR $APP_HOME
|
|
41
|
-
COPY ./dev/rbenv ./dev/rbenv
|
|
42
|
-
COPY ./.github/workflows/ruby.yml ./.github/workflows/ruby.yml
|
|
43
|
-
RUN /usr/bin/gem install colorize psych toml-rb
|
|
44
|
-
RUN ./dev/rbenv install && rm ./dev/rbenv ./.github/workflows/ruby.yml
|
data/dev/compose.yaml
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
name: arelx
|
|
2
|
-
services:
|
|
3
|
-
arelx:
|
|
4
|
-
container_name: arelx-build
|
|
5
|
-
build:
|
|
6
|
-
context: ..
|
|
7
|
-
dockerfile: dev/arelx.dockerfile
|
|
8
|
-
volumes:
|
|
9
|
-
- ../:/app
|
|
10
|
-
entrypoint: ["/usr/bin/ruby", "dev/rbenv", "test"]
|
|
11
|
-
network_mode: "host"
|
|
12
|
-
depends_on:
|
|
13
|
-
mariadb:
|
|
14
|
-
condition: service_healthy
|
|
15
|
-
postgres:
|
|
16
|
-
condition: service_healthy
|
|
17
|
-
mssql:
|
|
18
|
-
condition: service_healthy
|
|
19
|
-
mariadb:
|
|
20
|
-
image: mariadb:11.0
|
|
21
|
-
container_name: mariadb
|
|
22
|
-
environment:
|
|
23
|
-
MARIADB_DATABASE: arelx_test
|
|
24
|
-
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: true
|
|
25
|
-
ports:
|
|
26
|
-
- "3306:3306"
|
|
27
|
-
network_mode: "host"
|
|
28
|
-
healthcheck:
|
|
29
|
-
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
|
30
|
-
interval: 10s
|
|
31
|
-
timeout: 5s
|
|
32
|
-
retries: 3
|
|
33
|
-
postgres:
|
|
34
|
-
build:
|
|
35
|
-
context: ..
|
|
36
|
-
dockerfile: dev/postgres.dockerfile
|
|
37
|
-
container_name: postgres
|
|
38
|
-
environment:
|
|
39
|
-
POSTGRES_USER: postgres
|
|
40
|
-
POSTGRES_PASSWORD: secret
|
|
41
|
-
POSTGRES_DB: arelx_test
|
|
42
|
-
ports:
|
|
43
|
-
- "5432:5432"
|
|
44
|
-
network_mode: "host"
|
|
45
|
-
healthcheck:
|
|
46
|
-
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
|
|
47
|
-
interval: 10s
|
|
48
|
-
timeout: 5s
|
|
49
|
-
retries: 3
|
|
50
|
-
mssql:
|
|
51
|
-
image: mcr.microsoft.com/mssql/server:2019-latest
|
|
52
|
-
container_name: mssql
|
|
53
|
-
environment:
|
|
54
|
-
MSSQL_SA_PASSWORD: Password12!
|
|
55
|
-
ACCEPT_EULA: Y
|
|
56
|
-
ports:
|
|
57
|
-
- "1433:1433"
|
|
58
|
-
network_mode: "host"
|
|
59
|
-
healthcheck:
|
|
60
|
-
test:
|
|
61
|
-
[
|
|
62
|
-
"CMD-SHELL",
|
|
63
|
-
"/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $${MSSQL_SA_PASSWORD} -Q 'SELECT 1'",
|
|
64
|
-
]
|
|
65
|
-
interval: 30s
|
|
66
|
-
retries: 5
|
|
67
|
-
timeout: 10s
|
|
68
|
-
|
|
69
|
-
networks:
|
|
70
|
-
default:
|
|
71
|
-
name: arelx-network
|
data/dev/postgres.dockerfile
DELETED
data/dev/rbenv
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
# frozen_string_literal: true
|
|
3
|
-
|
|
4
|
-
require 'colorize'
|
|
5
|
-
require 'etc'
|
|
6
|
-
require 'open3'
|
|
7
|
-
require 'pathname'
|
|
8
|
-
require 'stringio'
|
|
9
|
-
require 'toml-rb'
|
|
10
|
-
require 'psych'
|
|
11
|
-
|
|
12
|
-
workflow = Pathname('.github/workflows/ruby.yml').read.gsub!(/rails: (\d(_\d)?)/, 'rails: "\1"')
|
|
13
|
-
jobs = Psych.load(workflow, symbolize_names: true)[:jobs]
|
|
14
|
-
data = {}
|
|
15
|
-
jobs.each do |name, details|
|
|
16
|
-
details[:strategy][:matrix][:versions].each do |entry|
|
|
17
|
-
db = name.to_s.gsub(/\Ajob_test_/, '').to_sym
|
|
18
|
-
ruby = entry[:ruby]
|
|
19
|
-
rails = entry[:rails]
|
|
20
|
-
arelx = entry[:arelx]
|
|
21
|
-
gemspec = :"arel_extensions-v#{arelx}"
|
|
22
|
-
gemfile = :"rails#{rails}"
|
|
23
|
-
|
|
24
|
-
data[db] ||= {}
|
|
25
|
-
data[db][gemspec] ||= {}
|
|
26
|
-
data[db][gemspec][gemfile] ||= []
|
|
27
|
-
data[db][gemspec][gemfile] << ruby
|
|
28
|
-
data[db][gemspec][gemfile].sort!
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
MATRIX = data.freeze
|
|
33
|
-
|
|
34
|
-
def sh(command, exit_on_fail: true, stealth: false)
|
|
35
|
-
cmd, args = command.split(' ', 2)
|
|
36
|
-
puts "#{'$'.green.bold} #{cmd.blue} #{args&.yellow}"
|
|
37
|
-
Open3.popen3(command) do |stdin, stdout, stderr, wait_thr|
|
|
38
|
-
stdin.close
|
|
39
|
-
out, err =
|
|
40
|
-
if stealth
|
|
41
|
-
[StringIO.new, StringIO.new]
|
|
42
|
-
else
|
|
43
|
-
[$stdout, $stderr]
|
|
44
|
-
end
|
|
45
|
-
th_out = Thread.new do
|
|
46
|
-
stdout.each_line { |line| out.puts line }
|
|
47
|
-
end
|
|
48
|
-
th_err = Thread.new do
|
|
49
|
-
stderr.each_line { |line| err.puts line }
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
th_out.join
|
|
53
|
-
th_err.join
|
|
54
|
-
wait_thr.join
|
|
55
|
-
exit_status = wait_thr.value.exitstatus
|
|
56
|
-
if exit_status.nonzero?
|
|
57
|
-
warn "'#{command}' failed with exit status #{exit_status}. Aborting …".red
|
|
58
|
-
warn stderr if !stealth
|
|
59
|
-
exit exit_status if exit_on_fail
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
if stealth
|
|
63
|
-
[out.string, err.string, (exit_status if !exit_on_fail)].compact
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
module RBEnv
|
|
69
|
-
RBENV_ROOT =
|
|
70
|
-
if (root = ENV['RBENV_ROOT']) && root && !root.strip.empty?
|
|
71
|
-
Pathname(root)
|
|
72
|
-
else
|
|
73
|
-
Pathname(Dir.home).join('.rbenv')
|
|
74
|
-
end.freeze
|
|
75
|
-
RBENV_BUILD = RBENV_ROOT.join('plugins').join('ruby-build').freeze
|
|
76
|
-
SHELL = Pathname(Etc.getpwuid.shell).basename.to_s.downcase.to_sym
|
|
77
|
-
|
|
78
|
-
def self.available_versions
|
|
79
|
-
out, _ = sh "rbenv versions --bare", stealth: true
|
|
80
|
-
res = out.lines.map(&:strip)
|
|
81
|
-
warn res
|
|
82
|
-
res
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def self.ensure(ruby_version)
|
|
86
|
-
version = RBEnv.resolve_to_latest(ruby_version)
|
|
87
|
-
if self.installed?(version)
|
|
88
|
-
puts "#{version.yellow} already installed. Skipping …"
|
|
89
|
-
else
|
|
90
|
-
puts "Installing #{version.yellow}"
|
|
91
|
-
sh "rbenv install #{version}"
|
|
92
|
-
end
|
|
93
|
-
version
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def self.install
|
|
97
|
-
if RBENV_ROOT.exist?
|
|
98
|
-
puts "#{RBENV_ROOT} exists. Skipping …"
|
|
99
|
-
else
|
|
100
|
-
sh "git clone --depth 1 https://github.com/rbenv/rbenv.git #{RBENV_ROOT}"
|
|
101
|
-
puts "Setup your shell to recognize rbenv. Check github.com/rbenv/rbenv."
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
if RBENV_BUILD.exist?
|
|
105
|
-
puts "#{RBENV_BUILD} exists. Skipping …"
|
|
106
|
-
else
|
|
107
|
-
sh "git clone --depth 1 https://github.com/rbenv/ruby-build.git #{RBENV_BUILD}"
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def self.installed?(version)
|
|
112
|
-
installed = available_versions
|
|
113
|
-
puts "installed? = #{installed}"
|
|
114
|
-
installed && !installed.empty? && installed.include?(version)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def self.resolve_to_latest(version)
|
|
118
|
-
out, _ = sh "rbenv install --list-all", stealth: true
|
|
119
|
-
out
|
|
120
|
-
.lines
|
|
121
|
-
.map(&:strip)
|
|
122
|
-
.select { |v| v.match(/^#{Regexp.escape(version)}\.\d+/) }
|
|
123
|
-
.max_by { |v| v.split('.').map(&:to_i) }
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def self.set(version)
|
|
127
|
-
sh "rbenv local #{version}"
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
module CI
|
|
132
|
-
def self.help(*_args)
|
|
133
|
-
puts "Usage:"
|
|
134
|
-
puts " #{$0} [#{CI.singleton_class.instance_methods(false).sort.join(' | ')}]"
|
|
135
|
-
puts
|
|
136
|
-
puts "You can ask for many commands."
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def self.install(*_args)
|
|
140
|
-
RBEnv.install
|
|
141
|
-
MATRIX
|
|
142
|
-
.flat_map { |_, db|
|
|
143
|
-
db.flat_map { |_, arelx|
|
|
144
|
-
arelx.flat_map { |rails, rubies|
|
|
145
|
-
rails.start_with?("rails") ? rubies : []
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
.uniq
|
|
150
|
-
.sort
|
|
151
|
-
.each do |version|
|
|
152
|
-
RBEnv.ensure(version)
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# @param args [Array<String>] a list of databases to test
|
|
157
|
-
def self.test(*args)
|
|
158
|
-
puts "Requested DBs: #{args.inspect}"
|
|
159
|
-
MATRIX.each do |db, arelx|
|
|
160
|
-
puts "db = #{db}; #{!args.empty? && args.include?(db)}"
|
|
161
|
-
if args.empty? || args.include?(db)
|
|
162
|
-
puts "Testing #{db}"
|
|
163
|
-
else
|
|
164
|
-
puts "Skipping #{db}"
|
|
165
|
-
next
|
|
166
|
-
end
|
|
167
|
-
arelx.each do |arelx_version, rails|
|
|
168
|
-
sh "cp ./gemspecs/#{arelx_version}.gemspec ./arel_extensions.gemspec"
|
|
169
|
-
rails.each do |rails_version, ruby|
|
|
170
|
-
sh "cp ./gemfiles/#{rails_version}.gemfile ./Gemfile"
|
|
171
|
-
ruby.each do |ruby_version|
|
|
172
|
-
full_version = RBEnv.ensure(ruby_version)
|
|
173
|
-
RBEnv.set(full_version)
|
|
174
|
-
sh "ruby --version"
|
|
175
|
-
sh "which ruby"
|
|
176
|
-
sh "rm -rf Gemfile.lock vendor"
|
|
177
|
-
sh "bundle config set --local path vendor"
|
|
178
|
-
sh "bundle install"
|
|
179
|
-
sh "bundle exec rake test:#{db}"
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
# main
|
|
188
|
-
command = ARGV.size.nonzero? ? ARGV : %w[help]
|
|
189
|
-
CI.send(command[0], *command[1..])
|
data/gemfiles/rails4_2.gemfile
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
|
|
3
|
-
gem 'arel', '~> 6.0'
|
|
4
|
-
|
|
5
|
-
group :development, :test do
|
|
6
|
-
# We need to explicitly include bigdecimal for ruby 2.7 .
|
|
7
|
-
# See https://github.com/ruby/bigdecimal for details.
|
|
8
|
-
rb_version = Gem::Version.new(RUBY_VERSION)
|
|
9
|
-
if Gem::Version.new('2.7') <= rb_version && rb_version < Gem::Version.new('2.8')
|
|
10
|
-
gem 'bigdecimal', '~> 1.3.5', platforms: %i[mri mingw x64_mingw mswin]
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
gem 'activesupport', '~> 4.0'
|
|
14
|
-
gem 'activemodel', '~> 4.0'
|
|
15
|
-
gem 'activerecord', '~> 4.0'
|
|
16
|
-
|
|
17
|
-
gem 'sqlite3', '<= 1.3.13', platforms: %i[mri mswin mingw]
|
|
18
|
-
gem 'mysql2', '0.4.10', platforms: %i[mri mswin mingw]
|
|
19
|
-
gem 'pg', '< 1.0.0', platforms: %i[mri mingw]
|
|
20
|
-
|
|
21
|
-
gem 'tiny_tds', platforms: %i[mri mingw x64_mingw mswin]
|
|
22
|
-
gem 'activerecord-sqlserver-adapter', '~> 4.2.0', platforms: %i[mri mingw x64_mingw mswin]
|
|
23
|
-
|
|
24
|
-
gem 'ruby-oci8', platforms: %i[mri mswin mingw] if ENV.has_key? 'ORACLE_HOME'
|
|
25
|
-
gem 'activerecord-oracle_enhanced-adapter', '~> 1.6.0' if ENV.has_key? 'ORACLE_HOME'
|
|
26
|
-
|
|
27
|
-
# for JRuby
|
|
28
|
-
gem 'activerecord-jdbc-adapter', '~> 1.3', platforms: :jruby
|
|
29
|
-
gem 'jdbc-sqlite3', '~> 3.28', platforms: :jruby
|
|
30
|
-
gem 'jdbc-postgres', '~> 42.2', platforms: :jruby
|
|
31
|
-
gem 'jdbc-mysql', '~> 5.1', platforms: :jruby
|
|
32
|
-
gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
|
|
33
|
-
gem 'activerecord-jdbcmysql-adapter', platforms: :jruby
|
|
34
|
-
gem 'activerecord-jdbcpostgresql-adapter', platforms: :jruby
|
|
35
|
-
gem 'activerecord-jdbcmssql-adapter', platforms: :jruby
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
gemspec path: Dir.pwd
|
data/gemfiles/rails5.gemfile
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
|
|
3
|
-
gem 'arel', '~> 7.0'
|
|
4
|
-
|
|
5
|
-
group :development, :test do
|
|
6
|
-
gem 'activesupport', '~> 5.0'
|
|
7
|
-
gem 'activemodel', '~> 5.0'
|
|
8
|
-
gem 'activerecord', '5.0.6'
|
|
9
|
-
|
|
10
|
-
gem 'sqlite3', '<= 1.3.13', platforms: %i[mri mswin mingw]
|
|
11
|
-
gem 'mysql2', '0.4.10', platforms: %i[mri mswin mingw]
|
|
12
|
-
gem 'pg', '< 1.0.0', platforms: %i[mri mingw]
|
|
13
|
-
|
|
14
|
-
gem 'tiny_tds', platforms: %i[mri mingw] if RUBY_PLATFORM.match?(/windows/)
|
|
15
|
-
# gem "activerecord-sqlserver-adapter", platforms: [:mri, :mingw]
|
|
16
|
-
|
|
17
|
-
gem 'ruby-oci8', platforms: %i[mri mswin mingw] if ENV.has_key? 'ORACLE_HOME'
|
|
18
|
-
gem 'activerecord-oracle_enhanced-adapter', '~> 1.7' if ENV.has_key? 'ORACLE_HOME'
|
|
19
|
-
|
|
20
|
-
# for JRuby
|
|
21
|
-
gem 'activerecord-jdbc-adapter', github: 'jruby/activerecord-jdbc-adapter', tag: 'v50.0', platforms: :jruby
|
|
22
|
-
gem 'jdbc-sqlite3', platforms: :jruby
|
|
23
|
-
gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
|
|
24
|
-
gem 'activerecord-jdbcmysql-adapter', platforms: :jruby
|
|
25
|
-
gem 'activerecord-jdbcpostgresql-adapter', platforms: :jruby
|
|
26
|
-
gem 'activerecord-jdbcmssql-adapter', platforms: :jruby
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
gemspec path: Dir.pwd
|
data/gemfiles/rails6.gemfile
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
|
|
3
|
-
gem 'rails', '~> 6.0.0'
|
|
4
|
-
|
|
5
|
-
group :development, :test do
|
|
6
|
-
gem 'ruby-lsp', platforms: %i[mri]
|
|
7
|
-
gem 'debug', platforms: %i[mri]
|
|
8
|
-
gem 'concurrent-ruby', '1.3.4' # Need to pin b/c of a known issue https://github.com/rails/rails/issues/54260
|
|
9
|
-
|
|
10
|
-
gem 'activesupport', '~> 6.0.0'
|
|
11
|
-
gem 'activemodel', '~> 6.0.0'
|
|
12
|
-
gem 'activerecord', '~> 6.0.0'
|
|
13
|
-
|
|
14
|
-
gem 'sqlite3', '~> 1.4', platforms: [:mri]
|
|
15
|
-
gem 'mysql2', '0.5.2', platforms: [:mri]
|
|
16
|
-
gem 'pg', '< 1.0.0', platforms: [:mri]
|
|
17
|
-
|
|
18
|
-
gem 'tiny_tds', platforms: %i[mri mingw x64_mingw mswin]
|
|
19
|
-
gem 'activerecord-sqlserver-adapter', '~> 6.0', platforms: %i[mri mingw x64_mingw mswin]
|
|
20
|
-
gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw]
|
|
21
|
-
|
|
22
|
-
gem 'ruby-oci8', platforms: %i[mri mswin mingw] if ENV.has_key? 'ORACLE_HOME'
|
|
23
|
-
gem 'activerecord-oracle_enhanced-adapter', '~> 6.0.0' if ENV.has_key? 'ORACLE_HOME'
|
|
24
|
-
|
|
25
|
-
# for JRuby
|
|
26
|
-
gem 'activerecord-jdbc-alt-adapter', '~> 60.0', platform: :jruby, require: true
|
|
27
|
-
gem 'activerecord-jdbcmysql-adapter', platforms: :jruby
|
|
28
|
-
gem 'activerecord-jdbcpostgresql-adapter', platforms: :jruby
|
|
29
|
-
gem 'activerecord-jdbcsqlite3-adapter', platforms: :jruby
|
|
30
|
-
gem 'jdbc-mssql', platforms: :jruby, require: true
|
|
31
|
-
gem 'jdbc-sqlite3', platforms: :jruby
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
gemspec path: Dir.pwd
|