From 5e545317e4bf39381ccc2c668cfee940e86f222d Mon Sep 17 00:00:00 2001 From: mkruskal-google Date: Fri, 2 Sep 2022 17:24:27 -0400 Subject: [PATCH 01/27] Rename repo to rules_ruby for consistency --- README.adoc | 14 +++++++------- WORKSPACE | 8 ++++---- examples/example_gem/BUILD.bazel | 2 +- examples/example_gem/WORKSPACE | 6 +++--- examples/example_gem/lib/BUILD | 2 +- examples/example_gem/lib/foo/BUILD | 2 +- examples/simple_rails_api/BUILD | 2 +- examples/simple_rails_api/WORKSPACE | 8 ++++---- examples/simple_script/BUILD.bazel | 2 +- examples/simple_script/WORKSPACE | 8 ++++---- examples/simple_script/lib/BUILD | 2 +- examples/simple_script_vendored/BUILD.bazel | 2 +- examples/simple_script_vendored/WORKSPACE | 8 ++++---- examples/simple_script_vendored/lib/BUILD | 2 +- ruby/defs.bzl | 14 +++++++------- ruby/deps.bzl | 4 ++-- ruby/private/constants.bzl | 2 +- ruby/private/rubocop/def.bzl | 4 ++-- ruby/private/sdk.bzl | 2 +- ruby/tests/BUILD.bazel | 10 +++++----- ruby/tests/load_path_in_runfiles_test.rb | 2 +- ruby/tests/testdata/another_workspace/WORKSPACE | 4 ++-- .../testdata/another_workspace/baz/qux/BUILD.bazel | 2 +- .../testdata/bundle_includes_workspace/BUILD.bazel | 2 +- .../testdata/bundle_includes_workspace/WORKSPACE | 8 ++++---- 25 files changed, 61 insertions(+), 61 deletions(-) diff --git a/README.adoc b/README.adoc index 758e9bb..8dccdae 100644 --- a/README.adoc +++ b/README.adoc @@ -92,13 +92,13 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") #——————————————————————————————————————————————————————————————————————— git_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", remote = "https://github.com/bazelruby/rules_ruby.git", branch = "master" ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -120,7 +120,7 @@ rules_ruby_select_sdk(version = "3.0.2") #——————————————————————————————————————————————————————————————————————— load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_bundle", ) @@ -170,7 +170,7 @@ Add `ruby_library`, `ruby_binary`, `ruby_rspec` or `ruby_test` into your `BUILD. #——————————————————————————————————————————————————————————————————————— load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", "ruby_library", "ruby_test", @@ -215,7 +215,7 @@ Use `ruby_gem` rule to package any number of ruby files or folders into a Ruby-G [source,python] ---- load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_gem", ) @@ -555,7 +555,7 @@ List of glob patterns per gem to be excluded from the library. Keys are the name [source,python] ---- -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "gems", @@ -572,7 +572,7 @@ your workspace. The name should match the name of the bundle. [source,python] ---- -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") workspace( name = "my_wksp", diff --git a/WORKSPACE b/WORKSPACE index e08c5ee..21ab40d 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,4 +1,4 @@ -workspace(name = "bazelruby_rules_ruby") +workspace(name = "rules_ruby") load("@//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk") @@ -15,12 +15,12 @@ versions.check("3.4.1") rules_ruby_select_sdk("3.0.2") local_repository( - name = "bazelruby_rules_ruby_ruby_tests_testdata_another_workspace", + name = "rules_ruby_ruby_tests_testdata_another_workspace", path = "ruby/tests/testdata/another_workspace", ) local_repository( - name = "bazelruby_rules_ruby_ruby_tests_testdata_bundle_includes_workspace", + name = "rules_ruby_ruby_tests_testdata_bundle_includes_workspace", path = "ruby/tests/testdata/bundle_includes_workspace", ) @@ -95,7 +95,7 @@ container_pull( repository = "library/ruby", ) -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/example_gem/BUILD.bazel b/examples/example_gem/BUILD.bazel index 55948ee..9b7baf6 100644 --- a/examples/example_gem/BUILD.bazel +++ b/examples/example_gem/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_gem", ) diff --git a/examples/example_gem/WORKSPACE b/examples/example_gem/WORKSPACE index 0f096a7..a6d9a27 100644 --- a/examples/example_gem/WORKSPACE +++ b/examples/example_gem/WORKSPACE @@ -1,14 +1,14 @@ -workspace(name = "bazelruby_rules_ruby_example_gem") +workspace(name = "rules_ruby_example_gem") # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) diff --git a/examples/example_gem/lib/BUILD b/examples/example_gem/lib/BUILD index 3239452..360c4c2 100644 --- a/examples/example_gem/lib/BUILD +++ b/examples/example_gem/lib/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/examples/example_gem/lib/foo/BUILD b/examples/example_gem/lib/foo/BUILD index 9e6e2fe..65ad9e7 100644 --- a/examples/example_gem/lib/foo/BUILD +++ b/examples/example_gem/lib/foo/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/examples/simple_rails_api/BUILD b/examples/simple_rails_api/BUILD index c53e54b..8481592 100644 --- a/examples/simple_rails_api/BUILD +++ b/examples/simple_rails_api/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", ) diff --git a/examples/simple_rails_api/WORKSPACE b/examples/simple_rails_api/WORKSPACE index 8585cfe..83683f7 100644 --- a/examples/simple_rails_api/WORKSPACE +++ b/examples/simple_rails_api/WORKSPACE @@ -1,14 +1,14 @@ -workspace(name = "bazelruby_rules_ruby_example") +workspace(name = "rules_ruby_example") # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -21,7 +21,7 @@ load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script/BUILD.bazel b/examples/simple_script/BUILD.bazel index 3f81e7b..678c649 100644 --- a/examples/simple_script/BUILD.bazel +++ b/examples/simple_script/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", "ruby_rspec", "ruby_rubocop", diff --git a/examples/simple_script/WORKSPACE b/examples/simple_script/WORKSPACE index 4ad11d1..be045d2 100644 --- a/examples/simple_script/WORKSPACE +++ b/examples/simple_script/WORKSPACE @@ -1,14 +1,14 @@ -workspace(name = "bazelruby_rules_ruby_example") +workspace(name = "rules_ruby_example") # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -17,7 +17,7 @@ rules_ruby_dependencies() rules_ruby_select_sdk(version = "3.0.2") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script/lib/BUILD b/examples/simple_script/lib/BUILD index f125ff8..b212e7f 100644 --- a/examples/simple_script/lib/BUILD +++ b/examples/simple_script/lib/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/examples/simple_script_vendored/BUILD.bazel b/examples/simple_script_vendored/BUILD.bazel index 1fc2d13..43b72f7 100644 --- a/examples/simple_script_vendored/BUILD.bazel +++ b/examples/simple_script_vendored/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", "ruby_rspec", "ruby_rubocop", diff --git a/examples/simple_script_vendored/WORKSPACE b/examples/simple_script_vendored/WORKSPACE index 3aff264..a002fb1 100644 --- a/examples/simple_script_vendored/WORKSPACE +++ b/examples/simple_script_vendored/WORKSPACE @@ -1,17 +1,17 @@ workspace( - name = "bazelruby_rules_ruby_example", + name = "rules_ruby_example", managed_directories = {"@bundle": ["vendor"]}, ) # Importing rules_ruby from the parent directory for developing # rules_ruby itself... local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -20,7 +20,7 @@ rules_ruby_dependencies() rules_ruby_select_sdk(version = "2.7.1") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script_vendored/lib/BUILD b/examples/simple_script_vendored/lib/BUILD index f125ff8..b212e7f 100644 --- a/examples/simple_script_vendored/lib/BUILD +++ b/examples/simple_script_vendored/lib/BUILD @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_library", ) diff --git a/ruby/defs.bzl b/ruby/defs.bzl index 1777d38..f2b35a9 100644 --- a/ruby/defs.bzl +++ b/ruby/defs.bzl @@ -1,32 +1,32 @@ load( - "@bazelruby_rules_ruby//ruby/private:toolchain.bzl", + "@rules_ruby//ruby/private:toolchain.bzl", _toolchain = "ruby_toolchain", ) load( - "@bazelruby_rules_ruby//ruby/private:library.bzl", + "@rules_ruby//ruby/private:library.bzl", _library = "ruby_library", ) load( - "@bazelruby_rules_ruby//ruby/private:binary.bzl", + "@rules_ruby//ruby/private:binary.bzl", _binary = "ruby_binary", _test = "ruby_test", ) load( - "@bazelruby_rules_ruby//ruby/private/bundle:def.bzl", + "@rules_ruby//ruby/private/bundle:def.bzl", _bundle = "bundle_install", _ruby_bundle = "ruby_bundle_install", ) load( - "@bazelruby_rules_ruby//ruby/private:rspec.bzl", + "@rules_ruby//ruby/private:rspec.bzl", _rspec = "ruby_rspec", _rspec_test = "ruby_rspec_test", ) load( - "@bazelruby_rules_ruby//ruby/private/rubocop:def.bzl", + "@rules_ruby//ruby/private/rubocop:def.bzl", _rubocop = "rubocop", ) load( - "@bazelruby_rules_ruby//ruby/private/gemspec:def.bzl", + "@rules_ruby//ruby/private/gemspec:def.bzl", _gem = "gem", _gemspec = "gemspec", ) diff --git a/ruby/deps.bzl b/ruby/deps.bzl index 3a7c45b..8812fd3 100644 --- a/ruby/deps.bzl +++ b/ruby/deps.bzl @@ -1,10 +1,10 @@ # Repository rules load( - "@bazelruby_rules_ruby//ruby/private:dependencies.bzl", + "@rules_ruby//ruby/private:dependencies.bzl", _rules_ruby_dependencies = "rules_ruby_dependencies", ) load( - "@bazelruby_rules_ruby//ruby/private:sdk.bzl", + "@rules_ruby//ruby/private:sdk.bzl", _rules_ruby_select_sdk = "rules_ruby_select_sdk", ) diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index a76f8f3..14c0e00 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -1,7 +1,7 @@ # Ruby Constants load(":providers.bzl", "RubyLibraryInfo") -RULES_RUBY_WORKSPACE_NAME = "@bazelruby_rules_ruby" +RULES_RUBY_WORKSPACE_NAME = "@rules_ruby" TOOLCHAIN_TYPE_NAME = "%s//ruby:toolchain_type" % RULES_RUBY_WORKSPACE_NAME DEFAULT_BUNDLER_VERSION = "2.1.4" diff --git a/ruby/private/rubocop/def.bzl b/ruby/private/rubocop/def.bzl index 0319906..28cb240 100644 --- a/ruby/private/rubocop/def.bzl +++ b/ruby/private/rubocop/def.bzl @@ -1,4 +1,4 @@ -load("@bazelruby_rules_ruby//ruby/private:binary.bzl", "ruby_binary") +load("@rules_ruby//ruby/private:binary.bzl", "ruby_binary") # This wraps an rb_binary in a script that is executed from the workspace folder def rubocop(name, bin, deps): @@ -9,7 +9,7 @@ def rubocop(name, bin, deps): deps = deps, ) - runner = "@bazelruby_rules_ruby//ruby/private/rubocop:runner.sh.tpl" + runner = "@rules_ruby//ruby/private/rubocop:runner.sh.tpl" native.genrule( name = name, tools = [bin_name], diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 7123575..bc21c68 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", + "@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", _ruby_runtime = "ruby_runtime", ) diff --git a/ruby/tests/BUILD.bazel b/ruby/tests/BUILD.bazel index b3e7290..cded039 100644 --- a/ruby/tests/BUILD.bazel +++ b/ruby/tests/BUILD.bazel @@ -120,7 +120,7 @@ ruby_binary( main = "load_path_in_runfiles_test.rb", deps = [ "//ruby/tests/testdata:g", - "@bazelruby_rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", + "@rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", ], ) @@ -137,7 +137,7 @@ ruby_test( main = "load_path_in_runfiles_test.rb", deps = [ "//ruby/tests/testdata:g", - "@bazelruby_rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", + "@rules_ruby_ruby_tests_testdata_another_workspace//baz/qux:j", ], ) @@ -250,13 +250,13 @@ pkg_tar( include_runfiles = True, package_dir = "/app", remap_paths = { - "ruby": "load_path_in_runfiles.runfiles/bazelruby_rules_ruby/ruby", + "ruby": "load_path_in_runfiles.runfiles/rules_ruby/ruby", ".": "load_path_in_runfiles.runfiles/", }, strip_prefix = "dummy", symlinks = { - "/app/load_path_in_runfiles.runfiles/bazelruby_rules_ruby/external": "/app/load_path_in_runfiles.runfiles", - "/app/load_path_in_runfiles": "/app/load_path_in_runfiles.runfiles/bazelruby_rules_ruby/ruby/tests/load_path_in_runfiles", + "/app/load_path_in_runfiles.runfiles/rules_ruby/external": "/app/load_path_in_runfiles.runfiles", + "/app/load_path_in_runfiles": "/app/load_path_in_runfiles.runfiles/rules_ruby/ruby/tests/load_path_in_runfiles", }, ) diff --git a/ruby/tests/load_path_in_runfiles_test.rb b/ruby/tests/load_path_in_runfiles_test.rb index 9521827..1af9a4e 100644 --- a/ruby/tests/load_path_in_runfiles_test.rb +++ b/ruby/tests/load_path_in_runfiles_test.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true require 'ruby/tests/testdata/foo/g' -require 'external/bazelruby_rules_ruby_ruby_tests_testdata_another_workspace/baz/qux/j' +require 'external/rules_ruby_ruby_tests_testdata_another_workspace/baz/qux/j' [g, j] diff --git a/ruby/tests/testdata/another_workspace/WORKSPACE b/ruby/tests/testdata/another_workspace/WORKSPACE index 86ed1c1..0ffdd6e 100644 --- a/ruby/tests/testdata/another_workspace/WORKSPACE +++ b/ruby/tests/testdata/another_workspace/WORKSPACE @@ -1,5 +1,5 @@ -workspace(name = "bazelruby_rules_ruby_ruby_tests_testdata_another_workspace") +workspace(name = "rules_ruby_ruby_tests_testdata_another_workspace") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "rules_ruby_select_sdk") +load("@rules_ruby//ruby:defs.bzl", "rules_ruby_select_sdk") rules_ruby_select_sdk() diff --git a/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel b/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel index 89a2dfe..96d5c61 100644 --- a/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel +++ b/ruby/tests/testdata/another_workspace/baz/qux/BUILD.bazel @@ -1,4 +1,4 @@ -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_library") +load("@rules_ruby//ruby:defs.bzl", "ruby_library") package(default_visibility = ["//visibility:public"]) diff --git a/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel b/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel index 01b33fa..5663a68 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel +++ b/ruby/tests/testdata/bundle_includes_workspace/BUILD.bazel @@ -1,5 +1,5 @@ load( - "@bazelruby_rules_ruby//ruby:defs.bzl", + "@rules_ruby//ruby:defs.bzl", "ruby_binary", ) diff --git a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE index 00a3bb4..2cabf3c 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE +++ b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE @@ -1,12 +1,12 @@ -workspace(name = "bazelruby_rules_ruby_ruby_tests_testdata_bundle_includes_workspace") +workspace(name = "rules_ruby_ruby_tests_testdata_bundle_includes_workspace") local_repository( - name = "bazelruby_rules_ruby", + name = "rules_ruby", path = "../../../..", ) load( - "@bazelruby_rules_ruby//ruby:deps.bzl", + "@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk", ) @@ -15,7 +15,7 @@ rules_ruby_dependencies() rules_ruby_select_sdk(version = "3.0.2") -load("@bazelruby_rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") ruby_bundle( name = "gems", From 9d825541149481f91b967ac737e63319f7d166a7 Mon Sep 17 00:00:00 2001 From: mkruskal-google Date: Fri, 2 Sep 2022 17:25:14 -0400 Subject: [PATCH 02/27] Allow generation of gemfile lock if one doesn't exist --- ruby/private/bundle/def.bzl | 40 +++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/ruby/private/bundle/def.bzl b/ruby/private/bundle/def.bzl index e368bd4..fa6fb45 100644 --- a/ruby/private/bundle/def.bzl +++ b/ruby/private/bundle/def.bzl @@ -44,7 +44,7 @@ def run_bundler(runtime_ctx, bundler_arguments, previous_result): # $ bundle config --local | --global config-option config-value # # @config_category can be either 'local' or 'global' -def set_bundler_config(runtime_ctx, previous_result, config_category = "local"): +def set_bundler_config(runtime_ctx, previous_result, has_lock = True, config_category = "local"): # Bundler is deprecating various flags in favor of the configuration. # HOWEVER — for reasons I can't explain, Bazel runs "bundle install" *prior* # to setting these flags. So the flags are then useless until we can force the @@ -53,11 +53,11 @@ def set_bundler_config(runtime_ctx, previous_result, config_category = "local"): # # Set local configuration options for bundler bundler_config = { - "deployment": "true", + "deployment": "true" if has_lock else "false", "standalone": "true", "force": "false", "redownload": "false", - "frozen": "true", + "frozen": "true" if has_lock else "false", "path": BUNDLE_PATH, "jobs": "20", "shebang": runtime_ctx.interpreter, @@ -116,12 +116,12 @@ def install_bundler(runtime_ctx, bundler_version): def bundle_install(runtime_ctx, previous_result): cwd = runtime_ctx.ctx.path(".") bundler_args = [ - "install", - "--binstubs={}".format(cwd.get_child(BUNDLE_BIN_PATH)), - "--path={}".format(cwd.get_child(BUNDLE_PATH)), + "install", "-V", "--standalone", "--gemfile={}".format(runtime_ctx.ctx.attr.gemfile.name), + "--jobs=10", # run a few jobs to ensure no gem install is blocking another ] + if runtime_ctx.ctx.attr.gemfile_lock: bundler_args += ["--deployment", "--frozen"] @@ -133,8 +133,15 @@ def bundle_install(runtime_ctx, previous_result): if result.return_code: fail("bundle install failed: %s%s" % (result.stdout, result.stderr)) - else: - return result + + # Creates a directory and place any executables from the gem there. + result = run_bundler(runtime_ctx, [ + "binstubs", "--all", "--path", "{}".format(BUNDLE_BIN_PATH) + ], previous_result) + if result.return_code: + fail("bundle binstubs failed: %s%s" % (result.stdout, result.stderr)) + + return result def generate_bundle_build_file(runtime_ctx, previous_result): if runtime_ctx.ctx.attr.gemfile_lock: @@ -185,16 +192,27 @@ def _ruby_bundle_impl(ctx): environment = {"RUBYOPT": "--enable-gems"}, ) + result = run_bundler( + runtime_ctx, + ["clean"], + None, + ) + # 1. Install the right version of the Bundler Gem result = install_bundler(runtime_ctx, bundler_version) - # 2. Set Bundler config in the .bundle/config file + # 2. Generate a Gemfile.lock file if one isn't provided + if not runtime_ctx.ctx.attr.gemfile_lock: + result = set_bundler_config(runtime_ctx, result, has_lock=False) + result = bundle_install(runtime_ctx, result) + + # 3. Set Bundler config in the .bundle/config file result = set_bundler_config(runtime_ctx, result) - # 3. Run bundle install + # 4. Run bundle install result = bundle_install(runtime_ctx, result) - # 4. Generate the BUILD file for the bundle + # 5. Generate the BUILD file for the bundle generate_bundle_build_file(runtime_ctx, result) ruby_bundle_install = repository_rule( From 6bae07f73229d7dc0b318b3733843f77edd9899b Mon Sep 17 00:00:00 2001 From: mkruskal-google Date: Sat, 3 Sep 2022 23:20:23 -0400 Subject: [PATCH 03/27] Upgrade ruby-build and add jruby support --- ruby/private/sdk.bzl | 19 +++++++++++++------ ruby/private/toolchains/ruby_runtime.bzl | 15 ++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index bc21c68..792b6ab 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -28,16 +28,23 @@ def rules_ruby_select_sdk(version = "host"): "3.0.3", "3.1.0", "3.1.1", + "jruby-9.2.21.0", + "jruby-9.3.6.0", ] - if version in supported_versions: - _ruby_runtime( - name = "org_ruby_lang_ruby_toolchain", - version = version, - ) - else: + for v in sorted(supported_versions, reverse=True): + if v.startswith(version): + supported_version = v + break + + if not supported_version: fail("rules_ruby_select_sdk: unsupported ruby version '%s' not in '%s'" % (version, supported_versions)) + _ruby_runtime( + name = "org_ruby_lang_ruby_toolchain", + version = supported_version, + ) + native.register_toolchains( "@org_ruby_lang_ruby_toolchain//:toolchain", ) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 5e53377..4959dbf 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -3,17 +3,19 @@ load("//ruby/private/toolchains:repository_context.bzl", "ruby_repository_contex def _install_ruby_version(ctx, version): ctx.download_and_extract( - url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220218.tar.gz", - sha256 = "35c82b13b7bc3713eee5615b0145c79fbbac32873f55f2ab796620d76970d8e3", - stripPrefix = "ruby-build-20220218", + url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220825.tar.gz", + sha256 = "55d9363a27486e4ec9623985d7764c5cf8e59cafe58afcf666e81fa148dea2f0", + stripPrefix = "ruby-build-20220825", ) install_path = "./build" - ctx.execute( + result = ctx.execute( ["./bin/ruby-build", "--verbose", version, install_path], quiet = False, timeout = 1600, # massive timeout because this does a lot and is a beast ) + if result.return_code: + fail("Ruby build failed: %s %s" % (result.stdout, result.stderr)) def _is_subpath(path, ancestors): """Determines if path is a subdirectory of one of the ancestors""" @@ -107,6 +109,9 @@ def host_ruby_is_correct_version(ctx, version): return False ruby_version = ctx.execute(["ruby", "-e", "print RUBY_VERSION"]).stdout + ruby_platform = ctx.execute(["ruby", "-e", "print RUBY_PLATFORM"]).stdout + if ruby_platform == "java": + ruby_version = "jruby-" + ruby_version have_ruby_version = (version == ruby_version) @@ -124,7 +129,7 @@ def _ruby_runtime_impl(ctx): _install_ruby_version(ctx, version) interpreter_path = ctx.path("./build/bin/ruby") - if not interpreter_path: + if not interpreter_path or not interpreter_path.exists: fail( "Command 'ruby' not found. Set $PATH or specify interpreter_path", "interpreter_path", From d5d428e1283aa9e3866049680e47ba1bb6ff0530 Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Fri, 30 Sep 2022 10:42:36 -0700 Subject: [PATCH 04/27] Adding necessary info for go/releasing (#6) --- CONTRIBUTING.md | 32 ++++++++++++++++++++++++++++++++ LICENSE | 3 ++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e330683 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# How to Contribute + +This repository is currently a WIP, forked from +[rules_ruby](https://github.com/bazelruby/rules_ruby) for use in building and +testing Ruby [Protobuf](https://github.com/protocolbuffers/protobuf). + +TODO(mkruskal): Fill in automated testing procedure. + +## Contributor License Agreement + +Contributions to this project must be accompanied by a Contributor License +Agreement (CLA). You (or your employer) retain the copyright to your +contribution; this simply gives us permission to use and redistribute your +contributions as part of the project. Head over to + to see your current agreements on file or +to sign a new one. + +You generally only need to submit a CLA once, so if you've already submitted one +(even if it was for a different project), you probably don't need to do it +again. + +## Code Reviews + +All submissions, including submissions by project members, require review. We +use GitHub pull requests for this purpose. Consult +[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more +information on using pull requests. + +## Community Guidelines + +This project follows +[Google's Open Source Community Guidelines](https://opensource.google/conduct/). diff --git a/LICENSE b/LICENSE index 261eeb9..61679c3 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,8 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2018-2021 BazelRubyContributors. + Copyright 2022 Google LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 1f3f49fe1586902640dad05d31029f31a7c72b2d Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 4 Oct 2022 10:33:12 -0700 Subject: [PATCH 05/27] Update CONTRIBUTING.md --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e330683..f7f24c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,8 @@ This repository is currently a WIP, forked from [rules_ruby](https://github.com/bazelruby/rules_ruby) for use in building and testing Ruby [Protobuf](https://github.com/protocolbuffers/protobuf). -TODO(mkruskal): Fill in automated testing procedure. +We'd love to accept your patches and contributions to this project. There are +just a few small guidelines you need to follow. ## Contributor License Agreement From 9465e27cdcaa02c3f16b51315bb768e2d1013cab Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Thu, 6 Oct 2022 11:46:28 -0700 Subject: [PATCH 06/27] Fixing license template (#7) --- LICENSE | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 61679c3..261eeb9 100644 --- a/LICENSE +++ b/LICENSE @@ -186,8 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2018-2021 BazelRubyContributors. - Copyright 2022 Google LLC + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 019aab101e31f525b5338b2c1efc38c9d11ddbd8 Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 25 Oct 2022 12:19:45 -0700 Subject: [PATCH 07/27] Add github actions for CI (#8) * Add github actions for CI * Ran builidifier --- .github/workflows/tests.yaml | 25 +++++++++++++++++++++++++ ruby/private/bundle/def.bzl | 10 +++++++--- ruby/private/sdk.bzl | 2 +- 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/tests.yaml diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..00501d6 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,25 @@ +name: Tests + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + test-suite: + name: "Test Suite" + + runs-on: ubuntu-latest + + strategy: + fail-fast: false # Don't cancel all jobs if one fails. + + steps: + - uses: actions/checkout@v3 + - name: Run Setup + run: cd ${{ github.workspace }} && bin/setup + - name: Run Bazel Tests + run: cd ${{ github.workspace }} && bin/test-suite diff --git a/ruby/private/bundle/def.bzl b/ruby/private/bundle/def.bzl index fa6fb45..802c11b 100644 --- a/ruby/private/bundle/def.bzl +++ b/ruby/private/bundle/def.bzl @@ -116,7 +116,8 @@ def install_bundler(runtime_ctx, bundler_version): def bundle_install(runtime_ctx, previous_result): cwd = runtime_ctx.ctx.path(".") bundler_args = [ - "install", "-V", + "install", + "-V", "--standalone", "--gemfile={}".format(runtime_ctx.ctx.attr.gemfile.name), "--jobs=10", # run a few jobs to ensure no gem install is blocking another @@ -136,7 +137,10 @@ def bundle_install(runtime_ctx, previous_result): # Creates a directory and place any executables from the gem there. result = run_bundler(runtime_ctx, [ - "binstubs", "--all", "--path", "{}".format(BUNDLE_BIN_PATH) + "binstubs", + "--all", + "--path", + "{}".format(BUNDLE_BIN_PATH), ], previous_result) if result.return_code: fail("bundle binstubs failed: %s%s" % (result.stdout, result.stderr)) @@ -203,7 +207,7 @@ def _ruby_bundle_impl(ctx): # 2. Generate a Gemfile.lock file if one isn't provided if not runtime_ctx.ctx.attr.gemfile_lock: - result = set_bundler_config(runtime_ctx, result, has_lock=False) + result = set_bundler_config(runtime_ctx, result, has_lock = False) result = bundle_install(runtime_ctx, result) # 3. Set Bundler config in the .bundle/config file diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 792b6ab..b82402d 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -32,7 +32,7 @@ def rules_ruby_select_sdk(version = "host"): "jruby-9.3.6.0", ] - for v in sorted(supported_versions, reverse=True): + for v in sorted(supported_versions, reverse = True): if v.startswith(version): supported_version = v break From fdcf4ce5cc4eaf786212f45f5a44d076f1ace11b Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Wed, 26 Oct 2022 13:29:45 -0700 Subject: [PATCH 08/27] Add ruby versioning support (#1) * Use specified toolchain for ruby binaries instead of host default * Support autodetection of ruby platform * Implement ruby versioning scheme based on flag settings * Cleaning up toolchain registration * Fixed broken tests in bin/test-suite * Responding to review comments * Consolidate version settings, add some testing * Ran buildifier * Rename main branch for CI --- .github/workflows/tests.yaml | 4 +- README.adoc | 13 +-- WORKSPACE | 9 +- bin/test-suite | 26 ++++-- examples/example_gem/WORKSPACE | 10 +- examples/simple_rails_api/WORKSPACE | 10 +- examples/simple_script/WORKSPACE | 8 +- examples/simple_script_vendored/WORKSPACE | 8 +- ruby/deps.bzl | 4 +- ruby/private/BUILD.bazel | 1 + ruby/private/binary.bzl | 26 +++++- ruby/private/binary_runner.tpl | 14 +++ ruby/private/binary_wrapper.tpl | 2 - ruby/private/constants.bzl | 53 ++++++++++- ruby/private/providers.bzl | 11 +++ ruby/private/runtime_alias.bzl | 74 +++++++++++++++ ruby/private/sdk.bzl | 91 +++++++++--------- ruby/private/toolchain.bzl | 21 ++--- ruby/private/toolchains/BUILD.runtime.tpl | 31 +++++++ ruby/private/toolchains/ruby_runtime.bzl | 27 ++++-- ruby/runtime/BUILD.bazel | 93 +++++++++++++++++++ ruby/runtime/version_support.bzl | 26 ++++++ ruby/tests/BUILD.bazel | 12 +-- ruby/tests/runtime_run_ruby_test.sh | 2 +- .../testdata/another_workspace/WORKSPACE | 4 +- .../bundle_includes_workspace/WORKSPACE | 8 +- 26 files changed, 454 insertions(+), 134 deletions(-) create mode 100644 ruby/private/binary_runner.tpl create mode 100644 ruby/private/runtime_alias.bzl create mode 100644 ruby/runtime/BUILD.bazel create mode 100644 ruby/runtime/version_support.bzl diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 00501d6..2333bc3 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -3,10 +3,10 @@ name: Tests on: push: branches: - - master + - main pull_request: branches: - - master + - main jobs: test-suite: diff --git a/README.adoc b/README.adoc index 8dccdae..a41ebc6 100644 --- a/README.adoc +++ b/README.adoc @@ -97,12 +97,7 @@ git_repository( branch = "master" ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) - +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() #——————————————————————————————————————————————————————————————————————— @@ -113,7 +108,8 @@ rules_ruby_dependencies() load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -rules_ruby_select_sdk(version = "3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +rules_ruby_register_toolchains(["ruby-3.0"]) #——————————————————————————————————————————————————————————————————————— # Now, load the ruby_bundle rule & install gems specified in the Gemfile @@ -486,8 +482,7 @@ ruby_bundle( excludes = {}, srcs = [], vendor_cache = False, - ruby_sdk = "@org_ruby_lang_ruby_toolchain", - ruby_interpreter = "@org_ruby_lang_ruby_toolchain//:ruby", + ruby_interpreter = "@rules_ruby//ruby/runtime:interpreter", ) ---- diff --git a/WORKSPACE b/WORKSPACE index 21ab40d..4f8da71 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1,6 +1,6 @@ workspace(name = "rules_ruby") -load("@//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_select_sdk") +load("@//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() @@ -12,7 +12,12 @@ load("@bazel_skylib//lib:versions.bzl", "versions") versions.check("3.4.1") -rules_ruby_select_sdk("3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") + +rules_ruby_register_toolchains([ + "ruby-3.0", + "jruby-9.2", +]) local_repository( name = "rules_ruby_ruby_tests_testdata_another_workspace", diff --git a/bin/test-suite b/bin/test-suite index 63643f1..080f291 100755 --- a/bin/test-suite +++ b/bin/test-suite @@ -32,11 +32,6 @@ export BashMatic__Expr=" [[ -f ${HOME}/.bashmatic/init.sh ]] && source ${HOME}/.bashmatic/init.sh; set -e " -export Bazel__BuildSteps=" - bazel ${BAZEL_OPTS} info; echo; echo - bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} -- //... ; echo; echo - bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo -" deps.start-clock run.set-all abort-on-error show-output-on @@ -162,9 +157,11 @@ test.buildifier() { test.simple-script() { __test.exec simple-script " cd examples/simple_script - ${Bazel__BuildSteps} - echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BUILD_OPTS} :bin - echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BUILD_OPTS} :rubocop + bazel ${BAZEL_OPTS} info; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BASE_BUILD_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BASE_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo + echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :bin + echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :rubocop " } @@ -172,12 +169,21 @@ test.simple-script() { test.example-gem() { __test.exec example-gem " cd examples/example_gem - echo bazel ${BAZEL_OPTS} build ...:all; bazel ${BAZEL_OPTS} build ...:all + echo bazel ${BAZEL_OPTS} build ...:all + bazel ${BAZEL_OPTS} build --@rules_ruby//ruby/runtime:version=ruby-3.0 ...:all " } test.workspace() { - __test.exec workspace "${Bazel__BuildSteps}" + __test.exec workspace " + bazel ${BAZEL_OPTS} info; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 ${BAZEL_TEST_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 ${BAZEL_TEST_OPTS} -- //... ; echo; echo + " } # Private diff --git a/examples/example_gem/WORKSPACE b/examples/example_gem/WORKSPACE index a6d9a27..c55061d 100644 --- a/examples/example_gem/WORKSPACE +++ b/examples/example_gem/WORKSPACE @@ -7,15 +7,13 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_select_sdk("3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") + +rules_ruby_register_toolchains(["ruby-3.0"]) load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") diff --git a/examples/simple_rails_api/WORKSPACE b/examples/simple_rails_api/WORKSPACE index 83683f7..6c031ef 100644 --- a/examples/simple_rails_api/WORKSPACE +++ b/examples/simple_rails_api/WORKSPACE @@ -7,15 +7,13 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "3.0.2") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") + +rules_ruby_register_toolchains(["ruby-3.0"]) load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") diff --git a/examples/simple_script/WORKSPACE b/examples/simple_script/WORKSPACE index be045d2..c95bbb8 100644 --- a/examples/simple_script/WORKSPACE +++ b/examples/simple_script/WORKSPACE @@ -7,15 +7,11 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "3.0.2") +rules_ruby_register_toolchains(["ruby-3.0"]) load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") diff --git a/examples/simple_script_vendored/WORKSPACE b/examples/simple_script_vendored/WORKSPACE index a002fb1..95d5446 100644 --- a/examples/simple_script_vendored/WORKSPACE +++ b/examples/simple_script_vendored/WORKSPACE @@ -10,15 +10,11 @@ local_repository( path = "../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "2.7.1") +rules_ruby_register_toolchains(["ruby-2.7.1"]) load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") diff --git a/ruby/deps.bzl b/ruby/deps.bzl index 8812fd3..73b5b80 100644 --- a/ruby/deps.bzl +++ b/ruby/deps.bzl @@ -5,8 +5,8 @@ load( ) load( "@rules_ruby//ruby/private:sdk.bzl", - _rules_ruby_select_sdk = "rules_ruby_select_sdk", + _rules_ruby_register_toolchains = "rules_ruby_register_toolchains", ) rules_ruby_dependencies = _rules_ruby_dependencies -rules_ruby_select_sdk = _rules_ruby_select_sdk +rules_ruby_register_toolchains = _rules_ruby_register_toolchains diff --git a/ruby/private/BUILD.bazel b/ruby/private/BUILD.bazel index 1c16e04..98152bb 100644 --- a/ruby/private/BUILD.bazel +++ b/ruby/private/BUILD.bazel @@ -1,6 +1,7 @@ exports_files( [ "binary_wrapper.tpl", + "binary_runner.tpl", ], visibility = ["//visibility:public"], ) diff --git a/ruby/private/binary.bzl b/ruby/private/binary.bzl index 4a38054..480fe5e 100644 --- a/ruby/private/binary.bzl +++ b/ruby/private/binary.bzl @@ -29,7 +29,9 @@ def _get_gem_path(incpaths): # to create a rule (eg, rubocop) that does exactly the same. def ruby_binary_macro(ctx, main, srcs): sdk = ctx.toolchains[TOOLCHAIN_TYPE_NAME].ruby_runtime - interpreter = sdk.interpreter[DefaultInfo].files_to_run.executable + interpreter_info = sdk.interpreter[DefaultInfo] + interpreter = interpreter_info.files_to_run.executable + interpreter_runfiles = interpreter_info.default_runfiles.merge(interpreter_info.data_runfiles) if not main: expected_name = "%s.rb" % ctx.attr.name @@ -45,10 +47,11 @@ def ruby_binary_macro(ctx, main, srcs): ) executable = ctx.actions.declare_file(ctx.attr.name) + wrapper = ctx.actions.declare_file(ctx.attr.name + "_wrapper") deps = _transitive_deps( ctx, - extra_files = [executable], + extra_files = [executable, wrapper, interpreter], extra_deps = ctx.attr._misc_deps, ) @@ -60,21 +63,34 @@ def ruby_binary_macro(ctx, main, srcs): ctx.actions.expand_template( template = ctx.file._wrapper_template, - output = executable, + output = wrapper, substitutions = { "{loadpaths}": repr(deps.incpaths.to_list()), "{rubyopt}": repr(rubyopt), "{main}": repr(_to_manifest_path(ctx, main)), - "{interpreter}": _to_manifest_path(ctx, interpreter), "{gem_path}": gem_path, "{should_gem_pristine}": str(len(gems_to_pristine) > 0).lower(), "{gems_to_pristine}": " ".join(gems_to_pristine), }, ) + ctx.actions.expand_template( + template = ctx.file._runner_template, + output = executable, + substitutions = { + "{main}": wrapper.short_path, + "{interpreter}": interpreter.short_path, + "{workspace_name}": ctx.label.workspace_name or ctx.workspace_name, + }, + is_executable = True, + ) + info = DefaultInfo( executable = executable, - runfiles = deps.default_files.merge(deps.data_files), + runfiles = deps.default_files + .merge(deps.data_files) + .merge(interpreter_runfiles) + .merge(ctx.runfiles(files = [wrapper])), ) return [info] diff --git a/ruby/private/binary_runner.tpl b/ruby/private/binary_runner.tpl new file mode 100644 index 0000000..dc5ae04 --- /dev/null +++ b/ruby/private/binary_runner.tpl @@ -0,0 +1,14 @@ +#!/bin/sh + +if [ -n "${RUNFILES_DIR+x}" ]; then + PATH_PREFIX=$RUNFILES_DIR/{workspace_name}/ +elif [ -s `dirname $0`/../../MANIFEST ]; then + PATH_PREFIX=`cd $(dirname $0); pwd`/ +elif [ -d $0.runfiles ]; then + PATH_PREFIX=`cd $0.runfiles; pwd`/{workspace_name}/ +else + echo "WARNING: it does not look to be at the .runfiles directory" >&2 + exit 1 +fi + +$PATH_PREFIX{interpreter} -I${PATH_PREFIX} ${PATH_PREFIX}{main} "$@" \ No newline at end of file diff --git a/ruby/private/binary_wrapper.tpl b/ruby/private/binary_wrapper.tpl index 09e0402..3b63362 100755 --- a/ruby/private/binary_wrapper.tpl +++ b/ruby/private/binary_wrapper.tpl @@ -1,5 +1,3 @@ -#!/usr/bin/env ruby - # Ruby-port of the Bazel's wrapper script for Python # Copyright 2017 The Bazel Authors. All rights reserved. diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index 14c0e00..3bd1e9a 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -38,6 +38,10 @@ RUBY_ATTRS = { allow_single_file = True, default = "binary_wrapper.tpl", ), + "_runner_template": attr.label( + allow_single_file = True, + default = "binary_runner.tpl", + ), "_misc_deps": attr.label_list( allow_files = True, default = ["@bazel_tools//tools/bash/runfiles"], @@ -66,11 +70,8 @@ RSPEC_ATTRS.update(RUBY_ATTRS) RSPEC_ATTRS.update(_RSPEC_ATTRS) BUNDLE_ATTRS = { - "ruby_sdk": attr.string( - default = "@org_ruby_lang_ruby_toolchain", - ), "ruby_interpreter": attr.label( - default = "@org_ruby_lang_ruby_toolchain//:ruby", + default = "@local_config_ruby_system//:ruby", ), "gemfile": attr.label( allow_single_file = True, @@ -154,3 +155,47 @@ GEMSPEC_ATTRS = { default = "%s//ruby/private/gemspec:readme_template.tpl" % RULES_RUBY_WORKSPACE_NAME, ), } + +# The full list of supported pinned version numbers. +SUPPORTED_VERSIONS = [ + "system", + "ruby-2.5.8", + "ruby-2.5.9", + "ruby-2.6.3", + "ruby-2.6.4", + "ruby-2.6.5", + "ruby-2.6.6", + "ruby-2.6.7", + "ruby-2.6.8", + "ruby-2.6.9", + "ruby-2.7.1", + "ruby-2.7.2", + "ruby-2.7.3", + "ruby-2.7.4", + "ruby-2.7.5", + "ruby-3.0.0", + "ruby-3.0.1", + "ruby-3.0.2", + "ruby-3.0.3", + "ruby-3.1.0", + "ruby-3.1.1", + "jruby-9.2.21.0", # Corresponded to 2.5.8 + "jruby-9.3.6.0", # Corresponds to 2.6.8 +] + +def get_supported_version(version): + """Transforms a user-friendly version identifier to a full version number.""" + + if version[0] >= "0" and version[1] <= "9": + version = "ruby-" + version + + supported_version = None + for v in sorted(SUPPORTED_VERSIONS, reverse = True): + if v.startswith(version): + supported_version = v + break + + if not supported_version: + fail("rules_ruby_register_toolchains: unsupported ruby version '%s' not in '%s'" % (version, SUPPORTED_VERSIONS)) + + return supported_version diff --git a/ruby/private/providers.bzl b/ruby/private/providers.bzl index 131f335..58281e4 100644 --- a/ruby/private/providers.bzl +++ b/ruby/private/providers.bzl @@ -19,6 +19,17 @@ RubyRuntimeInfo = provider( ], ) +RubyRuntimeToolchainInfo = provider( + doc = "Information about a Ruby interpreter, related commands and libraries", + fields = { + "interpreter": "A label which points the Ruby interpreter", + "bundler": "A label which points bundler command", + "runtime": "A list of labels which points runtime libraries", + "headers": "A list of labels which points to the ruby headers", + "rubyopt": "A list of strings which should be passed to the interpreter as command line options", + }, +) + RubyGemInfo = provider( doc = "Carries info required to package a ruby gem", fields = [ diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl new file mode 100644 index 0000000..302c8bc --- /dev/null +++ b/ruby/private/runtime_alias.bzl @@ -0,0 +1,74 @@ +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load(":constants.bzl", "TOOLCHAIN_TYPE_NAME") +load(":providers.bzl", "RubyRuntimeToolchainInfo") + +# These rules expose the runtime targets of whichever toolchain has been resolved. + +def _ruby_runtime_alias_impl(ctx): + ruby = ctx.toolchains[TOOLCHAIN_TYPE_NAME].ruby_runtime + return [ + DefaultInfo( + runfiles = ctx.runfiles(transitive_files = depset(ruby.runtime)), + files = depset(ruby.runtime), + ), + ruby, + ] + +ruby_runtime_alias = rule( + implementation = _ruby_runtime_alias_impl, + toolchains = [TOOLCHAIN_TYPE_NAME], +) + +def _ruby_headers_alias_impl(ctx): + runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] + target = runtime.headers + return [ + ctx.attr.runtime[DefaultInfo], + target[CcInfo], + target[InstrumentedFilesInfo], + target[OutputGroupInfo], + ] + +ruby_headers_alias = rule( + implementation = _ruby_headers_alias_impl, + attrs = { + "runtime": attr.label( + doc = "The runtime alias to use.", + mandatory = True, + ), + }, +) + +def _ruby_interpreter_alias_impl(ctx): + runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] + target = runtime.interpreter + output = ctx.actions.declare_file("ruby_interpreter") + + #fail(target[DefaultInfo].files_to_run.executable) + ctx.actions.symlink( + output = output, + target_file = target[DefaultInfo].files_to_run.executable, + is_executable = True, + ) + runfiles = ctx.attr.runtime[DefaultInfo].default_runfiles.merge( + ctx.attr.runtime[DefaultInfo].data_runfiles, + ) + + return [ + DefaultInfo( + files = target.files, + runfiles = runfiles, + executable = output, + ), + ] + +ruby_interpreter_alias = rule( + implementation = _ruby_interpreter_alias_impl, + executable = True, + attrs = { + "runtime": attr.label( + doc = "The runtime alias to use.", + mandatory = True, + ), + }, +) diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index b82402d..3580d9d 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -1,50 +1,57 @@ -load( - "@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", - _ruby_runtime = "ruby_runtime", -) +load("@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", "ruby_runtime") +load(":constants.bzl", "get_supported_version") -def rules_ruby_select_sdk(version = "host"): +def _register_toolchain(version): """Registers ruby toolchains in the WORKSPACE file.""" + name = "local_config_ruby_%s" % version - supported_versions = [ - "host", - "2.5.8", - "2.5.9", - "2.6.3", - "2.6.4", - "2.6.5", - "2.6.6", - "2.6.7", - "2.6.8", - "2.6.9", - "2.7.1", - "2.7.2", - "2.7.3", - "2.7.4", - "2.7.5", - "3.0.0", - "3.0.1", - "3.0.2", - "3.0.3", - "3.1.0", - "3.1.1", - "jruby-9.2.21.0", - "jruby-9.3.6.0", - ] - - for v in sorted(supported_versions, reverse = True): - if v.startswith(version): - supported_version = v - break - - if not supported_version: - fail("rules_ruby_select_sdk: unsupported ruby version '%s' not in '%s'" % (version, supported_versions)) - - _ruby_runtime( - name = "org_ruby_lang_ruby_toolchain", + supported_version = get_supported_version(version) + if supported_version.startswith("ruby-"): + supported_version = supported_version[5:] + + ruby_runtime( + name = name, version = supported_version, ) native.register_toolchains( - "@org_ruby_lang_ruby_toolchain//:toolchain", + "@%s//:toolchain" % name, + ) + +def rules_ruby_register_toolchains(versions = []): + """Initializes ruby toolchains at different supported versions. + + A special version "system" will use whatever version of ruby is installed + on the host system. Besides that, this rules supports all of versions in + the SUPPORTED_VERSIONS list. The most recent matching version will be + selected. + + If the current system ruby doesn't match a given version, it will be + downloaded and built for use by the toolchain. Toolchain selection occurs + based on the //ruby/runtime:version flag setting. + + For example, + rules_ruby_register_toolchains(["system", ruby-2.5", "jruby-9.2"])` will + download and build the latest supported version of Ruby 2.5 and jruby 9.2. + By default, the system ruby will be used for all Bazel build and + tests. However, passing a flag such as: + --@rules_ruby//ruby/runtime:version="ruby-2.5" + will select the Ruby 2.5 installation. + + Args: + versions: a list of version identifiers + """ + for version in versions: + _register_toolchain(version) + + # Always provide a system toolchain for internal use. + if not "system" in version: + _register_toolchain("system") + native.bind( + name = "rules_ruby_system_jruby_implementation", + actual = "@local_config_ruby_system//:jruby_implementation", + ) + native.bind( + name = "rules_ruby_system_interpreter", + actual = "@local_config_ruby_system//:ruby", ) diff --git a/ruby/private/toolchain.bzl b/ruby/private/toolchain.bzl index cbaebd6..152e92e 100644 --- a/ruby/private/toolchain.bzl +++ b/ruby/private/toolchain.bzl @@ -1,21 +1,13 @@ load(":constants.bzl", "RULES_RUBY_WORKSPACE_NAME") - -RubyRuntimeInfo = provider( - doc = "Information about a Ruby interpreter, related commands and libraries", - fields = { - "interpreter": "A label which points the Ruby interpreter", - "bundler": "A label which points bundler command", - "runtime": "A list of labels which points runtime libraries", - "rubyopt": "A list of strings which should be passed to the interpreter as command line options", - }, -) +load(":providers.bzl", "RubyRuntimeToolchainInfo") def _ruby_toolchain_impl(ctx): return [ platform_common.ToolchainInfo( - ruby_runtime = RubyRuntimeInfo( + ruby_runtime = RubyRuntimeToolchainInfo( interpreter = ctx.attr.interpreter, runtime = ctx.files.runtime, + headers = ctx.attr.headers, rubyopt = ctx.attr.rubyopt, ), ), @@ -35,6 +27,11 @@ _ruby_toolchain = rule( allow_files = True, cfg = "target", ), + "headers": attr.label( + mandatory = True, + allow_files = True, + cfg = "target", + ), "rubyopt": attr.string_list( default = [], ), @@ -45,6 +42,7 @@ def ruby_toolchain( name, interpreter, runtime, + headers, rubyopt = [], rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, **kwargs): @@ -53,6 +51,7 @@ def ruby_toolchain( name = impl_name, interpreter = interpreter, runtime = runtime, + headers = headers, rubyopt = rubyopt, ) diff --git a/ruby/private/toolchains/BUILD.runtime.tpl b/ruby/private/toolchains/BUILD.runtime.tpl index fbb3e64..02a36b8 100644 --- a/ruby/private/toolchains/BUILD.runtime.tpl +++ b/ruby/private/toolchains/BUILD.runtime.tpl @@ -3,6 +3,7 @@ load( "ruby_library", "ruby_toolchain", ) +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") package(default_visibility = ["//visibility:public"]) @@ -11,6 +12,10 @@ ruby_toolchain( interpreter = "//:ruby_bin", rules_ruby_workspace = "{rules_ruby_workspace}", runtime = "//:runtime", + headers = "//:headers", + target_settings = [ + "{rules_ruby_workspace}//ruby/runtime:{setting}" + ], # TODO(yugui) Extract platform info from RbConfig # exec_compatible_with = [], # target_compatible_with = [], @@ -46,4 +51,30 @@ filegroup( ), ) +# Provide config settings to signal the ruby platform to downstream code. +# This should never be overridden, and is determined automatically during the +# creation of the toolchain. +string_flag( + name = "internal_ruby_implementation", + build_setting_default = "{implementation}", + values = [ + "ruby", + "jruby", + ], +) + +config_setting( + name = "jruby_implementation", + flag_values = { + ":internal_ruby_implementation": "jruby", + }, +) + +config_setting( + name = "ruby_implementation", + flag_values = { + ":internal_ruby_implementation": "ruby", + }, +) + # vim: set ft=bzl : diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 4959dbf..1239d59 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -101,16 +101,26 @@ def _install_ruby(ctx, ruby): shared_library = _relativate(shared_library), ) -def host_ruby_is_correct_version(ctx, version): +def get_ruby_info(ctx, interpreter_path): + platform = ctx.execute([interpreter_path, "-e", "print RUBY_PLATFORM"]).stdout + if platform == "java": + ruby_impl = "jruby" + ruby_version = ctx.execute([interpreter_path, "-e", "print JRUBY_VERSION"]).stdout + else: + ruby_impl = "ruby" + ruby_version = ctx.execute([interpreter_path, "-e", "print RUBY_VERSION"]).stdout + + return ruby_impl, ruby_version + +def system_ruby_is_correct_version(ctx, version): interpreter_path = ctx.which("ruby") if not interpreter_path: print("Can't find ruby interpreter in the PATH") return False - ruby_version = ctx.execute(["ruby", "-e", "print RUBY_VERSION"]).stdout - ruby_platform = ctx.execute(["ruby", "-e", "print RUBY_PLATFORM"]).stdout - if ruby_platform == "java": + ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + if ruby_impl == "jruby": ruby_version = "jruby-" + ruby_version have_ruby_version = (version == ruby_version) @@ -123,7 +133,7 @@ def host_ruby_is_correct_version(ctx, version): def _ruby_runtime_impl(ctx): # If the current version of ruby is correct use that version = ctx.attr.version - if version == "host" or host_ruby_is_correct_version(ctx, version): + if version == "system" or system_ruby_is_correct_version(ctx, version): interpreter_path = ctx.which("ruby") else: _install_ruby_version(ctx, version) @@ -139,6 +149,8 @@ def _ruby_runtime_impl(ctx): installed = _install_ruby(ctx, ruby) + ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + ctx.template( "BUILD.bazel", ctx.attr._buildfile_template, @@ -148,6 +160,9 @@ def _ruby_runtime_impl(ctx): "{static_library}": repr(installed.static_library), "{shared_library}": repr(installed.shared_library), "{rules_ruby_workspace}": RULES_RUBY_WORKSPACE_NAME, + "{implementation}": ruby_impl, + "{version}": ruby_version, + "{setting}": "config_system" if version == "system" else "config_%s-%s" % (ruby_impl, ruby_version), }, executable = False, ) @@ -155,7 +170,7 @@ def _ruby_runtime_impl(ctx): ruby_runtime = repository_rule( implementation = _ruby_runtime_impl, attrs = { - "version": attr.string(default = "host"), + "version": attr.string(default = "system"), "_buildfile_template": attr.label( default = "%s//ruby/private/toolchains:BUILD.runtime.tpl" % ( RULES_RUBY_WORKSPACE_NAME diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel new file mode 100644 index 0000000..3e7e824 --- /dev/null +++ b/ruby/runtime/BUILD.bazel @@ -0,0 +1,93 @@ +load("@bazel_skylib//lib:selects.bzl", "selects") +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("@rules_ruby//ruby/private:constants.bzl", "get_supported_version") +load( + ":version_support.bzl", + "ALL_JRUBY_MAJOR_MINOR_VERSIONS", + "ALL_RUBY_MAJOR_MINOR_VERSIONS", + "SUPPORTED_MAJOR_MINOR_VERSIONS", +) +load( + "@rules_ruby//ruby/private:runtime_alias.bzl", + _ruby_headers_alias = "ruby_headers_alias", + _ruby_interpreter_alias = "ruby_interpreter_alias", + _ruby_runtime_alias = "ruby_runtime_alias", +) + +package(default_visibility = ["//visibility:public"]) + +toolchain_type(name = "toolchain_type") + +# Alias targets corresponding to whichever toolchain was resolved based on +# the selected version. + +_ruby_runtime_alias( + name = "runtime", +) + +_ruby_headers_alias( + name = "headers", + runtime = ":runtime", +) + +_ruby_interpreter_alias( + name = "interpreter", + runtime = ":runtime", +) + +# Supported ruby versions, which can be selected by flags. +# For example: --@rules_ruby//ruby/runtime:version=jruby-9.3 +string_flag( + name = "version", + build_setting_default = "system", + values = ["system"] + SUPPORTED_MAJOR_MINOR_VERSIONS, +) + +config_setting( + name = "config_system", + flag_values = {"version": "system"}, +) + +[ + config_setting( + name = "config_" + get_supported_version(version), + flag_values = {"version": version}, + ) + for version in SUPPORTED_MAJOR_MINOR_VERSIONS +] + +[ + alias( + name = "config_" + version, + actual = ":config_" + get_supported_version(version), + ) + for version in SUPPORTED_MAJOR_MINOR_VERSIONS +] + +selects.config_setting_group( + name = "config_system_ruby", + match_all = [ + ":config_system", + "//external:rules_ruby_system_jruby_implementation", + ], +) + +selects.config_setting_group( + name = "config_ruby", + match_any = [":config_system_ruby"] + + [":config_%s" % v for v in ALL_RUBY_MAJOR_MINOR_VERSIONS], +) + +selects.config_setting_group( + name = "config_system_jruby", + match_all = [ + ":config_system", + "//external:rules_ruby_system_jruby_implementation", + ], +) + +selects.config_setting_group( + name = "config_jruby", + match_any = [":config_system_ruby"] + + [":config_%s" % v for v in ALL_JRUBY_MAJOR_MINOR_VERSIONS], +) diff --git a/ruby/runtime/version_support.bzl b/ruby/runtime/version_support.bzl new file mode 100644 index 0000000..40dfa63 --- /dev/null +++ b/ruby/runtime/version_support.bzl @@ -0,0 +1,26 @@ +load("@bazel_skylib//lib:new_sets.bzl", "sets") +load( + "@rules_ruby//ruby/private:constants.bzl", + "SUPPORTED_VERSIONS", +) + +def _major_minor_versions(): + """Filters supported versions to unique major/minor pairs""" + versions = sets.make() + for s in SUPPORTED_VERSIONS: + if s.find(".") < 0: + continue + split = s.find(".", s.find(".") + 1) + sets.insert(versions, s[0:split]) + return sorted(sets.to_list(versions)) + +def _filter(versions, prefix): + filtered = [] + for v in versions: + if v.startswith(prefix): + filtered.append(v) + return filtered + +SUPPORTED_MAJOR_MINOR_VERSIONS = _major_minor_versions() +ALL_RUBY_MAJOR_MINOR_VERSIONS = _filter(SUPPORTED_MAJOR_MINOR_VERSIONS, "ruby-") +ALL_JRUBY_MAJOR_MINOR_VERSIONS = _filter(SUPPORTED_MAJOR_MINOR_VERSIONS, "jruby-") diff --git a/ruby/tests/BUILD.bazel b/ruby/tests/BUILD.bazel index cded039..1ac2d43 100644 --- a/ruby/tests/BUILD.bazel +++ b/ruby/tests/BUILD.bazel @@ -65,7 +65,7 @@ sh_test( ], data = [ "args_check.rb", - "@org_ruby_lang_ruby_toolchain//:ruby_bin", + "@rules_ruby//ruby/runtime:interpreter", ], ) @@ -74,7 +74,7 @@ genrule( name = "generate_genrule_run_ruby_test", outs = ["genrules_run_ruby_test.sh"], cmd = " && ".join([ - ("$(location @org_ruby_lang_ruby_toolchain//:ruby_bin) " + + ("$(location @rules_ruby//ruby/runtime:interpreter) " + "$(location args_check.rb) foo bar baz"), "echo '#!/bin/sh -e' > $@", "echo true >> $@", @@ -83,8 +83,8 @@ genrule( output_to_bindir = 1, tools = [ "args_check.rb", - "@org_ruby_lang_ruby_toolchain//:ruby_bin", - "@org_ruby_lang_ruby_toolchain//:runtime", + "@rules_ruby//ruby/runtime", + "@rules_ruby//ruby/runtime:interpreter", ], ) @@ -188,7 +188,7 @@ cc_binary( testonly = True, srcs = ["example_ext.c"], linkshared = True, - deps = ["@org_ruby_lang_ruby_toolchain//:headers"], + deps = ["@rules_ruby//ruby/runtime:headers"], ) cc_library( @@ -197,7 +197,7 @@ cc_library( srcs = ["example_ext.c"], linkstatic = True, tags = ["manual"], - deps = ["@org_ruby_lang_ruby_toolchain//:headers"], + deps = ["@rules_ruby//ruby/runtime:headers"], alwayslink = True, ) diff --git a/ruby/tests/runtime_run_ruby_test.sh b/ruby/tests/runtime_run_ruby_test.sh index 6a3e270..7de0ac8 100755 --- a/ruby/tests/runtime_run_ruby_test.sh +++ b/ruby/tests/runtime_run_ruby_test.sh @@ -1,2 +1,2 @@ #!/bin/sh -e -external/org_ruby_lang_ruby_toolchain/ruby_bin $* +ruby/runtime/ruby_interpreter $* diff --git a/ruby/tests/testdata/another_workspace/WORKSPACE b/ruby/tests/testdata/another_workspace/WORKSPACE index 0ffdd6e..ca5bbe6 100644 --- a/ruby/tests/testdata/another_workspace/WORKSPACE +++ b/ruby/tests/testdata/another_workspace/WORKSPACE @@ -1,5 +1,5 @@ workspace(name = "rules_ruby_ruby_tests_testdata_another_workspace") -load("@rules_ruby//ruby:defs.bzl", "rules_ruby_select_sdk") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") -rules_ruby_select_sdk() +rules_ruby_register_toolchains() diff --git a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE index 2cabf3c..af7ac93 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE +++ b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE @@ -5,15 +5,11 @@ local_repository( path = "../../../..", ) -load( - "@rules_ruby//ruby:deps.bzl", - "rules_ruby_dependencies", - "rules_ruby_select_sdk", -) +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") rules_ruby_dependencies() -rules_ruby_select_sdk(version = "3.0.2") +rules_ruby_register_toolchains(["ruby-3.0"]) load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") From 44a995f67aa319e6b702c0b1601f8151525df57a Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Wed, 7 Dec 2022 20:17:30 -0800 Subject: [PATCH 09/27] Handle missing ruby runtime (#10) * Warn but allow systems with no ruby installation * Fix generated registration function * Run setup as root * Fixed typo in no implementation forwarding * Use a mock/incompatible toolchain to always register system ruby * Remove comment * Make ruby_bundle a generated repository rule for each version. This removes the need to ever use the system ruby * Auto detect toolchain by default * Add placeholder for when the system ruby isn't requested * Fix typo for system label * Run tests as root * Don't run workflow as sudo * Always run rbenv in workflow * Buildifier * Refactor toolchain registration to explicitly specify repo name * Move toolchain registration out of runtime macro * Adding comments to workspace file --- README.adoc | 13 +- WORKSPACE | 28 +++- bin/setup | 2 +- examples/example_gem/WORKSPACE | 6 +- examples/simple_rails_api/WORKSPACE | 8 +- examples/simple_script/WORKSPACE | 10 +- examples/simple_script_vendored/WORKSPACE | 13 +- ruby/defs.bzl | 13 +- ruby/deps.bzl | 5 - ruby/private/bundle/def.bzl | 9 +- ruby/private/constants.bzl | 5 +- ruby/private/dependencies.bzl | 15 ++ ruby/private/runtime_alias.bzl | 1 - ruby/private/sdk.bzl | 86 +++++----- ruby/private/toolchain.bzl | 26 +++ ruby/private/toolchains/BUILD | 1 - ruby/private/toolchains/BUILD.bazel | 38 +++++ ruby/private/toolchains/BUILD.runtime.tpl | 60 ++----- ruby/private/toolchains/ruby_runtime.bzl | 150 ++++++++++++++++-- ruby/runtime/BUILD.bazel | 47 +++++- .../testdata/another_workspace/WORKSPACE | 6 +- .../bundle_includes_workspace/WORKSPACE | 10 +- 22 files changed, 387 insertions(+), 165 deletions(-) delete mode 100644 ruby/private/toolchains/BUILD create mode 100644 ruby/private/toolchains/BUILD.bazel diff --git a/README.adoc b/README.adoc index a41ebc6..1db3c55 100644 --- a/README.adoc +++ b/README.adoc @@ -108,17 +108,14 @@ rules_ruby_dependencies() load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") -rules_ruby_register_toolchains(["ruby-3.0"]) +load("@rules_ruby//ruby:deps.bzl", "register_toolchain") +register_toolchains("ruby-3.0") #——————————————————————————————————————————————————————————————————————— # Now, load the ruby_bundle rule & install gems specified in the Gemfile #——————————————————————————————————————————————————————————————————————— -load( - "@rules_ruby//ruby:defs.bzl", - "ruby_bundle", -) +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", @@ -550,7 +547,7 @@ List of glob patterns per gem to be excluded from the library. Keys are the name [source,python] ---- -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "gems", @@ -567,7 +564,7 @@ your workspace. The name should match the name of the bundle. [source,python] ---- -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") workspace( name = "my_wksp", diff --git a/WORKSPACE b/WORKSPACE index 4f8da71..abca524 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -12,12 +12,28 @@ load("@bazel_skylib//lib:versions.bzl", "versions") versions.check("3.4.1") -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains([ - "ruby-3.0", - "jruby-9.2", -]) +# Register the system ruby version with a custom name. +ruby_runtime( + name = "system_ruby_custom", + version = "system", +) + +register_toolchains("@system_ruby_custom//:toolchain") + +# Register a versioned ruby with a custom name. +ruby_runtime( + name = "ruby3", + version = "ruby-3.0", +) + +register_toolchains("@ruby3//:toolchain") + +# Register a versioned ruby with its default name. +ruby_runtime("jruby-9.2") + +register_toolchains("@jruby-9.2//:toolchain") local_repository( name = "rules_ruby_ruby_tests_testdata_another_workspace", @@ -100,7 +116,7 @@ container_pull( repository = "library/ruby", ) -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@system_ruby_custom//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/bin/setup b/bin/setup index c0799ca..8875e27 100755 --- a/bin/setup +++ b/bin/setup @@ -37,7 +37,7 @@ setup.rbenv() { local installed_version="$(ruby -e 'puts RUBY_VERSION' | tr -d '\n')" if [[ ${installed_version} == ${ruby_version} ]]; then info "RUBY already installed, current version: ${bldylw}${ruby_version}" - return 0 + info "Setting up rbenv anyway" fi fi diff --git a/examples/example_gem/WORKSPACE b/examples/example_gem/WORKSPACE index c55061d..150de3b 100644 --- a/examples/example_gem/WORKSPACE +++ b/examples/example_gem/WORKSPACE @@ -11,9 +11,11 @@ load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains(["ruby-3.0"]) +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") diff --git a/examples/simple_rails_api/WORKSPACE b/examples/simple_rails_api/WORKSPACE index 6c031ef..287c06b 100644 --- a/examples/simple_rails_api/WORKSPACE +++ b/examples/simple_rails_api/WORKSPACE @@ -11,15 +11,17 @@ load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains(["ruby-3.0"]) +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +load("@workspace_ruby//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script/WORKSPACE b/examples/simple_script/WORKSPACE index c95bbb8..8534646 100644 --- a/examples/simple_script/WORKSPACE +++ b/examples/simple_script/WORKSPACE @@ -7,13 +7,17 @@ local_repository( path = "../..", ) -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_register_toolchains(["ruby-3.0"]) +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") + +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/examples/simple_script_vendored/WORKSPACE b/examples/simple_script_vendored/WORKSPACE index 95d5446..9360923 100644 --- a/examples/simple_script_vendored/WORKSPACE +++ b/examples/simple_script_vendored/WORKSPACE @@ -10,13 +10,20 @@ local_repository( path = "../..", ) -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_register_toolchains(["ruby-2.7.1"]) +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +ruby_runtime( + name = "ruby-2.7", + version = "ruby-2.7.1", +) + +register_toolchains("@ruby-2.7//:toolchain") + +load("@ruby-2.7.1//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", diff --git a/ruby/defs.bzl b/ruby/defs.bzl index f2b35a9..924ac2a 100644 --- a/ruby/defs.bzl +++ b/ruby/defs.bzl @@ -1,5 +1,6 @@ load( "@rules_ruby//ruby/private:toolchain.bzl", + _mock_toolchain = "mock_ruby_toolchain", _toolchain = "ruby_toolchain", ) load( @@ -13,8 +14,7 @@ load( ) load( "@rules_ruby//ruby/private/bundle:def.bzl", - _bundle = "bundle_install", - _ruby_bundle = "ruby_bundle_install", + _bundle_install = "bundle_install", ) load( "@rules_ruby//ruby/private:rspec.bzl", @@ -30,15 +30,20 @@ load( _gem = "gem", _gemspec = "gemspec", ) +load( + "@rules_ruby//ruby/private:sdk.bzl", + _register_ruby_runtime = "register_ruby_runtime", +) +ruby_mock_toolchain = _mock_toolchain ruby_toolchain = _toolchain ruby_library = _library ruby_binary = _binary ruby_test = _test ruby_rspec_test = _rspec_test ruby_rspec = _rspec -ruby_bundle = _ruby_bundle -ruby_bundle_install = _bundle +ruby_bundle_install = _bundle_install ruby_rubocop = _rubocop ruby_gemspec = _gemspec ruby_gem = _gem +ruby_runtime = _register_ruby_runtime diff --git a/ruby/deps.bzl b/ruby/deps.bzl index 73b5b80..90c53ac 100644 --- a/ruby/deps.bzl +++ b/ruby/deps.bzl @@ -3,10 +3,5 @@ load( "@rules_ruby//ruby/private:dependencies.bzl", _rules_ruby_dependencies = "rules_ruby_dependencies", ) -load( - "@rules_ruby//ruby/private:sdk.bzl", - _rules_ruby_register_toolchains = "rules_ruby_register_toolchains", -) rules_ruby_dependencies = _rules_ruby_dependencies -rules_ruby_register_toolchains = _rules_ruby_register_toolchains diff --git a/ruby/private/bundle/def.bzl b/ruby/private/bundle/def.bzl index 802c11b..c289d0a 100644 --- a/ruby/private/bundle/def.bzl +++ b/ruby/private/bundle/def.bzl @@ -173,7 +173,7 @@ def generate_bundle_build_file(runtime_ctx, previous_result): if result.return_code: fail("build file generation failed: %s%s" % (result.stdout, result.stderr)) -def _ruby_bundle_impl(ctx): +def ruby_bundle_impl(ctx, ruby_interpreter): ctx.symlink(ctx.attr.gemfile, ctx.attr.gemfile.name) if ctx.attr.gemfile_lock: ctx.symlink(ctx.attr.gemfile_lock, ctx.attr.gemfile_lock.name) @@ -192,7 +192,7 @@ def _ruby_bundle_impl(ctx): # Setup this provider that we pass around between functions for convenience runtime_ctx = RubyRuntimeInfo( ctx = ctx, - interpreter = ctx.path(ctx.attr.ruby_interpreter), + interpreter = ruby_interpreter, environment = {"RUBYOPT": "--enable-gems"}, ) @@ -218,8 +218,3 @@ def _ruby_bundle_impl(ctx): # 5. Generate the BUILD file for the bundle generate_bundle_build_file(runtime_ctx, result) - -ruby_bundle_install = repository_rule( - implementation = _ruby_bundle_impl, - attrs = BUNDLE_ATTRS, -) diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index 3bd1e9a..dd48c4f 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -70,9 +70,6 @@ RSPEC_ATTRS.update(RUBY_ATTRS) RSPEC_ATTRS.update(_RSPEC_ATTRS) BUNDLE_ATTRS = { - "ruby_interpreter": attr.label( - default = "@local_config_ruby_system//:ruby", - ), "gemfile": attr.label( allow_single_file = True, mandatory = True, @@ -196,6 +193,6 @@ def get_supported_version(version): break if not supported_version: - fail("rules_ruby_register_toolchains: unsupported ruby version '%s' not in '%s'" % (version, SUPPORTED_VERSIONS)) + fail("ruby_runtime: unsupported ruby version '%s' not in '%s'" % (version, SUPPORTED_VERSIONS)) return supported_version diff --git a/ruby/private/dependencies.bzl b/ruby/private/dependencies.bzl index 0a51d7a..589a821 100644 --- a/ruby/private/dependencies.bzl +++ b/ruby/private/dependencies.bzl @@ -3,6 +3,7 @@ Dependencies """ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load(":constants.bzl", "RULES_RUBY_WORKSPACE_NAME") def rules_ruby_dependencies(): if "bazel_skylib" not in native.existing_rules(): @@ -24,3 +25,17 @@ def rules_ruby_dependencies(): sha256 = "85e26971904cbb387688bd2a9e87c105f7cd7d986dc1b96bb1391924479c5ef6", strip_prefix = "rules_pkg-3e0cd514ad1cdd2d23ab3d427d34436f75060018/pkg", ) + + # Register placeholders for the system ruby. + native.bind( + name = "rules_ruby_system_jruby_implementation", + actual = "%s//:missing_jruby_implementation" % RULES_RUBY_WORKSPACE_NAME, + ) + native.bind( + name = "rules_ruby_system_ruby_implementation", + actual = "%s//:missing_ruby_implementation" % RULES_RUBY_WORKSPACE_NAME, + ) + native.bind( + name = "rules_ruby_system_no_implementation", + actual = "%s//:missing_no_implementation" % RULES_RUBY_WORKSPACE_NAME, + ) diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl index 302c8bc..5a1598e 100644 --- a/ruby/private/runtime_alias.bzl +++ b/ruby/private/runtime_alias.bzl @@ -44,7 +44,6 @@ def _ruby_interpreter_alias_impl(ctx): target = runtime.interpreter output = ctx.actions.declare_file("ruby_interpreter") - #fail(target[DefaultInfo].files_to_run.executable) ctx.actions.symlink( output = output, target_file = target[DefaultInfo].files_to_run.executable, diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 3580d9d..28ca3cd 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -1,57 +1,61 @@ load("@rules_ruby//ruby/private/toolchains:ruby_runtime.bzl", "ruby_runtime") -load(":constants.bzl", "get_supported_version") +load(":constants.bzl", "RULES_RUBY_WORKSPACE_NAME", "get_supported_version") -def _register_toolchain(version): - """Registers ruby toolchains in the WORKSPACE file.""" - name = "local_config_ruby_%s" % version +def register_ruby_runtime(name, version = None): + """Initializes a ruby toolchain at a specific version. - supported_version = get_supported_version(version) - if supported_version.startswith("ruby-"): - supported_version = supported_version[5:] - - ruby_runtime( - name = name, - version = supported_version, - ) - - native.register_toolchains( - "@%s//:toolchain" % name, - ) - -def rules_ruby_register_toolchains(versions = []): - """Initializes ruby toolchains at different supported versions. - - A special version "system" will use whatever version of ruby is installed - on the host system. Besides that, this rules supports all of versions in - the SUPPORTED_VERSIONS list. The most recent matching version will be - selected. + A special version "system" or "system_ruby" will use whatever version of + ruby is installed on the host system. Besides that, this rules supports all + of versions in the SUPPORTED_VERSIONS list. The most recent matching + version will beselected. If the current system ruby doesn't match a given version, it will be downloaded and built for use by the toolchain. Toolchain selection occurs based on the //ruby/runtime:version flag setting. - For example, - rules_ruby_register_toolchains(["system", ruby-2.5", "jruby-9.2"])` will - download and build the latest supported version of Ruby 2.5 and jruby 9.2. + For example, `register_toolchains("ruby", "ruby-2.5")` will download and + build the latest supported version of Ruby 2.5. By default, the system ruby will be used for all Bazel build and tests. However, passing a flag such as: --@rules_ruby//ruby/runtime:version="ruby-2.5" will select the Ruby 2.5 installation. + Optionally, a single string can be passed to this macro and it will use it + for both the name and version. + Args: - versions: a list of version identifiers + name: the name of the generated Bazel repository + version: a version identifier (e.g. system, ruby-2.5, jruby-9.2) """ - for version in versions: - _register_toolchain(version) - - # Always provide a system toolchain for internal use. - if not "system" in version: - _register_toolchain("system") - native.bind( - name = "rules_ruby_system_jruby_implementation", - actual = "@local_config_ruby_system//:jruby_implementation", - ) - native.bind( - name = "rules_ruby_system_interpreter", - actual = "@local_config_ruby_system//:ruby", + if not version: + version = name + if version == "system_ruby": + # Special handling to give the system ruby repo a friendly name. + version = "system" + + supported_version = get_supported_version(version) + if supported_version.startswith("ruby-"): + supported_version = supported_version[5:] + + ruby_runtime( + name = name, + version = supported_version, ) + + if supported_version == "system": + native.bind( + name = "rules_ruby_system_jruby_implementation", + actual = "@%s//:jruby_implementation" % name, + ) + native.bind( + name = "rules_ruby_system_ruby_implementation", + actual = "@%s//:ruby_implementation" % name, + ) + native.bind( + name = "rules_ruby_system_no_implementation", + actual = "@%s//:no_implementation" % name, + ) + native.bind( + name = "rules_ruby_system_interpreter", + actual = "@%s//:ruby" % name, + ) diff --git a/ruby/private/toolchain.bzl b/ruby/private/toolchain.bzl index 152e92e..63cf0c9 100644 --- a/ruby/private/toolchain.bzl +++ b/ruby/private/toolchain.bzl @@ -61,3 +61,29 @@ def ruby_toolchain( toolchain = ":%s" % impl_name, **kwargs ) + +def _mock_ruby_toolchain_impl(ctx): + return [ + platform_common.ToolchainInfo(), + ] + +_mock_ruby_toolchain = rule( + implementation = _mock_ruby_toolchain_impl, +) + +def mock_ruby_toolchain( + name, + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + **kwargs): + impl_name = name + "_sdk" + _mock_ruby_toolchain( + name = impl_name, + ) + native.toolchain( + name = name, + toolchain_type = "%s//ruby:toolchain_type" % rules_ruby_workspace, + toolchain = ":%s" % impl_name, + exec_compatible_with = ["@platforms//:incompatible"], + target_compatible_with = ["@platforms//:incompatible"], + **kwargs + ) diff --git a/ruby/private/toolchains/BUILD b/ruby/private/toolchains/BUILD deleted file mode 100644 index 67efa96..0000000 --- a/ruby/private/toolchains/BUILD +++ /dev/null @@ -1 +0,0 @@ -package(default_visibility = ["//ruby/private:__pkg__"]) diff --git a/ruby/private/toolchains/BUILD.bazel b/ruby/private/toolchains/BUILD.bazel new file mode 100644 index 0000000..282fec8 --- /dev/null +++ b/ruby/private/toolchains/BUILD.bazel @@ -0,0 +1,38 @@ +load("@bazel_skylib//lib:selects.bzl", "selects") +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") + +package(default_visibility = ["//ruby/private:__pkg__"]) + +# Placeholders for cases when no system ruby is requested +string_flag( + name = "internal_missing_ruby", + build_setting_default = "none", + values = [ + "none", + "ruby", + "jruby", + ], +) + +config_setting( + name = "missing_jruby_implementation", + flag_values = { + ":internal_ruby_implementation": "jruby", + }, +) + +config_setting( + name = "missing_ruby_implementation", + flag_values = { + ":internal_ruby_implementation": "ruby", + }, +) + +config_setting( + name = "missing_no_implementation", + flag_values = { + ":internal_ruby_implementation": "none", + }, +) + +# vim: set ft=bzl : diff --git a/ruby/private/toolchains/BUILD.runtime.tpl b/ruby/private/toolchains/BUILD.runtime.tpl index 02a36b8..d4bb281 100644 --- a/ruby/private/toolchains/BUILD.runtime.tpl +++ b/ruby/private/toolchains/BUILD.runtime.tpl @@ -1,55 +1,11 @@ -load( - "{rules_ruby_workspace}//ruby:defs.bzl", - "ruby_library", - "ruby_toolchain", -) +load("@bazel_skylib//lib:selects.bzl", "selects") load("@bazel_skylib//rules:common_settings.bzl", "string_flag") package(default_visibility = ["//visibility:public"]) -ruby_toolchain( - name = "toolchain", - interpreter = "//:ruby_bin", - rules_ruby_workspace = "{rules_ruby_workspace}", - runtime = "//:runtime", - headers = "//:headers", - target_settings = [ - "{rules_ruby_workspace}//ruby/runtime:{setting}" - ], - # TODO(yugui) Extract platform info from RbConfig - # exec_compatible_with = [], - # target_compatible_with = [], -) - -sh_binary( - name = "ruby_bin", - srcs = ["ruby"], - data = [":runtime"], -) - -cc_import( - name = "libruby", - hdrs = glob({hdrs}), - shared_library = {shared_library}, - static_library = {static_library}, -) - -cc_library( - name = "headers", - hdrs = glob({hdrs}), - includes = {includes}, -) - -filegroup( - name = "runtime", - srcs = glob( - include = ["**/*"], - exclude = [ - "BUILD.bazel", - "WORKSPACE", - ], - ), -) +# Toolchain targets. These will be mocked out with stubs if no ruby version +# can be found. +{toolchain} # Provide config settings to signal the ruby platform to downstream code. # This should never be overridden, and is determined automatically during the @@ -58,6 +14,7 @@ string_flag( name = "internal_ruby_implementation", build_setting_default = "{implementation}", values = [ + "none", "ruby", "jruby", ], @@ -77,4 +34,11 @@ config_setting( }, ) +config_setting( + name = "no_implementation", + flag_values = { + ":internal_ruby_implementation": "none", + }, +) + # vim: set ft=bzl : diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 1239d59..05fe6d6 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -1,6 +1,109 @@ load("//ruby/private:constants.bzl", "RULES_RUBY_WORKSPACE_NAME") load("//ruby/private/toolchains:repository_context.bzl", "ruby_repository_context") +_mock_toolchain = """ +load( + "{rules_ruby_workspace}//ruby:defs.bzl", + "ruby_mock_toolchain", +) + +ruby_mock_toolchain( + name = "toolchain", + rules_ruby_workspace = "{rules_ruby_workspace}", +) + +sh_binary( + name = "ruby_bin", + srcs = ["ruby"], + data = [":runtime"], +) + +cc_import( + name = "libruby", + hdrs = [], +) + +cc_library( + name = "headers", + hdrs = [], + includes = [], +) + +filegroup( + name = "runtime", + srcs = [], +) +""" + +_toolchain = """ +load( + "{rules_ruby_workspace}//ruby:defs.bzl", + "ruby_toolchain", +) + +ruby_toolchain( + name = "toolchain", + interpreter = "//:ruby_bin", + rules_ruby_workspace = "{rules_ruby_workspace}", + runtime = "//:runtime", + headers = "//:headers", + target_settings = [ + "{rules_ruby_workspace}//ruby/runtime:{setting}" + ], + # TODO(yugui) Extract platform info from RbConfig + # exec_compatible_with = [], + # target_compatible_with = [], +) + +sh_binary( + name = "ruby_bin", + srcs = ["ruby"], + data = [":runtime"], +) + +cc_import( + name = "libruby", + hdrs = glob({hdrs}), + shared_library = {shared_library}, + static_library = {static_library}, +) + +cc_library( + name = "headers", + hdrs = glob({hdrs}), + includes = {includes}, +) + +filegroup( + name = "runtime", + srcs = glob( + include = ["**/*"], + exclude = [ + "BUILD.bazel", + "WORKSPACE", + ], + ), +) +""" + +_bundle_bzl = """ +load("{rules_ruby_workspace}//ruby/private/bundle:def.bzl", "ruby_bundle_impl") +load("{rules_ruby_workspace}//ruby/private:constants.bzl", "BUNDLE_ATTRS") + +def _ruby_bundle_impl(ctx): + ruby_bundle_impl(ctx, "{interpreter}") + +ruby_bundle = repository_rule( + implementation = _ruby_bundle_impl, + attrs = BUNDLE_ATTRS, +) +""" + +_mock_bundle_bzl = """ +def ruby_bundle(**kwargs): + print("WARNING: no system ruby found for bundle") +""" + def _install_ruby_version(ctx, version): ctx.download_and_extract( url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220825.tar.gz", @@ -138,34 +241,47 @@ def _ruby_runtime_impl(ctx): else: _install_ruby_version(ctx, version) interpreter_path = ctx.path("./build/bin/ruby") + if not interpreter_path or not interpreter_path.exists: + fail("Installation of ruby version %s failed") - if not interpreter_path or not interpreter_path.exists: - fail( - "Command 'ruby' not found. Set $PATH or specify interpreter_path", - "interpreter_path", + if interpreter_path and interpreter_path.exists: + ruby = ruby_repository_context(ctx, interpreter_path) + installed = _install_ruby(ctx, ruby) + ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + hdrs = ["%s/**/*.h" % path for path in installed.includedirs] + toolchain = _toolchain.format( + includes = repr(installed.includedirs), + hdrs = repr(["%s/**/*.h" % path for path in installed.includedirs]), + static_library = repr(installed.static_library), + shared_library = repr(installed.shared_library), + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + version = ruby_version, + setting = "config_system" if version == "system" else "config_%s-%s" % (ruby_impl, ruby_version), ) - - ruby = ruby_repository_context(ctx, interpreter_path) - - installed = _install_ruby(ctx, ruby) - - ruby_impl, ruby_version = get_ruby_info(ctx, interpreter_path) + bundle_bzl = _bundle_bzl.format( + interpreter = ruby.interpreter_realpath, + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + ) + else: + print("WARNING: no system ruby available, builds against system ruby will fail") + support = "none" + ruby_impl = "none" + toolchain = _mock_toolchain.format( + rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, + ) + ctx.file("ruby", content = "", executable = True) + bundle_bzl = _mock_bundle_bzl ctx.template( "BUILD.bazel", ctx.attr._buildfile_template, substitutions = { - "{includes}": repr(installed.includedirs), - "{hdrs}": repr(["%s/**/*.h" % path for path in installed.includedirs]), - "{static_library}": repr(installed.static_library), - "{shared_library}": repr(installed.shared_library), - "{rules_ruby_workspace}": RULES_RUBY_WORKSPACE_NAME, + "{toolchain}": toolchain, "{implementation}": ruby_impl, - "{version}": ruby_version, - "{setting}": "config_system" if version == "system" else "config_%s-%s" % (ruby_impl, ruby_version), }, executable = False, ) + ctx.file("bundle.bzl", bundle_bzl) ruby_runtime = repository_rule( implementation = _ruby_runtime_impl, diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 3e7e824..443f763 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -39,23 +39,50 @@ _ruby_interpreter_alias( # For example: --@rules_ruby//ruby/runtime:version=jruby-9.3 string_flag( name = "version", - build_setting_default = "system", - values = ["system"] + SUPPORTED_MAJOR_MINOR_VERSIONS, + build_setting_default = "auto", + values = [ + "auto", + "system", + ] + SUPPORTED_MAJOR_MINOR_VERSIONS, ) config_setting( - name = "config_system", + name = "config_auto", + flag_values = {"version": "auto"}, +) + +config_setting( + name = "internal_config_system", flag_values = {"version": "system"}, ) [ config_setting( - name = "config_" + get_supported_version(version), + name = "internal_config_" + get_supported_version(version), flag_values = {"version": version}, ) for version in SUPPORTED_MAJOR_MINOR_VERSIONS ] +selects.config_setting_group( + name = "config_system", + match_any = [ + ":config_auto", + ":internal_config_system", + ], +) + +[ + selects.config_setting_group( + name = "config_" + get_supported_version(version), + match_any = [ + ":config_auto", + ":internal_config_" + get_supported_version(version), + ], + ) + for version in SUPPORTED_MAJOR_MINOR_VERSIONS +] + [ alias( name = "config_" + version, @@ -68,7 +95,7 @@ selects.config_setting_group( name = "config_system_ruby", match_all = [ ":config_system", - "//external:rules_ruby_system_jruby_implementation", + "//external:rules_ruby_system_ruby_implementation", ], ) @@ -88,6 +115,14 @@ selects.config_setting_group( selects.config_setting_group( name = "config_jruby", - match_any = [":config_system_ruby"] + + match_any = [":config_system_jruby"] + [":config_%s" % v for v in ALL_JRUBY_MAJOR_MINOR_VERSIONS], ) + +selects.config_setting_group( + name = "config_system_none", + match_all = [ + ":config_system", + "//external:rules_ruby_system_no_implementation", + ], +) diff --git a/ruby/tests/testdata/another_workspace/WORKSPACE b/ruby/tests/testdata/another_workspace/WORKSPACE index ca5bbe6..0f914eb 100644 --- a/ruby/tests/testdata/another_workspace/WORKSPACE +++ b/ruby/tests/testdata/another_workspace/WORKSPACE @@ -1,5 +1,7 @@ workspace(name = "rules_ruby_ruby_tests_testdata_another_workspace") -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -rules_ruby_register_toolchains() +ruby_runtime("system_ruby") + +register_toolchains("@system_ruby//:toolchain") diff --git a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE index af7ac93..25c14f5 100644 --- a/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE +++ b/ruby/tests/testdata/bundle_includes_workspace/WORKSPACE @@ -5,13 +5,17 @@ local_repository( path = "../../../..", ) -load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies", "rules_ruby_register_toolchains") +load("@rules_ruby//ruby:deps.bzl", "rules_ruby_dependencies") rules_ruby_dependencies() -rules_ruby_register_toolchains(["ruby-3.0"]) +load("@rules_ruby//ruby:defs.bzl", "ruby_runtime") -load("@rules_ruby//ruby:defs.bzl", "ruby_bundle") +ruby_runtime("ruby-3.0") + +register_toolchains("@ruby-3.0//:toolchain") + +load("@ruby-3.0//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "gems", From b8f651f80a5fad90d4db6e486b0ae047a8a46640 Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Thu, 22 Dec 2022 20:19:08 -0800 Subject: [PATCH 10/27] Disable "auto" version selection option (#11) * Don't mark fixed versions auto * Explicitly specify version for test workspace w/o system ruby * Debug logging in setup * Revert logging changes, keep pin of bashmatic version --- bin/deps | 3 ++- bin/test-suite | 10 ++++++---- ruby/runtime/BUILD.bazel | 1 - 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/bin/deps b/bin/deps index dfdbbcc..378a29d 100755 --- a/bin/deps +++ b/bin/deps @@ -10,8 +10,9 @@ # ————————————————————————————————————————————————————————————————————————————————————— +export BASHMATIC_OS="$(uname -s | tr '[:upper:]' '[:lower:]')" [[ -z ${BASHMATIC_HOME} ]] && export BASHMATIC_HOME="${HOME}/.bashmatic" -[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://bashmatic.re1.re); bashmatic-install -q" +[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://bashmatic.re1.re); bashmatic-install -v -f -b v2.7.2" # shellcheck disable=SC1090 source "${BASHMATIC_HOME}/init.sh" 1>/dev/null 2>&1 diff --git a/bin/test-suite b/bin/test-suite index 080f291..d583a4c 100755 --- a/bin/test-suite +++ b/bin/test-suite @@ -155,13 +155,15 @@ test.buildifier() { # Builds and runs workspace inside examples/simple_script test.simple-script() { + # This workspace requires a version specification + local RUBY_VERSION="--@rules_ruby//ruby/runtime:version=ruby-3.0 " __test.exec simple-script " cd examples/simple_script bazel ${BAZEL_OPTS} info; echo; echo - bazel ${BAZEL_OPTS} build ${BAZEL_BASE_BUILD_OPTS} -- //... ; echo; echo - bazel ${BAZEL_OPTS} test ${BAZEL_BASE_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo - echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :bin - echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} :rubocop + bazel ${BAZEL_OPTS} build ${BAZEL_BASE_BUILD_OPTS} ${RUBY_VERSION} -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BASE_BUILD_OPTS} ${BAZEL_TEST_OPTS} ${RUBY_VERSION} -- //... ; echo; echo + echo run :bin; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} ${RUBY_VERSION} :bin + echo run :rubocop; bazel ${BAZEL_OPTS} run ${BAZEL_BASE_BUILD_OPTS} ${RUBY_VERSION} :rubocop " } diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 443f763..332ddc0 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -76,7 +76,6 @@ selects.config_setting_group( selects.config_setting_group( name = "config_" + get_supported_version(version), match_any = [ - ":config_auto", ":internal_config_" + get_supported_version(version), ], ) From fe92d2f1e495f365b773822587486b7754bca33b Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 27 Dec 2022 11:46:53 -0800 Subject: [PATCH 11/27] Export JRuby jar files (#13) * Export JRuby jar to avoid pinning a version through maven downstream * Buildifier * Create a dummy jar for non-java ruby --- ruby/private/providers.bzl | 1 + ruby/private/runtime_alias.bzl | 24 ++++++++++++++++++ ruby/private/toolchain.bzl | 8 ++++++ ruby/private/toolchains/ruby_runtime.bzl | 31 ++++++++++++++++++++++++ ruby/runtime/BUILD.bazel | 6 +++++ 5 files changed, 70 insertions(+) diff --git a/ruby/private/providers.bzl b/ruby/private/providers.bzl index 58281e4..624a530 100644 --- a/ruby/private/providers.bzl +++ b/ruby/private/providers.bzl @@ -25,6 +25,7 @@ RubyRuntimeToolchainInfo = provider( "interpreter": "A label which points the Ruby interpreter", "bundler": "A label which points bundler command", "runtime": "A list of labels which points runtime libraries", + "jars": "A list of labels which points to ruby jars", "headers": "A list of labels which points to the ruby headers", "rubyopt": "A list of strings which should be passed to the interpreter as command line options", }, diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl index 5a1598e..d37f590 100644 --- a/ruby/private/runtime_alias.bzl +++ b/ruby/private/runtime_alias.bzl @@ -19,6 +19,30 @@ ruby_runtime_alias = rule( toolchains = [TOOLCHAIN_TYPE_NAME], ) +def _ruby_jars_alias_impl(ctx): + runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] + target = runtime.jars + infos = [ + DefaultInfo( + files = target.files, + runfiles = ctx.runfiles(transitive_files = target.files), + ), + ] + for jar in infos[0].files.to_list(): + infos.append(JavaInfo(jar, jar)) + + return infos + +ruby_jars_alias = rule( + implementation = _ruby_jars_alias_impl, + attrs = { + "runtime": attr.label( + doc = "The runtime alias to use.", + mandatory = True, + ), + }, +) + def _ruby_headers_alias_impl(ctx): runtime = ctx.attr.runtime[RubyRuntimeToolchainInfo] target = runtime.headers diff --git a/ruby/private/toolchain.bzl b/ruby/private/toolchain.bzl index 63cf0c9..8af44df 100644 --- a/ruby/private/toolchain.bzl +++ b/ruby/private/toolchain.bzl @@ -7,6 +7,7 @@ def _ruby_toolchain_impl(ctx): ruby_runtime = RubyRuntimeToolchainInfo( interpreter = ctx.attr.interpreter, runtime = ctx.files.runtime, + jars = ctx.attr.jars, headers = ctx.attr.headers, rubyopt = ctx.attr.rubyopt, ), @@ -27,6 +28,11 @@ _ruby_toolchain = rule( allow_files = True, cfg = "target", ), + "jars": attr.label( + mandatory = True, + allow_files = True, + cfg = "target", + ), "headers": attr.label( mandatory = True, allow_files = True, @@ -42,6 +48,7 @@ def ruby_toolchain( name, interpreter, runtime, + jars, headers, rubyopt = [], rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, @@ -51,6 +58,7 @@ def ruby_toolchain( name = impl_name, interpreter = interpreter, runtime = runtime, + jars = jars, headers = headers, rubyopt = rubyopt, ) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 05fe6d6..bfb445a 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -29,6 +29,16 @@ cc_library( includes = [], ) +java_binary( + name = "dummy_jar" + srcs = ["Dummy.java"], +) + +filegroup( + name = "jars", + srcs = [":dummy_jar"], +) + filegroup( name = "runtime", srcs = [], @@ -46,6 +56,7 @@ ruby_toolchain( interpreter = "//:ruby_bin", rules_ruby_workspace = "{rules_ruby_workspace}", runtime = "//:runtime", + jars = "//:jars", headers = "//:headers", target_settings = [ "{rules_ruby_workspace}//ruby/runtime:{setting}" @@ -74,6 +85,16 @@ cc_library( includes = {includes}, ) +java_library( + name = "dummy_jar", + srcs = ["Dummy.java"], +) + +filegroup( + name = "jars", + srcs = {jars}, +) + filegroup( name = "runtime", srcs = glob( @@ -86,6 +107,13 @@ filegroup( ) """ +# Define a dummy java file for creating a no-op jar when JRuby isn't selected. +_dummy_jar = """ +public class Dummy { + public static void main(String[] args) {} +} +""" + _bundle_bzl = """ load("{rules_ruby_workspace}//ruby/private/bundle:def.bzl", "ruby_bundle_impl") load("{rules_ruby_workspace}//ruby/private:constants.bzl", "BUNDLE_ATTRS") @@ -244,6 +272,8 @@ def _ruby_runtime_impl(ctx): if not interpreter_path or not interpreter_path.exists: fail("Installation of ruby version %s failed") + ctx.file("Dummy.java", _dummy_jar) + if interpreter_path and interpreter_path.exists: ruby = ruby_repository_context(ctx, interpreter_path) installed = _install_ruby(ctx, ruby) @@ -252,6 +282,7 @@ def _ruby_runtime_impl(ctx): toolchain = _toolchain.format( includes = repr(installed.includedirs), hdrs = repr(["%s/**/*.h" % path for path in installed.includedirs]), + jars = "glob([\"**/lib/jruby.jar\"])" if ruby_impl == "jruby" else [":dummy_jar"], static_library = repr(installed.static_library), shared_library = repr(installed.shared_library), rules_ruby_workspace = RULES_RUBY_WORKSPACE_NAME, diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 332ddc0..365d230 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -11,6 +11,7 @@ load( "@rules_ruby//ruby/private:runtime_alias.bzl", _ruby_headers_alias = "ruby_headers_alias", _ruby_interpreter_alias = "ruby_interpreter_alias", + _ruby_jars_alias = "ruby_jars_alias", _ruby_runtime_alias = "ruby_runtime_alias", ) @@ -25,6 +26,11 @@ _ruby_runtime_alias( name = "runtime", ) +_ruby_jars_alias( + name = "jars", + runtime = ":runtime", +) + _ruby_headers_alias( name = "headers", runtime = ":runtime", From 59732544ce3a4bc4e8e4d4e8c8f318c931c17eae Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Tue, 27 Dec 2022 12:04:03 -0800 Subject: [PATCH 12/27] Fix typo from PR #13 (#14) * Fix typo in no-ruby BUILD file * Fix broken bashmatic url --- bin/deps | 2 +- ruby/private/toolchains/ruby_runtime.bzl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/deps b/bin/deps index 378a29d..00ffdd4 100755 --- a/bin/deps +++ b/bin/deps @@ -12,7 +12,7 @@ export BASHMATIC_OS="$(uname -s | tr '[:upper:]' '[:lower:]')" [[ -z ${BASHMATIC_HOME} ]] && export BASHMATIC_HOME="${HOME}/.bashmatic" -[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://bashmatic.re1.re); bashmatic-install -v -f -b v2.7.2" +[[ -d ${BASHMATIC_HOME} ]] || bash -c "$(curl -fsSL https://raw.githubusercontent.com/kigster/bashmatic/master/bin/bashmatic-install); bashmatic-install -v -f -b v2.7.2" # shellcheck disable=SC1090 source "${BASHMATIC_HOME}/init.sh" 1>/dev/null 2>&1 diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index bfb445a..975fb81 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -30,7 +30,7 @@ cc_library( ) java_binary( - name = "dummy_jar" + name = "dummy_jar", srcs = ["Dummy.java"], ) From 37cf5900d0b0e44fa379c0ea3f5fcee0035d77ca Mon Sep 17 00:00:00 2001 From: Mike Kruskal <62662355+mkruskal-google@users.noreply.github.com> Date: Thu, 12 Jan 2023 14:54:33 -0800 Subject: [PATCH 13/27] Add a jruby java_binary rule for deploy_env exclusion (#15) --- ruby/private/runtime_alias.bzl | 1 + ruby/runtime/BUILD.bazel | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/ruby/private/runtime_alias.bzl b/ruby/private/runtime_alias.bzl index d37f590..8da0085 100644 --- a/ruby/private/runtime_alias.bzl +++ b/ruby/private/runtime_alias.bzl @@ -1,4 +1,5 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load("@rules_java//java:defs.bzl", "java_binary") load(":constants.bzl", "TOOLCHAIN_TYPE_NAME") load(":providers.bzl", "RubyRuntimeToolchainInfo") diff --git a/ruby/runtime/BUILD.bazel b/ruby/runtime/BUILD.bazel index 365d230..288e3d1 100644 --- a/ruby/runtime/BUILD.bazel +++ b/ruby/runtime/BUILD.bazel @@ -31,6 +31,12 @@ _ruby_jars_alias( runtime = ":runtime", ) +java_binary( + name = "jruby_binary", + main_class = "org.jruby.Main", + runtime_deps = [":jars"], +) + _ruby_headers_alias( name = "headers", runtime = ":runtime", From 8fca842a3006c3d637114aba4f6bf9695bb3a432 Mon Sep 17 00:00:00 2001 From: Jason Lunn Date: Wed, 12 Jul 2023 20:16:30 -0400 Subject: [PATCH 14/27] Add JRuby 9.4 and prefer to use it rather than 9.2. (#16) * Add JRuby 9.4 and prefer to use it rather than 9.2. * Bump ruby-build version. --- WORKSPACE | 4 ++-- bin/test-suite | 4 ++-- ruby/private/constants.bzl | 3 ++- ruby/private/sdk.bzl | 2 +- ruby/private/toolchains/ruby_runtime.bzl | 6 +++--- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index abca524..49876aa 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -31,9 +31,9 @@ ruby_runtime( register_toolchains("@ruby3//:toolchain") # Register a versioned ruby with its default name. -ruby_runtime("jruby-9.2") +ruby_runtime("jruby-9.4") -register_toolchains("@jruby-9.2//:toolchain") +register_toolchains("@jruby-9.4//:toolchain") local_repository( name = "rules_ruby_ruby_tests_testdata_another_workspace", diff --git a/bin/test-suite b/bin/test-suite index d583a4c..bb43541 100755 --- a/bin/test-suite +++ b/bin/test-suite @@ -183,8 +183,8 @@ test.workspace() { bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} ${BAZEL_TEST_OPTS} -- //... ; echo; echo bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 -- //... ; echo; echo bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=ruby-3.0 ${BAZEL_TEST_OPTS} -- //... ; echo; echo - bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 -- //... ; echo; echo - bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.2 ${BAZEL_TEST_OPTS} -- //... ; echo; echo + bazel ${BAZEL_OPTS} build ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.4 -- //... ; echo; echo + bazel ${BAZEL_OPTS} test ${BAZEL_BUILD_OPTS} --@rules_ruby//ruby/runtime:version=jruby-9.4 ${BAZEL_TEST_OPTS} -- //... ; echo; echo " } diff --git a/ruby/private/constants.bzl b/ruby/private/constants.bzl index dd48c4f..4bafff0 100644 --- a/ruby/private/constants.bzl +++ b/ruby/private/constants.bzl @@ -177,7 +177,8 @@ SUPPORTED_VERSIONS = [ "ruby-3.1.0", "ruby-3.1.1", "jruby-9.2.21.0", # Corresponded to 2.5.8 - "jruby-9.3.6.0", # Corresponds to 2.6.8 + "jruby-9.3.10.0", # Corresponds to 2.6.8 + "jruby-9.4.3.0", # Corresponds to 3.1.4 ] def get_supported_version(version): diff --git a/ruby/private/sdk.bzl b/ruby/private/sdk.bzl index 28ca3cd..da84961 100644 --- a/ruby/private/sdk.bzl +++ b/ruby/private/sdk.bzl @@ -25,7 +25,7 @@ def register_ruby_runtime(name, version = None): Args: name: the name of the generated Bazel repository - version: a version identifier (e.g. system, ruby-2.5, jruby-9.2) + version: a version identifier (e.g. system, ruby-2.5, jruby-9.4) """ if not version: version = name diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 975fb81..ae8e574 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -134,9 +134,9 @@ def ruby_bundle(**kwargs): def _install_ruby_version(ctx, version): ctx.download_and_extract( - url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20220825.tar.gz", - sha256 = "55d9363a27486e4ec9623985d7764c5cf8e59cafe58afcf666e81fa148dea2f0", - stripPrefix = "ruby-build-20220825", + url = "https://github.com/rbenv/ruby-build/archive/refs/tags/v20230710.tar.gz", + sha256 = "8c9cf458d461a9b6b63d44e4b5b246304168f665fd47adea1733ab6a7cd0f077", + stripPrefix = "ruby-build-20230710", ) install_path = "./build" From 29ed0a8bb10049bfd8b284978c44283a8f0f49bb Mon Sep 17 00:00:00 2001 From: Jason Lunn Date: Fri, 21 Jul 2023 15:08:20 -0400 Subject: [PATCH 15/27] Implement a workaround for FFI (#17) --- ruby/private/bundle/create_bundle_build_file.rb | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ruby/private/bundle/create_bundle_build_file.rb b/ruby/private/bundle/create_bundle_build_file.rb index 52626cf..ee981ec 100755 --- a/ruby/private/bundle/create_bundle_build_file.rb +++ b/ruby/private/bundle/create_bundle_build_file.rb @@ -84,6 +84,8 @@ Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first end +HERE = File.absolute_path '.' + require 'bundler' require 'json' require 'stringio' @@ -261,7 +263,14 @@ def register_gem(spec, template_out, bundle_lib_paths, bundle_binaries) # Usually, registering the directory paths listed in the `require_paths` of gemspecs is sufficient, but # some gems also require additional paths to be included in the load paths. require_paths += include_array(spec.name) - gem_lib_paths = require_paths.map { |require_path| File.join(gem_path, require_path) } + gem_lib_paths = require_paths.map do |require_path| + # Gems with native extensions (like ffi) will sometimes have elements of + # require_paths that are absolute rather than gem-path relative paths. + # It is incorrect to prepend those paths with the gem_path and Bazel will + # only allow relative paths as inputs to its glob() function. + pathname = Pathname.new(require_path) + pathname.absolute? ? pathname.relative_path_from(HERE).to_s : File.join(gem_path, require_path) + end bundle_lib_paths.push(*gem_lib_paths) # paths to search for executables From 85ba963612b0e11a30b2df30c15d5873e0f9ae60 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 12 Feb 2024 14:30:31 -0800 Subject: [PATCH 16/27] Make the ruby_runtime() rule re-load if PATH changes. (#22) This will make `rvm use` commands take effect immediately, rather than requiring a `blaze clean --expunge` first. This has an unfortunate side-effect of also forcing a re-download of hermetic Ruby versions when PATH changes. To fix this, we should make `system_ruby()` its own repository rule, so that hermetic Ruby versions are not affected by PATH. --- ruby/private/toolchains/ruby_runtime.bzl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index ae8e574..2e60c48 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -331,4 +331,9 @@ ruby_runtime = repository_rule( allow_single_file = True, ), }, + # Force a re-fetch when the Ruby version is changed through RVM. + # This will also force a re-download when PATH changes, which is + # unnecessary. To fix this, we may want to make system_ruby() + # a different repository rule from ruby_runtime(). + environ = ["PATH"], ) From 4f05aac363689551acb6d13fa015e51352af3960 Mon Sep 17 00:00:00 2001 From: Jason Lunn Date: Thu, 4 Apr 2024 13:58:40 -0400 Subject: [PATCH 17/27] Support ruby version paths that include the '+0' suffix observed when installing from ruby head. Also support gem paths used by bundler when installing gems from Github rather than RubyGems. (#28) --- WORKSPACE | 2 +- .../bundle/create_bundle_build_file.rb | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index 49876aa..6a1b951 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -120,7 +120,7 @@ load("@system_ruby_custom//:bundle.bzl", "ruby_bundle") ruby_bundle( name = "bundle", - bundler_version = "2.1.4", + bundler_version = "2.4.22", excludes = { "mini_portile": ["test/**/*"], }, diff --git a/ruby/private/bundle/create_bundle_build_file.rb b/ruby/private/bundle/create_bundle_build_file.rb index ee981ec..0c67128 100755 --- a/ruby/private/bundle/create_bundle_build_file.rb +++ b/ruby/private/bundle/create_bundle_build_file.rb @@ -68,7 +68,9 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. GEM_PATH = ->(ruby_version, gem_name, gem_version) do - Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*").first + glob || alt_glob end # For ordinary gems, this path is like 'lib/ruby/3.0.0/specifications/rspec-3.10.0.gemspec'. @@ -81,7 +83,9 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. SPEC_PATH = ->(ruby_version, gem_name, gem_version) do - Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*/**/*.gemspec").first + glob || alt_glob end HERE = File.absolute_path '.' @@ -193,7 +197,18 @@ def initialize(workspace_name:, # This attribute returns 0 as the third minor version number, which happens to be # what Ruby uses in the PATH to gems, eg. ruby 2.6.5 would have a folder called # ruby/2.6.0/gems for all minor versions of 2.6.* - @ruby_version ||= (RUBY_VERSION.split('.')[0..1] << 0).join('.') + @ruby_version ||= begin + version_string = (RUBY_VERSION.split('.')[0..1] << 0).join('.') + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}") + version_string + else + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}+0") + version_string + "+0" + else + raise "Cannot find directory named #{version_string} within lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}" + end + end + end end def generate! From 38cc4e071dccef9b2f70fb2347c6b1c510ee615c Mon Sep 17 00:00:00 2001 From: Zoey Greer Date: Fri, 11 Oct 2024 11:45:35 -0400 Subject: [PATCH 18/27] Use `RUBY_BASE_NAME`, since that is what the libdir uses (#38) --- ruby/private/bundle/create_bundle_build_file.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ruby/private/bundle/create_bundle_build_file.rb b/ruby/private/bundle/create_bundle_build_file.rb index 0c67128..dfa8596 100755 --- a/ruby/private/bundle/create_bundle_build_file.rb +++ b/ruby/private/bundle/create_bundle_build_file.rb @@ -68,8 +68,8 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. GEM_PATH = ->(ruby_version, gem_name, gem_version) do - glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first - alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/gems/#{gem_name}-#{gem_version}*").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*").first glob || alt_glob end @@ -83,8 +83,8 @@ # # Library path differs across implementations as `lib/ruby` on MRI and `lib/jruby` on JRuby. SPEC_PATH = ->(ruby_version, gem_name, gem_version) do - glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first - alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*/**/*.gemspec").first + glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/specifications/#{gem_name}-#{gem_version}*.gemspec").first + alt_glob = Dir.glob("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{ruby_version}/bundler/gems/#{gem_name}-*/**/*.gemspec").first glob || alt_glob end @@ -199,13 +199,13 @@ def initialize(workspace_name:, # ruby/2.6.0/gems for all minor versions of 2.6.* @ruby_version ||= begin version_string = (RUBY_VERSION.split('.')[0..1] << 0).join('.') - if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}") + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{version_string}") version_string else - if File.exist?("lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}/#{version_string}+0") + if File.exist?("lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}/#{version_string}+0") version_string + "+0" else - raise "Cannot find directory named #{version_string} within lib/#{RbConfig::CONFIG['RUBY_INSTALL_NAME']}" + raise "Cannot find directory named #{version_string} within lib/#{RbConfig::CONFIG['RUBY_BASE_NAME']}" end end end From f4de0fb975515f46d3603954eb34d7cff11b311c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Aug 2024 19:40:09 +0000 Subject: [PATCH 19/27] Bump rexml from 3.2.5 to 3.3.6 Bumps [rexml](https://github.com/ruby/rexml) from 3.2.5 to 3.3.6. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.5...v3.3.6) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9243824..a5bc485 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -7,7 +7,8 @@ GEM ast (~> 2.4.1) rainbow (3.0.0) regexp_parser (2.1.1) - rexml (3.2.5) + rexml (3.3.6) + strscan rubocop (0.93.1) parallel (~> 1.10) parser (>= 2.7.1.5) @@ -20,6 +21,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + strscan (3.1.0) unicode-display_width (1.8.0) PLATFORMS From e9db4239628380cb29b868a0b4b4a0f198ae97d7 Mon Sep 17 00:00:00 2001 From: Adam Cozzette Date: Thu, 24 Aug 2023 11:28:45 -0700 Subject: [PATCH 20/27] Set `allow_empty = True` on file globs This allows everything to build successfully with the `--incompatible_disallow_empty_glob` flag, which will eventually by enabled by default. I believe these particular globs are expected to be empty if Ruby is not installed locally. --- ruby/private/toolchains/ruby_runtime.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/private/toolchains/ruby_runtime.bzl b/ruby/private/toolchains/ruby_runtime.bzl index 2e60c48..651366c 100644 --- a/ruby/private/toolchains/ruby_runtime.bzl +++ b/ruby/private/toolchains/ruby_runtime.bzl @@ -74,14 +74,14 @@ sh_binary( cc_import( name = "libruby", - hdrs = glob({hdrs}), + hdrs = glob({hdrs}, allow_empty = True), shared_library = {shared_library}, static_library = {static_library}, ) cc_library( name = "headers", - hdrs = glob({hdrs}), + hdrs = glob({hdrs}, allow_empty = True), includes = {includes}, ) From aabf3c7621c3d1cc231ec6b5abfe55241922d4ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 15:47:59 +0000 Subject: [PATCH 21/27] Bump rexml from 3.2.5 to 3.3.6 in /examples/simple_script_vendored Bumps [rexml](https://github.com/ruby/rexml) from 3.2.5 to 3.3.6. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.5...v3.3.6) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_script_vendored/Gemfile.lock | 4 +++- .../vendor/cache/rexml-3.2.5.gem | Bin 93184 -> 0 bytes .../vendor/cache/rexml-3.3.6.gem | Bin 0 -> 104448 bytes .../vendor/cache/strscan-3.1.0.gem | Bin 0 -> 16384 bytes 4 files changed, 3 insertions(+), 1 deletion(-) delete mode 100644 examples/simple_script_vendored/vendor/cache/rexml-3.2.5.gem create mode 100644 examples/simple_script_vendored/vendor/cache/rexml-3.3.6.gem create mode 100644 examples/simple_script_vendored/vendor/cache/strscan-3.1.0.gem diff --git a/examples/simple_script_vendored/Gemfile.lock b/examples/simple_script_vendored/Gemfile.lock index 315f6e6..bc9b5d3 100644 --- a/examples/simple_script_vendored/Gemfile.lock +++ b/examples/simple_script_vendored/Gemfile.lock @@ -8,7 +8,8 @@ GEM ast (~> 2.4.1) rainbow (3.0.0) regexp_parser (2.1.1) - rexml (3.2.5) + rexml (3.3.6) + strscan rspec (3.7.0) rspec-core (~> 3.7.0) rspec-expectations (~> 3.7.0) @@ -37,6 +38,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + strscan (3.1.0) unicode-display_width (2.1.0) PLATFORMS diff --git a/examples/simple_script_vendored/vendor/cache/rexml-3.2.5.gem b/examples/simple_script_vendored/vendor/cache/rexml-3.2.5.gem deleted file mode 100644 index 5680fec4c6a6c21d480bf8501599ebd4278097ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93184 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

