changeset 138:366b334a7018

Render tuples to lists
author Stefano Rivera <stefano@rivera.za.net>
date Mon, 02 Sep 2013 18:12:42 +0200
parents c5ff16c66100
children d1f543ff0805
files nagslang/tests/test_yamlish.py nagslang/yamlish.py
diffstat 2 files changed, 37 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/nagslang/tests/test_yamlish.py	Mon Sep 02 18:00:52 2013 +0200
+++ b/nagslang/tests/test_yamlish.py	Mon Sep 02 18:12:42 2013 +0200
@@ -34,6 +34,8 @@
 
 
 class TestRoundTrip(TestCase):
+    from_pyyaml = False
+
     def roundtrip(self, data):
         text = self.dump_s(data)
         print '\n=== Begin ===\n%s\n=== End ===' % text
@@ -106,6 +108,24 @@
             0.7: -0.7,
         })
 
+    def test_tuples(self):
+        if self.from_pyyaml:
+            raise SkipTest("Can't parse PyYAML tuples")
+        orig = {
+            'polygons': {
+                1: [
+                    (0, 1),
+                    (2, 3),
+                ],
+            },
+        }
+        text = self.dump_s(orig)
+        result = self.load_s(text)
+        self.assertEqual(orig['polygons'][1][0],
+                         tuple(result['polygons'][1][0]))
+        self.assertEqual(orig['polygons'][1][1],
+                         tuple(result['polygons'][1][1]))
+
     def test_quoted(self):
         # a literal true is True, but 'true' is a string
         self.roundtrip({'foo': 'true'})
@@ -121,6 +141,8 @@
 
 
 class TestFromPyYAML(TestRoundTrip):
+    from_pyyaml = True
+
     def dump_s(self, data):
         if yaml is None:
             raise SkipTest('yaml module unavailable')
@@ -128,6 +150,8 @@
 
 
 class TestFromPyYAMLInlineLists(TestRoundTrip):
+    from_pyyaml = True
+
     def dump_s(self, data):
         if yaml is None:
             raise SkipTest('yaml module unavailable')
--- a/nagslang/yamlish.py	Mon Sep 02 18:00:52 2013 +0200
+++ b/nagslang/yamlish.py	Mon Sep 02 18:12:42 2013 +0200
@@ -34,16 +34,16 @@
         return '\n'.join(self._dump_block(data))
 
     def _dump_block(self, data, indent=0):
-        for type_ in (list, dict):
+        for type_ in (list, tuple, dict):
             if isinstance(data, type_):
                 f = getattr(self, '_dump_%s_block' % type_.__name__)
                 return f(data, indent)
         raise NotImplementedError()
 
     def _dump_inline(self, data):
-        if data in (True, False, None):
+        if data is True or data is False or data is None:
             return self._dump_literal(data)
-        for type_ in (list, dict, basestring, int, float):
+        for type_ in (list, tuple, dict, basestring, int, float):
             if isinstance(data, type_):
                 f = getattr(self, '_dump_%s' % type_.__name__)
                 return f(data)
@@ -61,6 +61,8 @@
                 output += dumped
         return output
 
+    _dump_tuple_block = _dump_list_block
+
     def _dump_dict_block(self, data, indent):
         output = []
         for k, v in sorted(data.iteritems()):
@@ -76,10 +78,11 @@
         return output
 
     def _inlineable(self, data):
-        if isinstance(data, list):
-            return all(not isinstance(item, (list, dict)) for item in data)
+        if isinstance(data, (list, tuple)):
+            return all(not isinstance(item, (list, dict, tuple))
+                       for item in data)
         elif isinstance(data, dict):
-            return all(not isinstance(item, (list, dict))
+            return all(not isinstance(item, (list, dict, tuple))
                        for item in data.itervalues())
         else:
             return True
@@ -87,10 +90,12 @@
     def _dump_list(self, data):
         return '[%s]' % ', '.join(self._dump_inline(item) for item in data)
 
+    _dump_tuple = _dump_list
+
     def _dump_dict(self, data):
         return '{%s}' % ', '.join(
-                '%s: %s' % (self._dump_inline(key), self._dump_inline(value))
-                for key, value in data.iteritems())
+            '%s: %s' % (self._dump_inline(key), self._dump_inline(value))
+            for key, value in data.iteritems())
 
     def _dump_basestring(self, data):
         if data in ('true', 'false', 'null'):