Aluode/PerceptionLabPortable
0
1 2__all__ = ['Serializer', 'SerializerError']3 4from .error import YAMLError5from .events import *6from .nodes import *7 8class SerializerError(YAMLError):9 pass10 11class Serializer:12 13 ANCHOR_TEMPLATE = 'id%03d'14 15 def __init__(self, encoding=None,16 explicit_start=None, explicit_end=None, version=None, tags=None):17 self.use_encoding = encoding18 self.use_explicit_start = explicit_start19 self.use_explicit_end = explicit_end20 self.use_version = version21 self.use_tags = tags22 self.serialized_nodes = {}23 self.anchors = {}24 self.last_anchor_id = 025 self.closed = None26 27 def open(self):28 if self.closed is None:29 self.emit(StreamStartEvent(encoding=self.use_encoding))30 self.closed = False31 elif self.closed:32 raise SerializerError("serializer is closed")33 else:34 raise SerializerError("serializer is already opened")35 36 def close(self):37 if self.closed is None:38 raise SerializerError("serializer is not opened")39 elif not self.closed:40 self.emit(StreamEndEvent())41 self.closed = True42 43 #def __del__(self):44 # self.close()45 46 def serialize(self, node):47 if self.closed is None:48 raise SerializerError("serializer is not opened")49 elif self.closed:50 raise SerializerError("serializer is closed")51 self.emit(DocumentStartEvent(explicit=self.use_explicit_start,52 version=self.use_version, tags=self.use_tags))53 self.anchor_node(node)54 self.serialize_node(node, None, None)55 self.emit(DocumentEndEvent(explicit=self.use_explicit_end))56 self.serialized_nodes = {}57 self.anchors = {}58 self.last_anchor_id = 059 60 def anchor_node(self, node):61 if node in self.anchors:62 if self.anchors[node] is None:63 self.anchors[node] = self.generate_anchor(node)64 else:65 self.anchors[node] = None66 if isinstance(node, SequenceNode):67 for item in node.value:68 self.anchor_node(item)69 elif isinstance(node, MappingNode):70 for key, value in node.value:71 self.anchor_node(key)72 self.anchor_node(value)73 74 def generate_anchor(self, node):75 self.last_anchor_id += 176 return self.ANCHOR_TEMPLATE % self.last_anchor_id77 78 def serialize_node(self, node, parent, index):79 alias = self.anchors[node]80 if node in self.serialized_nodes:81 self.emit(AliasEvent(alias))82 else:83 self.serialized_nodes[node] = True84 self.descend_resolver(parent, index)85 if isinstance(node, ScalarNode):86 detected_tag = self.resolve(ScalarNode, node.value, (True, False))87 default_tag = self.resolve(ScalarNode, node.value, (False, True))88 implicit = (node.tag == detected_tag), (node.tag == default_tag)89 self.emit(ScalarEvent(alias, node.tag, implicit, node.value,90 style=node.style))91 elif isinstance(node, SequenceNode):92 implicit = (node.tag93 == self.resolve(SequenceNode, node.value, True))94 self.emit(SequenceStartEvent(alias, node.tag, implicit,95 flow_style=node.flow_style))96 index = 097 for item in node.value:98 self.serialize_node(item, node, index)99 index += 1100 self.emit(SequenceEndEvent())101 elif isinstance(node, MappingNode):102 implicit = (node.tag103 == self.resolve(MappingNode, node.value, True))104 self.emit(MappingStartEvent(alias, node.tag, implicit,105 flow_style=node.flow_style))106 for key, value in node.value:107 self.serialize_node(key, node, None)108 self.serialize_node(value, node, key)109 self.emit(MappingEndEvent())110 self.ascend_resolver()111 112 