Skip to main content

No project description provided

Project description

terracomp-typer

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 terracomp_typer 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(): ... (see Typer.add_callback()).
  • Modules are treated as commands and must define a def main(): ... (see Typer.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 terracomp_typer.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 terracomp-typer.
"""

from mypackage.config import CliConfig
from pathlib import Path
from terracomp_typer 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

terracomp_typer-0.0.5.tar.gz (6.8 kB view details)

Uploaded Source

Built Distribution

terracomp_typer-0.0.5-py3-none-any.whl (8.0 kB view details)

Uploaded Python 3

File details

Details for the file terracomp_typer-0.0.5.tar.gz.

File metadata

  • Download URL: terracomp_typer-0.0.5.tar.gz
  • Upload date:
  • Size: 6.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/37.3 requests/2.28.2 requests-toolbelt/0.10.1 urllib3/1.26.14 tqdm/4.64.1 importlib-metadata/6.0.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.9

File hashes

Hashes for terracomp_typer-0.0.5.tar.gz
Algorithm Hash digest
SHA256 6130cb5db0ea28f9cf1aca678e55f63e775c29f54c60b6ed5cf574fd7e1f1524
MD5 3a246e2038d401d3a7ab3898319effb2
BLAKE2b-256 0da2afe136151807dcdc866eed1fbcd82263c6d29882c0e5bc9e0ae06ed9a19a

See more details on using hashes here.

File details

Details for the file terracomp_typer-0.0.5-py3-none-any.whl.

File metadata

  • Download URL: terracomp_typer-0.0.5-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.9.6 readme-renderer/37.3 requests/2.28.2 requests-toolbelt/0.10.1 urllib3/1.26.14 tqdm/4.64.1 importlib-metadata/6.0.0 keyring/23.13.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.9

File hashes

Hashes for terracomp_typer-0.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 bce4f8f8dbe7714fd3f03da44347577ca42d62b87bda8d471586063f40e662f0
MD5 05a2cc57e990c5deb1f88b6f85e70cb4
BLAKE2b-256 0caced6307c08731b24f7e6cca3f67d44d3791f39a0e6eed97e75b777782bcea

See more details on using hashes here.

Supported by

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