[pygobject] pygtkcompat: Allow multiple calls to enable(), enable_gtk() as long as the version matches



commit 20220d5eac510e3445a96e4e9061fd1bc6ec37c7
Author: Christoph Reiter <creiter src gnome org>
Date:   Tue Mar 21 14:46:00 2017 +0100

    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

 pygtkcompat/pygtkcompat.py |   42 ++++++++++++++++++++++++++++++++++++++++++
 tests/compat_test_pygtk.py |   21 +++++++++++++++++++++
 2 files changed, 63 insertions(+), 0 deletions(-)
---
diff --git a/pygtkcompat/pygtkcompat.py b/pygtkcompat/pygtkcompat.py
index fd651f5..27e97e8 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 71b1c06..e49166b 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'))


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]