Build testable CLI apps with `click` and `pydantic`
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file clantic-0.2.0.tar.gz.
File metadata
- Download URL: clantic-0.2.0.tar.gz
- Upload date:
- Size: 6.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.12.12 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c9b7ca926e0bcfc3d707813171c6790c6e8d350b7ecd3e0d035a09032fb42a5
|
|
| MD5 |
08be593b2899777d2c4f3ed10498c7b3
|
|
| BLAKE2b-256 |
369daefa6846907bf65879e014977d8b3be7041a24dd4277f41200bddc223eb8
|
File details
Details for the file clantic-0.2.0-py3-none-any.whl.
File metadata
- Download URL: clantic-0.2.0-py3-none-any.whl
- Upload date:
- Size: 8.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.5 CPython/3.12.12 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7608cfef7d805125c048e951cad9ae52588ef745b88690f5cd72ca433103529a
|
|
| MD5 |
1eaf8fbeba757ead88ed2d22822f5163
|
|
| BLAKE2b-256 |
a44ba0ff01d8340479688315ac9835d2d7d5c8e345f156cb4c9f4806c6eccece
|