test.sh 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
  4. cd "$ROOT_DIR"
  5. if [ "$#" -eq 0 ]; then
  6. set -- tests
  7. fi
  8. declare -a TRIED=()
  9. run_python() {
  10. local candidate="$1"
  11. local label="$2"
  12. local resolved=""
  13. shift 2
  14. TRIED+=("$label: $candidate")
  15. if [[ "$candidate" == */* ]]; then
  16. if [ ! -x "$candidate" ]; then
  17. return 1
  18. fi
  19. resolved="$candidate"
  20. else
  21. resolved="$(command -v "$candidate" 2>/dev/null || true)"
  22. if [ -z "$resolved" ]; then
  23. return 1
  24. fi
  25. fi
  26. if "$resolved" -c "import pytest" >/dev/null 2>&1; then
  27. printf "Using %s: %s\n" "$label" "$resolved"
  28. exec "$resolved" -m pytest "$@"
  29. fi
  30. return 1
  31. }
  32. run_uv() {
  33. if ! command -v uv >/dev/null 2>&1 || [ ! -f "$ROOT_DIR/uv.lock" ]; then
  34. return 1
  35. fi
  36. TRIED+=("uv-managed environment: uv run python -m pytest")
  37. if uv run python -c "import pytest" >/dev/null 2>&1; then
  38. printf "Using uv-managed environment\n"
  39. exec uv run python -m pytest "$@"
  40. fi
  41. return 1
  42. }
  43. if [ -n "${PYTHON:-}" ]; then
  44. if run_python "$PYTHON" "PYTHON override" "$@"; then
  45. exit 0
  46. fi
  47. printf "Configured PYTHON does not provide pytest: %s\n" "$PYTHON" >&2
  48. exit 1
  49. fi
  50. if [ -n "${VIRTUAL_ENV:-}" ]; then
  51. run_python "$VIRTUAL_ENV/bin/python" "active virtualenv" "$@" || true
  52. fi
  53. run_uv "$@" || true
  54. run_python "$ROOT_DIR/.venv/bin/python" "repo .venv" "$@" || true
  55. run_python "$ROOT_DIR/venv/bin/python" "repo venv" "$@" || true
  56. run_python python "PATH python" "$@" || true
  57. run_python python3 "PATH python3" "$@" || true
  58. printf "Unable to find a Python environment with pytest available.\n" >&2
  59. printf "Tried:\n" >&2
  60. for entry in "${TRIED[@]}"; do
  61. printf " - %s\n" "$entry" >&2
  62. done
  63. printf "Set PYTHON=/path/to/python, activate a virtualenv, create .venv/venv, or sync the project environment.\n" >&2
  64. exit 1