Wed, 16 Nov 2022 10:53:40 +0100
Made the project pdata structure private and added getter and setter methods.
# -*- coding: utf-8 -*- # Copyright (c) 2010 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing a class for reading an XML project file. """ from eric7 import Utilities from .Config import projectFileFormatVersion from .XMLStreamReaderBase import XMLStreamReaderBase class ProjectReader(XMLStreamReaderBase): """ Class for reading an XML project file. """ supportedVersions = ["4.6", "5.0", "5.1", "6.0", "6.1", "6.2", "6.3", "6.4", "6.5"] def __init__(self, device, project): """ Constructor @param device reference to the I/O device to read from (QIODevice) @param project Reference to the project object to store the information into. """ XMLStreamReaderBase.__init__(self, device) self.project = project 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() == "Project": self.version = self.attribute("version", projectFileFormatVersion) if self.version not in self.supportedVersions: self.raiseUnsupportedFormatVersion(self.version) elif self.name() == "Language": self.project.setProjectData( self.readElementText(), dataKey="SPELLLANGUAGE" ) elif self.name() == "ProjectWordList": self.project.setProjectData( Utilities.toNativeSeparators(self.readElementText()), dataKey="SPELLWORDS", ) elif self.name() == "ProjectExcludeList": self.project.setProjectData( Utilities.toNativeSeparators(self.readElementText()), dataKey="SPELLEXCLUDES", ) elif self.name() == "Hash": self.project.setProjectData(self.readElementText(), dataKey="HASH") elif self.name() == "ProgLanguage": self.project.setProjectData( int(self.attribute("mixed", "0")), dataKey="MIXEDLANGUAGE", ) self.project.setProjectData( self.readElementText(), dataKey="PROGLANGUAGE" ) if self.project.getProjectData(dataKey="PROGLANGUAGE") == "Python": # convert Python to the more specific Python3 self.project.setProjectData("Python3", dataKey="PROGLANGUAGE") elif self.name() == "ProjectType": self.project.setProjectData( self.readElementText(), dataKey="PROJECTTYPE" ) elif self.name() == "Description": self.project.setProjectData( self.readElementText(), dataKey="DESCRIPTION" ) elif self.name() == "Version": self.project.setProjectData( self.readElementText(), dataKey="VERSION" ) elif self.name() == "Author": self.project.setProjectData( self.readElementText(), dataKey="AUTHOR" ) elif self.name() == "Email": self.project.setProjectData(self.readElementText(), dataKey="EMAIL") elif self.name() == "TranslationPattern": self.project.setProjectData( Utilities.toNativeSeparators(self.readElementText()), dataKey="TRANSLATIONPATTERN", ) elif self.name() == "TranslationsBinPath": self.project.setProjectData( Utilities.toNativeSeparators(self.readElementText()), dataKey="TRANSLATIONSBINPATH", ) elif self.name() == "Eol": self.project.setProjectData( int(self.attribute("index", "0")), dataKey="EOL" ) elif self.name() == "Sources": self.__readFiles("Sources", "Source", "SOURCES") elif self.name() == "Forms": self.__readFiles("Forms", "Form", "FORMS") elif self.name() == "Translations": self.__readFiles("Translations", "Translation", "TRANSLATIONS") elif self.name() == "TranslationExceptions": self.__readFiles( "TranslationExceptions", "TranslationException", "TRANSLATIONEXCEPTIONS", ) elif self.name() == "Resources": self.__readFiles("Resources", "Resource", "RESOURCES") elif self.name() == "Interfaces": self.__readFiles("Interfaces", "Interface", "INTERFACES") elif self.name() == "Protocols": self.__readFiles("Protocols", "Protocol", "PROTOCOLS") elif self.name() == "Others": self.__readFiles("Others", "Other", "OTHERS") elif self.name() == "MainScript": self.project.setProjectData( Utilities.toNativeSeparators(self.readElementText()), dataKey="MAINSCRIPT", ) elif self.name() == "Vcs": self.__readVcs() elif self.name() == "FiletypeAssociations": self.__readFiletypeAssociations() elif self.name() == "LexerAssociations": self.__readLexerAssociations() elif self.name() == "Make": self.__readBasicDataField("Make", "MakeParameters", "MAKEPARAMS") elif self.name() == "IdlCompiler": self.__readBasicDataField( "IdlCompiler", "IdlCompilerParameters", "IDLPARAMS" ) elif self.name() == "UicCompiler": self.__readBasicDataField( "UicCompiler", "UicCompilerParameters", "UICPARAMS" ) elif self.name() == "RccCompiler": self.__readBasicDataField( "RccCompiler", "RccCompilerParameters", "RCCPARAMS" ) elif self.name() == "DocstringStyle": self.project.setProjectData( self.readElementText(), dataKey="DOCSTRING" ) elif self.name() == "ProjectTypeSpecific": self.__readBasicDataField( "ProjectTypeSpecific", "ProjectTypeSpecificData", "PROJECTTYPESPECIFICDATA", ) elif self.name() == "Documentation": self.__readBasicDataField( "Documentation", "DocumentationParams", "DOCUMENTATIONPARMS" ) elif self.name() == "Packagers": self.__readBasicDataField( "Packagers", "PackagersParams", "PACKAGERSPARMS" ) elif self.name() == "Checkers": self.__readBasicDataField( "Checkers", "CheckersParams", "CHECKERSPARMS" ) elif self.name() == "OtherTools": self.__readBasicDataField( "OtherTools", "OtherToolsParams", "OTHERTOOLSPARMS" ) else: self.raiseUnexpectedStartTag(self.name()) self.showErrorMessage() def __readFiles(self, tag, listTag, dataKey): """ Private method to read a list of files. @param tag name of the list tag (string) @param listTag name of the list element tag (string) @param dataKey key of the project data element (string) """ while not self.atEnd(): self.readNext() if self.isEndElement() and self.name() == tag: break if self.isStartElement(): if self.name() == listTag: fileList = self.project.getProjectData(dataKey=dataKey) fileList.append( Utilities.toNativeSeparators(self.readElementText()) ) self.project.setProjectData(fileList, dataKey=dataKey) else: self.raiseUnexpectedStartTag(self.name()) def __readBasicDataField(self, tag, dataTag, dataKey): """ Private method to read a list of files. @param tag name of the list tag (string) @param dataTag name of the data tag (string) @param dataKey key of the project data element (string) """ while not self.atEnd(): self.readNext() if self.isEndElement() and self.name() == tag: break if self.isStartElement(): if self.name() == dataTag: self.project.setProjectData(self._readBasics(), dataKey=dataKey) else: self.raiseUnexpectedStartTag(self.name()) def __readVcs(self): """ Private method to read the VCS info. """ while not self.atEnd(): self.readNext() if self.isEndElement() and self.name() == "Vcs": break if self.isStartElement(): if self.name() == "VcsType": self.project.setProjectData(self.readElementText(), dataKey="VCS") elif self.name() == "VcsOptions": self.project.setProjectData( self._readBasics(), dataKey="VCSOPTIONS" ) elif self.name() == "VcsOtherData": self.project.setProjectData( self._readBasics(), dataKey="VCSOTHERDATA" ) else: self.raiseUnexpectedStartTag(self.name()) def __readFiletypeAssociations(self): """ Private method to read the file type associations. """ while not self.atEnd(): self.readNext() if self.isEndElement() and self.name() == "FiletypeAssociations": break if self.isStartElement(): if self.name() == "FiletypeAssociation": pattern = self.attribute("pattern", "") filetype = self.attribute("type", "OTHERS") if pattern: fileTypes = self.project.getProjectData(dataKey="FILETYPES") fileTypes[pattern] = filetype self.project.setProjectData(fileTypes, dataKey="FILETYPES") else: self.raiseUnexpectedStartTag(self.name()) def __readLexerAssociations(self): """ Private method to read the lexer associations. """ while not self.atEnd(): self.readNext() if self.isEndElement() and self.name() == "LexerAssociations": break if self.isStartElement(): if self.name() == "LexerAssociation": pattern = self.attribute("pattern", "") lexer = self.attribute("lexer") if pattern: assocs = self.project.getProjectData(dataKey="LEXERASSOCS") assocs[pattern] = lexer self.project.setProjectData(assocs, dataKey="LEXERASSOCS") else: self.raiseUnexpectedStartTag(self.name())