Source code for runtimepy.commands.common
"""
A module for package command-line argument interfaces.
"""
# built-in
from argparse import ArgumentParser as _ArgumentParser
from argparse import Namespace as _Namespace
from contextlib import contextmanager, suppress
from typing import Any, Iterator
# third-party
from vcorelib.args import CommandFunction as _CommandFunction
from vcorelib.io import ARBITER
from vcorelib.paths.context import tempfile
# internal
from runtimepy import DEFAULT_EXT, PKG_NAME
_curses = {} # type: ignore
with suppress(ModuleNotFoundError):
import curses as _curses # type: ignore
FACTORIES = f"package://{PKG_NAME}/factories.{DEFAULT_EXT}"
[docs]
def arbiter_flags(parser: _ArgumentParser) -> None:
"""Add arbiter command-line flag arguments."""
parser.add_argument(
"-i",
"--init_only",
"--init-only",
action="store_true",
help="exit after completing initialization",
)
parser.add_argument(
"-w",
"--wait-for-stop",
"--wait_for_stop",
action="store_true",
help="ensure that a 'wait_for_stop' application method is run last",
)
parser.add_argument(
"--no-poller",
action="store_true",
help="don't run a connection-metrics poller task",
)
[docs]
def curses_wrap_if(method: _CommandFunction, args: _Namespace) -> int:
"""Run a method in TUI mode if a condition is met."""
assert not hasattr(args, "window"), args
args.window = None
result = -1
if getattr(args, "curses", False):
def wrapper(window, args: _Namespace) -> None:
"""Set the window attribute."""
args.window = window
nonlocal result
result = method(args)
getattr(_curses, "wrapper")(wrapper, args)
else:
result = method(args)
return result
[docs]
@contextmanager
def arbiter_args(parser: _ArgumentParser, nargs: str = "+") -> Iterator[None]:
"""Add common connection-arbiter parameters."""
arbiter_flags(parser)
yield
parser.add_argument(
"configs", nargs=nargs, help="the configuration to load"
)
[docs]
def cmd_with_jit(
command: _CommandFunction, args: _Namespace, data: dict[str, Any]
) -> int:
"""Run an 'arbiter' command with custom data inserted."""
with tempfile(suffix=f".{DEFAULT_EXT}") as temp_config:
ARBITER.encode(temp_config, data)
args.configs.append(str(temp_config))
return command(args)