[pygi] Fix members initialization in metaclasses
- From: Simon van der Linden <svdlinden src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [pygi] Fix members initialization in metaclasses
- Date: Fri, 27 Nov 2009 21:17:26 +0000 (UTC)
commit 076ba3156c13375a75983cef7a409c8c8afea119
Author: Simon van der Linden <svdlinden src gnome org>
Date: Thu Nov 26 23:50:54 2009 +0100
Fix members initialization in metaclasses
In metaclasses, the test for the name of the class was wrong, since it
prevented one to create a subclass with the same name (especially annoying for
overrides). Now, if a GType is available from the info, the fact that it
doesn't have any wrapper yet means that the metaclass is creating the base
class, which will be registerd just after its creation. This is true for
objects, and for structures registered as boxed or pointer too.
This patch includes a test for basic subclassing in Python. It notably tests
that methods don't get overridden by the metaclass.
gi/types.py | 5 +++--
tests/test_gi.py | 19 +++++++++++++++++++
2 files changed, 22 insertions(+), 2 deletions(-)
---
diff --git a/gi/types.py b/gi/types.py
index e32bb72..87dbe16 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -116,7 +116,7 @@ class GObjectMeta(gobject.GObjectMeta, MetaClassHelper):
super(GObjectMeta, cls).__init__(name, bases, dict_)
# Avoid touching anything else than the base class.
- if cls.__name__ != cls.__info__.get_name():
+ if cls.__info__.get_g_type().pytype is not None:
return;
cls._setup_methods()
@@ -157,7 +157,8 @@ class StructMeta(type, MetaClassHelper):
super(StructMeta, cls).__init__(name, bases, dict_)
# Avoid touching anything else than the base class.
- if cls.__name__ != cls.__info__.get_name():
+ g_type = cls.__info__.get_g_type()
+ if g_type != gobject.TYPE_INVALID and g_type.pytype is not None:
return;
cls._setup_fields()
diff --git a/tests/test_gi.py b/tests/test_gi.py
index e8654b6..2d9c002 100644
--- a/tests/test_gi.py
+++ b/tests/test_gi.py
@@ -1422,6 +1422,25 @@ class TestGObject(unittest.TestCase):
# self.assertEquals(object_.__grefcount__, 1)
+class TestPythonGObject(unittest.TestCase):
+
+ class Object(TestGI.Object):
+ __gtype_name__ = "Object"
+
+ def method(self):
+ # Don't call super, which asserts that self.int == 42.
+ pass
+
+ def test_object(self):
+ self.assertTrue(issubclass(self.Object, TestGI.Object))
+
+ object_ = self.Object(int = 42)
+ self.assertTrue(isinstance(object_, self.Object))
+
+ def test_object_method(self):
+ self.Object(int = 0).method()
+
+
class TestMultiOutputArgs(unittest.TestCase):
def test_int_out_out(self):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]