src/eric7/VirtualEnv/VirtualenvUpgradeConfigurationDialog.py

Thu, 07 Jul 2022 11:23:56 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 07 Jul 2022 11:23:56 +0200
branch
eric7
changeset 9209
b99e7fd55fd3
parent 9144
eric7/VirtualEnv/VirtualenvUpgradeConfigurationDialog.py@135240382a3e
child 9221
bf71ee032bb4
permissions
-rw-r--r--

Reorganized the project structure to use the source layout in order to support up-to-date build systems with "pyproject.toml".

9144
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de>
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 Module implementing a dialog to enter the virtual environment upgrade
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 parameters.
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 import re
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 from PyQt6.QtCore import pyqtSlot, QProcess, QTimer
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 from EricWidgets.EricPathPicker import EricPathPickerModes
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 from .Ui_VirtualenvUpgradeConfigurationDialog import (
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 Ui_VirtualenvUpgradeConfigurationDialog
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 )
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 import Globals
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 import Preferences
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 import Utilities
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 class VirtualenvUpgradeConfigurationDialog(
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 QDialog, Ui_VirtualenvUpgradeConfigurationDialog
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 ):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 Class implementing a dialog to enter the virtual environment upgrade
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 parameters.
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 def __init__(self, envName, envPath, parent=None):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 Constructor
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 @param envName name of the environment to be upgraded
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 @type str
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 @param envPath directory of the environment to be upgraded
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 @type str
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 @param parent reference to the parent widget (defaults to None)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 @type QWidget (optional)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 super().__init__(parent)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 self.setupUi(self)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 self.pythonExecPicker.setWindowTitle(
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 self.tr("Python Interpreter"))
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 self.pythonExecPicker.setDefaultDirectory(
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 Globals.getPythonExecutable())
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 self.envNameLabel.setText(envName)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.envDirectoryLabel.setText(envPath)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 self.__versionRe = re.compile(r""".*?(\d+\.\d+\.\d+).*""")
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 self.upgradePythonCheckBox.toggled.connect(self.__updateOkButton)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 self.upgradeDepsCheckBox.toggled.connect(self.__updateOkButton)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 self.pythonExecPicker.textChanged.connect(
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 self.__updateUpgradeDepsCheckBox)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 self.__updateUpgradeDepsCheckBox()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 msh = self.minimumSizeHint()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 self.resize(max(self.width(), msh.width()), msh.height())
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 def __getPyvenvVersion(self):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 Private method to determine the version of the venv module.
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 @return tuple containing the venv modules version
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 @rtype tuple of (int, int, int)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 calls = []
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 if self.pythonExecPicker.text():
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 calls.append((self.pythonExecPicker.text(),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 ["-m", "venv"]))
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 calls.extend([
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 (Globals.getPythonExecutable(), ["-m", "venv"]),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 ("python3", ["-m", "venv"]),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 ("python", ["-m", "venv"]),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 ])
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 proc = QProcess()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 for prog, args in calls:
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 proc.start(prog, args)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 if not proc.waitForStarted(5000):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 # try next entry
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 continue
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 if not proc.waitForFinished(5000):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 # process hangs, kill it and try next entry
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 QTimer.singleShot(2000, proc.kill)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 proc.waitForFinished(3000)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 continue
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 if proc.exitCode() not in [0, 2]:
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 # returned with error code, try next
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 continue
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 proc.start(prog, ["--version"])
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 proc.waitForFinished(5000)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 output = str(proc.readAllStandardOutput(),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 Preferences.getSystem("IOEncoding"),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 'replace').strip()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 match = re.match(self.__versionRe, output)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 if match:
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 return Globals.versionToTuple(match.group(1))
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 return (0, 0, 0) # dummy version tuple
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 @pyqtSlot()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 def __updateUpgradeDepsCheckBox(self):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 Private slot to set the enabled state of the button depending
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 on the version of the given Python interpreter.
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 pyvenvVersion = self.__getPyvenvVersion()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 if pyvenvVersion >= (3, 9, 0):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 self.upgradeDepsCheckBox.setEnabled(True)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 else:
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 self.upgradeDepsCheckBox.setEnabled(False)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 self.upgradeDepsCheckBox.setChecked(False)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 @pyqtSlot()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 def __updateOkButton(self):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 Private slot to set the enabled state of the OK button.
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 self.upgradePythonCheckBox.isChecked() or
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 self.upgradeDepsCheckBox.isChecked()
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 )
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 def getData(self):
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 Public method to retrieve the dialog data.
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 @return tuple containing the selected python executable, the list of
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 arguments and a flag indicating to write a log file
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 @rtype tuple of (str, list of str, bool)
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 """
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 args = ["-m", "venv"]
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 if self.upgradePythonCheckBox.isChecked():
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 args.append("--upgrade")
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 if self.upgradeDepsCheckBox.isChecked():
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 args.append("--upgrade-deps")
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 args.append(self.envDirectoryLabel.text())
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 return (
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 Utilities.toNativeSeparators(self.pythonExecPicker.text()),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 args,
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 self.logCheckBox.isChecked(),
135240382a3e Virtual Environments
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 )

eric ide

mercurial