diff -r 2b015db9761a -r ba20efe10336 src/eric7/DataViews/PyCoverageDialog.py --- a/src/eric7/DataViews/PyCoverageDialog.py Sun Jun 02 09:51:47 2024 +0200 +++ b/src/eric7/DataViews/PyCoverageDialog.py Wed Jul 03 09:20:41 2024 +0200 @@ -25,6 +25,9 @@ from eric7.EricWidgets import EricMessageBox from eric7.EricWidgets.EricApplication import ericApp +from eric7.RemoteServerInterface.EricServerCoverageInterface import ( + EricServerCoverageError, +) from eric7.SystemUtilities import FileSystemUtilities from .Ui_PyCoverageDialog import Ui_PyCoverageDialog @@ -57,7 +60,6 @@ self.resultList.headerItem().setText(self.resultList.columnCount(), "") self.cancelled = False - self.path = "." self.reload = False self.excludeList = ["# *pragma[: ]*[nN][oO] *[cC][oO][vV][eE][rR]"] @@ -78,6 +80,14 @@ self.resultList.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu) self.resultList.customContextMenuRequested.connect(self.__showContextMenu) + # eric-ide server interfaces + self.__serverCoverageInterface = ( + ericApp().getObject("EricServer").getServiceInterface("Coverage") + ) + self.__remotefsInterface = ( + ericApp().getObject("EricServer").getServiceInterface("FileSystem") + ) + def __format_lines(self, lines): """ Private method to format a list of integers into string by coalescing @@ -143,7 +153,7 @@ @param coverage percent of coverage @type int @param excluded list of excluded lines - @type str + @type list of int @param missing list of lines without coverage @type str """ @@ -154,7 +164,7 @@ str(statements), str(executed), "{0:.0f}%".format(coverage), - excluded, + excluded and self.__format_lines(excluded) or "", missing, ], ) @@ -194,18 +204,16 @@ if isinstance(fn, list): files = fn - self.path = os.path.dirname(cfn) - elif os.path.isdir(fn): + elif FileSystemUtilities.isRemoteFileName( + self.cfn + ) and self.__remotefsInterface.isdir(fn): + files = self.__remotefsInterface.direntries(fn, True, "*.py", False) + elif FileSystemUtilities.isPlainFileName(self.cfn) and os.path.isdir(fn): files = FileSystemUtilities.direntries(fn, True, "*.py", False) - self.path = fn else: files = [fn] - self.path = os.path.dirname(cfn) files.sort() - cover = Coverage(data_file=self.cfn) - cover.load() - # set the exclude pattern self.excludeCombo.clear() self.excludeCombo.addItems(self.excludeList) @@ -217,7 +225,23 @@ total_executed = 0 total_exceptions = 0 - cover.exclude(self.excludeList[0]) + if FileSystemUtilities.isRemoteFileName(self.cfn): + ok, error = self.__serverCoverageInterface.loadCoverageData( + self.cfn, self.excludeList[0] + ) + if not ok: + EricMessageBox.critical( + self, + self.tr("Load Coverage Data"), + self.tr( + "<p>The coverage data could not be loaded from file" + " <b>{0}</b>.</p><p>Reason: {1}</p>" + ).format(self.cfn, error), + ) + else: + cover = Coverage(data_file=self.cfn) + cover.load() + cover.exclude(self.excludeList[0]) try: # disable updates of the list for speed @@ -231,18 +255,28 @@ return try: - statements, excluded, missing, readable = cover.analysis2(file)[1:] - readableEx = excluded and self.__format_lines(excluded) or "" + if FileSystemUtilities.isRemoteFileName(self.cfn): + ( + file, + statements, + excluded, + missing, + readable, + ) = self.__serverCoverageInterface.analyzeFile(file) + else: + statements, excluded, missing, readable = cover.analysis2(file)[ + 1: + ] n = len(statements) m = n - len(missing) pc = 100.0 * m / n if n > 0 else 100.0 self.__createResultItem( - file, str(n), str(m), pc, readableEx, readable + file, str(n), str(m), pc, excluded, readable ) total_statements += n total_executed += m - except CoverageException: + except (CoverageException, EricServerCoverageError): total_exceptions += 1 self.checkProgress.setValue(progress)