Skip to main content

Use Typer to define the CLI for your Django management commands.

Project description

MIT license PyPI version fury.io PyPI pyversions PyPI djversions PyPI status Documentation Status Code Cov Test Status Lint Status Code Style

django-typer

Use Typer to define the CLI for your Django management commands. Provides a TyperCommand class that inherits from BaseCommand and allows typer-style annotated parameter types. All of the BaseCommand functionality is preserved, so that TyperCommand can be a drop in replacement.

django-typer makes it easy to:

  • Define your command CLI interface in a clear, DRY and safe way using type hints

  • Create subcommand and group command hierarchies.

  • Use the full power of Typer’s parameter types to validate and parse command line inputs.

  • Create beautiful and information dense help outputs.

  • Configure the rendering of exception stack traces using rich.

  • Install shell tab-completion support for TyperCommands and normal Django commands for bash, zsh, fish and powershell.

  • Create custom and portable shell tab-completions for your CLI parameters.

  • Refactor existing management commands into TyperCommands because TyperCommand is interface compatible with BaseCommand.

Please refer to the full documentation for more information.

https://raw.githubusercontent.com/bckohan/django-typer/main/doc/source/_static/img/closepoll_example.gif

Installation

  1. Clone django-typer from GitHub or install a release off PyPI:

    pip install django-typer

    rich is a powerful library for rich text and beautiful formatting in the terminal. It is not required, but highly recommended for the best experience:

    pip install "django-typer[rich]"
  2. Add django_typer to your INSTALLED_APPS setting:

    INSTALLED_APPS = [
        ...
        'django_typer',
    ]

    You only need to install django_typer as an app if you want to use the shellcompletion command to enable tab-completion or if you would like django-typer to install `rich traceback rendering <https://django-typer.readthedocs.io/en/latest/howto.html#configure-rich-stack-traces>`_ for you - which it does by default if rich is also installed.

Basic Example

For example TyperCommands can be a very simple drop in replacement for BaseCommands. All of the documented features of BaseCommand work!

from django_typer import TyperCommand


class Command(TyperCommand):

   def handle(self, arg1: str, arg2: str, arg3: float = 0.5, arg4: int = 1):
      """
      A basic command that uses Typer
      """
https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/basic.svg

Multiple Subcommands Example

Or commands with multiple subcommands can be defined:

import typing as t

from django.utils.translation import gettext_lazy as _
from typer import Argument

from django_typer import TyperCommand, command


class Command(TyperCommand):
   """
   A command that defines subcommands.
   """

   @command()
   def create(
      self,
      name: t.Annotated[str, Argument(help=_("The name of the object to create."))],
   ):
      """
      Create an object.
      """

   @command()
   def delete(
      self, id: t.Annotated[int, Argument(help=_("The id of the object to delete."))]
   ):
      """
      Delete an object.
      """
https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/multi.svg https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/multi_create.svg https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/multi_delete.svg

Grouping and Hierarchies Example

Or more complex groups and subcommand hierarchies can be defined. For example this command defines a group of commands called math, with subcommands divide and multiply. The group has a common initializer that optionally sets a float precision value. We would invoke this command like so:

./manage.py hierarchy math --precision 5 divide 10 2.1
4.76190
./manage.py hierarchy math multiply 10 2
20.00

Any number of groups and subcommands and subgroups of other groups can be defined allowing for arbitrarily complex command hierarchies.

import typing as t
from functools import reduce

from django.utils.translation import gettext_lazy as _
from typer import Argument, Option

from django_typer import TyperCommand, group


class Command(TyperCommand):

   help = _("A more complex command that defines a hierarchy of subcommands.")

   precision = 2

   @group(help=_("Do some math at the given precision."))
   def math(
      self,
      precision: t.Annotated[
         int, Option(help=_("The number of decimal places to output."))
      ] = precision,
   ):
      self.precision = precision

   @math.command(help=_("Multiply the given numbers."))
   def multiply(
      self,
      numbers: t.Annotated[
         t.List[float], Argument(help=_("The numbers to multiply"))
      ],
   ):
      return f"{reduce(lambda x, y: x * y, [1, *numbers]):.{self.precision}f}"

   @math.command()
   def divide(
      self,
      numerator: t.Annotated[float, Argument(help=_("The numerator"))],
      denominator: t.Annotated[float, Argument(help=_("The denominator"))],
      floor: t.Annotated[bool, Option(help=_("Use floor division"))] = False,
   ):
      """
      Divide the given numbers.
      """
      if floor:
            return str(numerator // denominator)
      return f"{numerator / denominator:.{self.precision}f}"
https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/hierarchy.svg https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/hierarchy_math.svg https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/hierarchy_math_multiply.svg https://raw.githubusercontent.com/bckohan/django-typer/main/django_typer/examples/helps/hierarchy_math_divide.svg

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

django_typer-1.0.8.tar.gz (44.3 kB view details)

Uploaded Source

Built Distribution

django_typer-1.0.8-py3-none-any.whl (44.8 kB view details)

Uploaded Python 3

File details

Details for the file django_typer-1.0.8.tar.gz.

File metadata

  • Download URL: django_typer-1.0.8.tar.gz
  • Upload date:
  • Size: 44.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.11.4 Darwin/23.2.0

File hashes

Hashes for django_typer-1.0.8.tar.gz
Algorithm Hash digest
SHA256 aaa0ea5032f1226e9e07c394d625ba2af8ffd7609941ced834066ee1640f2b34
MD5 eaa555d330633eecf31a8f59050d0471
BLAKE2b-256 7bd0a58d5c853ae89a1d0d6348dcde4be11d8e8a1b2c8ed938047f82e278a081

See more details on using hashes here.

File details

Details for the file django_typer-1.0.8-py3-none-any.whl.

File metadata

  • Download URL: django_typer-1.0.8-py3-none-any.whl
  • Upload date:
  • Size: 44.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.11.4 Darwin/23.2.0

File hashes

Hashes for django_typer-1.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 b3a4765d0c29e545f5a9b69ea22391696d8d6bc6422a99a671962d1f3d0fca95
MD5 7e488e03d79f80e370970846325cda9d
BLAKE2b-256 0ebfc416b30fd4c3c1d0fe77c137117e22da09767a76d5a23676cc6c6aee7cbb

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