96b29e9639
* ⬆️ Upgrade required Click to 7.1.1 and pin it to patch versions as a MINOR version broke compatibility, so I'll have to upgrade manually every time * 📌 Fix pinning Click to MINOR version * ✨ Upgrade code to be compatible with latest Click changes * ✅ Update tests with new format for errors * 📝 Update docs to keep them in sync with actual output
392 lines
11 KiB
Python
392 lines
11 KiB
Python
import io
|
|
from typing import (
|
|
TYPE_CHECKING,
|
|
Any,
|
|
Callable,
|
|
Dict,
|
|
List,
|
|
Optional,
|
|
Sequence,
|
|
Type,
|
|
TypeVar,
|
|
Union,
|
|
)
|
|
|
|
import click
|
|
|
|
if TYPE_CHECKING: # pragma: no cover
|
|
from .main import Typer # noqa
|
|
|
|
|
|
NoneType = type(None)
|
|
|
|
AnyType = Type[Any]
|
|
|
|
Required = ...
|
|
|
|
|
|
class Context(click.Context):
|
|
pass
|
|
|
|
|
|
class FileText(io.TextIOWrapper):
|
|
pass
|
|
|
|
|
|
class FileTextWrite(FileText):
|
|
pass
|
|
|
|
|
|
class FileBinaryRead(io.BufferedReader):
|
|
pass
|
|
|
|
|
|
class FileBinaryWrite(io.BufferedWriter):
|
|
pass
|
|
|
|
|
|
class DefaultPlaceholder:
|
|
"""
|
|
You shouldn't use this class directly.
|
|
|
|
It's used internally to recognize when a default value has been overwritten, even
|
|
if the new value is `None`.
|
|
"""
|
|
|
|
def __init__(self, value: Any):
|
|
self.value = value
|
|
|
|
def __bool__(self) -> bool:
|
|
return bool(self.value)
|
|
|
|
|
|
DefaultType = TypeVar("DefaultType")
|
|
|
|
CommandFunctionType = TypeVar("CommandFunctionType", bound=Callable[..., Any])
|
|
|
|
|
|
def Default(value: DefaultType) -> DefaultType:
|
|
"""
|
|
You shouldn't use this function directly.
|
|
|
|
It's used internally to recognize when a default value has been overwritten, even
|
|
if the new value is `None`.
|
|
"""
|
|
return DefaultPlaceholder(value) # type: ignore
|
|
|
|
|
|
class CommandInfo:
|
|
def __init__(
|
|
self,
|
|
name: Optional[str] = None,
|
|
*,
|
|
cls: Optional[Type[click.Command]] = None,
|
|
context_settings: Optional[Dict[Any, Any]] = None,
|
|
callback: Optional[Callable[..., Any]] = None,
|
|
help: Optional[str] = None,
|
|
epilog: Optional[str] = None,
|
|
short_help: Optional[str] = None,
|
|
options_metavar: str = "[OPTIONS]",
|
|
add_help_option: bool = True,
|
|
no_args_is_help: bool = False,
|
|
hidden: bool = False,
|
|
deprecated: bool = False,
|
|
):
|
|
self.name = name
|
|
self.cls = cls
|
|
self.context_settings = context_settings
|
|
self.callback = callback
|
|
self.help = help
|
|
self.epilog = epilog
|
|
self.short_help = short_help
|
|
self.options_metavar = options_metavar
|
|
self.add_help_option = add_help_option
|
|
self.no_args_is_help = no_args_is_help
|
|
self.hidden = hidden
|
|
self.deprecated = deprecated
|
|
|
|
|
|
class TyperInfo:
|
|
def __init__(
|
|
self,
|
|
typer_instance: Optional["Typer"] = Default(None),
|
|
*,
|
|
name: Optional[str] = Default(None),
|
|
cls: Optional[Type[click.Command]] = Default(None),
|
|
invoke_without_command: bool = Default(False),
|
|
no_args_is_help: Optional[bool] = Default(None),
|
|
subcommand_metavar: Optional[str] = Default(None),
|
|
chain: bool = Default(False),
|
|
result_callback: Optional[Callable] = Default(None),
|
|
# Command
|
|
context_settings: Optional[Dict[Any, Any]] = Default(None),
|
|
callback: Optional[Callable[..., Any]] = Default(None),
|
|
help: Optional[str] = Default(None),
|
|
epilog: Optional[str] = Default(None),
|
|
short_help: Optional[str] = Default(None),
|
|
options_metavar: str = Default("[OPTIONS]"),
|
|
add_help_option: bool = Default(True),
|
|
hidden: bool = Default(False),
|
|
deprecated: bool = Default(False),
|
|
):
|
|
self.typer_instance = typer_instance
|
|
self.name = name
|
|
self.cls = cls
|
|
self.invoke_without_command = invoke_without_command
|
|
self.no_args_is_help = no_args_is_help
|
|
self.subcommand_metavar = subcommand_metavar
|
|
self.chain = chain
|
|
self.result_callback = result_callback
|
|
self.context_settings = context_settings
|
|
self.callback = callback
|
|
self.help = help
|
|
self.epilog = epilog
|
|
self.short_help = short_help
|
|
self.options_metavar = options_metavar
|
|
self.add_help_option = add_help_option
|
|
self.hidden = hidden
|
|
self.deprecated = deprecated
|
|
|
|
|
|
class ParameterInfo:
|
|
def __init__(
|
|
self,
|
|
*,
|
|
default: Optional[Any] = None,
|
|
param_decls: Optional[Sequence[str]] = None,
|
|
callback: Optional[Callable[[click.Context, click.Parameter, str], Any]] = None,
|
|
metavar: Optional[str] = None,
|
|
expose_value: bool = True,
|
|
is_eager: bool = False,
|
|
envvar: Optional[Union[str, List[str]]] = None,
|
|
autocompletion: Optional[
|
|
Callable[[click.Context, List[str], str], List[str]]
|
|
] = None,
|
|
# Choice
|
|
case_sensitive: bool = True,
|
|
# Numbers
|
|
min: Optional[Union[int, float]] = None,
|
|
max: Optional[Union[int, float]] = None,
|
|
clamp: bool = False,
|
|
# DateTime
|
|
formats: Optional[Union[List[str]]] = None,
|
|
# File
|
|
mode: str = None,
|
|
encoding: Optional[str] = None,
|
|
errors: Optional[str] = "strict",
|
|
lazy: Optional[bool] = None,
|
|
atomic: Optional[bool] = False,
|
|
# Path
|
|
exists: bool = False,
|
|
file_okay: bool = True,
|
|
dir_okay: bool = True,
|
|
writable: bool = False,
|
|
readable: bool = True,
|
|
resolve_path: bool = False,
|
|
allow_dash: bool = False,
|
|
path_type: Union[None, Type[str], Type[bytes]] = None,
|
|
):
|
|
self.default = default
|
|
self.param_decls = param_decls
|
|
self.callback = callback
|
|
self.metavar = metavar
|
|
self.expose_value = expose_value
|
|
self.is_eager = is_eager
|
|
self.envvar = envvar
|
|
self.autocompletion = autocompletion
|
|
# Choice
|
|
self.case_sensitive = case_sensitive
|
|
# Numbers
|
|
self.min = min
|
|
self.max = max
|
|
self.clamp = clamp
|
|
# DateTime
|
|
self.formats = formats
|
|
# File
|
|
self.mode = mode
|
|
self.encoding = encoding
|
|
self.errors = errors
|
|
self.lazy = lazy
|
|
self.atomic = atomic
|
|
# Path
|
|
self.exists = exists
|
|
self.file_okay = file_okay
|
|
self.dir_okay = dir_okay
|
|
self.writable = writable
|
|
self.readable = readable
|
|
self.resolve_path = resolve_path
|
|
self.allow_dash = allow_dash
|
|
self.path_type = path_type
|
|
|
|
|
|
class OptionInfo(ParameterInfo):
|
|
def __init__(
|
|
self,
|
|
*,
|
|
# ParameterInfo
|
|
default: Optional[Any] = None,
|
|
param_decls: Optional[Sequence[str]] = None,
|
|
callback: Optional[Callable[[click.Context, click.Parameter, str], Any]] = None,
|
|
metavar: Optional[str] = None,
|
|
expose_value: bool = True,
|
|
is_eager: bool = False,
|
|
envvar: Optional[Union[str, List[str]]] = None,
|
|
autocompletion: Optional[
|
|
Callable[[click.Context, List[str], str], List[str]]
|
|
] = None,
|
|
# Option
|
|
show_default: bool = False,
|
|
prompt: Union[bool, str] = False,
|
|
confirmation_prompt: bool = False,
|
|
hide_input: bool = False,
|
|
is_flag: Optional[bool] = None,
|
|
flag_value: Optional[Any] = None,
|
|
count: bool = False,
|
|
allow_from_autoenv: bool = True,
|
|
help: Optional[str] = None,
|
|
hidden: bool = False,
|
|
show_choices: bool = True,
|
|
show_envvar: bool = False,
|
|
# Choice
|
|
case_sensitive: bool = True,
|
|
# Numbers
|
|
min: Optional[Union[int, float]] = None,
|
|
max: Optional[Union[int, float]] = None,
|
|
clamp: bool = False,
|
|
# DateTime
|
|
formats: Optional[Union[List[str]]] = None,
|
|
# File
|
|
mode: str = None,
|
|
encoding: Optional[str] = None,
|
|
errors: Optional[str] = "strict",
|
|
lazy: Optional[bool] = None,
|
|
atomic: Optional[bool] = False,
|
|
# Path
|
|
exists: bool = False,
|
|
file_okay: bool = True,
|
|
dir_okay: bool = True,
|
|
writable: bool = False,
|
|
readable: bool = True,
|
|
resolve_path: bool = False,
|
|
allow_dash: bool = False,
|
|
path_type: Union[None, Type[str], Type[bytes]] = None,
|
|
):
|
|
super().__init__(
|
|
default=default,
|
|
param_decls=param_decls,
|
|
callback=callback,
|
|
metavar=metavar,
|
|
expose_value=expose_value,
|
|
is_eager=is_eager,
|
|
envvar=envvar,
|
|
autocompletion=autocompletion,
|
|
# Choice
|
|
case_sensitive=case_sensitive,
|
|
# Numbers
|
|
min=min,
|
|
max=max,
|
|
clamp=clamp,
|
|
# DateTime
|
|
formats=formats,
|
|
# File
|
|
mode=mode,
|
|
encoding=encoding,
|
|
errors=errors,
|
|
lazy=lazy,
|
|
atomic=atomic,
|
|
# Path
|
|
exists=exists,
|
|
file_okay=file_okay,
|
|
dir_okay=dir_okay,
|
|
writable=writable,
|
|
readable=readable,
|
|
resolve_path=resolve_path,
|
|
allow_dash=allow_dash,
|
|
path_type=path_type,
|
|
)
|
|
self.show_default = show_default
|
|
self.prompt = prompt
|
|
self.confirmation_prompt = confirmation_prompt
|
|
self.hide_input = hide_input
|
|
self.is_flag = is_flag
|
|
self.flag_value = flag_value
|
|
self.count = count
|
|
self.allow_from_autoenv = allow_from_autoenv
|
|
self.help = help
|
|
self.hidden = hidden
|
|
self.show_choices = show_choices
|
|
self.show_envvar = show_envvar
|
|
|
|
|
|
class ArgumentInfo(ParameterInfo):
|
|
def __init__(
|
|
self,
|
|
*,
|
|
# ParameterInfo
|
|
default: Optional[Any] = None,
|
|
param_decls: Optional[Sequence[str]] = None,
|
|
callback: Optional[Callable[[click.Context, click.Parameter, str], Any]] = None,
|
|
metavar: Optional[str] = None,
|
|
expose_value: bool = True,
|
|
is_eager: bool = False,
|
|
envvar: Optional[Union[str, List[str]]] = None,
|
|
autocompletion: Optional[
|
|
Callable[[click.Context, List[str], str], List[str]]
|
|
] = None,
|
|
# Choice
|
|
case_sensitive: bool = True,
|
|
# Numbers
|
|
min: Optional[Union[int, float]] = None,
|
|
max: Optional[Union[int, float]] = None,
|
|
clamp: bool = False,
|
|
# DateTime
|
|
formats: Optional[Union[List[str]]] = None,
|
|
# File
|
|
mode: str = None,
|
|
encoding: Optional[str] = None,
|
|
errors: Optional[str] = "strict",
|
|
lazy: Optional[bool] = None,
|
|
atomic: Optional[bool] = False,
|
|
# Path
|
|
exists: bool = False,
|
|
file_okay: bool = True,
|
|
dir_okay: bool = True,
|
|
writable: bool = False,
|
|
readable: bool = True,
|
|
resolve_path: bool = False,
|
|
allow_dash: bool = False,
|
|
path_type: Union[None, Type[str], Type[bytes]] = None,
|
|
):
|
|
super().__init__(
|
|
default=default,
|
|
param_decls=param_decls,
|
|
callback=callback,
|
|
metavar=metavar,
|
|
expose_value=expose_value,
|
|
is_eager=is_eager,
|
|
envvar=envvar,
|
|
autocompletion=autocompletion,
|
|
# Choice
|
|
case_sensitive=case_sensitive,
|
|
# Numbers
|
|
min=min,
|
|
max=max,
|
|
clamp=clamp,
|
|
# DateTime
|
|
formats=formats,
|
|
# File
|
|
mode=mode,
|
|
encoding=encoding,
|
|
errors=errors,
|
|
lazy=lazy,
|
|
atomic=atomic,
|
|
# Path
|
|
exists=exists,
|
|
file_okay=file_okay,
|
|
dir_okay=dir_okay,
|
|
writable=writable,
|
|
readable=readable,
|
|
resolve_path=resolve_path,
|
|
allow_dash=allow_dash,
|
|
path_type=path_type,
|
|
)
|