-
Notifications
You must be signed in to change notification settings - Fork 19
/
PluginManager.py
108 lines (94 loc) · 3.7 KB
/
PluginManager.py
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
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
# -*- coding: utf-8 -*-
# pluginmanager.py
from collections import defaultdict
from Utilities import listf
from traceback import format_exception
import sys
import os
import importlib
import builtins
import gettext
_ = gettext.gettext
class PluginManager(object):
#def __init__(self):
# list of registred plug-ins
plugins = defaultdict(list)
# list of enable/disable event plug-in
enabled_event = []
disabled_event = []
# list of enable/disabled plug-ins
enabled_plugin = []
disabled_plugin = []
@staticmethod
def register(*events):
""" This decorator is to be used for registering a function as a plug-in for
a specific event or list of events.
"""
def registered_plugin(funct):
for event in events:
PluginManager.plugins[event].append(funct)
return funct
return registered_plugin
@staticmethod
def enable_plugin(plugin):
""" Remove resp. the plug-in and the event from the disabled_plugin and disabled_event lists.
"""
for event, functions in list(PluginManager.plugins.items()):
for f in functions:
if plugin == f.__module__:
if event not in PluginManager.enabled_event: PluginManager.enabled_event.append(event)
if event in PluginManager.disabled_event: PluginManager.disabled_event.remove(event)
if plugin not in PluginManager.enabled_plugin: PluginManager.enabled_plugin.append(plugin)
if plugin in PluginManager.disabled_plugin: PluginManager.disabled_plugin.remove(plugin)
@staticmethod
def disable_plugin(plugin):
""" Append resp. the plug-in and the event to the disabled_plugin and disabled_event lists.
"""
for event, functions in list(PluginManager.plugins.items()):
for f in functions:
if plugin == f.__module__:
if hasattr(sys.modules[plugin],'UnConfig'):
sys.modules[plugin].UnConfig(*())
if event in PluginManager.enabled_event: PluginManager.enabled_event.remove(event)
if event not in PluginManager.disabled_event: PluginManager.disabled_event.append(event)
if plugin in PluginManager.enabled_plugin: PluginManager.enabled_plugin.remove(plugin)
if plugin not in PluginManager.disabled_plugin: PluginManager.disabled_plugin.append(plugin)
@staticmethod
def is_enable(plugin):
""" Enable plugin.
"""
if isinstance(plugin, str):
return plugin in PluginManager.enabled_plugin
#return plugin in [l[0].__name__ for l in plugins.values() if l ]
else:
return plugin in list(PluginManager.plugins.values())
@staticmethod
def trigger_event(event, *args, **kwargs):
""" Call this function to trigger an event. It will run any plug-ins that
have registered themselves to the event. Any additional arguments or
keyword arguments you pass in will be passed to the plugins.
"""
if builtins.__dict__['GUI_FLAG']:
for plugin in PluginManager.plugins[event]:
if event not in PluginManager.disabled_event:
plugin(*args, **kwargs)
@staticmethod
def load_plugins(modulename):
""" This reads a plugins list to load. It is so plug-in
imports are more dynamic and you don't need to continue appending
import statements to the top of a file.
"""
if modulename in sys.modules:
return sys.modules[modulename]
else:
try:
if PLUGINS_PATH not in sys.path:
sys.path.append(PLUGINS_PATH)
name,ext = os.path.splitext(modulename)
pkg = '.'.join(modulename.split('.')[0:-1])
module = importlib.import_module(name, package=pkg)
return module
except Exception as info:
msg = _("Path of plugins directory is wrong.") if not os.path.exists(PLUGINS_PATH) else str(sys.exc_info()[0]) +"\r\n" + listf(format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]))
sys.stderr.write(_("Error trying to import plugin %s : %s\n%s")%(modulename, info, msg))
return info