[pygobject] Add support for GVariant properties defined in C
- From: Martin Pitt <martinpitt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pygobject] Add support for GVariant properties defined in C
- Date: Wed, 14 Nov 2012 07:24:05 +0000 (UTC)
commit e944caf5ff53143a98dd4a5578530996358013ec
Author: Martin Pitt <martinpitt gnome org>
Date: Wed Nov 14 08:22:35 2012 +0100
Add support for GVariant properties defined in C
Note that trying to assign a non-GVariant value to a GVariant property
currently crashes.
gi/pygi-property.c | 6 +++++-
tests/test_gi.py | 21 +++++++++++++++++++++
2 files changed, 26 insertions(+), 1 deletions(-)
---
diff --git a/gi/pygi-property.c b/gi/pygi-property.c
index a072ef1..6079efc 100644
--- a/gi/pygi-property.c
+++ b/gi/pygi-property.c
@@ -196,6 +196,8 @@ pygi_get_property_value_real (PyGObject *instance, GParamSpec *pspec)
arg.v_pointer = g_value_get_boxed (&value);
} else if (g_type_is_a (type, G_TYPE_POINTER)) {
arg.v_pointer = g_value_get_pointer (&value);
+ } else if (g_type_is_a (type, G_TYPE_VARIANT)) {
+ arg.v_pointer = g_value_get_variant (&value);
} else {
PyErr_Format (PyExc_NotImplementedError,
"Retrieving properties of type '%s' is not implemented",
@@ -314,12 +316,14 @@ pygi_set_property_value_real (PyGObject *instance,
case GI_INFO_TYPE_UNION:
if (g_type_is_a (type, G_TYPE_BOXED)) {
g_value_set_boxed (&value, arg.v_pointer);
+ } else if (g_type_is_a (type, G_TYPE_VARIANT)) {
+ g_value_set_variant (&value, arg.v_pointer);
} else {
PyErr_Format (PyExc_NotImplementedError,
"Setting properties of type '%s' is not implemented",
g_type_name (type));
}
- break;
+ goto out;
default:
PyErr_Format (PyExc_NotImplementedError,
"Setting properties of type '%s' is not implemented",
diff --git a/tests/test_gi.py b/tests/test_gi.py
index d6de4db..155f5d8 100644
--- a/tests/test_gi.py
+++ b/tests/test_gi.py
@@ -2587,6 +2587,27 @@ class TestPropertiesObject(unittest.TestCase):
obj = GIMarshallingTests.PropertiesObject(some_boxed_struct=struct1)
self.assertEqual(obj.props.some_boxed_struct.long_, 1)
+ def test_variant(self):
+ self.assertEqual(self.obj.props.some_variant, None)
+
+ self.obj.props.some_variant = GLib.Variant('o', '/myobj')
+ self.assertEqual(self.obj.props.some_variant.get_type_string(), 'o')
+ self.assertEqual(self.obj.props.some_variant.print_(False), "'/myobj'")
+
+ self.obj.props.some_variant = None
+ self.assertEqual(self.obj.props.some_variant, None)
+
+ obj = GIMarshallingTests.PropertiesObject(some_variant=GLib.Variant('b', True))
+ self.assertEqual(obj.props.some_variant.get_type_string(), 'b')
+ self.assertEqual(obj.props.some_variant.get_boolean(), True)
+
+ # FIXME:
+ #self.assertRaises(TypeError, setattr, self.obj.props, 'some_variant', 'foo')
+ #self.assertRaises(TypeError, setattr, self.obj.props, 'some_variant', None)
+
+ self.assertEqual(obj.props.some_variant.get_type_string(), 'b')
+ self.assertEqual(obj.props.some_variant.get_boolean(), True)
+
class TestKeywords(unittest.TestCase):
def test_method(self):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]