[pygobject] [gi] Add pythonic iterator and indexing for string GVariants



commit 2b8e1d0531dcb8f57dc9f2fddf25970bee3daa90
Author: Martin Pitt <martin pitt ubuntu com>
Date:   Wed Jan 19 20:18:19 2011 +0100

    [gi] Add pythonic iterator and indexing for string GVariants
    
    This extends commit b1a98083c to also work for strings.

 gi/overrides/GLib.py    |    8 +++++++-
 tests/test_overrides.py |   13 +++++++++++++
 2 files changed, 20 insertions(+), 1 deletions(-)
---
diff --git a/gi/overrides/GLib.py b/gi/overrides/GLib.py
index 38453de..100574e 100644
--- a/gi/overrides/GLib.py
+++ b/gi/overrides/GLib.py
@@ -199,9 +199,11 @@ class Variant(GLib.Variant):
     # Pythonic iterators
     #
     def __len__(self):
+        if self.get_type_string() in ['s', 'o', 'g']:
+            return len(self.get_string())
         if self.get_type_string().startswith('a') or self.get_type_string().startswith('('):
             return self.n_children()
-        raise TypeError, 'GVariant type %s is not a container' % self.get_type_string()
+        raise TypeError, 'GVariant type %s does not have a length' % self.get_type_string()
 
     def __getitem__(self, key):
         # dict
@@ -233,6 +235,10 @@ class Variant(GLib.Variant):
                 raise IndexError, 'list index out of range'
             return self.get_child_value(key).unpack()
 
+        # string
+        if self.get_type_string() in ['s', 'o', 'g']:
+            return self.get_string().__getitem__(key)
+
         raise TypeError, 'GVariant type %s is not a container' % self.get_type_string()
 
     def keys(self):
diff --git a/tests/test_overrides.py b/tests/test_overrides.py
index 67ccf6b..6a8488f 100644
--- a/tests/test_overrides.py
+++ b/tests/test_overrides.py
@@ -132,6 +132,19 @@ class TestGLib(unittest.TestCase):
         self.assertEqual(set(vsi.keys()), set(['key1', 'key2']))
         self.assertEqual(set(vis.keys()), set([1, 5]))
 
+        # string index access
+        v = GLib.Variant('si', 'hello')
+        self.assertEqual(len(v), 5)
+        self.assertEqual(v[0], 'h')
+        self.assertEqual(v[4], 'o')
+        self.assertEqual(v[-1], 'o')
+        self.assertEqual(v[-5], 'h')
+        self.assertRaises(IndexError, v.__getitem__, 5)
+        self.assertRaises(IndexError, v.__getitem__, -6)
+
+        # string iteration
+        self.assertEqual([x for x in v], ['h', 'e', 'l', 'l', 'o'])
+
 class TestPango(unittest.TestCase):
 
     def test_default_font_description(self):



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]