diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e548fc3..a0ebbc99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -187,7 +187,7 @@ jobs: fail-fast: false matrix: ruby: - - 3.4.5 + - 3.4.8 os: - ubuntu-latest - macos-latest diff --git a/README.md b/README.md index e212a94b..ca4ca3ff 100755 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ This repository hosts [Ruby][1] language ruleset for [Bazel][2]. The ruleset is known to work with: -- Bazel 8 using WORKSPACE and Bzlmod *(tested on CI)*. -- Bazel 7 using WORKSPACE and Bzlmod *(no longer tested on CI)*. -- Bazel 6 using WORKSPACE and Bzlmod *(no longer tested on CI)*. +- Bazel 8 using WORKSPACE and Bzlmod _(tested on CI)_. +- Bazel 7 using WORKSPACE and Bzlmod _(no longer tested on CI)_. +- Bazel 6 using WORKSPACE and Bzlmod _(no longer tested on CI)_. ## Getting Started @@ -28,7 +28,7 @@ rb_register_toolchains( ) ``` -3. *(Optional)* Download and install Bundler dependencies: +3. _(Optional)_ Download and install Bundler dependencies: ```bazel # WORKSPACE @@ -96,7 +96,7 @@ See [`examples`][14] directory for a comprehensive set of examples how to use th The following toolchains are known to work and tested on CI. | Ruby | Linux | macOS | Windows | -|------------------|-------|-------|---------| +| ---------------- | ----- | ----- | ------- | | MRI 3.5 | 🟩 | 🟩 | 🟥 | | MRI 3.4 | 🟩 | 🟩 | 🟩 | | MRI 3.3 | 🟩 | 🟩 | 🟩 | @@ -104,10 +104,10 @@ The following toolchains are known to work and tested on CI. | JRuby 10.0 | 🟩 | 🟩 | 🟩 | | TruffleRuby 25.0 | 🟩 | 🟩 | 🟥 | -The following toolchains were previously known to work but *no longer tested on CI*. +The following toolchains were previously known to work but _no longer tested on CI_. | Ruby | Linux | macOS | Windows | -|------------------|-------|-------|---------| +| ---------------- | ----- | ----- | ------- | | MRI 3.1 | 🟩 | 🟩 | 🟩 | | MRI 3.0 | 🟩 | 🟩 | 🟩 | | MRI 2.7 | 🟩 | 🟩 | 🟩 | @@ -124,6 +124,76 @@ Keep in mind, that it takes some time for compilation to complete. On Windows, [RubyInstaller][6] is used to install MRI. +#### Fast Installation with rv-ruby + +For faster MRI installation on Linux and macOS, you can use prebuilt Ruby +binaries from [rv-ruby][19] instead of compiling from source. This significantly +reduces installation time and ensures consistent, portable Ruby environments. + +**WORKSPACE:** + +```bazel +load("@rules_ruby//ruby:deps.bzl", "rb_register_toolchains") + +rb_register_toolchains( + version = "3.4.8", + rv_version = "20251225", + rv_checksums = { + "linux-x86_64": "f36cef10365d370e0867f0c3ac36e457a26ab04f3cfbbd7edb227a18e6e9b3c3", + "linux-arm64": "0c08c35a99f10817643d548f98012268c5433ae25a737ab4d6751336108a941d", + "macos-x86_64": "e9da39082d1dd8502d322c850924d929bc45b7a1e35da593a5606c00673218d4", + "macos-arm64": "cd9d7a1428076bfcc6c2ca3c0eb69b8e671e9b48afb4c351fa4a84927841ffef", + }, +) +``` + +**Bzlmod:** + +```bazel +ruby = use_extension("@rules_ruby//ruby:extensions.bzl", "ruby") +ruby.toolchain( + name = "ruby", + version_file = "//:.ruby-version", + rv_version = "20251225", + rv_checksums = { + "linux-x86_64": "f36cef10365d370e0867f0c3ac36e457a26ab04f3cfbbd7edb227a18e6e9b3c3", + "linux-arm64": "0c08c35a99f10817643d548f98012268c5433ae25a737ab4d6751336108a941d", + "macos-x86_64": "e9da39082d1dd8502d322c850924d929bc45b7a1e35da593a5606c00673218d4", + "macos-arm64": "cd9d7a1428076bfcc6c2ca3c0eb69b8e671e9b48afb4c351fa4a84927841ffef", + }, +) +``` + +**Important:** When using rv-ruby, you must exclude default gems with C extensions +from `rb_bundle_fetch` as these are pre-compiled in the rv-ruby binary: + +```bazel +rb_bundle_fetch( + name = "bundle", + gemfile = "//:Gemfile", + gemfile_lock = "//:Gemfile.lock", + excluded_gems = [ + # Default gems with C extensions from https://stdgems.org/3.4.8 + # These are pre-compiled in rv-ruby with portable dependencies. + # IMPORTANT: These gems must also be pinned in your Gemfile. + "date", "digest", "etc", "fcntl", "fiddle", + "io-console", "io-nonblock", "io-wait", "json", + "openssl", "pathname", "prism", "psych", + "stringio", "strscan", "zlib", + ], +) +``` + +Find the list of default gems for your Ruby version at https://stdgems.org/\ +(e.g., https://stdgems.org/3.4.8 for Ruby 3.4.8). Only exclude gems with C +extensions. Bundled gems should NOT be excluded. + +**Notes:** + +- rv-ruby is only supported on Linux and macOS (x86_64 and arm64). +- On Windows, the toolchain automatically falls back to RubyInstaller. +- Find available rv-ruby releases at https://github.com/spinel-coop/rv-ruby/releases + ### JRuby On all operating systems, JRuby is downloaded manually. @@ -142,22 +212,21 @@ However, some are known not to work or work only partially (e.g. mRuby has no bu ## Known Issues -* JRuby/TruffleRuby might need `HOME` variable exposed. +- JRuby/TruffleRuby might need `HOME` variable exposed. See [`examples/gem/.bazelrc`][7] to learn how to do that. This is to be fixed in [`jruby/jruby#5661`][9] and [`oracle/truffleruby#2784`][10]. -* JRuby might fail with `Errno::EACCES: Permission denied - NUL` error on Windows. +- JRuby might fail with `Errno::EACCES: Permission denied - NUL` error on Windows. You need to configure JDK to allow proper access. This is described in [`jruby/jruby#7182`][11]. -* RuboCop < 1.55 crashes with `LoadError` on Windows. +- RuboCop < 1.55 crashes with `LoadError` on Windows. This is fixed in [`rubocop/rubocop#12062`][12]. -* REPL doesn't work when used with `bazel test`. +- REPL doesn't work when used with `bazel test`. To work it around, use a debugger with remote client support such as [`ruby/debug`][8] . See [`examples/gem/.bazelrc`][7] to learn how to do that. -* Some gems contain files with spaces which cause Bazel error `link or target filename contains space`. +- Some gems contain files with spaces which cause Bazel error `link or target filename contains space`. To work it around, use [`--experimental_inprocess_symlink_creation`][16] Bazel flag. See [`bazelbuild/bazel#4327`][17] for more details. - [1]: https://www.ruby-lang.org [2]: https://bazel.build [3]: docs/repository_rules.md @@ -176,3 +245,4 @@ However, some are known not to work or work only partially (e.g. mRuby has no bu [16]: https://bazel.build/reference/command-line-reference#flag--experimental_inprocess_symlink_creation [17]: https://github.com/bazelbuild/bazel/issues/4327 [18]: docs/rails.md +[19]: https://github.com/spinel-coop/rv-ruby diff --git a/docs/repository_rules.md b/docs/repository_rules.md index ac3b0347..7b42f60a 100644 --- a/docs/repository_rules.md +++ b/docs/repository_rules.md @@ -30,7 +30,8 @@ Wraps `rb_bundle_rule()` providing default toolchain name.
 load("@rules_ruby//ruby:deps.bzl", "rb_register_toolchains")
 
-rb_register_toolchains(name, version, version_file, msys2_packages, register, **kwargs)
+rb_register_toolchains(name, version, version_file, msys2_packages, rv_version, rv_checksums,
+                       register, **kwargs)
 
