Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test on Ruby 3.1 #16056

Merged
merged 2 commits into from
Sep 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 25 additions & 4 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,12 @@ jobs:
- name: tests (macOS 13)
test-flags: --coverage
runs-on: macos-13
- name: tests (Ubuntu 22.04; Ruby 3.1)
runs-on: ubuntu-22.04
ruby: '3.1'
- name: tests (macOS 13; Ruby 3.1)
runs-on: macos-13
ruby: '3.1'
steps:
- name: Set up Homebrew
id: set-up-homebrew
Expand All @@ -307,8 +313,23 @@ jobs:
uses: actions/cache@v3
with:
path: ${{ steps.set-up-homebrew.outputs.gems-path }}
key: ${{ runner.os }}-rubygems-${{ steps.set-up-homebrew.outputs.gems-hash }}
restore-keys: ${{ runner.os }}-rubygems-
key: ${{ runner.os }}-rubygems${{ matrix.ruby }}-${{ steps.set-up-homebrew.outputs.gems-hash }}
restore-keys: ${{ runner.os }}-rubygems${{ matrix.ruby }}-

- name: Setup Ruby
if: matrix.ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby }}

- name: Setup Ruby environment
if: matrix.ruby
run: |
echo "HOMEBREW_USE_RUBY_FROM_PATH=1" >> "${GITHUB_ENV}"
echo "HOMEBREW_BOOTSNAP=" >> "${GITHUB_ENV}" # Unsupported, for now
rm -rf "${{ steps.set-up-homebrew.outputs.repository-path }}/Library/Homebrew/vendor/portable-ruby"

- run: brew config

- name: Install Bundler RubyGems
run: brew install-bundler-gems --groups=all
Expand All @@ -320,8 +341,8 @@ jobs:
uses: actions/cache@v3
with:
path: tests
key: ${{ runner.os }}-${{ matrix.test-flags }}-parallel_runtime_rspec-${{ github.sha }}
restore-keys: ${{ runner.os }}-${{ matrix.test-flags }}-parallel_runtime_rspec-
key: ${{ runner.os }}-${{ matrix.test-flags }}-parallel_runtime_rspec${{ matrix.ruby }}-${{ github.sha }}
restore-keys: ${{ runner.os }}-${{ matrix.test-flags }}-parallel_runtime_rspec${{ matrix.ruby }}-

- name: Install brew tests dependencies
if: matrix.name != 'tests (generic OS)'
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@
**/vendor/bundle/ruby/*/plugins
**/vendor/bundle/ruby/*/specifications

# Ignore Ruby gems for versions other than we explicitly vendor
**/vendor/bundle/ruby/*/
!**/vendor/bundle/ruby/2.6.0/

# Ignore Bundler binary files
**/vendor/bundle/ruby/*/gems/**/*.bundle

Expand Down
2 changes: 1 addition & 1 deletion Library/Homebrew/Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ source "https://rubygems.org"

# The default case (no envs), should always be a restrictive bound on the lowest supported minor version.
# This is the branch that Dependabot will use.
if ENV.fetch("HOMEBREW_DEVELOPER", "").empty? || ENV.fetch("HOMEBREW_USE_RUBY_FROM_PATH", "").empty?
if ENV.fetch("HOMEBREW_USE_RUBY_FROM_PATH", "").empty?
ruby "~> 2.6.0"
else
ruby ">= 2.6.0"
Expand Down
4 changes: 2 additions & 2 deletions Library/Homebrew/cask/artifact/abstract_uninstall.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ class AbstractUninstall < AbstractArtifact
].freeze

def self.from_args(cask, **directives)
new(cask, directives)
new(cask, **directives)
end

attr_reader :directives

def initialize(cask, directives)
def initialize(cask, **directives)
directives.assert_valid_keys(*ORDERED_DIRECTIVES)

super(cask, **directives)
Expand Down
8 changes: 7 additions & 1 deletion Library/Homebrew/cask/cask_loader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,13 @@ def load(config:)
# for artifacts with blocks that can't be loaded from the API
send(key) {} # empty on purpose
else
send(key, *artifact[key])
args = artifact[key]
kwargs = if args.last.is_a?(Hash)
args.pop
else
{}
end
send(key, *args, **kwargs)
end
end

