1 Commits

Author SHA1 Message Date
Yamashita Yuu
56c232610a Check the usage of virtualenv(s) before the uninstallation of versions 2014-04-29 00:51:57 +09:00
19 changed files with 365 additions and 1297 deletions

176
README.md
View File

@@ -3,194 +3,134 @@
[![Build Status](https://travis-ci.org/yyuu/pyenv-virtualenv.png)](https://travis-ci.org/yyuu/pyenv-virtualenv) [![Build Status](https://travis-ci.org/yyuu/pyenv-virtualenv.png)](https://travis-ci.org/yyuu/pyenv-virtualenv)
pyenv-virtualenv is a [pyenv](https://github.com/yyuu/pyenv) plugin pyenv-virtualenv is a [pyenv](https://github.com/yyuu/pyenv) plugin
that provides a `pyenv virtualenv` command to create virtualenvs for Python that provides a `pyenv virtualenv` command to create virtualenv for Python
on UNIX-like systems. on UNIX-like systems.
(NOTICE: If you are an existing user of [virtualenvwrapper](http://pypi.python.org/pypi/virtualenvwrapper) (NOTICE: If you are an existing user of [virtualenvwrapper](http://pypi.python.org/pypi/virtualenvwrapper)
and you love it, [pyenv-virtualenvwrapper](https://github.com/yyuu/pyenv-virtualenvwrapper) may help you and you love it, [pyenv-virtualenvwrapper](https://github.com/yyuu/pyenv-virtualenvwrapper) may help you
(additionally) to manage your virtualenvs.) to manage your virtualenvs.)
## Installation ## Installation
### Installing as a pyenv plugin ### Installing as a pyenv plugin
Installing pyenv-virtualenv as a pyenv plugin will give you access to the
`pyenv virtualenv` command.
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
$ exec "$SHELL"
This will install the latest development version of pyenv-virtualenv into This will install the latest development version of pyenv-virtualenv into
the `~/.pyenv/plugins/pyenv-virtualenv` directory. the `~/.pyenv/plugins/pyenv-virtualenv` directory.
**Important note:** If you installed pyenv into a non-standard directory, make sure that you clone this
**Important note:** If you installed pyenv into a non-standard directory, make repo into the 'plugins' directory of wherever you installed into.
sure that you clone this repo into the 'plugins' directory of wherever you
installed into.
From inside that directory you can: From inside that directory you can:
- Check out a specific release tag. - Check out a specific release tag.
- Get the latest development release by running `git pull` to download the - Get the latest development release by running `git pull` to download the latest changes.
latest changes.
1. **Check out pyenv-virtualenv into plugin directory**
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
2. **Add `pyenv virtualenv-init` to your shell** to enable activation of virtualenv. This is entirely optional but pretty useful.
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
**Zsh note**: Modify your `~/.zshenv` file instead of `~/.bash_profile`.
**Pyenv note**: You may also need to add 'eval "$(pyenv init -)"' to your profile if you haven't done so already.
3. **Restart your shell to enable pyenv-virtualenv**
$ exec "$SHELL"
### Installing with Homebrew (for OS X users) ### Installing with Homebrew (for OS X users)
Mac OS X users can install pyenv-virtualenv with the Mac OS X users can install pyenv-virtualenv with the
[Homebrew](http://brew.sh) package manager. [Homebrew](http://brew.sh) package manager. This
This will give you access to the `pyenv-virtualenv` command. If you have pyenv will give you access to the `pyenv-virtualenv` command. If you have pyenv
installed, you will also be able to use the `pyenv virtualenv` command. installed, you will also be able to use the `pyenv virtualenv` command.
*This is the recommended method of installation if you installed pyenv *This is recommended method of installation if you installed pyenv
with Homebrew.* with Homebrew.*
``` brew install pyenv-virtualenv
$ brew install pyenv-virtualenv
```
Or, if you would like to install the latest development release: Or, if you would like to install the latest development release:
``` brew install --HEAD pyenv-virtualenv
$ brew install --HEAD pyenv-virtualenv
```
After installation, you'll still need to add `eval "$(pyenv virtualenv-init
-)"` to your profile (as stated in the caveats). You'll only ever have to do
this once.
## Usage ## Usage
### Using `pyenv virtualenv` with pyenv ### Using `pyenv virtualenv` with pyenv
To create a virtualenv for the Python version used with pyenv, run To create a virtualenv for the Python version use with pyenv, run
`pyenv virtualenv`, specifying the Python version you want and the name `pyenv virtualenv`, specifying the Python version you want and the name
of the virtualenv directory. For example, of the virtualenv directory. For example,
``` $ pyenv virtualenv 2.7.6 my-virtual-env-2.7.6
$ pyenv virtualenv 2.7.7 my-virtual-env-2.7.7
```
will create a virtualenv based on Python 2.7.7 under `~/.pyenv/versions` in a will create a virtualenv based on Python 2.7.6
folder called `my-virtual-env-2.7.7`. under `~/.pyenv/versions` in a folder called `my-virtual-env-2.7.6`.
### Create virtualenv from current version ### Create virtualenv from current version
If there is only one argument given to `pyenv virtualenv`, the virtualenv will If there is only one argument is given to `pyenv virtualenv`,
be created with the given name based on the current pyenv Python version. virtualenv will be created with given name based on current
version.
``` $ pyenv version
$ pyenv version 3.3.3 (set by /home/yyuu/.pyenv/version)
3.4.2 (set by /home/yyuu/.pyenv/version) $ pyenv virtualenv venv33
$ pyenv virtualenv venv34
```
### List existing virtualenvs ### List existing virtualenvs
`pyenv virtualenvs` shows you the list of existing virtualenvs: `pyenv virtualenvs` shows you the list of existing virtualenvs.
``` $ pyenv shell venv27
$ pyenv shell venv27 $ pyenv virtualenvs
$ pyenv virtualenvs * venv27 (created from /home/yyuu/.pyenv/versions/2.7.6)
* venv27 (created from /home/yyuu/.pyenv/versions/2.7.7) venv33 (created from /home/yyuu/.pyenv/versions/3.3.3)
venv34 (created from /home/yyuu/.pyenv/versions/3.4.1)
```
### Activate virtualenv ### Activate virtualenv
Some external tools (e.g. [jedi](https://github.com/davidhalter/jedi)) might Some external tools (e.g. [jedi](https://github.com/davidhalter/jedi)) might require you to `activate` the virtualenv.
require you to `activate` the virtualenv. `pyenv activate` lets you to activate the virtualenv into your shell.
`pyenv-virtualenv` will automatically activate/deactivate the virtualenv if $ pyenv activate venv27
the `eval "$(pyenv virtualenv-init -)"` is properly configured in your shell.
You can also activate and deactivate a pyenv virtualenv manually: `pyenv activate` acts almost like following commands.
The activate'd virtualenv will be persisted as _shell_ version.
pyenv activate <name> $ pyenv shell venv27
pyenv deactivate $ source "$(pyenv prefix venv27)/bin/activate"
### Deactivate virtualenv
### Delete existing virtualenv You can `deactivate` the activate'd virtualenv by `pyenv deactivate`.
Removing the directory in `~/.pyenv/versions` will delete the virtualenv, or you can run: $ pyenv deactivate
pyenv uninstall my-virtual-env Or, there is an alias in `activate` command.
This is prepared for similality between other `pyenv` commands like `shell` and `local`.
$ pyenv activate --unset
### virtualenv and pyvenv `pyenv deactivate` acts almost like following commands.
You can also use virtualenv's `deactivate` in place of `pyenv deactivate`,
There is a [venv](http://docs.python.jp/3/library/venv.html) module available but be careful with the _shell_ version because it will be persisted even if `deactivate` has invoked.
for CPython 3.3 and newer.
It provides a command-line tool `pyvenv` which is the successor of `virtualenv`
and distributed by default.
`pyenv-virtualenv` uses `pyvenv` if it is available and the `virtualenv`
command is not available.
$ deactivate
$ pyenv shell --unset
### Special environment variables ### Special environment variables
You can set certain environment variables to control pyenv-virtualenv. You can set certain environment variables to control the pyenv-virtualenv.
* `PYENV_VIRTUALENV_CACHE_PATH`, if set, specifies a directory to use for * `PYENV_VIRTUALENV_CACHE_PATH`, if set, specifies a directory to use for
caching downloaded package files. caching downloaded package files.
* `VIRTUALENV_VERSION`, if set, forces pyenv-virtualenv to install the desired * `VIRTUALENV_VERSION`, if set, forces pyenv-virtualenv to install desired
version of virtualenv. If `virtualenv` has not been installed, version of virtualenv. If the virtualenv has not been installed,
pyenv-virtualenv will try to install the given version of virtualenv. pyenv-virtualenv will try to install the given version of virtualenv.
* `EZ_SETUP` and `GET_PIP`, if set and `pyvenv` is preferred over `virtualenv`, * `EZ_SETUP` and `GET_PIP`, if set and pyvenv is preferred than virtualenv,
use `ez_setup.py` and `get_pip.py` from the specified location. use `ez_setup.py` and `get_pip.py` at specified location.
* `EZ_SETUP_URL` and `GET_PIP_URL`, if set and `pyvenv` is preferred over * `EZ_SETUP_URL` and `GET_PIP_URL`, if set and pyvenv is preferred
`virtualenv`, download `ez_setup.py` and `get_pip.py` from the specified URL. than virtualenv, download `ez_setup.py` and `get_pip.py` from specified URL.
* `SETUPTOOLS_VERSION` and `PIP_VERSION`, if set and `pyvenv` is preferred * `SETUPTOOLS_VERSION` and `PIP_VERSION`, if set and pyvenv is preferred
over `virtualenv`, install the specified version of setuptools and pip. than virtualenv, install specified version of setuptools and pip.
## Version History ## Version History
#### 20141106
* Stop creating after `ensurepip` since it has done by `ensurepip` itself
* Suppress some useless warnings from `pyenv virtualenv-init`
#### 20141012
* Fix warnings from `shellcheck` to improve support for POSIX sh (#40)
* Do not allow whitespace in `VIRTUALENV_NAME` (#44)
* Should not persist `PYENV_DEACTIVATE` after automatic deactivation (#47, #48)
#### 20140705
* Display information on auto-(de)?activation
* Support manual (de)?activation with auto-activation enabled (#32, #34)
* Exit as error when (de)?activation failed
* Use https://bootstrap.pypa.io/ to install setuptools and pip
* Create backup of original virtualenv within `$(pyenv root)/versions` when `--upgrade`
#### 20140615
* Fix incompatibility issue of `pyenv activate` and `pyenv deactivate` (#26)
* Workaround for the issue with pyenv-which-ext (#26)
#### 20140614
* Add `pyenv virtualenv-init` to enable auto-activation feature (#24)
* Create symlinks for executables with version suffix (yyuu/pyenv#182)
#### 20140602
* Use new style GH raw url to avoid redirects (raw.github.com -> raw.githubusercontent.com)
* Repaired virtualenv activation and deactivation for the fish shell (#23)
#### 20140421 #### 20140421
* Display error if `pyenv activate` was invoked as a command * Display error if `pyenv activate` was invoked as a command

View File

@@ -14,116 +14,35 @@
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
unset NOERROR # Provide pyenv completions
unset VERBOSE if [ "$1" = "--complete" ]; then
echo --unset
exec pyenv-virtualenvs --bare
fi
while [ $# -gt 0 ]; do if [ "$1" = "--unset" ]; then
case "$1" in echo "pyenv deactivate"
"--complete" ) exit
# Provide pyenv completions fi
echo --unset
exec pyenv-virtualenvs --bare
;;
"--no-error" )
NOERROR=1
;;
"--unset" )
echo "pyenv deactivate"
exit
;;
"--verbose" )
VERBOSE=1
;;
* )
break
;;
esac
shift 1
done
no_shell=
versions=("$@") versions=("$@")
if [ -z "${versions}" ]; then shell="$(basename "${PYENV_SHELL:-$SHELL}")"
no_shell=1
if [ -z "$versions" ]; then
OLDIFS="$IFS" OLDIFS="$IFS"
IFS=: versions=($(pyenv-version-name)) IFS=: versions=($(pyenv-version-name))
IFS="$OLDIFS" IFS="$OLDIFS"
fi fi
if [ -z "${PYENV_VIRTUALENV_INIT}" ]; then
# Backward compatibility issue
# https://github.com/yyuu/pyenv-virtualenv/issues/26
no_shell=
fi
if [ "${#versions[@]}" -gt 1 ]; then if [ "${#versions[@]}" -gt 1 ]; then
[ -n "$NOERROR" ] || echo "pyenv-virtualenv: cannot activate multiple versions at once: ${versions[@]}" 1>&2 echo "pyenv-virtualenv: cannot activate multiple versions at once: ${versions[@]}" 1>&2
echo "false"
exit 1 exit 1
fi fi
if ! pyenv-virtualenv-prefix "${versions}" 1>/dev/null 2>&1; then pyenv-virtualenv-prefix "${versions}" 1>/dev/null
[ -n "$NOERROR" ] || echo "pyenv-virtualenv: version \`${versions}' is not a virtualenv" 1>&2
echo "false"
exit 1
fi
shell="$(basename "${PYENV_SHELL:-$SHELL}")" echo "pyenv shell \"${versions}\""
case "$shell" in case "$shell" in
bash ) fish ) echo ". \"$(pyenv-prefix "${versions}")/bin/activate.fish\"" ;;
profile="$HOME/.bash_profile" * ) echo "source \"$(pyenv-prefix "${versions}")/bin/activate\"" ;;
;;
zsh )
profile="$HOME/.zshrc"
;;
ksh )
profile="$HOME/.profile"
;;
fish )
profile="$HOME/.config/fish/config.fish"
;;
* )
profile="$HOME/.profile"
;;
esac
# Display setup instruction if 'pyenv virtualenv-init -' is not found in "$profile"
if [ -f "$profile" ] && grep -q 'pyenv init -' "$profile" && ! grep -q 'pyenv virtualenv-init -' "$profile"; then
pyenv-virtualenv-init >&2 || true
fi
if [ -n "$VERBOSE" ]; then
echo "pyenv-virtualenv: activate ${versions}" 1>&2
fi
if [ -z "$no_shell" ]; then
echo "pyenv shell \"${versions}\";"
# shell version set in pyenv-sh-activate should be unset
# https://github.com/yyuu/pyenv-virtualenv/issues/61
case "$shell" in
fish )
echo "setenv PYENV_ACTIVATE_SHELL 1;"
;;
* )
echo "export PYENV_ACTIVATE_SHELL=1;"
;;
esac
fi
prefix="$(pyenv-prefix "${versions}")"
case "$shell" in
fish )
cat <<EOS
set -e PYENV_DEACTIVATE;
setenv PYENV_ACTIVATE "${prefix}";
. "${prefix}/bin/activate.fish";
EOS
;;
* )
cat <<EOS
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${prefix}";
. "${prefix}/bin/activate";
EOS
;;
esac esac

View File

@@ -9,84 +9,9 @@
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
unset NOERROR
unset VERBOSE
while [ $# -gt 0 ]; do
case "$1" in
"--no-error" )
NOERROR=1
;;
"--verbose" )
VERBOSE=1
;;
* )
break
;;
esac
shift 1
done
shell="$(basename "${PYENV_SHELL:-$SHELL}")" shell="$(basename "${PYENV_SHELL:-$SHELL}")"
case "$shell" in case "$shell" in
fish ) fish ) echo "functions -q deactivate; and deactivate";;
echo "if functions -q deactivate;" * ) echo "declare -f deactivate 1>/dev/null 2>&1 && deactivate";;
;;
* )
echo "if declare -f deactivate 1>/dev/null 2>&1; then"
;;
esac
prefix="${PYENV_ACTIVATE:-${VIRTUAL_ENV}}"
if [ -n "$VERBOSE" ]; then
echo " echo \"pyenv-virtualenv: deactivate ${prefix##*/}\" 1>&2;"
fi
if [ -n "${PYENV_ACTIVATE_SHELL}" ]; then
# shell version set in pyenv-sh-activate should be unset
# https://github.com/yyuu/pyenv-virtualenv/issues/61
echo " pyenv shell --unset;"
case "$shell" in
fish )
echo " set -e PYENV_ACTIVATE_SHELL;"
;;
* )
echo " unset PYENV_ACTIVATE_SHELL;"
;;
esac
fi
case "$shell" in
fish )
cat <<EOS
setenv PYENV_DEACTIVATE "$prefix";
set -e PYENV_ACTIVATE;
deactivate;
else;
EOS
;;
* )
cat <<EOS
export PYENV_DEACTIVATE="$prefix";
unset PYENV_ACTIVATE;
deactivate;
else
EOS
;;
esac
if [ -z "$NOERROR" ]; then
echo " echo \"pyenv-virtualenv: no virtualenv has been activated.\" 1>&2;"
fi
echo " false;"
case "$shell" in
fish )
echo "end;"
;;
* )
echo "fi;"
;;
esac esac
echo "pyenv shell --unset"

