Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
serializer.py
Go to the documentation of this file.
1 # (c) Copyright Rosetta Commons Member Institutions.
2 # (c) This file is part of the Rosetta software suite and is made available under license.
3 # (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
4 # (c) For more information, see http://www.rosettacommons.org. Questions about this can be
5 # (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
6 
7 __all__ = ['Serializer', 'SerializerError']
8 
9 from error import YAMLError
10 from events import *
11 from nodes import *
12 
13 class SerializerError(YAMLError):
14  pass
15 
16 class Serializer(object):
17 
18  ANCHOR_TEMPLATE = u'id%03d'
19 
20  def __init__(self, encoding=None,
21  explicit_start=None, explicit_end=None, version=None, tags=None):
22  self.use_encoding = encoding
23  self.use_explicit_start = explicit_start
24  self.use_explicit_end = explicit_end
25  self.use_version = version
26  self.use_tags = tags
27  self.serialized_nodes = {}
28  self.anchors = {}
29  self.last_anchor_id = 0
30  self.closed = None
31 
32  def open(self):
33  if self.closed is None:
34  self.emit(StreamStartEvent(encoding=self.use_encoding))
35  self.closed = False
36  elif self.closed:
37  raise SerializerError("serializer is closed")
38  else:
39  raise SerializerError("serializer is already opened")
40 
41  def close(self):
42  if self.closed is None:
43  raise SerializerError("serializer is not opened")
44  elif not self.closed:
45  self.emit(StreamEndEvent())
46  self.closed = True
47 
48  #def __del__(self):
49  # self.close()
50 
51  def serialize(self, node):
52  if self.closed is None:
53  raise SerializerError("serializer is not opened")
54  elif self.closed:
55  raise SerializerError("serializer is closed")
56  self.emit(DocumentStartEvent(explicit=self.use_explicit_start,
57  version=self.use_version, tags=self.use_tags))
58  self.anchor_node(node)
59  self.serialize_node(node, None, None)
60  self.emit(DocumentEndEvent(explicit=self.use_explicit_end))
61  self.serialized_nodes = {}
62  self.anchors = {}
63  self.last_alias_id = 0
64 
65  def anchor_node(self, node):
66  if node in self.anchors:
67  if self.anchors[node] is None:
68  self.anchors[node] = self.generate_anchor(node)
69  else:
70  self.anchors[node] = None
71  if isinstance(node, SequenceNode):
72  for item in node.value:
73  self.anchor_node(item)
74  elif isinstance(node, MappingNode):
75  for key, value in node.value:
76  self.anchor_node(key)
77  self.anchor_node(value)
78 
79  def generate_anchor(self, node):
80  self.last_anchor_id += 1
81  return self.ANCHOR_TEMPLATE % self.last_anchor_id
82 
83  def serialize_node(self, node, parent, index):
84  alias = self.anchors[node]
85  if node in self.serialized_nodes:
86  self.emit(AliasEvent(alias))
87  else:
88  self.serialized_nodes[node] = True
89  self.descend_resolver(parent, index)
90  if isinstance(node, ScalarNode):
91  detected_tag = self.resolve(ScalarNode, node.value, (True, False))
92  default_tag = self.resolve(ScalarNode, node.value, (False, True))
93  implicit = (node.tag == detected_tag), (node.tag == default_tag)
94  self.emit(ScalarEvent(alias, node.tag, implicit, node.value,
95  style=node.style))
96  elif isinstance(node, SequenceNode):
97  implicit = (node.tag
98  == self.resolve(SequenceNode, node.value, True))
99  self.emit(SequenceStartEvent(alias, node.tag, implicit,
100  flow_style=node.flow_style))
101  index = 0
102  for item in node.value:
103  self.serialize_node(item, node, index)
104  index += 1
105  self.emit(SequenceEndEvent())
106  elif isinstance(node, MappingNode):
107  implicit = (node.tag
108  == self.resolve(MappingNode, node.value, True))
109  self.emit(MappingStartEvent(alias, node.tag, implicit,
110  flow_style=node.flow_style))
111  for key, value in node.value:
112  self.serialize_node(key, node, None)
113  self.serialize_node(value, node, key)
114  self.emit(MappingEndEvent())
115  self.ascend_resolver()
116