Overview
AsyncCloup is a Cloup fork that works with AsyncClick <https://github.com/python-trio/asyncclick> instead of Click. This should be a drop-in change.
Cloup — originally from “Click + option groups” — enriches Click with several features that make it more expressive and configurable:
option groups and an (optional) help section for positional arguments
constraints, like mutually_exclusive, that can be applied to option groups or to any group of parameters, even conditionally
subcommand aliases
subcommands sections, i.e. the possibility of organizing the subcommands of a Group in multiple help sections
a themeable HelpFormatter that:
has more parameters for adjusting widths and spacing, which can be provided at the context and command level
use a different layout when the terminal width is below a certain threshold in order to improve readability
suggestions like “did you mean <subcommand>?” when you mistype a subcommand.
Moreover, Cloup improves on IDE support providing decorators with detailed type hints and adding the static methods Context.settings() and HelpFormatter.settings() for creating dictionaries of settings.
Cloup is statically type-checked with MyPy in strict mode and extensively tested against multiple versions of Python with nearly 100% coverage.
A simple example
from cloup import (
HelpFormatter, HelpTheme, Style,
command, option, option_group
)
from cloup.constraints import RequireAtLeast, mutually_exclusive
# Check the docs for all available arguments of HelpFormatter and HelpTheme.
formatter_settings = HelpFormatter.settings(
theme=HelpTheme(
invoked_command=Style(fg='bright_yellow'),
heading=Style(fg='bright_white', bold=True),
constraint=Style(fg='magenta'),
col1=Style(fg='bright_yellow'),
)
)
# In a multi-command app, you can pass formatter_settings as part
# of your context_settings so that they are propagated to subcommands.
@command(formatter_settings=formatter_settings)
@option_group(
"Cool options",
option('--foo', help='This text should describe the option --foo.'),
option('--bar', help='This text should describe the option --bar.'),
constraint=mutually_exclusive,
)
@option_group(
"Other cool options",
"This is the optional description of this option group.",
option('--pippo', help='This text should describe the option --pippo.'),
option('--pluto', help='This text should describe the option --pluto.'),
constraint=RequireAtLeast(1),
)
async def cmd(**kwargs):
"""This is the command description."""
await anyio.sleep(1)
if __name__ == '__main__':
cmd(prog_name='invoked-command')
If you don’t provide --pippo or --pluto:
Usage: invoked-command [OPTIONS]
Try 'invoked-command --help' for help.
Error: at least 1 of the following parameters must be set:
--pippo
--pluto
This simple example just scratches the surface. Read more in the documentation (links below).
Links
99% of Cloup’s documentation applies to AsyncCloup. Thus replicating it doesn’t seem to be necessary. Thus, please refer to their examples; feel fre to liberally sprinkle async and await onto your code, and don’t hesitate to file an issue if something doesn’t work.
Metadata
Release files for asynccloup 3.0.8.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| asynccloup-3.0.8.2.tar.gz | 230.2 kB | Without provenance | Details for asynccloup-3.0.8.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| asynccloup-3.0.8.2-py2.py3-none-any.whl | Python 2, Python 3 | none | any | Details for asynccloup-3.0.8.2-py2.py3-none-any.whl |
Total release size: 285.3 kB
Release files / asynccloup-3.0.8.2.tar.gz
| Download URL | asynccloup-3.0.8.2.tar.gz |
|---|---|
| Size | 230.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
20ebd70b652540ae086e984b4db432c5bda1a3a86c0731148a529eae9cd3984f
|
|
BLAKE2b-256 checksum How to use checksums |
16a018c90badff70ad2ad41ce3a7d927daf24b6c9dfffa51252283c31cdd1005
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|
Release files / asynccloup-3.0.8.2-py2.py3-none-any.whl
| Download URL | asynccloup-3.0.8.2-py2.py3-none-any.whl |
|---|---|
| Size | 55.1 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
a5d5507e3fca458dbafb74028d0ee223816a8edc99df651a113547d818f502dc
|
|
BLAKE2b-256 checksum How to use checksums |
505ad3353cde4402b230be3727c9882609db14a09a4c03e3a5169d84e4de1661
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|
Security for asynccloup 3.0.8.2
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.