diff options
author | Garrett Regier <garrett.regier@riftio.com> | 2015-01-19 14:53:53 -0800 |
---|---|---|
committer | Garrett Regier <garrett.regier@riftio.com> | 2015-01-24 22:15:16 -0800 |
commit | a4160892dd28ab1d656cef4d4059f3b3f95caf4a (patch) | |
tree | e501e563c16add370da7b583fd8153ed551b212c | |
parent | ef3bff4e570363e4f383d4cdae9cecd4073b03d8 (diff) | |
download | pygobject-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.c | 7 | ||||
-rw-r--r-- | gi/types.py | 10 | ||||
-rw-r--r-- | tests/test_everything.py | 9 | ||||
-rw-r--r-- | tests/test_glib.py | 6 |
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() |