[pygobject] Add support for GVariant properties defined in C



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]