View File

@@ -2,14 +2,16 @@
# #
# Summary: Create a Python virtualenv using the pyenv-virtualenv plugin # Summary: Create a Python virtualenv using the pyenv-virtualenv plugin
# #
# Usage: pyenv virtualenv [-f|--force] [VIRTUALENV_OPTIONS] <version> <virtualenv-name> # Usage: pyenv virtualenv [-f|--force] [-u|--upgrade] [VIRTUALENV_OPTIONS] <version> <virtualenv-name>
# pyenv virtualenv --version # pyenv virtualenv --version
# pyenv virtualenv --help # pyenv virtualenv --help
# #
# -u/--upgrade Upgrade existing virtualenv to use new version of Python,
# assuming Python has been upgraded in-place.
# -f/--force Install even if the version appears to be installed already # -f/--force Install even if the version appears to be installed already
# #
PYENV_VIRTUALENV_VERSION="20141106" PYENV_VIRTUALENV_VERSION="20140421"
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
@@ -122,12 +124,10 @@ usage() {
} }
detect_venv() { detect_venv() {
# Check the existence of executables as a workaround for the issue with pyenv-which-ext if pyenv-which "virtualenv" 1>/dev/null 2>&1; then
# https://github.com/yyuu/pyenv-virtualenv/issues/26
if [ -x "$(pyenv-prefix)/bin/virtualenv" ]; then
HAS_VIRTUALENV=1 HAS_VIRTUALENV=1
fi fi
if [ -x "$(pyenv-prefix)/bin/pyvenv" ]; then if pyenv-which "pyvenv" 1>/dev/null 2>&1; then
HAS_PYVENV=1 HAS_PYVENV=1
fi fi
# Use pyvenv only if there is pyvenv, virtualenv is not installed, and `-p` not given # Use pyvenv only if there is pyvenv, virtualenv is not installed, and `-p` not given
@@ -140,74 +140,110 @@ venv() {
local args=("$@") local args=("$@")
if [ -n "${USE_PYVENV}" ]; then if [ -n "${USE_PYVENV}" ]; then
pyenv-exec pyvenv "${args[@]}" pyenv-exec pyvenv "${args[@]}"
local last="${args[${#args[@]}-1]}"
ensurepip "${last##*/}"
else else
pyenv-exec virtualenv "${args[@]}" pyenv-exec virtualenv "${args[@]}"
fi fi
} }
build_package_ez_setup() { install_setuptools() {
local ez_setup="${PYENV_VIRTUALENV_CACHE_PATH}/ez_setup.py" local version="$1"
rm -f "${ez_setup}"
{ if [ "${EZ_SETUP+defined}" ] && [ -f "${EZ_SETUP}" ]; then { if [ "${EZ_SETUP+defined}" ] && [ -f "${EZ_SETUP}" ]; then
echo "Installing setuptools from ${EZ_SETUP}..." 1>&2 if [ -n "$VERBOSE" ]; then
echo "Installing setuptools from ${EZ_SETUP}..." 1>&2
fi
cat "${EZ_SETUP}" cat "${EZ_SETUP}"
else else
[ -n "${EZ_SETUP_URL}" ] || EZ_SETUP_URL="https://bootstrap.pypa.io/ez_setup.py" [ -n "${EZ_SETUP_URL}" ] || {
echo "Installing setuptools from ${EZ_SETUP_URL}..." 1>&2 if [ -n "${SETUPTOOLS_VERSION}" ]; then
EZ_SETUP_URL="https://bitbucket.org/pypa/setuptools/raw/${SETUPTOOLS_VERSION}/ez_setup.py"
else
EZ_SETUP_URL="https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py"
fi
}
if [ -n "$VERBOSE" ]; then
echo "Installing setuptools from ${EZ_SETUP_URL}..." 1>&2
fi
http get "${EZ_SETUP_URL}" http get "${EZ_SETUP_URL}"
fi fi
} 1> "${ez_setup}" } | PYENV_VERSION="${version}" pyenv-exec python
pyenv-exec python "${ez_setup}" ${EZ_SETUP_OPTS} 1>&2 || {
echo "error: failed to install setuptools via ez_setup.py" >&2
return 1
}
} }
build_package_get_pip() { install_pip() {
local get_pip="${PYENV_VIRTUALENV_CACHE_PATH}/get-pip.py" local version="$1"
rm -f "${get_pip}"
{ if [ "${GET_PIP+defined}" ] && [ -f "${GET_PIP}" ]; then { if [ "${GET_PIP+defined}" ] && [ -f "${GET_PIP}" ]; then
echo "Installing pip from ${GET_PIP}..." 1>&2 if [ -n "$VERBOSE" ]; then
echo "Installing pip from ${GET_PIP}..." 1>&2
fi
cat "${GET_PIP}" cat "${GET_PIP}"
else else
[ -n "${GET_PIP_URL}" ] || GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" [ -n "${GET_PIP_URL}" ] || {
echo "Installing pip from ${GET_PIP_URL}..." 1>&2 if [ -n "${PIP_VERSION}" ]; then
GET_PIP_URL="https://raw.github.com/pypa/pip/${PIP_VERSION}/contrib/get-pip.py"
else
GET_PIP_URL="https://raw.github.com/pypa/pip/master/contrib/get-pip.py"
fi
}
if [ -n "$VERBOSE" ]; then
echo "Installing pip from ${GET_PIP_URL}..." 1>&2
fi
http get "${GET_PIP_URL}" http get "${GET_PIP_URL}"
fi fi
} 1> "${get_pip}" } | PYENV_VERSION="${version}" pyenv-exec python
pyenv-exec python "${get_pip}" ${GET_PIP_OPTS} 1>&2 || {
echo "error: failed to install pip via get-pip.py" >&2
return 1
}
} }
build_package_ensurepip() { install_virtualenv() {
pyenv-exec python -m ensurepip 2>/dev/null|| { local version="$1"
build_package_ez_setup "$@" && build_package_get_pip "$@" VIRTUALENV_VERSION="==${VIRTUALENV_VERSION}"
} || return 1 PYENV_VERSION="${version}" pyenv-exec pip install $QUIET $VERBOSE "virtualenv${VIRTUALENV_VERSION%==}"
} }
prepare_requirements() { ensurepip() {
pyenv-exec pip freeze > "${REQUIREMENTS}" local version="$1"
mv -f "${VIRTUALENV_PATH}" "${VIRTUALENV_ORIG}" if PYENV_VERSION="${version}" pyenv-exec python -m ensurepip 2>/dev/null; then
local PREFIX_PATH="$(pyenv-prefix "${version}")"
if [ ! -e "${PREFIX_PATH}/bin/pip" ]; then
local pip="$(PYENV_VERSION="${version}" pyenv-exec python -c 'import sys;v=sys.version_info;sys.stdout.write("pip%d.%d"%(v[0],v[1]))')"
if [ -e "${PREFIX_PATH}/bin/${pip}" ]; then
( cd "${PREFIX_PATH}/bin" && ln -fs "${pip}" "pip" )
fi
fi
else
PYENV_VERSION="${version}" pyenv-exec python -c "import setuptools" 1>/dev/null 2>&1 || {
install_setuptools "${version}"
} 1>&2
PYENV_VERSION="${version}" pyenv-which pip 1>/dev/null 2>&1 || {
install_pip "${version}"
} 1>&2
fi
} }
install_requirements() { prepare_upgrade() {
if [ -f "${REQUIREMENTS}" ]; then local version="$1"
## Migrate previously installed packages from requirements.txt local prefix="$2"
pyenv-exec pip install $QUIET $VERBOSE --requirement "${REQUIREMENTS}" || { PYENV_VERSION="${version}" pyenv-exec pip freeze >"${UPGRADE_LIST}"
mv -f "${prefix}" "${UPGRADE_PATH}"
}
upgrade() {
local version="$1"
local prefix="$2"
## Migrate previously installed packages from requirements.txt
if ! PYENV_VERSION="${version}" pyenv-exec pip install $QUIET $VERBOSE --requirement "${UPGRADE_LIST}"; then
{ echo
echo "UPGRADE FAILED"
echo echo
echo "PIP INSTALL FAILED" echo "Inspect or clean up the original tree at ${UPGRADE_PATH}"
echo
echo "Inspect or clean up the original tree at ${VIRTUALENV_ORIG}"
echo echo
echo "Package list:" echo "Package list:"
cat "${REQUIREMENTS}" | sed 's/^/ * /' cat "${UPGRADE_LIST}"
return 1
} 1>&2 } 1>&2
rm -f "${REQUIREMENTS}" return 1
rm -fr "${VIRTUALENV_ORIG}"
fi fi
rm -f "${UPGRADE_LIST}"
rm -fr "${UPGRADE_PATH}"
} }
PYENV_VIRTUALENV_ROOT="$(abs_dirname "$0")/.." PYENV_VIRTUALENV_ROOT="$(abs_dirname "$0")/.."
@@ -275,11 +311,6 @@ if [ -z "${VERSION_NAME}" ] || [ -z "${VIRTUALENV_NAME}" ]; then
usage 1 usage 1
fi fi
if [ "$VIRTUALENV_NAME" != "${VIRTUALENV_NAME%[[:space:]]*}" ]; then
echo "pyenv-virtualenv: no whitespace allowed in virtualenv name." 1>&2
exit 1
fi
# Set VERSION_NAME as default version in this script # Set VERSION_NAME as default version in this script
export PYENV_VERSION="${VERSION_NAME}" export PYENV_VERSION="${VERSION_NAME}"
@@ -292,6 +323,10 @@ else
TMP="${TMPDIR%/}" TMP="${TMPDIR%/}"
fi fi
SEED="$(date "+%Y%m%d%H%M%S").$$"
UPGRADE_PATH="${TMP}/pyenv-virtualenv.${SEED}"
UPGRADE_LIST="${TMP}/pyenv-virtualenv.${SEED}.txt"
VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}" VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}"
unset HAS_VIRTUALENV unset HAS_VIRTUALENV
@@ -299,31 +334,20 @@ unset HAS_PYVENV
unset USE_PYVENV unset USE_PYVENV
detect_venv detect_venv
SEED="$(date "+%Y%m%d%H%M%S").$$"
VIRTUALENV_ORIG="${VIRTUALENV_PATH}.${SEED}"
REQUIREMENTS="${TMP}/requirements.${SEED}.txt"
# Upgrade existing virtualenv
if [ -n "$UPGRADE" ]; then
FORCE=1
# pyvenv has `--upgrade` by default
if [ -n "${USE_PYVENV}" ]; then
unset UPGRADE
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--upgrade"
fi
fi
if [ -n "${USE_PYVENV}" ]; then if [ -n "${USE_PYVENV}" ]; then
# Unset some arguments not supported by pyvenv # Unset some arguments not supported by pyvenv
unset QUIET unset QUIET
unset VERBOSE unset VERBOSE
if [ -n "$UPGRADE" ]; then
unset UPGRADE
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--upgrade"
fi
else else
if [ -n "${VIRTUALENV_PYTHON}" ]; then if [ -n "${VIRTUALENV_PYTHON}" ]; then
VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${VIRTUALENV_PYTHON}" VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${VIRTUALENV_PYTHON}"
fi fi
if [ -z "${HAS_VIRTUALENV}" ]; then if [ -z "${HAS_VIRTUALENV}" ]; then
VIRTUALENV_VERSION="==${VIRTUALENV_VERSION}" install_virtualenv "${PYENV_VERSION}"
pyenv-exec pip install $QUIET $VERBOSE "virtualenv${VIRTUALENV_VERSION%==}"
HAS_VIRTUALENV=1 HAS_VIRTUALENV=1
fi fi
fi fi
@@ -333,15 +357,6 @@ fi
unset VIRTUALENV_VERSION unset VIRTUALENV_VERSION
# Download specified version of ez_setup.py/get-pip.py
if [ -n "${SETUPTOOLS_VERSION}" ]; then
EZ_SETUP_URL="https://bitbucket.org/pypa/setuptools/raw/${SETUPTOOLS_VERSION}/ez_setup.py"
fi
if [ -n "${PIP_VERSION}" ]; then
GET_PIP_URL="https://raw.githubusercontent.com/pypa/pip/${PIP_VERSION}/contrib/get-pip.py"
fi
# Define `before_virtualenv` and `after_virtualenv` functions that allow # Define `before_virtualenv` and `after_virtualenv` functions that allow
# plugin hooks to register a string of code for execution before or # plugin hooks to register a string of code for execution before or
# after the installation process. # after the installation process.
@@ -380,7 +395,7 @@ if [ -d "${VIRTUALENV_PATH}/bin" ]; then
fi fi
if [ -n "$UPGRADE" ]; then if [ -n "$UPGRADE" ]; then
PYENV_VERSION="${VIRTUALENV_NAME}" prepare_requirements prepare_upgrade "${VIRTUALENV_NAME}" "${VIRTUALENV_PATH}"
fi fi
fi fi
@@ -402,11 +417,10 @@ mkdir -p "${PYENV_VIRTUALENV_CACHE_PATH}"
cd "${PYENV_VIRTUALENV_CACHE_PATH}" cd "${PYENV_VIRTUALENV_CACHE_PATH}"
venv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?" venv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?"
## Install setuptools and pip
PYENV_VERSION="${VIRTUALENV_NAME}" build_package_ensurepip
## Migrate previously installed packages from requirements.txt ## Migrate previously installed packages from requirements.txt
PYENV_VERSION="${VIRTUALENV_NAME}" install_requirements || true if [ -n "$UPGRADE" ]; then
upgrade "${VIRTUALENV_NAME}" "${VIRTUALENV_PATH}" || STATUS="$?"
fi
# Execute `after_virtualenv` hooks # Execute `after_virtualenv` hooks
for hook in "${after_hooks[@]}"; do eval "$hook"; done for hook in "${after_hooks[@]}"; do eval "$hook"; done