Register a Ruby toolchain and lazily download the Ruby Interpreter. @@ -39,6 +40,7 @@ Register a Ruby toolchain and lazily download the Ruby Interpreter. * _(For MRI on Windows)_ Installed using [RubyInstaller](https://rubyinstaller.org). * _(For JRuby on any OS)_ Downloaded and installed directly from [official website](https://www.jruby.org). * _(For TruffleRuby on Linux and macOS)_ Installed using [ruby-build](https://github.com/rbenv/ruby-build). +* _(For rv-ruby)_ Prebuilt Ruby downloaded from [rv-ruby](https://github.com/spinel-coop/rv-ruby). * _(For "system")_ Ruby found on the PATH is used. Please note that builds are not hermetic in this case. `WORKSPACE`: @@ -84,6 +86,8 @@ rb_library( | version | a semver version of MRI, or a string like [interpreter type]-[version], or "system" | `None` | | version_file | .ruby-version or .tool-versions file to read version from | `None` | | msys2_packages | extra MSYS2 packages to install | `["libyaml"]` | +| rv_version | rv-ruby release version (e.g., "20251225"). When set, downloads prebuilt Ruby from rv-ruby instead of compiling via ruby-build. | `""` | +| rv_checksums | platform checksums for rv-ruby downloads. Keys: linux-x86_64, linux-arm64, macos-arm64, macos-x86_64. | `{}` | | register | whether to register the resulting toolchains, should be False under bzlmod | `True` | | kwargs | additional parameters to the downloader for this interpreter type | none | @@ -95,8 +99,8 @@ rb_library(
 load("@rules_ruby//ruby:deps.bzl", "rb_bundle_fetch")
 
-rb_bundle_fetch(name, srcs, auth_patterns, bundler_checksums, bundler_remote, env, gem_checksums,
-                gemfile, gemfile_lock, netrc, repo_mapping, ruby)
+rb_bundle_fetch(name, srcs, auth_patterns, bundler_checksums, bundler_remote, env, excluded_gems,
+                gem_checksums, gemfile, gemfile_lock, netrc, repo_mapping, ruby)
 
Fetches Bundler dependencies to be automatically installed by other targets. @@ -162,6 +166,7 @@ rb_test( | bundler_checksums | Custom map from Bundler version to its SHA-256 checksum. | Dictionary: String -> String | optional | `{}` | | bundler_remote | Remote to fetch the bundler gem from. | String | optional | `"https://rubygems.org/"` | | env | Environment variables to use during installation. | Dictionary: String -> String | optional | `{}` | +| excluded_gems | List of gem names to exclude from downloading. Useful for default gems bundled with Ruby (e.g., psych, stringio). | List of strings | optional | `[]` | | gem_checksums | SHA-256 checksums for remote gems. Keys are gem names (e.g. foobar-1.2.3), values are SHA-256 checksums. | Dictionary: String -> String | optional | `{}` | | gemfile | Gemfile to install dependencies from. | Label | required | | | gemfile_lock | Gemfile.lock to install dependencies from. | Label | required | | diff --git a/examples/rails/.ruby-version b/examples/rails/.ruby-version index 4f5e6973..7921bd0c 100644 --- a/examples/rails/.ruby-version +++ b/examples/rails/.ruby-version @@ -1 +1 @@ -3.4.5 +3.4.8 diff --git a/examples/rails/Gemfile b/examples/rails/Gemfile index 61d50e7d..e39c5ab5 100644 --- a/examples/rails/Gemfile +++ b/examples/rails/Gemfile @@ -3,4 +3,28 @@ source "https://rubygems.org" # Rails for generating and running the People Tracker Rails application -gem "rails", "~> 8.0" \ No newline at end of file +gem "rails", "~> 8.0" + +# Pin default gems with C extensions to versions bundled with rv-ruby Ruby +# binaries. The list can be found at https://stdgems.org/ (e.g, +# https://stdgems.org/3.4.8 for Ruby 3.4.8). These gems should NOT be +# downloaded - they're pre-compiled in rv-ruby with portable dependencies. +# +# IMPORTANT: These gems must be listed in the excluded_gems list in the +# bundle_fetch configured in your MODULE.bazel file. +gem "date", "3.4.1" +gem "digest", "3.2.0" +gem "etc", "1.4.6" +gem "fcntl", "1.2.0" +gem "fiddle", "1.1.6" +gem "io-console", "0.8.1" +gem "io-nonblock", "0.3.2" +gem "io-wait", "0.3.2" +gem "json", "2.9.1" +gem "openssl", "3.3.1" +gem "pathname", "0.4.0" +gem "prism", "1.5.2" +gem "psych", "5.2.2" +gem "stringio", "3.1.2" +gem "strscan", "3.1.2" +gem "zlib", "3.2.1" diff --git a/examples/rails/Gemfile.lock b/examples/rails/Gemfile.lock index 0b6497ae..17c59b0a 100644 --- a/examples/rails/Gemfile.lock +++ b/examples/rails/Gemfile.lock @@ -1,29 +1,31 @@ GEM remote: https://rubygems.org/ specs: - actioncable (8.0.2.1) - actionpack (= 8.0.2.1) - activesupport (= 8.0.2.1) + action_text-trix (2.1.16) + railties + actioncable (8.1.1) + actionpack (= 8.1.1) + activesupport (= 8.1.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.2.1) - actionpack (= 8.0.2.1) - activejob (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionmailbox (8.1.1) + actionpack (= 8.1.1) + activejob (= 8.1.1) + activerecord (= 8.1.1) + activestorage (= 8.1.1) + activesupport (= 8.1.1) mail (>= 2.8.0) - actionmailer (8.0.2.1) - actionpack (= 8.0.2.1) - actionview (= 8.0.2.1) - activejob (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionmailer (8.1.1) + actionpack (= 8.1.1) + actionview (= 8.1.1) + activejob (= 8.1.1) + activesupport (= 8.1.1) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.2.1) - actionview (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionpack (8.1.1) + actionview (= 8.1.1) + activesupport (= 8.1.1) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -31,80 +33,89 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.2.1) - actionpack (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + actiontext (8.1.1) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.1) + activerecord (= 8.1.1) + activestorage (= 8.1.1) + activesupport (= 8.1.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.2.1) - activesupport (= 8.0.2.1) + actionview (8.1.1) + activesupport (= 8.1.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.2.1) - activesupport (= 8.0.2.1) + activejob (8.1.1) + activesupport (= 8.1.1) globalid (>= 0.3.6) - activemodel (8.0.2.1) - activesupport (= 8.0.2.1) - activerecord (8.0.2.1) - activemodel (= 8.0.2.1) - activesupport (= 8.0.2.1) + activemodel (8.1.1) + activesupport (= 8.1.1) + activerecord (8.1.1) + activemodel (= 8.1.1) + activesupport (= 8.1.1) timeout (>= 0.4.0) - activestorage (8.0.2.1) - actionpack (= 8.0.2.1) - activejob (= 8.0.2.1) - activerecord (= 8.0.2.1) - activesupport (= 8.0.2.1) + activestorage (8.1.1) + actionpack (= 8.1.1) + activejob (= 8.1.1) + activerecord (= 8.1.1) + activesupport (= 8.1.1) marcel (~> 1.0) - activesupport (8.0.2.1) + activesupport (8.1.1) base64 - benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + json logger (>= 1.4.2) minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) base64 (0.3.0) - benchmark (0.4.1) - bigdecimal (3.2.2) + bigdecimal (4.0.1) builder (3.3.0) - concurrent-ruby (1.3.5) - connection_pool (2.5.3) + concurrent-ruby (1.3.6) + connection_pool (3.0.2) crass (1.0.6) date (3.4.1) + digest (3.2.0) drb (2.2.3) - erb (5.0.2) + erb (6.0.1) erubi (1.13.1) - globalid (1.2.1) + etc (1.4.6) + fcntl (1.2.0) + fiddle (1.1.6) + globalid (1.3.0) activesupport (>= 6.1) - i18n (1.14.7) + i18n (1.14.8) concurrent-ruby (~> 1.0) io-console (0.8.1) - irb (1.15.2) + io-nonblock (0.3.2) + io-wait (0.3.2) + irb (1.16.0) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) + json (2.9.1) logger (1.7.0) - loofah (2.24.1) + loofah (2.25.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) - mail (2.8.1) + mail (2.9.0) + logger mini_mime (>= 0.1.1) net-imap net-pop net-smtp - marcel (1.0.4) + marcel (1.1.0) mini_mime (1.1.5) - minitest (5.25.5) - net-imap (0.5.9) + minitest (6.0.1) + prism (~> 1.5) + net-imap (0.6.2) date net-protocol net-pop (0.1.2) @@ -113,52 +124,55 @@ GEM timeout net-smtp (0.5.1) net-protocol - nio4r (2.7.4) - nokogiri (1.18.9-aarch64-linux-gnu) + nio4r (2.7.5) + nokogiri (1.19.0-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-aarch64-linux-musl) + nokogiri (1.19.0-aarch64-linux-musl) racc (~> 1.4) - nokogiri (1.18.9-arm-linux-gnu) + nokogiri (1.19.0-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-arm-linux-musl) + nokogiri (1.19.0-arm-linux-musl) racc (~> 1.4) - nokogiri (1.18.9-arm64-darwin) + nokogiri (1.19.0-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.9-x86_64-darwin) + nokogiri (1.19.0-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-gnu) + nokogiri (1.19.0-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-musl) + nokogiri (1.19.0-x86_64-linux-musl) racc (~> 1.4) - pp (0.6.2) + openssl (3.3.1) + pathname (0.4.0) + pp (0.6.3) prettyprint prettyprint (0.2.0) - psych (5.2.6) + prism (1.5.2) + psych (5.2.2) date stringio racc (1.8.1) - rack (3.2.0) + rack (3.2.4) rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) rack-test (2.2.0) rack (>= 1.3) - rackup (2.2.1) + rackup (2.3.1) rack (>= 3) - rails (8.0.2.1) - actioncable (= 8.0.2.1) - actionmailbox (= 8.0.2.1) - actionmailer (= 8.0.2.1) - actionpack (= 8.0.2.1) - actiontext (= 8.0.2.1) - actionview (= 8.0.2.1) - activejob (= 8.0.2.1) - activemodel (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + rails (8.1.1) + actioncable (= 8.1.1) + actionmailbox (= 8.1.1) + actionmailer (= 8.1.1) + actionpack (= 8.1.1) + actiontext (= 8.1.1) + actionview (= 8.1.1) + activejob (= 8.1.1) + activemodel (= 8.1.1) + activerecord (= 8.1.1) + activestorage (= 8.1.1) + activesupport (= 8.1.1) bundler (>= 1.15.0) - railties (= 8.0.2.1) + railties (= 8.1.1) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -166,33 +180,38 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.2.1) - actionpack (= 8.0.2.1) - activesupport (= 8.0.2.1) + railties (8.1.1) + actionpack (= 8.1.1) + activesupport (= 8.1.1) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) zeitwerk (~> 2.6) - rake (13.3.0) - rdoc (6.14.2) + rake (13.3.1) + rdoc (7.0.3) erb psych (>= 4.0.0) - reline (0.6.2) + tsort + reline (0.6.3) io-console (~> 0.5) securerandom (0.4.1) - stringio (3.1.7) + stringio (3.1.2) + strscan (3.1.2) thor (1.4.0) - timeout (0.4.3) + timeout (0.6.0) + tsort (0.2.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - uri (1.0.3) + uri (1.1.1) useragent (0.16.11) websocket-driver (0.8.0) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.7.3) + zeitwerk (2.7.4) + zlib (3.2.1) PLATFORMS aarch64-linux-gnu @@ -206,7 +225,23 @@ PLATFORMS x86_64-linux-musl DEPENDENCIES + date (= 3.4.1) + digest (= 3.2.0) + etc (= 1.4.6) + fcntl (= 1.2.0) + fiddle (= 1.1.6) + io-console (= 0.8.1) + io-nonblock (= 0.3.2) + io-wait (= 0.3.2) + json (= 2.9.1) + openssl (= 3.3.1) + pathname (= 0.4.0) + prism (= 1.5.2) + psych (= 5.2.2) rails (~> 8.0) + stringio (= 3.1.2) + strscan (= 3.1.2) + zlib (= 3.2.1) BUNDLED WITH 2.6.9 diff --git a/examples/rails/MODULE.bazel b/examples/rails/MODULE.bazel index baa93701..1bacce07 100644 --- a/examples/rails/MODULE.bazel +++ b/examples/rails/MODULE.bazel @@ -28,226 +28,275 @@ bazel_dep( ruby = use_extension("@rules_ruby//ruby:extensions.bzl", "ruby") ruby.toolchain( name = "ruby", + rv_checksums = { + "linux-arm64": "0c08c35a99f10817643d548f98012268c5433ae25a737ab4d6751336108a941d", + "linux-x86_64": "f36cef10365d370e0867f0c3ac36e457a26ab04f3cfbbd7edb227a18e6e9b3c3", + "macos-arm64": "cd9d7a1428076bfcc6c2ca3c0eb69b8e671e9b48afb4c351fa4a84927841ffef", + "macos-x86_64": "e9da39082d1dd8502d322c850924d929bc45b7a1e35da593a5606c00673218d4", + }, + rv_version = "20251225", version_file = "//:.ruby-version", ) ruby.bundle_fetch( name = "root_bundle", + # Exclude default gems with C extensions as listed at + # https://stdgems.org/ (e.g, https://stdgems.org/3.4.8 for + # Ruby 3.4.8) - these are pre-compiled in rv-ruby with portable + # dependencies. Bundled gems are NOT excluded because bundler needs to + # install them normally. + # + # IMPORTANT: These gems must be pinned in your Gemfile, as well. + excluded_gems = [ + "date", + "digest", + "etc", + "fcntl", + "fiddle", + "io-console", + "io-nonblock", + "io-wait", + "json", + "openssl", + "pathname", + "prism", + "psych", + "stringio", + "strscan", + "zlib", + ], gem_checksums = { - "actioncable-8.0.2.1": "6f1cb20db39fba28a93569e8d5dab42b2749d7ddd4baebb5bbecd4217e49d6a2", - "actionmailbox-8.0.2.1": "8ea8c6e31e448961c06fc1d6282775b32aff1c009f232d4564e07e54850a6cad", - "actionmailer-8.0.2.1": "0de14d8d04541eab130858cb2f0697266be42de1afe1104bc43d7998137ddb9c", - "actionpack-8.0.2.1": "61e7e11a31dbe5152ca57221788bdca42ef302c4cc53b4c8993d68dce8982b0a", - "actiontext-8.0.2.1": "0cc4b3b5cfb9d915c6697b05b013dad7f4eaf074d9989700b6a0a55cf620d6b8", - "actionview-8.0.2.1": "2ea6d20ccb0b7b84a221a940ac06853ce99235e4ecb4947815839c7c5ecbf347", - "activejob-8.0.2.1": "d6e5f2da07ec8efac13a38af1752416770dc74e95783f7b252506d707aa32b89", - "activemodel-8.0.2.1": "17bab6cdb86531844113df22f864480a89a276bf0318246e628f99e0ac077ec4", - "activerecord-8.0.2.1": "a6556e7bdd53f3889d18d2aa3a7ff115fd6c5e1463dd06f97fb88d06b58c6df1", - "activestorage-8.0.2.1": "43bb3d9e115471e201e6a66813810c1d15b607a321f29d62efdf9d90ffaf76f8", - "activesupport-8.0.2.1": "0405a76fd1ca989975d9ae00d46a4d3979bdf3817482d846b63affa84bd561c6", + "action_text-trix-2.1.16": "f645a2c21821b8449fd1d6770708f4031c91a2eedf9ef476e9be93c64e703a8a", + "actioncable-8.1.1": "7262307e9693f09b299e281590110ce4b6ba7e4e4cee6da4b9d987eaf56f9139", + "actionmailbox-8.1.1": "aa99703a9b2fa32c5a4a93bb21fef79e2935d8db4d1fd5ef0772847be5d43205", + "actionmailer-8.1.1": "45755d7d4561363490ae82b17a5919bdef4dfe3bb400831819947c3a1d82afdf", + "actionpack-8.1.1": "192e27c39a63c7d801ac7b6d50505f265e389516985eed9b2ee364896a6a06d7", + "actiontext-8.1.1": "fd8d8da1e6bc0b04ff72fccfd127e78431238a99a82e736c7b52727c576a7640", + "actionview-8.1.1": "ca480c8b099dea0862b0934f24182b84c2d29092e7dbf464fb3e6d4eb9b468dc", + "activejob-8.1.1": "94f438a9f3b5a6b130fef53d8313f869dbd379309e7d639891bda36b12509383", + "activemodel-8.1.1": "8b7e2496b9e333ced06248c16a43217b950192c98e0fe3aa117eee21501c6fbd", + "activerecord-8.1.1": "e32c3a03e364fd803498eb4150c21bedc995aa83bc27122a94d480ab1dcb3d17", + "activestorage-8.1.1": "bc01d8b4c55e309a0a2e218bfe502c382c9f232e28b1f4b0adc9d8719d2bf28d", + "activesupport-8.1.1": "5e92534e8d0c8b8b5e6b16789c69dbea65c1d7b752269f71a39422e9546cea67", "base64-0.3.0": "27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b", - "benchmark-0.4.1": "d4ef40037bba27f03b28013e219b950b82bace296549ec15a78016552f8d2cce", - "bigdecimal-3.2.2": "39085f76b495eb39a79ce07af716f3a6829bc35eb44f2195e2753749f2fa5adc", + "bigdecimal-4.0.1": "8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7", "builder-3.3.0": "497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f", - "concurrent-ruby-1.3.5": "813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6", - "connection_pool-2.5.3": "cfd74a82b9b094d1ce30c4f1a346da23ee19dc8a062a16a85f58eab1ced4305b", + "concurrent-ruby-1.3.6": "6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab", + "connection_pool-3.0.2": "33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a", "crass-1.0.6": "dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d", - "date-3.4.1": "bf268e14ef7158009bfeaec40b5fa3c7271906e88b196d958a89d4b408abe64f", "drb-2.2.3": "0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373", - "erb-5.0.2": "d30f258143d4300fb4ecf430042ac12970c9bb4b33c974a545b8f58c1ec26c0f", + "erb-6.0.1": "28ecdd99c5472aebd5674d6061e3c6b0a45c049578b071e5a52c2a7f13c197e5", "erubi-1.13.1": "a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9", - "globalid-1.2.1": "70bf76711871f843dbba72beb8613229a49429d1866828476f9c9d6ccc327ce9", - "i18n-1.14.7": "ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f", - "io-console-0.8.1": "1e15440a6b2f67b6ea496df7c474ed62c860ad11237f29b3bd187f054b925fcb", - "irb-1.15.2": "222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba", + "globalid-1.3.0": "05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11", + "i18n-1.14.8": "285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5", + "irb-1.16.0": "2abe56c9ac947cdcb2f150572904ba798c1e93c890c256f8429981a7675b0806", "logger-1.7.0": "196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203", - "loofah-2.24.1": "655a30842b70ec476410b347ab1cd2a5b92da46a19044357bbd9f401b009a337", - "mail-2.8.1": "ec3b9fadcf2b3755c78785cb17bc9a0ca9ee9857108a64b6f5cfc9c0b5bfc9ad", - "marcel-1.0.4": "0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4", + "loofah-2.25.0": "df5ed7ac3bac6a4ec802df3877ee5cc86d027299f8952e6243b3dac446b060e6", + "mail-2.9.0": "6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941", + "marcel-1.1.0": "fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee", "mini_mime-1.1.5": "8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef", - "minitest-5.25.5": "391b6c6cb43a4802bfb7c93af1ebe2ac66a210293f4a3fb7db36f2fc7dc2c756", - "net-imap-0.5.9": "d95905321e1bd9f294ffc7ff8697be218eee1ec96c8504c0960964d0a0be33fc", + "minitest-6.0.1": "7854c74f48e2e975969062833adc4013f249a4b212f5e7b9d5c040bf838d54bb", + "net-imap-0.6.2": "08caacad486853c61676cca0c0c47df93db02abc4a8239a8b67eb0981428acc6", "net-pop-0.1.2": "848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3", "net-protocol-0.2.2": "aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8", "net-smtp-0.5.1": "ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736", - "nio4r-2.7.4": "d95dee68e0bb251b8ff90ac3423a511e3b784124e5db7ff5f4813a220ae73ca9", - "nokogiri-1.18.9-aarch64-linux-gnu": "5bcfdf7aa8d1056a7ad5e52e1adffc64ef53d12d0724fbc6f458a3af1a4b9e32", - "nokogiri-1.18.9-aarch64-linux-musl": "55e9e6ca46c4ad1715e313f407d8481d15be1e3b65d9f8e52ba1c124d01676a7", - "nokogiri-1.18.9-arm-linux-gnu": "fe611ae65880e445a9c0f650d52327db239f3488626df4173c05beafd161d46e", - "nokogiri-1.18.9-arm-linux-musl": "935605e14c0ba17da18d203922440bf6c0676c602659278d855d4622d756a324", - "nokogiri-1.18.9-arm64-darwin": "eea3f1f06463ff6309d3ff5b88033c4948d0da1ab3cc0a3a24f63c4d4a763979", - "nokogiri-1.18.9-x86_64-darwin": "e0d2deb03d3d7af8016e8c9df5ff4a7d692159cefb135cbb6a4109f265652348", - "nokogiri-1.18.9-x86_64-linux-gnu": "b52f5defedc53d14f71eeaaf990da66b077e1918a2e13088b6a96d0230f44360", - "nokogiri-1.18.9-x86_64-linux-musl": "e69359d6240c17e64cc9f43970d54f13bfc7b8cc516b819228f687e953425e69", - "pp-0.6.2": "947ec3120c6f92195f8ee8aa25a7b2c5297bb106d83b41baa02983686577b6ff", + "nio4r-2.7.5": "6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1", + "nokogiri-1.19.0-aarch64-linux-gnu": "11a97ecc3c0e7e5edcf395720b10860ef493b768f6aa80c539573530bc933767", + "nokogiri-1.19.0-aarch64-linux-musl": "eb70507f5e01bc23dad9b8dbec2b36ad0e61d227b42d292835020ff754fb7ba9", + "nokogiri-1.19.0-arm-linux-gnu": "572a259026b2c8b7c161fdb6469fa2d0edd2b61cd599db4bbda93289abefbfe5", + "nokogiri-1.19.0-arm-linux-musl": "23ed90922f1a38aed555d3de4d058e90850c731c5b756d191b3dc8055948e73c", + "nokogiri-1.19.0-arm64-darwin": "0811dfd936d5f6dd3f6d32ef790568bf29b2b7bead9ba68866847b33c9cf5810", + "nokogiri-1.19.0-x86_64-darwin": "1dad56220b603a8edb9750cd95798bffa2b8dd9dd9aa47f664009ee5b43e3067", + "nokogiri-1.19.0-x86_64-linux-gnu": "f482b95c713d60031d48c44ce14562f8d2ce31e3a9e8dd0ccb131e9e5a68b58c", + "nokogiri-1.19.0-x86_64-linux-musl": "1c4ca6b381622420073ce6043443af1d321e8ed93cc18b08e2666e5bd02ffae4", + "pp-0.6.3": "2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6", "prettyprint-0.2.0": "2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193", - "psych-5.2.6": "814328aa5dcb6d604d32126a20bc1cbcf05521a5b49dbb1a8b30a07e580f316e", "racc-1.8.1": "4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f", - "rack-3.2.0": "79cd21514d696c59d61fae02e62900f087aac2d053fdc77d45f4e91b94fb3612", + "rack-3.2.4": "5d74b6f75082a643f43c1e76b419c40f0e5527fcfee1e669ac1e6b73c0ccb6f6", "rack-session-2.1.1": "0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9", "rack-test-2.2.0": "005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463", - "rackup-2.2.1": "f737191fd5c5b348b7f0a4412a3b86383f88c43e13b8217b63d4c8d90b9e798d", - "rails-8.0.2.1": "13ab95615569e74e364384b346b1d83e4795dbde83d9edf584e8768e8049b3ac", + "rackup-2.3.1": "6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868", + "rails-8.1.1": "877509b7aef309239978685883097d2c03e21383a50a3f78882cf9b3b5c136f7", "rails-dom-testing-2.3.0": "8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d", "rails-html-sanitizer-1.6.2": "35fce2ca8242da8775c83b6ba9c1bcaad6751d9eb73c1abaa8403475ab89a560", - "railties-8.0.2.1": "54e40e1771fc2878f572d5a4e076cddb057ba8d4d471f8b7d9bfc61bc1301d4c", - "rake-13.3.0": "96f5092d786ff412c62fde76f793cc0541bd84d2eb579caa529aa8a059934493", - "rdoc-6.14.2": "9fdd44df130f856ae70cc9a264dfd659b9b40de369b16581f4ab746e42439226", - "reline-0.6.2": "1dad26a6008872d59c8e05244b119347c9f2ddaf4a53dce97856cd5f30a02846", + "railties-8.1.1": "fb0c7038b147bea41bf6697fa443ff1c5c47d3bb1eedd9ecf1bceeb90efcb868", + "rake-13.3.1": "8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c", + "rdoc-7.0.3": "dfe3d0981d19b7bba71d9dbaeb57c9f4e3a7a4103162148a559c4fc687ea81f9", + "reline-0.6.3": "1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835", "securerandom-0.4.1": "cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1", - "stringio-3.1.7": "5b78b7cb242a315fb4fca61a8255d62ec438f58da2b90be66048546ade4507fa", "thor-1.4.0": "8763e822ccb0f1d7bee88cde131b19a65606657b847cc7b7b4b82e772bcd8a3d", - "timeout-0.4.3": "9509f079b2b55fe4236d79633bd75e34c1c1e7e3fb4b56cb5fda61f80a0fe30e", + "timeout-0.6.0": "6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af", + "tsort-0.2.0": "9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f", "tzinfo-2.0.6": "8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b", - "uri-1.0.3": "e9f2244608eea2f7bc357d954c65c910ce0399ca5e18a7a29207ac22d8767011", + "uri-1.1.1": "379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6", "useragent-0.16.11": "700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844", "websocket-driver-0.8.0": "ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962", "websocket-extensions-0.1.5": "1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241", - "zeitwerk-2.7.3": "b2e86b4a9b57d26ba68a15230dcc7fe6f040f06831ce64417b0621ad96ba3e85", + "zeitwerk-2.7.4": "2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b", }, gemfile = "//:Gemfile", gemfile_lock = "//:Gemfile.lock", ) ruby.bundle_fetch( name = "people_tracker_bundle", + # Exclude default gems with C extensions as listed at + # https://stdgems.org/ (e.g, https://stdgems.org/3.4.8 for + # Ruby 3.4.8) - these are pre-compiled in rv-ruby with portable + # dependencies. Bundled gems are NOT excluded because bundler needs to + # install them normally. + # + # IMPORTANT: These gems must be pinned in your Gemfile, as well. + excluded_gems = [ + "date", + "digest", + "etc", + "fcntl", + "fiddle", + "io-console", + "io-nonblock", + "io-wait", + "json", + "openssl", + "pathname", + "prism", + "psych", + "stringio", + "strscan", + "zlib", + ], gem_checksums = { - "actioncable-8.0.2.1": "6f1cb20db39fba28a93569e8d5dab42b2749d7ddd4baebb5bbecd4217e49d6a2", - "actionmailbox-8.0.2.1": "8ea8c6e31e448961c06fc1d6282775b32aff1c009f232d4564e07e54850a6cad", - "actionmailer-8.0.2.1": "0de14d8d04541eab130858cb2f0697266be42de1afe1104bc43d7998137ddb9c", - "actionpack-8.0.2.1": "61e7e11a31dbe5152ca57221788bdca42ef302c4cc53b4c8993d68dce8982b0a", - "actiontext-8.0.2.1": "0cc4b3b5cfb9d915c6697b05b013dad7f4eaf074d9989700b6a0a55cf620d6b8", - "actionview-8.0.2.1": "2ea6d20ccb0b7b84a221a940ac06853ce99235e4ecb4947815839c7c5ecbf347", - "activejob-8.0.2.1": "d6e5f2da07ec8efac13a38af1752416770dc74e95783f7b252506d707aa32b89", - "activemodel-8.0.2.1": "17bab6cdb86531844113df22f864480a89a276bf0318246e628f99e0ac077ec4", - "activerecord-8.0.2.1": "a6556e7bdd53f3889d18d2aa3a7ff115fd6c5e1463dd06f97fb88d06b58c6df1", - "activestorage-8.0.2.1": "43bb3d9e115471e201e6a66813810c1d15b607a321f29d62efdf9d90ffaf76f8", - "activesupport-8.0.2.1": "0405a76fd1ca989975d9ae00d46a4d3979bdf3817482d846b63affa84bd561c6", - "addressable-2.8.7": "462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232", + "actioncable-8.0.4": "aadb2bf2977b666cfeaa7dee66fd50e147559f78a8d55f6169e913502475e09f", + "actionmailbox-8.0.4": "ed0b634a502fb63d1ba01ae025772e9d0261b7ba12e66389c736fcf4635cd80f", + "actionmailer-8.0.4": "3b9270d8e19f0afb534b11c52f439937dc30028adcbbae2b244f3383ce75de4b", + "actionpack-8.0.4": "0364c7582f32c8f404725fa30d3f6853f834c5f4964afd4a072b848c8a23cddb", + "actiontext-8.0.4": "40b3970268ac29b865685456b2586df5052d068fd0cb04acb2291e737cea2340", + "actionview-8.0.4": "5bd3c41ee7a59e14cf062bb5e4ee53c9a253d12fc13c8754cae368012e1a1648", + "activejob-8.0.4": "cbc8a85d0e168cb90a5629c8a36fe2d08ba840103d3aed3eee0c7beb784fccce", + "activemodel-8.0.4": "8f4e4fac3cd104b1bf30419c3745206f6f724c0e2902a939b4113f4c90730dfd", + "activerecord-8.0.4": "bda32c171799e5ca5460447d3b7272ed14447244e2497abf2107f87fc44cbf32", + "activestorage-8.0.4": "47f312962fc898c1669f20cf7448d19668a5547f4a5f64e59a837d9d3f64a043", + "activesupport-8.0.4": "894a3a6c7733b5fae5a7df3acd76c4b563f38687df8a04fa3cbd25360f3fe95a", + "addressable-2.8.8": "7c13b8f9536cf6364c03b9d417c19986019e28f7c00ac8132da4eb0fe393b057", "ast-2.4.3": "954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383", "base64-0.3.0": "27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b", - "bcrypt-3.1.20": "8410f8c7b3ed54a3c00cd2456bf13917d695117f033218e2483b2e40b0784099", - "bcrypt_pbkdf-1.1.1": "2f9077dde837d1f0dd2eb0f9e5327c6871c68ebc8eba88870fb6b7956e1e2b13", - "benchmark-0.4.1": "d4ef40037bba27f03b28013e219b950b82bace296549ec15a78016552f8d2cce", - "bigdecimal-3.2.2": "39085f76b495eb39a79ce07af716f3a6829bc35eb44f2195e2753749f2fa5adc", + "bcrypt-3.1.21": "5964613d750a42c7ee5dc61f7b9336fb6caca429ba4ac9f2011609946e4a2dcf", + "bcrypt_pbkdf-1.1.2": "c2414c23ce66869b3eb9f643d6a3374d8322dfb5078125c82792304c10b94cf6", + "benchmark-0.5.0": "465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c", + "bigdecimal-4.0.1": "8b07d3d065a9f921c80ceaea7c9d4ae596697295b584c296fe599dd0ad01c4a7", "bindex-0.8.1": "7b1ecc9dc539ed8bccfc8cb4d2732046227b09d6f37582ff12e50a5047ceb17e", - "bootsnap-1.18.6": "0ae2393c1e911e38be0f24e9173e7be570c3650128251bf06240046f84a07d00", - "brakeman-7.1.0": "bbc708a75a53008490c8b9600b97fa85cb3d5a8818dd1560f18e0b89475d48af", + "bootsnap-1.20.1": "7ad62cda65c5157bcca0acfcc0ee11fcbb83d7d7a8a72d52ccd85e6ffc130b93", + "brakeman-7.1.2": "6b04927710a2e7d13a72248b5d404c633188e02417f28f3d853e4b6370d26dce", "builder-3.3.0": "497918d2f9dca528fdca4b88d84e4ef4387256d984b8154e9d5d3fe5a9c8835f", "cancancan-3.6.1": "975c1d5cbf58d5df48a9452a7f61ae3d254608cd87570402f5925a8864c56b62", "capybara-3.40.0": "42dba720578ea1ca65fd7a41d163dd368502c191804558f6e0f71b391054aeef", - "concurrent-ruby-1.3.5": "813b3e37aca6df2a21a3b9f1d497f8cbab24a2b94cab325bffe65ee0f6cbebc6", - "connection_pool-2.5.3": "cfd74a82b9b094d1ce30c4f1a346da23ee19dc8a062a16a85f58eab1ced4305b", + "concurrent-ruby-1.3.6": "6b56837e1e7e5292f9864f34b69c5a2cbc75c0cf5338f1ce9903d10fa762d5ab", + "connection_pool-3.0.2": "33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a", "crass-1.0.6": "dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d", - "date-3.4.1": "bf268e14ef7158009bfeaec40b5fa3c7271906e88b196d958a89d4b408abe64f", - "debug-1.11.0": "1425db64cfa0130c952684e3dc974985be201dd62899bf4bbe3f8b5d6cf1aef2", + "debug-1.11.1": "2e0b0ac6119f2207a6f8ac7d4a73ca8eb4e440f64da0a3136c30343146e952b6", "devise-4.9.4": "920042fe5e704c548aa4eb65ebdd65980b83ffae67feb32c697206bfd975a7f8", - "dotenv-3.1.8": "9e1176060ced581f8e6ce4384e91361817763a76e3c625c8bddc18b35bd392c3", + "dotenv-3.2.0": "e375b83121ea7ca4ce20f214740076129ab8514cd81378161f11c03853fe619d", "drb-2.2.3": "0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373", "ed25519-1.4.0": "16e97f5198689a154247169f3453ef4cfd3f7a47481fde0ae33206cdfdcac506", - "erb-5.0.2": "d30f258143d4300fb4ecf430042ac12970c9bb4b33c974a545b8f58c1ec26c0f", + "erb-6.0.1": "28ecdd99c5472aebd5674d6061e3c6b0a45c049578b071e5a52c2a7f13c197e5", "erubi-1.13.1": "a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9", - "et-orbi-1.3.0": "56716ce1c40f56412d6acb0721ebede6bd23b66525dab008a95d77df00c7d260", - "fugit-1.11.1": "e89485e7be22226d8e9c6da411664d0660284b4b1c08cacb540f505907869868", - "globalid-1.2.1": "70bf76711871f843dbba72beb8613229a49429d1866828476f9c9d6ccc327ce9", - "i18n-1.14.7": "ceba573f8138ff2c0915427f1fc5bdf4aa3ab8ae88c8ce255eb3ecf0a11a5d0f", + "et-orbi-1.4.0": "6c7e3c90779821f9e3b324c5e96fda9767f72995d6ae435b96678a4f3e2de8bc", + "fugit-1.12.1": "5898f478ede9b415f0804e42b8f3fd53f814bd85eebffceebdbc34e1107aaf68", + "globalid-1.3.0": "05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11", + "i18n-1.14.8": "285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5", "importmap-rails-2.2.2": "729f5b1092f832780829ade1d0b46c7e53d91c556f06da7254da2977e93fe614", - "io-console-0.8.1": "1e15440a6b2f67b6ea496df7c474ed62c860ad11237f29b3bd187f054b925fcb", - "irb-1.15.2": "222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba", + "irb-1.16.0": "2abe56c9ac947cdcb2f150572904ba798c1e93c890c256f8429981a7675b0806", "jbuilder-2.14.1": "4eb26376ff60ef100cb4fd6fd7533cd271f9998327e86adf20fd8c0e69fabb42", - "json-2.13.2": "02e1f118d434c6b230a64ffa5c8dee07e3ec96244335c392eaed39e1199dbb68", - "kamal-2.7.0": "66b863d967a740886a1817f7e181849c100dfcd4bdf1d8695d9c20828313b4f8", + "kamal-2.10.1": "53b7ecb4c33dd83b1aedfc7aacd1c059f835993258a552d70d584c6ce32b6340", "language_server-protocol-3.17.0.5": "fd1e39a51a28bf3eec959379985a72e296e9f9acfce46f6a79d31ca8760803cc", "lint_roller-1.1.0": "2c0c845b632a7d172cb849cc90c1bce937a28c5c8ccccb50dfd46a485003cc87", "logger-1.7.0": "196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203", - "loofah-2.24.1": "655a30842b70ec476410b347ab1cd2a5b92da46a19044357bbd9f401b009a337", - "mail-2.8.1": "ec3b9fadcf2b3755c78785cb17bc9a0ca9ee9857108a64b6f5cfc9c0b5bfc9ad", - "marcel-1.0.4": "0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4", + "loofah-2.25.0": "df5ed7ac3bac6a4ec802df3877ee5cc86d027299f8952e6243b3dac446b060e6", + "mail-2.9.0": "6fa6673ecd71c60c2d996260f9ee3dd387d4673b8169b502134659ece6d34941", + "marcel-1.1.0": "fdcfcfa33cc52e93c4308d40e4090a5d4ea279e160a7f6af988260fa970e0bee", "matrix-0.4.3": "a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b", "mini_mime-1.1.5": "8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef", - "minitest-5.25.5": "391b6c6cb43a4802bfb7c93af1ebe2ac66a210293f4a3fb7db36f2fc7dc2c756", + "minitest-5.27.0": "2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5", "msgpack-1.8.0": "e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732", - "net-imap-0.5.9": "d95905321e1bd9f294ffc7ff8697be218eee1ec96c8504c0960964d0a0be33fc", + "net-imap-0.6.2": "08caacad486853c61676cca0c0c47df93db02abc4a8239a8b67eb0981428acc6", "net-pop-0.1.2": "848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3", "net-protocol-0.2.2": "aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8", "net-scp-4.1.0": "a99b0b92a1e5d360b0de4ffbf2dc0c91531502d3d4f56c28b0139a7c093d1a5d", "net-sftp-4.0.0": "65bb91c859c2f93b09826757af11b69af931a3a9155050f50d1b06d384526364", "net-smtp-0.5.1": "ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736", "net-ssh-7.3.0": "172076c4b30ce56fb25a03961b0c4da14e1246426401b0f89cba1a3b54bf3ef0", - "nio4r-2.7.4": "d95dee68e0bb251b8ff90ac3423a511e3b784124e5db7ff5f4813a220ae73ca9", - "nokogiri-1.18.9-aarch64-linux-gnu": "5bcfdf7aa8d1056a7ad5e52e1adffc64ef53d12d0724fbc6f458a3af1a4b9e32", - "nokogiri-1.18.9-aarch64-linux-musl": "55e9e6ca46c4ad1715e313f407d8481d15be1e3b65d9f8e52ba1c124d01676a7", - "nokogiri-1.18.9-arm-linux-gnu": "fe611ae65880e445a9c0f650d52327db239f3488626df4173c05beafd161d46e", - "nokogiri-1.18.9-arm-linux-musl": "935605e14c0ba17da18d203922440bf6c0676c602659278d855d4622d756a324", - "nokogiri-1.18.9-arm64-darwin": "eea3f1f06463ff6309d3ff5b88033c4948d0da1ab3cc0a3a24f63c4d4a763979", - "nokogiri-1.18.9-x86_64-linux-gnu": "b52f5defedc53d14f71eeaaf990da66b077e1918a2e13088b6a96d0230f44360", - "nokogiri-1.18.9-x86_64-linux-musl": "e69359d6240c17e64cc9f43970d54f13bfc7b8cc516b819228f687e953425e69", + "nio4r-2.7.5": "6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1", + "nokogiri-1.19.0-aarch64-linux-gnu": "11a97ecc3c0e7e5edcf395720b10860ef493b768f6aa80c539573530bc933767", + "nokogiri-1.19.0-aarch64-linux-musl": "eb70507f5e01bc23dad9b8dbec2b36ad0e61d227b42d292835020ff754fb7ba9", + "nokogiri-1.19.0-arm-linux-gnu": "572a259026b2c8b7c161fdb6469fa2d0edd2b61cd599db4bbda93289abefbfe5", + "nokogiri-1.19.0-arm-linux-musl": "23ed90922f1a38aed555d3de4d058e90850c731c5b756d191b3dc8055948e73c", + "nokogiri-1.19.0-arm64-darwin": "0811dfd936d5f6dd3f6d32ef790568bf29b2b7bead9ba68866847b33c9cf5810", + "nokogiri-1.19.0-x86_64-linux-gnu": "f482b95c713d60031d48c44ce14562f8d2ce31e3a9e8dd0ccb131e9e5a68b58c", + "nokogiri-1.19.0-x86_64-linux-musl": "1c4ca6b381622420073ce6043443af1d321e8ed93cc18b08e2666e5bd02ffae4", "orm_adapter-0.5.0": "aa5d0be5d540cbb46d3a93e88061f4ece6a25f6e97d6a47122beb84fe595e9b9", "ostruct-0.6.3": "95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912", "parallel-1.27.0": "4ac151e1806b755fb4e2dc2332cbf0e54f2e24ba821ff2d3dcf86bf6dc4ae130", - "parser-3.3.9.0": "94d6929354b1a6e3e1f89d79d4d302cc8f5aa814431a6c9c7e0623335d7687f2", - "pp-0.6.2": "947ec3120c6f92195f8ee8aa25a7b2c5297bb106d83b41baa02983686577b6ff", + "parser-3.3.10.0": "ce3587fa5cc55a88c4ba5b2b37621b3329aadf5728f9eafa36bbd121462aabd6", + "pp-0.6.3": "2951d514450b93ccfeb1df7d021cae0da16e0a7f95ee1e2273719669d0ab9df6", "prettyprint-0.2.0": "2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193", - "prism-1.4.0": "dc0e3e00e93160213dc2a65519d9002a4a1e7b962db57d444cf1a71565bb703e", - "propshaft-1.2.1": "e9b91daf52f21152f851a59f8621af53ffb4dc4401f9b5f8fe16065190b98654", - "psych-5.2.6": "814328aa5dcb6d604d32126a20bc1cbcf05521a5b49dbb1a8b30a07e580f316e", - "public_suffix-6.0.2": "bfa7cd5108066f8c9602e0d6d4114999a5df5839a63149d3e8b0f9c1d3558394", - "puma-6.6.1": "b9b56e4a4ea75d1bfa6d9e1972ee2c9f43d0883f011826d914e8e37b3694ea1e", + "propshaft-1.3.1": "9acc664ef67e819ffa3d95bd7ad4c3623ea799110c5f4dee67fa7e583e74c392", + "public_suffix-7.0.0": "f7090b5beb0e56f9f10d79eed4d5fbe551b3b425da65877e075dad47a6a1b095", + "puma-7.1.0": "e45c10cb124f224d448c98db653a75499794edbecadc440ad616cf50f2fd49dd", "raabro-1.4.0": "d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882", "racc-1.8.1": "4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f", - "rack-3.2.0": "79cd21514d696c59d61fae02e62900f087aac2d053fdc77d45f4e91b94fb3612", + "rack-3.2.4": "5d74b6f75082a643f43c1e76b419c40f0e5527fcfee1e669ac1e6b73c0ccb6f6", "rack-session-2.1.1": "0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9", "rack-test-2.2.0": "005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463", - "rackup-2.2.1": "f737191fd5c5b348b7f0a4412a3b86383f88c43e13b8217b63d4c8d90b9e798d", - "rails-8.0.2.1": "13ab95615569e74e364384b346b1d83e4795dbde83d9edf584e8768e8049b3ac", + "rackup-2.3.1": "6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868", + "rails-8.0.4": "364494a32d2dc3f9d5c135d036ce47e7776684bc6add73f1037ac2b1007962db", "rails-dom-testing-2.3.0": "8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d", "rails-html-sanitizer-1.6.2": "35fce2ca8242da8775c83b6ba9c1bcaad6751d9eb73c1abaa8403475ab89a560", - "railties-8.0.2.1": "54e40e1771fc2878f572d5a4e076cddb057ba8d4d471f8b7d9bfc61bc1301d4c", + "railties-8.0.4": "8203d853dcffab4abcdd05c193f101676a92068075464694790f6d8f72d5cb47", "rainbow-3.1.1": "039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a", - "rake-13.3.0": "96f5092d786ff412c62fde76f793cc0541bd84d2eb579caa529aa8a059934493", - "rdoc-6.14.2": "9fdd44df130f856ae70cc9a264dfd659b9b40de369b16581f4ab746e42439226", - "regexp_parser-2.11.2": "5e5e9c1485ffd8de53ab1d2807affd81f617f72967dfc64fc75a69e2cbf0ff98", - "reline-0.6.2": "1dad26a6008872d59c8e05244b119347c9f2ddaf4a53dce97856cd5f30a02846", - "responders-3.1.1": "92f2a87e09028347368639cfb468f5fefa745cb0dc2377ef060db1cdd79a341a", - "rexml-3.4.1": "c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca", - "rubocop-1.79.2": "d3f42a7d197952c2a163719c5462fea827710a435b18bfb7070c6eedd2e90391", - "rubocop-ast-1.46.0": "0da7f6ad5b98614f89b74f11873c191059c823eae07d6ffd40a42a3338f2232b", - "rubocop-performance-1.25.0": "6f7d03568a770054117a78d0a8e191cefeffb703b382871ca7743831b1a52ec1", - "rubocop-rails-2.33.3": "848c011b58c1292f3066246c9eb18abf6ffcfbce28bc57c4ab888bbec79af74b", + "rake-13.3.1": "8c9e89d09f66a26a01264e7e3480ec0607f0c497a861ef16063604b1b08eb19c", + "rdoc-7.0.3": "dfe3d0981d19b7bba71d9dbaeb57c9f4e3a7a4103162148a559c4fc687ea81f9", + "regexp_parser-2.11.3": "ca13f381a173b7a93450e53459075c9b76a10433caadcb2f1180f2c741fc55a4", + "reline-0.6.3": "1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835", + "responders-3.2.0": "89c2d6ac0ae16f6458a11524cae4a8efdceba1a3baea164d28ee9046bd3df55a", + "rexml-3.4.4": "19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142", + "rubocop-1.82.1": "09f1a6a654a960eda767aebea33e47603080f8e9c9a3f019bf9b94c9cab5e273", + "rubocop-ast-1.48.0": "22df9bbf3f7a6eccde0fad54e68547ae1e2a704bf8719e7c83813a99c05d2e76", + "rubocop-performance-1.26.1": "cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834", + "rubocop-rails-2.34.2": "10ff246ee48b25ffeabddc5fee86d159d690bb3c7b9105755a9c7508a11d6e22", "rubocop-rails-omakase-1.1.0": "2af73ac8ee5852de2919abbd2618af9c15c19b512c4cfc1f9a5d3b6ef009109d", "ruby-progressbar-1.13.0": "80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33", - "rubyzip-3.0.1": "8bbbf32ff93db9a156ce2626820e748e2913352e6df80d764d0eea1ed1f5b8a7", + "rubyzip-3.2.2": "c0ed99385f0625415c8f05bcae33fe649ed2952894a95ff8b08f26ca57ea5b3c", "securerandom-0.4.1": "cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1", - "selenium-webdriver-4.35.0": "6fc920cec4b9e6263afeb4941289d8deb0853acbc49e0d6f7de91c86986d359b", + "selenium-webdriver-4.39.0": "984a1e63d39472eaf286bac3c6f1822fa7eea6eed9c07a66ce7b3bc5417ba826", "solid_cable-3.0.12": "a168a54731a455d5627af48d8441ea3b554b8c1f6e6cd6074109de493e6b0460", - "solid_cache-1.0.7": "58e690ccee057be7351f21b1940d5f9cf6bb132074316e70478e554a79e6a490", - "solid_queue-1.2.1": "7976b3690a08080ef63d1b11281f0b77398f7697dbeda0e2c5532682639d4b15", - "sqlite3-2.7.3-aarch64-linux-gnu": "00bab7e2ceb7e911b0a2c516bcb9ec0aa7ee57b9b231419e1788515319ac4317", - "sqlite3-2.7.3-aarch64-linux-musl": "035dca6c5bc0f45bb059f33cf774e96462563e460a2d5bd48972562bf3a78c8b", - "sqlite3-2.7.3-arm-linux-gnu": "c22a2593a8274cba5fc55be415cfddab3ff5d3275b5a78878daf214bf2a60db1", - "sqlite3-2.7.3-arm-linux-musl": "e735bea1c81eceff2e1b3388e6bccbcbf5c81405f7dbd69b5c80b3b4c4a92c89", - "sqlite3-2.7.3-arm64-darwin": "133772f4312a9d0fa0c16aab7c2abdda2ee93f47dded0f353a2981f7b9d2b9b4", - "sqlite3-2.7.3-x86_64-linux-gnu": "11b2612fddf56602d238be7a984fa0633e591edd034f7520747bc0927b7fa865", - "sqlite3-2.7.3-x86_64-linux-musl": "4307278661bbe0a619da7a5da25f4417f6826246ee7b4a56a5c10c3731d5256a", - "sshkit-1.24.0": "9597c1f984778ae9742f2dc839778d57a6a2efb868107046575c52ac7c628e6c", + "solid_cache-1.0.10": "bc05a2fb3ac78a6f43cbb5946679cf9db67dd30d22939ededc385cb93e120d41", + "solid_queue-1.2.4": "bb60f9552a969ac377d87601b0ff6a088f5e6f20b0cbbe3844a59d022cac0e4b", + "sqlite3-2.9.0-aarch64-linux-gnu": "cfe1e0216f46d7483839719bf827129151e6c680317b99d7b8fc1597a3e13473", + "sqlite3-2.9.0-aarch64-linux-musl": "56a35cb2d70779afc2ac191baf2c2148242285ecfed72f9b021218c5c4917913", + "sqlite3-2.9.0-arm-linux-gnu": "a19a21504b0d7c8c825fbbf37b358ae316b6bd0d0134c619874060b2eef05435", + "sqlite3-2.9.0-arm-linux-musl": "fca5b26197c70e3363115d3faaea34d7b2ad9c7f5fa8d8312e31b64e7556ee07", + "sqlite3-2.9.0-arm64-darwin": "a917bd9b84285766ff3300b7d79cd583f5a067594c8c1263e6441618c04a6ed3", + "sqlite3-2.9.0-x86_64-linux-gnu": "72fff9bd750070ba3af695511ba5f0e0a2d8a9206f84869640b3e99dfaf3d5a5", + "sqlite3-2.9.0-x86_64-linux-musl": "ef716ba7a66d7deb1ccc402ac3a6d7343da17fac862793b7f0be3d2917253c90", + "sshkit-1.25.0": "c8c6543cdb60f91f1d277306d585dd11b6a064cb44eab0972827e4311ff96744", "stimulus-rails-1.3.4": "765676ffa1f33af64ce026d26b48e8ffb2e0b94e0f50e9119e11d6107d67cb06", - "stringio-3.1.7": "5b78b7cb242a315fb4fca61a8255d62ec438f58da2b90be66048546ade4507fa", - "tailwindcss-rails-4.3.0": "1e7bf788b8724ba76fec7c43c151a8bca2a39f5d52484aef867f75322df3a6d5", - "tailwindcss-ruby-4.1.12": "cdb8ffbeedc8292e311c3a450d471e159c126998c562c8b89e608d679c1d7c7c", - "tailwindcss-ruby-4.1.12-aarch64-linux-gnu": "dd0b6f27047ba629fd2b61a03af1b4386371f864e98448484174769ec9f525d2", - "tailwindcss-ruby-4.1.12-aarch64-linux-musl": "caf51ec991fe46c296e3c007ead867f94d7f35a8b818754d242d4e5e7307b69a", - "tailwindcss-ruby-4.1.12-arm64-darwin": "f3abed1f9d8746472be9e1b41b34ee161c7170052f7faf77e919f403aa53c520", - "tailwindcss-ruby-4.1.12-x86_64-linux-gnu": "065315e6083bd4b1bf2512fc4aebe737ea5e5063a77a9c4e7f1b864fb8d8c481", - "tailwindcss-ruby-4.1.12-x86_64-linux-musl": "510c412cd7b71db0f14e42fa124d4d17fbf18e4bb693602611eba4ea93cdb738", + "tailwindcss-rails-4.4.0": "efa2961351a52acebe616e645a81a30bb4f27fde46cc06ce7688d1cd1131e916", + "tailwindcss-ruby-4.1.18": "b62fad5b00494e92987ee319dfb5c5ad272f0ed93649963d62f08d2ba0f03fa7", + "tailwindcss-ruby-4.1.18-aarch64-linux-gnu": "e10f9560bccddbb4955fd535b3bcc8c7071a7df07404dd473a23fa791ec4e46b", + "tailwindcss-ruby-4.1.18-aarch64-linux-musl": "3c8426674718a2c98a0649c825ac0b3286ff52acd0b4052d7d19126cd74904f3", + "tailwindcss-ruby-4.1.18-arm64-darwin": "f940531d5a030c566d3d616004235bcd4c361abdd328f7d6c7e3a953a32e0155", + "tailwindcss-ruby-4.1.18-x86_64-linux-gnu": "e0a2220163246fe0126c5c5bafb95bc6206e7d21fce2a2878fd9c9a359137534", + "tailwindcss-ruby-4.1.18-x86_64-linux-musl": "d957cf545b09d2db7eb6267450cc1fc589e126524066537a0c4d5b99d701f4b2", "thor-1.4.0": "8763e822ccb0f1d7bee88cde131b19a65606657b847cc7b7b4b82e772bcd8a3d", - "thruster-0.1.15": "fe3396aa7158c32f499d8b7df07aefc0070050666a171788aec412705b438eab", - "thruster-0.1.15-aarch64-linux": "bd55cf486e14ce0484c86a10b04a470da0463efc0dea2f495e49c0ac40d085df", - "thruster-0.1.15-arm64-darwin": "d340f3b361054123646912dd1833c8929732e1194d8f4d0305dcfb0e0017b289", - "thruster-0.1.15-x86_64-linux": "a979a3e493c111940723c08c3b7b3b6f95c5d44af26fe65b6edae1f96fc0deda", - "timeout-0.4.3": "9509f079b2b55fe4236d79633bd75e34c1c1e7e3fb4b56cb5fda61f80a0fe30e", - "turbo-rails-2.0.16": "d24e1b60f0c575b3549ecda967e5391027143f8220d837ed792c8d48ea0ea38d", + "thruster-0.1.17": "6f3f1de43e22f0162d81cbc363f45ee42a1b8460213856c1a899cbf0d3297235", + "thruster-0.1.17-aarch64-linux": "1b3a34b2814185c2aeaf835b5ecff5348cdcf8e77809f7a092d46e4b962a16ba", + "thruster-0.1.17-arm64-darwin": "75da66fc4a0f012f9a317f6362f786a3fa953879a3fa6bed8deeaebf1c1d66ec", + "thruster-0.1.17-x86_64-linux": "77b8f335075bd4ece7631dc84a19a710a1e6e7102cbce147b165b45851bdfcd3", + "timeout-0.6.0": "6d722ad619f96ee383a0c557ec6eb8c4ecb08af3af62098a0be5057bf00de1af", + "tsort-0.2.0": "9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f", + "turbo-rails-2.0.20": "cbcbb4dd3ce59f6471c9f911b1655b2c721998cc8303959d982da347f374ea95", "tzinfo-2.0.6": "8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b", - "unicode-display_width-3.1.5": "bf566817855ee7ee3adcf7bace0d5906cb14401417db59193f8a5fcedf02dd4e", - "unicode-emoji-4.0.4": "2c2c4ef7f353e5809497126285a50b23056cc6e61b64433764a35eff6c36532a", - "uri-1.0.3": "e9f2244608eea2f7bc357d954c65c910ce0399ca5e18a7a29207ac22d8767011", + "unicode-display_width-3.2.0": "0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42", + "unicode-emoji-4.2.0": "519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f", + "uri-1.1.1": "379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6", "useragent-0.16.11": "700e6413ad4bb954bb63547fa098dddf7b0ebe75b40cc6f93b8d54255b173844", "warden-1.2.9": "46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0", "web-console-4.2.1": "e7bcf37a10ea2b4ec4281649d1cee461b32232d0a447e82c786e6841fd22fe20", @@ -255,7 +304,7 @@ ruby.bundle_fetch( "websocket-driver-0.8.0": "ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962", "websocket-extensions-0.1.5": "1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241", "xpath-3.2.0": "6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e", - "zeitwerk-2.7.3": "b2e86b4a9b57d26ba68a15230dcc7fe6f040f06831ce64417b0621ad96ba3e85", + "zeitwerk-2.7.4": "2bef90f356bdafe9a6c2bd32bcd804f83a4f9b8bc27f3600fff051eb3edcec8b", }, gemfile = "//people_tracker:Gemfile", gemfile_lock = "//people_tracker:Gemfile.lock", diff --git a/examples/rails/people_tracker/Gemfile b/examples/rails/people_tracker/Gemfile index 181c4b44..a7e892e7 100644 --- a/examples/rails/people_tracker/Gemfile +++ b/examples/rails/people_tracker/Gemfile @@ -2,6 +2,10 @@ source "https://rubygems.org" # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" gem "rails", "~> 8.0.2", ">= 8.0.2.1" + +# Pin minitest to 5.x - minitest 6.x has breaking API changes incompatible with Rails 8.0.x +gem "minitest", "~> 5.25" + # The modern asset pipeline for Rails [https://github.com/rails/propshaft] gem "propshaft" # Use sqlite3 as the database for Active Record @@ -23,7 +27,7 @@ gem "jbuilder" # gem "bcrypt", "~> 3.1.7" # Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem "tzinfo-data", platforms: %i[ windows jruby ] +gem "tzinfo-data", platforms: %i[windows jruby] # Use the database-backed adapters for Rails.cache, Active Job, and Action Cable gem "solid_cache" @@ -44,7 +48,7 @@ gem "thruster", require: false group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem - gem "debug", platforms: %i[ mri windows ], require: "debug/prelude" + gem "debug", platforms: %i[mri windows], require: "debug/prelude" # Static analysis for security vulnerabilities [https://brakemanscanner.org/] gem "brakeman", require: false @@ -67,3 +71,27 @@ end gem "cancancan", "~> 3.6" gem "devise", "~> 4.9" + +# Pin default gems with C extensions to versions bundled with rv-ruby Ruby +# binaries. The list can be found at https://stdgems.org/ (e.g, +# https://stdgems.org/3.4.8 for Ruby 3.4.8). These gems should NOT be +# downloaded - they're pre-compiled in rv-ruby with portable dependencies. +# +# IMPORTANT: These gems must be listed in the excluded_gems list in the +# bundle_fetch configured in your MODULE.bazel file. +gem "date", "3.4.1" +gem "digest", "3.2.0" +gem "etc", "1.4.6" +gem "fcntl", "1.2.0" +gem "fiddle", "1.1.6" +gem "io-console", "0.8.1" +gem "io-nonblock", "0.3.2" +gem "io-wait", "0.3.2" +gem "json", "2.9.1" +gem "openssl", "3.3.1" +gem "pathname", "0.4.0" +gem "prism", "1.5.2" +gem "psych", "5.2.2" +gem "stringio", "3.1.2" +gem "strscan", "3.1.2" +gem "zlib", "3.2.1" diff --git a/examples/rails/people_tracker/Gemfile.lock b/examples/rails/people_tracker/Gemfile.lock index e8c4881c..fa282793 100644 --- a/examples/rails/people_tracker/Gemfile.lock +++ b/examples/rails/people_tracker/Gemfile.lock @@ -1,29 +1,29 @@ GEM remote: https://rubygems.org/ specs: - actioncable (8.0.2.1) - actionpack (= 8.0.2.1) - activesupport (= 8.0.2.1) + actioncable (8.0.4) + actionpack (= 8.0.4) + activesupport (= 8.0.4) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.2.1) - actionpack (= 8.0.2.1) - activejob (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionmailbox (8.0.4) + actionpack (= 8.0.4) + activejob (= 8.0.4) + activerecord (= 8.0.4) + activestorage (= 8.0.4) + activesupport (= 8.0.4) mail (>= 2.8.0) - actionmailer (8.0.2.1) - actionpack (= 8.0.2.1) - actionview (= 8.0.2.1) - activejob (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionmailer (8.0.4) + actionpack (= 8.0.4) + actionview (= 8.0.4) + activejob (= 8.0.4) + activesupport (= 8.0.4) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.2.1) - actionview (= 8.0.2.1) - activesupport (= 8.0.2.1) + actionpack (8.0.4) + actionview (= 8.0.4) + activesupport (= 8.0.4) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -31,35 +31,35 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.2.1) - actionpack (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + actiontext (8.0.4) + actionpack (= 8.0.4) + activerecord (= 8.0.4) + activestorage (= 8.0.4) + activesupport (= 8.0.4) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.2.1) - activesupport (= 8.0.2.1) + actionview (8.0.4) + activesupport (= 8.0.4) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.2.1) - activesupport (= 8.0.2.1) + activejob (8.0.4) + activesupport (= 8.0.4) globalid (>= 0.3.6) - activemodel (8.0.2.1) - activesupport (= 8.0.2.1) - activerecord (8.0.2.1) - activemodel (= 8.0.2.1) - activesupport (= 8.0.2.1) + activemodel (8.0.4) + activesupport (= 8.0.4) + activerecord (8.0.4) + activemodel (= 8.0.4) + activesupport (= 8.0.4) timeout (>= 0.4.0) - activestorage (8.0.2.1) - actionpack (= 8.0.2.1) - activejob (= 8.0.2.1) - activerecord (= 8.0.2.1) - activesupport (= 8.0.2.1) + activestorage (8.0.4) + actionpack (= 8.0.4) + activejob (= 8.0.4) + activerecord (= 8.0.4) + activesupport (= 8.0.4) marcel (~> 1.0) - activesupport (8.0.2.1) + activesupport (8.0.4) base64 benchmark (>= 0.3) bigdecimal @@ -72,18 +72,18 @@ GEM securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) uri (>= 0.13.1) - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) ast (2.4.3) base64 (0.3.0) - bcrypt (3.1.20) - bcrypt_pbkdf (1.1.1) - benchmark (0.4.1) - bigdecimal (3.2.2) + bcrypt (3.1.21) + bcrypt_pbkdf (1.1.2) + benchmark (0.5.0) + bigdecimal (4.0.1) bindex (0.8.1) - bootsnap (1.18.6) + bootsnap (1.20.1) msgpack (~> 1.2) - brakeman (7.1.0) + brakeman (7.1.2) racc builder (3.3.0) cancancan (3.6.1) @@ -96,11 +96,11 @@ GEM rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - concurrent-ruby (1.3.5) - connection_pool (2.5.3) + concurrent-ruby (1.3.6) + connection_pool (3.0.2) crass (1.0.6) date (3.4.1) - debug (1.11.0) + debug (1.11.1) irb (~> 1.10) reline (>= 0.3.8) devise (4.9.4) @@ -109,34 +109,40 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - dotenv (3.1.8) + digest (3.2.0) + dotenv (3.2.0) drb (2.2.3) ed25519 (1.4.0) - erb (5.0.2) + erb (6.0.1) erubi (1.13.1) - et-orbi (1.3.0) + et-orbi (1.4.0) tzinfo - fugit (1.11.1) - et-orbi (~> 1, >= 1.2.11) + etc (1.4.6) + fcntl (1.2.0) + fiddle (1.1.6) + fugit (1.12.1) + et-orbi (~> 1.4) raabro (~> 1.4) - globalid (1.2.1) + globalid (1.3.0) activesupport (>= 6.1) - i18n (1.14.7) + i18n (1.14.8) concurrent-ruby (~> 1.0) importmap-rails (2.2.2) actionpack (>= 6.0.0) activesupport (>= 6.0.0) railties (>= 6.0.0) io-console (0.8.1) - irb (1.15.2) + io-nonblock (0.3.2) + io-wait (0.3.2) + irb (1.16.0) pp (>= 0.6.0) rdoc (>= 4.0.0) reline (>= 0.4.2) jbuilder (2.14.1) actionview (>= 7.0.0) activesupport (>= 7.0.0) - json (2.13.2) - kamal (2.7.0) + json (2.9.1) + kamal (2.10.1) activesupport (>= 7.0) base64 (~> 0.2) bcrypt_pbkdf (~> 1.0) @@ -150,20 +156,21 @@ GEM language_server-protocol (3.17.0.5) lint_roller (1.1.0) logger (1.7.0) - loofah (2.24.1) + loofah (2.25.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) - mail (2.8.1) + mail (2.9.0) + logger mini_mime (>= 0.1.1) net-imap net-pop net-smtp - marcel (1.0.4) + marcel (1.1.0) matrix (0.4.3) mini_mime (1.1.5) - minitest (5.25.5) + minitest (5.27.0) msgpack (1.8.0) - net-imap (0.5.9) + net-imap (0.6.2) date net-protocol net-pop (0.1.2) @@ -177,65 +184,67 @@ GEM net-smtp (0.5.1) net-protocol net-ssh (7.3.0) - nio4r (2.7.4) - nokogiri (1.18.9-aarch64-linux-gnu) + nio4r (2.7.5) + nokogiri (1.19.0-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-aarch64-linux-musl) + nokogiri (1.19.0-aarch64-linux-musl) racc (~> 1.4) - nokogiri (1.18.9-arm-linux-gnu) + nokogiri (1.19.0-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-arm-linux-musl) + nokogiri (1.19.0-arm-linux-musl) racc (~> 1.4) - nokogiri (1.18.9-arm64-darwin) + nokogiri (1.19.0-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-gnu) + nokogiri (1.19.0-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-musl) + nokogiri (1.19.0-x86_64-linux-musl) racc (~> 1.4) + openssl (3.3.1) orm_adapter (0.5.0) ostruct (0.6.3) parallel (1.27.0) - parser (3.3.9.0) + parser (3.3.10.0) ast (~> 2.4.1) racc - pp (0.6.2) + pathname (0.4.0) + pp (0.6.3) prettyprint prettyprint (0.2.0) - prism (1.4.0) - propshaft (1.2.1) + prism (1.5.2) + propshaft (1.3.1) actionpack (>= 7.0.0) activesupport (>= 7.0.0) rack - psych (5.2.6) + psych (5.2.2) date stringio - public_suffix (6.0.2) - puma (6.6.1) + public_suffix (7.0.0) + puma (7.1.0) nio4r (~> 2.0) raabro (1.4.0) racc (1.8.1) - rack (3.2.0) + rack (3.2.4) rack-session (2.1.1) base64 (>= 0.1.0) rack (>= 3.0.0) rack-test (2.2.0) rack (>= 1.3) - rackup (2.2.1) + rackup (2.3.1) rack (>= 3) - rails (8.0.2.1) - actioncable (= 8.0.2.1) - actionmailbox (= 8.0.2.1) - actionmailer (= 8.0.2.1) - actionpack (= 8.0.2.1) - actiontext (= 8.0.2.1) - actionview (= 8.0.2.1) - activejob (= 8.0.2.1) - activemodel (= 8.0.2.1) - activerecord (= 8.0.2.1) - activestorage (= 8.0.2.1) - activesupport (= 8.0.2.1) + rails (8.0.4) + actioncable (= 8.0.4) + actionmailbox (= 8.0.4) + actionmailer (= 8.0.4) + actionpack (= 8.0.4) + actiontext (= 8.0.4) + actionview (= 8.0.4) + activejob (= 8.0.4) + activemodel (= 8.0.4) + activerecord (= 8.0.4) + activestorage (= 8.0.4) + activesupport (= 8.0.4) bundler (>= 1.15.0) - railties (= 8.0.2.1) + railties (= 8.0.4) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -243,27 +252,29 @@ GEM rails-html-sanitizer (1.6.2) loofah (~> 2.21) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.2.1) - actionpack (= 8.0.2.1) - activesupport (= 8.0.2.1) + railties (8.0.4) + actionpack (= 8.0.4) + activesupport (= 8.0.4) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.3.0) - rdoc (6.14.2) + rake (13.3.1) + rdoc (7.0.3) erb psych (>= 4.0.0) - regexp_parser (2.11.2) - reline (0.6.2) + tsort + regexp_parser (2.11.3) + reline (0.6.3) io-console (~> 0.5) - responders (3.1.1) - actionpack (>= 5.2) - railties (>= 5.2) - rexml (3.4.1) - rubocop (1.79.2) + responders (3.2.0) + actionpack (>= 7.0) + railties (>= 7.0) + rexml (3.4.4) + rubocop (1.82.1) json (~> 2.3) language_server-protocol (~> 3.17.0.2) lint_roller (~> 1.1.0) @@ -271,17 +282,17 @@ GEM parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 2.9.3, < 3.0) - rubocop-ast (>= 1.46.0, < 2.0) + rubocop-ast (>= 1.48.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.46.0) + rubocop-ast (1.48.0) parser (>= 3.3.7.2) prism (~> 1.4) - rubocop-performance (1.25.0) + rubocop-performance (1.26.1) lint_roller (~> 1.1) rubocop (>= 1.75.0, < 2.0) - rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rails (2.33.3) + rubocop-ast (>= 1.47.1, < 2.0) + rubocop-rails (2.34.2) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) @@ -292,9 +303,9 @@ GEM rubocop-performance (>= 1.24) rubocop-rails (>= 2.30) ruby-progressbar (1.13.0) - rubyzip (3.0.1) + rubyzip (3.2.2) securerandom (0.4.1) - selenium-webdriver (4.35.0) + selenium-webdriver (4.39.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) @@ -305,25 +316,25 @@ GEM activejob (>= 7.2) activerecord (>= 7.2) railties (>= 7.2) - solid_cache (1.0.7) + solid_cache (1.0.10) activejob (>= 7.2) activerecord (>= 7.2) railties (>= 7.2) - solid_queue (1.2.1) + solid_queue (1.2.4) activejob (>= 7.1) activerecord (>= 7.1) concurrent-ruby (>= 1.3.1) - fugit (~> 1.11.0) + fugit (~> 1.11) railties (>= 7.1) thor (>= 1.3.1) - sqlite3 (2.7.3-aarch64-linux-gnu) - sqlite3 (2.7.3-aarch64-linux-musl) - sqlite3 (2.7.3-arm-linux-gnu) - sqlite3 (2.7.3-arm-linux-musl) - sqlite3 (2.7.3-arm64-darwin) - sqlite3 (2.7.3-x86_64-linux-gnu) - sqlite3 (2.7.3-x86_64-linux-musl) - sshkit (1.24.0) + sqlite3 (2.9.0-aarch64-linux-gnu) + sqlite3 (2.9.0-aarch64-linux-musl) + sqlite3 (2.9.0-arm-linux-gnu) + sqlite3 (2.9.0-arm-linux-musl) + sqlite3 (2.9.0-arm64-darwin) + sqlite3 (2.9.0-x86_64-linux-gnu) + sqlite3 (2.9.0-x86_64-linux-musl) + sshkit (1.25.0) base64 logger net-scp (>= 1.1.2) @@ -332,31 +343,33 @@ GEM ostruct stimulus-rails (1.3.4) railties (>= 6.0.0) - stringio (3.1.7) - tailwindcss-rails (4.3.0) + stringio (3.1.2) + strscan (3.1.2) + tailwindcss-rails (4.4.0) railties (>= 7.0.0) tailwindcss-ruby (~> 4.0) - tailwindcss-ruby (4.1.12) - tailwindcss-ruby (4.1.12-aarch64-linux-gnu) - tailwindcss-ruby (4.1.12-aarch64-linux-musl) - tailwindcss-ruby (4.1.12-arm64-darwin) - tailwindcss-ruby (4.1.12-x86_64-linux-gnu) - tailwindcss-ruby (4.1.12-x86_64-linux-musl) + tailwindcss-ruby (4.1.18) + tailwindcss-ruby (4.1.18-aarch64-linux-gnu) + tailwindcss-ruby (4.1.18-aarch64-linux-musl) + tailwindcss-ruby (4.1.18-arm64-darwin) + tailwindcss-ruby (4.1.18-x86_64-linux-gnu) + tailwindcss-ruby (4.1.18-x86_64-linux-musl) thor (1.4.0) - thruster (0.1.15) - thruster (0.1.15-aarch64-linux) - thruster (0.1.15-arm64-darwin) - thruster (0.1.15-x86_64-linux) - timeout (0.4.3) - turbo-rails (2.0.16) + thruster (0.1.17) + thruster (0.1.17-aarch64-linux) + thruster (0.1.17-arm64-darwin) + thruster (0.1.17-x86_64-linux) + timeout (0.6.0) + tsort (0.2.0) + turbo-rails (2.0.20) actionpack (>= 7.1.0) railties (>= 7.1.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - unicode-display_width (3.1.5) - unicode-emoji (~> 4.0, >= 4.0.4) - unicode-emoji (4.0.4) - uri (1.0.3) + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.2.0) + uri (1.1.1) useragent (0.16.11) warden (1.2.9) rack (>= 2.0.9) @@ -372,7 +385,8 @@ GEM websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.7.3) + zeitwerk (2.7.4) + zlib (3.2.1) PLATFORMS aarch64-linux @@ -380,6 +394,7 @@ PLATFORMS aarch64-linux-musl arm-linux-gnu arm-linux-musl + arm64-darwin-23 arm64-darwin-24 arm64-darwin-25 x86_64-linux @@ -391,12 +406,26 @@ DEPENDENCIES brakeman cancancan (~> 3.6) capybara + date (= 3.4.1) debug devise (~> 4.9) + digest (= 3.2.0) + etc (= 1.4.6) + fcntl (= 1.2.0) + fiddle (= 1.1.6) importmap-rails + io-console (= 0.8.1) + io-nonblock (= 0.3.2) + io-wait (= 0.3.2) jbuilder + json (= 2.9.1) kamal + minitest (~> 5.25) + openssl (= 3.3.1) + pathname (= 0.4.0) + prism (= 1.5.2) propshaft + psych (= 5.2.2) puma (>= 5.0) rails (~> 8.0.2, >= 8.0.2.1) rubocop-rails-omakase @@ -406,11 +435,14 @@ DEPENDENCIES solid_queue sqlite3 (>= 2.1) stimulus-rails + stringio (= 3.1.2) + strscan (= 3.1.2) tailwindcss-rails thruster turbo-rails tzinfo-data web-console + zlib (= 3.2.1) BUNDLED WITH 2.6.9 diff --git a/ruby/extensions.bzl b/ruby/extensions.bzl index a5507536..ad5b9e38 100644 --- a/ruby/extensions.bzl +++ b/ruby/extensions.bzl @@ -22,6 +22,7 @@ ruby_bundle_fetch = tag_class(attrs = { "gem_checksums": attr.string_dict(), "bundler_remote": attr.string(default = "https://rubygems.org/"), "bundler_checksums": attr.string_dict(), + "excluded_gems": attr.string_list(default = []), }) ruby_toolchain = tag_class(attrs = { @@ -30,6 +31,20 @@ ruby_toolchain = tag_class(attrs = { "version_file": attr.label(doc = "File to read Ruby version from."), "ruby_build_version": attr.string(doc = "Version of ruby-build to use.", default = RUBY_BUILD_VERSION), "msys2_packages": attr.string_list(doc = "Extra MSYS2 packages to install.", default = ["libyaml"]), + "rv_version": attr.string( + doc = """\ +rv-ruby release version (e.g., '20251225'). When set, downloads prebuilt Ruby \ +from rv-ruby instead of compiling via ruby-build.\ +""", + default = "", + ), + "rv_checksums": attr.string_dict( + doc = """\ +Platform checksums for rv-ruby downloads. Keys: linux-x86_64, linux-arm64, \ +macos-arm64, macos-x86_64.\ +""", + default = {}, + ), }) def _ruby_module_extension(module_ctx): @@ -60,6 +75,7 @@ def _ruby_module_extension(module_ctx): gem_checksums = bundle_fetch.gem_checksums, bundler_remote = bundle_fetch.bundler_remote, bundler_checksums = bundle_fetch.bundler_checksums, + excluded_gems = bundle_fetch.excluded_gems, ) if module_ctx.is_dev_dependency(bundle_fetch): direct_dev_dep_names.append(bundle_fetch.name) @@ -88,6 +104,8 @@ def _ruby_module_extension(module_ctx): toolchain.version_file, toolchain.msys2_packages, toolchain.ruby_build_version, + toolchain.rv_version, + toolchain.rv_checksums, ) if module_ctx.is_dev_dependency(toolchain): direct_dev_dep_names.append(toolchain.name) @@ -96,13 +114,23 @@ def _ruby_module_extension(module_ctx): direct_dep_names.append(toolchain.name) direct_dep_names.append("%s_toolchains" % toolchain.name) - for name, (version, version_file, msys2_packages, ruby_build_version) in registrations.items(): + for name, config in registrations.items(): + ( + version, + version_file, + msys2_packages, + ruby_build_version, + rv_version, + rv_checksums, + ) = config rb_register_toolchains( name = name, version = version, version_file = version_file, msys2_packages = msys2_packages, ruby_build_version = ruby_build_version, + rv_version = rv_version, + rv_checksums = rv_checksums, register = False, ) diff --git a/ruby/private/bundle_fetch.bzl b/ruby/private/bundle_fetch.bzl index b1aa830d..21591894 100644 --- a/ruby/private/bundle_fetch.bzl +++ b/ruby/private/bundle_fetch.bzl @@ -171,7 +171,12 @@ def _rb_bundle_fetch_impl(repository_ctx): repository_name = _normalize_bzlmod_repository_name(repository_ctx.name) # Fetch gems and expose them as `rb_gem()` targets. + # Skip gems that are in the excluded_gems list (e.g., default gems bundled with Ruby). + excluded_gems = {name: True for name in repository_ctx.attr.excluded_gems} for gem in gemfile_lock.remote_packages: + if gem.name in excluded_gems: + # Skip downloading this gem - it's bundled with Ruby + continue gem_checksums[gem.full_name] = _download_gem( repository_ctx, gem, @@ -301,6 +306,13 @@ rb_bundle_fetch = repository_rule( default = {}, doc = "SHA-256 checksums for remote gems. Keys are gem names (e.g. foobar-1.2.3), values are SHA-256 checksums.", ), + "excluded_gems": attr.string_list( + default = [], + doc = """\ +List of gem names to exclude from downloading. Useful for default gems bundled \ +with Ruby (e.g., psych, stringio).\ +""", + ), "ruby": attr.label( doc = "Override Ruby toolchain to use for installation.", providers = [platform_common.ToolchainInfo], diff --git a/ruby/private/download.bzl b/ruby/private/download.bzl index 60924dc4..d782245e 100644 --- a/ruby/private/download.bzl +++ b/ruby/private/download.bzl @@ -5,6 +5,15 @@ RUBY_BUILD_VERSION = "20250925" _JRUBY_BINARY_URL = "https://repo1.maven.org/maven2/org/jruby/jruby-dist/{version}/jruby-dist-{version}-bin.tar.gz" _RUBY_BUILD_URL = "https://github.com/rbenv/ruby-build/archive/refs/tags/v{version}.tar.gz" _RUBY_INSTALLER_URL = "https://github.com/oneclick/rubyinstaller2/releases/download/RubyInstaller-{version}-1/rubyinstaller-devkit-{version}-1-x64.exe" +_RV_RUBY_URL = "https://github.com/spinel-coop/rv-ruby/releases/download/{release}/ruby-{version}.{platform}.tar.gz" + +# Map Bazel OS/arch to rv-ruby artifact naming +_RV_RUBY_PLATFORMS = { + "linux-x86_64": "x86_64_linux", + "linux-arm64": "arm64_linux", + "macos-arm64": "arm64_sonoma", + "macos-x86_64": "ventura", +} # Maintained JRuby versions integrity from https://repo1.maven.org/maven2/org/jruby/jruby-dist. # Run the following script to update the list: @@ -95,7 +104,27 @@ def _rb_download_impl(repository_ctx): env = {} ruby_binary_name = "ruby" gem_binary_name = "gem" - if version.startswith("jruby"): + + # Handle rv-ruby: only supported on Linux and macOS + use_rv_ruby = False + if repository_ctx.attr.rv_version: + if repository_ctx.os.name.startswith("windows"): + # buildifier: disable=print + print("""\ +WARNING: rv-ruby is not supported on Windows. Falling back to RubyInstaller \ +for Ruby %s.\ +""" % version) + else: + use_rv_ruby = True + + if use_rv_ruby: + _install_rv_ruby( + repository_ctx, + repository_ctx.attr.rv_version, + version, + repository_ctx.attr.rv_checksums, + ) + elif version.startswith("jruby"): _install_jruby(repository_ctx, version) engine = "jruby" @@ -260,6 +289,79 @@ def _install_via_ruby_build(repository_ctx, version): repository_ctx.delete("ruby-build") +def _install_rv_ruby(repository_ctx, rv_version, ruby_version, checksums): + """Install prebuilt Ruby from rv-ruby project. + + Args: + repository_ctx: Repository context + rv_version: rv-ruby release version (e.g., "20251225") + ruby_version: Ruby version (e.g., "3.4.8") + checksums: Dict mapping platform keys to SHA256 checksums + """ + + # Detect platform + os_name = repository_ctx.os.name + if os_name.startswith("mac"): + os_key = "macos" + elif os_name.startswith("linux"): + os_key = "linux" + else: + os_key = os_name + + # Detect architecture + arch = repository_ctx.os.arch + if arch == "amd64": + arch_key = "x86_64" + elif arch in ["arm64", "aarch64"]: + arch_key = "arm64" + else: + arch_key = arch + + platform_key = os_key + "-" + arch_key + + # Validate platform is supported by rv-ruby + if platform_key not in _RV_RUBY_PLATFORMS: + supported = ", ".join(sorted(_RV_RUBY_PLATFORMS.keys())) + fail(""" +rv-ruby does not support platform: {platform} +Detected OS: {os} ({os_raw}) +Detected architecture: {arch} ({arch_raw}) +Supported platforms: {supported} +""".format( + platform = platform_key, + os = os_key, + os_raw = os_name, + arch = arch_key, + arch_raw = arch, + supported = supported, + )) + + rv_platform = _RV_RUBY_PLATFORMS[platform_key] + + # Get checksum if provided (Bazel will warn if not provided) + kwargs = {} + if platform_key in checksums: + kwargs["sha256"] = checksums[platform_key] + + repository_ctx.report_progress( + "Downloading rv-ruby %s for %s" % (ruby_version, platform_key), + ) + + # rv-ruby releases have a nested directory structure: + # rv-ruby@//bin/ruby + # rv-ruby@//lib/... + # Strip the outer directories to get the Ruby installation at dist/ + repository_ctx.download_and_extract( + url = _RV_RUBY_URL.format( + release = rv_version, + version = ruby_version, + platform = rv_platform, + ), + output = "dist/", + stripPrefix = "rv-ruby@{v}/{v}".format(v = ruby_version), + **kwargs + ) + def _symlink_system_ruby(repository_ctx): _symlink_system_ruby_dir("bindir", repository_ctx) _symlink_system_ruby_dir("libdir", repository_ctx) @@ -314,6 +416,24 @@ to install. You normally don't need to change this, unless `version` you pass is which isn't available in this ruby-build yet. """, ), + "rv_version": attr.string( + default = "", + doc = """ +rv-ruby release version (e.g., "20251225"). + +When set, downloads prebuilt Ruby from rv-ruby instead of compiling via ruby-build. +The Ruby version is still read from the `version` or `version_file` attribute. +""", + ), + "rv_checksums": attr.string_dict( + default = {}, + doc = """ +Platform checksums for rv-ruby downloads. + +Keys: linux-x86_64, linux-arm64, macos-arm64, macos-x86_64. +Values: SHA256 checksums for the corresponding platform. +""", + ), "_build_tpl": attr.label( allow_single_file = True, default = "@rules_ruby//:ruby/private/download/BUILD.tpl", diff --git a/ruby/private/toolchain.bzl b/ruby/private/toolchain.bzl index f89beeb7..0206f291 100644 --- a/ruby/private/toolchain.bzl +++ b/ruby/private/toolchain.bzl @@ -10,6 +10,8 @@ def rb_register_toolchains( version = None, version_file = None, msys2_packages = ["libyaml"], + rv_version = "", + rv_checksums = {}, register = True, **kwargs): """ @@ -19,6 +21,7 @@ def rb_register_toolchains( * _(For MRI on Windows)_ Installed using [RubyInstaller](https://rubyinstaller.org). * _(For JRuby on any OS)_ Downloaded and installed directly from [official website](https://www.jruby.org). * _(For TruffleRuby on Linux and macOS)_ Installed using [ruby-build](https://github.com/rbenv/ruby-build). + * _(For rv-ruby)_ Prebuilt Ruby downloaded from [rv-ruby](https://github.com/spinel-coop/rv-ruby). * _(For "system")_ Ruby found on the PATH is used. Please note that builds are not hermetic in this case. `WORKSPACE`: @@ -59,6 +62,10 @@ def rb_register_toolchains( version: a semver version of MRI, or a string like [interpreter type]-[version], or "system" version_file: .ruby-version or .tool-versions file to read version from msys2_packages: extra MSYS2 packages to install + rv_version: rv-ruby release version (e.g., "20251225"). When set, downloads prebuilt + Ruby from rv-ruby instead of compiling via ruby-build. + rv_checksums: platform checksums for rv-ruby downloads. + Keys: linux-x86_64, linux-arm64, macos-arm64, macos-x86_64. register: whether to register the resulting toolchains, should be False under bzlmod **kwargs: additional parameters to the downloader for this interpreter type """ @@ -69,6 +76,8 @@ def rb_register_toolchains( version = version, version_file = version_file, msys2_packages = msys2_packages, + rv_version = rv_version, + rv_checksums = rv_checksums, **kwargs ) _rb_toolchain_repository_proxy(