Skip to content

Plugin Reference

Bases: pyFlowLauncherObject

Source code in pyflowlauncher/plugin.py
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
class Plugin(pyFlowLauncherObject):

    def __init__(self, methods: list[Method] | None = None) -> None:
        super().__init__()
        self._client = JsonRPCClient()
        self._event_handler = EventHandler()
        self._settings: dict[str, Any] = {}
        if methods:
            self.add_methods(methods)

    def add_method(self, method: Method) -> str:
        """Add a method to the event handler."""
        setattr(method, '_is_registered_method', True)
        return self._event_handler.add_event(method)

    def add_methods(self, methods: Iterable[Method]) -> None:
        self._event_handler.add_events(methods)

    def on_method(self, method: Method) -> Method:
        @wraps(method)
        def wrapper(*args, **kwargs):
            return method(*args, **kwargs)
        self.add_method(wrapper)
        return wrapper

    def method(self, method: Method) -> Method:
        """Register a method to be called when the plugin is run."""
        return self.on_method(method)

    def add_exception_handler(self, exception: Type[Exception], handler: Callable[..., Any]) -> None:
        """Add exception handler to be called when an exception is raised in a method."""
        self._event_handler.add_exception_handler(exception, handler)

    def on_except(self, exception: Type[Exception]) -> Callable[..., Any]:
        @wraps(exception)
        def wrapper(handler: Callable[..., Any]) -> Callable[..., Any]:
            self.add_exception_handler(exception, handler)
            return handler
        return wrapper

    def action(self, method: Method, parameters: Optional[List] = None) -> JsonRPCRequest:
        """Register a method and return a JsonRPCRequest that calls it."""
        method_name = self.add_method(method)
        return {"method": method_name, "parameters": parameters or []}

    @property
    def settings(self) -> dict:
        if self._settings is None:
            self._settings = {}
        self._settings = self._client.recieve().get('settings', {})
        return self._settings

    def run(self) -> None:
        request = self._client.recieve()
        method = request["method"]
        parameters = request.get('parameters', [])
        if sys.version_info >= (3, 10, 0):
            feedback = asyncio.run(self._event_handler.trigger_event(method, *parameters))
        else:
            loop = asyncio.get_event_loop()
            feedback = loop.run_until_complete(self._event_handler.trigger_event(method, *parameters))
        if not feedback:
            return
        self._client.send(feedback)

    @property
    def run_dir(self) -> Path:
        """Return the run directory of the plugin."""
        return Path(sys.argv[0]).resolve().parent

    @cached_property
    def root_dir(self) -> Path:
        """Return the root directory of the plugin."""
        current_dir = self.run_dir
        for part in current_dir.parts:
            if current_dir.joinpath(FILE_NAME).exists():
                return current_dir
            current_dir = current_dir.parent
        raise FileNotFoundError(f"Could not find {FILE_NAME} in {self.run_dir} or any parent directory.")

    @cached_property
    def manifest_path(self) -> Path:
        """Return the path to the plugin manifest."""
        return self.root_dir / FILE_NAME

    @cached_property
    def manifest(self) -> Manifest:
        """Return the plugin manifest."""
        return Manifest.from_file(self.manifest_path)

Attributes

manifest cached property

manifest: Manifest

Return the plugin manifest.

manifest_path cached property

manifest_path: Path

Return the path to the plugin manifest.

root_dir cached property

root_dir: Path

Return the root directory of the plugin.

run_dir property

run_dir: Path

Return the run directory of the plugin.

settings property

settings: dict

Functions

__init__

__init__(methods: list[Method] | None = None) -> None
Source code in pyflowlauncher/plugin.py
22
23
24
25
26
27
28
def __init__(self, methods: list[Method] | None = None) -> None:
    super().__init__()
    self._client = JsonRPCClient()
    self._event_handler = EventHandler()
    self._settings: dict[str, Any] = {}
    if methods:
        self.add_methods(methods)

action

action(method: Method, parameters: Optional[List] = None) -> JsonRPCRequest

Register a method and return a JsonRPCRequest that calls it.

Source code in pyflowlauncher/plugin.py
60
61
62
63
def action(self, method: Method, parameters: Optional[List] = None) -> JsonRPCRequest:
    """Register a method and return a JsonRPCRequest that calls it."""
    method_name = self.add_method(method)
    return {"method": method_name, "parameters": parameters or []}

add_exception_handler

add_exception_handler(exception: Type[Exception], handler: Callable[..., Any]) -> None

Add exception handler to be called when an exception is raised in a method.

Source code in pyflowlauncher/plugin.py
49
50
51
def add_exception_handler(self, exception: Type[Exception], handler: Callable[..., Any]) -> None:
    """Add exception handler to be called when an exception is raised in a method."""
    self._event_handler.add_exception_handler(exception, handler)

add_method

add_method(method: Method) -> str

Add a method to the event handler.

Source code in pyflowlauncher/plugin.py
30
31
32
33
def add_method(self, method: Method) -> str:
    """Add a method to the event handler."""
    setattr(method, '_is_registered_method', True)
    return self._event_handler.add_event(method)

add_methods

add_methods(methods: Iterable[Method]) -> None
Source code in pyflowlauncher/plugin.py
35
36
def add_methods(self, methods: Iterable[Method]) -> None:
    self._event_handler.add_events(methods)

method

method(method: Method) -> Method

Register a method to be called when the plugin is run.

Source code in pyflowlauncher/plugin.py
45
46
47
def method(self, method: Method) -> Method:
    """Register a method to be called when the plugin is run."""
    return self.on_method(method)

on_except

on_except(exception: Type[Exception]) -> Callable[..., Any]
Source code in pyflowlauncher/plugin.py
53
54
55
56
57
58
def on_except(self, exception: Type[Exception]) -> Callable[..., Any]:
    @wraps(exception)
    def wrapper(handler: Callable[..., Any]) -> Callable[..., Any]:
        self.add_exception_handler(exception, handler)
        return handler
    return wrapper

on_method

on_method(method: Method) -> Method
Source code in pyflowlauncher/plugin.py
38
39
40
41
42
43
def on_method(self, method: Method) -> Method:
    @wraps(method)
    def wrapper(*args, **kwargs):
        return method(*args, **kwargs)
    self.add_method(wrapper)
    return wrapper

run

run() -> None
Source code in pyflowlauncher/plugin.py
72
73
74
75
76
77
78
79
80
81
82
83
def run(self) -> None:
    request = self._client.recieve()
    method = request["method"]
    parameters = request.get('parameters', [])
    if sys.version_info >= (3, 10, 0):
        feedback = asyncio.run(self._event_handler.trigger_event(method, *parameters))
    else:
        loop = asyncio.get_event_loop()
        feedback = loop.run_until_complete(self._event_handler.trigger_event(method, *parameters))
    if not feedback:
        return
    self._client.send(feedback)