Change: CLI framwork for Tyler

This commit is contained in:
mrjk 2022-02-02 17:41:26 -05:00
parent aae9aaf03d
commit c016482852

View File

@ -5,28 +5,24 @@
# python3 python_cli.py -vvvv demo # python3 python_cli.py -vvvv demo
# Author: mrjk # Author: mrjk
import typer
import os import os
import sys import sys
import logging import logging
import argparse
import anyconfig import anyconfig
import kheops.app as Kheops import kheops.app as Kheops
from pathlib import Path
# Devel tmp # Devel tmp
sys.path.append("/home/jez/prj/bell/training/tiger-ansible/ext/ansible-tree") sys.path.append("/home/jez/prj/bell/training/tiger-ansible/ext/kheops")
class CmdApp:
"""Main CmdApp"""
def __init__(self):
"""Start new App"""
self.get_args()
self.get_logger(verbose=self.args.verbose + 1, logger_name="kheops")
self.cli()
def get_logger(self, logger_name=None, create_file=False, verbose=0): def get_logger(logger_name=None, create_file=False, verbose=0):
"""Create CmdApp logger""" """Create CmdApp logger"""
# Take default app name # Take default app name
@ -76,177 +72,113 @@ class CmdApp:
log.addHandler(handler) log.addHandler(handler)
# Return objects # Return objects
self.log = log return log, loglevel
self.loglevel = loglevel
def cli(self):
"""Main cli command"""
# Dispatch sub commands
if self.args.command:
method = "cli_" + str(self.args.command)
if hasattr(self, method):
getattr(self, method)()
else:
self.log.error("Subcommand %s does not exists.", self.args.command)
else:
self.log.error("Missing sub command")
self.parser.print_help()
def get_args(self):
"""Prepare command line"""
# Manage main parser
parser = argparse.ArgumentParser(
description="Kheops, hierarchical data lookup tool",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument(
"-v",
"--verbose",
action="count",
default=int(os.environ.get("KHEOPS_VERBOSE", "0")),
help="Increase verbosity (KHEOPS_VERBOSE)",
)
parser.add_argument(
"-c",
"--config",
default=os.environ.get("KHEOPS_CONFIG", "kheops.yml"),
help="Kheops configuration file (KHEOPS_CONFIG)",
)
# parser.add_argument("help", help="Show usage")
subparsers = parser.add_subparsers(
title="subcommands", description="valid subcommands", dest="command"
)
# Manage command: schema
add_p = subparsers.add_parser("schema")
add_p = subparsers.add_parser("gen_doc")
# Manage command: lookup2
add_p = subparsers.add_parser("lookup")
add_p.add_argument( from enum import Enum
"-n", from typing import List, Optional
"--namespace",
help="Namespace name (KHEOPS_NAMESPACE)", app = typer.Typer(help="Khéops, hierarchical key/value store")
default=os.environ.get("KHEOPS_NAMESPACE", "default"),
)
add_p.add_argument(
"-f", "--file", help="File with params as dict. Can be stdin - ." log, log_level = get_logger(verbose=1, logger_name="kheops")
)
add_p.add_argument(
"-e", "--scope", dest="scope_param", action="append", default=[] class OutputFormat(str, Enum):
) yaml = "yaml"
add_p.add_argument("-p", "--policy") json = "json"
add_p.add_argument("-t", "--trace", action="store_true") toml = "toml"
add_p.add_argument("-x", "--explain", action="store_true")
add_p.add_argument( @app.command()
"-o", def lookup(
"--format", ctx: typer.Context,
choices=["yaml", "json", "xml", "ini", "toml"],
default="yaml",
namespace: str = typer.Option("default", "-n",
help="Name of the namespace",
envvar="KHEOPS_NAMESPACE"),
keys: List[str] = typer.Argument(None,
help="Key(s) to query" ),
scope_param: Optional[List[str]] = typer.Option([], "-e",
help="Scope variables, var=value",
),
file: Path = typer.Option(None, "-f",
help="Scope file" ),
format: OutputFormat = typer.Option("yaml",
help="Output format", help="Output format",
) ),
add_p.add_argument("keys", default=None, nargs="*") trace: bool = typer.Option(False),
explain: bool = typer.Option(False, "-X",
# Manage command: demo help="Explain the queries"),
add_p = subparsers.add_parser("demo") ):
add_p.add_argument("--env", default=os.environ.get("APP_SETTING", "Unset"))
add_p.add_argument("--choice", choices=["choice1", "choice2"], type=str)
add_p.add_argument("-s", "--store", action="store_true")
add_p.add_argument("-a", "--append", dest="appended", action="append")
# add_p.add_argument("--short", default=True, required=True)
# add_p.add_argument("argument1")
# add_p.add_argument("double_args", nargs=2)
add_p.add_argument("nargs", nargs="*")
# Manage command: subcommand2
upg_p = subparsers.add_parser("subcommand2")
upg_p.add_argument("name")
# Register objects
self.parser = parser
self.args = parser.parse_args()
def cli_demo(self):
"""Display how to use logging"""
self.log.error("Test Critical message")
self.log.warning("Test Warning message")
self.log.info("Test Info message")
self.log.debug("Command line vars: %s", vars(self.args))
def cli_lookup(self):
"""Lookup database""" """Lookup database"""
keys = self.args.keys or [None] keys = keys or [None]
config = str(ctx.obj["kheops"]["config"])
new_params = {} new_params = {}
if self.args.file: if file:
new_params = anyconfig.load(self.args.file, ac_parser="yaml") new_params = anyconfig.load(file, ac_parser="yaml")
# Parse cli params # Parse cli params
for i in self.args.scope_param: for i in scope_param:
ret = i.split("=") ret = i.split("=")
if len(ret) != 2: if len(ret) != 2:
raise Exception("Malformed params") raise Exception("Malformed params")
new_params[ret[0]] = ret[1] new_params[ret[0]] = ret[1]
self.log.info("CLI: %s with env: %s", keys, new_params) log.info("CLI: %s with env: %s", keys, new_params)
app = Kheops.Kheops(config=self.args.config, namespace=self.args.namespace) app = Kheops.Kheops(config=config, namespace=namespace)
ret = app.lookup2(
namespace=self.args.namespace,
keys=keys,
scope=new_params,
trace=self.args.trace,
explain=self.args.explain,
validate_schema=True,
)
print(anyconfig.dumps(ret, ac_parser=self.args.format))
def cli_lookup_OLD(self):
"""Display how to use logging"""
# self.log.debug(f"Command line vars: {vars(self.args)}")
keys = self.args.key or [None]
# Parse payload from enf file:
new_params = {}
if self.args.file:
new_params = anyconfig.load(self.args.file, ac_parser="yaml")
# Parse cli params
for i in self.args.scope_param:
ret = i.split("=")
if len(ret) != 2:
raise Exception("Malformed params")
new_params[ret[0]] = ret[1]
self.log.info("CLI: %s with env: %s", keys, new_params)
app = Kheops.App(config=self.args.config, namespace=self.args.namespace)
# for key in keys:
ret = app.lookup( ret = app.lookup(
keys=keys, keys=keys,
scope=new_params, scope=new_params,
trace=self.args.trace, trace=trace,
explain=self.args.explain, explain=explain,
validate_schema=True, validate_schema=True,
) )
print(anyconfig.dumps(ret, ac_parser=self.args.format)) typer.echo(anyconfig.dumps(ret, ac_parser=format))
def cli_schema(self):
"""Display configuration schema"""
app = Kheops.App(config=self.args.config) # , namespace=self.args.namespace) @app.command()
app.dump_schema() def config():
typer.echo("Not implemented yet.")
def cli_gen_doc(self): @app.callback()
"""Generate documentation""" def main(
ctx: typer.Context,
verbose: int = typer.Option(0, "--verbose", "-v", count=True),
config: Path = typer.Option("kheops.yml", "-c",
help="Last name of person to greet.",
envvar="KHEOPS_CONFIG"),
):
"""
Manage users in the awesome CLI app.
"""
#typer.echo(f"About to execute command: {ctx.invoked_subcommand}")
log.setLevel(level=verbose)
ctx.obj = {
"kheops": {
"config": config,
}
}
app = Kheops.App(config=self.args.config) # , namespace=self.args.namespace)
app.gen_docs()
if __name__ == "__main__": if __name__ == "__main__":
CmdApp()
#typer.run(CmdApp)
app()