diff options
author | Simon Feltman <sfeltman@src.gnome.org> | 2014-08-05 22:45:46 -0700 |
---|---|---|
committer | Simon Feltman <sfeltman@src.gnome.org> | 2014-08-05 22:50:47 -0700 |
commit | d70403357d6b510356dd375304fb97e458fd12b2 (patch) | |
tree | 2967c9a5ff1bcb86b59a69a849878a2e93d6680e /gi/__init__.py | |
parent | 5ca4d25eac0efcc12b02fe53f379ee41e69bf1d2 (diff) | |
download | pygobject-d70403357d6b510356dd375304fb97e458fd12b2.tar.gz |
Add protection against attempts at importing static bindings
Clobber gobject, gio, glib, gtk, and gtk.gdk in sys.modules upon importing
gi with dummy modules which produce an error upon access.
https://bugzilla.gnome.org/show_bug.cgi?id=709183
Diffstat (limited to 'gi/__init__.py')
-rw-r--r-- | gi/__init__.py | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/gi/__init__.py b/gi/__init__.py index df6843cf..3ef22894 100644 --- a/gi/__init__.py +++ b/gi/__init__.py @@ -27,12 +27,17 @@ __path__ = extend_path(__path__, __name__) import sys import os import importlib +import types + +_static_binding_error = ('When using gi.repository you must not import static ' + 'modules like "gobject". Please change all occurrences ' + 'of "import gobject" to "from gi.repository import GObject". ' + 'See: https://bugzilla.gnome.org/show_bug.cgi?id=709183') # we can't have pygobject 2 loaded at the same time we load the internal _gobject if 'gobject' in sys.modules: - raise ImportError('When using gi.repository you must not import static ' - 'modules like "gobject". Please change all occurrences ' - 'of "import gobject" to "from gi.repository import GObject".') + raise ImportError(_static_binding_error) + from . import _gi from ._gi import _gobject @@ -50,6 +55,20 @@ version_info = _gobject.pygobject_version[:] __version__ = "{0}.{1}.{2}".format(*version_info) +class _DummyStaticModule(types.ModuleType): + __path__ = None + + def __getattr__(self, name): + raise RuntimeError(_static_binding_error) + + +sys.modules['glib'] = _DummyStaticModule('glib', _static_binding_error) +sys.modules['gobject'] = _DummyStaticModule('gobject', _static_binding_error) +sys.modules['gio'] = _DummyStaticModule('gio', _static_binding_error) +sys.modules['gtk'] = _DummyStaticModule('gtk', _static_binding_error) +sys.modules['gtk.gdk'] = _DummyStaticModule('gtk.gdk', _static_binding_error) + + def check_version(version): if isinstance(version, str): version_list = tuple(map(int, version.split("."))) |