View File

@@ -1,156 +0,0 @@
#!/usr/bin/env bash
# Summary: Configure the shell environment for pyenv-virtualenv
# Usage: eval "$(pyenv virtualenv-init - [<shell>])"
#
# Automatically activates a Python virtualenv environment based on current
# pyenv version.
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
print=""
for args in "$@"
do
if [ "$args" = "-" ]; then
print=1
shift
fi
done
shell="$1"
if [ -z "$shell" ]; then
shell="$(ps c -p "$PPID" -o 'ucomm=' 2>/dev/null || true)"
shell="${shell##-}"
shell="${shell%% *}"
shell="$(basename "${shell:-$SHELL}")"
fi
if [ -z "$print" ]; then
case "$shell" in
bash )
profile='~/.bash_profile'
;;
zsh )
profile='~/.zshrc'
;;
ksh )
profile='~/.profile'
;;
fish )
profile='~/.config/fish/config.fish'
;;
* )
profile='your profile'
;;
esac
{ echo "# Load pyenv-virtualenv automatically by adding"
echo "# the following to ${profile}:"
echo
case "$shell" in
fish )
echo 'status --is-interactive; and . (pyenv virtualenv-init -|psub)'
;;
* )
echo 'eval "$(pyenv virtualenv-init -)"'
;;
esac
echo
} >&2
exit 1
fi
case "$shell" in
fish )
echo "setenv PYENV_VIRTUALENV_INIT 1;"
;;
* )
echo "export PYENV_VIRTUALENV_INIT=1;"
;;
esac
case "$shell" in
fish )
cat <<EOS
function _pyenv_virtualenv_hook --on-event fish_prompt;
if [ -n "\$PYENV_ACTIVATE" ]
if [ (pyenv version-name 2>/dev/null; or true) = "system" ]
pyenv deactivate --no-error --verbose
set -e PYENV_DEACTIVATE
return 0
end
if [ "\$PYENV_ACTIVATE" != (pyenv prefix 2>/dev/null; or true) ]
if pyenv deactivate --no-error --verbose
set -e PYENV_DEACTIVATE
pyenv activate --no-error --verbose; or set -e PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
end
end
else
if [ -z "\$VIRTUAL_ENV" ]; and [ "\$PYENV_DEACTIVATE" != (pyenv prefix 2>/dev/null; or true) ]
pyenv activate --no-error --verbose
end
end
end
EOS
;;
ksh )
cat <<EOS
function _pyenv_virtualenv_hook() {
EOS
;;
* )
cat <<EOS
_pyenv_virtualenv_hook() {
EOS
;;
esac
if [[ "$shell" != "fish" ]]; then
cat <<EOS
if [ -n "\$PYENV_ACTIVATE" ]; then
if [ "\$(pyenv version-name 2>/dev/null || true)" = "system" ]; then
pyenv deactivate --no-error --verbose
unset PYENV_DEACTIVATE
return 0
fi
if [ "\$PYENV_ACTIVATE" != "\$(pyenv prefix 2>/dev/null || true)" ]; then
if pyenv deactivate --no-error --verbose; then
unset PYENV_DEACTIVATE
pyenv activate --no-error --verbose || unset PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
fi
fi
else
if [ -z "\$VIRTUAL_ENV" ] && [ "\$PYENV_DEACTIVATE" != "\$(pyenv prefix 2>/dev/null || true)" ]; then
pyenv activate --no-error --verbose
fi
fi
};
EOS
case "$shell" in
bash )
cat <<EOS
if ! [[ "\$PROMPT_COMMAND" =~ _pyenv_virtualenv_hook ]]; then
PROMPT_COMMAND="_pyenv_virtualenv_hook;\$PROMPT_COMMAND";
fi
EOS
;;
zsh )
cat <<EOS
typeset -a precmd_functions
if [[ -z \$precmd_functions[(r)_pyenv_virtualenv_hook] ]]; then
precmd_functions+=_pyenv_virtualenv_hook;
fi
EOS
;;
* )
# FIXME: what should i do here??
;;
esac
fi

