summaryrefslogtreecommitdiff
path: root/gi/__init__.py
diff options
context:
space:
mode:
authorSimon Feltman <sfeltman@src.gnome.org>2014-08-05 22:45:46 -0700
committerSimon Feltman <sfeltman@src.gnome.org>2014-08-05 22:50:47 -0700
commitd70403357d6b510356dd375304fb97e458fd12b2 (patch)
tree2967c9a5ff1bcb86b59a69a849878a2e93d6680e /gi/__init__.py
parent5ca4d25eac0efcc12b02fe53f379ee41e69bf1d2 (diff)
downloadpygobject-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__.py25
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(".")))