Source code for faust.cli.params

"""Python :pypi:`click` parameter types."""

from typing import Any, Iterable, Optional

import click
from click.types import ParamType, StringParamType
from yarl import URL

__all__ = [
    "WritableDirectory",
    "WritableFilePath",
    "CaseInsensitiveChoice",
    "TCPPort",
    "URLParam",
]


WritableDirectory = click.Path(
    exists=False,  # create if needed,
    file_okay=False,  # must be directory,
    dir_okay=True,  # not file;
    writable=True,  # and read/write access.
    readable=True,  #
)

WritableFilePath = click.Path(
    exists=False,  # create if needed,
    file_okay=True,  # must be file,
    dir_okay=False,  # not directory;
    writable=True,  # and read/write access.
    readable=True,  #
)


[docs]class CaseInsensitiveChoice(click.Choice): """Case-insensitive version of :class:`click.Choice`.""" def __init__(self, choices: Iterable[Any]) -> None: self.choices = [str(val).lower() for val in choices] self.case_sensitive = False # required by click 7.x
[docs] def convert( self, value: str, param: Optional[click.Parameter], ctx: Optional[click.Context] ) -> Any: """Convert string to case-insensitive choice.""" if value.lower() in self.choices: return value return super().convert(value, param, ctx)
[docs]class TCPPort(click.IntRange): """CLI option: TCP Port (integer in range 1 - 65535).""" name = "range[1-65535]" def __init__(self) -> None: super().__init__(1, 65535)
[docs]class URLParam(ParamType): """URL :pypi:`click` parameter type. Converts any string URL to :class:`yarl.URL`. """ name = "URL" _string_param: StringParamType def __init__(self) -> None: self._string_param = StringParamType()
[docs] def convert( self, value: str, param: Optional[click.Parameter], ctx: Optional[click.Context] ) -> URL: """Convert :class:`str` argument to :class:`yarl.URL`.""" text_value = self._string_param.convert(value, param, ctx) return URL(text_value)
def __repr__(self) -> str: return "URL"