Module: Language::Python::Virtualenv

Extended by:
T::Sig
Defined in:
language/python.rb

Overview

Mixin module for Formula adding virtualenv support features.

Defined Under Namespace

Classes: Virtualenv

Instance Method Summary collapse

Instance Method Details

#needs_python?(python) ⇒ Boolean

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.

Returns true if a formula option for the specified python is currently active or if the specified python is required by the formula. Valid inputs are “python”, “python2”, and :python3. Note that “with-python”, “without-python”, “with-python@2”, and “without-python@2” formula options are handled correctly even if not associated with any corresponding depends_on statement.

Returns:

  • (Boolean)


164
165
166
167
168
# File 'language/python.rb', line 164

def needs_python?(python)
  return true if build.with?(python)

  (requirements.to_a | deps).any? { |r| r.name.split("/").last == python && r.required? }
end

#python_namesArray<String>

Returns:



194
195
196
# File 'language/python.rb', line 194

def python_names
  %w[python python3 pypy pypy3] + Formula.names.select { |name| name.start_with? "python@" }
end

#virtualenv_create(venv_root, python = "python", formula = self, system_site_packages: true) ⇒ Virtualenv

Instantiates, creates, and yields a Virtualenv object for use from Formula#install, which provides helper methods for instantiating and installing packages into a Python virtualenv.

Parameters:

  • venv_root (Pathname, String)

    the path to the root of the virtualenv (often libexec/"venv")

  • python (String) (defaults to: "python")

    which interpreter to use (e.g. “python3” or “python3.x”)

  • formula (Formula) (defaults to: self)

    the active Formula

Returns:



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'language/python.rb', line 131

def virtualenv_create(venv_root, python = "python", formula = self, system_site_packages: true)
  ENV.refurbish_args
  venv = Virtualenv.new formula, venv_root, python
  venv.create(system_site_packages: system_site_packages)

  # Find any Python bindings provided by recursive dependencies
  formula_deps = formula.recursive_dependencies
  pth_contents = formula_deps.map do |d|
    next if d.build? || d.test?
    # Do not add the main site-package provided by the brewed
    # Python formula, to keep the virtual-env's site-package pristine
    next if python_names.include? d.name

    dep_site_packages = Formula[d.name].opt_prefix/Language::Python.site_packages(python)
    next unless dep_site_packages.exist?

    "import site; site.addsitedir('#{dep_site_packages}')\n"
  end.compact
  unless pth_contents.empty?
    (venv_root/Language::Python.site_packages(python)/"homebrew_deps.pth").write pth_contents.join
  end

  venv
end

#virtualenv_install_with_resources(using: nil, system_site_packages: true) ⇒ Object

Helper method for the common case of installing a Python application. Creates a virtualenv in libexec, installs all resources defined on the formula, and then installs the formula. An options hash may be passed (e.g. :using => "python") to override the default, guessed formula preference for python or python@x.y, or to resolve an ambiguous case where it’s not clear whether python or python@x.y should be the default guess.



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'language/python.rb', line 177

def virtualenv_install_with_resources(using: nil, system_site_packages: true)
  python = using
  if python.nil?
    wanted = python_names.select { |py| needs_python?(py) }
    raise FormulaUnknownPythonError, self if wanted.empty?
    raise FormulaAmbiguousPythonError, self if wanted.size > 1

    python = wanted.first
    python = "python3" if python == "python"
  end
  venv = virtualenv_create(libexec, python.delete("@"), system_site_packages: system_site_packages)
  venv.pip_install resources
  venv.pip_install_and_link buildpath
  venv
end