File: plugin_extension_registry.py

package info (click to toggle)
python-envisage 7.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,880 kB
  • sloc: python: 8,696; makefile: 76; sh: 5
file content (66 lines) | stat: -rw-r--r-- 2,427 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
# (C) Copyright 2007-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" An extension registry that uses plugins as extension providers. """


# Enthought library imports.
from traits.api import Instance, observe, on_trait_change

# Local imports.
from .i_plugin_manager import IPluginManager
from .provider_extension_registry import ProviderExtensionRegistry


class PluginExtensionRegistry(ProviderExtensionRegistry):
    """An extension registry that uses plugins as extension providers.

    The application's plugins are used as the registries providers so adding
    or removing a plugin affects the extension points and extensions etc.

    """

    #### 'PluginExtensionRegistry' interface ##################################

    #: The plugin manager that has the plugins we are after!
    plugin_manager = Instance(IPluginManager)

    ###########################################################################
    # 'PluginExtensionRegistry' interface.
    ###########################################################################

    #### Trait change handlers ################################################

    @observe("plugin_manager")
    def _update_providers(self, event):
        """Static trait change handler."""
        old, new = event.old, event.new

        # In practise I can't see why you would ever want (or need) to change
        # the registry's plugin manager on the fly, but hey... Hence, 'old'
        # will probably always be 'None'!
        if old is not None:
            for plugin in old:
                self.remove_provider(plugin)

        if new is not None:
            for plugin in new:
                self.add_provider(plugin)

    @on_trait_change("plugin_manager:plugin_added")
    def _on_plugin_added(self, obj, trait_name, old, event):
        """Dynamic trait change handler."""

        self.add_provider(event.plugin)

    @on_trait_change("plugin_manager:plugin_removed")
    def _on_plugin_removed(self, obj, trait_name, old, event):
        """Dynamic trait change handler."""

        self.remove_provider(event.plugin)