Skip to main content

toolroom

Typed surfaces for command-line tools, generated from the tools themselves.

from livery.toolroom.tools import git, cmake, ruff

git.switch("-c", "release/v1.4")
cmake.build("build", parallel=8)
ruff.check("src", fix=True, select=["E", "F"])

A tool room is where precision tools are made, kept with their measurements, repaired when they drift, and issued for use. That is the whole design, one verb at a time: a stub generator reads each tool's own --help and writes a typed surface for it; the surfaces are kept with the version they were read from; a weekly refresh re-takes them when the tool moves; and the bridge issues any tool as a Python handle — including tools no stub has ever described. toolroom.terraform("plan") runs whether or not toolroom has heard of terraform.

Beta. toolroom is pre-1.0: minor versions may include breaking changes — always called out in the changelog, never in a patch release. Pin the minor if you build on it.

No transcription

toolroom does not transcribe a tool's flags into Python parameters. Transcription drifts: the wrapper pins the flag-set its author copied, the tool moves on, and one day a call emits a flag the installed binary rejects. Instead, keyword arguments translate mechanically, so the installed tool's own CLI stays the single source of truth, at whatever version it is:

  • fix=True → --fix (False/None → omitted entirely)
  • strict=off → --no-strict (off is the toolroom.off sentinel)
  • output_format="github" → --output-format github
  • select=["E", "F"] → --select E --select F
  • x=1 (single letter) → -x 1
  • a trailing underscore escapes Python keywords: import_="x" → --import x

Attribute access chains subcommands (toolroom.docker.compose.up(detach=True)), and positional strings pass through verbatim. The typed stubs suggest — your editor knows the flags and what each one does — but they never forbid: the hints decide whether your editor can help, never whether a call works. Using the tools has the full grammar.

Standalone, or hosted

With nothing else installed, a call spawns the tool with plain subprocess and answers in a Result — the exit code as an int subclass, carrying the captured streams. A failure raises ToolError unless the call opted into nofail.

When footman is present in the process, the same call routes through footman's run() instead and inherits everything a task run means: capture, replay-on-failure, dry-run, recording(), --json receipts, parallel lanes. Neither package imports or depends on the other — they were designed together and are better together, but each is useful with the other absent. With footman tells that story.

Built, not run

.argv turns a handle's call into a command line instead of an execution — an ordinary list[str], with .posix() and .windows() for the moment it crosses into a shell:

cmd = git.push.argv(force=True)  # ["git", "push", "--force"]
cmd.posix()  # "git push --force", quoted for a POSIX shell

Testing

Code that calls tools is tested with toolroom.testing.answers(): the handles stay real — chaining, flag translation, redaction are all exercised — and only execution is replaced, answered from a table of canned output and exit codes:

from livery.toolroom.tools.testing import answers

with answers({("git", "push"): 1}) as calls:
    release()  # exercises the failure path

assert calls[0].argv == ["git", "push"]

Testing has the whole story.

Install

uv add toolroom        # or: pip install toolroom

toolroom has zero runtime dependencies and needs Python 3.11+. The docs live at willemkokke.github.io/toolroom. MIT licensed.

Metadata

Release files for livery-toolroom 0.12.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for livery-toolroom 0.12.0
File Size Uploaded Provenance
livery_toolroom-0.12.0.tar.gz 57.0 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for livery-toolroom 0.12.0
File Interpreter ABI Platform
livery_toolroom-0.12.0-py3-none-any.whl Python 3 none any Details

Total release size: 123.9 kB

Release files / livery_toolroom-0.12.0.tar.gz

Download URL livery_toolroom-0.12.0.tar.gz
Size 57.0 kB
Tags Source
SHA-256 checksum
How to use checksums
83f27ae92c389ba8d7fc42e80dfa682a0dfd01936dde0091121c1820cea8db5b
BLAKE2b-256 checksum
How to use checksums
f326a2278ac8e264b92f994009f66798aa28eeda0b88da60d8c8773567bcc946
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.7 {"installer":{"name":"uv","version":"0.12.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}

Release files / livery_toolroom-0.12.0-py3-none-any.whl

Download URL livery_toolroom-0.12.0-py3-none-any.whl
Size 66.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
bfb92d5abdbe9e3bd93212d2c2c97b48892b0cfd5d6d1dee1bcb0048ad0b1b87
BLAKE2b-256 checksum
How to use checksums
484b4d7b77e227df3986612ff8f0f62a23682b7d6620f5f9518fb9e21a7299ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.7 {"installer":{"name":"uv","version":"0.12.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}

Security for livery-toolroom 0.12.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page