Skip to main content

toolroom

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

from toolroom 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 (toolroom~=0.6.0) 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 toolroom.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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

livery_toolroom-0.6.2.tar.gz (418.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

livery_toolroom-0.6.2-py3-none-any.whl (479.4 kB view details)

Uploaded Python 3

File details

Details for the file livery_toolroom-0.6.2.tar.gz.

File metadata

  • Download URL: livery_toolroom-0.6.2.tar.gz
  • Upload date:
  • Size: 418.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • 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}

File hashes

Hashes for livery_toolroom-0.6.2.tar.gz
Algorithm Hash digest
SHA256 b8a9f6db25e4b90539f8ab5b52e7e89d7c50b9be21f7d034713387af14307b77
MD5 fad49b3eeebde68ba3c7aa82047f08f6
BLAKE2b-256 1df3d65bf286779723e433605b09f9504b8516fdfe302034bccec247dc7b84ff

See more details on using hashes here.

File details

Details for the file livery_toolroom-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: livery_toolroom-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 479.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • 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}

File hashes

Hashes for livery_toolroom-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6b1992bd8d01222cd8b6a2ff5854cb9781ee81b37bd91dba06a7b2f150cf0b28
MD5 76b1df26731784ea63afa83eae6a8b54
BLAKE2b-256 b301f8b200cff18f034c2c862bf08acf9502ab67b8aed95f5621a204c4fabaa5

See more details on using hashes here.

Release history Release notifications | RSS feed

0.7.0

2 files

This release

0.6.2 This release

2 files

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