Clantic
Build testable CLI apps with click and pydantic
clantic makes it easy to define CLI parameters with pydantic BaseModels, combining the power of click with pydantic's data validation.
Features
- Define CLI parameters using pydantic models
- Type validation and conversion out of the box
- Support for arguments, options, flags and switches
- Easy to test CLI applications
Installation
pip install clantic
Simple Example
from pydantic import BaseModel
from clantic import BaseCommand, Group
from clantic.types import Argument, Option
class GreetParams(BaseModel):
name: Argument[str] # required argument
color: Option[str] = "" # Optional --color option with default value
class GreetCommand(BaseCommand[GreetParams]):
NAME = "greet"
def run(self) -> None:
if self.params.color:
print(f"Hello, {self.params.name}. You like the color {self.params.color}.")
else:
print(f"Hello, {self.params.name}.")
cli = Group()
cli.add_command_cls(GreetCommand)
if __name__ == "__main__":
cli()
Parameter Types
Clantic provides several parameter types through the clantic.types module:
Argument
Required positional arguments:
class MyParams(BaseModel):
filename: Argument[str] # Required positional argument
Option
Optional named parameters with default values:
class MyParams(BaseModel):
output: Option[str] = "output.txt" # --output option with default
count: Option[int] = 1 # --count option with default
Flag
Boolean flags that can be enabled:
class MyParams(BaseModel):
verbose: Flag # --verbose flag, defaults to False
Switch
Enum-based switches that create multiple mutually exclusive flags:
from enum import Enum
class LogLevel(str, Enum):
DEBUG = "debug"
INFO = "info"
ERROR = "error"
class MyParams(BaseModel):
log_level: Switch[LogLevel] = (
LogLevel.INFO
) # Creates --debug, --info, --error flags
Advanced Usage
Command Configuration
Commands can be configured using the CONFIG class variable:
class MyCommand(BaseCommand[MyParams]):
NAME = "mycommand"
CONFIG = {
"help": "My command help text",
"short_help": "Short help",
"epilog": "Additional help text at the bottom",
"hidden": False,
"deprecated": False,
}
Option Customization
Options can be customized using OptionSettings:
from typing import Annotated
from clantic.types import OptionSettings
class MyParams(BaseModel):
verbose: Annotated[
int,
OptionSettings(
count=True, # Allow multiple flags (-vvv)
aliases=["-v"], # Add short alias
help="Sets the verbosity level",
),
] = 0
Command Groups
Group multiple commands together:
from clantic import Group
cli = Group()
cli.add_command_cls(CommandOne)
cli.add_command_cls(CommandTwo)
if __name__ == "__main__":
cli()
Testing
Clantic makes it easy to test your CLI applications:
# Import the command we want to test
from my_cli.commands import MyCommand
# Test the command
def test_my_command():
# You can mock, stub, or read the stdout/err
# Run the command:
MyCommand(param1="a", param2="b").run()
License
MIT
Metadata
Release files for clantic 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 | Provenance | Actions |
|---|---|---|---|---|
| clantic-0.2.0.tar.gz | 6.3 kB | Without provenance | Details for clantic-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| clantic-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for clantic-0.2.0-py3-none-any.whl |
Total release size: 14.5 kB
Release files / clantic-0.2.0.tar.gz
| Download URL | clantic-0.2.0.tar.gz |
|---|---|
| Size | 6.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c9b7ca926e0bcfc3d707813171c6790c6e8d350b7ecd3e0d035a09032fb42a5
|
|
BLAKE2b-256 checksum How to use checksums |
369daefa6846907bf65879e014977d8b3be7041a24dd4277f41200bddc223eb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.5 CPython/3.12.12 Linux/6.11.0-1018-azure
|
Release files / clantic-0.2.0-py3-none-any.whl
| Download URL | clantic-0.2.0-py3-none-any.whl |
|---|---|
| Size | 8.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
7608cfef7d805125c048e951cad9ae52588ef745b88690f5cd72ca433103529a
|
|
BLAKE2b-256 checksum How to use checksums |
a44ba0ff01d8340479688315ac9835d2d7d5c8e345f156cb4c9f4806c6eccece
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.8.5 CPython/3.12.12 Linux/6.11.0-1018-azure
|
Security for clantic 0.2.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.