Create basic command execution driver

This commit is contained in:
Nick Chambers 2022-08-18 04:55:13 -05:00
parent 2b6cbee91d
commit c16543e3d3
2 changed files with 100 additions and 3 deletions

52
vultron/cmd.py Normal file
View File

@ -0,0 +1,52 @@
class CmdNotFound(Exception):
pass
class NoApiKey(Exception):
pass
class FeatureMissing(Exception):
pass
class Command:
FTR_PRFX = "vultron_"
def __init__(self, cmd, api_key):
self.cmd = cmd
self.uses_api = True
self.default = "help"
self.init()
if self.uses_api and api_key is None:
raise NoApiKey()
def init(self):
pass
def find(self, name):
needle = "{prfx}{name}".format(prfx=self.FTR_PRFX, name=name.lower())
haystack = dir(self)
for legume in haystack:
if legume.lower().startswith(needle):
fn = getattr(self, legume)
if callable(fn):
return fn
else:
raise FeatureMissing(legume)
raise CmdNotFound(name)
def vultron_help(self, *args):
pass
def find_cmd(needle):
needle = needle.lower()
haystack = Command.__subclasses__()
for legume in haystack:
if legume.__name__.lower().startswith(needle):
return legume
raise CmdNotFound(needle)

View File

@ -1,4 +1,49 @@
import vultron.api
import click
import os
import sys
import vultron.cmd
def main():
api = vultron.api.Client()
class Help(vultron.cmd.Command):
def init(self):
self.uses_api = False
def vultron_help(self, *args):
pass
class Account(vultron.cmd.Command):
def init(self):
self.default = "info"
def vultron_info(self, *args):
pass
@click.command()
@click.option("--help", is_flag=True)
@click.option("--api-key", type=str)
@click.argument("args", nargs=-1)
def app(help, api_key, args):
env_key = os.getenv("VULTR_API_KEY")
if api_key is None and env_key:
api_key = env_key
shortcut = "help"
if len(args):
shortcut = args[0]
args = args[1:]
try:
vultron_cmd = vultron.cmd.find_cmd(shortcut)
vultron_api = vultron_cmd(sys.argv[0], api_key=api_key)
if len(args):
shortcut = args[0]
args = args[1:]
else:
shortcut = vultron_api.default
vultron_fn = vultron_api.find(shortcut)
vultron_fn(*args)
except vultron.cmd.CmdNotFound as err:
print(err)