From 7c8805c343536e147f09131137d9f743bcb100ff Mon Sep 17 00:00:00 2001 From: Yamashita Yuu Date: Fri, 27 Jun 2014 00:03:35 +0900 Subject: [PATCH 1/2] Use same _ensurepip_ logic as python-build --- bin/pyenv-virtualenv | 62 +++++++++++++++--------------- test/pip.bats | 80 +++++++++++++++++++++++++++++++++++++++ test/pyvenv.bats | 90 ++++++++++++++------------------------------ test/virtualenv.bats | 31 +++++++-------- 4 files changed, 156 insertions(+), 107 deletions(-) create mode 100644 test/pip.bats diff --git a/bin/pyenv-virtualenv b/bin/pyenv-virtualenv index 8ac0370..ce326dc 100755 --- a/bin/pyenv-virtualenv +++ b/bin/pyenv-virtualenv @@ -144,44 +144,56 @@ venv() { pyenv-exec pyvenv "${args[@]}" local last="${args[${#args[@]}-1]}" - ensurepip "${last##*/}" + ( export PYENV_VERSION="${last##*/}" + build_package_ensurepip + ) else pyenv-exec virtualenv "${args[@]}" fi } -install_setuptools() { - local version="$1" +build_package_ez_setup() { + local ez_setup="${PYENV_VIRTUALENV_CACHE_PATH}/ez_setup.py" + rm -f "${ez_setup}" { if [ "${EZ_SETUP+defined}" ] && [ -f "${EZ_SETUP}" ]; then - if [ -n "$VERBOSE" ]; then - echo "Installing setuptools from ${EZ_SETUP}..." 1>&2 - fi + echo "Installing setuptools from ${EZ_SETUP}..." 1>&2 cat "${EZ_SETUP}" else [ -n "${EZ_SETUP_URL}" ] || EZ_SETUP_URL="https://bootstrap.pypa.io/ez_setup.py" - if [ -n "$VERBOSE" ]; then - echo "Installing setuptools from ${EZ_SETUP_URL}..." 1>&2 - fi + echo "Installing setuptools from ${EZ_SETUP_URL}..." 1>&2 http get "${EZ_SETUP_URL}" fi - } | PYENV_VERSION="${version}" pyenv-exec python + } 1> "${ez_setup}" + pyenv-exec python "${ez_setup}" ${EZ_SETUP_OPTS} 1>&2 || { + echo "error: failed to install setuptools via ez_setup.py" >&2 + return 1 + } } -install_pip() { - local version="$1" +build_package_get_pip() { + local get_pip="${PYENV_VIRTUALENV_CACHE_PATH}/get-pip.py" + rm -f "${get_pip}" { if [ "${GET_PIP+defined}" ] && [ -f "${GET_PIP}" ]; then - if [ -n "$VERBOSE" ]; then - echo "Installing pip from ${GET_PIP}..." 1>&2 - fi + echo "Installing pip from ${GET_PIP}..." 1>&2 cat "${GET_PIP}" else [ -n "${GET_PIP_URL}" ] || GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" - if [ -n "$VERBOSE" ]; then - echo "Installing pip from ${GET_PIP_URL}..." 1>&2 - fi + echo "Installing pip from ${GET_PIP_URL}..." 1>&2 http get "${GET_PIP_URL}" fi - } | PYENV_VERSION="${version}" pyenv-exec python + } 1> "${get_pip}" + 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() { + pyenv-exec python -m ensurepip 2>/dev/null|| { + build_package_ez_setup "$@" && build_package_get_pip "$@" + } || return 1 + +# create_symlinks "$(pyenv-exec python -c 'import sys;v=sys.version_info;sys.stdout.write("python%d.%d"%(v[0],v[1]))')" } install_virtualenv() { @@ -190,18 +202,6 @@ install_virtualenv() { PYENV_VERSION="${version}" pyenv-exec pip install $QUIET $VERBOSE "virtualenv${VIRTUALENV_VERSION%==}" } -ensurepip() { - local version="$1" - PYENV_VERSION="${version}" pyenv-exec python -m ensurepip 2>/dev/null || { - 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 - } -} - create_symlinks() { local version="$1" local suffix="$(PYENV_VERSION="${version}" pyenv-exec python -c 'import sys;v=sys.version_info;sys.stdout.write("%d.%d"%(v[0],v[1]))')" diff --git a/test/pip.bats b/test/pip.bats new file mode 100644 index 0000000..0d901b2 --- /dev/null +++ b/test/pip.bats @@ -0,0 +1,80 @@ +#!/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/pip3.4" + stub pyenv-exec "python -c * : echo ${PYENV_VERSION%.*}" + + remove_executable "3.4.1" "virtualenv" + create_executable "3.4.1" "pyvenv" + + run pyenv-virtualenv venv + + assert_success + assert_output < Date: Sat, 28 Jun 2014 00:58:27 +0900 Subject: [PATCH 2/2] Run _ensurepip_ after the every creation of virtualenv/pyvenv --- bin/pyenv-virtualenv | 15 +++++++-------- test/pyvenv.bats | 19 +++++++++++++++++++ test/virtualenv.bats | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 8 deletions(-) diff --git a/bin/pyenv-virtualenv b/bin/pyenv-virtualenv index ce326dc..f149e35 100755 --- a/bin/pyenv-virtualenv +++ b/bin/pyenv-virtualenv @@ -142,11 +142,6 @@ venv() { local args=("$@") if [ -n "${USE_PYVENV}" ]; then pyenv-exec pyvenv "${args[@]}" - - local last="${args[${#args[@]}-1]}" - ( export PYENV_VERSION="${last##*/}" - build_package_ensurepip - ) else pyenv-exec virtualenv "${args[@]}" fi @@ -203,8 +198,7 @@ install_virtualenv() { } create_symlinks() { - local version="$1" - local suffix="$(PYENV_VERSION="${version}" pyenv-exec python -c 'import sys;v=sys.version_info;sys.stdout.write("%d.%d"%(v[0],v[1]))')" + local suffix="$1" local file link shopt -s nullglob @@ -429,12 +423,17 @@ mkdir -p "${PYENV_VIRTUALENV_CACHE_PATH}" cd "${PYENV_VIRTUALENV_CACHE_PATH}" venv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?" +## Install setuptools and pip +( export PYENV_VERSION="${VIRTUALENV_NAME}" + build_package_ensurepip +) + ## Migrate previously installed packages from requirements.txt if [ -n "$UPGRADE" ]; then upgrade "${VIRTUALENV_NAME}" "${VIRTUALENV_PATH}" || STATUS="$?" fi -create_symlinks "${VIRTUALENV_NAME}" +create_symlinks "$(PYENV_VERSION="${VIRTUALENV_NAME}" pyenv-exec python -c 'import sys;v=sys.version_info;sys.stdout.write("python%d.%d"%(v[0],v[1]))')" # Execute `after_virtualenv` hooks for hook in "${after_hooks[@]}"; do eval "$hook"; done diff --git a/test/pyvenv.bats b/test/pyvenv.bats index 130b748..361fc2f 100644 --- a/test/pyvenv.bats +++ b/test/pyvenv.bats @@ -50,6 +50,7 @@ OUT stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "virtualenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" + stub pyenv-exec "python -m ensurepip : true" stub pyenv-exec "python -c * : echo ${PYENV_VERSION%.*}" create_executable "3.4.1" "virtualenv" @@ -74,7 +75,12 @@ OUT stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "pip install virtualenv : 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 pyenv-exec "python -c * : echo ${PYENV_VERSION%.*}" + stub curl true + stub curl true remove_executable "3.2.1" "virtualenv" remove_executable "3.2.1" "pyvenv" @@ -85,11 +91,14 @@ OUT assert_output <