source: trunk/lib/syck/dumpers.py @ 19

Revision 19, 2.5 KB checked in by xi, 9 years ago (diff)

Add generic (and mostly incorrect) Dumper class.

Line 
1
2import _syck
3
4try:
5    import cStringIO as StringIO
6except ImportError:
7    import StringIO
8
9__all__ = ['GenericDumper', 'Dumper',
10    'emit', 'dump', 'emit_documents', 'dump_documents']
11
12class GenericDumper(_syck.Emitter):
13
14    def dump(self, object):
15        self.emit(self._convert(object, {}))
16
17    def _convert(self, object, object_to_node):
18        if id(object) in object_to_node:
19            return object_to_node[id(object)]
20        node = self.represent(object)
21        object_to_node[id(object)] = node
22        if node.kind == 'seq':
23            for index, item in enumerate(node.value):
24                node.value[index] = self._convert(item, object_to_node)
25        elif node.kind == 'map':
26            for key in node.value.keys():
27                value = node.value[key]
28                del node.value[key]
29                node.value[self._convert(key, object_to_node)] =    \
30                        self._convert(value, object_to_node)
31        return node
32
33    def represent(self, object):
34        if isinstance(object, dict):
35            return _syck.Map(object.copy(), tag="tag:yaml.org,2002:map")
36        elif isinstance(object, list):
37            return _syck.Seq(object[:], tag="tag:yaml.org,2002:seq")
38        else:
39            return _syck.Scalar(str(object), tag="tag:yaml.org,2002:str")
40
41class Dumper(GenericDumper):
42
43    def represent(self, object):
44        return super(Dumper, self).represent(object)
45
46def emit(node, output=None, **parameters):
47    if output is None:
48        dumper = Dumper(StringIO.StringIO(), **parameters)
49    else:
50        dumper = Dumper(output, **parameters)
51    dumper.emit(node)
52    if output is None:
53        return dumper.output.getvalue()
54
55def dump(object, output=None, **parameters):
56    if output is None:
57        dumper = Dumper(StringIO.StringIO(), **parameters)
58    else:
59        dumper = Dumper(output, **parameters)
60    dumper.dump(object)
61    if output is None:
62        return dumper.output.getvalue()
63
64def emit_documents(nodes, output=None, **parameters):
65    if output is None:
66        dumper = Dumper(StringIO.StringIO(), **parameters)
67    else:
68        dumper = Dumper(output, **parameters)
69    for node in nodes:
70        dumper.emit(node)
71    if output is None:
72        return dumper.output.getvalue()
73
74def dump_documents(objects, output=None, **parameters):
75    if output is None:
76        dumper = Dumper(StringIO.StringIO(), **parameters)
77    else:
78        dumper = Dumper(output, **parameters)
79    for object in objects:
80        dumper.dump(object)
81    if output is None:
82        return dumper.output.getvalue()
83
84
Note: See TracBrowser for help on using the repository browser.