# <!-- rdoc-file=lib/rubygems.rb -->
# RubyGems is the Ruby standard for publishing and managing third party
# libraries.
#
# For user documentation, see:
#
# *   `gem help` and `gem help [command]`
# *   [RubyGems User Guide](https://guides.rubygems.org/)
# *   [Frequently Asked Questions](https://guides.rubygems.org/faqs)
#
# For gem developer documentation see:
#
# *   [Creating Gems](https://guides.rubygems.org/make-your-own-gem)
# *   Gem::Specification
# *   Gem::Version for version dependency notes
#
# Further RubyGems documentation can be found at:
#
# *   [RubyGems Guides](https://guides.rubygems.org)
# *   [RubyGems API](https://www.rubydoc.info/github/ruby/rubygems) (also
#     available from `gem server`)
#
# ## RubyGems Plugins
#
# RubyGems will load plugins in the latest version of each installed gem or
# $LOAD_PATH.  Plugins must be named 'rubygems_plugin' (.rb, .so, etc) and
# placed at the root of your gem's #require_path.  Plugins are installed at a
# special location and loaded on boot.
#
# For an example plugin, see the [Graph gem](https://github.com/seattlerb/graph)
# which adds a `gem graph` command.
#
# ## RubyGems Defaults, Packaging
#
# RubyGems defaults are stored in lib/rubygems/defaults.rb.  If you're packaging
# RubyGems or implementing Ruby you can change RubyGems' defaults.
#
# For RubyGems packagers, provide lib/rubygems/defaults/operating_system.rb and
# override any defaults from lib/rubygems/defaults.rb.
#
# For Ruby implementers, provide lib/rubygems/defaults/#{RUBY_ENGINE}.rb and
# override any defaults from lib/rubygems/defaults.rb.
#
# If you need RubyGems to perform extra work on install or uninstall, your
# defaults override file can set pre/post install and uninstall hooks. See
# Gem::pre_install, Gem::pre_uninstall, Gem::post_install, Gem::post_uninstall.
#
# ## Bugs
#
# You can submit bugs to the [RubyGems bug
# tracker](https://github.com/ruby/rubygems/issues) on GitHub
#
# ## Credits
#
# RubyGems is currently maintained by Eric Hodel.
#
# RubyGems was originally developed at RubyConf 2003 by:
#
# *   Rich Kilmer  -- rich(at)infoether.com
# *   Chad Fowler  -- chad(at)chadfowler.com
# *   David Black  -- dblack(at)wobblini.net
# *   Paul Brannan -- paul(at)atdesk.com
# *   Jim Weirich   -- jim(at)weirichhouse.org
#
# Contributors:
#
# *   Gavin Sinclair     -- gsinclair(at)soyabean.com.au
# *   George Marrows     -- george.marrows(at)ntlworld.com
# *   Dick Davies        -- rasputnik(at)hellooperator.net
# *   Mauricio Fernandez -- batsman.geo(at)yahoo.com
# *   Simon Strandgaard  -- neoneye(at)adslhome.dk
# *   Dave Glasser       -- glasser(at)mit.edu
# *   Paul Duncan        -- pabs(at)pablotron.org
# *   Ville Aine         -- vaine(at)cs.helsinki.fi
# *   Eric Hodel         -- drbrain(at)segment7.net
# *   Daniel Berger      -- djberg96(at)gmail.com
# *   Phil Hagelberg     -- technomancy(at)gmail.com
# *   Ryan Davis         -- ryand-ruby(at)zenspider.com
# *   Evan Phoenix       -- evan(at)fallingsnow.net
# *   Steve Klabnik      -- steve(at)steveklabnik.com
#
# (If your name is missing, PLEASE let us know!)
#
# ## License
#
# See [LICENSE.txt](https://github.com/ruby/rubygems/blob/master/LICENSE.txt)
# for permissions.
#
# Thanks!
#
# -The RubyGems Team
#
module Gem
  interface _HashLike[K, V]
    def each_pair: () { ([ K, V ]) -> untyped } -> self
  end

  DEFAULT_HOST: String

  GEM_DEP_FILES: Array[String]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # When https://bugs.ruby-lang.org/issues/17259 is available, there is no need to
  # override Kernel#warn
  #
  KERNEL_WARN_IGNORES_INTERNAL_ENTRIES: bool

  LOADED_SPECS_MUTEX: Thread::Mutex

  # <!-- rdoc-file=lib/rubygems.rb -->
  # Location of Marshal quick gemspecs on remote repositories
  #
  MARSHAL_SPEC_DIR: String

  # <!-- rdoc-file=lib/rubygems.rb -->
  # Exception classes used in a Gem.read_binary `rescue` statement
  #
  READ_BINARY_ERRORS: Array[Class]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # Subdirectories in a gem repository for default gems
  #
  REPOSITORY_DEFAULT_GEM_SUBDIRECTORIES: Array[String]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # Subdirectories in a gem repository
  #
  REPOSITORY_SUBDIRECTORIES: Array[String]

  RUBYGEMS_DIR: String

  # <!-- rdoc-file=lib/rubygems.rb -->
  # Taint support is deprecated in Ruby 2.7. This allows switching ".untaint" to
  # ".tap(&Gem::UNTAINT)", to avoid deprecation warnings in Ruby 2.7.
  #
  UNTAINT: Proc

  VERSION: String

  # <!-- rdoc-file=lib/rubygems/win_platform.rb -->
  # An Array of Regexps that match windows Ruby platforms.
  #
  WIN_PATTERNS: Array[Regexp]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # Exception classes used in Gem.write_binary `rescue` statement
  #
  WRITE_BINARY_ERRORS: Array[Class]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - activated_gem_paths()
  # -->
  # The number of paths in the +$LOAD_PATH+ from activated gems. Used to
  # prioritize `-I` and `ENV['RUBYLIB']` entries during `require`.
  #
  def self.activated_gem_paths: () -> Integer

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - add_to_load_path(*paths)
  # -->
  # Add a list of paths to the $LOAD_PATH at the proper place.
  #
  def self.add_to_load_path: (*String paths) -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - bin_path(name, exec_name = nil, *requirements)
  # -->
  # Find the full path to the executable for gem `name`.  If the `exec_name` is
  # not given, an exception will be raised, otherwise the specified executable's
  # path is returned.  `requirements` allows you to specify specific gem versions.
  #
  def self.bin_path: (String name, String exec_name, ?Array[Requirement] requirements) -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - binary_mode()
  # -->
  # The mode needed to read a file as straight binary.
  #
  def self.binary_mode: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - bindir(install_dir = Gem.dir)
  # -->
  # The path where gem executables are to be installed.
  #
  def self.bindir: (?String install_dir) -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - cache_home()
  # -->
  # The path to standard location of the user's cache directory.
  #
  def self.cache_home: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - clear_default_specs()
  # -->
  # Clear default gem related variables. It is for test
  #
  def self.clear_default_specs: () -> void

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - clear_paths()
  # -->
  # Reset the `dir` and `path` values.  The next time `dir` or `path` is
  # requested, the values will be calculated from scratch.  This is mainly used by
  # the unit tests to provide test isolation.
  #
  def self.clear_paths: () -> void

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - config_file()
  # -->
  # The path to standard location of the user's .gemrc file.
  #
  def self.config_file: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - config_home()
  # -->
  # The path to standard location of the user's configuration directory.
  #
  def self.config_home: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - configuration()
  # -->
  # The standard configuration object for gems.
  #
  def self.configuration: () -> ConfigFile

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - configuration=(config)
  # -->
  # Use the given configuration object (which implements the ConfigFile protocol)
  # as the standard configuration object.
  #
  def self.configuration=: (ConfigFile config) -> ConfigFile

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - data_home()
  # -->
  # The path to standard location of the user's data directory.
  #
  def self.data_home: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_bindir()
  # -->
  # The default directory for binaries
  #
  def self.default_bindir: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_cert_path()
  # -->
  # The default signing certificate chain path
  #
  def self.default_cert_path: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_dir()
  # -->
  # Default home directory path to be used if an alternate value is not specified
  # in the environment
  #
  def self.default_dir: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_exec_format()
  # -->
  # Deduce Ruby's --program-prefix and --program-suffix from its install name
  #
  def self.default_exec_format: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_ext_dir_for(base_dir)
  # -->
  # Returns binary extensions dir for specified RubyGems base dir or nil if such
  # directory cannot be determined.
  #
  # By default, the binary extensions are located side by side with their Ruby
  # counterparts, therefore nil is returned
  #
  def self.default_ext_dir_for: (String base_dir) -> String?

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_key_path()
  # -->
  # The default signing key path
  #
  def self.default_key_path: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_path()
  # -->
  # Default gem load path
  #
  def self.default_path: () -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_rubygems_dirs()
  # -->
  # Paths where RubyGems' .rb files and bin files are installed
  #
  def self.default_rubygems_dirs: () -> Array[String]?

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_sources()
  # -->
  # An Array of the default sources that come with RubyGems
  #
  def self.default_sources: () -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_spec_cache_dir()
  # -->
  # Default spec directory path to be used if an alternate value is not specified
  # in the environment
  #
  def self.default_spec_cache_dir: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - default_specifications_dir()
  # -->
  # Path to specification files of default gems.
  #
  def self.default_specifications_dir: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - deflate(data)
  # -->
  # A Zlib::Deflate.deflate wrapper
  #
  def self.deflate: (String data) -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - dir()
  # -->
  # The path where gems are to be installed.
  #
  def self.dir: () -> String

  # <!-- rdoc-file=lib/rubygems.rb -->
  # RubyGems distributors (like operating system package managers) can disable
  # RubyGems update by setting this to error message printed to end-users on gem
  # update --system instead of actual update.
  #
  def self.disable_system_update_message: () -> String?

  # <!-- rdoc-file=lib/rubygems.rb -->
  # RubyGems distributors (like operating system package managers) can disable
  # RubyGems update by setting this to error message printed to end-users on gem
  # update --system instead of actual update.
  #
  def self.disable_system_update_message=: (String?) -> String?

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - done_installing(&hook)
  # -->
  # Adds a post-installs hook that will be passed a Gem::DependencyInstaller and a
  # list of installed specifications when Gem::DependencyInstaller#install is
  # complete
  #
  def self.done_installing: () { (DependencyInstaller, Array[Specification]) -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run after Gem::DependencyInstaller installs a set of
  # gems
  #
  def self.done_installing_hooks: () -> Array[Proc?]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - ensure_default_gem_subdirectories(dir = Gem.dir, mode = nil)
  # -->
  # Quietly ensure the Gem directory `dir` contains all the proper subdirectories
  # for handling default gems.  If we can't create a directory due to a permission
  # problem, then we will silently continue.
  #
  # If `mode` is given, missing directories are created with this mode.
  #
  # World-writable directories will never be created.
  #
  def self.ensure_default_gem_subdirectories: (?String dir, ?Integer | String mode) -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - ensure_gem_subdirectories(dir = Gem.dir, mode = nil)
  # -->
  # Quietly ensure the Gem directory `dir` contains all the proper subdirectories.
  #  If we can't create a directory due to a permission problem, then we will
  # silently continue.
  #
  # If `mode` is given, missing directories are created with this mode.
  #
  # World-writable directories will never be created.
  #
  def self.ensure_gem_subdirectories: (?String dir, ?Integer | String mode) -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - env_requirement(gem_name)
  # -->
  #
  def self.env_requirement: (String gem_name) -> Requirement

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - find_config_file()
  # -->
  # Finds the user's config file
  #
  def self.find_config_file: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - find_files(glob, check_load_path = true)
  # -->
  # Returns a list of paths matching `glob` that can be used by a gem to pick up
  # features from other gems.  For example:
  #
  #     Gem.find_files('rdoc/discover').each do |path| load path end
  #
  # if `check_load_path` is true (the default), then find_files also searches
  # $LOAD_PATH for files as well as gems.
  #
  # Note that find_files will return all files even if they are from different
  # versions of the same gem.  See also find_latest_files
  #
  def self.find_files: (String glob, ?boolish check_load_path) -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - find_latest_files(glob, check_load_path = true)
  # -->
  # Returns a list of paths matching `glob` from the latest gems that can be used
  # by a gem to pick up features from other gems.  For example:
  #
  #     Gem.find_latest_files('rdoc/discover').each do |path| load path end
  #
  # if `check_load_path` is true (the default), then find_latest_files also
  # searches $LOAD_PATH for files as well as gems.
  #
  # Unlike find_files, find_latest_files will return only files from the latest
  # version of a gem.
  #
  def self.find_latest_files: (String glob, ?boolish check_load_path) -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - find_unresolved_default_spec(path)
  # -->
  # Find an unresolved Gem::Specification of default gem from `path`
  #
  def self.find_unresolved_default_spec: (String path) -> Specification?

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - finish_resolve(request_set = Gem::RequestSet.new)
  # -->
  #
  def self.finish_resolve: (?RequestSet request_set) -> void

  # <!-- rdoc-file=lib/rubygems.rb -->
  # GemDependencyAPI object, which is set when .use_gemdeps is called. This
  # contains all the information from the Gemfile.
  #
  def self.gemdeps: () -> RequestSet::GemDependencyAPI?

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - host()
  # -->
  # Get the default RubyGems API host. This is normally `https://rubygems.org`.
  #
  def self.host: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - host=(host)
  # -->
  # Set the default RubyGems API host.
  #
  def self.host=: (String host) -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - install(name, version = Gem::Requirement.default, *options)
  # -->
  # Top level install helper method. Allows you to install gems interactively:
  #
  #     % irb
  #     >> Gem.install "minitest"
  #     Fetching: minitest-5.14.0.gem (100%)
  #     => [#<Gem::Specification:0x1013b4528 @name="minitest", ...>]
  #
  def self.install: (String name, ?Gem::Requirement version, *DependencyInstaller::options options) -> Array[Specification]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - java_platform?()
  # -->
  # Is this a java platform?
  #
  def self.java_platform?: () -> bool

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - latest_rubygems_version()
  # -->
  # Returns the latest release version of RubyGems.
  #
  def self.latest_rubygems_version: () -> Version

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - latest_spec_for(name)
  # -->
  # Returns the latest release-version specification for the gem `name`.
  #
  def self.latest_spec_for: (String name) -> Specification?

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - latest_version_for(name)
  # -->
  # Returns the version of the latest release-version of gem `name`
  #
  def self.latest_version_for: (String name) -> Version?

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - load_env_plugins()
  # -->
  # Find all 'rubygems_plugin' files in $LOAD_PATH and load them
  #
  def self.load_env_plugins: () -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - load_path_insert_index()
  # -->
  # The index to insert activated gem paths into the $LOAD_PATH. The activated
  # gem's paths are inserted before site lib directory by default.
  #
  def self.load_path_insert_index: () -> Integer

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - load_plugins()
  # -->
  # Find rubygems plugin files in the standard location and load them
  #
  def self.load_plugins: () -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - load_yaml()
  # -->
  # Loads YAML, preferring Psych
  #
  def self.load_yaml: () -> bool?

  # <!-- rdoc-file=lib/rubygems.rb -->
  # Hash of loaded Gem::Specification keyed by name
  #
  def self.loaded_specs: () -> Hash[String, BasicSpecification]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - location_of_caller(depth = 1)
  # -->
  # The file name and line number of the caller of the caller of this method.
  #
  # `depth` is how many layers up the call stack it should go.
  #
  # e.g.,
  #
  # def a; Gem.location_of_caller; end a #=> ["x.rb", 2]  # (it'll vary depending
  # on file name and line number)
  #
  # def b; c; end def c; Gem.location_of_caller(2); end b #=> ["x.rb", 6]  #
  # (it'll vary depending on file name and line number)
  #
  def self.location_of_caller: (?Integer depth) -> [ String, Integer ]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - marshal_version()
  # -->
  # The version of the Marshal format for your Ruby.
  #
  def self.marshal_version: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - needs() { |rs| ... }
  # -->
  #
  def self.needs: () { (RequestSet) -> void } -> void

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - operating_system_defaults()
  # -->
  # Default options for gem commands for Ruby packagers.
  #
  # The options here should be structured as an array of string "gem" command
  # names as keys and a string of the default options as values.
  #
  # Example:
  #
  # def self.operating_system_defaults
  #     {
  #         'install' => '--no-rdoc --no-ri --env-shebang',
  #         'update' => '--no-rdoc --no-ri --env-shebang'
  #     }
  #
  # end
  #
  def self.operating_system_defaults: () -> Hash[String, String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - path()
  # -->
  #
  def self.path: () -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - path_separator()
  # -->
  # How String Gem paths should be split.  Overridable for esoteric platforms.
  #
  def self.path_separator: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - paths()
  # -->
  # Retrieve the PathSupport object that RubyGems uses to lookup files.
  #
  def self.paths: () -> PathSupport

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - paths=(env)
  # -->
  # Initialize the filesystem paths to use from `env`. `env` is a hash-like object
  # (typically ENV) that is queried for 'GEM_HOME', 'GEM_PATH', and
  # 'GEM_SPEC_CACHE' Keys for the `env` hash should be Strings, and values of the
  # hash should be Strings or `nil`.
  #
  def self.paths=: (_HashLike[String, String?] env) -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - platform_defaults()
  # -->
  # Default options for gem commands for Ruby implementers.
  #
  # The options here should be structured as an array of string "gem" command
  # names as keys and a string of the default options as values.
  #
  # Example:
  #
  # def self.platform_defaults
  #     {
  #         'install' => '--no-rdoc --no-ri --env-shebang',
  #         'update' => '--no-rdoc --no-ri --env-shebang'
  #     }
  #
  # end
  #
  def self.platform_defaults: () -> Hash[String, String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - platforms()
  # -->
  # Array of platforms this RubyGems supports.
  #
  def self.platforms: () -> Array[String | Platform]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - platforms=(platforms)
  # -->
  # Set array of platforms this RubyGems supports (primarily for testing).
  #
  def self.platforms=: (Array[String | Platform] platforms) -> Array[String | Platform]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - plugin_suffix_pattern()
  # -->
  # Glob pattern for require-able plugin suffixes.
  #
  def self.plugin_suffix_pattern: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - plugin_suffix_regexp()
  # -->
  # Regexp for require-able plugin suffixes.
  #
  def self.plugin_suffix_regexp: () -> Regexp

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - plugindir(install_dir = Gem.dir)
  # -->
  # The path were rubygems plugins are to be installed.
  #
  def self.plugindir: (?String install_dir) -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - post_build(&hook)
  # -->
  # Adds a post-build hook that will be passed an Gem::Installer instance when
  # Gem::Installer#install is called.  The hook is called after the gem has been
  # extracted and extensions have been built but before the executables or gemspec
  # has been written.  If the hook returns `false` then the gem's files will be
  # removed and the install will be aborted.
  #
  def self.post_build: () { (Installer) -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run after Gem::Installer#install extracts files and
  # builds extensions
  #
  def self.post_build_hooks: () -> Array[Proc]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - post_install(&hook)
  # -->
  # Adds a post-install hook that will be passed an Gem::Installer instance when
  # Gem::Installer#install is called
  #
  def self.post_install: () { (Installer) -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run after Gem::Installer#install completes
  # installation
  #
  def self.post_install_hooks: () -> Array[Proc]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - post_reset(&hook)
  # -->
  # Adds a hook that will get run after Gem::Specification.reset is run.
  #
  def self.post_reset: () { () -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run after Gem::Specification.reset is run.
  #
  def self.post_reset_hooks: () -> Array[Proc?]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - post_uninstall(&hook)
  # -->
  # Adds a post-uninstall hook that will be passed a Gem::Uninstaller instance and
  # the spec that was uninstalled when Gem::Uninstaller#uninstall is called
  #
  def self.post_uninstall: () { (Uninstaller) -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run after Gem::Uninstaller#uninstall completes
  # installation
  #
  def self.post_uninstall_hooks: () -> Array[Proc?]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - pre_install(&hook)
  # -->
  # Adds a pre-install hook that will be passed an Gem::Installer instance when
  # Gem::Installer#install is called.  If the hook returns `false` then the
  # install will be aborted.
  #
  def self.pre_install: () { (Installer) -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run before Gem::Installer#install does any work
  #
  def self.pre_install_hooks: () -> Array[Proc?]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - pre_reset(&hook)
  # -->
  # Adds a hook that will get run before Gem::Specification.reset is run.
  #
  def self.pre_reset: () { () -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run before Gem::Specification.reset is run.
  #
  def self.pre_reset_hooks: () -> Array[Proc?]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - pre_uninstall(&hook)
  # -->
  # Adds a pre-uninstall hook that will be passed an Gem::Uninstaller instance and
  # the spec that will be uninstalled when Gem::Uninstaller#uninstall is called
  #
  def self.pre_uninstall: () { (Uninstaller) -> untyped } -> Array[Proc]

  # <!-- rdoc-file=lib/rubygems.rb -->
  # The list of hooks to be run before Gem::Uninstaller#uninstall does any work
  #
  def self.pre_uninstall_hooks: () -> Array[Proc?]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - prefix()
  # -->
  # The directory prefix this RubyGems was installed at. If your prefix is in a
  # standard location (ie, rubygems is installed where you'd expect it to be),
  # then prefix returns nil.
  #
  def self.prefix: () -> String?

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - read_binary(path)
  # -->
  # Safely read a file in binary mode on all platforms.
  #
  def self.read_binary: (String path) -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - refresh()
  # -->
  # Refresh available gems from disk.
  #
  def self.refresh: () -> Array[Proc]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - register_default_spec(spec)
  # -->
  # Register a Gem::Specification for default gem.
  #
  # Two formats for the specification are supported:
  #
  # *   MRI 2.0 style, where spec.files contains unprefixed require names. The
  #     spec's filenames will be registered as-is.
  # *   New style, where spec.files contains files prefixed with paths from
  #     spec.require_paths. The prefixes are stripped before registering the
  #     spec's filenames. Unprefixed files are omitted.
  #
  def self.register_default_spec: (Specification spec) -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - ruby()
  # -->
  # The path to the running Ruby interpreter.
  #
  def self.ruby: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - ruby_api_version()
  # -->
  # Returns a String containing the API compatibility version of Ruby
  #
  def self.ruby_api_version: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - ruby_engine()
  # -->
  #
  def self.ruby_engine: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - ruby_version()
  # -->
  # A Gem::Version for the currently running Ruby.
  #
  def self.ruby_version: () -> Version

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - rubygems_version()
  # -->
  # A Gem::Version for the currently running RubyGems
  #
  def self.rubygems_version: () -> Version

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - source_date_epoch()
  # -->
  # Returns the value of Gem.source_date_epoch_string, as a Time object.
  #
  # This is used throughout RubyGems for enabling reproducible builds.
  #
  def self.source_date_epoch: () -> Time

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - source_date_epoch_string()
  # -->
  # If the SOURCE_DATE_EPOCH environment variable is set, returns it's value.
  # Otherwise, returns DEFAULT_SOURCE_DATE_EPOCH as a string.
  #
  # NOTE(@duckinator): The implementation is a tad weird because we want to:
  #     1. Make builds reproducible by default, by having this function always
  #        return the same result during a given run.
  #     2. Allow changing ENV['SOURCE_DATE_EPOCH'] at runtime, since multiple
  #        tests that set this variable will be run in a single process.
  #
  # If you simplify this function and a lot of tests fail, that is likely due to
  # #2 above.
  #
  # Details on SOURCE_DATE_EPOCH:
  # https://reproducible-builds.org/specs/source-date-epoch/
  #
  def self.source_date_epoch_string: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - sources()
  # -->
  # Returns an Array of sources to fetch remote gems from. Uses default_sources if
  # the sources list is empty.
  #
  def self.sources: () -> SourceList

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - sources=(new_sources)
  # -->
  # Need to be able to set the sources without calling Gem.sources.replace since
  # that would cause an infinite loop.
  #
  # DOC: This comment is not documentation about the method itself, it's more of a
  # code comment about the implementation.
  #
  def self.sources=: (SourceList? new_sources) -> SourceList?

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - spec_cache_dir()
  # -->
  #
  def self.spec_cache_dir: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - suffix_pattern()
  # -->
  # Glob pattern for require-able path suffixes.
  #
  def self.suffix_pattern: () -> String

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - suffix_regexp()
  # -->
  # Regexp for require-able path suffixes.
  #
  def self.suffix_regexp: () -> Regexp

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - suffixes()
  # -->
  # Suffixes for require-able paths.
  #
  def self.suffixes: () -> Array[String]

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - time(msg, width = 0, display = Gem.configuration.verbose) { || ... }
  # -->
  # Prints the amount of time the supplied block takes to run using the debug UI
  # output.
  #
  def self.time: [T] (String msg, ?Integer width, ?boolish display) { () -> T } -> T

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - try_activate(path)
  # -->
  # Try to activate a gem containing `path`. Returns true if activation succeeded
  # or wasn't needed because it was already activated. Returns false if it can't
  # find the path in a gem.
  #
  def self.try_activate: (String path) -> bool

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - ui()
  # -->
  # Lazily loads DefaultUserInteraction and returns the default UI.
  #
  def self.ui: () -> StreamUI

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - use_gemdeps(path = nil)
  # -->
  # Looks for a gem dependency file at `path` and activates the gems in the file
  # if found.  If the file is not found an ArgumentError is raised.
  #
  # If `path` is not given the RUBYGEMS_GEMDEPS environment variable is used, but
  # if no file is found no exception is raised.
  #
  # If '-' is given for `path` RubyGems searches up from the current working
  # directory for gem dependency files (gem.deps.rb, Gemfile, Isolate) and
  # activates the gems in the first one found.
  #
  # You can run this automatically when rubygems starts.  To enable, set the
  # `RUBYGEMS_GEMDEPS` environment variable to either the path of your gem
  # dependencies file or "-" to auto-discover in parent directories.
  #
  # NOTE: Enabling automatic discovery on multiuser systems can lead to execution
  # of arbitrary code when used from directories outside your control.
  #
  def self.use_gemdeps: (?String path) -> void

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - use_paths(home, *paths)
  # -->
  # Use the `home` and `paths` values for Gem.dir and Gem.path.  Used mainly by
  # the unit tests to provide environment isolation.
  #
  def self.use_paths: (String home, *String paths) -> Hash[String, String]

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - user_dir()
  # -->
  # Path for gems in the user's home directory
  #
  def self.user_dir: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/defaults.rb
  #   - user_home()
  # -->
  # The home directory for the user.
  #
  def self.user_home: () -> String

  # <!--
  #   rdoc-file=lib/rubygems/win_platform.rb
  #   - win_platform?()
  # -->
  # Is this a windows platform?
  #
  def self.win_platform?: () -> bool

  # <!--
  #   rdoc-file=lib/rubygems.rb
  #   - write_binary(path, data)
  # -->
  # Safely write a file in binary mode on all platforms.
  #
  def self.write_binary: (String path, String data) -> Integer
end