View File

@@ -32,10 +32,6 @@ base_prefix() { # pyvenv
VIRTUALENV_PREFIX_PATHS=() VIRTUALENV_PREFIX_PATHS=()
for version in "${versions[@]}"; do for version in "${versions[@]}"; do
if [ "$version" = "system" ]; then
echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2
exit 1
fi
PREFIX="$(pyenv-prefix "${version}")" PREFIX="$(pyenv-prefix "${version}")"
if [ -f "${PREFIX}/bin/activate" ]; then if [ -f "${PREFIX}/bin/activate" ]; then
VIRTUALENV_PREFIX_PATH="$(real_prefix "${version}" || base_prefix "${version}" || true)" VIRTUALENV_PREFIX_PATH="$(real_prefix "${version}" || base_prefix "${version}" || true)"

View File

@@ -0,0 +1,25 @@
VERSION_NAME="${DEFINITION##*/}"
PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
if ! pyenv-virtualenv-prefix "${VERSION_NAME}" 1>/dev/null 2>&1; then
OLDIFS="$IFS"
IFS=$'\n' virtualenvs=($(pyenv-virtualenvs --bare))
IFS="$OLDIFS"
declare -a dependencies
for venv in "${virtualenvs[@]}"; do
venv_prefix="$(pyenv-virtualenv-prefix "${venv}" 2>/dev/null || true)"
if [ -d "${venv_prefix}" ] && [ "${PREFIX}" = "${venv_prefix}" ]; then
dependencies[${#dependencies[*]}]="${venv}"
fi
done
if [ -z "$FORCE" ] && [ -n "$dependencies" ]; then
echo "pyenv: ${#dependencies[@]} virtualenv(s) is depending on $PREFIX." >&2
read -p "continue with uninstallation? (y/N) "
case "$REPLY" in
y* | Y* ) ;;
* ) exit 1 ;;
esac
fi
fi

View File

@@ -12,7 +12,10 @@ if [ -z "${PREFIX}" ]; then
fi fi
BIN_PATH="${PREFIX}/bin" BIN_PATH="${PREFIX}/bin"
ETC_PATH="${PREFIX}/etc/pyenv.d"
mkdir -p "$BIN_PATH" mkdir -p "$BIN_PATH"
mkdir -p "$ETC_PATH"
install -p bin/* "$BIN_PATH" install -p bin/* "$BIN_PATH"
cp -RPp etc/pyenv.d/* "$ETC_PATH"

View File

@@ -3,13 +3,10 @@
load test_helper load test_helper
setup() { setup() {
export HOME="${TMP}"
export PYENV_ROOT="${TMP}/pyenv" export PYENV_ROOT="${TMP}/pyenv"
} }
@test "activate virtualenv from current version" { @test "activate virtualenv from current version" {
export PYENV_VIRTUALENV_INIT=1
stub pyenv-version-name "echo venv" stub pyenv-version-name "echo venv"
stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\"" stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\"" stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
@@ -22,60 +19,12 @@ setup() {
assert_success assert_success
assert_output <<EOS assert_output <<EOS
unset PYENV_DEACTIVATE; pyenv shell "venv"
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"; source "${PYENV_ROOT}/versions/venv/bin/activate"
. "${PYENV_ROOT}/versions/venv/bin/activate";
EOS
}
@test "activate virtualenv from current version (verbose)" {
export PYENV_VIRTUALENV_INIT=1
stub pyenv-version-name "echo venv"
stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
PYENV_SHELL="bash" PYENV_VERSION="venv" run pyenv-sh-activate --verbose
unstub pyenv-version-name
unstub pyenv-virtualenv-prefix
unstub pyenv-prefix
assert_success
assert_output <<EOS
pyenv-virtualenv: activate venv
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv";
. "${PYENV_ROOT}/versions/venv/bin/activate";
EOS
}
@test "activate virtualenv from current version (without pyenv-virtualenv-init)" {
export PYENV_VIRTUALENV_INIT=
stub pyenv-version-name "echo venv"
stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
PYENV_SHELL="bash" PYENV_VERSION="venv" run pyenv-sh-activate
unstub pyenv-version-name
unstub pyenv-virtualenv-prefix
unstub pyenv-prefix
assert_success
assert_output <<EOS
pyenv shell "venv";
export PYENV_ACTIVATE_SHELL=1;
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv";
. "${PYENV_ROOT}/versions/venv/bin/activate";
EOS EOS
} }
@test "activate virtualenv from current version (fish)" { @test "activate virtualenv from current version (fish)" {
export PYENV_VIRTUALENV_INIT=1
stub pyenv-version-name "echo venv" stub pyenv-version-name "echo venv"
stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\"" stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\"" stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
@@ -88,38 +37,12 @@ EOS
assert_success assert_success
assert_output <<EOS assert_output <<EOS
set -e PYENV_DEACTIVATE; pyenv shell "venv"
setenv PYENV_ACTIVATE "${PYENV_ROOT}/versions/venv"; . "${PYENV_ROOT}/versions/venv/bin/activate.fish"
. "${PYENV_ROOT}/versions/venv/bin/activate.fish";
EOS
}
@test "activate virtualenv from current version (fish) (without pyenv-virtualenv-init)" {
export PYENV_VIRTUALENV_INIT=
stub pyenv-version-name "echo venv"
stub pyenv-virtualenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
stub pyenv-prefix "venv : echo \"${PYENV_ROOT}/versions/venv\""
PYENV_SHELL="fish" PYENV_VERSION="venv" run pyenv-sh-activate
unstub pyenv-version-name
unstub pyenv-virtualenv-prefix
unstub pyenv-prefix
assert_success
assert_output <<EOS
pyenv shell "venv";
setenv PYENV_ACTIVATE_SHELL 1;
set -e PYENV_DEACTIVATE;
setenv PYENV_ACTIVATE "${PYENV_ROOT}/versions/venv";
. "${PYENV_ROOT}/versions/venv/bin/activate.fish";
EOS EOS
} }
@test "activate virtualenv from command-line argument" { @test "activate virtualenv from command-line argument" {
export PYENV_VIRTUALENV_INIT=1
stub pyenv-virtualenv-prefix "venv27 : echo \"${PYENV_ROOT}/versions/venv27\"" stub pyenv-virtualenv-prefix "venv27 : echo \"${PYENV_ROOT}/versions/venv27\""
stub pyenv-prefix "venv27 : echo \"${PYENV_ROOT}/versions/venv27\"" stub pyenv-prefix "venv27 : echo \"${PYENV_ROOT}/versions/venv27\""
@@ -130,32 +53,8 @@ EOS
assert_success assert_success
assert_output <<EOS assert_output <<EOS
pyenv shell "venv27"; pyenv shell "venv27"
export PYENV_ACTIVATE_SHELL=1; source "${PYENV_ROOT}/versions/venv27/bin/activate"
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv27";
. "${PYENV_ROOT}/versions/venv27/bin/activate";
EOS
}
@test "activate virtualenv from command-line argument (without pyenv-virtualenv-init)" {
export PYENV_VIRTUALENV_INIT=
stub pyenv-virtualenv-prefix "venv27 : echo \"${PYENV_ROOT}/versions/venv27\""
stub pyenv-prefix "venv27 : echo \"${PYENV_ROOT}/versions/venv27\""
run pyenv-sh-activate "venv27"
unstub pyenv-virtualenv-prefix
unstub pyenv-prefix
assert_success
assert_output <<EOS
pyenv shell "venv27";
export PYENV_ACTIVATE_SHELL=1;
unset PYENV_DEACTIVATE;
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv27";
. "${PYENV_ROOT}/versions/venv27/bin/activate";
EOS EOS
} }
@@ -176,23 +75,6 @@ EOS
unstub pyenv-virtualenv-prefix unstub pyenv-virtualenv-prefix
assert_failure assert_failure
assert_output <<EOS
pyenv-virtualenv: version \`3.3.3' is not a virtualenv
false
EOS
}
@test "should fail if the version is not a virtualenv (no-error)" {
stub pyenv-virtualenv-prefix "3.3.3 : false"
run pyenv-sh-activate --no-error "3.3.3"
unstub pyenv-virtualenv-prefix
assert_failure
assert_output <<EOS
false
EOS
} }
@test "should fail if there are multiple versions" { @test "should fail if there are multiple versions" {
@@ -201,16 +83,6 @@ EOS
assert_failure assert_failure
assert_output <<EOS assert_output <<EOS
pyenv-virtualenv: cannot activate multiple versions at once: venv venv27 pyenv-virtualenv: cannot activate multiple versions at once: venv venv27
false
EOS
}
@test "should fail if there are multiple versions (no-error)" {
run pyenv-sh-activate --no-error "venv" "venv27"
assert_failure
assert_output <<EOS
false
EOS EOS
} }

View File

@@ -7,216 +7,22 @@ setup() {
} }
@test "deactivate virtualenv" { @test "deactivate virtualenv" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=
PYENV_SHELL="bash" run pyenv-sh-deactivate PYENV_SHELL="bash" run pyenv-sh-deactivate
assert_success assert_success
assert_output <<EOS assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then declare -f deactivate 1>/dev/null 2>&1 && deactivate
export PYENV_DEACTIVATE="$PYENV_ACTIVATE"; pyenv shell --unset
unset PYENV_ACTIVATE;
deactivate;
else
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
fi;
EOS
}
@test "deactivate virtualenv (verbose)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=
PYENV_SHELL="bash" run pyenv-sh-deactivate --verbose
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
echo "pyenv-virtualenv: deactivate venv" 1>&2;
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
fi;
EOS
}
@test "deactivate virtualenv (no-error)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=
PYENV_SHELL="bash" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
false;
fi;
EOS
}
@test "deactivate virtualenv (with shell activation)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=1
PYENV_SHELL="bash" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
pyenv shell --unset;
unset PYENV_ACTIVATE_SHELL;
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
fi;
EOS
}
@test "deactivate virtualenv (with shell activation) (no-error)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=1
PYENV_SHELL="bash" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
pyenv shell --unset;
unset PYENV_ACTIVATE_SHELL;
export PYENV_DEACTIVATE="$PYENV_ACTIVATE";
unset PYENV_ACTIVATE;
deactivate;
else
false;
fi;
EOS
}
@test "deactivate virtualenv which has been activated manually" {
export VIRTUAL_ENV="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=
PYENV_SHELL="bash" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if declare -f deactivate 1>/dev/null 2>&1; then
export PYENV_DEACTIVATE="$VIRTUAL_ENV";
unset PYENV_ACTIVATE;
deactivate;
else
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
fi;
EOS EOS
} }
@test "deactivate virtualenv (fish)" { @test "deactivate virtualenv (fish)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=
PYENV_SHELL="fish" run pyenv-sh-deactivate PYENV_SHELL="fish" run pyenv-sh-deactivate
assert_success assert_success
assert_output <<EOS assert_output <<EOS
if functions -q deactivate; functions -q deactivate; and deactivate
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE"; pyenv shell --unset
set -e PYENV_ACTIVATE;
deactivate;
else;
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
end;
EOS
}
@test "deactivate virtualenv (fish) (no-error)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=
PYENV_SHELL="fish" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if functions -q deactivate;
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
false;
end;
EOS
}
@test "deactivate virtualenv (fish) (with shell activation)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=1
PYENV_SHELL="fish" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if functions -q deactivate;
pyenv shell --unset;
set -e PYENV_ACTIVATE_SHELL;
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
end;
EOS
}
@test "deactivate virtualenv (fish) (with shell activation) (no-error)" {
export PYENV_ACTIVATE="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=1
PYENV_SHELL="fish" run pyenv-sh-deactivate --no-error
assert_success
assert_output <<EOS
if functions -q deactivate;
pyenv shell --unset;
set -e PYENV_ACTIVATE_SHELL;
setenv PYENV_DEACTIVATE "$PYENV_ACTIVATE";
set -e PYENV_ACTIVATE;
deactivate;
else;
false;
end;
EOS
}
@test "deactivate virtualenv which has been activated manually (fish)" {
export VIRTUAL_ENV="${PYENV_ROOT}/versions/venv"
export PYENV_ACTIVATE_SHELL=
PYENV_SHELL="fish" run pyenv-sh-deactivate
assert_success
assert_output <<EOS
if functions -q deactivate;
setenv PYENV_DEACTIVATE "$VIRTUAL_ENV";
set -e PYENV_ACTIVATE;
deactivate;
else;
echo "pyenv-virtualenv: no virtualenv has been activated." 1>&2;
false;
end;
EOS EOS
} }

View File

@@ -13,16 +13,14 @@ setup() {
before_virtualenv 'echo before: \$VIRTUALENV_PATH' before_virtualenv 'echo before: \$VIRTUALENV_PATH'
after_virtualenv 'echo after: \$STATUS' after_virtualenv 'echo after: \$STATUS'
OUT OUT
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.2.1'" stub pyenv-prefix "echo '${PYENV_ROOT}/versions/\${PYENV_VERSION}'"
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.2.1'" stub pyenv-which "virtualenv : echo '${PYENV_ROOT}/versions/bin/virtualenv'" \
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.2.1'" "pyvenv : false"
stub pyenv-hooks "virtualenv : echo '$HOOK_PATH'/virtualenv.bash" stub pyenv-hooks "virtualenv : echo '$HOOK_PATH'/virtualenv.bash"
stub pyenv-exec "echo PYENV_VERSION=3.2.1 \"\$@\"" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-rehash "echo rehashed" stub pyenv-rehash "echo rehashed"
create_executable "3.2.1" "virtualenv" mkdir -p "${PYENV_ROOT}/versions/3.2.1"
remove_executable "3.2.1" "pyvenv"
run pyenv-virtualenv "3.2.1" venv run pyenv-virtualenv "3.2.1" venv
assert_success assert_success

View File

@@ -1,120 +0,0 @@
#!/usr/bin/env bats
load test_helper
@test "detect parent shell" {
root="$(cd $BATS_TEST_DIRNAME/.. && pwd)"
SHELL=/bin/false run pyenv-virtualenv-init -
assert_success
assert_output_contains ' PROMPT_COMMAND="_pyenv_virtualenv_hook;$PROMPT_COMMAND";'
}
@test "sh-compatible instructions" {
run pyenv-virtualenv-init bash
assert [ "$status" -eq 1 ]
assert_output_contains 'eval "$(pyenv virtualenv-init -)"'
run pyenv-virtualenv-init zsh
assert [ "$status" -eq 1 ]
assert_output_contains 'eval "$(pyenv virtualenv-init -)"'
}
@test "fish instructions" {
run pyenv-virtualenv-init fish
assert [ "$status" -eq 1 ]
assert_output_contains 'status --is-interactive; and . (pyenv virtualenv-init -|psub)'
}
@test "outputs bash-specific syntax" {
run pyenv-virtualenv-init - bash
assert_success
assert_output <<EOS
export PYENV_VIRTUALENV_INIT=1;
_pyenv_virtualenv_hook() {
if [ -n "\$PYENV_ACTIVATE" ]; then
if [ "\$(pyenv version-name 2>/dev/null || true)" = "system" ]; then
pyenv deactivate --no-error --verbose
unset PYENV_DEACTIVATE
return 0
fi
if [ "\$PYENV_ACTIVATE" != "\$(pyenv prefix 2>/dev/null || true)" ]; then
if pyenv deactivate --no-error --verbose; then
unset PYENV_DEACTIVATE
pyenv activate --no-error --verbose || unset PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
fi
fi
else
if [ -z "\$VIRTUAL_ENV" ] && [ "\$PYENV_DEACTIVATE" != "\$(pyenv prefix 2>/dev/null || true)" ]; then
pyenv activate --no-error --verbose
fi
fi
};
if ! [[ "\$PROMPT_COMMAND" =~ _pyenv_virtualenv_hook ]]; then
PROMPT_COMMAND="_pyenv_virtualenv_hook;\$PROMPT_COMMAND";
fi
EOS
}
@test "outputs fish-specific syntax" {
run pyenv-virtualenv-init - fish
assert_success
assert_output <<EOS
setenv PYENV_VIRTUALENV_INIT 1;
function _pyenv_virtualenv_hook --on-event fish_prompt;
if [ -n "\$PYENV_ACTIVATE" ]
if [ (pyenv version-name 2>/dev/null; or true) = "system" ]
pyenv deactivate --no-error --verbose
set -e PYENV_DEACTIVATE
return 0
end
if [ "\$PYENV_ACTIVATE" != (pyenv prefix 2>/dev/null; or true) ]
if pyenv deactivate --no-error --verbose
set -e PYENV_DEACTIVATE
pyenv activate --no-error --verbose; or set -e PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
end
end
else
if [ -z "\$VIRTUAL_ENV" ]; and [ "\$PYENV_DEACTIVATE" != (pyenv prefix 2>/dev/null; or true) ]
pyenv activate --no-error --verbose
end
end
end
EOS
}
@test "outputs zsh-specific syntax" {
run pyenv-virtualenv-init - zsh
assert_success
assert_output <<EOS
export PYENV_VIRTUALENV_INIT=1;
_pyenv_virtualenv_hook() {
if [ -n "\$PYENV_ACTIVATE" ]; then
if [ "\$(pyenv version-name 2>/dev/null || true)" = "system" ]; then
pyenv deactivate --no-error --verbose
unset PYENV_DEACTIVATE
return 0
fi
if [ "\$PYENV_ACTIVATE" != "\$(pyenv prefix 2>/dev/null || true)" ]; then
if pyenv deactivate --no-error --verbose; then
unset PYENV_DEACTIVATE
pyenv activate --no-error --verbose || unset PYENV_DEACTIVATE
else
pyenv activate --no-error --verbose
fi
fi
else
if [ -z "\$VIRTUAL_ENV" ] && [ "\$PYENV_DEACTIVATE" != "\$(pyenv prefix 2>/dev/null || true)" ]; then
pyenv activate --no-error --verbose
fi
fi
};
typeset -a precmd_functions
if [[ -z \$precmd_functions[(r)_pyenv_virtualenv_hook] ]]; then
precmd_functions+=_pyenv_virtualenv_hook;
fi
EOS
}

View File

@@ -9,12 +9,9 @@ load test_helper
cd usr cd usr
assert [ -x bin/pyenv-activate ]
assert [ -x bin/pyenv-deactivate ]
assert [ -x bin/pyenv-sh-activate ] assert [ -x bin/pyenv-sh-activate ]
assert [ -x bin/pyenv-sh-deactivate ] assert [ -x bin/pyenv-sh-deactivate ]
assert [ -x bin/pyenv-virtualenv ] assert [ -x bin/pyenv-virtualenv ]
assert [ -x bin/pyenv-virtualenv-init ]
assert [ -x bin/pyenv-virtualenv-prefix ] assert [ -x bin/pyenv-virtualenv-prefix ]
assert [ -x bin/pyenv-virtualenvs ] assert [ -x bin/pyenv-virtualenvs ]
} }

View File

@@ -1,78 +0,0 @@
#!/usr/bin/env bats
load test_helper
setup() {
export PYENV_ROOT="${TMP}/pyenv"
}
stub_pyenv() {
stub pyenv-version-name "echo \${PYENV_VERSION}"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
stub pyenv-hooks "virtualenv : echo"
stub pyenv-rehash " : echo rehashed"
}
unstub_pyenv() {
unstub pyenv-version-name
unstub pyenv-prefix
unstub pyenv-hooks
unstub pyenv-rehash
}
@test "install pip with ensurepip" {
export PYENV_VERSION="3.4.1"
stub_pyenv "${PYENV_VERSION}"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
stub pyenv-exec "pyvenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/venv/bin"
stub pyenv-exec "python -m ensurepip : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/venv/bin/pip"
remove_executable "3.4.1" "virtualenv"
create_executable "3.4.1" "pyvenv"
run pyenv-virtualenv venv
assert_success
assert_output <<OUT
PYENV_VERSION=3.4.1 pyvenv ${PYENV_ROOT}/versions/venv
PYENV_VERSION=venv python -m ensurepip
rehashed
OUT
assert [ -e "${PYENV_ROOT}/versions/venv/bin/pip" ]
unstub_pyenv
unstub pyenv-exec
}
@test "install pip without using ensurepip" {
export PYENV_VERSION="3.3.5"
stub_pyenv "${PYENV_VERSION}"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
stub pyenv-exec "pyvenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/venv/bin"
stub pyenv-exec "python -m ensurepip : false"
stub pyenv-exec "python */ez_setup.py : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/venv/bin/easy_install"
stub pyenv-exec "python */get-pip.py : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/venv/bin/pip"
stub curl true
stub curl true
remove_executable "3.3.5" "virtualenv"
create_executable "3.3.5" "pyvenv"
run pyenv-virtualenv venv
assert_success
assert_output <<OUT
PYENV_VERSION=3.3.5 pyvenv ${PYENV_ROOT}/versions/venv
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
PYENV_VERSION=venv python ${TMP}/pyenv/cache/ez_setup.py
Installing pip from https://bootstrap.pypa.io/get-pip.py...
PYENV_VERSION=venv python ${TMP}/pyenv/cache/get-pip.py
rehashed
OUT
assert [ -e "${PYENV_ROOT}/versions/venv/bin/pip" ]
unstub_pyenv
unstub pyenv-exec
}

