# HG changeset patch # User Stefano Rivera # Date 1378138362 -7200 # Node ID 366b334a7018c2e233e6981a282beefb2ba53c9c # Parent c5ff16c66100f520b4a666603703aa3690f8d1e8 Render tuples to lists diff -r c5ff16c66100 -r 366b334a7018 nagslang/tests/test_yamlish.py --- 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') diff -r c5ff16c66100 -r 366b334a7018 nagslang/yamlish.py --- 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'):