diff options
author | 2020-09-24 19:38:42 +0200 | |
---|---|---|
committer | 2020-09-24 19:38:42 +0200 | |
commit | 01ea3866cda4ba686a5749d4f4ced709f592b34f (patch) | |
tree | 77937e7da049ded12f0475ac34acf7c3b70035fe /bot/utils/extensions.py | |
parent | Merge pull request #456 from Anubhav1603/update_dpy (diff) | |
parent | Merge branch 'master' into ext-managment (diff) |
Merge pull request #449 from gustavwilliam/ext-managment
Add extension management commands
Diffstat (limited to 'bot/utils/extensions.py')
-rw-r--r-- | bot/utils/extensions.py | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/bot/utils/extensions.py b/bot/utils/extensions.py new file mode 100644 index 00000000..50350ea8 --- /dev/null +++ b/bot/utils/extensions.py @@ -0,0 +1,34 @@ +import importlib +import inspect +import pkgutil +from typing import Iterator, NoReturn + +from bot import exts + + +def unqualify(name: str) -> str: + """Return an unqualified name given a qualified module/package `name`.""" + return name.rsplit(".", maxsplit=1)[-1] + + +def walk_extensions() -> Iterator[str]: + """Yield extension names from the bot.exts subpackage.""" + + def on_error(name: str) -> NoReturn: + raise ImportError(name=name) # pragma: no cover + + for module in pkgutil.walk_packages(exts.__path__, f"{exts.__name__}.", onerror=on_error): + if unqualify(module.name).startswith("_"): + # Ignore module/package names starting with an underscore. + continue + + if module.ispkg: + imported = importlib.import_module(module.name) + if not inspect.isfunction(getattr(imported, "setup", None)): + # If it lacks a setup function, it's not an extension. + continue + + yield module.name + + +EXTENSIONS = frozenset(walk_extensions()) |