Skip to main content

Declaratively connect cli and config definition using pydantic

Project description

clonf

PyPI version GitHub license PyPI - Downloads

Declaratively connect cli and config definition using pydantic.

Why another?

There are a lot of tools out there which try to bring cli libraries and pydantic together, but they all seem to forget that more sophisticated applications need to be controlled via configuration files as well. clonf tries to solve this problem by focusing on compatibility with pydantic-settings and its configuration sources. This allows having a single source of truth for cli and configuration definition. clonf uses composition rather than inheritance and utilizes logic from pydantic and pydantic-settings to achieve this with as much simplicity and flexibility as possible. First versions focus on integration with click, but other cli libraries might receive interfaces as well in the future.

Key differences to other pydantic x cli libraries

  • CLI behavior is opt-in.
  • Designed to work well with pydantic-settings.
  • As much as possible is done via annotations. Combined with pydantic best practices, this encourages creating a single source of truth inside your codebase.

Installation

clonf can be installed via pip or your favorite python package manager with different extras:

pip install clonf[all,click,settings]

Creating a CLI

click

Quickstart

from pydantic import BaseModel
from clonf import clonf_click, CliArgument, CliOption
from typing import Annotated
import click


class Arguments(BaseModel):
    name: Annotated[str, CliArgument()]


class Options(BaseModel):
    greeting: Annotated[str, CliOption()] = "Hello"


@click.command
@clonf_click
def cli(arguments: Arguments, options: Options) -> None:
    click.echo(f"{options.greeting} {arguments.name}")


if __name__ == "__main__":
    cli()

Using click types

Similar to pydanclick, the following types will be converted automatically:

Python type Click type CLI input format example
bool click.BOOL true, false
str click.STRING value
int click.INT 1
float click.FLOAT 1.2
Annotated[int, Field(lt=..., ge=...) click.IntRange() 2
Annotated[float, Field(lt=..., ge=...) click.FloatRange() 4.2
pathlib.Path click.Path() /etc/path
uuid.UUID click.UUID 9b5a1c83-3b6a-46b1-9c79-4b67e02b0e0f
datetime.datetime, datetime.date click.DateTime() 2025-10-19, 2025-10-19T19:10:42, 2025-10-19 19:10:42
Literal click.Choice value
dict clonf.integrations.click.params.ClickMapping key1=value1, key1=value1,key2=value2
list clonf.integrations.click.params.ClickList 42, 42,187

Additionally, custom click types can be passed via annotations to have finer control over the resulting click type:

from pydantic import BaseModel
from typing import Annotated
from clonf import CliArgument
import pathlib
import click

class Config(BaseModel):
    file_path: Annotated[pathlib.Path, CliArgument(), click.Path(exists=True)]

Contributing

This project uses PDM as a package manager and pre-commit for linting before commits.

Read more about the tools and how to use them:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

clonf-0.4.1.tar.gz (10.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

clonf-0.4.1-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file clonf-0.4.1.tar.gz.

File metadata

  • Download URL: clonf-0.4.1.tar.gz
  • Upload date:
  • Size: 10.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: pdm/2.26.0 CPython/3.13.7 Linux/6.11.0-1018-azure

File hashes

Hashes for clonf-0.4.1.tar.gz
Algorithm Hash digest
SHA256 98ef3ab0a595d49c48aeccfe613248c2a8b9f2a1f7624f38bb732b10bc451019
MD5 765be28e0555a3615a946c6d2ebcd9d2
BLAKE2b-256 c784e39642ff83f5ba25e6b46d047793045a3e8e80df819ea3c53eb7a567ff82

See more details on using hashes here.

File details

Details for the file clonf-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: clonf-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: pdm/2.26.0 CPython/3.13.7 Linux/6.11.0-1018-azure

File hashes

Hashes for clonf-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1cefc2613ccb789fe03d9ac69f62d9b0e3b7a06fa81baa05e6b342a5addab044
MD5 fded1cd92318244586bbaf2fa1bb6ff4
BLAKE2b-256 bd73330d3163a4ca14269f83a98455bdf1f518571e03f77b4ba75c0ed8432bd4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page