Merge pull request #19568 from Homebrew/bundle-lazy-require

bundle: `require` more lazily
This commit is contained in:
Carlo Cabrera 2025-03-24 16:24:07 +00:00 committed by GitHub
commit 09eceba798
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
55 changed files with 251 additions and 131 deletions

View File

@ -1,40 +1,89 @@
# typed: strict
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/brewfile"
require "bundle/bundle"
require "bundle/dsl"
require "bundle/adder"
require "bundle/checker"
require "bundle/remover"
require "bundle/skipper"
require "bundle/brew_services"
require "bundle/brew_service_checker"
require "bundle/brew_installer"
require "bundle/brew_checker"
require "bundle/cask_installer"
require "bundle/mac_app_store_installer"
require "bundle/mac_app_store_checker"
require "bundle/tap_installer"
require "bundle/brew_dumper"
require "bundle/cask_dumper"
require "bundle/cask_checker"
require "bundle/mac_app_store_dumper"
require "bundle/tap_dumper"
require "bundle/tap_checker"
require "bundle/dumper"
require "bundle/installer"
require "bundle/lister"
require "bundle/commands/install"
require "bundle/commands/dump"
require "bundle/commands/cleanup"
require "bundle/commands/check"
require "bundle/commands/exec"
require "bundle/commands/list"
require "bundle/commands/add"
require "bundle/commands/remove"
require "bundle/whalebrew_installer"
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_checker"
require "bundle/vscode_extension_dumper"
require "bundle/vscode_extension_installer"
require "English"
module Homebrew
module Bundle
class << self
def system(cmd, *args, verbose: false)
return super cmd, *args if verbose
logs = []
success = T.let(nil, T.nilable(T::Boolean))
IO.popen([cmd, *args], err: [:child, :out]) do |pipe|
while (buf = pipe.gets)
logs << buf
end
Process.wait(pipe.pid)
success = $CHILD_STATUS.success?
pipe.close
end
puts logs.join unless success
success
end
def brew(*args, verbose: false)
system(HOMEBREW_BREW_FILE, *args, verbose:)
end
def mas_installed?
@mas_installed ||= which_formula("mas")
end
def vscode_installed?
@vscode_installed ||= which_vscode.present?
end
def which_vscode
@which_vscode ||= which("code", ORIGINAL_PATHS)
@which_vscode ||= which("codium", ORIGINAL_PATHS)
@which_vscode ||= which("cursor", ORIGINAL_PATHS)
@which_vscode ||= which("code-insiders", ORIGINAL_PATHS)
end
def whalebrew_installed?
@whalebrew_installed ||= which_formula("whalebrew")
end
def cask_installed?
@cask_installed ||= File.directory?("#{HOMEBREW_PREFIX}/Caskroom") &&
(File.directory?("#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-cask") ||
!Homebrew::EnvConfig.no_install_from_api?)
end
def which_formula(name)
formula = Formulary.factory(name)
ENV["PATH"] = "#{formula.opt_bin}:#{ENV.fetch("PATH", nil)}" if formula.any_version_installed?
which(name).present?
end
def exchange_uid_if_needed!(&block)
euid = Process.euid
uid = Process.uid
return yield if euid == uid
old_euid = euid
process_reexchangeable = Process::UID.re_exchangeable?
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(uid)
end
home = T.must(Etc.getpwuid(Process.uid)).dir
return_value = with_env("HOME" => home, &block)
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(old_euid)
end
return_value
end
end
end
end
require "extend/os/bundle/bundle"

View File

@ -1,6 +1,9 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/brewfile"
require "bundle/dumper"
module Homebrew
module Bundle
module Adder

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/brew_installer"
module Homebrew
module Bundle
module Checker

View File

@ -11,6 +11,8 @@ module Homebrew
module_function
def reset!
require "bundle/brew_services"
Homebrew::Bundle::BrewServices.reset!
@formulae = nil
@formulae_by_full_name = nil
@ -54,6 +56,8 @@ module Homebrew
end
def dump(describe: false, no_restart: false)
require "bundle/brew_services"
requested_formula = formulae.select do |f|
f[:installed_on_request?] || !f[:installed_as_dependency?]
end

