src/eric7/EricXML/MultiProjectReader.py

Sat, 23 Dec 2023 15:48:12 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 23 Dec 2023 15:48:12 +0100
branch
eric7
changeset 10439
21c28b0f9e41
parent 10423
299802979277
child 10503
6a37b6ac3928
permissions
-rw-r--r--

Updated copyright for 2024.

# -*- coding: utf-8 -*-

# Copyright (c) 2010 - 2024 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a class for reading an XML multi project file.
"""

import os

from PyQt6.QtCore import QUuid

from eric7.MultiProject.MultiProjectProjectMeta import MultiProjectProjectMeta
from eric7.SystemUtilities import FileSystemUtilities

from .Config import multiProjectFileFormatVersion
from .XMLStreamReaderBase import XMLStreamReaderBase


class MultiProjectReader(XMLStreamReaderBase):
    """
    Class for reading an XML multi project file.
    """

    supportedVersions = ["4.2", "5.0", "5.1"]

    def __init__(self, device, multiProject):
        """
        Constructor

        @param device reference to the I/O device to read from
        @type QIODevice
        @param multiProject Reference to the multi project object to store the
            information into.
        @type MultiProject
        """
        XMLStreamReaderBase.__init__(self, device)

        self.multiProject = multiProject
        self.path = os.path.dirname(device.fileName())

        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() == "MultiProject":
                    self.version = self.attribute(
                        "version", multiProjectFileFormatVersion
                    )
                    if self.version not in self.supportedVersions:
                        self.raiseUnsupportedFormatVersion(self.version)
                elif self.name() == "Description":
                    self.multiProject.description = self.readElementText()
                elif self.name() == "Projects":
                    self.__readProjects()
                else:
                    self.raiseUnexpectedStartTag(self.name())

        self.showErrorMessage()

    def __readProjects(self):
        """
        Private method to read the project infos.
        """
        while not self.atEnd():
            self.readNext()
            if self.isEndElement() and self.name() == "Projects":
                break

            if self.isStartElement():
                if self.name() == "Project":
                    self.__readProject()
                else:
                    self.raiseUnexpectedStartTag(self.name())

    def __readProject(self):
        """
        Private method to read the project info.
        """
        uid = self.attribute("uid", "")

        project = MultiProjectProjectMeta(
            name="",
            file="",
            uid=uid if uid else QUuid.createUuid().toString(),
            master=self.toBool(self.attribute("isMaster", "False")),
        )

        while not self.atEnd():
            self.readNext()
            if self.isEndElement() and self.name() == "Project":
                self.multiProject.addProject(project)
                break

            if self.isStartElement():
                if self.name() == "ProjectName":
                    project.name = self.readElementText()
                elif self.name() == "ProjectFile":
                    project.file = FileSystemUtilities.absoluteUniversalPath(
                        self.readElementText(), self.path
                    )
                elif self.name() == "ProjectDescription":
                    project.description = self.readElementText()
                elif self.name() == "ProjectCategory":
                    project.category = self.readElementText()
                else:
                    self.raiseUnexpectedStartTag(self.name())

eric ide

mercurial