Scaffolding tool & application framework for Python projects.
Project description
Scaf
Build more, sweat less.
Scaf is an opinionated filesystem-based project builder and domain-action runner for devs who just want to keep things simple. It solves the easy problems in application development, so you can focus on the hard ones.
Usage
Note: Currently only bash is supported (use WSL or git bash on Windows).
Install scaf (can be in your user/system env, but a venv is recommended):
pip install git+http://scaf.sycdan.com
Initialize scaf in your project root:
scaf init
Add this to your .venvrc or .bashrc file:
scaf discover . && source .scaf/aliases
Invoke an action (this will create it and add an alias, if it does not exist):
scaf call example/world/greet
Dev Server
Start the local dev server to run and test your domain actions from a browser UI:
scaf serve .
Then open http://localhost:54545.
Select an action, enter a JSON payload, choose which tests to run and whether you expect each to pass or fail, then hit Submit. The server saves the payload as a fixture in the action's fixtures/ folder and runs the selected tests in-process, returning live results. The server also hot-reloads any .py files under the deck as you edit them — no restart needed.
Additionally, you can launch the server with debugpy via VSCode's launch.json:
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug dev server",
"type": "debugpy",
"request": "launch",
"module": "scaf",
"args": [
"-vvv",
"serve",
"."
]
}
]
}
Development
Keep dependencies to a minimum.
Use 2-space indentation in all Python files. Scaf's generated templates use 2-space indent, so consistency matters.
Environment Setup
source dev/env.sh [--nuke]
Note: If you change packages or hooks, nuke your env.
FAQ
How do I see verbose output from scaf calls?
Edit your .scaf/aliases file:
alias domain.action="scaf --vvv call $DECK/domain/action"
# ^ add this
Why am I getting Failed to load action package backend/domain/action: No module named 'domain'
Run scaf init in your app's PYTHONPATH directory (e.g. backend).
Why am I getting MyType | None is not callable?
You are probably on an old python version -- use Union[MyType, None] instead.
What is a venv?
A python virtual environment, allowing you to have project-specific dependencies. Create one thus:
python -m venv .venv
What is .venvrc?
A file intended to be sourced when your venv is activated. Typically placed in your project root.
Add this to the end of your venv activate script (e.g. .venv/Scripts/activate):
if [ -f "$VIRTUAL_ENV/"../.venvrc ]; then
source "$VIRTUAL_ENV/"../.venvrc
fi
Project details
Release history Release notifications | RSS feed
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 scafpy-2026.3.1.1.tar.gz.
File metadata
- Download URL: scafpy-2026.3.1.1.tar.gz
- Upload date:
- Size: 30.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2eecf43c6c47979a3a317f12a4bc1f76d9aa53fb97ccbcb514d78410be020b68
|
|
| MD5 |
68c2d13e080f39339a61b43127c9e283
|
|
| BLAKE2b-256 |
fb78077a02481d75698fcfd315c9cabc2fedf91c3e849cd11ebad7302a85357b
|
File details
Details for the file scafpy-2026.3.1.1-py3-none-any.whl.
File metadata
- Download URL: scafpy-2026.3.1.1-py3-none-any.whl
- Upload date:
- Size: 43.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db54d493a60eeb879e322a7010763671911bbafdbbe6f4d24fe7aa6b3603b816
|
|
| MD5 |
73bd9ae8de6fa4e800071b457e0e6630
|
|
| BLAKE2b-256 |
112ad4c75e28a53033b7230868f3440b1d3612d003dcdbbd4112b484af45b8ec
|