summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Reiter <creiter@src.gnome.org>2017-03-21 14:46:00 +0100
committerChristoph Reiter <creiter@src.gnome.org>2017-03-22 09:20:23 +0100
commit20220d5eac510e3445a96e4e9061fd1bc6ec37c7 (patch)
tree87d0ccb3b362b4bf82efa9edb24b11dbdda8ae0c
parent4af42e85a1959cbae06a1bbb7268c76890b60db9 (diff)
downloadpygobject-20220d5eac510e3445a96e4e9061fd1bc6ec37c7.tar.gz
pygtkcompat: Allow multiple calls to enable(), enable_gtk() as long as the version matches
enable_gtk() isn't idempotent and was breaking the API when called multiple times. This ignores the call in case the version passed is the same as for previous calls. https://bugzilla.gnome.org/show_bug.cgi?id=759009
-rw-r--r--pygtkcompat/pygtkcompat.py42
-rw-r--r--tests/compat_test_pygtk.py21
2 files changed, 63 insertions, 0 deletions
diff --git a/pygtkcompat/pygtkcompat.py b/pygtkcompat/pygtkcompat.py
index fd651f57..27e97e85 100644
--- a/pygtkcompat/pygtkcompat.py
+++ b/pygtkcompat/pygtkcompat.py
@@ -84,7 +84,28 @@ def _install_enums(module, dest=None, strip=''):
continue
+_enabled_registry = {}
+
+
+def _check_enabled(name, version=None):
+ """Returns True in case it is already enabled"""
+
+ if name in _enabled_registry:
+ enabled_version = _enabled_registry[name]
+ if enabled_version != version:
+ raise ValueError(
+ "%r already enabled with different version (%r)" % (
+ name, enabled_version))
+ return True
+ else:
+ _enabled_registry[name] = version
+ return False
+
+
def enable():
+ if _check_enabled(""):
+ return
+
# gobject
from gi.repository import GLib
sys.modules['glib'] = GLib
@@ -104,6 +125,9 @@ _unset = object()
def enable_gtk(version='3.0'):
+ if _check_enabled("gtk", version):
+ return
+
# set the default encoding like PyGTK
reload(sys)
if sys.version_info < (3, 0):
@@ -499,12 +523,18 @@ def enable_gtk(version='3.0'):
def enable_vte():
+ if _check_enabled("vte"):
+ return
+
gi.require_version('Vte', '0.0')
from gi.repository import Vte
sys.modules['vte'] = Vte
def enable_poppler():
+ if _check_enabled("poppler"):
+ return
+
gi.require_version('Poppler', '0.18')
from gi.repository import Poppler
sys.modules['poppler'] = Poppler
@@ -512,6 +542,9 @@ def enable_poppler():
def enable_webkit(version='1.0'):
+ if _check_enabled("webkit", version):
+ return
+
gi.require_version('WebKit', version)
from gi.repository import WebKit
sys.modules['webkit'] = WebKit
@@ -519,12 +552,18 @@ def enable_webkit(version='1.0'):
def enable_gudev():
+ if _check_enabled("gudev"):
+ return
+
gi.require_version('GUdev', '1.0')
from gi.repository import GUdev
sys.modules['gudev'] = GUdev
def enable_gst():
+ if _check_enabled("gst"):
+ return
+
gi.require_version('Gst', '0.10')
from gi.repository import Gst
sys.modules['gst'] = Gst
@@ -565,6 +604,9 @@ def enable_gst():
def enable_goocanvas():
+ if _check_enabled("goocanvas"):
+ return
+
gi.require_version('GooCanvas', '2.0')
from gi.repository import GooCanvas
sys.modules['goocanvas'] = GooCanvas
diff --git a/tests/compat_test_pygtk.py b/tests/compat_test_pygtk.py
index 71b1c066..e49166be 100644
--- a/tests/compat_test_pygtk.py
+++ b/tests/compat_test_pygtk.py
@@ -34,6 +34,27 @@ from helper import capture_gi_deprecation_warnings, capture_glib_warnings
@unittest.skipUnless(Gtk, 'Gtk not available')
+class TestMultipleEnable(unittest.TestCase):
+
+ def test_main(self):
+ pygtkcompat.enable()
+ pygtkcompat.enable()
+
+ def test_gtk(self):
+ pygtkcompat.enable_gtk("3.0")
+ pygtkcompat.enable_gtk("3.0")
+
+ # https://bugzilla.gnome.org/show_bug.cgi?id=759009
+ w = gtk.Window()
+ w.realize()
+ self.assertEqual(len(w.window.get_origin()), 2)
+ w.destroy()
+
+ def test_gtk_version_conflict(self):
+ self.assertRaises(ValueError, pygtkcompat.enable_gtk, version='2.0')
+
+
+@unittest.skipUnless(Gtk, 'Gtk not available')
class TestATKCompat(unittest.TestCase):
def test_object(self):
self.assertTrue(hasattr(atk, 'Object'))