eric7/E5XML/XMLStreamWriterBase.py

branch
eric7
changeset 8312
800c432b34c8
parent 8218
7c09585bd960
child 8314
e3642a6a1e71
equal deleted inserted replaced
8311:4e8b98454baa 8312:800c432b34c8
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a base class for all of eric6s XML stream writers.
8 """
9
10 import pickle # secok
11 import base64
12
13 from PyQt5.QtCore import QXmlStreamWriter
14
15
16 class XMLStreamWriterBase(QXmlStreamWriter):
17 """
18 Class implementing a base class for all of eric6s XML stream writers.
19 """
20 def __init__(self, device):
21 """
22 Constructor
23
24 @param device reference to the I/O device to write to (QIODevice)
25 """
26 super().__init__(device)
27
28 self.basics = {
29 type(None): self._write_none,
30 int: self._write_int,
31 float: self._write_float,
32 complex: self._write_complex,
33 bool: self._write_bool,
34 str: self._write_string,
35 bytearray: self._write_bytearray,
36 tuple: self._write_tuple,
37 list: self._write_list,
38 dict: self._write_dictionary,
39 set: self._write_set,
40 frozenset: self._write_frozenset,
41 bytes: self._write_bytes,
42 }
43
44 self.setAutoFormatting(True)
45 self.setAutoFormattingIndent(2)
46
47 def writeXML(self):
48 """
49 Public method to write the XML to the file.
50 """
51 # write the XML header
52 self.writeStartDocument()
53
54 def writeBasics(self, tag, pyobject):
55 """
56 Public method to write a tag with a basic Python object dump.
57
58 @param tag tag name (string)
59 @param pyobject object to be dumped
60 """
61 self.writeStartElement(tag)
62 self._writeBasics(pyobject)
63 self.writeEndElement()
64
65 def _writeBasics(self, pyobject):
66 """
67 Protected method to dump an object of a basic Python type.
68
69 @param pyobject object to be dumped
70 """
71 writeMethod = (
72 self.basics.get(type(pyobject)) or
73 self._write_unimplemented
74 )
75 writeMethod(pyobject)
76
77 ###########################################################################
78 ## The various writer methods for basic types
79 ###########################################################################
80
81 def _write_none(self, value):
82 """
83 Protected method to dump a NoneType object.
84
85 @param value value to be dumped (None) (ignored)
86 """
87 self.writeEmptyElement("none")
88
89 def _write_int(self, value):
90 """
91 Protected method to dump an int object.
92
93 @param value value to be dumped (integer)
94 """
95 self.writeTextElement("int", str(value))
96
97 def _write_bool(self, value):
98 """
99 Protected method to dump a bool object.
100
101 @param value value to be dumped (boolean)
102 """
103 self.writeTextElement("bool", str(value))
104
105 def _write_float(self, value):
106 """
107 Protected method to dump a float object.
108
109 @param value value to be dumped (float)
110 """
111 self.writeTextElement("float", str(value))
112
113 def _write_complex(self, value):
114 """
115 Protected method to dump a complex object.
116
117 @param value value to be dumped (complex)
118 """
119 self.writeTextElement("complex", '{0} {1}'.format(
120 value.real, value.imag))
121
122 def _write_string(self, value):
123 """
124 Protected method to dump a str object.
125
126 @param value value to be dumped (string)
127 """
128 self.writeTextElement("string", str(value))
129
130 def _write_bytes(self, value):
131 """
132 Protected method to dump a bytes object.
133
134 @param value value to be dumped (bytes)
135 """
136 self.writeTextElement(
137 "bytes", ",".join(["{0:d}".format(b) for b in value]))
138
139 def _write_bytearray(self, value):
140 """
141 Protected method to dump a bytearray object.
142
143 @param value value to be dumped (bytearray)
144 """
145 self.writeTextElement(
146 "bytearray", ",".join(["{0:d}".format(b) for b in value]))
147
148 def _write_tuple(self, value):
149 """
150 Protected method to dump a tuple object.
151
152 @param value value to be dumped (tuple)
153 """
154 self.writeStartElement("tuple")
155 for elem in value:
156 self._writeBasics(elem)
157 self.writeEndElement()
158
159 def _write_list(self, value):
160 """
161 Protected method to dump a list object.
162
163 @param value value to be dumped (list)
164 """
165 self.writeStartElement("list")
166 for elem in value:
167 self._writeBasics(elem)
168 self.writeEndElement()
169
170 def _write_dictionary(self, value):
171 """
172 Protected method to dump a dict object.
173
174 @param value value to be dumped (dictionary)
175 """
176 self.writeStartElement("dict")
177 try:
178 keys = sorted(list(value.keys()))
179 except TypeError:
180 keys = list(value.keys())
181 for key in keys:
182 self.writeStartElement("key")
183 self._writeBasics(key)
184 self.writeEndElement()
185
186 self.writeStartElement("value")
187 self._writeBasics(value[key])
188 self.writeEndElement()
189 self.writeEndElement()
190
191 def _write_set(self, value):
192 """
193 Protected method to dump a set object.
194
195 @param value value to be dumped (set)
196 """
197 self.writeStartElement("set")
198 for elem in value:
199 self._writeBasics(elem)
200 self.writeEndElement()
201
202 def _write_frozenset(self, value):
203 """
204 Protected method to dump a frozenset object.
205
206 @param value value to be dumped (frozenset)
207 """
208 self.writeStartElement("frozenset")
209 for elem in value:
210 self._writeBasics(elem)
211 self.writeEndElement()
212
213 def _write_unimplemented(self, value):
214 """
215 Protected method to dump a type, that has no special method.
216
217 @param value value to be dumped (any pickleable object)
218 """
219 self.writeStartElement("pickle")
220 self.writeAttribute("method", "pickle")
221 self.writeAttribute("encoding", "base64")
222 self.writeCharacters(
223 str(base64.b64encode(pickle.dumps(value)), "ASCII"))
224 self.writeEndElement()

eric ide

mercurial