View File

@@ -7,175 +7,185 @@ setup() {
} }
stub_pyenv() { stub_pyenv() {
export PYENV_VERSION="$1"
stub pyenv-version-name "echo \${PYENV_VERSION}" stub pyenv-version-name "echo \${PYENV_VERSION}"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/\${PYENV_VERSION}'"
stub pyenv-hooks "virtualenv : echo" stub pyenv-hooks "virtualenv : echo"
stub pyenv-rehash " : echo rehashed" stub pyenv-rehash " : echo rehashed"
} }
unstub_pyenv() { unstub_pyenv() {
unset PYENV_VERSION
unstub pyenv-version-name unstub pyenv-version-name
unstub pyenv-prefix unstub pyenv-prefix
unstub pyenv-hooks unstub pyenv-hooks
unstub pyenv-rehash unstub pyenv-rehash
} }
@test "use pyvenv if virtualenv is not available" { create_executable() {
export PYENV_VERSION="3.4.1" mkdir -p "${PYENV_ROOT}/versions/$1/bin"
stub_pyenv "${PYENV_VERSION}" touch "${PYENV_ROOT}/versions/$1/bin/$2"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" chmod +x "${PYENV_ROOT}/versions/$1/bin/$2"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" }
stub pyenv-exec "pyvenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : true"
remove_executable "3.4.1" "virtualenv" remove_executable() {
create_executable "3.4.1" "pyvenv" rm -f "${PYENV_ROOT}/versions/$1/bin/$2"
}
@test "use pyvenv if virtualenv is not available" {
stub_pyenv "3.4.0"
stub pyenv-which "virtualenv : false" \
"pyvenv : echo '${PYENV_ROOT}/versions/bin/pyvenv'"
stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" \
"bin=\"${PYENV_ROOT}/versions/venv/bin\";mkdir -p \"\$bin\";touch \"\$bin/pip3.4\";echo PYENV_VERSION=\${PYENV_VERSION} ensurepip" \
"echo pip3.4"
stub pyenv-prefix "venv : echo '${PYENV_ROOT}/versions/venv'"
run pyenv-virtualenv venv run pyenv-virtualenv venv
unstub_pyenv
unstub pyenv-which
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PYENV_VERSION=3.4.1 pyvenv ${PYENV_ROOT}/versions/venv PYENV_VERSION=3.4.0 pyvenv ${PYENV_ROOT}/versions/venv
PYENV_VERSION=venv ensurepip
rehashed rehashed
OUT OUT
assert [ -e "${PYENV_ROOT}/versions/venv/bin/pip" ]
unstub_pyenv
unstub pyenv-exec
} }
@test "not use pyvenv if virtualenv is available" { @test "not use pyvenv if virtualenv is available" {
export PYENV_VERSION="3.4.1" stub_pyenv "3.4.0"
stub_pyenv "${PYENV_VERSION}" stub pyenv-which "virtualenv : echo '${PYENV_ROOT}/versions/bin/virtualenv'" \
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" "pyvenv : echo '${PYENV_ROOT}/versions/bin/pyvenv"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "virtualenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : true"
create_executable "3.4.1" "virtualenv"
create_executable "3.4.1" "pyvenv"
run pyenv-virtualenv venv run pyenv-virtualenv venv
unstub_pyenv
unstub pyenv-which
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PYENV_VERSION=3.4.1 virtualenv ${PYENV_ROOT}/versions/venv PYENV_VERSION=3.4.0 virtualenv ${PYENV_ROOT}/versions/venv
rehashed rehashed
OUT OUT
unstub_pyenv
unstub pyenv-exec
} }
@test "install virtualenv if pyvenv is not avaialble" { @test "install virtualenv if pyvenv is not avaialble" {
export PYENV_VERSION="3.2.1" stub_pyenv "3.2.1"
stub_pyenv "${PYENV_VERSION}" stub pyenv-which "virtualenv : false" \
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" "pyvenv : false"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" \
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "virtualenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : false"
stub pyenv-exec "python */ez_setup.py : true"
stub pyenv-exec "python */get-pip.py : true"
stub curl true
stub curl true
remove_executable "3.2.1" "virtualenv"
remove_executable "3.2.1" "pyvenv"
run pyenv-virtualenv venv run pyenv-virtualenv venv
unstub_pyenv
unstub pyenv-which
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PYENV_VERSION=3.2.1 pip install virtualenv PYENV_VERSION=3.2.1 pip install virtualenv
PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
rehashed rehashed
OUT OUT
unstub_pyenv
unstub pyenv-exec
unstub curl
} }
@test "install virtualenv if -p has given" { @test "install virtualenv if -p has given" {
export PYENV_VERSION="3.4.1" stub_pyenv "3.4.0"
stub_pyenv "${PYENV_VERSION}" stub pyenv-which "virtualenv : false"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-which "pyvenv : echo '${PYENV_ROOT}/versions/bin/pyvenv'"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "virtualenv --python=python3 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : true"
remove_executable "3.4.1" "virtualenv"
create_executable "3.4.1" "pyvenv"
run pyenv-virtualenv -p python3 venv run pyenv-virtualenv -p python3 venv
unstub_pyenv
unstub pyenv-which
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PYENV_VERSION=3.4.1 pip install virtualenv PYENV_VERSION=3.4.0 pip install virtualenv
PYENV_VERSION=3.4.1 virtualenv --python=python3 ${PYENV_ROOT}/versions/venv PYENV_VERSION=3.4.0 virtualenv --python=python3 ${PYENV_ROOT}/versions/venv
rehashed rehashed
OUT OUT
unstub_pyenv
unstub pyenv-exec
} }
@test "install virtualenv if --python has given" { @test "install virtualenv if --python has given" {
export PYENV_VERSION="3.4.1" stub_pyenv "3.4.0"
stub_pyenv "${PYENV_VERSION}" stub pyenv-which "virtualenv : false"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-which "pyvenv : echo '${PYENV_ROOT}/versions/bin/pyvenv'"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "virtualenv --python=python3 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : true"
remove_executable "3.4.1" "virtualenv"
create_executable "3.4.1" "pyvenv"
run pyenv-virtualenv --python=python3 venv run pyenv-virtualenv --python=python3 venv
unstub_pyenv
unstub pyenv-which
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PYENV_VERSION=3.4.1 pip install virtualenv PYENV_VERSION=3.4.0 pip install virtualenv
PYENV_VERSION=3.4.1 virtualenv --python=python3 ${PYENV_ROOT}/versions/venv PYENV_VERSION=3.4.0 virtualenv --python=python3 ${PYENV_ROOT}/versions/venv
rehashed rehashed
OUT OUT
unstub_pyenv
unstub pyenv-exec
} }
@test "install virtualenv with unsetting troublesome pip options" { @test "install virtualenv with unsetting troublesome pip options" {
export PYENV_VERSION="3.2.1" stub_pyenv "3.2.1"
stub_pyenv "${PYENV_VERSION}" stub pyenv-which "virtualenv : false" \
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" "pyvenv : false"
stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" \
stub pyenv-exec "pip install virtualenv : echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" "echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "virtualenv ${PYENV_ROOT}/versions/venv : echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : false"
stub pyenv-exec "python */ez_setup.py : true"
stub pyenv-exec "python */get-pip.py : true"
stub curl true
stub curl true
remove_executable "3.2.1" "virtualenv"
remove_executable "3.2.1" "pyvenv"
PIP_REQUIRE_VENV="true" run pyenv-virtualenv venv PIP_REQUIRE_VENV="true" run pyenv-virtualenv venv
unstub_pyenv
unstub pyenv-which
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PIP_REQUIRE_VENV= PYENV_VERSION=3.2.1 pip install virtualenv PIP_REQUIRE_VENV= PYENV_VERSION=3.2.1 pip install virtualenv
PIP_REQUIRE_VENV= PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv PIP_REQUIRE_VENV= PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
rehashed rehashed
OUT OUT
}
@test "install pip without using ensurepip" {
stub_pyenv "3.3.0"
stub pyenv-which "virtualenv : false" \
"pyvenv : echo '${PYENV_ROOT}/versions/bin/pyvenv'" \
"pip : echo no pip; false"
stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" \
"echo PYENV_VERSION=\${PYENV_VERSION} no ensurepip; false" \
"echo PYENV_VERSION=\${PYENV_VERSION} no setuptools; false" \
"echo PYENV_VERSION=\${PYENV_VERSION} setuptools" \
"bin=\"${PYENV_ROOT}/versions/venv/bin\";mkdir -p \"\$bin\";touch \"\$bin/pip\";echo PYENV_VERSION=\${PYENV_VERSION} pip"
stub curl "echo ez_setup.py" \
"echo get_pip.py"
run pyenv-virtualenv venv
unstub_pyenv unstub_pyenv
unstub pyenv-which
unstub pyenv-exec unstub pyenv-exec
unstub curl
assert_success
assert_output <<OUT
PYENV_VERSION=3.3.0 pyvenv ${PYENV_ROOT}/versions/venv
PYENV_VERSION=venv no ensurepip
PYENV_VERSION=venv setuptools
PYENV_VERSION=venv pip
rehashed
OUT
assert [ -e "${PYENV_ROOT}/versions/venv/bin/pip" ]
} }