Expand Down
2 changes: 1 addition & 1 deletion Library/Homebrew/cmd/readall.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def readall
end

taps.each do |tap|
Homebrew.failed = true unless Readall.valid_tap?(tap, options)
Homebrew.failed = true unless Readall.valid_tap?(tap, **options)
end
end
end
2 changes: 1 addition & 1 deletion Library/Homebrew/dev-cmd/tests.rb
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,8 @@ def setup_environment!(args)
HOMEBREW_CACHE
HOMEBREW_LOGS
HOMEBREW_TEMP
HOMEBREW_USE_RUBY_FROM_PATH
]
allowed_test_env << "HOMEBREW_USE_RUBY_FROM_PATH" if Homebrew::EnvConfig.developer?
Homebrew::EnvConfig::ENVS.keys.map(&:to_s).each do |env|
next if allowed_test_env.include?(env)

Expand Down
6 changes: 2 additions & 4 deletions Library/Homebrew/test/cli/named_args_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,15 @@

def setup_unredable_formula(name)
error = FormulaUnreadableError.new(name, RuntimeError.new("testing"))
allow(Formulary).to receive(:factory).with(name, {}).and_raise(error)
allow(Formulary).to receive(:factory).with(name, any_args).and_raise(error)
end

def setup_unredable_cask(name)
error = Cask::CaskUnreadableError.new(name, "testing")
allow(Cask::CaskLoader).to receive(:load).with(name).and_raise(error)
allow(Cask::CaskLoader).to receive(:load).with(name, config: nil).and_raise(error)
allow(Cask::CaskLoader).to receive(:load).with(name, any_args).and_raise(error)

config = instance_double(Cask::Config)
allow(Cask::Config).to receive(:from_args).and_return(config)
allow(Cask::CaskLoader).to receive(:load).with(name, config: config).and_raise(error)
end

describe Homebrew::CLI::NamedArgs do
Expand Down
5 changes: 4 additions & 1 deletion Library/Homebrew/test/dev-cmd/irb_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
.and not_to_output.to_stderr
.and be_a_success

expect(history_file).to exist
# TODO: newer Ruby only supports history saving in interactive sessions
# and not if you feed in data from a file or stdin like we are doing here.
# The test will need to be adjusted for this to work.
expect(history_file).to exist if RUBY_VERSION < "2.7"
end
end
end
6 changes: 5 additions & 1 deletion Library/Homebrew/test/rubocop_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
context "when calling `rubocop` outside of the Homebrew environment" do
before do
ENV.each_key do |key|
ENV.delete(key) if key.start_with?("HOMEBREW_") && key != "HOMEBREW_USE_RUBY_FROM_PATH"
allowlist = %w[
HOMEBREW_TESTS
HOMEBREW_USE_RUBY_FROM_PATH
]
ENV.delete(key) if key.start_with?("HOMEBREW_") && allowlist.exclude?(key)
end

ENV["XDG_CACHE_HOME"] = (HOMEBREW_CACHE.realpath/"style").to_s
Expand Down
3 changes: 1 addition & 2 deletions Library/Homebrew/test/support/helper/formula.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ def stub_formula_loader(formula, ref = formula.full_name, call_original: false)
allow(Formulary).to receive(:loader_for).and_call_original if call_original

loader = double(get_formula: formula)
allow(Formulary).to receive(:loader_for).with(ref, from: :keg, warn: false).and_return(loader)
allow(Formulary).to receive(:loader_for).with(ref, {}).and_return(loader)
allow(Formulary).to receive(:loader_for).with(ref, any_args).and_return(loader)
end
end
end
Expand Down
16 changes: 8 additions & 8 deletions Library/Homebrew/test/test_runner_formula_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -296,12 +296,12 @@

