Source code for django_typer.completers.apps
import typing as t
from click import Context, Parameter
from click.core import ParameterSource
from click.shell_completion import CompletionItem
from django.apps import apps
[docs]
def app_labels(
ctx: Context, param: Parameter, incomplete: str
) -> t.List[CompletionItem]:
"""
A case-sensitive completer for Django app labels or names. The completer
prefers labels but names will also work.
.. code-block:: python
import typing as t
import typer
from django_typer.management import TyperCommand
from django_typer.parsers import parse_app_label
from django_typer.completers import complete_app_label
class Command(TyperCommand):
def handle(
self,
django_apps: t.Annotated[
t.List[AppConfig],
typer.Argument(
parser=parse_app_label,
shell_complete=complete_app_label,
help=_("One or more application labels.")
)
]
):
...
:param ctx: The click context.
:param param: The click parameter.
:param incomplete: The incomplete string.
:return: A list of matching app labels or names. Labels already present for the
parameter on the command line will be filtered out.
"""
present = []
if (
param.name
and ctx.get_parameter_source(param.name) is not ParameterSource.DEFAULT
):
present = [app.label for app in (ctx.params.get(param.name) or [])]
ret = [
CompletionItem(app.label)
for app in apps.get_app_configs()
if app.label.startswith(incomplete) and app.label not in present
]
if not ret and incomplete:
ret = [
CompletionItem(app.name)
for app in apps.get_app_configs()
if app.name.startswith(incomplete)
and app.name not in present
and app.label not in present
]
return ret