Skip to content

Commit

Permalink
Merge pull request #14950 from issyl0/sorbet-autogenerate-envconfig-rbi
Browse files Browse the repository at this point in the history
sorbet: Autogenerate the RBI file for `Homebrew::EnvConfig`
  • Loading branch information
MikeMcQuaid committed Mar 13, 2023
2 parents 296c508 + b8cb1d1 commit b4aac9d
Show file tree
Hide file tree
Showing 6 changed files with 283 additions and 163 deletions.
1 change: 1 addition & 0 deletions Library/Homebrew/dev-cmd/typecheck.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ def typecheck

ohai "Updating homegrown RBI files..."
safe_system "bundle", "exec", "ruby", "sorbet/custom_generators/tty.rb"
safe_system "bundle", "exec", "ruby", "sorbet/custom_generators/env_config.rb"

ohai "Updating Tapioca RBI files..."
safe_system "bundle", "exec", "tapioca", "gem", *tapioca_args
Expand Down
237 changes: 235 additions & 2 deletions Library/Homebrew/env_config.rbi
Original file line number Diff line number Diff line change
@@ -1,7 +1,240 @@
# typed: strict

module Homebrew::EnvConfig
# This is necessary due to https://github.com/sorbet/sorbet/issues/6726
sig { returns(String) }
sig { returns(T.nilable(String)) }
def self.additional_google_analytics_id; end

sig { returns(T.nilable(String)) }
def self.all_proxy; end

sig { returns(Integer) }
def self.api_auto_update_secs; end

sig { returns(String) }
def self.api_domain; end

sig { returns(String) }
def self.arch; end

sig { returns(T.nilable(String)) }
def self.artifact_domain; end

sig { returns(T.nilable(String)) }
def self.auto_update_secs; end

sig { returns(T::Boolean) }
def self.autoremove?; end

sig { returns(T::Boolean) }
def self.bat?; end

sig { returns(T.nilable(String)) }
def self.bat_config_path; end

sig { returns(T.nilable(String)) }
def self.bat_theme; end

sig { returns(T::Boolean) }
def self.bootsnap?; end

sig { returns(String) }
def self.bottle_domain; end

sig { returns(String) }
def self.brew_git_remote; end

sig { returns(T.nilable(String)) }
def self.browser; end

sig { returns(String) }
def self.cache; end

sig { returns(Integer) }
def self.cleanup_max_age_days; end

sig { returns(Integer) }
def self.cleanup_periodic_full_days; end

sig { returns(T::Boolean) }
def self.color?; end

sig { returns(String) }
def self.core_git_remote; end

sig { returns(String) }
def self.curl_path; end

sig { returns(Integer) }
def self.curl_retries; end

sig { returns(T::Boolean) }
def self.curl_verbose?; end

sig { returns(T::Boolean) }
def self.curlrc?; end

sig { returns(T::Boolean) }
def self.debug?; end

sig { returns(T::Boolean) }
def self.developer?; end

sig { returns(T::Boolean) }
def self.disable_load_formula?; end

sig { returns(T.nilable(String)) }
def self.display; end

sig { returns(T::Boolean) }
def self.display_install_times?; end

sig { returns(T.nilable(String)) }
def self.docker_registry_basic_auth_token; end

sig { returns(T.nilable(String)) }
def self.docker_registry_token; end

sig { returns(T.nilable(String)) }
def self.editor; end

sig { returns(T::Boolean) }
def self.eval_all?; end

sig { returns(Integer) }
def self.fail_log_lines; end

sig { returns(T.nilable(String)) }
def self.forbidden_licenses; end

sig { returns(T::Boolean) }
def self.force_brewed_ca_certificates?; end

sig { returns(T::Boolean) }
def self.force_brewed_curl?; end

sig { returns(T::Boolean) }
def self.force_brewed_git?; end

sig { returns(T::Boolean) }
def self.force_vendor_ruby?; end

sig { returns(T.nilable(String)) }
def self.ftp_proxy; end

sig { returns(T.nilable(String)) }
def self.git_email; end

sig { returns(T.nilable(String)) }
def self.git_name; end

sig { returns(String) }
def self.git_path; end

sig { returns(T.nilable(String)) }
def self.github_api_token; end

sig { returns(T.nilable(String)) }
def self.github_packages_token; end

sig { returns(T.nilable(String)) }
def self.github_packages_user; end

sig { returns(T.nilable(String)) }
def self.http_proxy; end

sig { returns(T.nilable(String)) }
def self.https_proxy; end

sig { returns(String) }
def self.install_badge; end

sig { returns(String) }
def self.livecheck_watchlist; end

sig { returns(String) }
def self.logs; end

sig { returns(T::Boolean) }
def self.no_analytics?; end

sig { returns(T::Boolean) }
def self.no_auto_update?; end

sig { returns(T::Boolean) }
def self.no_bootsnap?; end

