2022-04-30 21:19:22 -04:00
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
|
|
|
|
from dotbot.plugin import Plugin
|
2016-01-16 22:00:15 -05:00
|
|
|
|
|
|
|
# We keep references to loaded modules so they don't get garbage collected.
|
|
|
|
loaded_modules = []
|
|
|
|
|
2022-01-30 18:48:30 -05:00
|
|
|
|
2016-01-16 22:00:15 -05:00
|
|
|
def load(path):
|
2022-01-30 18:48:30 -05:00
|
|
|
basename = os.path.basename(path)
|
|
|
|
module_name, extension = os.path.splitext(basename)
|
2022-04-30 21:19:22 -04:00
|
|
|
loaded_module = load_module(module_name, path)
|
|
|
|
plugins = []
|
|
|
|
for name in dir(loaded_module):
|
|
|
|
possible_plugin = getattr(loaded_module, name)
|
|
|
|
try:
|
|
|
|
if issubclass(possible_plugin, Plugin) and possible_plugin is not Plugin:
|
|
|
|
plugins.append(possible_plugin)
|
|
|
|
except TypeError:
|
|
|
|
pass
|
|
|
|
loaded_modules.append(loaded_module)
|
|
|
|
return plugins
|
2022-01-30 18:48:30 -05:00
|
|
|
|
2016-01-16 22:00:15 -05:00
|
|
|
|
|
|
|
if sys.version_info >= (3, 5):
|
2022-01-30 18:48:30 -05:00
|
|
|
import importlib.util
|
|
|
|
|
|
|
|
def load_module(module_name, path):
|
|
|
|
spec = importlib.util.spec_from_file_location(module_name, path)
|
|
|
|
module = importlib.util.module_from_spec(spec)
|
|
|
|
spec.loader.exec_module(module)
|
|
|
|
return module
|
2016-01-16 22:00:15 -05:00
|
|
|
|
|
|
|
elif sys.version_info >= (3, 3):
|
2022-01-30 18:48:30 -05:00
|
|
|
from importlib.machinery import SourceFileLoader
|
|
|
|
|
|
|
|
def load_module(module_name, path):
|
|
|
|
return SourceFileLoader(module_name, path).load_module()
|
2016-01-16 22:00:15 -05:00
|
|
|
|
|
|
|
else:
|
2022-01-30 18:48:30 -05:00
|
|
|
import imp
|
2016-01-16 22:00:15 -05:00
|
|
|
|
2022-01-30 18:48:30 -05:00
|
|
|
def load_module(module_name, path):
|
|
|
|
return imp.load_source(module_name, path)
|