Changeset 131:568476db7115


Ignore:
Timestamp:
Sep 2, 2013, 3:43:45 PM (7 years ago)
Author:
Stefano Rivera <stefano@…>
Branch:
default
rebase_source:
513891382d16b7e9129c3c82f5bfa9906d4be96b
Message:

Dump inline lists and dicts too

File:
1 edited

Legend:

Unmodified
Added
Removed
  • nagslang/yamlish.py

    r130 r131  
    77 * ints, floats,
    88 * True, False, and None
     9dict keys can only be strings.
    910'''
    1011
     
    3132class Dumper(object):
    3233    def dump(self, data):
    33         return '\n'.join(self._dump(data))
    34 
    35     def _dump(self, data, indent=0):
     34        return '\n'.join(self._dump_block(data))
     35
     36    def _dump_block(self, data, indent=0):
     37        for type_ in (list, dict):
     38            if isinstance(data, type_):
     39                f = getattr(self, '_dump_%s_block' % type_.__name__)
     40                return f(data, indent)
     41        raise NotImplementedError()
     42
     43    def _dump_inline(self, data):
     44        if data in (True, False, None):
     45            return self._dump_literal(data)
    3646        for type_ in (list, dict, basestring, int, float):
    3747            if isinstance(data, type_):
    3848                f = getattr(self, '_dump_%s' % type_.__name__)
    39                 return f(data, indent)
    40         if data in (True, False, None):
    41             return self._dump_literal(data, indent)
     49                return f(data)
    4250        raise NotImplementedError()
    4351
    44     def _dump_list(self, data, indent):
     52    def _dump_list_block(self, data, indent):
    4553        output = []
    4654        for item in data:
    47             dumped = self._dump(item, indent + 2)
    48             dumped[0] = '%s- %s' % (' ' * indent, dumped[0][indent + 2:])
    49             output += dumped
     55            if self._inlineable(item):
     56                output.append('%s- %s' % (' ' * indent,
     57                                          self._dump_inline(item)))
     58            else:
     59                dumped = self._dump_block(item, indent + 2)
     60                dumped[0] = '%s- %s' % (' ' * indent, dumped[0][indent + 2:])
     61                output += dumped
    5062        return output
    5163
    52     def _dump_dict(self, data, indent):
     64    def _dump_dict_block(self, data, indent):
    5365        output = []
    5466        for k, v in sorted(data.iteritems()):
    5567            output.append('%s%s:' % (' ' * indent, k))
    56             if isinstance(v, dict):
    57                 output += self._dump(v, indent + 2)
     68            if self._inlineable(v):
     69                output[-1] += ' ' + self._dump_inline(v)
     70            elif isinstance(v, dict):
     71                output += self._dump_block(v, indent + 2)
    5872            elif isinstance(v, list):
    59                 output += self._dump(v, indent)
     73                output += self._dump_block(v, indent)
    6074            else:
    61                 value = self._dump(v)
    62                 assert len(value) == 1
    63                 output[-1] += ' %s' % value[0]
     75                raise NotImplementedError()
    6476        return output
    6577
    66     def _dump_basestring(self, data, indent):
     78    def _inlineable(self, data):
     79        if isinstance(data, list):
     80            return all(not isinstance(item, (list, dict)) for item in data)
     81        elif isinstance(data, dict):
     82            return all(not isinstance(item, (list, dict))
     83                       for item in data.itervalues())
     84        else:
     85            return True
     86
     87    def _dump_list(self, data):
     88        return '[%s]' % ', '.join(self._dump_inline(item) for item in data)
     89
     90    def _dump_dict(self, data):
     91        return '{%s}' % ', '.join(
     92                '%s: %s' % (self._dump_inline(key), self._dump_inline(value))
     93                for key, value in data.iteritems())
     94
     95    def _dump_basestring(self, data):
    6796        if data in ('true', 'false', 'null'):
    68             data = "'%s'" % data
    69         elif "'" in data:
    70             data = "'%s'" % data.replace("'", "''")
    71         elif data == '':
    72             data = "''"
    73         return [' ' * indent + data]
    74 
    75     def _dump_int(self, data, indent):
    76         return ['%s%i' % (' ' * indent, data)]
    77 
    78     def _dump_float(self, data, indent):
    79         return ['%s%f' % (' ' * indent, data)]
    80 
    81     def _dump_literal(self, data, indent):
    82         string = {
     97            return "'%s'" % data
     98        if "'" in data:
     99            return "'%s'" % data.replace("'", "''")
     100        if data == '':
     101            return "''"
     102        return data
     103
     104    def _dump_int(self, data):
     105        return str(data)
     106
     107    def _dump_float(self, data):
     108        return str(data)
     109
     110    def _dump_literal(self, data):
     111        return {
    83112            True: 'true',
    84113            False: 'false',
    85114            None: 'null',
    86115        }[data]
    87         return [' ' * indent + string]
    88116
    89117
     
    214242            return output
    215243        if value.startswith('!!'):
    216             raise NotImplemented()
     244            raise NotImplementedError()
    217245        if value == 'true':
    218246            return True
Note: See TracChangeset for help on using the changeset viewer.