-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmarketplace.py
102 lines (82 loc) · 2.89 KB
/
marketplace.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
#read plugin api:
# http://engla.github.io/kupfer/Documentation/PluginAPI.html
__kupfer_name__ = _("Marketplace")
__version__ = "0.1.2"
__author__ = "Hugo Sena Ribeiro <[email protected]>"
__description__ = _("""Search and install 3th party plugins for kupfer""")
__kupfer_sources__ = ("MarketplaceSource",)
__kupfer_actions__ = ("InstallPlugin",)
from kupfer.plugin_support import PluginSettings
__kupfer_settings__ = PluginSettings(
{
"key" : "marketplace_keywords",
"label": _("pypi search keywords"),
"type": str,
"value": "kupfer",
},
{
"key" : "marketplace_index",
"label": _("pypi index"),
"type": str,
"value": "https://pypi.python.org/pypi",
}
)
from kupfer.objects import Leaf
from kupfer import uiutils, task
from kupfer.objects import Action
from kupfer.objects import Source
try:
import xmlrpclib
except ImportError:
import xmlrpc.client as xmlrpclib
def namelize(name):
name = name or ''
name = name.replace('_', ' ')
name = name.replace('-', ' ')
name = name.replace('kupfer plugin ', '')
name = name.title()
return name
class PyPiPluginLeaf(Leaf):
def __init__(self, obj):
super(self.__class__, self).__init__(
obj,
namelize(obj.get('name')),
)
def get_description(self):
return self.object.get('summary')
class InstallPlugin(Action):
def __init__(self):
Action.__init__(self, name=_("Install"))
def activate(self, leaf):
return InstallTask(leaf)
def item_types(self):
yield PyPiPluginLeaf
def is_async(self):
return True
class InstallTask(task.ThreadTask):
def __init__(self, leaf):
super(InstallTask, self).__init__("Installing plugin " + leaf.object.get("name"))
self.leaf = leaf
def thread_do(self):
# TODO: change import to popen https://github.com/pypa/pip/issues/3889
# NOTE: which pip will use? pip, pip2 or pip3?
from pip.commands import install
from pip.utils.logging import _log_state
leaf = self.leaf
_log_state.indentation = 0
install.InstallCommand().main(['--upgrade', '--user', leaf.object.get("name")] )
uiutils.show_notification(_("Plugin Installed"),
"Now enable {} at preferences".format(leaf.name), icon_name='info')
class MarketplaceSource(Source):
def __init__(self):
Source.__init__(self, _("Plugin Marketplace"))
self.resource = None
def get_items(self):
uri = __kupfer_settings__["marketplace_index"]
self.resource = self.resource or xmlrpclib.ServerProxy(uri)
if not self.resource is None:
keywords = __kupfer_settings__["marketplace_keywords"]
for obj in self.resource.search(
{'keywords': keywords},'or'
):
yield PyPiPluginLeaf(obj)