src/eric7/PipInterface/PipFreezeDialog.py

branch
eric7
changeset 9243
73c7abe824f3
parent 9221
bf71ee032bb4
child 9413
80c06d472826
--- 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)
 

eric ide

mercurial