|
| 1 | +# List available recipes |
| 2 | +default: |
| 3 | + @just --list |
| 4 | + |
| 5 | +# Render and validate a template variant, then clean up |
| 6 | +# Usage: just _validate <name> [extra copier --data flags...] |
| 7 | +[private] |
| 8 | +_validate name *data_flags: |
| 9 | + #!/usr/bin/env bash |
| 10 | + set -euo pipefail |
| 11 | + OUT=$(mktemp -d) |
| 12 | + trap 'rm -rf "$OUT"' EXIT |
| 13 | + echo "▶ Validating '{{ name }}' → $OUT" |
| 14 | + uvx copier copy . "$OUT/project" \ |
| 15 | + --trust --defaults --overwrite --vcs-ref=HEAD \ |
| 16 | + --data project_name={{ name }}-project \ |
| 17 | + --data description="Validate {{ name }}" \ |
| 18 | + --data author_name="Test" \ |
| 19 | + --data author_email="test@example.com" \ |
| 20 | + --data github_user=test-user \ |
| 21 | + {{ data_flags }} |
| 22 | + cd "$OUT/project" |
| 23 | + uv run ruff check src/ tests/ |
| 24 | + uv run ruff format --check src/ tests/ |
| 25 | + if [ -f pyproject.toml ] && grep -q 'mypy' pyproject.toml; then |
| 26 | + uv run mypy src/ |
| 27 | + fi |
| 28 | + uv run pytest -v |
| 29 | + echo "✓ {{ name }} passed" |
| 30 | + |
| 31 | +# Validate with standard defaults |
| 32 | +validate: |
| 33 | + just _validate standard |
| 34 | + |
| 35 | +# Validate minimal config (everything off) |
| 36 | +validate-minimal: |
| 37 | + just _validate minimal \ |
| 38 | + --data ci_github=false \ |
| 39 | + --data security=none \ |
| 40 | + --data use_docker=none \ |
| 41 | + --data use_docs=false \ |
| 42 | + --data testing=minimal \ |
| 43 | + --data use_ml=false \ |
| 44 | + --data use_typecheck=false \ |
| 45 | + --data use_devcontainer=false |
| 46 | + |
| 47 | +# Validate CLI feature |
| 48 | +validate-cli: |
| 49 | + just _validate cli --data use_cli=true |
| 50 | + |
| 51 | +# Validate API feature |
| 52 | +validate-api: |
| 53 | + just _validate api --data use_api=true |
| 54 | + |
| 55 | +# Validate DB feature |
| 56 | +validate-db: |
| 57 | + just _validate db --data use_db=true |
| 58 | + |
| 59 | +# Validate IoT feature |
| 60 | +validate-iot: |
| 61 | + just _validate iot --data use_iot=true |
| 62 | + |
| 63 | +# Validate GPU + ML combo (catches cross-feature bugs) |
| 64 | +validate-gpu-ml: |
| 65 | + just _validate gpu-ml --data use_docker=gpu --data use_ml=true |
| 66 | + |
| 67 | +# Validate kitchen-sink (all features on) |
| 68 | +validate-full: |
| 69 | + just _validate full \ |
| 70 | + --data security=full \ |
| 71 | + --data testing=full \ |
| 72 | + --data use_docker=gpu \ |
| 73 | + --data use_devcontainer=true \ |
| 74 | + --data use_ml=true \ |
| 75 | + --data use_iot=true \ |
| 76 | + --data use_cli=true \ |
| 77 | + --data use_api=true \ |
| 78 | + --data use_db=true |
| 79 | + |
| 80 | +# Run all validation variants |
| 81 | +validate-all: validate validate-minimal validate-cli validate-api validate-db validate-iot validate-gpu-ml validate-full |
| 82 | + |
| 83 | +# Tag a release and push (usage: just release [patch|minor|major]) |
| 84 | +release bump="patch": |
| 85 | + #!/usr/bin/env bash |
| 86 | + set -euo pipefail |
| 87 | + LATEST=$(git tag --sort=-v:refname | grep -E '^v[0-9]+\.[0-9]+\.[0-9]+$' | head -1) |
| 88 | + if [ -z "$LATEST" ]; then |
| 89 | + NEXT="v0.1.0" |
| 90 | + else |
| 91 | + IFS='.' read -r MAJOR MINOR PATCH <<< "${LATEST#v}" |
| 92 | + case "{{ bump }}" in |
| 93 | + major) NEXT="v$((MAJOR+1)).0.0" ;; |
| 94 | + minor) NEXT="v${MAJOR}.$((MINOR+1)).0" ;; |
| 95 | + patch) NEXT="v${MAJOR}.${MINOR}.$((PATCH+1))" ;; |
| 96 | + *) echo "Error: bump must be patch, minor, or major"; exit 1 ;; |
| 97 | + esac |
| 98 | + fi |
| 99 | + echo "▶ ${LATEST:-none} → $NEXT" |
| 100 | + just validate-all |
| 101 | + git tag "$NEXT" |
| 102 | + git push origin "$NEXT" |
| 103 | + echo "✓ Released $NEXT" |
0 commit comments