A modern Cram-like shell test runner
Project description
outmatch
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:
Install
pip install outmatch
Or with uv:
uv tool install outmatch
CLI
outmatch [FILES...] # Run tests (default: all *.om recursively)
outmatch --fix [FILES...] # Accept actual output as expected
outmatch -i [FILES...] # Interactive — review each failure
File Format
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
Dynamic Test Generation
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.
How It Differs from Cram
| 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 |
License
MIT
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 outmatch-0.1.0.tar.gz.
File metadata
- Download URL: outmatch-0.1.0.tar.gz
- Upload date:
- Size: 8.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8166ac8d7bf247a2801b82617088f2f5689e9429ee385e8c7a6afd4d7de0ad5e
|
|
| MD5 |
ee0e7c884c55046ae7866d49a747bf1e
|
|
| BLAKE2b-256 |
dfc3ab3fa20920deff3d30327756cb42c04c40870dde2373bea907ce13771515
|
File details
Details for the file outmatch-0.1.0-py3-none-any.whl.
File metadata
- Download URL: outmatch-0.1.0-py3-none-any.whl
- Upload date:
- Size: 7.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.7 {"installer":{"name":"uv","version":"0.10.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
576d77879add09d01ecda47a4e8323b4abff52b7e4be1b307baff8dab13ae255
|
|
| MD5 |
e431cf128d130288dd0d0ec5af19485f
|
|
| BLAKE2b-256 |
f8e703f459f16ee113b1e68c4f6b6f1e513841ed3177e9bf78a99e3a2caa6d0b
|