Mon, 06 Sep 2010 19:47:46 +0200
Started moving the XML handling code to QXmlStreamReader and QXmlStreamWriter.
E5XML/XMLStreamWriterBase.py | file | annotate | diff | comparison | revisions | |
eric5.e4p | file | annotate | diff | comparison | revisions |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/E5XML/XMLStreamWriterBase.py Mon Sep 06 19:47:46 2010 +0200 @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a base class for all of eric5s XML stream writers. +""" + +import pickle +import base64 + +from PyQt4.QtCore import QXmlStreamWriter + +class XMLStreamWriterBase(QXmlStreamWriter): + """ + Class implementing a base class for all of eric5s XML stream writers. + """ + def __init__(self, device): + """ + Constructor + + @param device reference to the I/O device to write to (QIODevice) + """ + QXmlStreamWriter.__init__(self, device) + + self.basics = { + type(None) : self._write_none, + int : self._write_int, + float : self._write_float, + complex : self._write_complex, + bool : self._write_bool, + str : self._write_string, + bytes : self._write_bytes, + bytearray : self._write_bytearray, + tuple : self._write_tuple, + list : self._write_list, + dict : self._write_dictionary, + set : self._write_set, + frozenset : self._write_frozenset, + } + + self.NEWPARA = chr(0x2029) + self.NEWLINE = chr(0x2028) + + self.setAutoFormatting(True) + self.setAutoFormattingIndent(2) + + def writeXML(self): + """ + Public method to write the XML to the file. + """ + # write the XML header + self.writeStartDocument() + + def encodedNewLines(self, text): + """ + Public method to encode newlines and paragraph breaks. + + @param text text to encode (string) + """ + return text.replace("\n\n", self.NEWPARA).replace("\n", self.NEWLINE) + + def _writeBasics(self, pyobject): + """ + Protected method to dump an object of a basic Python type. + + @param pyobject object to be dumped + """ + writeMethod = self.basics.get(type(pyobject)) or self._write_unimplemented + writeMethod(pyobject) + + ############################################################################ + ## The various writer methods for basic types + ############################################################################ + + def _write_none(self, value): + """ + Protected method to dump a NoneType object. + + @param value value to be dumped (None) (ignored) + """ + self.writeEmptyElement("none") + + def _write_int(self, value): + """ + Protected method to dump an int object. + + @param value value to be dumped (integer) + """ + self.writeTextElement("int", str(value)) + + def _write_bool(self, value): + """ + Protected method to dump a bool object. + + @param value value to be dumped (boolean) + """ + self.writeTextElement("bool", str(value)) + + def _write_float(self, value): + """ + Protected method to dump a float object. + + @param value value to be dumped (float) + """ + self.writeTextElement("float", str(value)) + + def _write_complex(self, value): + """ + Protected method to dump a complex object. + + @param value value to be dumped (complex) + """ + self.writeTextElement("complex", '{0} {1}'.format( + value.real, value.imag)) + + def _write_string(self, value): + """ + Protected method to dump a str object. + + @param value value to be dumped (string) + """ + self.writeTextElement("string", str(value)) + + def _write_bytes(self, value): + """ + Protected method to dump a bytes object. + + @param value value to be dumped (bytes) + """ + self.writeTextElement("bytes", ",".join(["{0:d}".format(b) for b in value])) + + def _write_bytearray(self, value): + """ + Protected method to dump a bytearray object. + + @param value value to be dumped (bytearray) + """ + self.writeTextElement("bytearray", ",".join(["{0:d}".format(b) for b in value])) + + def _write_tuple(self, value): + """ + Protected method to dump a tuple object. + + @param value value to be dumped (tuple) + """ + self.writeStartElement("tuple") + for elem in value: + self._writeBasics(elem) + self.writeEndElement() + + def _write_list(self, value): + """ + Protected method to dump a list object. + + @param value value to be dumped (list) + """ + self.writeStartElement("list") + for elem in value: + self._writeBasics(elem) + self.writeEndElement() + + def _write_dictionary(self, value): + """ + Protected method to dump a dict object. + + @param value value to be dumped (dictionary) + """ + self.writeStartElement("dict") + try: + keys = sorted(list(value.keys())) + except TypeError: + keys = list(value.keys()) + for key in keys: + self.writeStartElement("key") + self._writeBasics(key) + self.writeEndElement() + + self.writeStartElement("value") + self._writeBasics(value[key]) + self.writeEndElement() + self.writeEndElement() + + def _write_set(self, value): + """ + Protected method to dump a set object. + + @param value value to be dumped (set) + """ + self.writeStartElement("set") + for elem in value: + self._writeBasics(elem) + self.writeEndElement() + + def _write_frozenset(self, value): + """ + Protected method to dump a frozenset object. + + @param value value to be dumped (frozenset) + """ + self.writeStartElement("frozenset") + for elem in value: + self._writeBasics(elem) + self.writeEndElement() + + def _write_unimplemented(self, value): + """ + Protected method to dump a type, that has no special method. + + @param value value to be dumped (any pickleable object) + """ + self.writeStartElement("pickle") + self.writeAttribute("method", "pickle") + self.writeAttribute("encoding", "base64") + self.writeCharacters(str(base64.b64encode(pickle.dumps(value)), "ASCII")) + self.writeEndElement()
--- a/eric5.e4p Mon Sep 06 16:32:34 2010 +0200 +++ b/eric5.e4p Mon Sep 06 19:47:46 2010 +0200 @@ -819,6 +819,7 @@ <Source>Plugins/WizardPlugins/E5MessageBoxWizard/__init__.py</Source> <Source>Plugins/WizardPlugins/E5MessageBoxWizard/E5MessageBoxWizardDialog.py</Source> <Source>Plugins/PluginWizardE5MessageBox.py</Source> + <Source>E5XML/XMLStreamWriterBase.py</Source> </Sources> <Forms> <Form>PyUnit/UnittestDialog.ui</Form>