From 249759aa04ab5b4a92464d4484c88669072cb5b5 Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Tue, 6 Oct 2015 12:52:27 +0000 Subject: [PATCH] add foolproof for `-p` argument. find proper source version from pyenv if the given executable is only basename or is a shim script. --- bin/pyenv-virtualenv | 21 ++++++++- test/python.bats | 101 +++++++++++++++++++++++++++++++++++++++++++ test/pyvenv.bats | 16 +++---- test/virtualenv.bats | 16 +++---- 4 files changed, 137 insertions(+), 17 deletions(-) create mode 100644 test/python.bats diff --git a/bin/pyenv-virtualenv b/bin/pyenv-virtualenv index 90aa712..26fa051 100755 --- a/bin/pyenv-virtualenv +++ b/bin/pyenv-virtualenv @@ -318,9 +318,28 @@ if [ -n "${USE_PYVENV}" ]; then # Unset some arguments not supported by pyvenv unset QUIET unset VERBOSE + if [ -n "${VIRTUALENV_PYTHON}" ]; then + echo "pyenv-virtualenv: \`--python=${VIRTUALENV_PYTHON}' is not supported by pyvenv." 1>&2 + exit 1 + fi else if [ -n "${VIRTUALENV_PYTHON}" ]; then - VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${VIRTUALENV_PYTHON}" + if [[ "${VIRTUALENV_PYTHON}" == "${VIRTUALENV_PYTHON##*/}" ]] || [[ "${VIRTUALENV_PYTHON}" == "${PYENV_ROOT}/shims/"* ]]; then + python="$(pyenv-which "${VIRTUALENV_PYTHON##*/}" 2>/dev/null || true)" + if [ -x "${python}" ]; then + VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${python}" + else + python="$(PYENV_VERSION="$(pyenv-whence "${VIRTUALENV_PYTHON##*/}" 2>/dev/null | tail -n 1 || true)" pyenv-which "${VIRTUALENV_PYTHON##*/}" 2>/dev/null || true)" + if [ -x "${python}" ]; then + VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${python}" + else + echo "pyenv-virtualenv: \`${VIRTUALENV_PYTHON##*/}' is not installed in pyenv." 1>&2 + exit 1 + fi + fi + else + VIRTUALENV_OPTIONS[${#VIRTUALENV_OPTIONS[*]}]="--python=${VIRTUALENV_PYTHON}" + fi fi if [ -z "${HAS_VIRTUALENV}" ]; then VIRTUALENV_VERSION="==${VIRTUALENV_VERSION}" diff --git a/test/python.bats b/test/python.bats new file mode 100644 index 0000000..aa82c20 --- /dev/null +++ b/test/python.bats @@ -0,0 +1,101 @@ +#!/usr/bin/env bats + +load test_helper + +setup() { + export PYENV_ROOT="${TMP}/pyenv" + export PYENV_VERSION="2.7.8" + create_executable "${PYENV_VERSION}" "virtualenv" + remove_executable "${PYENV_VERSION}" "pyvenv" + stub pyenv-prefix "echo '${PYENV_ROOT}/versions/${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-rehash " : true" + stub pyenv-version-name "echo \${PYENV_VERSION}" + stub curl true +} + +teardown() { + unstub curl + unstub pyenv-version-name + unstub pyenv-prefix + unstub pyenv-hooks + unstub pyenv-rehash + rm -fr "$TMP"/* +} + +@test "resolve python executable from enabled version" { + remove_executable "2.7.7" "python2.7" + create_executable "2.7.8" "python2.7" + remove_executable "2.7.9" "python2.7" + + stub pyenv-exec "virtualenv --verbose --python=${PYENV_ROOT}/versions/2.7.8/bin/python2.7 ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" + stub pyenv-exec "python -s -m ensurepip : true" + stub pyenv-which "python2.7 : echo ${PYENV_ROOT}/versions/2.7.8/bin/python2.7" + + run pyenv-virtualenv --verbose --python=python2.7 venv + + assert_output <