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'