View File

@ -77,6 +77,7 @@ module Homebrew
end
def start_service_needed?
require "bundle/brew_services"
start_service? && !BrewServices.started?(@full_name)
end
@ -96,6 +97,7 @@ module Homebrew
end
def service_change_state!(verbose:)
require "bundle/brew_services"
if restart_service_needed?
puts "Restarting #{@name} service." if verbose
BrewServices.restart(@full_name, verbose:)
@ -156,6 +158,7 @@ module Homebrew
return true if array.include?(formula)
return true if array.include?(formula.split("/").last)
require "bundle/brew_dumper"
old_names = Homebrew::Bundle::BrewDumper.formula_oldnames
old_name = old_names[formula]
old_name ||= old_names[formula.split("/").last]
@ -195,6 +198,7 @@ module Homebrew
end
def self.formulae
require "bundle/brew_dumper"
Homebrew::Bundle::BrewDumper.formulae
end
@ -225,6 +229,7 @@ module Homebrew
conflicts_with = Set.new
conflicts_with += @conflicts_with_arg
require "bundle/brew_dumper"
if (formula = Homebrew::Bundle::BrewDumper.formulae_by_full_name(@full_name)) &&
(formula_conflicts_with = formula[:conflicts_with])
conflicts_with += formula_conflicts_with
@ -246,10 +251,11 @@ module Homebrew
end
return false unless Bundle.brew("unlink", conflict, verbose:)
if restart_service?
puts "Stopping #{conflict} service (if it is running)." if verbose
BrewServices.stop(conflict, verbose:)
end
next unless restart_service?
require "bundle/brew_services"
puts "Stopping #{conflict} service (if it is running)." if verbose
BrewServices.stop(conflict, verbose:)
end
true

View File

@ -24,6 +24,7 @@ module Homebrew
end
def entry_to_formula(entry)
require "bundle/brew_installer"
Homebrew::Bundle::BrewInstaller.new(entry.name, entry.options)
end
@ -32,10 +33,12 @@ module Homebrew
end
def service_is_started?(service_name)
require "bundle/brew_services"
Homebrew::Bundle::BrewServices.started?(service_name)
end
def lookup_old_name(service_name)
require "bundle/brew_dumper"
@old_names ||= Homebrew::Bundle::BrewDumper.formula_oldnames
old_name = @old_names[service_name]
old_name ||= @old_names[service_name.split("/").last]

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/dsl"
module Homebrew
module Bundle
module Brewfile

View File

@ -1,89 +0,0 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "English"
module Homebrew
module Bundle
class << self
def system(cmd, *args, verbose: false)
return super cmd, *args if verbose
logs = []
success = T.let(nil, T.nilable(T::Boolean))
IO.popen([cmd, *args], err: [:child, :out]) do |pipe|
while (buf = pipe.gets)
logs << buf
end
Process.wait(pipe.pid)
success = $CHILD_STATUS.success?
pipe.close
end
puts logs.join unless success
success
end
def brew(*args, verbose: false)
system(HOMEBREW_BREW_FILE, *args, verbose:)
end
def mas_installed?
@mas_installed ||= which_formula("mas")
end
def vscode_installed?
@vscode_installed ||= which_vscode.present?
end
def which_vscode
@which_vscode ||= which("code", ORIGINAL_PATHS)
@which_vscode ||= which("codium", ORIGINAL_PATHS)
@which_vscode ||= which("cursor", ORIGINAL_PATHS)
@which_vscode ||= which("code-insiders", ORIGINAL_PATHS)
end
def whalebrew_installed?
@whalebrew_installed ||= which_formula("whalebrew")
end
def cask_installed?
@cask_installed ||= File.directory?("#{HOMEBREW_PREFIX}/Caskroom") &&
(File.directory?("#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-cask") ||
!Homebrew::EnvConfig.no_install_from_api?)
end
def which_formula(name)
formula = Formulary.factory(name)
ENV["PATH"] = "#{formula.opt_bin}:#{ENV.fetch("PATH", nil)}" if formula.any_version_installed?
which(name).present?
end
def exchange_uid_if_needed!(&block)
euid = Process.euid
uid = Process.uid
return yield if euid == uid
old_euid = euid
process_reexchangeable = Process::UID.re_exchangeable?
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(uid)
end
home = T.must(Etc.getpwuid(Process.uid)).dir
return_value = with_env("HOME" => home, &block)
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(old_euid)
end
return_value
end
end
end
end
require "extend/os/bundle/bundle"

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/cask_installer"
module Homebrew
module Bundle
module Checker

