Skip to main content

typer-builder

A framework for simplifying the development of Typer based CLIs supporting modern type hints and hierarchical dependency injection.

Table of Contents

Introduction

The build_app_from_module() inspect a hierarchy of Python modules to build a Typer command and group structure. Packages are treated as command groups and may define a callback() member. Modules are treated commands and must define a main() member. Modules and packages prefixed with an underscore ( _ ) are ignored. Help text is extracted from the main() docstring or the module docstring.

In addition, we provide support for new-style type hints (PEP 585 - Type Hinting Generics in Standard Collections and PEP 604 - Union Operators) in older versions of Python as well as adapt it for Typer (e.g. list[str] and str | None), as well as a method of injecting dependencies to functions that are not sourced from the command-line.

Example

$ tree src/mypackage/
src/mypackage/
├── __init__.py
├── __main__.py
└── commands
    ├── __init__.py
    ├── hello.py
    └── bye.py
# src/mypackage/commands/hello.py
def main(name: str) -> None:
    print("Hello,", name)
# src/mypackage/__main__.py
from typer_builder import build_app_from_module

if __name__ == "__main__":
    app = build_app_from_module("mypackage.commands")
    app()

Documentation

New-style type hint support

Through typeapi, we can convert new-tyle type hints such as str | None or list[int] to their corresponding representation using typing before the function signature is parsed by Typer.

# src/mypackage/commands/create_user.py
from ___future__ import annotations

def main(name: str | None = None, groups: list[str] | None = None) -> None:
    # ...

typeapi also allows us to convert list[str] to List[str] and dict[str, int] to Dict[str, int] for Python versions prior to 3.9. This is necessary because Typer does not support the new-style type hints.

Dependency injection

The typer_builder.Dependencies object is used to map types to concrete values or functions that provide them. Functions wrapped with Dependencies.bind() will have their arguments resolved by the injector based on type annotations. Every build_app_from_module() call creates a new Dependencies instance. Dependencies can be injected from the outside by passing a Dependencies instance to build_app_from_module() or by providing additional dependencies via a callback() function on the command group.

Note that the Dependencies does not understand generics with different type parameters. For example, it makes no distinction between MyGeneric[int] and MyGeneric[str]. This is a limitation of the current implementation as well as the Python type system.

The most common use case for dependency injection is to inject configuration managers or clients into subcommands. For an example, you should check out the examples/dependency-injection directory.

License

This project is licensed under the terms of the MIT license.

Metadata

Release files for typer-builder 0.0.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for typer-builder 0.0.11
File Size Uploaded
typer_builder-0.0.11.tar.gz 9.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for typer-builder 0.0.11
File Interpreter ABI Platform
typer_builder-0.0.11-py3-none-any.whl Python 3 none any Details

Total release size: 19.2 kB

Release files / typer_builder-0.0.11.tar.gz

Download URL typer_builder-0.0.11.tar.gz
Size 9.5 kB
Tags Source
SHA-256 checksum
How to use checksums
b3bb4ccf79d56f5656f69243785a527d26812db70d7b799d6eded14baad99062
BLAKE2b-256 checksum
How to use checksums
ab0fee027c4f8f0c6377a0620c9e03a762a2a0e7fe58431376c3b5843c48863e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.8.0 pkginfo/1.9.6 readme-renderer/37.3 requests/2.30.0 requests-toolbelt/1.0.0 urllib3/2.0.2 tqdm/4.65.0 importlib-metadata/6.6.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.2

Release files / typer_builder-0.0.11-py3-none-any.whl

Download URL typer_builder-0.0.11-py3-none-any.whl
Size 9.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1b185818cf7dd5873692cbb79e06a9ef878c0bd487c103251a3792e8899b639d
BLAKE2b-256 checksum
How to use checksums
0c0fbdb530946d65b736ec13f191e8e49cfbce748a41bf6259308858de863805
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.8.0 pkginfo/1.9.6 readme-renderer/37.3 requests/2.30.0 requests-toolbelt/1.0.0 urllib3/2.0.2 tqdm/4.65.0 importlib-metadata/6.6.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.2

Release history Release notifications | RSS feed

This release

0.0.11 This release

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page