-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplugin_manager.py
92 lines (80 loc) · 2.26 KB
/
plugin_manager.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
from importlib import *
import logging
import sys
import os
from util import *
from ns import *
import db
import plugins
from par import event_loop
#sys.path.append(os.path.dirname(os.path.realpath(__file__)))
logger = logging.getLogger('plugin_manager')
assert_plugin_name = assert_on_re('plugin name', r'^[A-Za-z0-9\-_]+$')
loaded_plugins = {}
enabled_plugins = db.get_json('pm')
if enabled_plugins is None:
enabled_plugins = set()
def load_plugin(name):
assert_plugin_name(name)
if name in loaded_plugins:
return
try:
mod = import_module(f'.{name}', 'plugins')
mod.ident = lambda: f'pm.{name}'
loaded_plugins[name] = mod
reload(mod) # refresh module if changed
mod.initialize()
except:
if name in loaded_plugins:
del(loaded_plugins[name])
# todo: handle exception
raise
def unload_plugin(name):
assert_plugin_name(name)
if name not in loaded_plugins:
return
try:
mod = loaded_plugins[name]
mod.finalize()
del(loaded_plugins[name])
except:
if name in loaded_plugins:
del(loaded_plugins[name])
# todo: handle exception
raise
def reload_plugin(name):
unload_plugin(name)
load_plugin(name)
def list_plugin():
return {'loaded': [*loaded_plugins.keys()], 'enabled': [*list(enabled_plugins)]}
def enable_plugin(name: str):
enabled_plugins.add(name)
db.put_json('pm', list(enabled_plugins))
def disable_plugin(name: str):
enabled_plugins.discard(name)
db.put_json('pm', list(enabled_plugins))
class PluginManager:
def ident():
return 'pm'
def query(ids):
mod = loaded_plugins[ids[0]]
if len(ids) == 1:
return mod
else:
return mod.query(ids[1:])
def load(name):
return load_plugin(name)
def unload(name):
return unload_plugin(name)
def reload(name):
return reload_plugin(name)
def enable(name):
return enable_plugin(name)
def disable(name):
return disable_plugin(name)
def list():
return list_plugin()
def info():
return yamldump(PluginManager.list())
register_root(PluginManager)
event_loop.call_soon(list, map(load_plugin, enabled_plugins))