context "when a formula has no dependents" do
it "returns an empty array" do
expect(described_class.new(testball).dependents(current_system)).to eq([])
expect(described_class.new(xcode_helper).dependents(current_system)).to eq([])
expect(described_class.new(linux_kernel_requirer).dependents(current_system)).to eq([])
expect(described_class.new(old_non_portable_software).dependents(current_system)).to eq([])
expect(described_class.new(fancy_new_software).dependents(current_system)).to eq([])
expect(described_class.new(needs_modern_compiler).dependents(current_system)).to eq([])
expect(described_class.new(testball).dependents(**current_system)).to eq([])
expect(described_class.new(xcode_helper).dependents(**current_system)).to eq([])
expect(described_class.new(linux_kernel_requirer).dependents(**current_system)).to eq([])
expect(described_class.new(old_non_portable_software).dependents(**current_system)).to eq([])
expect(described_class.new(fancy_new_software).dependents(**current_system)).to eq([])
expect(described_class.new(needs_modern_compiler).dependents(**current_system)).to eq([])
end
end

Expand All @@ -313,11 +313,11 @@
allow(Formula).to receive(:all).and_return([testball_user, recursive_testball_dependent])

expect(
described_class.new(testball, eval_all: true).dependents(current_system).map(&:name),
described_class.new(testball, eval_all: true).dependents(**current_system).map(&:name),
).to eq(["testball_user"])

expect(
described_class.new(testball_user, eval_all: true).dependents(current_system).map(&:name),
described_class.new(testball_user, eval_all: true).dependents(**current_system).map(&:name),
).to eq(["recursive_testball_dependent"])
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
subject do
homebrew_env = ENV.select { |key, _| key.start_with?("HOMEBREW_") }
Bundler.with_unbundled_env do
ENV.delete_if { |key,| key.start_with?("HOMEBREW_") }
ENV.update(homebrew_env)
quiet_system "#{HOMEBREW_LIBRARY_PATH}/utils/ruby_check_version_script.rb", required_ruby_version
end
Expand Down
10 changes: 7 additions & 3 deletions Library/Homebrew/utils/gems.rb
Original file line number Diff line number Diff line change
Expand Up @@ -177,13 +177,16 @@ def install_bundler!
def user_gem_groups
@user_gem_groups ||= if GEM_GROUPS_FILE.exist?
GEM_GROUPS_FILE.readlines(chomp: true)
else
# Backwards compatibility. This else block can be replaced by `[]` by the end of 2023.
elsif RUBY_VERSION < "2.7"
# Backwards compatibility. This elsif block removed by the end of 2023.
# We will not support this in Ruby >=2.7.
require "settings"
groups = Homebrew::Settings.read(:gemgroups)&.split(";") || []
write_user_gem_groups(groups)
Homebrew::Settings.delete(:gemgroups)
groups
else
[]
end
end

Expand All @@ -194,8 +197,9 @@ def write_user_gem_groups(groups)
def forget_user_gem_groups!
if GEM_GROUPS_FILE.exist?
GEM_GROUPS_FILE.truncate(0)
else
elsif RUBY_VERSION < "2.7"
# Backwards compatibility. This else block can be removed by the end of 2023.
# We will not support this in Ruby >=2.7.
require "settings"
Homebrew::Settings.delete(:gemgroups)
end
Expand Down
2 changes: 1 addition & 1 deletion Library/Homebrew/utils/ruby.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ test_ruby() {
}

can_use_ruby_from_path() {
if [[ -n "${HOMEBREW_DEVELOPER}" && -n "${HOMEBREW_USE_RUBY_FROM_PATH}" ]]
if [[ -n "${HOMEBREW_DEVELOPER}" || -n "${HOMEBREW_TESTS}" ]] && [[ -n "${HOMEBREW_USE_RUBY_FROM_PATH}" ]]
then
return 0
fi
Expand Down
2 changes: 1 addition & 1 deletion Library/Homebrew/utils/ruby_check_version_script.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
homebrew_required_ruby_version_major, homebrew_required_ruby_version_minor, =
homebrew_required_ruby_version.canonical_segments

if !ENV.fetch("HOMEBREW_DEVELOPER", "").empty? &&
if (!ENV.fetch("HOMEBREW_DEVELOPER", "").empty? || !ENV.fetch("HOMEBREW_TESTS", "").empty?) &&

Check warning on line 20 in Library/Homebrew/utils/ruby_check_version_script.rb

View check run for this annotation

Codecov / codecov/patch

Library/Homebrew/utils/ruby_check_version_script.rb#L20

Added line #L20 was not covered by tests
!ENV.fetch("HOMEBREW_USE_RUBY_FROM_PATH", "").empty? &&
ruby_version >= homebrew_required_ruby_version
return
Expand Down