English · Español
Lab 01 — Extender el Justfile¶
Pre-requisito: lee
../theory/02-engineering-hygiene.mdy../theory/03-dev-environment.md. Objetivo: interiorizarjustañadiendo una nueva receta que usarás en fases posteriores. No miressolutions/01-justfile-ref.mdhasta haberlo hecho funcionar.
§1 Contexto¶
just es un task runner — las recetas son como targets de make pero sin el footgun de la indentación con tab de make, sin el dolor del make recursivo, sin semántica implícita de rebuild. Las recetas son explícitas, parametrizadas y componibles.
Recetas actuales en /Justfile:
default— lista todas las recetassetup—uv sync --all-extras+uv run pre-commit installlint—ruff check+ruff format --check+mypy srcfmt—ruff check --fix+ruff formattest—uv run pytestnbstrip— elimina outputs de cualquier notebook commiteadoclean— limpia artefactos de build/cachephase00— encadenasetup → lint → test
§2 Tu tarea¶
Añade una receta nueva llamada manifest que:
- Tome un argumento posicional:
topic(p.ej.,just manifest softmax-stability). - Genere un directorio
experiments/$(date +%F)-{topic}/. - Escriba un archivo
experiments/$(date +%F)-{topic}/manifest.jsonque contenga como mínimo: id:"$(date +%F)-{topic}"git_sha: salida degit rev-parse HEADgit_dirty:truesigit status --porcelainno está vacío,falseen otro casoseed:42(placeholder — los scripts reales lo pasan)versions: salida deuv run python -c "from utils.seeding import log_versions; import json; print(json.dumps(log_versions()))"hardware:{ "cpu": "$(uname -p)", "kernel": "$(uname -r)", "os": "$(. /etc/os-release; echo $PRETTY_NAME)" }started_at: ISO-8601 UTC$(date -u +%FT%TZ)- Imprima la ruta al manifiesto al final.
§3 Restricciones¶
- Sin dependencias externas. Usa solo lo que ya está en el lockfile (
python,git, coreutils,jqdel OS). - Idempotente: correr la receta dos veces el mismo día con el mismo
topicsobrescribe el manifiesto limpiamente (tú decides: rotar por HH:MM:SS, o sobrescribir — defiende tu elección en el diario). - Cross-shell: las recetas corren bajo
shpor defecto, nofish. Si necesitas algo cargado de bashism, ponset shell := ["bash", "-cu"]al inicio del Justfile y explica por qué en un comentario. - Quotea
{topic}con seguridad —topicpodría sersoftmax stabilityophase-12-somethingo peor. Nada de command injection portopic.
§4 Tests¶
Añade un test a tests/test_justfile.py (puede que tengas que crearlo) que:
- Llame a
just manifest test-topicvíasubprocess. - Verifique que el archivo de manifiesto existe.
- Verifique que parsea como JSON.
- Verifique que el campo
versions.pythonempieza con3.11. - Verifique que el campo
git_shaes una cadena hex de 40 caracteres.
Usa tmp_path para el directorio de test si puedes; si no, documenta por qué el test corre in-tree.
§5 Condiciones de parada¶
Estás listo cuando:
-
just manifest <some-topic>produce un manifiesto JSON válido enexperiments/. - Reejecutar
just manifest <same-topic>funciona (sin errores, sin escritura parcial). -
pytest tests/test_justfile.pypasa. -
just lintsigue en verde (sin warnings de shell, sin nuevos errores de lint). - Commit:
lab: phase-00 add manifest recipe.
§6 Qué habrás aprendido¶
Al final:
- Recetas parametrizadas de just + quoting.
- Composición de shell ($(...), códigos de retorno condicionales).
- Por qué importan los manifiestos de determinismo (escribirás uno a mano aquí; fases posteriores consumen record_manifest() de src/utils/).
- Cómo interactúan las recetas con pre-commit y el lockfile.
§7 Pistas (úsalas con moderación)¶
just --evaluatemuestra la expansión de la receta sin correr nada — útil para depurar el quoting.git rev-parse HEADdevuelve el sha completo; no necesitasgit log -1 --pretty=%H.- Para detectar "dirty",
git diff-index --quiet HEAD --es más limpio que parseargit status --porcelain.
Si recurres a
solutions/01-justfile-ref.mdantes de completar esto, marcadod.lab_attempted_before_solutions: falseenlearners/borja/phase-00/checkpoint.json. La honestidad importa aquí — el phase-gatekeeper lo comprueba.