mirror of
https://github.com/httpie/cli.git
synced 2024-11-25 01:03:27 +01:00
ff6f1887b0
* Refactor tests to use a text-based standard output. (#1318) * Implement new style `--help` (#1316) * Implement man page generation (#1317) * Implement rich progress bars. (#1324) * Man page deployment & isolation. (#1325) * Remove all unsorted usages in the CLI docs * Implement isolated mode for man page generation * Add a CI job for autogenerated files * Distribute man pages through PyPI * Pin the date for man pages. (#1326) * Hide suppressed arguments from --help/man pages (#1329) * Change download spinner to line (#1328) * Regenerate autogenerated files when pushed against to master. (#1339) * Highlight options (#1340) * Additional man page enhancements (#1341) * Group options by the parent category & highlight -o/--o * Display (and underline) the METAVAR on man pages. * Make help message processing more robust (#1342) * Inherit `help` from `short_help` * Don't mirror short_help directly. * Fixup the serialization * Use `pager` and `man` on `--manual` when applicable (#1343) * Run `man $program` on --manual * Page the output of `--manual` for systems that lack man pages * Improvements over progress bars (separate bar, status line, etc.) (#1346) * Redesign the --help layout. * Make our usage of rich compatible with 9.10.0 * Add `HTTPIE_NO_MAN_PAGES` * Make tests also patch os.get_terminal_size * Generate CLI spec from HTTPie & Man Page Hook (#1354) * Generate CLI spec from HTTPie & add man page hook * Use the full command space for the option headers
80 lines
2.1 KiB
Python
80 lines
2.1 KiB
Python
import argparse
|
|
from typing import Any, Callable, Generic, Iterator, Iterable, Optional, TypeVar
|
|
|
|
T = TypeVar('T')
|
|
|
|
|
|
class Manual(argparse.Action):
|
|
def __init__(
|
|
self,
|
|
option_strings,
|
|
dest=argparse.SUPPRESS,
|
|
default=argparse.SUPPRESS,
|
|
help=None
|
|
):
|
|
super().__init__(
|
|
option_strings=option_strings,
|
|
dest=dest,
|
|
default=default,
|
|
nargs=0,
|
|
help=help
|
|
)
|
|
|
|
def __call__(self, parser, namespace, values, option_string=None):
|
|
parser.print_manual()
|
|
parser.exit()
|
|
|
|
|
|
class LazyChoices(argparse.Action, Generic[T]):
|
|
def __init__(
|
|
self,
|
|
*args,
|
|
getter: Callable[[], Iterable[T]],
|
|
help_formatter: Optional[Callable[[T, bool], str]] = None,
|
|
sort: bool = False,
|
|
cache: bool = True,
|
|
isolation_mode: bool = False,
|
|
**kwargs
|
|
) -> None:
|
|
self.getter = getter
|
|
self.help_formatter = help_formatter
|
|
self.sort = sort
|
|
self.cache = cache
|
|
self.isolation_mode = isolation_mode
|
|
self._help: Optional[str] = None
|
|
self._obj: Optional[Iterable[T]] = None
|
|
super().__init__(*args, **kwargs)
|
|
self.choices = self
|
|
|
|
def load(self) -> T:
|
|
if self._obj is None or not self.cache:
|
|
self._obj = self.getter()
|
|
|
|
assert self._obj is not None
|
|
return self._obj
|
|
|
|
@property
|
|
def help(self) -> str:
|
|
if self._help is None and self.help_formatter is not None:
|
|
self._help = self.help_formatter(
|
|
self.load(),
|
|
isolation_mode=self.isolation_mode
|
|
)
|
|
return self._help
|
|
|
|
@help.setter
|
|
def help(self, value: Any) -> None:
|
|
self._help = value
|
|
|
|
def __contains__(self, item: Any) -> bool:
|
|
return item in self.load()
|
|
|
|
def __iter__(self) -> Iterator[T]:
|
|
if self.sort:
|
|
return iter(sorted(self.load()))
|
|
else:
|
|
return iter(self.load())
|
|
|
|
def __call__(self, parser, namespace, values, option_string=None):
|
|
setattr(namespace, self.dest, values)
|