summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett Regier <garrett.regier@riftio.com>2015-01-19 14:53:53 -0800
committerGarrett Regier <garrett.regier@riftio.com>2015-01-24 22:15:16 -0800
commita4160892dd28ab1d656cef4d4059f3b3f95caf4a (patch)
treee501e563c16add370da7b583fd8153ed551b212c
parentef3bff4e570363e4f383d4cdae9cecd4073b03d8 (diff)
downloadpygobject-a4160892dd28ab1d656cef4d4059f3b3f95caf4a.tar.gz
Allows passing arguments to opaque Boxed types
https://bugzilla.gnome.org/show_bug.cgi?id=743214
-rw-r--r--gi/pygi-info.c7
-rw-r--r--gi/types.py10
-rw-r--r--tests/test_everything.py9
-rw-r--r--tests/test_glib.py6
4 files changed, 28 insertions, 4 deletions
diff --git a/gi/pygi-info.c b/gi/pygi-info.c
index 4df33591..8e0892a2 100644
--- a/gi/pygi-info.c
+++ b/gi/pygi-info.c
@@ -2167,9 +2167,16 @@ _wrap_g_union_info_get_methods (PyGIBaseInfo *self)
return _make_infos_tuple (self, g_union_info_get_n_methods, g_union_info_get_method);
}
+static PyObject *
+_wrap_g_union_info_get_size (PyGIBaseInfo *self)
+{
+ return PYGLIB_PyLong_FromSize_t (g_union_info_get_size (self->info));
+}
+
static PyMethodDef _PyGIUnionInfo_methods[] = {
{ "get_fields", (PyCFunction) _wrap_g_union_info_get_fields, METH_NOARGS },
{ "get_methods", (PyCFunction) _wrap_g_union_info_get_methods, METH_NOARGS },
+ { "get_size", (PyCFunction) _wrap_g_union_info_get_size, METH_NOARGS },
{ NULL, NULL, 0 }
};
diff --git a/gi/types.py b/gi/types.py
index e244f8cd..8acbcc26 100644
--- a/gi/types.py
+++ b/gi/types.py
@@ -313,6 +313,10 @@ def mro(C):
return bases
+def nothing(*args, **kwargs):
+ pass
+
+
class StructMeta(type, MetaClassHelper):
"""Meta class used for GI Struct based types."""
@@ -330,8 +334,12 @@ class StructMeta(type, MetaClassHelper):
for method_info in cls.__info__.get_methods():
if method_info.is_constructor() and \
method_info.__name__ == 'new' and \
- not method_info.get_arguments():
+ (not method_info.get_arguments() or
+ cls.__info__.get_size() == 0):
cls.__new__ = staticmethod(method_info)
+ # Boxed will raise an exception
+ # if arguments are given to __init__
+ cls.__init__ = nothing
break
@property
diff --git a/tests/test_everything.py b/tests/test_everything.py
index 741de1ae..88b6da14 100644
--- a/tests/test_everything.py
+++ b/tests/test_everything.py
@@ -1096,6 +1096,15 @@ class TestBoxed(unittest.TestCase):
self.assertTrue(boxed42_2.equals(boxed42))
self.assertTrue(boxed42.equals(boxed42))
+ def test_boxed_b_constructor(self):
+ with warnings.catch_warnings(record=True) as warn:
+ warnings.simplefilter('always')
+ boxed = Everything.TestBoxedB(42, 47)
+ self.assertTrue(issubclass(warn[0].category, TypeError))
+
+ self.assertEqual(boxed.some_int8, 0)
+ self.assertEqual(boxed.some_long, 0)
+
def test_boxed_c_equality(self):
boxed = Everything.TestBoxedC()
# TestBoxedC uses refcounting, so we know that
diff --git a/tests/test_glib.py b/tests/test_glib.py
index f9e48536..17ac2def 100644
--- a/tests/test_glib.py
+++ b/tests/test_glib.py
@@ -226,9 +226,9 @@ https://my.org/q?x=1&y=2
self.assertGreaterEqual(minor, 0)
self.assertGreaterEqual(micro, 0)
- def test_timezone_constructor_error(self):
- self.assertRaisesRegexp(TypeError, '.*constructor.*help\(GLib.TimeZone\).*',
- GLib.TimeZone)
+ def test_timezone_constructor(self):
+ timezone = GLib.TimeZone("+05:21")
+ self.assertEqual(timezone.get_offset(0), ((5 * 60) + 21) * 60)
def test_source_attach_implicit_context(self):
context = GLib.MainContext.default()