Skip to content

Instantly share code, notes, and snippets.

@igorlg
Created May 30, 2019 04:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save igorlg/1a3715379e6282571b9e2fa0823fd084 to your computer and use it in GitHub Desktop.
Save igorlg/1a3715379e6282571b9e2fa0823fd084 to your computer and use it in GitHub Desktop.
Improved Python version display for PyEnv

List available PyEnv versions

Usage: /Users/igor/Applications/bin/pyver [options] [filter]

Filters: -M: Display only the latest Major versions (default) -m: Display only the latest Minor versions -p: Display all versions -i: Display installed versions

Options: -r: Raw output (no color) -h: Displays this message

Example

Show only the latest version for each Major version available:

$ pyver -M
3.7.3 (installed)
2.7.16

Show only the latest version for each Minor version available:

$ pyver -m
3.7.3 (installed)
3.6.8
3.5.7
3.4.10
3.3.7
3.2.6
3.1.5
3.0.1
2.7.16
2.6.9
2.5.6
2.4.6
2.3.7
2.2.3
2.1.3
#!/usr/bin/env bash
function available_versions() {
pyenv install -l | awk '{ print $1 }' | egrep "^\d+\.\d+\.\d+$" | tail -r
}
function installed_versions() {
pyenv versions | awk '{ print $1 }' | egrep "^\d+\.\d+\.\d+$" | tail -r
}
function filter_versions() {
case $1 in
M) available_versions | sort -u -t. -k1,1 | tail -r ;;
m) available_versions | sort -u -t. -k1,1 -k2,2 | tail -r ;;
*) available_versions ;;
esac
}
function contains() {
[[ "$1" =~ (^|[[:space:]])$2($|[[:space:]]) ]] && return 0 || return 1
}
function b() {
if [ "$RAW" != "yes" ]; then
echo "$(tput bold)${1}$(tput sgr0)"
else
echo "$1"
fi
}
function show_versions() {
inst_vers="$(installed_versions | paste -sd '|' -)"
for i in $(echo -e "$1"); do
if $(contains $i $inst_vers); then
#echo "${bold}$i (installed)${normal}"
b "$i (installed)"
else
echo "$i"
fi
done
}
function help() {
if [[ $# -gt 1 ]]; then
echo "Unknown parameter '$2'"
else
echo "List available PyEnv versions:"
fi
echo " Usage: $0 [options] [filter]"
echo
b " Filters:"
echo " -M: Display only the latest Major versions (default)"
echo " -m: Display only the latest Minor versions"
echo " -p: Display all versions"
echo " -i: Display installed versions"
echo
b " Options:"
echo " -r: Raw output (no color)"
echo " -h: Displays this message"
echo
exit $1
}
FILTER="M"
RAW=""
ACTION="available"
EXIT=0
MSG=""
while [[ $# -gt 0 ]]; do
case $1 in
-M) FILTER="M" ;;
-m) FILTER="m" ;;
-p) FILTER="p" ;;
-r) RAW="yes" ;;
-i) ACTION="installed" ;;
-h) ACTION="help" ;;
*) ACTION="error" ; MSG="$1" ;;
esac
shift
done
case $ACTION in
available) show_versions "$(filter_versions $FILTER)" ;;
installed) installed_versions ;;
help) help 0 ;;
error) help 1 "$MSG" ;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment