[gnome-tweak-tool] Allow updating extensions
- From: John Stowers <jstowers src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-tweak-tool] Allow updating extensions
- Date: Mon, 15 Apr 2013 20:14:57 +0000 (UTC)
commit 08f8cda3454eaa7c775353526632fa8bcd61d98a
Author: Alex Muñoz <AlexMuDoz gmail com>
Date: Wed Apr 10 02:16:30 2013 -0300
Allow updating extensions
https://bugzilla.gnome.org/show_bug.cgi?id=696948
gtweak/egowrapper.py | 116 ++++++++++++++++++++++++++++++++
gtweak/gshellwrapper.py | 3 +
gtweak/tweaks/tweak_shell_extensions.py | 49 +++++++++++++-
3 files changed, 165 insertions(+), 3 deletions(-)
---
diff --git a/gtweak/egowrapper.py b/gtweak/egowrapper.py
new file mode 100644
index 0000000..24930e2
--- /dev/null
+++ b/gtweak/egowrapper.py
@@ -0,0 +1,116 @@
+# This file is part of gnome-tweak-tool.
+#
+# Copyright (c) 2011 John Stowers
+#
+# gnome-tweak-tool is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# gnome-tweak-tool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with gnome-tweak-tool. If not, see <http://www.gnu.org/licenses/>.
+
+import json
+import logging
+
+from gi.repository import GObject
+from gi.repository import Soup, SoupGNOME
+
+class ExtensionsDotGnomeDotOrg(GObject.GObject):
+
+ __gsignals__ = {
+ "got-extensions": (GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE,
+ (GObject.TYPE_PYOBJECT,)),
+ "got-extension-info": (GObject.SIGNAL_RUN_FIRST, GObject.TYPE_NONE,
+ (GObject.TYPE_PYOBJECT,GObject.TYPE_STRING)),
+ }
+
+ def __init__(self, shell_version_tuple):
+ GObject.GObject.__init__(self)
+ self._session = Soup.SessionAsync.new()
+ self._session.add_feature_by_type(SoupGNOME.ProxyResolverGNOME)
+
+ self._shell_version_tuple = shell_version_tuple
+ self._extensions = {}
+
+ def _query_extensions_finished(self, msg, url):
+ if msg.status_code == 200:
+ #server returns a list of extensions which may contain duplicates, dont know
+ resp = json.loads(msg.response_body.data)
+ print resp
+ for e in resp["extensions"]:
+ self._extensions[e["uuid"]] = e
+ self.emit("got-extensions", self._extensions)
+
+ def _query_extension_info_finished(self, msg, uuid):
+ if msg.status_code == 200:
+ self.emit("got-extension-info", json.loads(msg.response_body.data), uuid)
+
+ def query_extensions(self):
+ url = "https://extensions.gnome.org/extension-query/?"
+
+ ver = self._shell_version_tuple
+ if ver[1] % 2:
+ #if this is a development version (odd) then query the full version
+ url += "shell_version=%d.%d.%d&" % ver
+ else:
+ #else query in point releases up to the current version, and filter duplicates
+ #from the reply
+ url += "shell_version=%d.%d&" % (ver[0],ver[1])
+ for i in range(1,ver[2]+1):
+ url += "shell_version=%d.%d.%d&" % (ver[0],ver[1], i)
+ #non-paginated
+ url += "n_per_page=-1"
+
+ logging.debug("Query URL: %s" % url)
+ message = Soup.Message.new('GET', url)
+ message.connect("finished", self._query_extensions_finished, url)
+ self._session.queue_message(message, None, None)
+
+ def query_extension_info(self, extension_uuid):
+ if extension_uuid in self._extensions:
+ print "CACHED"
+ self.emit("got-extension-info", self._extensions[extension_uuid])
+ return
+
+ url = "https://extensions.gnome.org/extension-info/?uuid=%s" % extension_uuid
+ logging.debug("Query URL: %s" % url)
+ message = Soup.Message.new('GET', url)
+ message.connect("finished", self._query_extension_info_finished, extension_uuid)
+ self._session.queue_message(message, None, None)
+
+ def get_download_url(self, extinfo):
+ url = "https://extensions.gnome.org/download-extension/%s.shell-extension.zip?version_tag=%d"
+ #version tag is the pk in the shell_version_map
+ #url = url % (extinfo["uuid"],
+
+
+if __name__ == "__main__":
+ import pprint
+ from gi.repository import Gtk, GLib
+
+ def _got_ext(ego, extensions):
+ print "="*80
+ pprint.pprint(extensions.values())
+
+ def _got_ext_info(ego, extension):
+ pprint.pprint(extension)
+
+ logging.basicConfig(format="%(levelname)-8s: %(message)s", level=logging.DEBUG)
+
+ e = ExtensionsDotGnomeDotOrg((3,4,1))
+
+ e.connect("got-extensions", _got_ext)
+ e.connect("got-extension-info", _got_ext_info)
+
+ e.query_extensions()
+ #e.query_extensions((3,4,0))
+ #e.query_extensions((3,3,2))
+ e.query_extension_info("user-theme gnome-shell-extensions gcampax github com")
+
+ Gtk.main()
diff --git a/gtweak/gshellwrapper.py b/gtweak/gshellwrapper.py
index d102b34..f585467 100644
--- a/gtweak/gshellwrapper.py
+++ b/gtweak/gshellwrapper.py
@@ -164,6 +164,9 @@ class GnomeShell36(GnomeShell34):
def uninstall_extension(self, uuid):
return self._proxy.proxy_extensions.UninstallExtension('(s)', uuid)
+ def install_remote_extension(self, uuid):
+ return self._proxy.proxy_extensions.InstallRemoteExtension('(s)', uuid)
+
@gtweak.utils.singleton
class GnomeShellFactory:
def __init__(self):
diff --git a/gtweak/tweaks/tweak_shell_extensions.py b/gtweak/tweaks/tweak_shell_extensions.py
index 5e37ade..48fa475 100644
--- a/gtweak/tweaks/tweak_shell_extensions.py
+++ b/gtweak/tweaks/tweak_shell_extensions.py
@@ -3,17 +3,21 @@ import zipfile
import tempfile
import logging
import json
+import threading
from gi.repository import Gtk
from gi.repository import GLib
+from gi.repository import GObject
from operator import itemgetter
from gtweak.utils import extract_zip_file, execute_subprocess
from gtweak.gshellwrapper import GnomeShell, GnomeShellFactory
from gtweak.tweakmodel import Tweak, TweakGroup
from gtweak.widgets import FileChooserButton, build_label_beside_widget, build_horizontal_sizegroup,
build_tight_button, UI_BOX_SPACING
+from gtweak.egowrapper import ExtensionsDotGnomeDotOrg
def N_(x): return x
+GObject.threads_init()
class _ShellExtensionTweak(Tweak):
@@ -99,6 +103,27 @@ class _ShellExtensionTweak(Tweak):
self.widget.set_sensitive(False)
dialog.destroy()
+ def _on_extension_update(self, btn, uuid):
+ self._shell.uninstall_extension(uuid)
+ self.widget.set_sensitive(False)
+ thread = threading.Thread(target=self.download_extension, args=(btn,uuid,))
+ thread.start()
+
+ def download_extension(self, btn,uuid):
+ status = self._shell.install_remote_extension(uuid)
+ if status == 's':
+ GObject.idle_add(btn.set_sensitive, False)
+ GObject.idle_add(self.widget.set_sensitive, True)
+
+ def add_update_button(self, uuid):
+ button = build_tight_button(Gtk.STOCK_REFRESH)
+ button.connect("clicked", self._on_extension_update, uuid)
+ self.widget.pack_start(button, False, False, 0)
+ self.widget.reorder_child(button, 1)
+ #if the widget calls directly the show_all method, This will be shown in any visible parent widget.
+ if self.widget.get_visible() == True:
+ self.widget.show_all()
+
class _ShellExtensionInstallerTweak(Tweak):
def __init__(self, shell, **options):
@@ -201,14 +226,19 @@ class ShellExtensionTweakGroup(TweakGroup):
#add the extension installer
extension_tweaks.append(
_ShellExtensionInstallerTweak(shell, size_group=sg))
-
+
+ version = tuple(shell.version.split("."))
+ ego = ExtensionsDotGnomeDotOrg(version)
try:
#add a tweak for each installed extension
extensions = sorted(shell.list_extensions().values(), key=itemgetter("name"))
for extension in extensions:
try:
- extension_tweaks.append(
- _ShellExtensionTweak(shell, extension, size_group=sg))
+ extension_widget = _ShellExtensionTweak(shell, extension, size_group=sg)
+ extension_tweaks.append(extension_widget)
+ if extension.get("type") == GnomeShell.EXTENSION_TYPE["PER_USER"]:
+ ego.connect("got-extension-info", self._got_info, extension, extension_widget)
+ ego.query_extension_info(extension["uuid"])
except:
logging.warning("Invalid extension", exc_info=True)
except:
@@ -218,6 +248,19 @@ class ShellExtensionTweakGroup(TweakGroup):
self.set_tweaks(*extension_tweaks)
+ def _got_info(self, ego, resp, uuid, extension, widget):
+ if uuid == extension["uuid"]:
+ resp = resp['shell_version_map']
+ shell = GnomeShellFactory().get_shell()
+ version = shell.version[0:3]
+ try:
+ resp = resp[version]
+ if int(resp["version"]) > extension["version"]:
+ widget.add_update_button(uuid)
+
+ except KeyError:
+ print "Older/Unknown Version"
+
TWEAK_GROUPS = (
ShellExtensionTweakGroup(),
)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]