View File

@ -14,6 +14,7 @@ module Homebrew
return true if outdated_casks.include?(name)
return false unless options[:greedy]
require "bundle/cask_dumper"
Homebrew::Bundle::CaskDumper.cask_is_outdated_using_greedy?(name)
end
@ -95,10 +96,12 @@ module Homebrew
end
def self.installed_casks
require "bundle/cask_dumper"
@installed_casks ||= Homebrew::Bundle::CaskDumper.cask_names
end
def self.outdated_casks
require "bundle/cask_dumper"
@outdated_casks ||= Homebrew::Bundle::CaskDumper.outdated_cask_names
end
end

View File

@ -32,6 +32,7 @@ module Homebrew
end
def checkable_entries(all_entries)
require "bundle/skipper"
all_entries.select { |e| e.type == self.class::PACKAGE_TYPE }
.reject(&Bundle::Skipper.method(:skip?))
end
@ -67,6 +68,7 @@ module Homebrew
}.freeze
def self.check(global: false, file: nil, exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/brewfile"
@dsl ||= Brewfile.read(global:, file:)
check_method_names = CHECKS.keys
@ -88,6 +90,7 @@ module Homebrew
end
def self.casks_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/cask_checker"
Homebrew::Bundle::Checker::CaskChecker.new.find_actionable(
@dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:,
@ -95,6 +98,7 @@ module Homebrew
end
def self.formulae_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/brew_checker"
Homebrew::Bundle::Checker::BrewChecker.new.find_actionable(
@dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:,
@ -102,6 +106,7 @@ module Homebrew
end
def self.taps_to_tap(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/tap_checker"
Homebrew::Bundle::Checker::TapChecker.new.find_actionable(
@dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:,
@ -109,6 +114,7 @@ module Homebrew
end
def self.apps_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/mac_app_store_checker"
Homebrew::Bundle::Checker::MacAppStoreChecker.new.find_actionable(
@dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:,
@ -116,6 +122,7 @@ module Homebrew
end
def self.extensions_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/vscode_extension_checker"
Homebrew::Bundle::Checker::VscodeExtensionChecker.new.find_actionable(
@dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:,
@ -123,6 +130,7 @@ module Homebrew
end
def self.formulae_to_start(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/brew_service_checker"
Homebrew::Bundle::Checker::BrewServiceChecker.new.find_actionable(
@dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:,
@ -130,6 +138,12 @@ module Homebrew
end
def self.reset!
require "bundle/cask_dumper"
require "bundle/brew_dumper"
require "bundle/mac_app_store_dumper"
require "bundle/tap_dumper"
require "bundle/brew_services"
@dsl = nil
Homebrew::Bundle::CaskDumper.reset!
Homebrew::Bundle::BrewDumper.reset!

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/adder"
module Homebrew
module Bundle
module Commands

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/checker"
module Homebrew
module Bundle
module Commands

View File

@ -9,6 +9,12 @@ module Homebrew
# TODO: refactor into multiple modules
module Cleanup
def self.reset!
require "bundle/cask_dumper"
require "bundle/brew_dumper"
require "bundle/tap_dumper"
require "bundle/vscode_extension_dumper"
require "bundle/brew_services"
@dsl = nil
@kept_casks = nil
@kept_formulae = nil
@ -87,12 +93,15 @@ module Homebrew
end
def self.casks_to_uninstall(global: false, file: nil)
require "bundle/cask_dumper"
Homebrew::Bundle::CaskDumper.cask_names - kept_casks(global:, file:)
end
def self.formulae_to_uninstall(global: false, file: nil)
kept_formulae = self.kept_formulae(global:, file:)
require "bundle/brew_dumper"
require "bundle/brew_installer"
current_formulae = Homebrew::Bundle::BrewDumper.formulae
current_formulae.reject! do |f|
Homebrew::Bundle::BrewInstaller.formula_in_array?(f[:full_name], kept_formulae)
@ -101,6 +110,10 @@ module Homebrew
end
private_class_method def self.kept_formulae(global: false, file: nil)
require "bundle/brewfile"
require "bundle/brew_dumper"
require "bundle/cask_dumper"
@kept_formulae ||= begin
@dsl ||= Brewfile.read(global:, file:)
@ -117,6 +130,7 @@ module Homebrew
end
private_class_method def self.kept_casks(global: false, file: nil)
require "bundle/brewfile"
return @kept_casks if @kept_casks
@dsl ||= Brewfile.read(global:, file:)
@ -152,6 +166,9 @@ module Homebrew
IGNORED_TAPS = %w[homebrew/core].freeze
def self.taps_to_untap(global: false, file: nil)
require "bundle/brewfile"
require "bundle/tap_dumper"
@dsl ||= Brewfile.read(global:, file:)
kept_formulae = self.kept_formulae(global:, file:).filter_map(&method(:lookup_formula))
kept_taps = @dsl.entries.select { |e| e.type == :tap }.map(&:name)
@ -168,6 +185,7 @@ module Homebrew
end
def self.vscode_extensions_to_uninstall(global: false, file: nil)
require "bundle/brewfile"
@dsl ||= Brewfile.read(global:, file:)
kept_extensions = @dsl.entries.select { |e| e.type == :vscode }.map { |x| x.name.downcase }
@ -176,6 +194,7 @@ module Homebrew
# find any in the `Brewfile`.
return [].freeze if kept_extensions.empty?
require "bundle/vscode_extension_dumper"
current_extensions = Homebrew::Bundle::VscodeExtensionDumper.extensions
current_extensions - kept_extensions
end

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/dumper"
module Homebrew
module Bundle
module Commands

View File

@ -57,6 +57,7 @@ module Homebrew
command = args.first
require "bundle/brewfile"
@dsl = Brewfile.read(global:, file:)
require "formula"

View File

@ -1,6 +1,9 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/brewfile"
require "bundle/installer"
module Homebrew
module Bundle
module Commands

View File

@ -1,6 +1,9 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/brewfile"
require "bundle/lister"
module Homebrew
module Bundle
module Commands

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/remover"
module Homebrew
module Bundle
module Commands

View File

@ -14,6 +14,12 @@ module Homebrew
end
def self.build_brewfile(describe:, no_restart:, brews:, taps:, casks:, mas:, whalebrew:, vscode:)
require "bundle/tap_dumper"
require "bundle/cask_dumper"
require "bundle/mac_app_store_dumper"
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_dumper"
content = []
content << TapDumper.dump if taps
content << BrewDumper.dump(describe:, no_restart:) if brews
@ -33,6 +39,7 @@ module Homebrew
end
def self.brewfile_path(global: false, file: nil)
require "bundle/brewfile"
Brewfile.path(dash_writes_to_stdout: true, global:, file:)
end

View File

@ -1,6 +1,14 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "bundle/dsl"
require "bundle/brew_installer"
require "bundle/cask_installer"
require "bundle/mac_app_store_installer"
require "bundle/whalebrew_installer"
require "bundle/vscode_extension_installer"
require "bundle/tap_installer"
module Homebrew
module Bundle
module Installer

View File

@ -61,6 +61,7 @@ module Homebrew
end
def self.installed_app_ids
require "bundle/mac_app_store_dumper"
@installed_app_ids ||= Homebrew::Bundle::MacAppStoreDumper.app_ids
end

View File

@ -5,6 +5,9 @@ module Homebrew
module Bundle
module Remover
def self.remove(*args, type:, global:, file:)
require "bundle/brewfile"
require "bundle/dumper"
brewfile = Brewfile.read(global:, file:)
content = brewfile.input
entry_type = type.to_s if type != :none

View File

@ -8,6 +8,8 @@ module Homebrew
module Skipper
class << self
def skip?(entry, silent: false)
require "bundle/brew_dumper"
# TODO: use extend/OS here
# rubocop:todo Homebrew/MoveToExtendOS
if (Hardware::CPU.arm? || OS.linux?) &&

View File

@ -12,6 +12,7 @@ module Homebrew
requested_taps = format_checkable(entries)
return [] if requested_taps.empty?
require "bundle/tap_dumper"
current_taps = Homebrew::Bundle::TapDumper.tap_names
(requested_taps - current_taps).map { |entry| "Tap #{entry} needs to be tapped." }
end

View File

@ -28,6 +28,7 @@ module Homebrew
end
unless success
require "bundle/skipper"
Homebrew::Bundle::Skipper.tap_failed!(name)
return false
end
@ -37,6 +38,7 @@ module Homebrew
end
def self.installed_taps
require "bundle/tap_dumper"
@installed_taps ||= Homebrew::Bundle::TapDumper.tap_names
end
end

View File

@ -13,6 +13,7 @@ module Homebrew
end
def installed_and_up_to_date?(extension, no_upgrade: false)
require "bundle/vscode_extension_installer"
Homebrew::Bundle::VscodeExtensionInstaller.extension_installed?(extension)
end
end

View File

@ -44,6 +44,7 @@ module Homebrew
end
def self.installed_extensions
require "bundle/vscode_extension_dumper"
@installed_extensions ||= Homebrew::Bundle::VscodeExtensionDumper.extensions
end
end

View File

@ -40,6 +40,7 @@ module Homebrew
end
def self.installed_images
require "bundle/whalebrew_dumper"
@installed_images ||= Homebrew::Bundle::WhalebrewDumper.images
end
end

View File

@ -156,6 +156,7 @@ module Homebrew
raise UsageError, "`--install` cannot be used with `install`, `upgrade` or no subcommand."
end
require "bundle/commands/install"
redirect_stdout($stderr) do
Homebrew::Bundle::Commands::Install.run(global:, file:, no_upgrade:, verbose:, force:, quiet: true)
end
@ -163,6 +164,7 @@ module Homebrew
case subcommand
when nil, "install", "upgrade"
require "bundle/commands/install"
Homebrew::Bundle::Commands::Install.run(global:, file:, no_upgrade:, verbose:, force:, quiet: args.quiet?)
cleanup = if ENV.fetch("HOMEBREW_BUNDLE_INSTALL_CLEANUP", nil)
@ -172,6 +174,7 @@ module Homebrew
end
if cleanup
require "bundle/commands/cleanup"
Homebrew::Bundle::Commands::Cleanup.run(
global:, file:, zap:,
force: true,
@ -187,6 +190,7 @@ module Homebrew
no_type_args
end
require "bundle/commands/dump"
Homebrew::Bundle::Commands::Dump.run(
global:, file:, force:,
describe: args.describe?,
@ -199,10 +203,13 @@ module Homebrew
vscode:
)
when "edit"
require "bundle/brewfile"
exec_editor(Homebrew::Bundle::Brewfile.path(global:, file:))
when "cleanup"
require "bundle/commands/cleanup"
Homebrew::Bundle::Commands::Cleanup.run(global:, file:, force:, zap:)
when "check"
require "bundle/commands/check"
Homebrew::Bundle::Commands::Check.run(global:, file:, no_upgrade:, verbose:)
when "exec", "sh", "env"
named_args = case subcommand
@ -225,8 +232,10 @@ module Homebrew
when "env"
["env"]
end
require "bundle/commands/exec"
Homebrew::Bundle::Commands::Exec.run(*named_args, global:, file:, subcommand:)
when "list"
require "bundle/commands/list"
Homebrew::Bundle::Commands::List.run(
global:,
file:,
@ -259,8 +268,10 @@ module Homebrew
else t
end
require "bundle/commands/add"
Homebrew::Bundle::Commands::Add.run(*named_args, type:, global:, file:)
else
require "bundle/commands/remove"
Homebrew::Bundle::Commands::Remove.run(*named_args, type: selected_types.first, global:, file:)
end
else

View File

@ -2,6 +2,7 @@
require "ostruct"
require "bundle"
require "bundle/brew_dumper"
require "tsort"
require "formula"
require "tab"

View File

@ -2,6 +2,9 @@
require "bundle"
require "formula"
require "bundle/brew_installer"
require "bundle/brew_dumper"
require "bundle/brew_services"
RSpec.describe Homebrew::Bundle::BrewInstaller do
let(:formula_name) { "mysql" }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/brew_services"
RSpec.describe Homebrew::Bundle::BrewServices do
describe ".started_services" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/brewfile"
RSpec.describe Homebrew::Bundle::Brewfile do
describe "path" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/cask_dumper"
require "cask"
RSpec.describe Homebrew::Bundle::CaskDumper do

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true
require "bundle"
require "bundle/cask_dumper"
require "bundle/cask_installer"
RSpec.describe Homebrew::Bundle::CaskInstaller do
describe ".installed_casks" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/add"
require "cask/cask_loader"
RSpec.describe Homebrew::Bundle::Commands::Add do

View File

@ -1,6 +1,12 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/check"
require "bundle/brew_checker"
require "bundle/mac_app_store_checker"
require "bundle/vscode_extension_checker"
require "bundle/brew_installer"
require "bundle/mac_app_store_installer"
RSpec.describe Homebrew::Bundle::Commands::Check do
let(:do_check) do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/cleanup"
RSpec.describe Homebrew::Bundle::Commands::Cleanup do
describe "read Brewfile and current installation" do

View File

@ -1,6 +1,12 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/dump"
require "bundle/cask_dumper"
require "bundle/brew_dumper"
require "bundle/tap_dumper"
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_dumper"
RSpec.describe Homebrew::Bundle::Commands::Dump do
subject(:dump) do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/exec"
RSpec.describe Homebrew::Bundle::Commands::Exec do
context "when a Brewfile is not found" do

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/install"
require "bundle/skipper"
RSpec.describe Homebrew::Bundle::Commands::Install do
before do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/list"
RSpec.describe Homebrew::Bundle::Commands::List do
subject(:list) { described_class.run(global: false, file: nil, brews:, casks:, taps:, mas:, whalebrew:, vscode:) }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/commands/remove"
require "cask/cask_loader"
RSpec.describe Homebrew::Bundle::Commands::Remove do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/dsl"
RSpec.describe Homebrew::Bundle::Dsl do
def dsl_from_string(string)

View File

@ -1,6 +1,14 @@
# frozen_string_literal: true
require "bundle"
require "bundle/dumper"
require "bundle/brew_dumper"
require "bundle/tap_dumper"
require "bundle/cask_dumper"
require "bundle/mac_app_store_dumper"
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_dumper"
require "bundle/brew_services"
require "cask"
RSpec.describe Homebrew::Bundle::Dumper do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/mac_app_store_dumper"
RSpec.describe Homebrew::Bundle::MacAppStoreDumper do
subject(:dumper) { described_class }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/mac_app_store_installer"
RSpec.describe Homebrew::Bundle::MacAppStoreInstaller do
before do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/remover"
RSpec.describe Homebrew::Bundle::Remover do
subject(:remover) { described_class }

View File

@ -2,6 +2,8 @@
require "ostruct"
require "bundle"
require "bundle/skipper"
require "bundle/dsl"
RSpec.describe Homebrew::Bundle::Skipper do
subject(:skipper) { described_class }

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true
require "bundle"
require "bundle/skipper"
require "bundle/tap_dumper"
RSpec.describe Homebrew::Bundle::TapDumper do
subject(:dumper) { described_class }

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true
require "bundle"
require "bundle/tap_installer"
require "bundle/tap_dumper"
RSpec.describe Homebrew::Bundle::TapInstaller do
describe ".installed_taps" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/vscode_extension_installer"
require "extend/kernel"
RSpec.describe Homebrew::Bundle::VscodeExtensionInstaller do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/whalebrew_dumper"
RSpec.describe Homebrew::Bundle::WhalebrewDumper do
subject(:dumper) { described_class }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
require "bundle"
require "bundle/whalebrew_installer"
RSpec.describe Homebrew::Bundle::WhalebrewInstaller do
before do