Files
2026-07-13 13:39:38 +08:00

57 lines
1.4 KiB
Python

from __future__ import annotations
import logging
import threading
from abc import ABC
from typing import Literal
from . import utils
EventTypes = Literal["plugin_registered",]
class Plugin(ABC): # noqa: B024
registered_plugins: list[Plugin] = []
emitter: utils.EventEmitter[EventTypes] = utils.EventEmitter()
# TODO(theomonnom): make logger mandatory once all plugins have been updated
def __init__(
self,
title: str,
version: str,
package: str,
logger: logging.Logger | None = None,
) -> None:
self._title = title
self._version = version
self._package = package
self._logger = logger
@classmethod
def register_plugin(cls, plugin: Plugin) -> None:
if threading.current_thread() != threading.main_thread():
raise RuntimeError("Plugins must be registered on the main thread")
cls.registered_plugins.append(plugin)
cls.emitter.emit("plugin_registered", plugin)
# plugin can implement an optional download_files method
def download_files(self) -> None: # noqa: B027
pass
@property
def package(self) -> str:
return self._package
@property
def title(self) -> str:
return self._title
@property
def version(self) -> str:
return self._version
@property
def logger(self) -> logging.Logger | None:
return self._logger