diff options
| author | ilovezfs | 2016-08-05 00:20:20 -0700 | 
|---|---|---|
| committer | ilovezfs | 2016-10-02 18:08:56 -0700 | 
| commit | 23a38e0ff6beb26f86eca0c56b25d6100375b60d (patch) | |
| tree | a4474aa269ff6ed45420bb1daf087deea9ed4c21 /Library/Homebrew | |
| parent | 7d31a70373edae4d8e78d91a4cbc05324bebc3ba (diff) | |
| download | brew-23a38e0ff6beb26f86eca0c56b25d6100375b60d.tar.bz2 | |
virtualenv_install_with_resources: select correct python
`virtualenv_install_with_resources` will now attempt to guess the
desired Python based on the active build options and based on the
dependencies and requirements. When the situation is ambiguous (e.g.,
`depends_on :python3` and `build.with? "python"` is true) raise
`FormulaAmbiguousPythonError` unless `:using => "python"` or
`:using => "python3"` has been passed to resolve the ambiguity.
In most cases, this will allow
```
    virtualenv_create(libexec, "python3")
    virtualenv_install_with_resources
```
to be changed to just
```
    virtualenv_install_with_resources
```
Diffstat (limited to 'Library/Homebrew')
| -rw-r--r-- | Library/Homebrew/exceptions.rb | 11 | ||||
| -rw-r--r-- | Library/Homebrew/language/python.rb | 28 | 
2 files changed, 36 insertions, 3 deletions
| diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index e01a60c75..1b2b24691 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -294,6 +294,17 @@ class FormulaConflictError < RuntimeError    end  end +class FormulaAmbiguousPythonError < RuntimeError +  def initialize(formula) +    super <<-EOS.undent +      The version of python to use with the virtualenv in the `#{formula.full_name}` formula +      cannot be guessed automatically. If the simultaneous use of python and python3 +      is intentional, please add `:using => "python"` or `:using => "python3"` to +      `virtualenv_install_with_resources` to resolve the ambiguity manually. +    EOS +  end +end +  class BuildError < RuntimeError    attr_reader :formula, :env diff --git a/Library/Homebrew/language/python.rb b/Library/Homebrew/language/python.rb index 95259c841..b28b1ca60 100644 --- a/Library/Homebrew/language/python.rb +++ b/Library/Homebrew/language/python.rb @@ -139,11 +139,33 @@ module Language          venv        end +      # 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", "python3", :python, and :python3. Note that +      # "with-python", "without-python", "with-python3", and "without-python3" +      # formula options are handled correctly even if not associated with any +      # corresponding depends_on statement. +      # @api private +      def needs_python?(python) +        return true if build.with?(python) +        (requirements.to_a | deps).any? { |r| r.name == python && r.required? } +      end +        # Helper method for the common case of installing a Python application.        # Creates a virtualenv in `libexec`, installs all `resource`s defined -      # on the formula, and then installs the formula. -      def virtualenv_install_with_resources -        venv = virtualenv_create(libexec) +      # on the formula, and then installs the formula. An options hash may be +      # passed (e.g., :using => "python3") to override the default, guessed +      # formula preference for python or python3, or to resolve an ambiguous +      # case where it's not clear whether python or python3 should be the +      # default guess. +      def virtualenv_install_with_resources(options = {}) +        python = options[:using] +        if python.nil? +          wanted = %w[python python3].select { |py| needs_python?(py) } +          raise FormulaAmbiguousPythonError, self if wanted.size > 1 +          python = wanted.first || "python" +        end +        venv = virtualenv_create(libexec, python)          venv.pip_install resources          venv.pip_install_and_link buildpath          venv | 
