Merge pull request #549 from yyuu/rbenv-1.0

rbenv 1.0+
This commit is contained in:
Yamashita, Yuu 2016-03-04 09:37:56 +09:00
commit 12069a1118
26 changed files with 269 additions and 256 deletions

2
.agignore Normal file
View file

@ -0,0 +1,2 @@
./versions
./cache

1
.vimrc Normal file
View file

@ -0,0 +1 @@
set wildignore+=versions/*,cache/*

80
CONDUCT.md Normal file
View file

@ -0,0 +1,80 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting one of the project maintainers listed below. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Project Maintainers
* Sam Stephenson <<sstephenson@gmail.com>>
* Mislav Marohnić <<mislav.marohnic@gmail.com>>
* Erik Michaels-Ober <<sferik@gmail.com>>
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View file

@ -1,23 +0,0 @@
#!/usr/bin/env bash
#
# `python-local-exec` is a drop-in replacement for the standard Python
# shebang line:
#
# #!/usr/bin/env python-local-exec
#
# Use it for scripts inside a project with an `.pyenv-version`
# file. When you run the scripts, they'll use the project-specified
# Python version, regardless of what directory they're run from. Useful
# for e.g. running project tasks in cron scripts without needing to
# `cd` into the project first.
set -e
export PYENV_DIR="${1%/*}"
[ -n "$PYENV_SILENCE_WARNINGS" ] || {
echo "pyenv: \`python-local-exec' is deprecated and will be removed in the next release."
echo " To upgrade: https://github.com/yyuu/pyenv/wiki/python-local-exec"
echo
} >&2
exec python "$@"

View file

@ -97,6 +97,7 @@ PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib
for plugin_hook in "${PYENV_ROOT}/plugins/"*/etc/pyenv.d; do for plugin_hook in "${PYENV_ROOT}/plugins/"*/etc/pyenv.d; do
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${plugin_hook}" PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${plugin_hook}"
done done
PYENV_HOOK_PATH="${PYENV_HOOK_PATH#:}"
export PYENV_HOOK_PATH export PYENV_HOOK_PATH
shopt -u nullglob shopt -u nullglob

View file

@ -15,12 +15,9 @@ set -e
version="20160303" version="20160303"
git_revision="" git_revision=""
for source_dir in "${BASH_SOURCE%/*}" "$PYENV_ROOT"; do if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then
if cd "$source_dir" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then
git_revision="$(git describe --tags HEAD 2>/dev/null || true)" git_revision="$(git describe --tags HEAD 2>/dev/null || true)"
git_revision="${git_revision#v}" git_revision="${git_revision#v}"
[ -z "$git_revision" ] || break
fi fi
done
echo "pyenv ${git_revision:-$version}" echo "pyenv ${git_revision:-$version}"

View file

@ -9,6 +9,8 @@ set -e
if [ "$1" = "--complete" ]; then if [ "$1" = "--complete" ]; then
echo exec echo exec
echo rehash echo rehash
echo version-name
echo version-origin
echo which echo which
exit exit
fi fi

View file

@ -33,9 +33,9 @@ done
shell="$1" shell="$1"
if [ -z "$shell" ]; then if [ -z "$shell" ]; then
shell="$(ps c -p "$PPID" -o 'ucomm=' 2>/dev/null || true)" shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
shell="${shell##-}"
shell="${shell%% *}" shell="${shell%% *}"
shell="${shell##-}"
shell="${shell:-$SHELL}" shell="${shell:-$SHELL}"
shell="${shell##*/}" shell="${shell##*/}"
fi fi

View file

