@@ -62,6 +62,18 @@ def __str__(self):
6262 return f"""data:{ self .mime_type } ;base64,{ data_base64 } """
6363
6464
65+ class PluginReference :
66+ """A reference to a related plugin.
67+
68+ :param plugin_id: The identifier of the related plugin.
69+ :param description: An optional description of the relationship.
70+ """
71+
72+ def __init__ (self , plugin_id : str , description : str = "" ) -> None :
73+ self .plugin_id = plugin_id
74+ self .description = description
75+
76+
6577class PluginParameter :
6678 """A plugin parameter.
6779
@@ -188,6 +200,7 @@ class PluginDescription:
188200 :param actions: Custom plugin actions.
189201 :param deprecation: Optional deprecation message.
190202 If set, the plugin will be marked as deprecated in the UI.
203+ :param related_plugins: Optional list of references to related plugins.
191204 """
192205
193206 def __init__ ( # noqa: PLR0913
@@ -202,6 +215,7 @@ def __init__( # noqa: PLR0913
202215 icon : Icon | None = None ,
203216 actions : list [PluginAction ] | None = None ,
204217 deprecation : str | None = None ,
218+ related_plugins : list [PluginReference ] | None = None ,
205219 ) -> None :
206220 # Set the type of the plugin. Same as the class name of the plugin
207221 # base class, e.g., 'WorkflowPlugin'.
@@ -225,23 +239,15 @@ def __init__( # noqa: PLR0913
225239 )
226240 else :
227241 self .plugin_id = plugin_id
228- if categories is None :
229- self .categories = []
230- else :
231- self .categories = categories
242+ self .categories = categories if categories is not None else []
232243 self .label = label
233244 self .description = description
234245 self .documentation = documentation
235- if parameters is None :
236- self .parameters = []
237- else :
238- self .parameters = parameters
246+ self .parameters = parameters if parameters is not None else []
239247 self .icon = icon
240- if actions is None :
241- self .actions = []
242- else :
243- self .actions = actions
248+ self .actions = actions if actions is not None else []
244249 self .deprecation = deprecation
250+ self .related_plugins = related_plugins if related_plugins is not None else []
245251 for action in self .actions :
246252 action .validate (plugin_class )
247253
@@ -327,6 +333,7 @@ class Plugin:
327333 :param actions: Custom plugin actions
328334 :param deprecation: Optional deprecation message.
329335 If set, the plugin will be marked as deprecated in the UI.
336+ :param related_plugins: Optional list of references to related plugins.
330337 """
331338
332339 plugins : ClassVar [list [PluginDescription ]] = []
@@ -342,6 +349,7 @@ def __init__( # noqa: PLR0913
342349 icon : Icon | None = None ,
343350 actions : list [PluginAction ] | None = None ,
344351 deprecation : str | None = None ,
352+ related_plugins : list [PluginReference ] | None = None ,
345353 ):
346354 self .label = label
347355 self .description = description
@@ -350,6 +358,7 @@ def __init__( # noqa: PLR0913
350358 self .icon = icon
351359 self .actions = actions
352360 self .deprecation = deprecation
361+ self .related_plugins = related_plugins
353362 if categories is None :
354363 self .categories = []
355364 else :
@@ -372,6 +381,7 @@ def __call__(self, func: type):
372381 icon = self .icon ,
373382 actions = self .actions ,
374383 deprecation = self .deprecation ,
384+ related_plugins = self .related_plugins ,
375385 )
376386 Plugin .plugins .append (plugin_desc )
377387 return func
0 commit comments