Implement plugin loading

Signed-off-by: Jacki <jacki@thejackimonster.de>
This commit is contained in:
Jacki 2024-01-17 23:06:38 +01:00
parent 3d469e671e
commit 87f0e6d871
No known key found for this signature in database
GPG key ID: B404184796354C5E
5 changed files with 85 additions and 0 deletions

View file

@ -0,0 +1,61 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from manuskript.plugin.abstractPlugin import AbstractPlugin
import importlib
import os
import pkgutil
import sys
__path__ = pkgutil.extend_path(__path__, __name__)
if sys.version_info < (3, 10):
from importlib_metadata import entry_points
else:
from importlib.metadata import entry_points
from importlib.machinery import FileFinder, SourceFileLoader
def loadPlugins():
plugins = []
paths = []
for importer in pkgutil.iter_importers():
if not importer or type(importer) is not FileFinder:
continue
paths.append(os.path.join(importer.path, 'manuskript', 'plugin'))
for module_info in pkgutil.iter_modules(paths):
if not module_info or not module_info.ispkg:
continue
name = 'manuskript.plugin.' + module_info.name
path = os.path.join(module_info.module_finder.path, module_info.name, '__init__.py')
try:
module = SourceFileLoader(name, path).load_module()
except Exception:
continue
try:
plugin_cls = module.Plugin
except AttributeError:
continue
try:
if not issubclass(plugin_cls, AbstractPlugin):
continue
plugin = plugin_cls()
except TypeError:
continue
if not plugin:
continue
plugins.append(plugin)
return plugins

View file

@ -0,0 +1,8 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
class AbstractPlugin:
def __init__(self):
print(" -> " + str(type(self)))

View file

@ -0,0 +1,4 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from manuskript.plugin.test.testPlugin import TestPlugin as Plugin

View file

@ -0,0 +1,10 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from manuskript.plugin import AbstractPlugin
class TestPlugin(AbstractPlugin):
def __init__(self):
super().__init__()

View file

@ -11,6 +11,7 @@ from gi.repository import GObject, Gtk, Handy
Handy.init()
from manuskript.data import Project
from manuskript.plugin import loadPlugins
from manuskript.ui.views import *
from manuskript.ui.chooser import openFileDialog, saveFileDialog, FileFilter
@ -27,6 +28,7 @@ from manuskript.util import parseFilenameFromURL
class MainWindow:
def __init__(self):
self.plugins = loadPlugins()
self.project = None
builder = Gtk.Builder()