D1$}KwM!C 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%0D$g!E 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 diff --git a/examples/simple_script_vendored/vendor/cache/rexml-3.3.6.gem b/examples/simple_script_vendored/vendor/cache/rexml-3.3.6.gem new file mode 100644 index 0000000000000000000000000000000000000000..bf6b6fdb8fc64704f63b5b15aad117428bab6abd GIT binary patch literal 104448 zcmeFYLy#{_5a8M7YumPM>$Pp$wr$(C{o1x|+jjpO`_1lQHs-RYiQU6y9jYoaDkBT= ztB9;DTT>T96GIn6dUG$J|6RiPpRlsB0{xHrKlxv4CU#b4ASPCJb|yAP4i;7xAVww@ zRyJlJLdO4H4*lQlx;ncUI{oL8yM?K#&Hr8TzqJ3K^#9k~{^#WWm*M|k?Gi*o0UgDS znt_1csB703vm^SQsn0(($qT0JsG%uU_vBPmb#@_8C~3E95gC*3$2L~-#f|@b#u259 z5H`r)h-8C}{G1x|9yRhEQAQ2g$4tdX&I*8zJyTRHxoiPp@C;zV)Pjsy{S^VVr3(hd zl-A&WSgh}%gc^dqF#Tfwp|>C%%4KJ}C~yZkZCD&F6GHtd(gi2p=3b^B52X%~6!}Ep z#GLjR0i*hOQdVFjgT-5o_NQlgF?tCS2TfZ zJ@b;T)lwDHN(E{W$Yat`;_yK!5?#>!D!tY)jhbc7Lj*|Z{r%WEJ#s@aj$Q_|f7s%z zfw$(d+v5w^e6sf>xJ0uZXc1XP_QVAOW$tVZ4?)+5(3)XAa|&2Clfo<#OI(1MLBp}I za4R@(WoIior@69wCVDV?C#thV8=zb64v8t*?npR8CCmO8E_Zm0Mix}+kK>AD`6H#nSsgU%#(kxTEB@5! z9OW%>T`Nc_wOW_F6IDVpO^P6!*F)M@dOqQN0W%1T{cO{;N&p_eyoHB0T3O4niF=u^t5$j z+!D7dd0HV@3!Ew7=o=}C)=e#R$y_W*XCWgON>3-EMjrliIj`#9`P7SZK@?Syqk<5; z?N4pPawj=Pd^c;5_<_`vX+6~-(@U2GN%rUz=!0dB=Z{k#CZ3|O<-d!lUyfi8qoNf* zQ#cW)?g$*-&))~og{}v=y3EQv`j#RXIIL883;u$`W@OFLhX3EqjsKJV{}J&2HU6_O z{#V%kSN^kbF#Z4h|KGj$|HJuE(kPF}45kPDv&uwSu5 zljD#XuAp_Kb+?s&m~uIx%+ZD z?*pzH7#w;oWM2XN-;OFBuYldqHD^RYUCuxnaXW__vBWKm;{MFiuve1T7GSUvR?pf762znf>9j~iLR z>+YtD!y5=R0N?J8;O+*0Wn}lKn&Zy>_0_)$7KrE-A#NnQr_Fmz;rhKG&Q^7CWq82) z!R_sSW$xY?aI%}-bEFTQy5>CwSYNdkmF?c*=iT*w`I&hw^mzNZ-x*l21NUxjc7MK{ zdEMRG$t?>wEtG5oyzP7&J3c?XW^D_|ZZ87X!t5pD>Z_n-?+*TW3i+$ao z%|p+7DPu_7x#`~=r0@7&3lsc9@UNB5km&k-!iO1{nw)*zy2&q)enO!H#`Splad@LM zg4q%9`h7h2xO@M8sC&QIH#n;R35a(?_=S)9KJV~wb`TZy@^8_`;Mp46T4oFYf*G)W z|9Sjgz+bSk|MhsgzyIz!>Iwc1ot%U017ZRiv#sb95#?JiuLIGAhxZpN_zPO(sr&W# zM9(WA%8Xq4FA+>auu**str)Wf5{#Gqlk(Nw->dm;>Gr2u*T*|R!Eb|SQx|b7+*?A! zAU^xs6tFfq;C;#L1krF2Gw`y1x4Xz%QbM1)Yk2E%CtZuEXu|e`z*w;-C@u zQvbcV`*B+Cz7?>-8F}(QldNvd%J}7>naaI;`b~e&MgiQ)YE(|oM4p^FIm@z&Lee&g zUs)C}A?2U)cM3tV2pMDjw7p_Y%|!NC=dkPK=oFM8`Uhg&VdFoG`SW7$^TO*Nlw#~a zzquX%5y@&XcpUP?I}bN87zmE7xb7!9T@ezM4a{(3+R6mDLY zJAWMoP9t&2Hlk>AgECtL^16{Isy;xBsoQd%-wvt-$UT1>(jlwEuOrL-;kzG1KyS>? z63Ej`kx$sUJ%z##dMWUR?F)o6kfMwMeH(<+A>`QL#V5r2lMDRjx(&AzaUqBYS`3=0 z1Y4;NzsWQo!8-Bt@EQvxVJEL0ivDv`(r|5mhez;5`@^l~RKy6OJnCAf9058I1aUu! zGa6)dFl%(UD;~kHs8Wo3v|!l^^B}0n)$0^SP|{$M#9lYh*V=G_)L|7f?&c&~=a)yD zd=}m%IQ#NKLWLlEd!LD3&vJdf(GMC7$nhF3KAVIdk=+lrl?;LE*%Nxq5whnsh(^|M zZTUuE7Lzd6z+y}kiB_IEjbDiwNX0%ykW!Q!L<Ct5CRz&Xhe_FBd{DD0eyS*Y9OU*8(!p&f&~l#!<_bw>KR1p0WO+J3yIH$-e-{r zzIvT+Oy(!O>ZzJ_L^DrxT>Ey$$V52tiAYM(W4HA}V3F+K7qC2hu?IzYQ;HuH(9^VF zQ{2Gz1-*q#)xr2HfGUG$^y*}A&n;!hqj@AhPd%qYsUVt^4Zez=qV1qL1>%>K+~9Rn6}LfW%gpRKQ)ol zRcyB_QpB6<(njObMk!)nwS=*GIu8v2D+$al*;urI-08oxU3;2Y|i9FH6jM|~6 z;(<7URE#kFE`g29Z6ExaICx?|79n-i`t1d@!ynvMan1*Rw30^@C}({|mQl+|Ev}!v zIHO^(uhUKLyd2AB=bm>k7C`7OhrbCyj(FvH zYHCugi*(#)IewNcY;w)rPba>$u@SsM3FwlZa)Z^!`g*tcIJ7lxWR^gp7Ve$)_45X3 zz2asy%I`$s;lrfguxmYG-J;|$+(k5^tOU-ppL94Ab_-Ue}F_E*saFNA-9t?^??+y$!0u z1SuA*_<;-X*_kmZIUWx%9qw4yXf1C{G=A$HeL1fIhn)BH-}7_lrcDvoQsp1h=TcXh zE2(lv8>qSuhK6)q#>Cw@q4(?>bCS@pJ@5wYu{%bQx_Wf>p_C`h2q+6VSI>2`AT0_a zcgDS+n(VgGC+5mkJX+@`hxW)I);fci`Tuy8WJH+BMwp~c9x{O?pI$3ZZ>$y(uUYfT zFl;3HXMxN-ust~B7{PYR0{N&wUQLozGsz*{{AJW;xN2_qpP)$1p=j8P%8GoaSWmRd z@~kp%)6*dgc+GfSrCfC|7nb>6Cw9L3|n(^2+=gM_CA!uu4+coYN%R=AX8uW4_ z&@sELDouYvvU;`JT}b{4=O7?`^#gYJNJwmVp+U~<2FR_pTK;Wa=;;(#6XOQ-TAcn9 z-S;3@p2S4`v*GOUa0;R4{OLJ}g?;+K_P5#jV$^w|6qfij zV^^eA!6lrpFa8i}a!|D0xY36Tb}#o~Z#&!3S?wy098=cm6H7V3&k59vQtIxJnf{(z z9$BPuylWaCk*%@jaQC5~XzYlNJEzCOVXTKUaJG(*hp(f15W%km(E7H3u{GrXS$?Ww zV4r*#;&4-N=JdB|x9h4>5?e^X62;=35|kTTg5Rzg`z7Duo1*-oxcuwf68U(_5hx5h zrjBE_6(xr}yp)M>p}#L|L@po-x`f>BZUY85JRa;Gmf{mg$@%7QJJlFkEbb56nM+q7 zU;#8JzrLJ8A;L>1y^bV{&wUq;!2eOTx_d_lT+c6TU*Y z>mgUJlXb^76V!qU4F^!)SBUeAIsTYKnx&m}Uvu~jdG+#=5b0oCJy-4wLLg)q&2eM# zu7eA?1@XHq1Ac$@`djaDJPOJz5y(nC^BR?W(v+ea*g;={qG(DlQLHM%{myr~;}MN{0A%c{I1gH*tjm4^4i+|lhe^R%HC=kH9o;W>1}LW$XW zA)g^6BWM2A8^q5%+1_-jyxk5iKrS+Ir#kK?ZM4^&rw$*4~1mmR|%$fxS!)@Bf2-w;xIXm zblBjC0jNLkHHTn!{P5TV5ZqH8N58Czh3qR}9K6d0@$*V}Vtr;t7A3SAc=XY934uO+ z`(Sat2RdD$C{2q-x^{)kz>_3wx1oTe+b}q!XaR7}{`U`$e12^$JyWWmn-{_MzQOtI zfRbrxXxV9X-yQaeT&?GE{Sl4+b$qb3{W-k+(xd=7=>%2s(}&kCNcC9kcAzbr*3GCB z50jmm(-_BjWyaS)ZFBuXfU{?;7!jhd5rUonUNR0Qi+^U*7W^YN5y z#Pdfy2k`n3=HDz#x!kmcW*P=eNX_p94D7SGL98CTDd-#?%N%=&N^s82yn-WKY(@(P zaC!;U{`TM#+)u|pFGPv90*$3_wHQA4LO_6nyCWLY63y6LcVGW~?x7EG#)dkH8qMiK zn{@nlK68gKLotm&Jm3OC2MU-syRa6l6h(W^-rG*0P9*T6yQq0t%Inu9=v+zW0s4Z> zh1F?|P-v=wnAhWPB@QSDy#Bf{u&A>2KEK~JK1Kk@uL}&&X$k93IppIRY4w)0y#f)z zXfap{n)5Bzwvfo-Ji-w3r{6i;tl=Oy3+AftB1beJkv>d5n(5x{SZO`uwUcyHkKSg> zNr?u8N?RS{6td|z%aLxT-HrLWsCegIEEnff98Bjr{HP+uT2#xk*??EqqivDFW$+1M z{FysU>z^&t*9!C)>f>))Pum?r+mjkUDk(k5iV>*++)<1;XuP|CaY{vqjo8a7(o1X6u|8(OckOuaKN0b`hJBWHckNhmc<_Az*Z%Y|hC z85zw03YCy;2Vh||fidHN4%!Oi+V8xuyt3Xx9zE=OrVwZFaiL+V#ruFPA>F^GzHje0 zzpcw$Vl4cO8)`vh^-w8I1m$iRa$k3^&rpDv=%)qhpv=Tbxb=y$GuRp6l?ggeKlttTx*ImXCwgzM|Tl_tkT+$SK8L7Pq3&yz4{qOFilf_684 zRJ{7Uctax7m7KDJ8>+J{PH_bz<_4KFT4z_iqE)H3aD)i{b3VzJeltj!(_|@T>apRx z5g3Z&J&?iYjbxV~PObKW*%II*e5T15fx=oRdkYrZ20Diq@#_kSuO&fnTf+tv2Z`nR z7ae4-)PxWd)WqvtTn1vnS=|y4!u34Oj2-yN@XdrckZWe^_-9xZ7MA0hizLI^<1o^W zw>5E8s{PIn46l1tGZ}e9&$gC)I!L4edyGJb5hr|yc4-<}Q*sgvE=AVLMWSCJlVsCwh)`bP zsSC6r8MIzvfC;o7XFNIPuzpseoZhaEcRmZF4wM~!YtOdg!rur{fr$k}^xrhqdvDC@e7w&=TV@^>jECM=QHX{kb_UU|2CdSGYkH=Psl4@gs zxxs<$;Ge-D5E|llsgqa^myxD(;8}jNoU^6PM<5X?>kp&Wd z(+VFTrLXxGQ7LeE>oqraRz>Xuv#EmNcCWSQ$|FvBp5yWl{l(z0~h?5_r(eQ?9 z(B**1ZD<$9dY2Q>0oh>(!(r9g1o82JlUnc^@Q7d%3xZdIbzirC$7qP_HBeQQSS<#g zrU#G0g%3-rgds8^&fQtG)-@`?;2S%c1kZSJ)f4!S=H8bqcM-$0z<8ji$$Em*(r;O* z7+U9bOX>D0q!VJP+aMBAu46;J@bkr`u1y$K$oQWSf>tC&{$bDD$qaL$a}+Hme<_$> zLD!dzcrTS*V3hvmxEO+OI55yBczU8uxc zV2I<#aBM%ZIugOoZ-l8im00HxMv0(?*zNl}l$yhn@CPy=x%-N^WKAVIEN?|BW#1U& zGzu8Ww#p9dwD=JTVKoU2hm;Si~RbMxhdsJYAusxSD1Ue^y9DRXT1UlM|+!iqMSB53Yp4mEB?6rdmj))DMq!LDn7ZN(~*c%9O z{L#gy9jAK^@O9}1?!Xbk9%x^nVjOLGn)!mSqap#HDQ1Xw!_FP82KJJdJKG!X&_M59 z?r@nuQR*&rF2L$9X0ZHiiYvNATvrN~T$Kzpt_MHbNvOrF;^>Puq^vTVUtsORUcUCs?LXXb|p zlew2&9eBuEv_~cFn1-^nYm#sETiOyY;68QYESsP#Z}Hj_dD@R+-#guO$PE@XMoFex zSmKJ=fHNg}aG6Su=V=pMN+tzEX=*Gump6tq`j+ryy2<(92iMP<&Cv9%;<7;Awn7J)f|QgQ2D-R*KCp#F%5T0@agVuG~v zizQWmakssjuMQQFHmBg25+YYQAH2ns;d{&&8+<@(;0VpzA<^YPRtk#iR8m@)aissq z2*c-OZ_g$$pqh=plcFff;<+Y$DRrTv?^*bles>IGj&d@zjMGIwX>!4T; z?Fp!}&Sn%vHi|QYF+J+C_BrOxta7{(l%_ha)!IeLb9JZuH9N>q7CCZ5Okj&XmsAb} zK?3Z8+kp>7oO=`W{9w8V1BU()0tT+e_2@` zF+hHvIVp{ouRP`h@%XM_)IE-V@WD$Hr~v2EOlZ~YVM2$9Cuo^>!KP;mI)`XytMmSo z7VJ%jBmJJ5=A}!qetD2M8B6vx8Sl5}#3X}3@ZHF-S!9ju;cts%NSM_f*z-SM_y?o>qovi zCt6ySE{l|8D$d$v=K|b}MUz8rt!_t-@@0J!#Thl1XCM%;Av*Lr@w0EDwXEo$Nr-6f z5p{M5u>zwUm=(ooLj`F|_L}Hq>;eStYKZnVIf3+4P%1DfFeh*zD^B43Rr|x>!a`z3Wb(P#p6l9ani2nNZ^U_7F1r zbF5*-eMkNt(zm`Ue#)$2awy5hh+~Tg+R+pRBu$snYi2*ps~9hE^r#ZsgVb8Yeai%5 zAFqV9a;)Qr@f@=hP_Gk6CvxjD?1@rQ3cid&Io=FyD@K$O55^&Rd=j!zX1JXTro zBn@H4}kI8FEG`v^COC zdO=2caqbQC&geV=2eIv29;Zj$Hx;G|E(VL~Gwnk>yL;d}`Tk8r@qbx{);?jk?Et~@>ZnF%FpQWiDmMdGv+|yXwQo{$nT!0#A&Xq7 zjGW*6&KaUz$l*K=!r;WYAanpz?w%rbMQmRmgEBf`GR+JYgTn4!y+DM)4iXf@14>{m zoQHEeSQ%bv!N|^)AkSDg*?uP`aLKfn%{2Xd&WA-3+vX5OdAU1L%#qq540e<1TrQRL zpaWd;;|wi(@%a%pNlQlP7S+%>OiCYnoV@lF01GZ7X}BOClZ}VRYsq*;!L>2Mu=J&b z^H}OxN{!e|Zwkxppd|L=BlMGU7RQInIxASu-xnR!2zy5gFG?s%NMCjK_A3g|e|Zc{ z1423UU*)cje9wpH|FQe^R|E*C!M)nc-HIFY$58Y+@H&B}as(YIOl;mwwF>{e0*jJj zT7^-1^W{&}L$)3f=xm0XcFLL^f;VM;itaJ3?fTAxEwVTGH* zdq%}EezI&C3TH5<$ivodAb013DRc;2xY`hc5Gl8zP$lW9H4=V(#fn&v;3X~uMDJ** zRRif)1WE3hYJfX~Xz_<4{lSu|olc72rE&>gU z$sG4=m0c*-1dFrYXQSVJqqEOOh(%Pk(j?@#I|28s zbd7_|tTAl}OfB?^N0V6jOAv(EgC`Vd5_{u{*GC!mwex`@Q-{CK<@svi;Z|D_ZfwW@ zkleVL;H6rd4IOzyXOz5jdPf!0I2#re!&(#m6eNqv=S;A@tNmaxy_lkCZrObWt`aA zQgcM6ZE6(OL+bK!L=F0uPeocYNIQ;{gq89iY2{WER4E;FhE}14>TFJ5|6u4p+y8EG7MS!;0mJ1n z?TY3|3F|znafy@20FLc|(idMCx)eGk!~%Jy-^&}iNe25YLbFBU^3+X6`GqorE+&(a@0{)~p5 z3;kVy13@^_P$;cP;8t}=vh&15KelBuRkTvqJAc@dr1H&$4*%#8@Z0gwnkhl?dQpyM z4^}w7%Xg}*zS1Zu>Nod+Y0*-@e}XRiFYhPn;xxnL>bnSUU*x%3O4Rv03`$0bnbuBm zs(a^tfk%H*zPmUMKU)8I;;48W>lJ6~9C)%2WOrp%z`0>KnySK3#hSM7-??x-_H$G- zh@6Jx!e>0SV(!dkE{>XhMQCzlJ}%8WfAWR@*)Fe*xN(llguuk`H-)9J#_tdLmXC2Bk(rpyXD*8== zR=x}f$uy4;vNo%>=0%trv)`P30AlFPH6}y=< z6Ctx30Hg7t;WxubrM#GTX{OfE`Q$)~Qg?OUM8#L`Gp(E^&P7$C0{fu%z)$Evsuwte z!a+?uD8KC#Z4`&=k_|Pluo8x7y(F&XhWEzPL^k*#35Aonw~!jk>kKT%)CDGNTDja6 z3uQNW9MHth(LYUAn+^;43AMrn_+|+!ecSW%ppEW-7D{<%YHU0|we@ap&j3l3l9_aD zKQa7yqdM~9f7Q>?7OsP2a>@*kK;OQA8GtTagr6yJ5wI z-w4;BGOT4M^e77+tR_+?&2g?_KUlX^4iFZWG|e>-iZ3_UAZzfyX4V}Q(I(!!Zb0~4*g)LbOt{O(nJrYO`y%L6MIkjhD<6ll`CJD1htPXi_^Gt~( zwpwSmlT%~o*0cnkCFY{HiPM;;PO-Zh$1EMo65YwiDlq1ALzsp?`LvILQS8qn(T~f` zG}H{ua`lzX*4Q70oNEbn%1L$5e=-p`n z6D16luH}E04a0th<-kZJE1Gcmu#kc?U1aVChn0`%Xz(e~+tsK`LX*gI(Y3tdkF@!bu%~7f6PlW~RAX=PcuF z%7yD)MasDw43aCx{H%yS5F6WmJSMrhRW5IHZNjR;r(1a>_9UKAcfFSe}kX5DLT@m93$gG(8{$i{MaAt}J|V z@QR|b#BnA-^x(VPxE3a7H^E~1H!YU`=uWY@&lIX07^)qdY9p2xD|4h2WzOicvaBYu zEGI8YgyV(zNdF>3mKktl2kmsjh>Gc88{PX4bSBIRD-gv%k8?;Py=)@C7>bnhm|paYnRF5khdI$4TnYy-FElIt z5kl@B^(jiOkiVdrO2&__*3mc>BAwK=au~po8wib*0B3GDQiy1tRB3dQp#)QmZJuuD zek!|*AJl?}@<|6JCh1s7FKo2C+zT6~{v=lQXV!(&)re~1be1dUQHgDN{C>Ttc1YLr zq|TKU>}kL8HH9&wb%mv1@x+C!Z#NOd*{S`zi?s3r`7L0`+ax$SKE>$Tvxn>0M2y`y(yLtrnj5%~HkcP!Irboj__io2uc7X{tJ*pw!Ie=JdN+P{kPOIk$t!}A?Lp7H5`#3w3a@|5O92@Ql z*hQAFonVJ_aK_r4l>eK^|EF;NL}w>odg(>iM{#!-5gX_2T&>lJ+1qh~>aXppRPt7P z;~XU??2Epr98gwYXa_)_H2)vd_T`B0yMdcXbwt^RO4F#vbGW8-6D72i6Kx>B6GNak zJVot`R&OJ=oOz9zLlpTsLuzN3vMe!il;C255sDN(>zX2z;i~61G!YCVEWB#s1$tFy zmZy_G-;`Eu+Lp>1;dG>?z%rLDWm92ihgdPdIn6o~K48+|8CoTwZWRkEu_jYztHRa#~P+OFHrf4_GD_laCg zR_K{sntP`(nv37APABy9xr6o0@JiOzr}^d@QbP&TcW9^3PN-`Ltbw}0VC`_#s<^GY7Ez^d_jLtp~o zxoys!Dz@Imf)Je1_q|Hb?sg`Pb~-daBhg2}gKUz4f@NDM33+W6jX(#=lyT|(6HnjB zq8sd{VacQ%vbG178y|UbVGY^$dQ=YKj=RKn#0txpU+?Lg!Rn+LzOQ;IX{T-r?7Z}K z>&IJ+$qG~O<9>qwVqo+WB5`J{3&b-gyt&$8PMwk(@>?pE$~h%vdg~T4KyVH>C|%QM z9@%dH14()_r2EVM@YB}Xy8LZ_vwHdVg`iLQJGAxg)>ab($va!)0?F()^6J?0de7@U z5Nnz$zb<;IM~^+LNgXYPp|7cixT8c|W!k%soE19Fs4Tzc9$^mN!PDAnT(K`s?YwBVz~v!y0yJZZyoWz(|94Z$z)!R5># zn`k_mIaXG`9(=}6$KN)cPoxbHM5B@v??P5&QnKZ~Unwnq_PKFEJZU~oxOFJjX zu#P~}vKd|qSvb{zEg4p#zB3FWlc+;^t}{Cw184k+F~Ti7l~PmnTp=rZu5~1b)tw<| z5~TbFQfOSQu8b8;K0L3AaQ4`Iu>68a7hJB%#mTk^uUkzD87ZR1lm%JU1b)!Tofdjx zi^y=bXA{zo!qJlYr^ zq5Ni~7bl>79CUlVUnE3M?1BcxRYt7D3-ihTZO+qVI&KLoIs*RrOT{Q5h2`3A`Ev-#m*Yoc@X>%X?&b5Y~SOq$g@ zG2k|4XiTgRp88@+fGk_A;e>pMoZ!Il>Pzo)LWj*)I}L>TYhu0+e1idbd(YgdrGqG5 zHj`(?)7#sLzKMV46B<<8z;4NRn405AGsQA`YKd(Yerl@37&pCCGKnzhT~e3Kmfzd^ zQj*x-qs6ahdvc7Skg}-^izHSV18^fNt*|eR6f31OddM>GB}*6l84)`dhuwDbiM}e~ zTFsEBx(UVV^0;gE?k--xo9n6tH{8jy>$SdecL}@eeTkq~QI5xX^3>+HKa=*#^HVVX z$GW5vnv&PgXs<18LK8NIeLpdj9EwpjXJjH3g_e=I;lAz9!D`ON%H^%yC*PY@7xCoI68-KDX?I51Y_cPT(*DcsxTU$dZ_^{)P-$&WHK2g*xPf&ic z)bz^Fv6JJ`Ou)+I^{;3idlAIy>~Rd)t;!3HAxX?U90mLoGs#BU*rczDow1H}cjoe< z+cgW-?IMuM`7!MMng9x31NsAF2*W*3K;{fn8~qwrHPa{M4Z(3*J@&G-)v;&0dffnd zC>_B(3##q+T1GJZ{<(pk+F=~%;11WjX(^#O6BCEKui%(ECz)pk50;)1spO5bi4k9r zPH~-TagMsdzFCgA7ZmjEH{q9PkCKqhX6dEE5$}X}NOn z54b%KX&u9?lF?H_6c1fIBLL#ZtGn`vjC*9loFL=FFlDkhJnjNjAK;_e91E#kq1fXE zn4vl3G0;ZPgT63t!L$!KNy;5ucB`vX%%kev&W5yj%@3G*M_AtSh|JxQmg#4D8M94b zy|oBId3I}EJqevNrcJ!}9)u;QjRK#zJR0RHo5sZxJ6Ky4wVbv~5&vB?$zb=uaAKrE z0vXlKS<*R+rMox%h&gb$je;A8Ge&`shWQOqo&&zu!F1HbcB#pOka`b33vif4&lP)X zGJJPpv+=)HHOD`F+ed92Z%>jlyPAOQK-s$spC-pt7pSr_T7ab~@|t}}_ceE(pq@+4 zzXJiR5#cv(QhM+LSZFsL4d?#?Zd~pzY2H^Naaqc$oQf1|3+3c_&1p}Ao%8lO1uwZk z!^HE>IalFR7JVi67uZ*aPk66<<~P^gv+WjZZvr7mn0pT^+4rK)0Z-|E4sDt@1M(H> zZ1l%5-B4*o?OUyyuHh@Sy2G7!+kr8M@3?lfiqOSjED&B`+5(<(1okAz_Bl*$qfdje zWFPeOK4;tmYUL|hI~qmx57~zYRxN~8ixcAGX(+Wb_6B7Xs(Cm6hMo8PfV{I zZJ_>W{?<_f;7irV8GL2UL5!Q5yt&n9W?!(T=AO$ zPgcOQU%Jurtl|4fJgk@8DYCl<1w?`U2JIE*4<1od%9v4&7i+iUQlqe~gPOjppZEpe zH>3VbZk+au)jRiNaldwLYRGTDu39&80PnA{^!KBASpRWtF_JSS2s_+P(0}ap-HPuY zCU*NSJ3>QVQQ`rAb~P|0oVFBoA1P?|r$!%NiM#be)}rrBwrdrYxnq(NkEjrJ>=aYA zd6f!hEj7$ST=8*fQHBcehhWCB_RYedx%IR866-O(4Hi6XTkYr%J>==bv2`30Vd#wp zXgev_+WzE71{Spa3BKQ3coUu~;`v-P2eo?SzD3>7CoMnR+*^6^&;C&_ufw;1$td_u zS6@~7^tZk7{@PPt`SmEal#=Kl8j-0r+V1k;i@JSmg~iZu35!-?#KEQ%;r`p-xYe*b zqHCTQnHVIkik>T0*A$_;uTJ0F6k52>)32s;=9Q%u7VQlgtz&B>{Q%eSSljC?wb#V> zU#ovT76eO%KaV9JKk zKyX|8{RVHDwUD#u(I=Vhr%Uoih9FlJ^?9(lTEe9wiS5(;%(($ikQzIPP$MP1Eetd;^slIrmHKa zECiwWu|H7%J(J4!a(il#LL#Pxz%yWzJ?)R^eIyyUg5z-ak1`(dBxhU>_}=`B+3Z?` zOx4y#8?TW?@(L}+l|KIO+&!~j!*2_JH6|qK!Afyk-BUV+eUGwtfuiiYT!?9UEl}o0 z?(A)7r$=Y_{1TWUm~Z+|NY4_yeMwlC_N2A^s^z)#Zu#qP{Yb;BvN|=1o9)uQfkVJy z(1w}m;^ZSlN1+K*_xkjVi>IOx$p2A*!+&jFy)^pTWEBeqGA1=a#ud|Km?y|BpE?JQUOgh!#UXai<=`$?hz&GyW_ipxQPz z6UC<^HgT)l7O*f0`zJk|ni9_KdOqh1?+XZII+^$-^}*v=RoMqszU}$@dH8%0&7RV zR4zg!t0%CjP^!6&QI>V-x^^1-p4B({Eg~|j$J=oob))|SOj$_664oP%n?<531>&2q zk+!+b?bjkbbIWhpBO`qH(hrHH`KgSvtc-PAv&hbjV(;3KOS$bMAd!cq^&6^@4e=Djcif^P zyl9f|sMHK!;Vq(~bBr*L>-5raGl!1)3b%-li#HMP!Kl7d6^?Cn#(eDvM12$KLJmI3YT9lXIe;_rC4STm(sQ+G0e= zgQhFN_3&a7m+J1J$SL25DG{|3Nx~s#!?J203tJ)#uyXoYT4>p1x#LuqjXOCnFeZ*g zG?)!j8E1{RLRzzKAMYR^+M30v1rXHnWG?c{xP|7*5{v9{pr_SBgzMWo*7QS<{ znp0+GyPm672pbsQ;7F6L{w=Fw%TZS@Iekh}y0mPxd$YvMJ^UNe5^>+; zbL+7_AgfpN#8p|g**?$EZ2XAzjbtV+X176Qo}!TL0Ve;#F_Gy(1`R@!QI29q*m>?1 z+NjAh##L3lG9|pe+JsB>F0%Q#>@>M@`-X^xBWM2XfjQ*hG>gvA9AROzC}d`i01kopM9OOkL4*_*k!gnmfi z56jenLbxQ#m;qLB^ZoVx_?g-AKN^Rez~!AU>Z|!)vnxJG|L@xjzvg$|FJS8U7pZT7 zE$~pIiJ*;f0J|f3PQQT7gY$NGMOf8o-xZXi9mRwJ!sLCyQ-hN9Q*T_6v0(7hL#TjZ z6t(+YjM(9q?bRTZBCNOFg$W!o!H=*Rn5_^CnqXh={{U7%slSW|gFA8Uc(9ZNGpBFA zy>_B;;MT082LLZzc>_A2$9FekLy21)xuL{E-KNzTa)o;&8+Go4KSFXl*sy;M zOxcK{EeUL63BFU43IM%;-^Fd0MG;u>E^r4P7_JVkB`OsRDRpn1YcQBX0rnAC3SkJP z`OZ~D|H8);mB{5D8pRmrOzehvs5g$>eikcI9jF`wq|hG+Jx))7LUQd4?-Ff$@^s&Y zH*hPT=uXWh!25i16-A?PeQD|D=B9bG9QLk!e-Ji%{`C^-O{(C7`k-UoaU`aqU$;NO6C7A}Bb zgBVLX0c!*GiW-AK2-fJGPRBv^D+mJHFE>|Uf>69-1>@rIr9X~ycl6_g8+9z(yW;D< zfjT`0#{^$IT=It7%4?vt?sN|X@x}!>BOJiGNtugBUZndGgv03$T${B>s>V3*YNS+< zmGQ;9?+^Ey_&paZTcZ zg9|hs6680e>2F6=fCEz0n>f3Vb-Qw6q^_@%4Em_uL*@{-*0e?vN?O;|d@GCS0Ucfa zZSMfs{^9w5(6zT#E1r+n*}6mE>09m;DmEn;q}f20K(`jr&@v)a#Y^w2N+Y3!(*a>6`1OkWkyId#Ap(R=Vx0ubK;u)sGCAh4 zWVK3VKq$9aQu`V#$>u14sSmg*?FObuh=e2EPyGVARk~97MK?a{QwR7v@IJUWNPQFp zsB%dMI$_QRZ2@ydNTn*tc@Ooed?rJ1n>b=Z1}0KjGp!5Cc}X(OEpLEUr`W0Hj{v5RV86AYxpkNmXG;pvOP7>-Lp% zD})N{6pP;@hN>Eyg^TOnoe^#~{gbUSigo$tg-bRmgpgaNXlx_dhs_$1$E5+0nTQWlmR-+|gPp&>%k zx6&BQH>C%L(04DA298I?f&URs&McM0P1y=N2Ii#^6-paYy+t?U0xk6A1NJti%YWJ( z0xAJcfuB#XuMIG9*W-t$V8);VY9z)?e#`2hg{){)jfr)P!zXn4m=q1OP))c#3`Ech zBR7ahhJjr?1BUUy9}m5MjY$~d0aTgiaRW*g4SGpT)UtuHH2Vv3q-qYm(+#15(qj=V z*btOn0HR~yGVe?8FR&5W)05tth3Ci@4K%tN(bypmvHk&MX&R;QI~}pDR8Fk4b*HHK zw{0y6Ybe*$6$q3j2qCWT&d|o&6t#^%?Hs&1{`K81Xc&L1rru`EQCw$%O2F$g1P5if za1;K+2iDu{3FbIe3~!Q`lU3EmrwaYl`JR$}qy-TY-JzjQ{S))f0JL5RBV3hRT#%in z`G>+Eupl+33t>By4a06iLdTpJ3UFe+vVdbb?nc#M5CQ$|ZKgpsr<+pq;bQ0xE*1@_ zx&(+Ivc*`90S)vkb3O4z)h!_a1h--f>p^NY%MlCYPs$oxVT`>{u+CNGeOzV2h)qM8eEhM1v( z0 zE{aC+I_Qc~!vkq;IHS?P>ye&A{=L{bovl*kL@C_dUiM^x3Efgz8saWls%&GUv3qbV z*AN?jYBXT(X*9Ns2VEyn4^+v?3QP`Mg`<*z9?3vY$w0421|;HjF}GnqSrja{O+B5S zQGGxnW>cT})Ypva7jg=FP-nB{H1iFT?Ua|{Bj;}5JAG+?TYi}+aLHaGM?@WL21=EL z!&o_kMPOJi%6TUhqcnlI59l4GC+r}_&Pbh)AKa}|Yg5u{=(bic}!weF+ zmws@!S?j@1z_g}?=Ja0BWM>`-+>P6PKuGLL*sP5lSh9DW-iI=+zZ?aMi*%UJaiwH!)T=MY1a(V#qN*coh5>B1$N(9<&hxL zoda{1CwEdc?@nHVg1b;RS|nqhfdc8R6}8%gnHim>xONQUR8n1nC)b^U1uwbkRRE;* zn>L)ZW$O+G-Y5i;&ZDy&-jcU`0m#?KY1a+oO;*>)BBeD7fcfQ$eDky~3;)5|Pra?n zda?=lKW-+g{n*TU=1o5d_r-MfhQ?_>7jW;H{`t;;e@W*{jRqf*K3$#1aW*oeFc2G_vBwGZmi zT^K}neVCv3B4^+^xDSRUxUe$@^nQj>=&q#a5@)THRQp zuk>&fcs+M(xz%j7HkSAYAV>a#Y&^AY&qVZRCkXDuJ0J6cWFh%i@wX-{;BW8@MrrIi z&zjGkmBNmuicG}*L3#4U-*6ZHC~|@*6FXF6;%)CIR9ZtDKl%Ng8;F;FbT!2OWxW5} z7=tt&Sg&Qi<`&*~!))k(cf9_cGjzy(yzgAXy7ZsUFq=@zX+o_`MW~FKFq3p|pcM=V z#z`!TYP*5=K^y~Hox9SQE(4~k*_g(@s|<&5zDACHz2=}rg_PwkmRiR07SoVTx{O^t zSsXey;w@$KE5svkZY&Jce%1UUdT|%gC%Xs>*+rbFvFx>s5f9yzXB1x>3tyeLr?7ps z!Iz|hdXC$N0AM~Wzp0fXl7dCZefrEZtaTq88AfU*Pzwv1{kNrgL%uk58jJjLdcs0* zn{h$eb;lc;S1L^)gXzRh(LsWW{omdN?#0V)0@`9TZ$h$M9Yr&d0u_7oGyV#;>=hpA z8Q88&^KbdaSd>zZrviEQ{WK9%3z-L}TEe}QLA4xT(=1e*+!&XagxfEn1<)bKiYGz3 z%xwnCVK+fa>w>lzZ@lnJ@`5|_1tfTKV~Q90NM8wiZjSvUDQ@uNEUHZ_bWPd9Y&6Q_ z)s&o?ghK}UntF2mWD^fX9Tq!%_x8*ip5+jc-UA$avq(5}Jl7cv@CB}Hxq7@b5%ahU z|4)pdHS6gub6mQ_(UCAd21a`nBclS1EYh6}Pj%>0yU}$*w~yn?3aereP@u&Hl2fln z5$RS@Bs^h%KwUqW%o?NY!y*8C7U$TCDd zZ|u_!-GySc4kV}7JV3Be-ZkDluYO-XZv}#3nPibwm?=7xLydPO)@4>&XAZ?E@9HttxY=6b^VJE!BMfoKr zF70>)*bKej-3&j^m?kf^BMSn3L5mTJEnDCK{bXdDmOlbXCgL-Vle{yd98P)xk=R0T z@LITdtwhB#5nL~^B1tdu5-XH+f$}SsjJneU&t1_x1oX@m&qDz&u_DTC>Qu`NSavdr zNul+4a+;RkI6=ZC3UD{ z>P?`d4drP9HT!Kttt+z-Z*)#)L%;^J+B!9zq&mlpOk|PCK_2exB1!S^cQ^3azaZI} z@RTrP<=HhM{TXwldm5rGofs2Xo8h&Z=&B+#=HVO2!-6c|%6Qw>Z`&DfpXj$wGTuJb zZ=Y5&UN;c7e4X*OquxHrs=V5YD_2gEx2#PVYgdk5+k`JNw`z=e0U+T%cG5MKRL(Zc zZ08#V@#C+=!7^iO-3CLoE}TK=7I#S1NQs|aE|h`>ung~Vmg6m!tT1bR8NZA>rz6r- zW9zM3&I;kWou?~L-Dhhp@uP&WnIW56I74IZU5Ovc*e;hsyQIl?3QO3mz^<}WT9b2W5BA+f8(aP}d+PkG=;Q)-)o_1=h(8IE0l>_?{Q8pKW z|GO(KDN@e_F(JG;F^Jfg*m}wiNz4vPgr`e!?No?j;>1cSQc?Cq1}w5gM~{rRP43x? zBIO}VUOOWh>8QdS#b+*=2wpUQ8G*T_86ZPoC$K;kn~@2Lu-#PP?tMwG`mkw}Up}_V zWU(N@098`50637t02Qrk|31xyLdPLK%l1wv9yJa=J(+NS+~jyQ9Z6omOEyiiBhY7K z?u*C?F5Rew2mD^7pSK0{@5O_#nNUqK+3dGbYBHN;IcAUdhw!qQY=y+9pPlBwO0YUX zC1iVoKqLazrF|u=9E{N@YvE8lN0E8M!0u(*Fo?2d4IRIjpm(ycHqJSbG;KIbTUc(R zyR>x;CdWo^X-f)PZ8`~KjBEj;XYt#~g2lyH7NS2ylr2~6Br$%RW>-!K623?2!G5yV zpykPx@Au0(E_iorqS$cEI~T_DLo%{TpKGOHr{{cNJ8L6e7bHnol>4u-$SE|8^RMVA zQnr44y>(Us6mt;7A*iZP&~D~Hume^}nsP$|3YJ*7R7o}**I~goH(X}j@h@(NNtREV zxRyZ`qz1)@B^C%qVcc~$h}Nu70&2=h@xi@gsgSX;x)xcV&nvDjNhk5_oF?%df5s`{ z;)skwE@0!Kq_Ba$UG>xFN)anktxVuZxi+f`NOf~74ezsp!^@!jkfgROct+=RH)SQ@ zfq^|cOmur@jf|7bx(3HhtJ2IY)c_x&G-Wm22didwL+0^6&H5sF&G3-vG*gHlr=wwq zil%+N!a-H?WTSiwiz|-?zm`<08{S=a{XxdCpLv8@=kjI9(j5RG3wS?u@C+Hx&^v$5px_js|wE%uWK6=TFuy1S@R z;uwwE(o(mEMqRfVlfyh|UbWxN*Y0Xks;iyUJE;j4N)3EnFKJ!V+^jr6@{m?sxMJ^^ z(J8F^as$WbSK^1w3#WG4H0UB{>RXtiffJxoaIyxve@<2G&RVfot|EN<9ltFDh)QAj z5nWiFx!tHefy@_OcAnZ_sN}L-{O7Q|EQT&Oh>2`_Zh(e)obJj8OJ80Elk^PRCOUg!$>DqLy1+!XhI%rO zIa=d)o;$!O5t%E83v>s5?*lq+^_4T2>^0?uC|*_0k?n7Xl+d#?LTkb72Q4NCdA&&; z7nEnd>9n*yDXmX_)6QL)R1M!lk{&B0DZZ*`x_vql4e}VzgM8pYgoZwO=o?g@o(?yHdG`uZ7vkD`Z zrPfjQ`XncDgs5#eTN_>B^*3RLUD|@#1;2LiYd?PKqIb}-T!U%hN%U;K=Jmn&npvW- zb(j?M*-5CvRGD9*Z@`cY(wl#hQ$&6TPv-kDk1OJfMOyAHCRA_+;q_Q7U;vp21klc< zREmOi0UdZuGL|P&bmavmjjo;BB!z~)KsPI=dW=ai9A9@~0S1aFXIp)0iqu8>VTe-P z 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

