summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2009-11-23 15:32:16 -0200
committerJohan Dahlin <johan@gnome.org>2009-11-23 15:32:16 -0200
commita644edf0515c26ed027522891ccf02aceac764e8 (patch)
treee02bf1b03a3bd7017b8fe11d82db05cc88ff8268
parentfad89e12a744b57e6348968f351d25d167de8248 (diff)
downloadpygi-a644edf0515c26ed027522891ccf02aceac764e8.tar.gz
pygi-a644edf0515c26ed027522891ccf02aceac764e8.tar.xz
pygi-a644edf0515c26ed027522891ccf02aceac764e8.zip
Create overridden modules in two passes
This patch splits overridden module creation into two passes. The first pass creates the auto-generated module normally before the overridden module is attempted to be imported. The second pass imports the overridden module and replaces the auto-generated module with the overridden. This is necessary for the overridden modules to be able to access the auto-generated ones.
-rw-r--r--gi/importer.py34
1 files changed, 21 insertions, 13 deletions
diff --git a/gi/importer.py b/gi/importer.py
index 48392b4..5e7dfc3 100644
--- a/gi/importer.py
+++ b/gi/importer.py
@@ -39,6 +39,17 @@ class DynamicImporter(object):
def __init__(self, path):
self.path = path
+ def _create_module(self, module_type, name, namespace):
+ module = module_type.__new__(module_type)
+ module.__dict__ = {
+ '__file__': '<%s>' % name,
+ '__name__': name,
+ '__namespace__': namespace,
+ '__loader__': self
+ }
+ module.__init__()
+ return module
+
def find_module(self, fullname, path=None):
if not fullname.startswith(self.path):
return
@@ -64,26 +75,23 @@ class DynamicImporter(object):
sys.modules[fullname] = gobject
return gobject
+ module_type = DynamicModule
+ module = self._create_module(module_type, fullname, namespace)
+ sys.modules[fullname] = module
+
# Look for an overrides module
overrides_name = 'gi.overrides.%s' % namespace
+ overrides_type_name = '%sModule' % namespace
try:
- overrides_type_name = '%sModule' % namespace
+
overrides_module = __import__(overrides_name, fromlist=[overrides_type_name])
module_type = getattr(overrides_module, overrides_type_name)
except ImportError, e:
- module_type = DynamicModule
-
- module = module_type.__new__(module_type)
- module.__dict__ = {
- '__file__': '<%s>' % fullname,
- '__name__': fullname,
- '__namespace__': namespace,
- '__loader__': self
- }
-
- sys.modules[fullname] = module
+ pass
- module.__init__()
+ if module_type is not DynamicModule:
+ module = self._create_module(module_type, fullname, namespace)
+ sys.modules[fullname] = module
return module