No project description provided
Project description
typer-builder
This package allows you to easily build a Typer CLI application from a Python module hierarchy.
Quickstart
$ tree src/mypackage/commands/
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()
Features
- Packages are treated as command groups and may define a
def callback(): ...
(seeTyper.add_callback()
). - Modules are treated as commands and must define a
def main(): ...
(seeTyper.command()
). - Underscores in package or module names are normalized to hyphens (e.g
my_command
->my-command
). - Command(-group) help text is extracted from the package or module docstring, or from the
main()
docstring. - [WIP] Improved and dynamic dependency injection.
- Support for new-style type hints in older versions of Python and Typer (e.g.
str | None
).
Dependency Injection
The typer_builder.DependencyInjector
is essentially a mapping of types to a corresponding implementation. It allows
you to bind any function to the given dependencies based on the function signature.
The build_app_from_module()
takes a dependencies
argument which populates a DependencyInjector
. All callback()
and main()
functions encountered and added to a typer.Typer
object are first bound to the dependencies that can be
served by the injector.
The types for which injection can take place must be known in advance. If the implementation is not known in advance,
a callback()
can accept the DependencyInjector
as an argument and inform about the dependencies that will be
provided by the callback, allowing any of its subcommands to resolve it.
# src/mypackages/commands/__init__.py
"""
This is a cool CLI that uses typer-builder.
"""
from mypackage.config import CliConfig
from pathlib import Path
from typer_builder import DependencyInjector, DelayedBinding
from typer import Option
def callback(
config_file: Path = Option(Path("~/.config/mypackage.ini"), help="Path to the configuration file."),
dependencies: DependencyInjector = DelayedBinding(CliConfig),
) -> None:
dependencies.register_supplier(CliConfig, lambda: CliConfig.load(config_file))
# src/mypackage/commands/hello.py
from mypackage.config import CliConfig
def main(name: str, config: CliConfig) -> None:
# ...
In the above example, the config
parameter is not passed by Typer, but instead by the DependencyInjector
per the implementation in the previous callback()
snippet.
Known caveats
- Only concrete types are supported (no
Optional[CliConfig]
or vice versa).
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. Usually, ty
# src/mypackage/commands/hello.py
from mypackage.config import CliConfig
def main(name: str | None = None) -> None:
# ...
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
Built Distribution
File details
Details for the file typer_builder-0.0.7.tar.gz
.
File metadata
- Download URL: typer_builder-0.0.7.tar.gz
- Upload date:
- Size: 6.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.3 readme-renderer/37.3 requests/2.28.1 requests-toolbelt/0.10.1 urllib3/1.26.12 tqdm/4.64.1 importlib-metadata/5.0.0 keyring/23.11.0 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ad98d20ed580d524cc1bfa6ac464ca72a6a42dfc132597f4e5f04cadcf118d72 |
|
MD5 | da9e948d1889a3f3fbf750dd95ef2393 |
|
BLAKE2b-256 | 613f0c7c8d3e66f45bf6c1765803b43da5b3cfe64cdd2d7f083c10578d9f944d |
File details
Details for the file typer_builder-0.0.7-py3-none-any.whl
.
File metadata
- Download URL: typer_builder-0.0.7-py3-none-any.whl
- Upload date:
- Size: 8.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.8.0 pkginfo/1.8.3 readme-renderer/37.3 requests/2.28.1 requests-toolbelt/0.10.1 urllib3/1.26.12 tqdm/4.64.1 importlib-metadata/5.0.0 keyring/23.11.0 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.11
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6ab9f629ebd037b0161491034fc4a992283fab8422c33b68560031f4ba67411f |
|
MD5 | d5ac2d7f0697940576359cf7aed56c8e |
|
BLAKE2b-256 | b693e90d7513f5423fc5567b2787399ec208aab92f7aa51c543636812ea58e9a |