__all__ = ['Serializer', 'SerializerError'] from error import YAMLError from events import * from nodes import * class SerializerError(YAMLError): pass class Serializer(object): ANCHOR_TEMPLATE = u'id%03d' def __init__(self, encoding=None, explicit_start=None, explicit_end=None, version=None, tags=None): self.use_encoding = encoding self.use_explicit_start = explicit_start self.use_explicit_end = explicit_end self.use_version = version self.use_tags = tags self.serialized_nodes = {} self.anchors = {} self.last_anchor_id = 0 self.closed = None def open(self): if self.closed is None: self.emit(StreamStartEvent(encoding=self.use_encoding)) self.closed = False elif self.closed: raise SerializerError("serializer is closed") else: raise SerializerError("serializer is already opened") def close(self): if self.closed is None: raise SerializerError("serializer is not opened") elif not self.closed: self.emit(StreamEndEvent()) self.closed = True #def __del__(self): # self.close() def serialize(self, node): if self.closed is None: raise SerializerError("serializer is not opened") elif self.closed: raise SerializerError("serializer is closed") self.emit(DocumentStartEvent(explicit=self.use_explicit_start, version=self.use_version, tags=self.use_tags)) self.anchor_node(node) self.serialize_node(node, None, None) self.emit(DocumentEndEvent(explicit=self.use_explicit_end)) self.serialized_nodes = {} self.anchors = {} self.last_anchor_id = 0 def anchor_node(self, node): if node in self.anchors: if self.anchors[node] is None: self.anchors[node] = self.generate_anchor(node) else: self.anchors[node] = None if isinstance(node, SequenceNode): for item in node.value: self.anchor_node(item) elif isinstance(node, MappingNode): for key, value in node.value: self.anchor_node(key) self.anchor_node(value) def generate_anchor(self, node): self.last_anchor_id += 1 return self.ANCHOR_TEMPLATE % self.last_anchor_id def serialize_node(self, node, parent, index): alias = self.anchors[node] if node in self.serialized_nodes: self.emit(AliasEvent(alias)) else: self.serialized_nodes[node] = True self.descend_resolver(parent, index) if isinstance(node, ScalarNode): detected_tag = self.resolve(ScalarNode, node.value, (True, False)) default_tag = self.resolve(ScalarNode, node.value, (False, True)) implicit = (node.tag == detected_tag), (node.tag == default_tag) self.emit(ScalarEvent(alias, node.tag, implicit, node.value, style=node.style)) elif isinstance(node, SequenceNode): implicit = (node.tag == self.resolve(SequenceNode, node.value, True)) self.emit(SequenceStartEvent(alias, node.tag, implicit, flow_style=node.flow_style)) index = 0 for item in node.value: self.serialize_node(item, node, index) index += 1 self.emit(SequenceEndEvent()) elif isinstance(node, MappingNode): implicit = (node.tag == self.resolve(MappingNode, node.value, True)) self.emit(MappingStartEvent(alias, node.tag, implicit, flow_style=node.flow_style)) for key, value in node.value: self.serialize_node(key, node, None) self.serialize_node(value, node, key) self.emit(MappingEndEvent()) self.ascend_resolver()
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__init__.py | File | 9.55 KB | 0644 |
|
__init__.pyc | File | 11.09 KB | 0644 |
|
composer.py | File | 4.81 KB | 0644 |
|
composer.pyc | File | 4.4 KB | 0644 |
|
constructor.py | File | 24.56 KB | 0644 |
|
constructor.pyc | File | 21.3 KB | 0644 |
|
cyaml.py | File | 3.21 KB | 0644 |
|
cyaml.pyc | File | 3.7 KB | 0644 |
|
dumper.py | File | 2.66 KB | 0644 |
|
dumper.pyc | File | 2.49 KB | 0644 |
|
emitter.py | File | 42.41 KB | 0644 |
|
emitter.pyc | File | 31.21 KB | 0644 |
|
error.py | File | 2.5 KB | 0644 |
|
error.pyc | File | 2.88 KB | 0644 |
|
events.py | File | 2.39 KB | 0644 |
|
events.pyc | File | 4.78 KB | 0644 |
|
loader.py | File | 1.11 KB | 0644 |
|
loader.pyc | File | 1.83 KB | 0644 |
|
nodes.py | File | 1.41 KB | 0644 |
|
nodes.pyc | File | 2.12 KB | 0644 |
|
parser.py | File | 24.94 KB | 0644 |
|
parser.pyc | File | 14.3 KB | 0644 |
|
reader.py | File | 6.77 KB | 0644 |
|
reader.pyc | File | 5.57 KB | 0644 |
|
representer.py | File | 17.3 KB | 0644 |
|
representer.pyc | File | 14.28 KB | 0644 |
|
resolver.py | File | 8.91 KB | 0644 |
|
resolver.pyc | File | 6.52 KB | 0644 |
|
scanner.py | File | 51.22 KB | 0644 |
|
scanner.pyc | File | 32.09 KB | 0644 |
|
serializer.py | File | 4.07 KB | 0644 |
|
serializer.pyc | File | 4.21 KB | 0644 |
|
tokens.py | File | 2.51 KB | 0644 |
|
tokens.pyc | File | 6.28 KB | 0644 |
|