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)
| File | Size | Uploaded | |
|---|---|---|---|
| typer_builder-0.0.11.tar.gz | 9.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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
|