workshopify
Skeleton and scaffolding for template-rendered, notebook-based workshop repositories.
A workshop repo declares everything mechanical in [tool.workshopify] tables
in its pyproject.toml, and workshopify does the rest:
| Command | Does |
|---|---|
workshopify render |
Re-render templated values and assets in place |
workshopify check |
Report stale rendered values or assets; exit 1 if any |
workshopify generate |
Generate the notebooks and notes from src/ |
workshopify build |
Assemble the published workshop tree into its branch worktree |
workshopify set <key> <value> |
Set a [tool.workshopify.params] value and re-render |
workshopify worktree <branch> |
Prepare a branch worktree without building |
Configuration
Every command finds its workshop by walking up from the working directory to
the nearest pyproject.toml with a [tool.workshopify] table. That file's
directory is the repo root, and every path below is relative to it. Keys are
kebab-case, and every one of them has a default, so a table with nothing to
say may be left out entirely.
[tool.workshopify]
| Key | Default | Does |
|---|---|---|
context |
none | Names the context module: the workshop's procedural half, whose module-level names become the namespace the templating runs in, and whose optional ASSETS dict maps a path in the published tree to the repo file copied there verbatim. Omit it for a workshop that templates nothing and declares no assets; a module that is named must exist. |
params |
{} |
The workshop's own values, handed to the context module as params and rewritten in place by workshopify set. The keys are whatever that module reads. |
[tool.workshopify.render]
| Key | Default | Does |
|---|---|---|
files |
[] |
Glob patterns naming the files render rewrites in place and check verifies. A pattern that matches nothing is an error — a typo'd glob would otherwise render nothing, forever, in silence — while declaring no patterns at all is a workshop that templates nothing. |
[tool.workshopify.notebooks]
| Key | Default | Does |
|---|---|---|
src |
"src" |
The directory holding the py:percent sources. Which notebooks exist is decided by the [[tool.ipynb-scrubber.files]] entries; this only says where each one's source is read from, as <src>/<stem>.py. |
[tool.workshopify.build]
| Key | Default | Does |
|---|---|---|
branch |
"workshop" |
The branch the published tree is assembled onto, in a worktree at <root>/<branch>. build writes that tree and prints how to review and push it; it commits nothing itself. |
include |
[] |
Repo files and directories copied into the published tree at the same relative path. Entries must be relative and free of ... |
keep-tables |
["project", "tool.uv"] |
Dotted paths kept in the participants' derived pyproject.toml; everything else is dropped. A path names its whole subtree. |
drop-keys |
[] |
Dotted paths carved back out of what keep-tables kept — the workspace wiring under [tool.uv], say, which participants have no checkout to point at. |
A path in either list that matches nothing in the repo's own pyproject.toml
is an error rather than a no-op, as is a path listed alongside one of its own
descendants: both would otherwise ship a silently wrong pyproject.
What [tool.workshopify] does not say
Some of the published tree comes from places no key names:
static/at the repo root is an overlay — every file under it is copied to the same path in the published tree, with thestatic/prefix stripped.[tool.jupytext]and[tool.ipynb-scrubber]are read as those tools define them, so the notebook formats, the scrub markers, and the set of generated notebooks and notes are configured there and not here.uv.lockis derived from the repo's own lock, re-resolved offline, so participants get the versions contributors develop against — and a repo that has never runuv lockhas nothing to build from.
Status
Extracted from a working workshop repository and being generalised. The configuration contract and command surface are still subject to change.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file workshopify-0.2.2.tar.gz.
File metadata
- Download URL: workshopify-0.2.2.tar.gz
- Upload date:
- Size: 101.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf30417f2c56ccbbf243bf8c6db5ad649e8d7fb32ea131f0c1f06c888a467489
|
|
| MD5 |
f3a35ed207cc9a7d5e4599c2c9d45dbb
|
|
| BLAKE2b-256 |
7eb6d4d2bf658302175d1b723acac7b92478eeb9ae8d382480ca139ef38a6ec0
|
Provenance
The following attestation bundles were made for workshopify-0.2.2.tar.gz:
Publisher:
release.yml on jkeifer/workshopify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
workshopify-0.2.2.tar.gz -
Subject digest:
cf30417f2c56ccbbf243bf8c6db5ad649e8d7fb32ea131f0c1f06c888a467489 - Sigstore transparency entry: 2447180769
- Sigstore integration time:
-
Permalink:
jkeifer/workshopify@a34c9ff4a8d72164fb8bcf71cd6d247ea526290e -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/jkeifer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a34c9ff4a8d72164fb8bcf71cd6d247ea526290e -
Trigger Event:
release
-
Statement type:
File details
Details for the file workshopify-0.2.2-py3-none-any.whl.
File metadata
- Download URL: workshopify-0.2.2-py3-none-any.whl
- Upload date:
- Size: 47.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4e44ceeb9540a35d161fa3b57452f8823027fad45e168882e6908497f1f6a85
|
|
| MD5 |
473ba926075a2b5b25a164aac5beaf1b
|
|
| BLAKE2b-256 |
fa6fe2dc40e87630c4c4d09a2a5617ef5d0a73fee52777c6712bd711f1ce6a98
|
Provenance
The following attestation bundles were made for workshopify-0.2.2-py3-none-any.whl:
Publisher:
release.yml on jkeifer/workshopify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
workshopify-0.2.2-py3-none-any.whl -
Subject digest:
a4e44ceeb9540a35d161fa3b57452f8823027fad45e168882e6908497f1f6a85 - Sigstore transparency entry: 2447181031
- Sigstore integration time:
-
Permalink:
jkeifer/workshopify@a34c9ff4a8d72164fb8bcf71cd6d247ea526290e -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/jkeifer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a34c9ff4a8d72164fb8bcf71cd6d247ea526290e -
Trigger Event:
release
-
Statement type: