[pygobject/gsoc2009: 39/160] Make DynamicImporter more compliant with PEP302



commit 8fad92d2c470ef5e75dc5f57e61006907c0e92d5
Author: Simon van der Linden <svdlinden src gnome org>
Date:   Tue Jul 14 22:27:11 2009 +0200

    Make DynamicImporter more compliant with PEP302
    
    Use sys.modules.
    Set __name__, __file__ and __loader__ correctly.
    Get rid of _path which was always None.
    Use __str__ instead of __repr__ for an informal string representation.

 gi/importer.py      |   50 +++++++++++++++++++++++++++++---------------------
 gi/module.py        |   24 ++++--------------------
 gi/overrides/Gdk.py |    6 +++---
 gi/overrides/Gtk.py |    6 +++---
 4 files changed, 39 insertions(+), 47 deletions(-)
---
diff --git a/gi/importer.py b/gi/importer.py
index 7ef4fab..66b6388 100644
--- a/gi/importer.py
+++ b/gi/importer.py
@@ -21,6 +21,7 @@
 # USA
 
 import sys
+import new
 import gobject
 
 from ._gi import Repository
@@ -28,41 +29,48 @@ from .module import DynamicModule
 
 
 repository = Repository.get_default()
-modules = {
-    'GObject': gobject
-}
+sys.modules['GObject'] = gobject
 
 
 class DynamicImporter(object):
-    def __init__(self, name, path):
-        self.name = name
-        self.path = path
 
-    @staticmethod
-    def find_module(name, path=None):
-        if name == 'cairo':
+    # Note: see PEP302 for the Importer Protocol implemented below.
+
+    def find_module(self, fullname, path=None):
+        # Avoid name clashes, and favour static bindings.
+        if fullname == 'cairo':
             return None
-        namespace = repository.require(name)
-        if namespace:
-            return DynamicImporter(name, path)
 
-    def load_module(self, name):
-        if name in modules:
-            return modules[name]
+        if repository.require(fullname):
+            return self
+
+    def load_module(self, fullname):
+        if fullname in sys.modules:
+            return sys.modules[name]
 
-        module_name = 'gi.overrides.%s' % (name,)
+        # Look for an overrides module
+        overrides_name = 'gi.overrides.%s' % fullname
         try:
-            overrides_module = __import__(module_name, {}, {}, ['%sModule' % (name,)])
-            module_type = getattr(overrides_module, name + 'Module')
+            overrides_type_name = '%sModule' % fullname
+            overrides_module = __import__(overrides_name, {}, {}, [overrides_type_name])
+            module_type = getattr(overrides_module, overrides_type_name)
         except ImportError, e:
             module_type = DynamicModule
 
-        module = module_type(name, self.path)
-        modules[name] = module
+        module = module_type.__new__(module_type)
+        module.__dict__ = {
+            '__file__': '<%s>' % fullname,
+            '__name__': fullname,
+            '__loader__': self
+        }
+
+        sys.modules[fullname] = module
+
+        module.__init__()
 
         return module
 
 
 def install_importhook():
-    sys.meta_path.append(DynamicImporter)
+    sys.meta_path.append(DynamicImporter())
 
diff --git a/gi/module.py b/gi/module.py
index 4e1c616..bed17d7 100644
--- a/gi/module.py
+++ b/gi/module.py
@@ -71,27 +71,11 @@ def get_parent_for_object(object_info):
 
 class DynamicModule(object):
 
-    def __init__(self, namespace, path):
-        self._namespace = namespace
-        self._path = path
-
-    @property
-    def __file__(self):
-        return self._namespace
-
-    @property
-    def __name__(self):
-        return self._namespace
-
-    @property
-    def __path__(self):
-        return [os.path.dirname(self.__file__)]
-
-    def __repr__(self):
-        return "<dyn-module %r from %r>" % (self._namespace, self._path)
+    def __str__(self):
+        return "<dynamic module %r>" % self.__name__
 
     def __getattr__(self, name):
-        info = repository.find_by_name(self._namespace, name)
+        info = repository.find_by_name(self.__name__, name)
         if not info:
             raise AttributeError("%r object has no attribute %r" % (
                     self.__class__.__name__, name))
@@ -144,7 +128,7 @@ class DynamicModule(object):
     @property
     def __members__(self):
         r = []
-        for type_info in repository.get_infos(self._namespace):
+        for type_info in repository.get_infos(self.__name__):
             if type_info is None:
                 continue
             r.append(type_info.getName())
diff --git a/gi/overrides/Gdk.py b/gi/overrides/Gdk.py
index 94b0eaf..e3e2d29 100644
--- a/gi/overrides/Gdk.py
+++ b/gi/overrides/Gdk.py
@@ -1,11 +1,11 @@
 import sys
 
-from girepository.module import DynamicModule
+from ..module import DynamicModule
 
 class GdkModule(DynamicModule):
 
-    def __init__(self, *args):
-        super(GdkModule, self).__init__(*args)
+    def __init__(self):
+        super(GdkModule, self).__init__()
 
         initialized, argv = self.init_check(tuple(sys.argv))
         if not initialized:
diff --git a/gi/overrides/Gtk.py b/gi/overrides/Gtk.py
index 51c93f8..3de0e7e 100644
--- a/gi/overrides/Gtk.py
+++ b/gi/overrides/Gtk.py
@@ -1,11 +1,11 @@
 import sys
 
-from girepository.module import DynamicModule
+from ..module import DynamicModule
 
 class GtkModule(DynamicModule):
 
-    def __init__(self, *args):
-        super(GtkModule, self).__init__(*args)
+    def __init__(self):
+        super(GtkModule, self).__init__()
 
         initialized, argv = self.init_check(tuple(sys.argv))
         if not initialized:



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