Source code for president.command

# This file is placed in the Public Domain.
#
# pylint: disable=C,I,R,W0718
# flake8: noqa


"commands"


import inspect
import os


from .bus    import Bus
from .error  import Error
from .thread import launch
from .utils  import spl


[docs]class Command: cmds = {} errors = []
[docs] @staticmethod def add(func): Command.cmds[func.__name__] = func
[docs] @staticmethod def handle(evt): if "txt" in dir(evt): evt.parse(evt.txt) func = Command.cmds.get(evt.cmd, None) if func: try: func(evt) Bus.show(evt) except Exception as ex: exc = ex.with_traceback(ex.__traceback__) Error.errors.append(exc) evt.ready()
[docs] @staticmethod def remove(name): try: del Command.cmds[name] except KeyError: pass
[docs] @staticmethod def scan(mod) -> None: for key, cmd in inspect.getmembers(mod, inspect.isfunction): if key.startswith("cb"): continue if 'event' in cmd.__code__.co_varnames: Command.add(cmd)
[docs]def scan(pkg, mods, init=None, doall=False, wait=False) -> None: if not pkg: return path = pkg.__path__[0] if doall: modlist = [ x[:-3] for x in os.listdir(path) if x.endswith(".py") and x not in ["__init__.py", "__main__.py"] ] mods = ",".join(sorted(modlist)) threads = [] for modname in spl(mods): module = getattr(pkg, modname, None) if not module: continue Command.scan(module) if init and "start" in dir(module): threads.append(launch(module.start, name=modname)) if wait and threads: for thr in threads: thr.join()