|
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() |