Skip to content

Commit d6e5413

Browse files
feat: add justfile with validate and release recipes
Recipes for local template validation (standard, minimal, cli, api, db, iot, gpu-ml, full) with automatic temp dir cleanup, and a release recipe that auto-increments semver tags. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 3b23a32 commit d6e5413

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

justfile

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
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

Comments
 (0)