Source code for haddock.libs.libcli

"""Add functionalities for CLIs."""
from argparse import Action, ArgumentParser, ArgumentTypeError
from functools import partial
from pathlib import Path

from haddock import version
from haddock.libs.libio import file_exists, folder_exists


arg_file_exist = partial(
    file_exists,
    exception=ArgumentTypeError,
    emsg="File {!r} does not exist or is not a file.",
)

arg_folder_exist = partial(
    folder_exists,
    exception=ArgumentTypeError,
    emsg="Folder {!r} does not exist.",
)


[docs]def add_version_arg(ap: ArgumentParser) -> None: """Add version `-v` argument to client.""" ap.add_argument( "-v", "--version", help="show version", action="version", version=f"{ap.prog} - {version}", )
[docs]def add_rundir_arg(ap: ArgumentParser) -> None: """Add run directory option.""" ap.add_argument( "run_dir", help="The run directory.", type=arg_folder_exist, )
[docs]def add_ncores_arg(ap: ArgumentParser) -> None: """Add number of cores option.""" ap.add_argument( "-n", "--ncores", dest="ncores", help=( "The number of threads to use. Uses 1 if not specified. " "Uses all available threads if `-n` is given. Else, uses the " "number indicated, for example: `-n 4` will use 4 threads." ), type=int, default=1, const=None, nargs="?", )
[docs]def add_output_dir_arg(ap: ArgumentParser) -> None: """Add output dir argument.""" ap.add_argument( "-odir", "--output-directory", dest="output_directory", help="The directory where to save the output.", type=Path, default=Path.cwd(), )
class _ParamsToDict(Action): """ Convert command-line parameters in an argument to a dictionary. Example ------- Where ``-x`` is an optional argument of the command-line client interface. >>> par1 1 par2 'my name' par3 [1,2,3] par4 True >>> {'par1': 1, 'par2': 'my name', 'par3': [1, 2, 3]} """ def __call__(self, parser, namespace, ivalues, option_string=None): """Execute.""" params = ivalues[::2] values = ivalues[1::2] if len(params) != len(values): raise parser.error( "The parameters and value pairs " "do not match for argument `-p`" ) param_dict = {} for k, v in zip(params, values): try: param_dict[k] = v except (ValueError, TypeError, SyntaxError): raise parser.error(f"Parameter {k} with invalid value {v}") setattr(namespace, self.dest, param_dict)