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.
Files changed (141) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +2 -1
  3. data/.gitignore +6 -7
  4. data/.rubocop.yml +3 -67
  5. data/.travis/oracle/download.js +152 -0
  6. data/.travis/oracle/download.sh +30 -0
  7. data/.travis/oracle/download_ojdbc.js +116 -0
  8. data/.travis/oracle/install.sh +34 -0
  9. data/.travis/setup_accounts.sh +9 -0
  10. data/.travis/sqlite3/extension-functions.sh +6 -0
  11. data/.travis.yml +223 -0
  12. data/Gemfile +28 -2
  13. data/README.md +90 -239
  14. data/Rakefile +30 -48
  15. data/TODO +1 -0
  16. data/appveyor.yml +22 -60
  17. data/arel_extensions.gemspec +14 -13
  18. data/functions.html +3 -3
  19. data/gemfiles/rails3.gemfile +10 -10
  20. data/gemfiles/rails4.gemfile +29 -0
  21. data/gemfiles/rails5_0.gemfile +29 -0
  22. data/gemfiles/rails5_1_4.gemfile +14 -14
  23. data/gemfiles/rails5_2.gemfile +14 -16
  24. data/init/mssql.sql +4 -4
  25. data/init/mysql.sql +38 -38
  26. data/init/oracle.sql +0 -0
  27. data/init/postgresql.sql +25 -24
  28. data/init/sqlite.sql +0 -0
  29. data/lib/arel_extensions/attributes.rb +3 -7
  30. data/lib/arel_extensions/boolean_functions.rb +14 -53
  31. data/lib/arel_extensions/common_sql_functions.rb +17 -16
  32. data/lib/arel_extensions/comparators.rb +28 -29
  33. data/lib/arel_extensions/date_duration.rb +13 -17
  34. data/lib/arel_extensions/insert_manager.rb +15 -18
  35. data/lib/arel_extensions/math.rb +53 -55
  36. data/lib/arel_extensions/math_functions.rb +39 -46
  37. data/lib/arel_extensions/nodes/abs.rb +1 -0
  38. data/lib/arel_extensions/nodes/blank.rb +2 -1
  39. data/lib/arel_extensions/nodes/case.rb +19 -20
  40. data/lib/arel_extensions/nodes/cast.rb +8 -10
  41. data/lib/arel_extensions/nodes/ceil.rb +1 -1
  42. data/lib/arel_extensions/nodes/coalesce.rb +4 -3
  43. data/lib/arel_extensions/nodes/collate.rb +10 -9
  44. data/lib/arel_extensions/nodes/concat.rb +18 -9
  45. data/lib/arel_extensions/nodes/date_diff.rb +26 -42
  46. data/lib/arel_extensions/nodes/duration.rb +3 -0
  47. data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
  48. data/lib/arel_extensions/nodes/floor.rb +1 -1
  49. data/lib/arel_extensions/nodes/format.rb +8 -35
  50. data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
  51. data/lib/arel_extensions/nodes/function.rb +37 -48
  52. data/lib/arel_extensions/nodes/is_null.rb +0 -0
  53. data/lib/arel_extensions/nodes/json.rb +39 -52
  54. data/lib/arel_extensions/nodes/length.rb +0 -5
  55. data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
  56. data/lib/arel_extensions/nodes/locate.rb +2 -1
  57. data/lib/arel_extensions/nodes/log10.rb +2 -1
  58. data/lib/arel_extensions/nodes/matches.rb +7 -5
  59. data/lib/arel_extensions/nodes/md5.rb +1 -0
  60. data/lib/arel_extensions/nodes/power.rb +5 -5
  61. data/lib/arel_extensions/nodes/rand.rb +1 -0
  62. data/lib/arel_extensions/nodes/repeat.rb +5 -3
  63. data/lib/arel_extensions/nodes/replace.rb +8 -16
  64. data/lib/arel_extensions/nodes/round.rb +6 -5
  65. data/lib/arel_extensions/nodes/soundex.rb +15 -15
  66. data/lib/arel_extensions/nodes/std.rb +21 -18
  67. data/lib/arel_extensions/nodes/substring.rb +16 -8
  68. data/lib/arel_extensions/nodes/then.rb +1 -1
  69. data/lib/arel_extensions/nodes/trim.rb +6 -4
  70. data/lib/arel_extensions/nodes/union.rb +8 -5
  71. data/lib/arel_extensions/nodes/union_all.rb +7 -4
  72. data/lib/arel_extensions/nodes/wday.rb +4 -0
  73. data/lib/arel_extensions/nodes.rb +1 -1
  74. data/lib/arel_extensions/null_functions.rb +5 -19
  75. data/lib/arel_extensions/predications.rb +43 -44
  76. data/lib/arel_extensions/railtie.rb +5 -5
  77. data/lib/arel_extensions/set_functions.rb +7 -5
  78. data/lib/arel_extensions/string_functions.rb +36 -82
  79. data/lib/arel_extensions/tasks.rb +6 -6
  80. data/lib/arel_extensions/version.rb +1 -1
  81. data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
  82. data/lib/arel_extensions/visitors/mssql.rb +192 -423
  83. data/lib/arel_extensions/visitors/mysql.rb +212 -354
  84. data/lib/arel_extensions/visitors/oracle.rb +178 -221
  85. data/lib/arel_extensions/visitors/oracle12.rb +31 -18
  86. data/lib/arel_extensions/visitors/postgresql.rb +173 -257
  87. data/lib/arel_extensions/visitors/sqlite.rb +126 -140
  88. data/lib/arel_extensions/visitors/to_sql.rb +237 -299
  89. data/lib/arel_extensions/visitors.rb +62 -83
  90. data/lib/arel_extensions.rb +31 -226
  91. data/test/database.yml +7 -15
  92. data/test/helper.rb +18 -0
  93. data/test/real_db_test.rb +117 -120
  94. data/test/support/fake_record.rb +3 -9
  95. data/test/test_comparators.rb +17 -14
  96. data/test/visitors/test_bulk_insert_oracle.rb +11 -11
  97. data/test/visitors/test_bulk_insert_sqlite.rb +13 -12
  98. data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
  99. data/test/visitors/test_oracle.rb +55 -55
  100. data/test/visitors/test_to_sql.rb +226 -419
  101. data/test/with_ar/all_agnostic_test.rb +366 -721
  102. data/test/with_ar/insert_agnostic_test.rb +21 -27
  103. data/test/with_ar/test_bulk_sqlite.rb +16 -17
  104. data/test/with_ar/test_math_sqlite.rb +26 -26
  105. data/test/with_ar/test_string_mysql.rb +33 -31
  106. data/test/with_ar/test_string_sqlite.rb +34 -30
  107. metadata +37 -47
  108. data/.github/workflows/publish.yml +0 -30
  109. data/.github/workflows/release.yml +0 -30
  110. data/.github/workflows/ruby.yml +0 -403
  111. data/CONTRIBUTING.md +0 -102
  112. data/NEWS.md +0 -109
  113. data/bin/build +0 -15
  114. data/bin/compose +0 -6
  115. data/bin/publish +0 -8
  116. data/dev/arelx.dockerfile +0 -44
  117. data/dev/compose.yaml +0 -71
  118. data/dev/postgres.dockerfile +0 -5
  119. data/dev/rbenv +0 -189
  120. data/gemfiles/rails4_2.gemfile +0 -38
  121. data/gemfiles/rails5.gemfile +0 -29
  122. data/gemfiles/rails6.gemfile +0 -34
  123. data/gemfiles/rails6_1.gemfile +0 -42
  124. data/gemfiles/rails7.gemfile +0 -42
  125. data/gemfiles/rails7_1.gemfile +0 -41
  126. data/gemfiles/rails7_2.gemfile +0 -41
  127. data/gemspecs/arel_extensions-v1.gemspec +0 -27
  128. data/gemspecs/arel_extensions-v2.gemspec +0 -27
  129. data/generate_gems.sh +0 -15
  130. data/lib/arel_extensions/aliases.rb +0 -14
  131. data/lib/arel_extensions/helpers.rb +0 -62
  132. data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
  133. data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
  134. data/lib/arel_extensions/nodes/rollup.rb +0 -36
  135. data/lib/arel_extensions/nodes/select.rb +0 -10
  136. data/lib/arel_extensions/nodes/sum.rb +0 -7
  137. data/lib/arel_extensions/visitors/convert_format.rb +0 -37
  138. data/lib/arel_extensions/warning.rb +0 -42
  139. data/test/arelx_test_helper.rb +0 -92
  140. data/version_v1.rb +0 -3
  141. 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
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- IFS=$'\n\t'
4
- set -euo pipefail
5
-
6
- docker compose -f dev/compose.yaml up --exit-code-from arelx
data/bin/publish DELETED
@@ -1,8 +0,0 @@
1
- #! /usr/bin/env sh
2
- set -e
3
-
4
- find . -name "arel_extensions*.gem" | while read packaged_gem ; do
5
- echo "Publishing $packaged_gem"
6
- gem push "$packaged_gem"
7
- done
8
-
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
@@ -1,5 +0,0 @@
1
- FROM postgres:16
2
-
3
- RUN locale-gen fr_FR.utf8 && update-locale
4
- RUN localedef -i fr_FR -c -f UTF-8 -A /usr/share/locale/locale.alias fr_FR.UTF-8
5
- # ENV LANG fr_FR.utf8
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..])
@@ -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
@@ -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
@@ -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