diff options
author | Christoph Reiter <creiter@src.gnome.org> | 2017-03-21 14:46:00 +0100 |
---|---|---|
committer | Christoph Reiter <creiter@src.gnome.org> | 2017-03-22 09:20:23 +0100 |
commit | 20220d5eac510e3445a96e4e9061fd1bc6ec37c7 (patch) | |
tree | 87d0ccb3b362b4bf82efa9edb24b11dbdda8ae0c | |
parent | 4af42e85a1959cbae06a1bbb7268c76890b60db9 (diff) | |
download | pygobject-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.py | 42 | ||||
-rw-r--r-- | tests/compat_test_pygtk.py | 21 |
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')) |