#!/usr/bin/env bash set -uo pipefail status=0 root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" python_files=( "app.py" "auth.py" "calendar_feeds.py" "forgejo_client.py" "live_prototype.py" "settings.py" "tests" ) if [[ -x "${root_dir}/.venv/bin/python" ]]; then python_cmd=("${root_dir}/.venv/bin/python") else python_cmd=(python3) fi run_check() { local label="$1" shift echo "==> ${label}" if ! "$@"; then status=1 fi echo } cd "${root_dir}" run_check \ "Ruff format" \ uv run --with "ruff>=0.15.0,<1.0.0" \ ruff format --check "${python_files[@]}" run_check \ "Ruff lint" \ uv run --with "ruff>=0.15.0,<1.0.0" \ ruff check "${python_files[@]}" run_check \ "Deptry" \ uv run --with "deptry>=0.24.0,<1.0.0" \ deptry . \ --requirements-files requirements.txt \ --known-first-party app,auth,calendar_feeds,forgejo_client,live_prototype,settings \ --per-rule-ignores DEP002=uvicorn \ --extend-exclude ".*/frontend/.*" \ --extend-exclude ".*/\\.venv/.*" \ --extend-exclude ".*/__pycache__/.*" run_check \ "Vulture" \ uv run --with "vulture>=2.15,<3.0.0" \ vulture app.py auth.py calendar_feeds.py forgejo_client.py live_prototype.py settings.py tests --min-confidence 80 run_check \ "Backend Tests" \ "${python_cmd[@]}" -m unittest discover -s tests -p "test_*.py" exit "${status}"