diff -r c31a4f756a04 -r 22e1d0f69668 ProjectFlask/RunServerDialog.py --- a/ProjectFlask/RunServerDialog.py Thu Dec 30 12:13:22 2021 +0100 +++ b/ProjectFlask/RunServerDialog.py Wed Sep 21 16:30:15 2022 +0200 @@ -29,10 +29,11 @@ """ Class implementing a dialog to run the Flask server. """ + def __init__(self, plugin, project, parent=None): """ Constructor - + @param plugin reference to the plug-in object @type PluginProjectFlask @param project reference to the project object @@ -42,30 +43,26 @@ """ super().__init__(parent) self.setupUi(self) - + self.__plugin = plugin self.__project = project - - self.__serverOptions = { - "development": False - } - + + self.__serverOptions = {"development": False} + self.__process = None self.__serverUrl = "" - + self.__ansiRe = re.compile(r"(\x1b\[\d+m)") - + self.__urlRe = re.compile(r" \* Running on ([^(]+) \(.*") - - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setEnabled(True) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setDefault(True) - + + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True) + self.__defaultTextFormat = self.outputEdit.currentCharFormat() - + self.__initActionsMenu() - + def __initActionsMenu(self): """ Private method to populate the actions button menu. @@ -74,39 +71,35 @@ self.__actionsMenu.setTearOffEnabled(True) self.__actionsMenu.setToolTipsVisible(True) self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu) - + # re-start server - self.__actionsMenu.addAction( - self.tr("Re-start Server"), - self.__restartServer) + self.__actionsMenu.addAction(self.tr("Re-start Server"), self.__restartServer) self.__restartModeAct = self.__actionsMenu.addAction( - self.tr("Re-start Server"), - self.__restartServerDifferentMode) + self.tr("Re-start Server"), self.__restartServerDifferentMode + ) self.__actionsMenu.addSeparator() # re-start server with options self.__actionsMenu.addAction( - self.tr("Re-start Server with Options"), - self.__restartServerWithOptions) - + self.tr("Re-start Server with Options"), self.__restartServerWithOptions + ) + self.menuButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton")) self.menuButton.setMenu(self.__actionsMenu) - + @pyqtSlot() def __showActionsMenu(self): """ Private slot handling the actions menu about to be shown. """ if self.__serverOptions["development"]: - self.__restartModeAct.setText( - self.tr("Re-start Server (Production Mode)")) + self.__restartModeAct.setText(self.tr("Re-start Server (Production Mode)")) else: - self.__restartModeAct.setText( - self.tr("Re-start Server (Development Mode)")) - + self.__restartModeAct.setText(self.tr("Re-start Server (Development Mode)")) + def startServer(self, development=False, askForOptions=False): """ Public method to start the Flask server process. - + @param development flag indicating development mode @type bool @param askForOptions flag indicating to ask for server start options @@ -116,30 +109,32 @@ @rtype bool """ self.__serverOptions["development"] = development - + if askForOptions: dlg = ServerStartOptionsDialog(self.__serverOptions) if dlg.exec() != QDialog.DialogCode.Accepted: return False - + self.__serverOptions.update(dlg.getDataDict()) - + workdir, env = self.__project.prepareRuntimeEnvironment( - development=self.__serverOptions["development"]) + development=self.__serverOptions["development"] + ) if env is not None: command = self.__project.getFlaskCommand() - + self.__process = QProcess() self.__process.setProcessEnvironment(env) self.__process.setWorkingDirectory(workdir) self.__process.setProcessChannelMode( - QProcess.ProcessChannelMode.MergedChannels) - + QProcess.ProcessChannelMode.MergedChannels + ) + self.__process.readyReadStandardOutput.connect(self.__readStdOut) self.__process.finished.connect(self.__processFinished) - + self.outputEdit.clear() - + args = ["run"] if "host" in self.__serverOptions and self.__serverOptions["host"]: args += ["--host", self.__serverOptions["host"]] @@ -149,36 +144,39 @@ args += ["--cert", self.__serverOptions["cert"]] if "key" in self.__serverOptions and self.__serverOptions["key"]: args += ["--key", self.__serverOptions["key"]] - + self.__process.start(command, args) ok = self.__process.waitForStarted(10000) if not ok: EricMessageBox.critical( None, self.tr("Run Flask Server"), - self.tr("""The Flask server process could not be""" - """ started.""")) + self.tr( + """The Flask server process could not be""" """ started.""" + ), + ) else: - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setEnabled(False) + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled( + False + ) self.stopServerButton.setEnabled(True) self.stopServerButton.setDefault(True) self.startBrowserButton.setEnabled(True) else: ok = False - + return ok - + def closeEvent(self, evt): """ Protected method handling a close event. - + @param evt reference to the close event @type QCloseEvent """ self.on_stopServerButton_clicked() evt.accept() - + @pyqtSlot() def __readStdOut(self): """ @@ -190,56 +188,53 @@ urlMatch = self.__urlRe.search(out) if urlMatch: self.__serverUrl = urlMatch.group(1) - + for txt in self.__ansiRe.split(out): if txt.startswith("\x1b["): - color = int(txt[2:-1]) # strip off ANSI command parts + color = int(txt[2:-1]) # strip off ANSI command parts if color == 0: - self.outputEdit.setCurrentCharFormat( - self.__defaultTextFormat) + self.outputEdit.setCurrentCharFormat(self.__defaultTextFormat) elif 30 <= color <= 37: brush = AnsiTools.getColor( - self.__plugin.getPreferences("AnsiColorScheme"), - color - 30) + self.__plugin.getPreferences("AnsiColorScheme"), color - 30 + ) if brush is not None: - charFormat = QTextCharFormat( - self.__defaultTextFormat) + charFormat = QTextCharFormat(self.__defaultTextFormat) charFormat.setForeground(brush) self.outputEdit.setCurrentCharFormat(charFormat) else: self.outputEdit.insertPlainText(txt) - + @pyqtSlot() def __processFinished(self): """ Private slot handling the finishing of the server process. """ if ( - self.__process is not None and - self.__process.state() != QProcess.ProcessState.NotRunning + self.__process is not None + and self.__process.state() != QProcess.ProcessState.NotRunning ): self.__process.terminate() QTimer.singleShot(2000, self.__process.kill) self.__process.waitForFinished(3000) - + self.__process = None - + self.startBrowserButton.setEnabled(False) self.stopServerButton.setEnabled(False) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setEnabled(True) - self.buttonBox.button( - QDialogButtonBox.StandardButton.Close).setDefault(True) + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True) + self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True) self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus( - Qt.FocusReason.OtherFocusReason) - + Qt.FocusReason.OtherFocusReason + ) + @pyqtSlot() def on_stopServerButton_clicked(self): """ Private slot to stop the running server. """ self.__processFinished() - + @pyqtSlot() def on_startBrowserButton_clicked(self): """ @@ -247,11 +242,11 @@ """ if self.__plugin.getPreferences("UseExternalBrowser"): import webbrowser + webbrowser.open(self.__serverUrl) else: - ericApp().getObject("UserInterface").launchHelpViewer( - self.__serverUrl) - + ericApp().getObject("UserInterface").launchHelpViewer(self.__serverUrl) + @pyqtSlot() def __restartServer(self): """ @@ -259,10 +254,10 @@ """ # step 1: stop the current server self.on_stopServerButton_clicked() - + # step 2: start a new server self.startServer(development=self.__serverOptions["development"]) - + @pyqtSlot() def __restartServerDifferentMode(self): """ @@ -270,10 +265,10 @@ """ # step 1: stop the current server self.on_stopServerButton_clicked() - + # step 2: start a new server self.startServer(development=not self.__serverOptions["development"]) - + @pyqtSlot() def __restartServerWithOptions(self): """ @@ -281,7 +276,8 @@ """ # step 1: stop the current server self.on_stopServerButton_clicked() - + # step 2: start a new server - self.startServer(development=self.__serverOptions["development"], - askForOptions=True) + self.startServer( + development=self.__serverOptions["development"], askForOptions=True + )