--- a/src/eric7/PipInterface/PipFreezeDialog.py Sun Jul 17 17:46:51 2022 +0200 +++ b/src/eric7/PipInterface/PipFreezeDialog.py Sun Jul 17 18:47:23 2022 +0200 @@ -7,6 +7,7 @@ Module implementing a dialog to generate a requirements file. """ +import enum import os from PyQt6.QtCore import pyqtSlot, Qt @@ -22,24 +23,45 @@ import Utilities +class PipFreezeDialogModes(enum.Enum): + """ + Class defining the various dialog modes. + """ + + Constraints = 1 + Requirements = 2 + + class PipFreezeDialog(QDialog, Ui_PipFreezeDialog): """ Class implementing a dialog to generate a requirements file. """ - def __init__(self, pip, parent=None): + def __init__(self, pip, mode=PipFreezeDialogModes.Requirements, parent=None): """ Constructor @param pip reference to the master object @type Pip - @param parent reference to the parent widget - @type QWidget + @param mode dialog mod (defaults to PipFreezeDialogModes.Requirements) + @type PipFreezeDialogModes (optional) + @param parent reference to the parent widget (defaults to None + @type QWidget (optional) """ super().__init__(parent) self.setupUi(self) self.setWindowFlags(Qt.WindowType.Window) + self.__dialogMode = mode + if mode is PipFreezeDialogModes.Constraints: + self.constraintsCheckBox.setChecked(False) + self.constraintsCheckBox.setEnabled(False) + + self.setWindowTitle(self.tr("Generate Constraints")) + + elif mode is PipFreezeDialogModes.Requirements: + self.setWindowTitle(self.tr("Generate Requirements")) + self.__refreshButton = self.buttonBox.addButton( self.tr("&Refresh"), QDialogButtonBox.ButtonRole.ActionRole ) @@ -141,11 +163,16 @@ self.__requirementsAvailable = False self.__environmentName = venvName - fileName = ( - Utilities.toNativeSeparators(self.requirementsFilePicker.text()) - if self.requirementsFilePicker.text() - else "" - ) + if not bool(self.requirementsFilePicker.text()): + self.requirementsFilePicker.setText( + "constraints.txt" + if self.__dialogMode is PipFreezeDialogModes.Constraints + else "requirements.txt" + ) + + fileName = Utilities.toNativeSeparators(self.requirementsFilePicker.text()) + if fileName and not os.path.isabs(fileName): + fileName = "" with EricOverrideCursor(): specifiers = self.__pip.getFrozenPackages( @@ -172,7 +199,9 @@ Private method to set the state of the various buttons. """ self.saveButton.setEnabled( - self.__requirementsAvailable and bool(self.requirementsFilePicker.text()) + self.__requirementsAvailable + and bool(self.requirementsFilePicker.text()) + and os.path.isabs(self.requirementsFilePicker.text()) ) self.saveToButton.setEnabled(self.__requirementsAvailable) self.copyButton.setEnabled(self.__requirementsAvailable) @@ -206,9 +235,12 @@ if not ok: return + txt = self.requirementsEdit.toPlainText() + if self.constraintsCheckBox.isChecked(): + txt = f"--constraint constraints.txt\n{txt}" try: with open(fileName, "w") as f: - f.write(self.requirementsEdit.toPlainText()) + f.write(txt) except OSError as err: EricMessageBox.critical( self, @@ -254,6 +286,8 @@ Private slot to copy the requirements text to the clipboard. """ txt = self.requirementsEdit.toPlainText() + if self.constraintsCheckBox.isChecked(): + txt = f"--constraint constraints.txt\n{txt}" cb = QApplication.clipboard() cb.setText(txt)