View File

@@ -96,13 +96,3 @@ assert_output_contains() {
} | flunk } | flunk
} }
} }
create_executable() {
mkdir -p "${PYENV_ROOT}/versions/$1/bin"
touch "${PYENV_ROOT}/versions/$1/bin/$2"
chmod +x "${PYENV_ROOT}/versions/$1/bin/$2"
}
remove_executable() {
rm -f "${PYENV_ROOT}/versions/$1/bin/$2"
}

View File

@@ -4,40 +4,34 @@ load test_helper
setup() { setup() {
export PYENV_ROOT="${TMP}/pyenv" export PYENV_ROOT="${TMP}/pyenv"
export PYENV_VIRTUALENV_VERSION="20141106" export PYENV_VIRTUALENV_VERSION="20140421"
} }
@test "display virtualenv version" { @test "display virtualenv version" {
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/2.7.7'" stub pyenv-which "virtualenv : true"
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/2.7.7'" stub pyenv-which "pyvenv : true"
stub pyenv-exec "virtualenv --version : echo \"1.11\"" stub pyenv-exec "virtualenv --version : echo \"1.11\""
create_executable "2.7.7" "virtualenv"
remove_executable "2.7.7" "pyvenv"
run pyenv-virtualenv --version run pyenv-virtualenv --version
unstub pyenv-which
unstub pyenv-exec
assert_success assert_success
assert_output "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (virtualenv 1.11)" assert_output "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (virtualenv 1.11)"
unstub pyenv-prefix
unstub pyenv-exec
} }
@test "display pyvenv version" { @test "display pyvenv version" {
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.4.1'" stub pyenv-which "virtualenv : false"
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/3.4.1'" stub pyenv-which "pyvenv : echo \"${PYENV_ROOT}/versions/3.3.3/bin/pyvenv\""
stub pyenv-which "pyvenv : echo \"${PYENV_ROOT}/versions/3.4.1/bin/pyvenv\"" stub pyenv-which "pyvenv : echo \"${PYENV_ROOT}/versions/3.3.3/bin/pyvenv\""
stub pyenv-root "echo \"${PYENV_ROOT}\"" stub pyenv-root "echo \"${PYENV_ROOT}\""
remove_executable "3.4.1" "virtualenv"
create_executable "3.4.1" "pyvenv"
run pyenv-virtualenv --version run pyenv-virtualenv --version
assert_success unstub pyenv-which
assert_output "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (pyvenv 3.4.1)"
unstub pyenv-prefix
unstub pyenv-root unstub pyenv-root
assert_success
assert_output "pyenv-virtualenv ${PYENV_VIRTUALENV_VERSION} (pyvenv 3.3.3)"
} }

