[pygobject/gsoc2009: 39/160] Make DynamicImporter more compliant with PEP302
- From: Simon van der Linden <svdlinden src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pygobject/gsoc2009: 39/160] Make DynamicImporter more compliant with PEP302
- Date: Fri, 14 Aug 2009 21:25:22 +0000 (UTC)
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]