Source code for django_typer.parsers.apps
import typing as t
from django.apps import AppConfig, apps
from django.core.management import CommandError
[docs]
def app_config(label: t.Union[str, AppConfig]):
"""
A parser for app :attr:`~django.apps.AppConfig.label`. If the label is already
an :class:`~django.apps.AppConfig` instance, the instance is returned. The label
will be tried first, if that fails the label will be treated as the app
:attr:`~django.apps.AppConfig.name`.
.. code-block:: python
import typing as t
import typer
from django_typer.management import TyperCommand
from django_typer.parsers import app_config
class Command(TyperCommand):
def handle(
self,
django_apps: t.Annotated[
t.List[AppConfig],
typer.Argument(
parser=app_config,
help=_("One or more application labels.")
)
]
):
...
:param label: The label to map to an AppConfig instance.
:raises CommandError: If no matching app can be found.
"""
if isinstance(label, AppConfig):
return label
try:
return apps.get_app_config(label)
except LookupError as err:
for cfg in apps.get_app_configs():
if cfg.name == label:
return cfg
raise CommandError(f"{label} does not match any installed app label.") from err
app_config.__name__ = "APP_LABEL"