View File

@@ -102,19 +102,6 @@ ${PYENV_ROOT}/versions/3.3.3:${PYENV_ROOT}/versions/3.4.0
OUT OUT
} }
@test "should fail if the version is the system" {
stub pyenv-version-name "echo system"
PYENV_VERSION="system" run pyenv-virtualenv-prefix
unstub pyenv-version-name
assert_failure
assert_output <<OUT
pyenv-virtualenv: version \`system' is not a virtualenv
OUT
}
@test "should fail if the version is not a virtualenv" { @test "should fail if the version is not a virtualenv" {
stub pyenv-version-name "echo 3.4.0" stub pyenv-version-name "echo 3.4.0"
stub pyenv-prefix "3.4.0 : echo \"${PYENV_ROOT}/versions/3.4.0\"" stub pyenv-prefix "3.4.0 : echo \"${PYENV_ROOT}/versions/3.4.0\""

View File

@@ -7,142 +7,88 @@ setup() {
} }
stub_pyenv() { stub_pyenv() {
create_executable "${PYENV_VERSION}" "virtualenv" export PYENV_VERSION="$1"
remove_executable "${PYENV_VERSION}" "pyvenv" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/\${PYENV_VERSION}'"
stub pyenv-which "virtualenv : echo '${PYENV_ROOT}/versions/bin/virtualenv'" \
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" "pyvenv : false"
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
stub pyenv-prefix "echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'"
stub pyenv-hooks "virtualenv : echo" stub pyenv-hooks "virtualenv : echo"
stub pyenv-rehash " : echo rehashed" stub pyenv-rehash " : echo rehashed"
} }
unstub_pyenv() { unstub_pyenv() {
unset PYENV_VERSION
unstub pyenv-prefix unstub pyenv-prefix
unstub pyenv-which
unstub pyenv-hooks unstub pyenv-hooks
unstub pyenv-rehash unstub pyenv-rehash
} }
@test "create virtualenv from given version" { @test "create virtualenv from given version" {
export PYENV_VERSION="3.2.1" stub_pyenv "3.2.1"
stub_pyenv "${PYENV_VERSION}" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "virtualenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : false"
stub pyenv-exec "python */ez_setup.py : true"
stub pyenv-exec "python */get-pip.py : true"
stub curl true
stub curl true
run pyenv-virtualenv "3.2.1" "venv" run pyenv-virtualenv "3.2.1" "venv"
unstub_pyenv
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
rehashed rehashed
OUT OUT
unstub_pyenv
unstub pyenv-exec
unstub curl
} }
@test "create virtualenv from current version" { @test "create virtualenv from current version" {
export PYENV_VERSION="3.2.1" stub_pyenv "3.2.1"
stub_pyenv "${PYENV_VERSION}"
stub pyenv-version-name "echo \${PYENV_VERSION}" stub pyenv-version-name "echo \${PYENV_VERSION}"
stub pyenv-exec "virtualenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : false"
stub pyenv-exec "python */ez_setup.py : true"
stub pyenv-exec "python */get-pip.py : true"
stub curl true
stub curl true
run pyenv-virtualenv venv run pyenv-virtualenv venv
unstub_pyenv
unstub pyenv-version-name
unstub pyenv-exec
assert_success assert_success
assert_output <<OUT assert_output <<OUT
PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
rehashed rehashed
OUT OUT
unstub_pyenv
unstub pyenv-version-name
unstub pyenv-exec
unstub curl
} }
@test "create virtualenv with short options" { @test "create virtualenv with short options" {
export PYENV_VERSION="3.2.1" stub_pyenv "3.2.1"
stub_pyenv "${PYENV_VERSION}"
stub pyenv-version-name "echo \${PYENV_VERSION}" stub pyenv-version-name "echo \${PYENV_VERSION}"
stub pyenv-exec "virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : false"
stub pyenv-exec "python */ez_setup.py : true"
stub pyenv-exec "python */get-pip.py : true"
stub curl true
stub curl true
run pyenv-virtualenv -v -p python venv run pyenv-virtualenv -v -p python venv
assert_success
assert_output <<OUT
PYENV_VERSION=3.2.1 virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
rehashed
OUT
unstub_pyenv unstub_pyenv
unstub pyenv-version-name unstub pyenv-version-name
unstub pyenv-exec unstub pyenv-exec
unstub curl
assert_success
assert_output <<OUT
PYENV_VERSION=3.2.1 virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv
rehashed
OUT
} }
@test "create virtualenv with long options" { @test "create virtualenv with long options" {
export PYENV_VERSION="3.2.1" stub_pyenv "3.2.1"
stub_pyenv "${PYENV_VERSION}"
stub pyenv-version-name "echo \${PYENV_VERSION}" stub pyenv-version-name "echo \${PYENV_VERSION}"
stub pyenv-exec "virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\""
stub pyenv-exec "python -m ensurepip : false"
stub pyenv-exec "python */ez_setup.py : true"
stub pyenv-exec "python */get-pip.py : true"
stub curl true
stub curl true
run pyenv-virtualenv --verbose --python=python venv run pyenv-virtualenv --verbose --python=python venv
assert_success
assert_output <<OUT
PYENV_VERSION=3.2.1 virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv
Installing setuptools from https://bootstrap.pypa.io/ez_setup.py...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
rehashed
OUT
unstub_pyenv unstub_pyenv
unstub pyenv-version-name unstub pyenv-version-name
unstub pyenv-exec unstub pyenv-exec
unstub curl
}
@test "no whitespace allowed in virtualenv name" { assert_success
run pyenv-virtualenv "3.2.1" "foo bar"
assert_failure
assert_output <<OUT assert_output <<OUT
pyenv-virtualenv: no whitespace allowed in virtualenv name. PYENV_VERSION=3.2.1 virtualenv --verbose --python=python ${PYENV_ROOT}/versions/venv
OUT rehashed
}
@test "no tab allowed in virtualenv name" {
run pyenv-virtualenv "3.2.1" "foo bar baz"
assert_failure
assert_output <<OUT
pyenv-virtualenv: no whitespace allowed in virtualenv name.
OUT OUT
} }