|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import contextlib |
|
import glob |
|
import os |
|
from importlib import import_module |
|
from logging import Logger |
|
|
|
from . import LOGS |
|
from .fns.tools import get_all_files |
|
|
|
|
|
class Loader: |
|
def __init__(self, path="plugins", key="Official", logger: Logger = LOGS): |
|
self.path = path |
|
self.key = key |
|
self._logger = logger |
|
|
|
def load( |
|
self, |
|
log=True, |
|
func=import_module, |
|
include=None, |
|
exclude=None, |
|
after_load=None, |
|
load_all=False, |
|
): |
|
_single = os.path.isfile(self.path) |
|
if include: |
|
if log: |
|
self._logger.info("Including: {}".format("• ".join(include))) |
|
files = glob.glob(f"{self.path}/_*.py") |
|
for file in include: |
|
path = f"{self.path}/{file}.py" |
|
if os.path.exists(path): |
|
files.append(path) |
|
elif _single: |
|
files = [self.path] |
|
else: |
|
if load_all: |
|
files = get_all_files(self.path, ".py") |
|
else: |
|
files = glob.glob(f"{self.path}/*.py") |
|
if exclude: |
|
for path in exclude: |
|
if not path.startswith("_"): |
|
with contextlib.suppress(ValueError): |
|
files.remove(f"{self.path}/{path}.py") |
|
if log and not _single: |
|
self._logger.info( |
|
f"• Installing {self.key} Plugins || Count : {len(files)} •" |
|
) |
|
for plugin in sorted(files): |
|
if func == import_module: |
|
plugin = plugin.replace(".py", "").replace("/", ".").replace("\\", ".") |
|
try: |
|
modl = func(plugin) |
|
except ModuleNotFoundError as er: |
|
modl = None |
|
self._logger.error(f"{plugin}: '{er.name}' not installed!") |
|
continue |
|
except Exception as exc: |
|
modl = None |
|
self._logger.error(f"pyUltroid - {self.key} - ERROR - {plugin}") |
|
self._logger.exception(exc) |
|
continue |
|
if _single and log: |
|
self._logger.info(f"Successfully Loaded {plugin}!") |
|
if callable(after_load): |
|
if func == import_module: |
|
plugin = plugin.split(".")[-1] |
|
after_load(self, modl, plugin_name=plugin) |
|
|