sig { returns(T.nilable(String)) }
def self.no_cleanup_formulae; end

sig { returns(T::Boolean) }
def self.no_color?; end

sig { returns(T::Boolean) }
def self.no_compat?; end

sig { returns(T::Boolean) }
def self.no_emoji?; end

sig { returns(T::Boolean) }
def self.no_env_hints?; end

sig { returns(T::Boolean) }
def self.no_github_api?; end

sig { returns(T::Boolean) }
def self.no_google_analytics?; end

sig { returns(T::Boolean) }
def self.no_insecure_redirect?; end

sig { returns(T::Boolean) }
def self.no_install_cleanup?; end

sig { returns(T::Boolean) }
def self.no_install_from_api?; end

sig { returns(T::Boolean) }
def self.no_install_upgrade?; end

sig { returns(T::Boolean) }
def self.no_installed_dependents_check?; end

sig { returns(T.nilable(String)) }
def self.no_proxy; end

sig { returns(T.nilable(String)) }
def self.pip_index_url; end

sig { returns(T::Boolean) }
def self.pry?; end

sig { returns(T::Boolean) }
def self.simulate_macos_on_linux?; end

sig { returns(T::Boolean) }
def self.skip_or_later_bottles?; end

sig { returns(T::Boolean) }
def self.sorbet_runtime?; end

sig { returns(T.nilable(String)) }
def self.ssh_config_path; end

sig { returns(T.nilable(String)) }
def self.sudo_askpass; end

sig { returns(T.nilable(String)) }
def self.svn; end

sig { returns(String) }
def self.temp; end

sig { returns(T::Boolean) }
def self.update_to_tag?; end

sig { returns(T::Boolean) }
def self.verbose?; end

sig { returns(T::Boolean) }
def self.verbose_using_dots?; end
end
2 changes: 1 addition & 1 deletion Library/Homebrew/formula.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2522,7 +2522,7 @@ def system(cmd, *args)
log.flush
if !verbose? || verbose_using_dots
puts "Last #{log_lines} lines from #{logfn}:"
Kernel.system "/usr/bin/tail", "-n", log_lines, logfn
Kernel.system "/usr/bin/tail", "-n", log_lines.to_s, logfn
end
log.puts

Expand Down
8 changes: 4 additions & 4 deletions Library/Homebrew/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -285,8 +285,8 @@ def determine_url_mirrors

# glibc-bootstrap
if url.start_with?("https://github.com/Homebrew/glibc-bootstrap/releases/download")
if Homebrew::EnvConfig.artifact_domain.present?
extra_urls << url.sub("https://github.com", Homebrew::EnvConfig.artifact_domain)
if (artifact_domain = Homebrew::EnvConfig.artifact_domain.presence)
extra_urls << url.sub("https://github.com", artifact_domain)
end
if Homebrew::EnvConfig.bottle_domain != HOMEBREW_BOTTLE_DEFAULT_DOMAIN
tag, filename = url.split("/").last(2)
Expand All @@ -295,8 +295,8 @@ def determine_url_mirrors
end

# PyPI packages: PEP 503 – Simple Repository API <https://peps.python.org/pep-0503>
if Homebrew::EnvConfig.pip_index_url.present?
pip_index_base_url = Homebrew::EnvConfig.pip_index_url.chomp("/").chomp("/simple")
if (pip_index_url = Homebrew::EnvConfig.pip_index_url.presence)
pip_index_base_url = pip_index_url.chomp("/").chomp("/simple")
%w[https://files.pythonhosted.org https://pypi.org].each do |base_url|
extra_urls << url.sub(base_url, pip_index_base_url) if url.start_with?("#{base_url}/packages")
end
Expand Down
42 changes: 42 additions & 0 deletions Library/Homebrew/sorbet/custom_generators/env_config.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# typed: true
# frozen_string_literal: true

require_relative "../../global"
require_relative "../../env_config"

File.open("#{__dir__}/../../env_config.rbi", "w") do |file|
file.write(<<~RUBY)
# typed: strict
module Homebrew::EnvConfig
RUBY

dynamic_methods = {}
Homebrew::EnvConfig::ENVS.each do |env, hash|
next if Homebrew::EnvConfig::CUSTOM_IMPLEMENTATIONS.include?(env.to_s)

name = Homebrew::EnvConfig.env_method_name(env, hash)
dynamic_methods[name] = { default: hash[:default] }
end

methods = Homebrew::EnvConfig.methods(false).map(&:to_s).select { |method| dynamic_methods.key?(method) }.sort

methods.each do |method|
return_type = if method.end_with?("?")
T::Boolean
elsif (default = dynamic_methods[method][:default])
default.class
else
T.nilable(String)
end

file.write(<<-RUBY)
sig { returns(#{return_type}) }
def self.#{method}; end
RUBY

file.write("\n") unless method == methods.last
end

file.puts "end"
end

0 comments on commit b4aac9d

Please sign in to comment.