ROOT := . SITE := _site TMP := ./tmp BRANCH := main LESSON_DATA := ${TMP}/lessons.json TEMPLATES := $(wildcard templates/*.html) NOTEBOOK_INDEX := $(wildcard */index.md) NOTEBOOK_DIR := $(patsubst %/index.md,%,${NOTEBOOK_INDEX}) NOTEBOOK_SRC := $(foreach dir,$(NOTEBOOK_DIR),$(wildcard $(dir)/??_*.py)) NOTEBOOK_OUT := $(patsubst %.py,${SITE}/%.html,$(NOTEBOOK_SRC)) DATABASES := \ sql/public/lab.db \ sql/public/penguins.db \ sql/public/survey.db MARIMO := uv run marimo PYTHON := uv run python # Default target all: commands ## commands : show all commands commands: @grep -h -E '^##' ${MAKEFILE_LIST} | sed -e 's/## //g' | column -t -s ':' ## install: install required packages install: uv pip install -r requirements.txt ## check: run all simple checks check: -@make check_empty -@make check_titles -@make check_typos -@make check_packages ## check_exec: run notebooks to check for runtime errors check_exec: @if [ -z "$(NOTEBOOKS)" ]; then \ bash bin/run_notebooks.sh $(NOTEBOOK_SRC); \ else \ bash bin/run_notebooks.sh $(NOTEBOOKS); \ fi ## build: build website build: ${LESSON_DATA} ${TEMPLATES} ${PYTHON} bin/build.py --branch ${BRANCH} --root ${ROOT} --output ${SITE} --data ${LESSON_DATA} ## links: check links locally (while 'make serve') links: linkchecker -F text http://localhost:8000 ## wasm: build all notebooks as WASM wasm: ${NOTEBOOK_OUT} ## serve: run local web server without rebuilding serve: ${PYTHON} -m http.server --directory ${SITE} ## databases: rebuild datasets for SQL lessons databases: ${DATABASES} ## ---: --- ## clean: clean up stray files clean: @find . -name '*~' -exec rm {} + @find . -name '.DS_Store' -exec rm {} + @rm -rf ${TMP} @rm -f log_data_filtered*.* ## check_empty: check for empty cells check_empty: @${PYTHON} bin/check_empty_cells.py ## check_titles: check for missing titles in notebooks check_titles: @${PYTHON} bin/check_missing_titles.py ## check_packages: check for inconsistent package versions across notebooks check_packages: @if [ -z "$(NOTEBOOKS)" ]; then \ ${PYTHON} bin/check_notebook_packages.py $(NOTEBOOK_SRC); \ else \ ${PYTHON} bin/check_notebook_packages.py $(NOTEBOOKS); \ fi ## check_typos: check for typos check_typos: @typos ${TEMPLATES} ${NOTEBOOK_INDEX} ${NOTEBOOK_SRC} ## extract: extract lesson data extract: ${LESSON_DATA} # # subsidiary targets # tmp/lessons.json: $(NOTEBOOK_INDEX) ${PYTHON} bin/extract.py --root ${ROOT} --data ${LESSON_DATA} ${SITE}/%.html: %.py ${MARIMO} export html-wasm --force --mode edit $< -o $@ --sandbox sql/public/lab.db: bin/create_sql_lab.sql @rm -f $@ @mkdir -p sql/public sqlite3 $@ < $< sql/public/penguins.db: bin/create_sql_penguins.py data/penguins.csv @rm -f $@ @mkdir -p sql/public ${PYTHON} $< data/penguins.csv $@ sql/public/survey.db: bin/create_sql_survey.py @rm -f $@ @mkdir -p sql/public ${PYTHON} $< $@ 192837