@ -15,10 +15,6 @@
# `PYENV_VERSION' environment variable takes precedence over local # `PYENV_VERSION' environment variable takes precedence over local
# and global versions. # and global versions.
# #
# For backwards compatibility, pyenv will also read version
# specifications from `.pyenv-version' files, but a `.python-version'
# file in the same directory takes precedence.
#
# <version> should be a string matching a Python version known to pyenv. # <version> should be a string matching a Python version known to pyenv.
# The special version string `system' will use your default system Python. # The special version string `system' will use your default system Python.
# Run `pyenv versions' for a list of available Python versions. # Run `pyenv versions' for a list of available Python versions.
@ -36,27 +32,17 @@ fi
versions=("$@") versions=("$@")
if [ "$versions" = "--unset" ]; then if [ "$versions" = "--unset" ]; then
rm -f .python-version .pyenv-version rm -f .python-version
elif [ -n "$versions" ]; then elif [ -n "$versions" ]; then
previous_file="$(PYENV_VERSION= pyenv-version-origin || true)"
pyenv-version-file-write .python-version "${versions[@]}" pyenv-version-file-write .python-version "${versions[@]}"
if [ "$previous_file" -ef .pyenv-version ]; then
rm -f .pyenv-version
{ echo "pyenv: removed existing \`.pyenv-version' file and migrated"
echo " local version specification to \`.python-version' file"
} >&2
fi
else else
OLDIFS="$IFS" if version_file="$(pyenv-version-file "$PWD")"; then
IFS=: versions=($( IFS=: versions=($(pyenv-version-file-read "$version_file"))
pyenv-version-file-read .python-version ||
pyenv-version-file-read .pyenv-version ||
{ echo "pyenv: no local version configured for this directory"
exit 1
} >&2
))
IFS="$OLDIFS"
for version in "${versions[@]}"; do for version in "${versions[@]}"; do
echo "$version" echo "$version"
done done
else
echo "pyenv: no local version configured for this directory" >&2
exit 1
fi
fi fi

View file

