protocli
Signature-driven CLI dispatcher: typed function signatures become argparse parsers, modules become lazily-imported subcommands, with nested dispatch, --help-all and lazy shell completions.
# mytool/__main__.py
from protocli import Dispatcher
Dispatcher(
"mytool",
{
"greet": greet, # a callable: its signature IS the parser
"db": "mytool.db", # a module path: lazy-imported on dispatch
},
).run()
A callable (or a module's main) maps to CLI arguments by signature:
def greet(
name: str, # required positional
title: str | None = None, # optional positional
*rest: str, # variadic
loud: bool = False, # --loud (keyword-only, default False)
times: int = 1, # --times N
lang: Literal["en", "hu"] = "en", # --lang restricted to choices
tags: list[str] = [], # --tags a,b,c (comma-separated)
): ...
Dynamic completions
Literal fixes a closed set the parser enforces. Complete carries candidates the parser never sees — computed on demand, when the shell asks and only then:
from typing import Annotated
from protocli import Complete, FILES
Machine = Annotated[str, Complete(inventory.get_names)] # any () -> Sequence[str]
def deploy(*names: Machine, config: Annotated[str, FILES] = ""): ...
deploy <TAB> offers the machine names, dropping the ones already typed (Complete(fn, repeat=True) keeps them); --config <TAB> defers to the shell's native pathname completion.
The completer runs on the --complete path alone — never on dispatch, never under --help-all. Its values are advisory and never become argparse choices, so an unknown value reaches the function and is rejected there, with the function's own error. That is the difference from Literal, and the reason the two are exclusive on one parameter.
Completion resolves which parameter the cursor sits on, so positionals, variadics and flag values all complete. A module can instead expose a get_completions(rest) hook when candidates depend on more than one argument, or its own nested _dispatcher = Dispatcher(...).
mytool --help-all prints every parser in the tree; mytool --complete <args…>
emits completion candidates for shell integration.
Auto-discovery over a package's public modules:
Dispatcher.from_package("mytool").run()
Release files for protocli 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| protocli-0.2.0.tar.gz | 10.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| protocli-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.0 kB
Release files / protocli-0.2.0.tar.gz
| Download URL | protocli-0.2.0.tar.gz |
|---|---|
| Size | 10.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a428192c400e74e4f8dcf3c94be518ce6b56449cc4a01cfcca3fd760abb02cfc
|
|
BLAKE2b-256 checksum How to use checksums |
5d9cda95130b7a49bb58519956161fc4a484402d690db7493a3962aff91a12ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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 / protocli-0.2.0-py3-none-any.whl
| Download URL | protocli-0.2.0-py3-none-any.whl |
|---|---|
| Size | 11.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e7a718faf9153cca3cb72a41c6d9a41e71bd9858396c560099481e37a05f76a8
|
|
BLAKE2b-256 checksum How to use checksums |
b29481edc1027d67d6c8ac7071574b1f3aab6be46c3808732951bad77defde9b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","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}
|