| #!/usr/bin/env bash |
|
|
| set -euo pipefail |
|
|
| ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" |
| cd "$ROOT_DIR" |
|
|
| if [ "$#" -eq 0 ]; then |
| set -- tests |
| fi |
|
|
| declare -a TRIED=() |
|
|
| run_python() { |
| local candidate="$1" |
| local label="$2" |
| local resolved="" |
| shift 2 |
|
|
| TRIED+=("$label: $candidate") |
|
|
| if [[ "$candidate" == */* ]]; then |
| if [ ! -x "$candidate" ]; then |
| return 1 |
| fi |
| resolved="$candidate" |
| else |
| resolved="$(command -v "$candidate" 2>/dev/null || true)" |
| if [ -z "$resolved" ]; then |
| return 1 |
| fi |
| fi |
|
|
| if "$resolved" -c "import pytest" >/dev/null 2>&1; then |
| printf "Using %s: %s\n" "$label" "$resolved" |
| exec "$resolved" -m pytest "$@" |
| fi |
|
|
| return 1 |
| } |
|
|
| run_uv() { |
| if ! command -v uv >/dev/null 2>&1 || [ ! -f "$ROOT_DIR/uv.lock" ]; then |
| return 1 |
| fi |
|
|
| TRIED+=("uv-managed environment: uv run python -m pytest") |
|
|
| if uv run python -c "import pytest" >/dev/null 2>&1; then |
| printf "Using uv-managed environment\n" |
| exec uv run python -m pytest "$@" |
| fi |
|
|
| return 1 |
| } |
|
|
| if [ -n "${PYTHON:-}" ]; then |
| if run_python "$PYTHON" "PYTHON override" "$@"; then |
| exit 0 |
| fi |
| printf "Configured PYTHON does not provide pytest: %s\n" "$PYTHON" >&2 |
| exit 1 |
| fi |
|
|
| if [ -n "${VIRTUAL_ENV:-}" ]; then |
| run_python "$VIRTUAL_ENV/bin/python" "active virtualenv" "$@" || true |
| fi |
|
|
| run_uv "$@" || true |
| run_python "$ROOT_DIR/.venv/bin/python" "repo .venv" "$@" || true |
| run_python "$ROOT_DIR/venv/bin/python" "repo venv" "$@" || true |
| run_python python "PATH python" "$@" || true |
| run_python python3 "PATH python3" "$@" || true |
|
|
| printf "Unable to find a Python environment with pytest available.\n" >&2 |
| printf "Tried:\n" >&2 |
| for entry in "${TRIED[@]}"; do |
| printf " - %s\n" "$entry" >&2 |
| done |
| printf "Set PYTHON=/path/to/python, activate a virtualenv, create .venv/venv, or sync the project environment.\n" >&2 |
| exit 1 |
|
|