@ -1,35 +1,28 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Usage: pyenv version-file [<dir>]
# Summary: Detect the file that sets the current pyenv version # Summary: Detect the file that sets the current pyenv version
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
target_dir="$1"
find_local_version_file() { find_local_version_file() {
local root="$1" local root="$1"
while true; do while ! [[ "$root" =~ ^//[^/]*$ ]]; do
[[ "$root" =~ ^//[^/]*$ ]] && break
if [ -e "${root}/.python-version" ]; then if [ -e "${root}/.python-version" ]; then
echo "${root}/.python-version" echo "${root}/.python-version"
exit return 0
elif [ -e "${root}/.pyenv-version" ]; then
echo "${root}/.pyenv-version"
exit
fi fi
[ -n "$root" ] || break [ -n "$root" ] || break
root="${root%/*}" root="${root%/*}"
done done
return 1
} }
find_local_version_file "$PYENV_DIR" if [ -n "$target_dir" ]; then
[ "$PYENV_DIR" = "$PWD" ] || find_local_version_file "$PWD" find_local_version_file "$target_dir"
global_version_file="${PYENV_ROOT}/version"
if [ -e "$global_version_file" ]; then
echo "$global_version_file"
elif [ -e "${PYENV_ROOT}/global" ]; then
echo "${PYENV_ROOT}/global"
elif [ -e "${PYENV_ROOT}/default" ]; then
echo "${PYENV_ROOT}/default"
else else
echo "$global_version_file" find_local_version_file "$PYENV_DIR" || {
[ "$PYENV_DIR" != "$PWD" ] && find_local_version_file "$PWD"
} || echo "${PYENV_ROOT}/version"
fi fi

View file

@ -8,6 +8,13 @@ if [ -z "$PYENV_VERSION" ]; then
PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)" PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)"
fi fi
OLDIFS="$IFS"
IFS=$'\n' scripts=(`pyenv-hooks version-name`)
IFS="$OLDIFS"
for script in "${scripts[@]}"; do
source "$script"
done
if [ -z "$PYENV_VERSION" ] || [ "$PYENV_VERSION" = "system" ]; then if [ -z "$PYENV_VERSION" ] || [ "$PYENV_VERSION" = "system" ]; then
echo "system" echo "system"
exit exit

View file

@ -3,7 +3,18 @@
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
if [ -n "$PYENV_VERSION" ]; then unset PYENV_VERSION_ORIGIN
OLDIFS="$IFS"
IFS=$'\n' scripts=(`pyenv-hooks version-origin`)
IFS="$OLDIFS"
for script in "${scripts[@]}"; do
source "$script"
done
if [ -n "$PYENV_VERSION_ORIGIN" ]; then
echo "$PYENV_VERSION_ORIGIN"
elif [ -n "$PYENV_VERSION" ]; then
echo "PYENV_VERSION environment variable" echo "PYENV_VERSION environment variable"
else else
pyenv-version-file pyenv-version-file

View file

@ -27,7 +27,7 @@ done
versions_dir="${PYENV_ROOT}/versions" versions_dir="${PYENV_ROOT}/versions"
if ! enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev/null; then if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; then
if [ -n "$PYENV_NATIVE_EXT" ]; then if [ -n "$PYENV_NATIVE_EXT" ]; then
echo "pyenv: failed to load \`realpath' builtin" >&2 echo "pyenv: failed to load \`realpath' builtin" >&2
exit 1 exit 1

View file

@ -2,22 +2,13 @@
load test_helper load test_helper
export GIT_DIR="${PYENV_TEST_DIR}/.git"
setup() { setup() {
mkdir -p "$HOME" mkdir -p "$HOME"
git config --global user.name "Tester" git config --global user.name "Tester"
git config --global user.email "tester@test.local" git config --global user.email "tester@test.local"
cd "$PYENV_TEST_DIR"
mkdir -p "${PYENV_TEST_DIR}/bin"
cat > "${PYENV_TEST_DIR}/bin/git" <<CMD
#!$BASH
if [[ \$1 == remote && \$PWD != "\$PYENV_TEST_DIR"/* ]]; then
echo "not allowed" >&2
exit 1
else
exec $(which git) "\$@"
fi
CMD
chmod +x "${PYENV_TEST_DIR}/bin/git"
} }
git_commit() { git_commit() {
@ -32,22 +23,17 @@ git_commit() {
} }
@test "doesn't read version from non-pyenv repo" { @test "doesn't read version from non-pyenv repo" {
mkdir -p "$PYENV_ROOT"
cd "$PYENV_ROOT"
git init git init
git remote add origin https://github.com/homebrew/homebrew.git git remote add origin https://github.com/homebrew/homebrew.git
git_commit git_commit
git tag v1.0 git tag v1.0
cd "$PYENV_TEST_DIR"
run pyenv---version run pyenv---version
assert_success assert_success
[[ $output == "pyenv 20"* ]] [[ $output == "pyenv 20"* ]]
} }
@test "reads version from git repo" { @test "reads version from git repo" {
mkdir -p "$PYENV_ROOT"
cd "$PYENV_ROOT"
git init git init
git remote add origin https://github.com/yyuu/pyenv.git git remote add origin https://github.com/yyuu/pyenv.git
git_commit git_commit
@ -55,20 +41,15 @@ git_commit() {
git_commit git_commit
git_commit git_commit
cd "$PYENV_TEST_DIR"
run pyenv---version run pyenv---version
assert_success assert_success "pyenv 20380119-2-g$(git rev-parse --short HEAD)"
[[ $output == "pyenv 20380119-2-g"* ]]
} }
@test "prints default version if no tags in git repo" { @test "prints default version if no tags in git repo" {
mkdir -p "$PYENV_ROOT"
cd "$PYENV_ROOT"
git init git init
git remote add origin https://github.com/yyuu/pyenv.git git remote add origin https://github.com/yyuu/pyenv.git
git_commit git_commit
cd "$PYENV_TEST_DIR"
run pyenv---version run pyenv---version
[[ $output == "pyenv 20"* ]] [[ $output == "pyenv 20"* ]]
} }

View file

@ -43,27 +43,14 @@ python
OUT OUT
} }
@test "supports hook path with spaces" {
hook_path="${PYENV_TEST_DIR}/custom stuff/pyenv hooks"
mkdir -p "${hook_path}/exec"
echo "export HELLO='from hook'" > "${hook_path}/exec/hello.bash"
export PYENV_VERSION=system
PYENV_HOOK_PATH="$hook_path" run pyenv-exec env
assert_success
assert_line "HELLO=from hook"
}
@test "carries original IFS within hooks" { @test "carries original IFS within hooks" {
hook_path="${PYENV_TEST_DIR}/pyenv.d" create_hook exec hello.bash <<SH
mkdir -p "${hook_path}/exec"
cat > "${hook_path}/exec/hello.bash" <<SH
hellos=(\$(printf "hello\\tugly world\\nagain")) hellos=(\$(printf "hello\\tugly world\\nagain"))
echo HELLO="\$(printf ":%s" "\${hellos[@]}")" echo HELLO="\$(printf ":%s" "\${hellos[@]}")"
SH SH
export PYENV_VERSION=system export PYENV_VERSION=system
PYENV_HOOK_PATH="$hook_path" IFS=$' \t\n' run pyenv-exec env IFS=$' \t\n' run pyenv-exec env
assert_success assert_success
assert_line "HELLO=:hello:ugly:world:again" assert_line "HELLO=:hello:ugly:world:again"
} }

View file

@ -3,7 +3,7 @@
load test_helper load test_helper
@test "default" { @test "default" {
run pyenv global run pyenv-global
assert_success assert_success
assert_output "system" assert_output "system"
} }
@ -20,7 +20,7 @@ load test_helper
mkdir -p "$PYENV_ROOT/versions/1.2.3" mkdir -p "$PYENV_ROOT/versions/1.2.3"
run pyenv-global "1.2.3" run pyenv-global "1.2.3"
assert_success assert_success
run pyenv global run pyenv-global
assert_success "1.2.3" assert_success "1.2.3"
} }

View file

@ -2,11 +2,6 @@
load test_helper load test_helper
create_hook() {
mkdir -p "$1/$2"
touch "$1/$2/$3"
}
@test "prints usage help given no argument" { @test "prints usage help given no argument" {
run pyenv-hooks run pyenv-hooks
assert_failure "Usage: pyenv hooks <command>" assert_failure "Usage: pyenv hooks <command>"
@ -15,11 +10,13 @@ create_hook() {
@test "prints list of hooks" { @test "prints list of hooks" {
path1="${PYENV_TEST_DIR}/pyenv.d" path1="${PYENV_TEST_DIR}/pyenv.d"
path2="${PYENV_TEST_DIR}/etc/pyenv_hooks" path2="${PYENV_TEST_DIR}/etc/pyenv_hooks"
create_hook "$path1" exec "hello.bash" PYENV_HOOK_PATH="$path1"
create_hook "$path1" exec "ahoy.bash" create_hook exec "hello.bash"
create_hook "$path1" exec "invalid.sh" create_hook exec "ahoy.bash"
create_hook "$path1" which "boom.bash" create_hook exec "invalid.sh"
create_hook "$path2" exec "bueno.bash" create_hook which "boom.bash"
PYENV_HOOK_PATH="$path2"
create_hook exec "bueno.bash"
PYENV_HOOK_PATH="$path1:$path2" run pyenv-hooks exec PYENV_HOOK_PATH="$path1:$path2" run pyenv-hooks exec
assert_success assert_success
@ -33,8 +30,10 @@ OUT
@test "supports hook paths with spaces" { @test "supports hook paths with spaces" {
path1="${PYENV_TEST_DIR}/my hooks/pyenv.d" path1="${PYENV_TEST_DIR}/my hooks/pyenv.d"
path2="${PYENV_TEST_DIR}/etc/pyenv hooks" path2="${PYENV_TEST_DIR}/etc/pyenv hooks"
create_hook "$path1" exec "hello.bash" PYENV_HOOK_PATH="$path1"
create_hook "$path2" exec "ahoy.bash" create_hook exec "hello.bash"
PYENV_HOOK_PATH="$path2"
create_hook exec "ahoy.bash"
PYENV_HOOK_PATH="$path1:$path2" run pyenv-hooks exec PYENV_HOOK_PATH="$path1:$path2" run pyenv-hooks exec
assert_success assert_success
@ -45,8 +44,8 @@ OUT
} }
@test "resolves relative paths" { @test "resolves relative paths" {
path="${PYENV_TEST_DIR}/pyenv.d" PYENV_HOOK_PATH="${PYENV_TEST_DIR}/pyenv.d"
create_hook "$path" exec "hello.bash" create_hook exec "hello.bash"
mkdir -p "$HOME" mkdir -p "$HOME"
PYENV_HOOK_PATH="${HOME}/../pyenv.d" run pyenv-hooks exec PYENV_HOOK_PATH="${HOME}/../pyenv.d" run pyenv-hooks exec

View file

@ -25,12 +25,24 @@ load test_helper
} }
@test "detect parent shell" { @test "detect parent shell" {
root="$(cd $BATS_TEST_DIRNAME/.. && pwd)"
SHELL=/bin/false run pyenv-init - SHELL=/bin/false run pyenv-init -
assert_success assert_success
assert_line "export PYENV_SHELL=bash" assert_line "export PYENV_SHELL=bash"
} }
@test "detect parent shell from script" {
mkdir -p "$PYENV_TEST_DIR"
cd "$PYENV_TEST_DIR"
cat > myscript.sh <<OUT
#!/bin/sh
eval "\$(pyenv-init -)"
echo \$PYENV_SHELL
OUT
chmod +x myscript.sh
run ./myscript.sh /bin/zsh
assert_success "sh"
}
@test "setup shell completions (fish)" { @test "setup shell completions (fish)" {
root="$(cd $BATS_TEST_DIRNAME/.. && pwd)" root="$(cd $BATS_TEST_DIRNAME/.. && pwd)"
run pyenv-init - fish run pyenv-init - fish

View file

@ -19,24 +19,11 @@ setup() {
assert_success "1.2.3" assert_success "1.2.3"
} }
@test "supports legacy .pyenv-version file" { @test "discovers version file in parent directory" {
echo "1.2.3" > .pyenv-version
run pyenv-local
assert_success "1.2.3"
}
@test "local .python-version has precedence over .pyenv-version" {
echo "2.7" > .pyenv-version
echo "3.4" > .python-version
run pyenv-local
assert_success "3.4"
}
@test "ignores version in parent directory" {
echo "1.2.3" > .python-version echo "1.2.3" > .python-version
mkdir -p "subdir" && cd "subdir" mkdir -p "subdir" && cd "subdir"
run pyenv-local run pyenv-local
assert_failure assert_success "1.2.3"
} }
@test "ignores PYENV_DIR" { @test "ignores PYENV_DIR" {
@ -64,40 +51,9 @@ setup() {
assert [ "$(cat .python-version)" = "1.2.3" ] assert [ "$(cat .python-version)" = "1.2.3" ]
} }
@test "renames .pyenv-version to .python-version" {
echo "2.7.6" > .pyenv-version
mkdir -p "${PYENV_ROOT}/versions/3.3.3"
run pyenv-local
assert_success "2.7.6"
run pyenv-local "3.3.3"
assert_success
assert_output <<OUT
pyenv: removed existing \`.pyenv-version' file and migrated
local version specification to \`.python-version' file
OUT
assert [ ! -e .pyenv-version ]
assert [ "$(cat .python-version)" = "3.3.3" ]
}
@test "doesn't rename .pyenv-version if changing the version failed" {
echo "2.7.6" > .pyenv-version
assert [ ! -e "${PYENV_ROOT}/versions/3.3.3" ]
run pyenv-local "3.3.3"
assert_failure "pyenv: version \`3.3.3' not installed"
assert [ ! -e .python-version ]
assert [ "$(cat .pyenv-version)" = "2.7.6" ]
}
@test "unsets local version" { @test "unsets local version" {
touch .python-version touch .python-version
run pyenv-local --unset run pyenv-local --unset
assert_success "" assert_success ""
assert [ ! -e .pyenv-version ] assert [ ! -e .python-version ]
}
@test "unsets alternate version file" {
touch .pyenv-version
run pyenv-local --unset
assert_success ""
assert [ ! -e .pyenv-version ]
} }

View file

@ -70,6 +70,7 @@ load test_helper
} }
@test "PYENV_HOOK_PATH includes pyenv built-in plugins" { @test "PYENV_HOOK_PATH includes pyenv built-in plugins" {
unset PYENV_HOOK_PATH
run pyenv echo "PYENV_HOOK_PATH" run pyenv echo "PYENV_HOOK_PATH"
assert_success ":${PYENV_ROOT}/pyenv.d:${BATS_TEST_DIRNAME%/*}/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks" assert_success "${PYENV_ROOT}/pyenv.d:${BATS_TEST_DIRNAME%/*}/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks"
} }

View file

@ -86,15 +86,13 @@ OUT
} }
@test "carries original IFS within hooks" { @test "carries original IFS within hooks" {
hook_path="${PYENV_TEST_DIR}/pyenv.d" create_hook rehash hello.bash <<SH
mkdir -p "${hook_path}/rehash"
cat > "${hook_path}/rehash/hello.bash" <<SH
hellos=(\$(printf "hello\\tugly world\\nagain")) hellos=(\$(printf "hello\\tugly world\\nagain"))
echo HELLO="\$(printf ":%s" "\${hellos[@]}")" echo HELLO="\$(printf ":%s" "\${hellos[@]}")"
exit exit
SH SH
PYENV_HOOK_PATH="$hook_path" IFS=$' \t\n' run pyenv-rehash IFS=$' \t\n' run pyenv-rehash
assert_success assert_success
assert_output "HELLO=:hello:ugly:world:again" assert_output "HELLO=:hello:ugly:world:again"
} }

View file

@ -17,6 +17,7 @@ if [ -z "$PYENV_TEST_DIR" ]; then
export PYENV_ROOT="${PYENV_TEST_DIR}/root" export PYENV_ROOT="${PYENV_TEST_DIR}/root"
export HOME="${PYENV_TEST_DIR}/home" export HOME="${PYENV_TEST_DIR}/home"
export PYENV_HOOK_PATH="${PYENV_ROOT}/pyenv.d"
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
PATH="${PYENV_TEST_DIR}/bin:$PATH" PATH="${PYENV_TEST_DIR}/bin:$PATH"
@ -129,3 +130,11 @@ path_without() {
path="${path#:}" path="${path#:}"
echo "${path%:}" echo "${path%:}"
} }
create_hook() {
mkdir -p "${PYENV_HOOK_PATH}/$1"
touch "${PYENV_HOOK_PATH}/$1/$2"
if [ ! -t 0 ]; then
cat > "${PYENV_HOOK_PATH}/$1/$2"
fi
}

View file

@ -12,6 +12,12 @@ create_file() {
touch "$1" touch "$1"
} }
@test "detects global 'version' file" {
create_file "${PYENV_ROOT}/version"
run pyenv-version-file
assert_success "${PYENV_ROOT}/version"
}
@test "prints global file if no version files exist" { @test "prints global file if no version files exist" {
assert [ ! -e "${PYENV_ROOT}/version" ] assert [ ! -e "${PYENV_ROOT}/version" ]
assert [ ! -e ".python-version" ] assert [ ! -e ".python-version" ]
@ -19,45 +25,12 @@ create_file() {
assert_success "${PYENV_ROOT}/version" assert_success "${PYENV_ROOT}/version"
} }
@test "detects 'global' file" {
create_file "${PYENV_ROOT}/global"
run pyenv-version-file
assert_success "${PYENV_ROOT}/global"
}
@test "detects 'default' file" {
create_file "${PYENV_ROOT}/default"
run pyenv-version-file
assert_success "${PYENV_ROOT}/default"
}
@test "'version' has precedence over 'global' and 'default'" {
create_file "${PYENV_ROOT}/version"
create_file "${PYENV_ROOT}/global"
create_file "${PYENV_ROOT}/default"
run pyenv-version-file
assert_success "${PYENV_ROOT}/version"
}
@test "in current directory" { @test "in current directory" {
create_file ".python-version" create_file ".python-version"
run pyenv-version-file run pyenv-version-file
assert_success "${PYENV_TEST_DIR}/.python-version" assert_success "${PYENV_TEST_DIR}/.python-version"
} }
@test "legacy file in current directory" {
create_file ".pyenv-version"
run pyenv-version-file
assert_success "${PYENV_TEST_DIR}/.pyenv-version"
}
@test ".python-version has precedence over legacy file" {
create_file ".python-version"
create_file ".pyenv-version"
run pyenv-version-file
assert_success "${PYENV_TEST_DIR}/.python-version"
}
@test "in parent directory" { @test "in parent directory" {
create_file ".python-version" create_file ".python-version"
mkdir -p project mkdir -p project
@ -74,14 +47,6 @@ create_file() {
assert_success "${PYENV_TEST_DIR}/project/.python-version" assert_success "${PYENV_TEST_DIR}/project/.python-version"
} }
@test "legacy file has precedence if higher" {
create_file ".python-version"
create_file "project/.pyenv-version"
cd project
run pyenv-version-file
assert_success "${PYENV_TEST_DIR}/project/.pyenv-version"
}
@test "PYENV_DIR has precedence over PWD" { @test "PYENV_DIR has precedence over PWD" {
create_file "widget/.python-version" create_file "widget/.python-version"
create_file "project/.python-version" create_file "project/.python-version"
@ -97,3 +62,14 @@ create_file() {
PYENV_DIR="${PYENV_TEST_DIR}/widget/blank" run pyenv-version-file PYENV_DIR="${PYENV_TEST_DIR}/widget/blank" run pyenv-version-file
assert_success "${PYENV_TEST_DIR}/project/.python-version" assert_success "${PYENV_TEST_DIR}/project/.python-version"
} }
@test "finds version file in target directory" {
create_file "project/.python-version"
run pyenv-version-file "${PWD}/project"
assert_success "${PYENV_TEST_DIR}/project/.python-version"
}
@test "fails when no version file in target directory" {
run pyenv-version-file "$PWD"
assert_failure ""
}

View file

@ -22,29 +22,50 @@ setup() {
assert_success "system" assert_success "system"
} }
@test "PYENV_VERSION can be overridden by hook" {
create_version "2.7.11"
create_version "3.5.1"
create_hook version-name test.bash <<<"PYENV_VERSION=3.5.1"
PYENV_VERSION=2.7.11 run pyenv-version-name
assert_success "3.5.1"
}
@test "carries original IFS within hooks" {
create_hook version-name hello.bash <<SH
hellos=(\$(printf "hello\\tugly world\\nagain"))
echo HELLO="\$(printf ":%s" "\${hellos[@]}")"
SH
export PYENV_VERSION=system
IFS=$' \t\n' run pyenv-version-name env
assert_success
assert_line "HELLO=:hello:ugly:world:again"
}
@test "PYENV_VERSION has precedence over local" { @test "PYENV_VERSION has precedence over local" {
create_version "2.7.6" create_version "2.7.11"
create_version "3.3.3" create_version "3.5.1"
cat > ".python-version" <<<"2.7.6" cat > ".python-version" <<<"2.7.11"
run pyenv-version-name run pyenv-version-name
assert_success "2.7.6" assert_success "2.7.11"
PYENV_VERSION=3.3.3 run pyenv-version-name PYENV_VERSION=3.5.1 run pyenv-version-name
assert_success "3.3.3" assert_success "3.5.1"
} }
@test "local file has precedence over global" { @test "local file has precedence over global" {
create_version "2.7.6" create_version "2.7.11"
create_version "3.3.3" create_version "3.5.1"
cat > "${PYENV_ROOT}/version" <<<"2.7.6" cat > "${PYENV_ROOT}/version" <<<"2.7.11"
run pyenv-version-name run pyenv-version-name
assert_success "2.7.6" assert_success "2.7.11"
cat > ".python-version" <<<"3.3.3" cat > ".python-version" <<<"3.5.1"
run pyenv-version-name run pyenv-version-name
assert_success "3.3.3" assert_success "3.5.1"
} }
@test "missing version" { @test "missing version" {
@ -53,22 +74,22 @@ setup() {
} }
@test "one missing version (second missing)" { @test "one missing version (second missing)" {
create_version "3.4.2" create_version "3.5.1"
PYENV_VERSION="3.4.2:1.2" run pyenv-version-name PYENV_VERSION="3.5.1:1.2" run pyenv-version-name
assert_failure assert_failure
assert_output <<OUT assert_output <<OUT
pyenv: version \`1.2' is not installed (set by PYENV_VERSION environment variable) pyenv: version \`1.2' is not installed (set by PYENV_VERSION environment variable)
3.4.2 3.5.1
OUT OUT
} }
@test "one missing version (first missing)" { @test "one missing version (first missing)" {
create_version "3.4.2" create_version "3.5.1"
PYENV_VERSION="1.2:3.4.2" run pyenv-version-name PYENV_VERSION="1.2:3.5.1" run pyenv-version-name
assert_failure assert_failure
assert_output <<OUT assert_output <<OUT
pyenv: version \`1.2' is not installed (set by PYENV_VERSION environment variable) pyenv: version \`1.2' is not installed (set by PYENV_VERSION environment variable)
3.4.2 3.5.1
OUT OUT
} }
@ -77,18 +98,18 @@ pyenv-version-name-without-stderr() {
} }
@test "one missing version (without stderr)" { @test "one missing version (without stderr)" {
create_version "3.4.2" create_version "3.5.1"
PYENV_VERSION="1.2:3.4.2" run pyenv-version-name-without-stderr PYENV_VERSION="1.2:3.5.1" run pyenv-version-name-without-stderr
assert_failure assert_failure
assert_output <<OUT assert_output <<OUT
3.4.2 3.5.1
OUT OUT
} }
@test "version with prefix in name" { @test "version with prefix in name" {
create_version "2.7.6" create_version "2.7.11"
cat > ".python-version" <<<"python-2.7.6" cat > ".python-version" <<<"python-2.7.11"
run pyenv-version-name run pyenv-version-name
assert_success assert_success
assert_output "2.7.6" assert_output "2.7.11"
} }

View file

@ -31,8 +31,26 @@ setup() {
assert_success "${PWD}/.python-version" assert_success "${PWD}/.python-version"
} }
@test "detects alternate version file" { @test "reports from hook" {
touch .pyenv-version create_hook version-origin test.bash <<<"PYENV_VERSION_ORIGIN=plugin"
run pyenv-version-origin
assert_success "${PWD}/.pyenv-version" PYENV_VERSION=1 run pyenv-version-origin
assert_success "plugin"
}
@test "carries original IFS within hooks" {
create_hook version-origin hello.bash <<SH
hellos=(\$(printf "hello\\tugly world\\nagain"))
echo HELLO="\$(printf ":%s" "\${hellos[@]}")"
SH
export PYENV_VERSION=system
IFS=$' \t\n' run pyenv-version-origin env
assert_success
assert_line "HELLO=:hello:ugly:world:again"
}
@test "doesn't inherit PYENV_VERSION_ORIGIN from environment" {
PYENV_VERSION_ORIGIN=ignored run pyenv-version-origin
assert_success "${PYENV_ROOT}/version"
} }

View file

@ -113,15 +113,13 @@ OUT
} }
@test "carries original IFS within hooks" { @test "carries original IFS within hooks" {
hook_path="${PYENV_TEST_DIR}/pyenv.d" create_hook which hello.bash <<SH
mkdir -p "${hook_path}/which"
cat > "${hook_path}/which/hello.bash" <<SH
hellos=(\$(printf "hello\\tugly world\\nagain")) hellos=(\$(printf "hello\\tugly world\\nagain"))
echo HELLO="\$(printf ":%s" "\${hellos[@]}")" echo HELLO="\$(printf ":%s" "\${hellos[@]}")"
exit exit
SH SH
PYENV_HOOK_PATH="$hook_path" IFS=$' \t\n' PYENV_VERSION=system run pyenv-which anything IFS=$' \t\n' PYENV_VERSION=system run pyenv-which anything
assert_success assert_success
assert_output "HELLO=:hello:ugly:world:again" assert_output "HELLO=:hello:ugly:world:again"
} }