diff --git a/packages/dsw-document-worker/dsw/document_worker/cli.py b/packages/dsw-document-worker/dsw/document_worker/cli.py index 700cddd5..825d6018 100644 --- a/packages/dsw-document-worker/dsw/document_worker/cli.py +++ b/packages/dsw-document-worker/dsw/document_worker/cli.py @@ -60,3 +60,11 @@ def main(config: DocumentWorkerConfig, workdir: str): SentryReporter.capture_exception(e) click.echo(f'Ended with error: {e}') exit(2) + + +@click.command(name='list-plugins') +def list_plugins(): + from .plugins import get_plugin_manager + plugin_manager = get_plugin_manager() + for plugin in plugin_manager.list_name_plugin(): + click.echo(plugin) diff --git a/packages/dsw-document-worker/dsw/document_worker/consts.py b/packages/dsw-document-worker/dsw/document_worker/consts.py index 77636319..c28c753b 100644 --- a/packages/dsw-document-worker/dsw/document_worker/consts.py +++ b/packages/dsw-document-worker/dsw/document_worker/consts.py @@ -1,6 +1,7 @@ CMD_CHANNEL = 'doc_worker' CMD_COMPONENT = 'doc_worker' COMPONENT_NAME = 'Document Worker' +PACKAGE_NAME = 'dsw-document-worker' CURRENT_METAMODEL = 14 DEFAULT_ENCODING = 'utf-8' EXIT_SUCCESS = 0 diff --git a/packages/dsw-document-worker/dsw/document_worker/plugins/__init__.py b/packages/dsw-document-worker/dsw/document_worker/plugins/__init__.py new file mode 100644 index 00000000..78412b8c --- /dev/null +++ b/packages/dsw-document-worker/dsw/document_worker/plugins/__init__.py @@ -0,0 +1,3 @@ +from .host import get_plugin_manager, hookimpl + +__all__ = ['get_plugin_manager', 'hookimpl'] diff --git a/packages/dsw-document-worker/dsw/document_worker/plugins/hookspecs.py b/packages/dsw-document-worker/dsw/document_worker/plugins/hookspecs.py new file mode 100644 index 00000000..22691ab2 --- /dev/null +++ b/packages/dsw-document-worker/dsw/document_worker/plugins/hookspecs.py @@ -0,0 +1,31 @@ +import pluggy + +from ..consts import PACKAGE_NAME +from ..templates.steps import Step + + +hookspec = pluggy.HookspecMarker(PACKAGE_NAME) + + +class PluginInfo: + + def __init__(self, name, version): + self.name = name + self.version = version + + +@hookspec +def document_worker_steps() -> list[Step]: + pass + +@hookspec +def document_worker_jinja_tests() -> dict: + pass + +@hookspec +def document_worker_jinja_filters() -> dict: + pass + +@hookspec +def document_worker_plugin_info() -> PluginInfo: + pass diff --git a/packages/dsw-document-worker/dsw/document_worker/plugins/host.py b/packages/dsw-document-worker/dsw/document_worker/plugins/host.py new file mode 100644 index 00000000..f5387206 --- /dev/null +++ b/packages/dsw-document-worker/dsw/document_worker/plugins/host.py @@ -0,0 +1,13 @@ +import pluggy + +from ..consts import PACKAGE_NAME +from . import hookspecs + +hookimpl = pluggy.HookimplMarker(PACKAGE_NAME) + +def get_plugin_manager(): + pm = pluggy.PluginManager(PACKAGE_NAME) + pm.add_hookspecs(hookspecs) + pm.load_setuptools_entrypoints(PACKAGE_NAME) + # TODO: load local plugins + return pm diff --git a/packages/dsw-document-worker/pyproject.toml b/packages/dsw-document-worker/pyproject.toml index 4d2e94db..b28edac4 100644 --- a/packages/dsw-document-worker/pyproject.toml +++ b/packages/dsw-document-worker/pyproject.toml @@ -28,6 +28,7 @@ dependencies = [ 'Markdown', 'MarkupSafe', 'pathvalidate', + 'pluggy', 'python-dateutil', 'python-slugify', 'rdflib', diff --git a/packages/dsw-document-worker/requirements.txt b/packages/dsw-document-worker/requirements.txt index bde9f278..430231ed 100644 --- a/packages/dsw-document-worker/requirements.txt +++ b/packages/dsw-document-worker/requirements.txt @@ -16,6 +16,7 @@ minio==7.2.8 panflute==2.3.1 pathvalidate==3.2.1 Pillow==10.4.0 +pluggy==1.5.0 psycopg==3.2.2 psycopg-binary==3.2.2 pycparser==2.22 diff --git a/requirements.txt b/requirements.txt index 03125346..73cac129 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,6 +27,7 @@ multidict==6.1.0 pathspec==0.12.1 pathvalidate==3.2.1 Pillow==10.4.0 +pluggy==1.5.0 psycopg==3.2.2 psycopg-binary==3.2.2 pycparser==2.22