Add a basic reflection-powered cli framework

This commit is contained in:
Jaculabilis 2022-08-13 00:57:05 +00:00
parent 47ca307f8e
commit 59fdc5b355
2 changed files with 59 additions and 0 deletions

56
server/intake/cli.py Normal file
View File

@ -0,0 +1,56 @@
from argparse import ArgumentParser, RawDescriptionHelpFormatter, REMAINDER
import argparse
from signal import signal, SIGPIPE, SIG_DFL
import sys
def command_help(args):
"""Print this help message and exit."""
print_usage()
return 0
def main():
"""CLI entry point"""
# Enable piping
signal(SIGPIPE, SIG_DFL)
# Get the available commands by reflection
cli = sys.modules[__name__]
commands = {
name[8:]: func
for name, func in vars(cli).items()
if name.startswith("command_")
}
descriptions = "\n".join([
f" {name} - {func.__doc__}"
for name, func in commands.items()])
# Set up the top-level parser
parser = ArgumentParser(
description=f"Available commands:\n{descriptions}\n",
formatter_class=RawDescriptionHelpFormatter,
add_help=False)
parser.add_argument("command",
nargs="?",
default="help",
help="The command to execute",
choices=commands,
metavar="command")
parser.add_argument("args",
nargs=argparse.REMAINDER,
help="Command arguments",
metavar="args")
# Pass the parser's help printer to command_help via global
global print_usage
print_usage = parser.print_help
args = parser.parse_args()
# Execute command
if args.command:
sys.exit(commands[args.command](args.args))
else:
parser.print_usage()
sys.exit(0)

View File

@ -12,6 +12,9 @@ feedparser = "^6.0.10"
[tool.poetry.dev-dependencies]
[tool.poetry.scripts]
intake = "intake.cli:main"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"