Sat, 11 Sep 2010 17:33:02 +0200
Migrated the tasks handler to tasks reader.
Documentation/Source/eric5.E5XML.TasksHandler.html | file | annotate | diff | comparison | revisions | |
E5XML/TasksHandler.py | file | annotate | diff | comparison | revisions | |
E5XML/TasksReader.py | file | annotate | diff | comparison | revisions | |
Project/Project.py | file | annotate | diff | comparison | revisions | |
UI/UserInterface.py | file | annotate | diff | comparison | revisions | |
eric5.e4p | file | annotate | diff | comparison | revisions |
--- a/Documentation/Source/eric5.E5XML.TasksHandler.html Fri Sep 10 20:03:59 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,214 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' -'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'> -<html><head> -<title>eric5.E5XML.TasksHandler</title> -<style> -body { - background: #EDECE6; - margin: 0em 1em 10em 1em; - color: black; -} - -h1 { color: white; background: #85774A; } -h2 { color: white; background: #85774A; } -h3 { color: white; background: #9D936E; } -h4 { color: white; background: #9D936E; } - -a { color: #BA6D36; } - -</style> -</head> -<body><a NAME="top" ID="top"></a> -<h1>eric5.E5XML.TasksHandler</h1> -<p> -Module implementing the handler class for reading an XML tasks file. -</p> -<h3>Global Attributes</h3> -<table> -<tr><td>None</td></tr> -</table> -<h3>Classes</h3> -<table> -<tr> -<td><a href="#TasksHandler">TasksHandler</a></td> -<td>Class implementing a sax handler to read an XML tasks file.</td> -</tr> -</table> -<h3>Functions</h3> -<table> -<tr><td>None</td></tr> -</table> -<hr /><hr /> -<a NAME="TasksHandler" ID="TasksHandler"></a> -<h2>TasksHandler</h2> -<p> - Class implementing a sax handler to read an XML tasks file. -</p> -<h3>Derived from</h3> -XMLHandlerBase -<h3>Class Attributes</h3> -<table> -<tr><td>None</td></tr> -</table> -<h3>Methods</h3> -<table> -<tr> -<td><a href="#TasksHandler.__init__">TasksHandler</a></td> -<td>Constructor</td> -</tr><tr> -<td><a href="#TasksHandler.__buildPath">__buildPath</a></td> -<td>Private method to assemble a path.</td> -</tr><tr> -<td><a href="#TasksHandler.endCreated">endCreated</a></td> -<td>Handler method for the "Created" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.endDescription">endDescription</a></td> -<td>Handler method for the "Description" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.endDir">endDir</a></td> -<td>Handler method for the "Dir" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.endFilename">endFilename</a></td> -<td>Handler method for the "Filename" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.endLinenumber">endLinenumber</a></td> -<td>Handler method for the "Linenumber" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.endName">endName</a></td> -<td>Handler method for the "Name" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.endSummary">endSummary</a></td> -<td>Handler method for the "Summary" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.endTask">endTask</a></td> -<td>Handler method for the "Task" end tag.</td> -</tr><tr> -<td><a href="#TasksHandler.getVersion">getVersion</a></td> -<td>Public method to retrieve the version of the tasks file.</td> -</tr><tr> -<td><a href="#TasksHandler.startDocumentTasks">startDocumentTasks</a></td> -<td>Handler called, when the document parsing is started.</td> -</tr><tr> -<td><a href="#TasksHandler.startFilename">startFilename</a></td> -<td>Handler method for the "Filename" start tag.</td> -</tr><tr> -<td><a href="#TasksHandler.startTask">startTask</a></td> -<td>Handler method for the "Task" start tag.</td> -</tr><tr> -<td><a href="#TasksHandler.startTasks">startTasks</a></td> -<td>Handler method for the "Tasks" start tag.</td> -</tr> -</table> -<a NAME="TasksHandler.__init__" ID="TasksHandler.__init__"></a> -<h4>TasksHandler (Constructor)</h4> -<b>TasksHandler</b>(<i>forProject = False, taskViewer=None</i>) -<p> - Constructor -</p><dl> -<dt><i>forProject</i></dt> -<dd> -flag indicating project related mode (boolean) -</dd><dt><i>taskViewer</i></dt> -<dd> -reference to the task viewer object -</dd> -</dl><a NAME="TasksHandler.__buildPath" ID="TasksHandler.__buildPath"></a> -<h4>TasksHandler.__buildPath</h4> -<b>__buildPath</b>(<i></i>) -<p> - Private method to assemble a path. -</p><dl> -<dt>Returns:</dt> -<dd> -The ready assembled path. (string) -</dd> -</dl><a NAME="TasksHandler.endCreated" ID="TasksHandler.endCreated"></a> -<h4>TasksHandler.endCreated</h4> -<b>endCreated</b>(<i></i>) -<p> - Handler method for the "Created" end tag. -</p><a NAME="TasksHandler.endDescription" ID="TasksHandler.endDescription"></a> -<h4>TasksHandler.endDescription</h4> -<b>endDescription</b>(<i></i>) -<p> - Handler method for the "Description" end tag. -</p><a NAME="TasksHandler.endDir" ID="TasksHandler.endDir"></a> -<h4>TasksHandler.endDir</h4> -<b>endDir</b>(<i></i>) -<p> - Handler method for the "Dir" end tag. -</p><a NAME="TasksHandler.endFilename" ID="TasksHandler.endFilename"></a> -<h4>TasksHandler.endFilename</h4> -<b>endFilename</b>(<i></i>) -<p> - Handler method for the "Filename" end tag. -</p><a NAME="TasksHandler.endLinenumber" ID="TasksHandler.endLinenumber"></a> -<h4>TasksHandler.endLinenumber</h4> -<b>endLinenumber</b>(<i></i>) -<p> - Handler method for the "Linenumber" end tag. -</p><a NAME="TasksHandler.endName" ID="TasksHandler.endName"></a> -<h4>TasksHandler.endName</h4> -<b>endName</b>(<i></i>) -<p> - Handler method for the "Name" end tag. -</p><a NAME="TasksHandler.endSummary" ID="TasksHandler.endSummary"></a> -<h4>TasksHandler.endSummary</h4> -<b>endSummary</b>(<i></i>) -<p> - Handler method for the "Summary" end tag. -</p><a NAME="TasksHandler.endTask" ID="TasksHandler.endTask"></a> -<h4>TasksHandler.endTask</h4> -<b>endTask</b>(<i></i>) -<p> - Handler method for the "Task" end tag. -</p><a NAME="TasksHandler.getVersion" ID="TasksHandler.getVersion"></a> -<h4>TasksHandler.getVersion</h4> -<b>getVersion</b>(<i></i>) -<p> - Public method to retrieve the version of the tasks file. -</p><dl> -<dt>Returns:</dt> -<dd> -String containing the version number. -</dd> -</dl><a NAME="TasksHandler.startDocumentTasks" ID="TasksHandler.startDocumentTasks"></a> -<h4>TasksHandler.startDocumentTasks</h4> -<b>startDocumentTasks</b>(<i></i>) -<p> - Handler called, when the document parsing is started. -</p><a NAME="TasksHandler.startFilename" ID="TasksHandler.startFilename"></a> -<h4>TasksHandler.startFilename</h4> -<b>startFilename</b>(<i>attrs</i>) -<p> - Handler method for the "Filename" start tag. -</p><dl> -<dt><i>attrs</i></dt> -<dd> -list of tag attributes -</dd> -</dl><a NAME="TasksHandler.startTask" ID="TasksHandler.startTask"></a> -<h4>TasksHandler.startTask</h4> -<b>startTask</b>(<i>attrs</i>) -<p> - Handler method for the "Task" start tag. -</p><dl> -<dt><i>attrs</i></dt> -<dd> -list of tag attributes -</dd> -</dl><a NAME="TasksHandler.startTasks" ID="TasksHandler.startTasks"></a> -<h4>TasksHandler.startTasks</h4> -<b>startTasks</b>(<i>attrs</i>) -<p> - Handler method for the "Tasks" start tag. -</p><dl> -<dt><i>attrs</i></dt> -<dd> -list of tag attributes -</dd> -</dl> -<div align="right"><a href="#top">Up</a></div> -<hr /> -</body></html> \ No newline at end of file
--- a/E5XML/TasksHandler.py Fri Sep 10 20:03:59 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright (c) 2005 - 2010 Detlev Offenbach <detlev@die-offenbachs.de> -# - -""" -Module implementing the handler class for reading an XML tasks file. -""" - -import os -import time - -from E5Gui.E5Application import e5App - -from .Config import tasksFileFormatVersion -from .XMLHandlerBase import XMLHandlerBase - -import Utilities - -class TasksHandler(XMLHandlerBase): - """ - Class implementing a sax handler to read an XML tasks file. - """ - def __init__(self, forProject = False, taskViewer=None): - """ - Constructor - - @param forProject flag indicating project related mode (boolean) - @param taskViewer reference to the task viewer object - """ - XMLHandlerBase.__init__(self) - - self.startDocumentSpecific = self.startDocumentTasks - - self.elements.update({ - 'Tasks' : (self.startTasks, self.defaultEndElement), - 'Summary' : (self.defaultStartElement, self.endSummary), - 'Description' : (self.defaultStartElement, self.endDescription), - 'Created' : (self.defaultStartElement, self.endCreated), - 'Dir' : (self.defaultStartElement, self.endDir), - 'Name' : (self.defaultStartElement, self.endName), - 'Filename' : (self.startFilename, self.endFilename), - 'Linenumber' : (self.defaultStartElement, self.endLinenumber), - 'Task' : (self.startTask, self.endTask), - }) - - self.forProject = forProject - if taskViewer: - self.taskViewer = taskViewer - else: - self.taskViewer = e5App().getObject("TaskViewer") - - def startDocumentTasks(self): - """ - Handler called, when the document parsing is started. - """ - self.version = '' - self.pathStack = [] - - ################################################### - ## below follow the individual handler functions - ################################################### - - def startTask(self, attrs): - """ - Handler method for the "Task" start tag. - - @param attrs list of tag attributes - """ - self.task = {"summary" : "", - "priority" : 1, - "completed" : False, - "created" : 0, - "filename" : "", - "linenumber" : 0, - "bugfix" : False, - "description" : "", - } - self.task["priority"] = int(attrs.get("priority", "1")) - - val = attrs.get("completed", "False") - if val in ["True", "False"]: - val = (val == "True") - else: - val = bool(int(val)) - self.task["completed"] = val - - val = attrs.get("bugfix", "False") - if val in ["True", "False"]: - val = (val == "True") - else: - val = bool(int(val)) - self.task["bugfix"] = val - - def endTask(self): - """ - Handler method for the "Task" end tag. - """ - self.taskViewer.addTask(self.task["summary"], priority = self.task["priority"], - filename = self.task["filename"], lineno = self.task["linenumber"], - completed = self.task["completed"], - _time = self.task["created"], isProjectTask = self.forProject, - isBugfixTask = self.task["bugfix"], longtext = self.task["description"]) - - def endSummary(self): - """ - Handler method for the "Summary" end tag. - """ - self.task["summary"] = self.unescape(self.buffer) - - def endDescription(self): - """ - Handler method for the "Description" end tag. - """ - if self.version < '4.1': - self.task["summary"] = self.unescape(self.buffer) - elif self.version == '4.1': - self.task["description"] = self.unescape(self.buffer) - else: - self.buffer = self.unescape(self.buffer) - self.task["description"] = self.decodedNewLines(self.buffer) - - def endCreated(self): - """ - Handler method for the "Created" end tag. - """ - self.task["created"] = \ - time.mktime(time.strptime(self.buffer, "%Y-%m-%d, %H:%M:%S")) - - def endDir(self): - """ - Handler method for the "Dir" end tag. - """ - self.pathStack.append(self.buffer) - - def endName(self): - """ - Handler method for the "Name" end tag. - """ - self.pathStack.append(self.buffer) - - def endLinenumber(self): - """ - Handler method for the "Linenumber" end tag. - """ - try: - self.task["linenumber"] = int(self.buffer) - except ValueError: - pass - - def startFilename(self, attrs): - """ - Handler method for the "Filename" start tag. - - @param attrs list of tag attributes - """ - self.pathStack = [] - self.buffer = "" - - def endFilename(self): - """ - Handler method for the "Filename" end tag. - """ - if self.version >= '4.2': - self.task["filename"] = \ - Utilities.toNativeSeparators(self.buffer) - else: - self.task["filename"] = self.__buildPath() - - def __buildPath(self): - """ - Private method to assemble a path. - - @return The ready assembled path. (string) - """ - path = "" - if self.pathStack and not self.pathStack[0]: - self.pathStack[0] = os.sep - for p in self.pathStack: - path = os.path.join(path, p) - return path - - def startTasks(self, attrs): - """ - Handler method for the "Tasks" start tag. - - @param attrs list of tag attributes - """ - self.version = attrs.get('version', tasksFileFormatVersion) - - def getVersion(self): - """ - Public method to retrieve the version of the tasks file. - - @return String containing the version number. - """ - return self.version \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/E5XML/TasksReader.py Sat Sep 11 17:33:02 2010 +0200 @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2010 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a class for reading an XML tasks file. +""" + +import time + +from E5Gui.E5Application import e5App + +from .Config import tasksFileFormatVersion +from .XMLStreamReaderBase import XMLStreamReaderBase + +import Utilities + +class TasksReader(XMLStreamReaderBase): + """ + Class for reading an XML tasks file. + """ + def __init__(self, device, forProject = False, viewer = None): + """ + Constructor + + @param device reference to the I/O device to read from (QIODevice) + @param forProject flag indicating project related mode (boolean) + @param viewer reference to the task viewer (TaskViewer) + """ + XMLStreamReaderBase.__init__(self, device) + + self.viewer = viewer + + self.forProject = forProject + if viewer: + self.viewer = viewer + else: + self.viewer = e5App().getObject("TaskViewer") + + self.version = "" + + def readXML(self): + """ + Public method to read and parse the XML document. + """ + while not self.atEnd(): + self.readNext() + if self.isStartElement(): + if self.name() == "Tasks": + self.version = self.attribute("version", + tasksFileFormatVersion) + elif self.name() == "Task": + self.__readTask() + + self.showErrorMessage() + + def __readTask(self): + """ + Private method to read the task info. + """ + task = {"summary" : "", + "priority" : 1, + "completed" : False, + "created" : 0, + "filename" : "", + "linenumber" : 0, + "bugfix" : False, + "description" : "", + } + task["priority"] = int(self.attribute("priority", "1")) + + val = self.attribute("completed", "False") + if val in ["True", "False"]: + val = (val == "True") + else: + val = bool(int(val)) + task["completed"] = val + + val = self.attribute("bugfix", "False") + if val in ["True", "False"]: + val = (val == "True") + else: + val = bool(int(val)) + task["bugfix"] = val + + while not self.atEnd(): + self.readNext() + if self.isEndElement() and self.name() == "Task": + self.viewer.addTask(task["summary"], priority = task["priority"], + filename = task["filename"], lineno = task["linenumber"], + completed = task["completed"], _time = task["created"], + isProjectTask = self.forProject, isBugfixTask = task["bugfix"], + longtext = task["description"]) + break + + if self.isStartElement(): + if self.name() == "Summary": + task["summary"] = self.readElementText() + elif self.name() == "Description": + task["description"] = self.readElementText() + elif self.name() == "Created": + task["created"] = time.mktime( + time.strptime(self.readElementText(), "%Y-%m-%d, %H:%M:%S")) + elif self.name() == "Filename": + task["filename"] = \ + Utilities.toNativeSeparators(self.readElementText()) + elif self.name() == "Linenumber": + try: + task["linenumber"] = int(self.readElementText()) + except ValueError: + pass
--- a/Project/Project.py Fri Sep 10 20:03:59 2010 +0200 +++ b/Project/Project.py Sat Sep 11 17:33:02 2010 +0200 @@ -47,7 +47,7 @@ from E5XML.UserProjectWriter import UserProjectWriter from E5XML.SessionHandler import SessionHandler from E5XML.SessionWriter import SessionWriter -from E5XML.TasksHandler import TasksHandler +from E5XML.TasksReader import TasksReader from E5XML.TasksWriter import TasksWriter from E5XML.DebuggerPropertiesHandler import DebuggerPropertiesHandler from E5XML.DebuggerPropertiesWriter import DebuggerPropertiesWriter @@ -1111,103 +1111,18 @@ return fn, ext = os.path.splitext(os.path.basename(self.pfile)) - - try: - if ext.lower() in [".e4pz"]: - fn = os.path.join(self.getProjectManagementDir(), '{0}.e4tz'.format(fn)) - if not os.path.exists(fn): - return - try: - import gzip - except ImportError: - E5MessageBox.critical(self.ui, - self.trUtf8("Read tasks"), - self.trUtf8("""Compressed tasks files not supported.""" - """ The compression library is missing.""")) - return - g = gzip.open(fn, "rb") - f = io.StringIO(g.read().decode("utf-8")) - g.close() - else: - fn = os.path.join(self.getProjectManagementDir(), '{0}.e4t'.format(fn)) - if not os.path.exists(fn): - return - f = open(fn, "r", encoding = "utf-8") - line = f.readline() - dtdLine = f.readline() - f.close() - except EnvironmentError: + fn = os.path.join(self.getProjectManagementDir(), '{0}.e4t'.format(fn)) + if not os.path.exists(fn): + return + f = QFile(fn) + if f.open(QIODevice.ReadOnly): + reader = TasksReader(f, True) + reader.readXML() + else: E5MessageBox.critical(self.ui, self.trUtf8("Read tasks"), self.trUtf8("<p>The tasks file <b>{0}</b> could not be read.</p>")\ .format(fn)) - return - - # now read the file - if line.startswith('<?xml'): - self.__readXMLTasks(fn, dtdLine.startswith("<!DOCTYPE")) - else: - E5MessageBox.critical(self.ui, - self.trUtf8("Read project session"), - self.trUtf8("<p>The tasks file <b>{0}</b> has an unsupported" - " format.</p>")\ - .format(fn)) - - def __readXMLTasks(self, fn, validating): - """ - Private method to read the project tasks data from an XML file. - - @param fn filename of the project tasks file to be read (string) - @param validating flag indicating a validation of the XML file is - requested (boolean) - """ - if fn.lower().endswith("e4tz"): - # work around for a bug in xmlproc - validating = False - - parser = make_parser(validating) - handler = TasksHandler(1) - er = XMLEntityResolver() - eh = XMLErrorHandler() - - parser.setContentHandler(handler) - parser.setEntityResolver(er) - parser.setErrorHandler(eh) - - try: - if fn.lower().endswith("e4tz"): - try: - import gzip - except ImportError: - E5MessageBox.critical(self.ui, - self.trUtf8("Read tasks"), - self.trUtf8("""Compressed tasks files not supported.""" - """ The compression library is missing.""")) - return - g = gzip.open(fn, "rb") - f = io.StringIO(g.read().decode("utf-8")) - g.close() - else: - f = open(fn, "r", encoding = "utf-8") - try: - try: - parser.parse(f) - except UnicodeEncodeError: - f.seek(0) - buf = io.StringIO(f.read()) - parser.parse(buf) - finally: - f.close() - except IOError: - E5MessageBox.critical(self.ui, - self.trUtf8("Read tasks"), - self.trUtf8("<p>The tasks file <b>{0}</b> could not be read.</p>")\ - .format(fn)) - return - except XMLFatalParseError: - pass - - eh.showParseMessages() def __writeTasks(self): """
--- a/UI/UserInterface.py Fri Sep 10 20:03:59 2010 +0200 +++ b/UI/UserInterface.py Sat Sep 11 17:33:02 2010 +0200 @@ -94,7 +94,7 @@ from E5XML.XMLUtilities import make_parser from E5XML.XMLErrorHandler import XMLErrorHandler, XMLFatalParseError from E5XML.XMLEntityResolver import XMLEntityResolver -from E5XML.TasksHandler import TasksHandler +from E5XML.TasksReader import TasksReader from E5XML.TasksWriter import TasksWriter from E5XML.SessionWriter import SessionWriter from E5XML.SessionHandler import SessionHandler @@ -5046,58 +5046,18 @@ """ Private slot to read in the tasks file (.e4t) """ - try: - fn = os.path.join(Utilities.getConfigDir(), "eric5tasks.e4t") - if not os.path.exists(fn): - return - f = open(fn, "r", encoding = "utf-8") - line = f.readline() - dtdLine = f.readline() - f.close() - except IOError: + fn = os.path.join(Utilities.getConfigDir(), "eric5tasks.e4t") + if not os.path.exists(fn): + return + f = QFile(fn) + if f.open(QIODevice.ReadOnly): + reader = TasksReader(f, viewer = self.taskViewer) + reader.readXML() + else: E5MessageBox.critical(self, self.trUtf8("Read tasks"), self.trUtf8("<p>The tasks file <b>{0}</b> could not be read.</p>") .format(fn)) - return - - # now read the file - if line.startswith('<?xml'): - parser = make_parser(dtdLine.startswith("<!DOCTYPE")) - handler = TasksHandler(taskViewer = self.taskViewer) - er = XMLEntityResolver() - eh = XMLErrorHandler() - - parser.setContentHandler(handler) - parser.setEntityResolver(er) - parser.setErrorHandler(eh) - - try: - f = open(fn, "r", encoding = "utf-8") - try: - try: - parser.parse(f) - except UnicodeEncodeError: - f.seek(0) - buf = io.StringIO(f.read()) - parser.parse(buf) - finally: - f.close() - except IOError: - E5MessageBox.critical(self, - self.trUtf8("Read tasks"), - self.trUtf8("<p>The tasks file <b>{0}</b> could not be read.</p>")\ - .format(fn)) - return - except XMLFatalParseError: - pass - - eh.showParseMessages() - else: - E5MessageBox.critical(self, - self.trUtf8("Read tasks"), - self.trUtf8("<p>The tasks file <b>{0}</b> has an unsupported" - " format.</p>").format(fn)) def __writeSession(self): """
--- a/eric5.e4p Fri Sep 10 20:03:59 2010 +0200 +++ b/eric5.e4p Sat Sep 11 17:33:02 2010 +0200 @@ -716,7 +716,6 @@ <Source>E5XML/TemplatesWriter.py</Source> <Source>E5XML/DebuggerPropertiesHandler.py</Source> <Source>E5XML/ShortcutsHandler.py</Source> - <Source>E5XML/TasksHandler.py</Source> <Source>E5XML/Config.py</Source> <Source>E5XML/__init__.py</Source> <Source>E5XML/TasksWriter.py</Source> @@ -821,6 +820,7 @@ <Source>E5XML/XMLStreamWriterBase.py</Source> <Source>E5XML/XMLStreamReaderBase.py</Source> <Source>E5XML/PluginRepositoryReader.py</Source> + <Source>E5XML/TasksReader.py</Source> </Sources> <Forms> <Form>PyUnit/UnittestDialog.ui</Form>