Class: Language::Python::Virtualenv::Virtualenv Private
- Defined in:
- language/python.rb
Overview
This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.
Convenience wrapper for creating and installing packages into Python virtualenvs.
Instance Method Summary collapse
-
#create(system_site_packages: true, without_pip: true) ⇒ void
private
Obtains a copy of the virtualenv library and creates a new virtualenv on disk.
-
#initialize(formula, venv_root, python) ⇒ void
constructor
private
Initializes a Virtualenv instance.
-
#pip_install(targets, build_isolation: true) ⇒ void
private
Installs packages represented by
targets
into the virtualenv. -
#pip_install_and_link(targets, link_manpages: true, build_isolation: true) ⇒ void
private
Installs packages represented by
targets
into the virtualenv, but unlike #pip_install also links new scripts to Formula#bin. - #root ⇒ Pathname private
- #site_packages ⇒ Pathname private
Constructor Details
#initialize(formula, venv_root, python) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
Initializes a Virtualenv instance. This does not create the virtualenv on disk; #create does that.
306 307 308 309 310 |
# File 'language/python.rb', line 306 def initialize(formula, venv_root, python) @formula = formula @venv_root = T.let(Pathname(venv_root), Pathname) @python = python end |
Instance Method Details
#create(system_site_packages: true, without_pip: true) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
Obtains a copy of the virtualenv library and creates a new virtualenv on disk.
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 |
# File 'language/python.rb', line 326 def create(system_site_packages: true, without_pip: true) return if (@venv_root/"bin/python").exist? args = ["-m", "venv"] args << "--system-site-packages" if system_site_packages args << "--without-pip" if without_pip @formula.system @python, *args, @venv_root # Robustify symlinks to survive python patch upgrades @venv_root.find do |f| next unless f.symlink? next unless f.readlink..to_s.start_with? HOMEBREW_CELLAR rp = f.realpath.to_s version = rp.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o version = "@#{version.captures.first}" unless version.nil? new_target = rp.sub %r{#{HOMEBREW_CELLAR}/python#{version}/[^/]+}, Formula["python#{version}"].opt_prefix f.unlink f.make_symlink new_target end Pathname.glob(@venv_root/"lib/python*/orig-prefix.txt").each do |prefix_file| prefix_path = prefix_file.read version = prefix_path.match %r{^#{HOMEBREW_CELLAR}/python@(.*?)/}o version = "@#{version.captures.first}" unless version.nil? prefix_path.sub! %r{^#{HOMEBREW_CELLAR}/python#{version}/[^/]+}, Formula["python#{version}"].opt_prefix prefix_file.atomic_write prefix_path end # Reduce some differences between macOS and Linux venv lib64 = @venv_root/"lib64" lib64.make_symlink "lib" unless lib64.exist? if (cfg_file = @venv_root/"pyvenv.cfg").exist? cfg = cfg_file.read framework = "Frameworks/Python.framework/Versions" cfg.match(%r{= *(#{HOMEBREW_CELLAR}/(python@[\d.]+)/[^/]+(?:/#{framework}/[\d.]+)?/bin)}) do |match| cfg.sub! match[1].to_s, Formula[match[2]].opt_bin cfg_file.atomic_write cfg end end # Remove unnecessary activate scripts (@venv_root/"bin").glob("[Aa]ctivate*").map(&:unlink) end |
#pip_install(targets, build_isolation: true) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
Installs packages represented by targets
into the virtualenv.
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 |
# File 'language/python.rb', line 390 def pip_install(targets, build_isolation: true) targets = Array(targets) targets.each do |t| if t.is_a?(Resource) t.stage do target = Pathname.pwd target /= t.downloader.basename if t.url&.end_with?("-none-any.whl") do_install(target, build_isolation:) end else t = t.lines.map(&:strip) if t.is_a?(String) && t.include?("\n") do_install(t, build_isolation:) end end end |
#pip_install_and_link(targets, link_manpages: true, build_isolation: true) ⇒ void
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
This method returns an undefined value.
Installs packages represented by targets
into the virtualenv, but
unlike #pip_install also links new scripts to Formula#bin.
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 |
# File 'language/python.rb', line 418 def pip_install_and_link(targets, link_manpages: true, build_isolation: true) bin_before = Dir[@venv_root/"bin/*"].to_set man_before = Dir[@venv_root/"share/man/man*/*"].to_set if link_manpages pip_install(targets, build_isolation:) bin_after = Dir[@venv_root/"bin/*"].to_set bin_to_link = (bin_after - bin_before).to_a @formula.bin.install_symlink(bin_to_link) return unless link_manpages man_after = Dir[@venv_root/"share/man/man*/*"].to_set man_to_link = (man_after - man_before).to_a man_to_link.each do |manpage| (@formula.man/Pathname.new(manpage).dirname.basename).install_symlink manpage end end |
#root ⇒ Pathname
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
313 314 315 |
# File 'language/python.rb', line 313 def root @venv_root end |
#site_packages ⇒ Pathname
This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.
318 319 320 |
# File 'language/python.rb', line 318 def site_packages @venv_root/Language::Python.site_packages(@python) end |