Output matching for shell commands. A modern replacement for Cram with a cleaner interface, dynamic test generation, multiple tests per file, and zero dependencies.
Write a test — just a command and its expected output:
Run it:
When something breaks, you get a clear diff:
Fix it automatically — outmatch rewrites expected output in-place:
pip install outmatch
Or with uv:
uv tool install outmatch
outmatch [FILES...] # Run tests (default: all *.om recursively)
outmatch --fix [FILES...] # Accept actual output as expected
outmatch -i [FILES...] # Interactive — review each failure
Tests live in .om files. Each test starts with a ## header, followed by a $ command and its expected output:
# Comments at column 0
## name of test
$ command to run
expected output line
/regex pattern to match/
glob: glob pattern to match
exit 1
The | @foreach syntax generates tests from command output — one test per line:
## check each fruit
$ cat fruits.txt | @foreach @FRUIT
$ echo "I like @FRUIT"
apple
I like apple
banana
I like banana
Run outmatch --fix to capture output inline.
| Cram | Outmatch | |
|---|---|---|
| Tests per file | One | Many (## headers) |
| Dynamic generation | No | | @foreach pipelines |
| Regex matching | re suffix |
/pattern/ delimiters |
| Glob matching | glob suffix |
glob: prefix |
| Fix mode | --interactive |
outmatch --fix (automatic) |
| Generated output | No | Inline, per item |
| Dependencies | Python 2/3 | Python 3.10+, zero deps |
MIT