livery-toolroom 0.6.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- livery_toolroom-0.6.2/LICENSE +21 -0
- livery_toolroom-0.6.2/PKG-INFO +130 -0
- livery_toolroom-0.6.2/README.md +109 -0
- livery_toolroom-0.6.2/pyproject.toml +64 -0
- livery_toolroom-0.6.2/pyproject.toml.orig +74 -0
- livery_toolroom-0.6.2/src/livery/toolroom/__init__.py +1251 -0
- livery_toolroom-0.6.2/src/livery/toolroom/__init__.pyi +332 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_colordata.py +47 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/api.md +41 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/assets/favicon.svg +1 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/assets/logo.svg +1 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/assets/playground.css +176 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/assets/playground.js +609 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/footman.md +86 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/index.md +83 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/nav.toml +68 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/playground.md +55 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/testing.md +117 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/typing.md +80 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docs/usage.md +161 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_docsgen.py +34 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_host.py +519 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/__init__.py +1 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_colorprobe.py +355 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_drivers.py +918 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/basedpyright.json +346 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/build.json +330 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/bun.json +4392 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/claude.json +1500 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/cmake.json +914 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/coverage.json +1155 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/cspell.json +877 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/djlint.json +639 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/docker.json +4279 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/eclint.json +170 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/gh.json +2666 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/git.json +8313 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/git_changelog.json +382 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/git_cliff.json +575 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/markdownlint.json +168 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/mkdocs.json +1117 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/mypy.json +1186 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/ninja.json +216 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/prek.json +1397 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/pytest.json +1205 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/python.json +378 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/ruff.json +1006 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/ruff_format.json +401 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/ssh.json +1589 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/ssh_keygen.json +1653 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/ssh_keyscan.json +896 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/tea.json +2682 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/twine.json +316 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/ty.json +486 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/uv.json +13137 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_history/zensical.json +255 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_provision.py +680 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_stubgen.py +633 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_tasks.py +2694 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_toolfetch.py +950 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_toolhelp.py +1446 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_toolhistory.py +1046 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_machinery/_toolspec.py +318 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/__init__.pyi +4 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/basedpyright.pyi +71 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/bash.pyi +28 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/build.pyi +59 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/bun.pyi +1038 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/claude.pyi +785 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/cmake.pyi +174 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/cmd.pyi +28 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/coverage.pyi +336 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/cspell.pyi +241 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/djlint.pyi +127 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/docker.pyi +903 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/eclint.pyi +51 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/fish.pyi +28 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/gh.pyi +995 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/git.pyi +1748 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/git_changelog.pyi +75 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/git_cliff.pyi +119 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/markdownlint.pyi +39 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/mkdocs.pyi +192 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/mypy.pyi +211 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/ninja.pyi +51 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/nu.pyi +28 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/prek.pyi +369 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/pwsh.pyi +28 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/pytest.pyi +231 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/python.pyi +76 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/ruff.pyi +259 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/ruff_format.pyi +93 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/ssh.pyi +117 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/ssh_keygen.pyi +127 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/ssh_keyscan.pyi +49 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/tea.pyi +1042 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/twine.pyi +111 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/ty.pyi +110 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/uv.pyi +2666 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/zensical.pyi +92 -0
- livery_toolroom-0.6.2/src/livery/toolroom/_stubs/zsh.pyi +28 -0
- livery_toolroom-0.6.2/src/livery/toolroom/py.typed +0 -0
- livery_toolroom-0.6.2/src/livery/toolroom/testing.py +355 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Willem Kokke
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: livery-toolroom
|
|
3
|
+
Version: 0.6.2
|
|
4
|
+
Summary: Typed surfaces for command-line tools, generated from the tools themselves.
|
|
5
|
+
Author: Willem Kokke
|
|
6
|
+
Author-email: Willem Kokke <mail@willem.net>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
12
|
+
Classifier: Typing :: Typed
|
|
13
|
+
Requires-Dist: livery-footman>=0.52.2 ; extra == 'test'
|
|
14
|
+
Requires-Dist: footman>=0.52.2 ; extra == 'test'
|
|
15
|
+
Requires-Dist: mkdocs>=1.6 ; extra == 'test'
|
|
16
|
+
Requires-Dist: toolroom>=0.6.2 ; extra == 'test'
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
|
+
Project-URL: Repository, https://github.com/willemkokke/livery
|
|
19
|
+
Provides-Extra: test
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
# toolroom
|
|
23
|
+
|
|
24
|
+
Typed surfaces for command-line tools, generated from the tools
|
|
25
|
+
themselves.
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
from toolroom import git, cmake, ruff
|
|
29
|
+
|
|
30
|
+
git.switch("-c", "release/v1.4")
|
|
31
|
+
cmake.build("build", parallel=8)
|
|
32
|
+
ruff.check("src", fix=True, select=["E", "F"])
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
A tool room is where precision tools are made, kept with their
|
|
36
|
+
measurements, repaired when they drift, and issued for use. That is the
|
|
37
|
+
whole design, one verb at a time: a stub generator reads each tool's own
|
|
38
|
+
`--help` and writes a typed surface for it; the surfaces are kept with
|
|
39
|
+
the version they were read from; a weekly refresh re-takes them when the
|
|
40
|
+
tool moves; and the bridge issues any tool as a Python handle —
|
|
41
|
+
including tools no stub has ever described.
|
|
42
|
+
`toolroom.terraform("plan")` runs whether or not toolroom has heard of
|
|
43
|
+
terraform.
|
|
44
|
+
|
|
45
|
+
> **Beta.** toolroom is pre-1.0: minor versions may include breaking
|
|
46
|
+
> changes — always called out in the
|
|
47
|
+
> [changelog](https://github.com/willemkokke/toolroom/blob/main/CHANGELOG.md),
|
|
48
|
+
> never in a patch release. Pin the minor (`toolroom~=0.6.0`) if you
|
|
49
|
+
> build on it.
|
|
50
|
+
|
|
51
|
+
## No transcription
|
|
52
|
+
|
|
53
|
+
toolroom does **not** transcribe a tool's flags into Python parameters.
|
|
54
|
+
Transcription drifts: the wrapper pins the flag-set its author copied,
|
|
55
|
+
the tool moves on, and one day a call emits a flag the installed binary
|
|
56
|
+
rejects. Instead, keyword arguments translate *mechanically*, so the
|
|
57
|
+
installed tool's own CLI stays the single source of truth, at whatever
|
|
58
|
+
version it is:
|
|
59
|
+
|
|
60
|
+
- `fix=True` → `--fix` (`False`/`None` → omitted entirely)
|
|
61
|
+
- `strict=off` → `--no-strict` (`off` is the `toolroom.off` sentinel)
|
|
62
|
+
- `output_format="github"` → `--output-format github`
|
|
63
|
+
- `select=["E", "F"]` → `--select E --select F`
|
|
64
|
+
- `x=1` (single letter) → `-x 1`
|
|
65
|
+
- a trailing underscore escapes Python keywords: `import_="x"` → `--import x`
|
|
66
|
+
|
|
67
|
+
Attribute access chains subcommands
|
|
68
|
+
(`toolroom.docker.compose.up(detach=True)`), and positional strings pass
|
|
69
|
+
through verbatim. The typed stubs *suggest* — your editor knows the
|
|
70
|
+
flags and what each one does — but they never forbid: the hints decide
|
|
71
|
+
whether your editor can help, never whether a call works.
|
|
72
|
+
[Using the tools](https://willemkokke.github.io/toolroom/usage/) has the
|
|
73
|
+
full grammar.
|
|
74
|
+
|
|
75
|
+
## Standalone, or hosted
|
|
76
|
+
|
|
77
|
+
With nothing else installed, a call spawns the tool with plain
|
|
78
|
+
`subprocess` and answers in a `Result` — the exit code as an `int`
|
|
79
|
+
subclass, carrying the captured streams. A failure raises `ToolError`
|
|
80
|
+
unless the call opted into `nofail`.
|
|
81
|
+
|
|
82
|
+
When [footman](https://willemkokke.github.io/footman/) is present in the
|
|
83
|
+
process, the same call routes through footman's `run()` instead and
|
|
84
|
+
inherits everything a task run means: capture, replay-on-failure,
|
|
85
|
+
dry-run, `recording()`, `--json` receipts, parallel lanes. Neither
|
|
86
|
+
package imports or depends on the other — they were designed together
|
|
87
|
+
and are better together, but each is useful with the other absent.
|
|
88
|
+
[With footman](https://willemkokke.github.io/toolroom/footman/) tells
|
|
89
|
+
that story.
|
|
90
|
+
|
|
91
|
+
## Built, not run
|
|
92
|
+
|
|
93
|
+
`.argv` turns a handle's call into a command line instead of an
|
|
94
|
+
execution — an ordinary `list[str]`, with `.posix()` and `.windows()`
|
|
95
|
+
for the moment it crosses into a shell:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
cmd = git.push.argv(force=True) # ["git", "push", "--force"]
|
|
99
|
+
cmd.posix() # "git push --force", quoted for a POSIX shell
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Testing
|
|
103
|
+
|
|
104
|
+
Code that calls tools is tested with `toolroom.testing.answers()`: the
|
|
105
|
+
handles stay real — chaining, flag translation, redaction are all
|
|
106
|
+
exercised — and only execution is replaced, answered from a table of
|
|
107
|
+
canned output and exit codes:
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
from toolroom.testing import answers
|
|
111
|
+
|
|
112
|
+
with answers({("git", "push"): 1}) as calls:
|
|
113
|
+
release() # exercises the failure path
|
|
114
|
+
|
|
115
|
+
assert calls[0].argv == ["git", "push"]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
[Testing](https://willemkokke.github.io/toolroom/testing/) has the whole
|
|
119
|
+
story.
|
|
120
|
+
|
|
121
|
+
## Install
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
uv add toolroom # or: pip install toolroom
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
toolroom has **zero runtime dependencies** and needs Python 3.11+. The
|
|
128
|
+
docs live at
|
|
129
|
+
[willemkokke.github.io/toolroom](https://willemkokke.github.io/toolroom/).
|
|
130
|
+
MIT licensed.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# toolroom
|
|
2
|
+
|
|
3
|
+
Typed surfaces for command-line tools, generated from the tools
|
|
4
|
+
themselves.
|
|
5
|
+
|
|
6
|
+
```python
|
|
7
|
+
from toolroom import git, cmake, ruff
|
|
8
|
+
|
|
9
|
+
git.switch("-c", "release/v1.4")
|
|
10
|
+
cmake.build("build", parallel=8)
|
|
11
|
+
ruff.check("src", fix=True, select=["E", "F"])
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
A tool room is where precision tools are made, kept with their
|
|
15
|
+
measurements, repaired when they drift, and issued for use. That is the
|
|
16
|
+
whole design, one verb at a time: a stub generator reads each tool's own
|
|
17
|
+
`--help` and writes a typed surface for it; the surfaces are kept with
|
|
18
|
+
the version they were read from; a weekly refresh re-takes them when the
|
|
19
|
+
tool moves; and the bridge issues any tool as a Python handle —
|
|
20
|
+
including tools no stub has ever described.
|
|
21
|
+
`toolroom.terraform("plan")` runs whether or not toolroom has heard of
|
|
22
|
+
terraform.
|
|
23
|
+
|
|
24
|
+
> **Beta.** toolroom is pre-1.0: minor versions may include breaking
|
|
25
|
+
> changes — always called out in the
|
|
26
|
+
> [changelog](https://github.com/willemkokke/toolroom/blob/main/CHANGELOG.md),
|
|
27
|
+
> never in a patch release. Pin the minor (`toolroom~=0.6.0`) if you
|
|
28
|
+
> build on it.
|
|
29
|
+
|
|
30
|
+
## No transcription
|
|
31
|
+
|
|
32
|
+
toolroom does **not** transcribe a tool's flags into Python parameters.
|
|
33
|
+
Transcription drifts: the wrapper pins the flag-set its author copied,
|
|
34
|
+
the tool moves on, and one day a call emits a flag the installed binary
|
|
35
|
+
rejects. Instead, keyword arguments translate *mechanically*, so the
|
|
36
|
+
installed tool's own CLI stays the single source of truth, at whatever
|
|
37
|
+
version it is:
|
|
38
|
+
|
|
39
|
+
- `fix=True` → `--fix` (`False`/`None` → omitted entirely)
|
|
40
|
+
- `strict=off` → `--no-strict` (`off` is the `toolroom.off` sentinel)
|
|
41
|
+
- `output_format="github"` → `--output-format github`
|
|
42
|
+
- `select=["E", "F"]` → `--select E --select F`
|
|
43
|
+
- `x=1` (single letter) → `-x 1`
|
|
44
|
+
- a trailing underscore escapes Python keywords: `import_="x"` → `--import x`
|
|
45
|
+
|
|
46
|
+
Attribute access chains subcommands
|
|
47
|
+
(`toolroom.docker.compose.up(detach=True)`), and positional strings pass
|
|
48
|
+
through verbatim. The typed stubs *suggest* — your editor knows the
|
|
49
|
+
flags and what each one does — but they never forbid: the hints decide
|
|
50
|
+
whether your editor can help, never whether a call works.
|
|
51
|
+
[Using the tools](https://willemkokke.github.io/toolroom/usage/) has the
|
|
52
|
+
full grammar.
|
|
53
|
+
|
|
54
|
+
## Standalone, or hosted
|
|
55
|
+
|
|
56
|
+
With nothing else installed, a call spawns the tool with plain
|
|
57
|
+
`subprocess` and answers in a `Result` — the exit code as an `int`
|
|
58
|
+
subclass, carrying the captured streams. A failure raises `ToolError`
|
|
59
|
+
unless the call opted into `nofail`.
|
|
60
|
+
|
|
61
|
+
When [footman](https://willemkokke.github.io/footman/) is present in the
|
|
62
|
+
process, the same call routes through footman's `run()` instead and
|
|
63
|
+
inherits everything a task run means: capture, replay-on-failure,
|
|
64
|
+
dry-run, `recording()`, `--json` receipts, parallel lanes. Neither
|
|
65
|
+
package imports or depends on the other — they were designed together
|
|
66
|
+
and are better together, but each is useful with the other absent.
|
|
67
|
+
[With footman](https://willemkokke.github.io/toolroom/footman/) tells
|
|
68
|
+
that story.
|
|
69
|
+
|
|
70
|
+
## Built, not run
|
|
71
|
+
|
|
72
|
+
`.argv` turns a handle's call into a command line instead of an
|
|
73
|
+
execution — an ordinary `list[str]`, with `.posix()` and `.windows()`
|
|
74
|
+
for the moment it crosses into a shell:
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
cmd = git.push.argv(force=True) # ["git", "push", "--force"]
|
|
78
|
+
cmd.posix() # "git push --force", quoted for a POSIX shell
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Testing
|
|
82
|
+
|
|
83
|
+
Code that calls tools is tested with `toolroom.testing.answers()`: the
|
|
84
|
+
handles stay real — chaining, flag translation, redaction are all
|
|
85
|
+
exercised — and only execution is replaced, answered from a table of
|
|
86
|
+
canned output and exit codes:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from toolroom.testing import answers
|
|
90
|
+
|
|
91
|
+
with answers({("git", "push"): 1}) as calls:
|
|
92
|
+
release() # exercises the failure path
|
|
93
|
+
|
|
94
|
+
assert calls[0].argv == ["git", "push"]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
[Testing](https://willemkokke.github.io/toolroom/testing/) has the whole
|
|
98
|
+
story.
|
|
99
|
+
|
|
100
|
+
## Install
|
|
101
|
+
|
|
102
|
+
```sh
|
|
103
|
+
uv add toolroom # or: pip install toolroom
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
toolroom has **zero runtime dependencies** and needs Python 3.11+. The
|
|
107
|
+
docs live at
|
|
108
|
+
[willemkokke.github.io/toolroom](https://willemkokke.github.io/toolroom/).
|
|
109
|
+
MIT licensed.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["uv_build>=0.11,<0.13"]
|
|
3
|
+
build-backend = "uv_build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "livery-toolroom"
|
|
7
|
+
version = "0.6.2"
|
|
8
|
+
description = "Typed surfaces for command-line tools, generated from the tools themselves."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE"]
|
|
12
|
+
requires-python = ">=3.11"
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 3 - Alpha",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
17
|
+
"Typing :: Typed",
|
|
18
|
+
]
|
|
19
|
+
dependencies = []
|
|
20
|
+
|
|
21
|
+
[[project.authors]]
|
|
22
|
+
name = "Willem Kokke"
|
|
23
|
+
email = "mail@willem.net"
|
|
24
|
+
|
|
25
|
+
[project.optional-dependencies]
|
|
26
|
+
test = [
|
|
27
|
+
"livery-footman>=0.52.2",
|
|
28
|
+
"footman>=0.52.2",
|
|
29
|
+
"mkdocs>=1.6",
|
|
30
|
+
"toolroom>=0.6.2",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[project.entry-points."footman.tasks"]
|
|
34
|
+
"livery.toolroom" = "livery.toolroom._docsgen"
|
|
35
|
+
|
|
36
|
+
[project.urls]
|
|
37
|
+
Repository = "https://github.com/willemkokke/livery"
|
|
38
|
+
|
|
39
|
+
[tool.uv.build-backend]
|
|
40
|
+
module-name = "livery.toolroom"
|
|
41
|
+
|
|
42
|
+
[tool.ruff]
|
|
43
|
+
extend = "../../pyproject.toml"
|
|
44
|
+
|
|
45
|
+
[tool.ruff.lint.per-file-ignores]
|
|
46
|
+
"src/**" = [
|
|
47
|
+
"D105",
|
|
48
|
+
"D102",
|
|
49
|
+
"D107",
|
|
50
|
+
"D205",
|
|
51
|
+
"D301",
|
|
52
|
+
"D415",
|
|
53
|
+
]
|
|
54
|
+
"tests/**" = [
|
|
55
|
+
"D1",
|
|
56
|
+
"D205",
|
|
57
|
+
"D301",
|
|
58
|
+
"D415",
|
|
59
|
+
"E501",
|
|
60
|
+
]
|
|
61
|
+
"src/livery/toolroom/_stubs/*.pyi" = [
|
|
62
|
+
"E501",
|
|
63
|
+
"D",
|
|
64
|
+
]
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Seeded from the template channel (package-python kind) at
|
|
2
|
+
# birth; this file is the workspace's own. Edit it directly:
|
|
3
|
+
# the template never rewrites it.
|
|
4
|
+
[build-system]
|
|
5
|
+
requires = ["uv_build>=0.11,<0.13"]
|
|
6
|
+
build-backend = "uv_build"
|
|
7
|
+
|
|
8
|
+
[project]
|
|
9
|
+
name = "livery-toolroom"
|
|
10
|
+
version = "0.6.2"
|
|
11
|
+
description = "Typed surfaces for command-line tools, generated from the tools themselves."
|
|
12
|
+
readme = "README.md"
|
|
13
|
+
license = "MIT"
|
|
14
|
+
license-files = ["LICENSE"]
|
|
15
|
+
requires-python = ">=3.11"
|
|
16
|
+
authors = [{ name = "Willem Kokke", email = "mail@willem.net" }]
|
|
17
|
+
classifiers = [
|
|
18
|
+
"Development Status :: 3 - Alpha",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
21
|
+
"Typing :: Typed",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
# Dependency-free at runtime, pinned by test: the one declared
|
|
25
|
+
# runtime dependency stays reserved for strongroom. The private
|
|
26
|
+
# _machinery and _docsgen modules import footman, and load only
|
|
27
|
+
# through footman's own plugin() - the livery.forge._dev precedent.
|
|
28
|
+
dependencies = []
|
|
29
|
+
|
|
30
|
+
# The suite's needs beyond the (empty) runtime dependencies: the
|
|
31
|
+
# hosted seam, the machinery, and the playground probe all drive
|
|
32
|
+
# footman for real. The isolated release legs install this extra;
|
|
33
|
+
# a consumer never sees it unasked.
|
|
34
|
+
[project.optional-dependencies]
|
|
35
|
+
test = [
|
|
36
|
+
"livery-footman>=0.52.2",
|
|
37
|
+
# The playground harness speaks the compat spelling on purpose
|
|
38
|
+
# (it is the spelling a browser consumer installs), so its probe
|
|
39
|
+
# needs the shim beside the real distribution.
|
|
40
|
+
"footman>=0.52.2",
|
|
41
|
+
# The driver suite interrogates mkdocs structurally (the click
|
|
42
|
+
# ladder) and reads its version; without a venv copy the finder
|
|
43
|
+
# meets whatever the machine carries, which the suite's python
|
|
44
|
+
# cannot introspect.
|
|
45
|
+
"mkdocs>=1.6",
|
|
46
|
+
# The playground writes a consumer tasks.py that imports the
|
|
47
|
+
# package by its index spelling; the suite drives that spelling
|
|
48
|
+
# on purpose, so it needs this package's own shim.
|
|
49
|
+
"toolroom>=0.6.2",
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
[project.entry-points."footman.tasks"]
|
|
53
|
+
"livery.toolroom" = "livery.toolroom._docsgen"
|
|
54
|
+
|
|
55
|
+
[project.urls]
|
|
56
|
+
Repository = "https://github.com/willemkokke/livery"
|
|
57
|
+
|
|
58
|
+
[tool.uv.build-backend]
|
|
59
|
+
# PEP 420 namespace: the importable package is livery.toolroom and
|
|
60
|
+
# there is no livery/__init__.py anywhere in this repository.
|
|
61
|
+
module-name = "livery.toolroom"
|
|
62
|
+
|
|
63
|
+
[tool.ruff]
|
|
64
|
+
extend = "../../pyproject.toml"
|
|
65
|
+
|
|
66
|
+
[tool.ruff.lint.per-file-ignores]
|
|
67
|
+
# The imported sources predate the workspace's pydocstyle rule;
|
|
68
|
+
# their docstring conformance is a tracked content pass, not a
|
|
69
|
+
# cut-time rewrite. Retired by that pass.
|
|
70
|
+
"src/**" = ["D105", "D102", "D107", "D205", "D301", "D415"]
|
|
71
|
+
"tests/**" = ["D1", "D205", "D301", "D415", "E501"]
|
|
72
|
+
# The generated stubs' ruling rides here too when ruff resolves this
|
|
73
|
+
# nested config for the package's own tree.
|
|
74
|
+
"src/livery/toolroom/_stubs/*.pyi" = ["E501", "D"]
|