cM^SkB@=EJ$`qnYch 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 cbs`$wGU$KBPW)?*e Date: Fri, 20 Sep 2024 17:50:55 +0000 Subject: [PATCH 22/27] Bump puma from 4.3.12 to 5.6.9 in /examples/simple_rails_api Bumps [puma](https://github.com/puma/puma) from 4.3.12 to 5.6.9. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v4.3.12...v5.6.9) --- updated-dependencies: - dependency-name: puma dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile | 2 +- examples/simple_rails_api/Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/simple_rails_api/Gemfile b/examples/simple_rails_api/Gemfile index 3fab5da..179bf18 100644 --- a/examples/simple_rails_api/Gemfile +++ b/examples/simple_rails_api/Gemfile @@ -6,7 +6,7 @@ gem 'rails', '~> 6.0.2' # Use sqlite3 as the database for Active Record gem 'sqlite3', '~> 1.4' # Use Puma as the app server -gem 'puma', '~> 4.3' +gem 'puma', '~> 5.6' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder # gem 'jbuilder', '~> 2.7' # Use Redis adapter to run Action Cable in production diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 9da3cb4..90653a2 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -82,11 +82,11 @@ GEM mini_portile2 (2.8.0) minitest (5.14.4) msgpack (1.4.2) - nio4r (2.5.8) + nio4r (2.7.3) nokogiri (1.13.4) mini_portile2 (~> 2.8.0) racc (~> 1.4) - puma (4.3.12) + puma (5.6.9) nio4r (~> 2.0) racc (1.6.0) rack (2.2.3) @@ -150,7 +150,7 @@ DEPENDENCIES bootsnap (>= 1.4.2) byebug listen (>= 3.0.5, < 3.2) - puma (~> 4.3) + puma (~> 5.6) rails (~> 6.0.2) spring spring-watcher-listen (~> 2.0.0) From a267759c09ca1af31367fd05f6ae8ba981133723 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 00:58:17 +0000 Subject: [PATCH 23/27] Bump rexml from 3.2.5 to 3.3.3 in /examples/simple_script Bumps [rexml](https://github.com/ruby/rexml) from 3.2.5 to 3.3.3. - [Release notes](https://github.com/ruby/rexml/releases) - [Changelog](https://github.com/ruby/rexml/blob/master/NEWS.md) - [Commits](https://github.com/ruby/rexml/compare/v3.2.5...v3.3.3) --- updated-dependencies: - dependency-name: rexml dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_script/Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/simple_script/Gemfile.lock b/examples/simple_script/Gemfile.lock index 002c127..9c0f9ef 100644 --- a/examples/simple_script/Gemfile.lock +++ b/examples/simple_script/Gemfile.lock @@ -10,7 +10,8 @@ GEM ast (~> 2.4.1) rainbow (3.0.0) regexp_parser (2.1.1) - rexml (3.2.5) + rexml (3.3.3) + strscan rspec (3.7.0) rspec-core (~> 3.7.0) rspec-expectations (~> 3.7.0) @@ -39,6 +40,7 @@ GEM rubocop-ast (1.11.0) parser (>= 3.0.1.1) ruby-progressbar (1.11.0) + strscan (3.1.0) unicode-display_width (2.1.0) PLATFORMS From 3882649b6a5b686788448b2ae234c745d1f391ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 22:01:23 +0000 Subject: [PATCH 24/27] Bump rack from 2.2.3 to 2.2.9 in /examples/simple_rails_api Bumps [rack](https://github.com/rack/rack) from 2.2.3 to 2.2.9. - [Release notes](https://github.com/rack/rack/releases) - [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md) - [Commits](https://github.com/rack/rack/compare/2.2.3...v2.2.9) --- updated-dependencies: - dependency-name: rack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 90653a2..153f4a4 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -89,7 +89,7 @@ GEM puma (5.6.9) nio4r (~> 2.0) racc (1.6.0) - rack (2.2.3) + rack (2.2.9) rack-test (1.1.0) rack (>= 1.0, < 3) rails (6.0.4.1) From b6d7239452908abe44d085ce90ead801635b395f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Sep 2023 04:42:48 +0000 Subject: [PATCH 25/27] Bump tzinfo from 1.2.9 to 1.2.11 in /examples/simple_rails_api Bumps [tzinfo](https://github.com/tzinfo/tzinfo) from 1.2.9 to 1.2.11. - [Release notes](https://github.com/tzinfo/tzinfo/releases) - [Changelog](https://github.com/tzinfo/tzinfo/blob/master/CHANGES.md) - [Commits](https://github.com/tzinfo/tzinfo/compare/v1.2.9...v1.2.11) --- updated-dependencies: - dependency-name: tzinfo dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 153f4a4..f8db77a 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -136,7 +136,7 @@ GEM sqlite3 (1.4.2) thor (1.1.0) thread_safe (0.3.6) - tzinfo (1.2.9) + tzinfo (1.2.11) thread_safe (~> 0.1) websocket-driver (0.7.5) websocket-extensions (>= 0.1.0) From 080cdd8e53c7ebcf0236e533858d76cf630a22b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:24:50 +0000 Subject: [PATCH 26/27] Bump rails from 6.0.4.1 to 6.1.7.7 in /examples/simple_rails_api Bumps [rails](https://github.com/rails/rails) from 6.0.4.1 to 6.1.7.7. - [Release notes](https://github.com/rails/rails/releases) - [Commits](https://github.com/rails/rails/compare/v6.0.4.1...v6.1.7.7) --- updated-dependencies: - dependency-name: rails dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile | 2 +- examples/simple_rails_api/Gemfile.lock | 209 ++++++++++++++----------- 2 files changed, 115 insertions(+), 96 deletions(-) diff --git a/examples/simple_rails_api/Gemfile b/examples/simple_rails_api/Gemfile index 179bf18..385b769 100644 --- a/examples/simple_rails_api/Gemfile +++ b/examples/simple_rails_api/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 6.0.2' +gem 'rails', '~> 6.1.7' # Use sqlite3 as the database for Active Record gem 'sqlite3', '~> 1.4' # Use Puma as the app server diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index f8db77a..1a98bb7 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -1,124 +1,143 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.0.4.1) - actionpack (= 6.0.4.1) + actioncable (6.1.7.7) + actionpack (= 6.1.7.7) + activesupport (= 6.1.7.7) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.0.4.1) - actionpack (= 6.0.4.1) - activejob (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) + actionmailbox (6.1.7.7) + actionpack (= 6.1.7.7) + activejob (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) mail (>= 2.7.1) - actionmailer (6.0.4.1) - actionpack (= 6.0.4.1) - actionview (= 6.0.4.1) - activejob (= 6.0.4.1) + actionmailer (6.1.7.7) + actionpack (= 6.1.7.7) + actionview (= 6.1.7.7) + activejob (= 6.1.7.7) + activesupport (= 6.1.7.7) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.0.4.1) - actionview (= 6.0.4.1) - activesupport (= 6.0.4.1) - rack (~> 2.0, >= 2.0.8) + actionpack (6.1.7.7) + actionview (= 6.1.7.7) + activesupport (= 6.1.7.7) + rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.0.4.1) - actionpack (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) + actiontext (6.1.7.7) + actionpack (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) nokogiri (>= 1.8.5) - actionview (6.0.4.1) - activesupport (= 6.0.4.1) + actionview (6.1.7.7) + activesupport (= 6.1.7.7) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.0.4.1) - activesupport (= 6.0.4.1) + activejob (6.1.7.7) + activesupport (= 6.1.7.7) globalid (>= 0.3.6) - activemodel (6.0.4.1) - activesupport (= 6.0.4.1) - activerecord (6.0.4.1) - activemodel (= 6.0.4.1) - activesupport (= 6.0.4.1) - activestorage (6.0.4.1) - actionpack (= 6.0.4.1) - activejob (= 6.0.4.1) - activerecord (= 6.0.4.1) - marcel (~> 1.0.0) - activesupport (6.0.4.1) + activemodel (6.1.7.7) + activesupport (= 6.1.7.7) + activerecord (6.1.7.7) + activemodel (= 6.1.7.7) + activesupport (= 6.1.7.7) + activestorage (6.1.7.7) + actionpack (= 6.1.7.7) + activejob (= 6.1.7.7) + activerecord (= 6.1.7.7) + activesupport (= 6.1.7.7) + marcel (~> 1.0) + mini_mime (>= 1.1.0) + activesupport (6.1.7.7) concurrent-ruby (~> 1.0, >= 1.0.2) - i18n (>= 0.7, < 2) - minitest (~> 5.1) - tzinfo (~> 1.1) - zeitwerk (~> 2.2, >= 2.2.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) bootsnap (1.9.1) msgpack (~> 1.0) - builder (3.2.4) + builder (3.3.0) byebug (11.1.3) - concurrent-ruby (1.1.9) + concurrent-ruby (1.3.4) crass (1.0.6) - erubi (1.10.0) + date (3.3.4) + erubi (1.13.0) ffi (1.15.4) - globalid (0.5.2) - activesupport (>= 5.0) - i18n (1.8.10) + globalid (1.2.1) + activesupport (>= 6.1) + i18n (1.14.6) concurrent-ruby (~> 1.0) listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - loofah (2.12.0) + loofah (2.22.0) crass (~> 1.0.2) - nokogiri (>= 1.5.9) - mail (2.7.1) + nokogiri (>= 1.12.0) + mail (2.8.1) mini_mime (>= 0.1.1) - marcel (1.0.2) - method_source (1.0.0) - mini_mime (1.1.1) - mini_portile2 (2.8.0) - minitest (5.14.4) + net-imap + net-pop + net-smtp + marcel (1.0.4) + method_source (1.1.0) + mini_mime (1.1.5) + mini_portile2 (2.8.7) + minitest (5.25.1) msgpack (1.4.2) + net-imap (0.4.16) + date + net-protocol + net-pop (0.1.2) + net-protocol + net-protocol (0.2.2) + timeout + net-smtp (0.5.0) + net-protocol nio4r (2.7.3) - nokogiri (1.13.4) - mini_portile2 (~> 2.8.0) + nokogiri (1.16.7) + mini_portile2 (~> 2.8.2) racc (~> 1.4) puma (5.6.9) nio4r (~> 2.0) - racc (1.6.0) + racc (1.8.1) rack (2.2.9) - rack-test (1.1.0) - rack (>= 1.0, < 3) - rails (6.0.4.1) - actioncable (= 6.0.4.1) - actionmailbox (= 6.0.4.1) - actionmailer (= 6.0.4.1) - actionpack (= 6.0.4.1) - actiontext (= 6.0.4.1) - actionview (= 6.0.4.1) - activejob (= 6.0.4.1) - activemodel (= 6.0.4.1) - activerecord (= 6.0.4.1) - activestorage (= 6.0.4.1) - activesupport (= 6.0.4.1) - bundler (>= 1.3.0) - railties (= 6.0.4.1) + rack-test (2.1.0) + rack (>= 1.3) + rails (6.1.7.7) + actioncable (= 6.1.7.7) + actionmailbox (= 6.1.7.7) + actionmailer (= 6.1.7.7) + actionpack (= 6.1.7.7) + actiontext (= 6.1.7.7) + actionview (= 6.1.7.7) + activejob (= 6.1.7.7) + activemodel (= 6.1.7.7) + activerecord (= 6.1.7.7) + activestorage (= 6.1.7.7) + activesupport (= 6.1.7.7) + bundler (>= 1.15.0) + railties (= 6.1.7.7) sprockets-rails (>= 2.0.0) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) + rails-dom-testing (2.2.0) + activesupport (>= 5.0.0) + minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.4.2) - loofah (~> 2.3) - railties (6.0.4.1) - actionpack (= 6.0.4.1) - activesupport (= 6.0.4.1) + rails-html-sanitizer (1.6.0) + loofah (~> 2.21) + nokogiri (~> 1.14) + railties (6.1.7.7) + actionpack (= 6.1.7.7) + activesupport (= 6.1.7.7) method_source - rake (>= 0.8.7) - thor (>= 0.20.3, < 2.0) - rake (13.0.6) + rake (>= 12.2) + thor (~> 1.0) + rake (13.2.1) rb-fsevent (0.11.0) rb-inotify (0.10.1) ffi (~> 1.0) @@ -126,22 +145,22 @@ GEM spring-watcher-listen (2.0.1) listen (>= 2.7, < 4.0) spring (>= 1.2, < 3.0) - sprockets (4.0.2) + sprockets (4.2.1) concurrent-ruby (~> 1.0) - rack (> 1, < 3) - sprockets-rails (3.2.2) - actionpack (>= 4.0) - activesupport (>= 4.0) + rack (>= 2.2.4, < 4) + sprockets-rails (3.5.2) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) sqlite3 (1.4.2) - thor (1.1.0) - thread_safe (0.3.6) - tzinfo (1.2.11) - thread_safe (~> 0.1) - websocket-driver (0.7.5) + thor (1.3.2) + timeout (0.4.1) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.4.2) + zeitwerk (2.7.0) PLATFORMS ruby @@ -151,7 +170,7 @@ DEPENDENCIES byebug listen (>= 3.0.5, < 3.2) puma (~> 5.6) - rails (~> 6.0.2) + rails (~> 6.1.7) spring spring-watcher-listen (~> 2.0.0) sqlite3 (~> 1.4) From 588d9dd40487277e2560ece09fe310d7c0ecb4a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 16:51:45 +0000 Subject: [PATCH 27/27] Bump actionpack from 6.1.7.7 to 6.1.7.8 in /examples/simple_rails_api Bumps [actionpack](https://github.com/rails/rails) from 6.1.7.7 to 6.1.7.8. - [Release notes](https://github.com/rails/rails/releases) - [Changelog](https://github.com/rails/rails/blob/v7.2.1/actionpack/CHANGELOG.md) - [Commits](https://github.com/rails/rails/compare/v6.1.7.7...v6.1.7.8) --- updated-dependencies: - dependency-name: actionpack dependency-type: indirect ... Signed-off-by: dependabot[bot] --- examples/simple_rails_api/Gemfile.lock | 106 ++++++++++++------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/examples/simple_rails_api/Gemfile.lock b/examples/simple_rails_api/Gemfile.lock index 1a98bb7..4e78dc3 100644 --- a/examples/simple_rails_api/Gemfile.lock +++ b/examples/simple_rails_api/Gemfile.lock @@ -1,60 +1,60 @@ GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7.7) - actionpack (= 6.1.7.7) - activesupport (= 6.1.7.7) + actioncable (6.1.7.8) + actionpack (= 6.1.7.8) + activesupport (= 6.1.7.8) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7.7) - actionpack (= 6.1.7.7) - activejob (= 6.1.7.7) - activerecord (= 6.1.7.7) - activestorage (= 6.1.7.7) - activesupport (= 6.1.7.7) + actionmailbox (6.1.7.8) + actionpack (= 6.1.7.8) + activejob (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) mail (>= 2.7.1) - actionmailer (6.1.7.7) - actionpack (= 6.1.7.7) - actionview (= 6.1.7.7) - activejob (= 6.1.7.7) - activesupport (= 6.1.7.7) + actionmailer (6.1.7.8) + actionpack (= 6.1.7.8) + actionview (= 6.1.7.8) + activejob (= 6.1.7.8) + activesupport (= 6.1.7.8) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (6.1.7.7) - actionview (= 6.1.7.7) - activesupport (= 6.1.7.7) + actionpack (6.1.7.8) + actionview (= 6.1.7.8) + activesupport (= 6.1.7.8) rack (~> 2.0, >= 2.0.9) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7.7) - actionpack (= 6.1.7.7) - activerecord (= 6.1.7.7) - activestorage (= 6.1.7.7) - activesupport (= 6.1.7.7) + actiontext (6.1.7.8) + actionpack (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) nokogiri (>= 1.8.5) - actionview (6.1.7.7) - activesupport (= 6.1.7.7) + actionview (6.1.7.8) + activesupport (= 6.1.7.8) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.1.7.7) - activesupport (= 6.1.7.7) + activejob (6.1.7.8) + activesupport (= 6.1.7.8) globalid (>= 0.3.6) - activemodel (6.1.7.7) - activesupport (= 6.1.7.7) - activerecord (6.1.7.7) - activemodel (= 6.1.7.7) - activesupport (= 6.1.7.7) - activestorage (6.1.7.7) - actionpack (= 6.1.7.7) - activejob (= 6.1.7.7) - activerecord (= 6.1.7.7) - activesupport (= 6.1.7.7) + activemodel (6.1.7.8) + activesupport (= 6.1.7.8) + activerecord (6.1.7.8) + activemodel (= 6.1.7.8) + activesupport (= 6.1.7.8) + activestorage (6.1.7.8) + actionpack (= 6.1.7.8) + activejob (= 6.1.7.8) + activerecord (= 6.1.7.8) + activesupport (= 6.1.7.8) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7.7) + activesupport (6.1.7.8) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -109,20 +109,20 @@ GEM rack (2.2.9) rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7.7) - actioncable (= 6.1.7.7) - actionmailbox (= 6.1.7.7) - actionmailer (= 6.1.7.7) - actionpack (= 6.1.7.7) - actiontext (= 6.1.7.7) - actionview (= 6.1.7.7) - activejob (= 6.1.7.7) - activemodel (= 6.1.7.7) - activerecord (= 6.1.7.7) - activestorage (= 6.1.7.7) - activesupport (= 6.1.7.7) + rails (6.1.7.8) + actioncable (= 6.1.7.8) + actionmailbox (= 6.1.7.8) + actionmailer (= 6.1.7.8) + actionpack (= 6.1.7.8) + actiontext (= 6.1.7.8) + actionview (= 6.1.7.8) + activejob (= 6.1.7.8) + activemodel (= 6.1.7.8) + activerecord (= 6.1.7.8) + activestorage (= 6.1.7.8) + activesupport (= 6.1.7.8) bundler (>= 1.15.0) - railties (= 6.1.7.7) + railties (= 6.1.7.8) sprockets-rails (>= 2.0.0) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) @@ -131,9 +131,9 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (6.1.7.7) - actionpack (= 6.1.7.7) - activesupport (= 6.1.7.7) + railties (6.1.7.8) + actionpack (= 6.1.7.8) + activesupport (= 6.1.7.8) method_source rake (>= 12.2) thor (~> 1.0)