PipxInterface/PipxProcess.py

Sun, 29 Dec 2024 14:56:04 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 29 Dec 2024 14:56:04 +0100
changeset 121
8deb7d8d9b86
parent 104
45c88e73e3dd
permissions
-rw-r--r--

Prepared a new release.

78
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
104
45c88e73e3dd Updated copyright for 2025.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 83
diff changeset
3 # Copyright (c) 2024 - 2025 Detlev Offenbach <detlev@die-offenbachs.de>
78
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 """
81
b6280afecc83 Added code to kill running async processes when shutting down the eric IDE.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 78
diff changeset
7 Module implementing a QProcess derived class with a timeout and convenience signals.
78
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 from PyQt6.QtCore import QProcess, QTimer, pyqtSignal, pyqtSlot
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 class PipxProcess(QProcess):
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 """
81
b6280afecc83 Added code to kill running async processes when shutting down the eric IDE.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 78
diff changeset
15 Class implementing a QProcess derived class with a timeout and convenience signals
78
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 succeeded and failed.
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 @signal failed() emitted to indicate a process failure
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 @signal succeeded() emitted to indicate that the process finished successfully
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 @signal timeout() emitted to indicate the expiry of the configured timeout value
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 failed = pyqtSignal()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 succeeded = pyqtSignal()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 timeout = pyqtSignal()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 def __init__(self, timeout=30000, parent=None):
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 Constructor
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 @param timeout timeout value in milliseconds. If the process does not finish
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 within this interval, it is killed (defaults to 30000)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 @type int (optional)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 @param parent reference to the parent object (defaults to None)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 @type QObject (optional)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 super().__init__(parent=parent)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 self.started.connect(self.__started)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 self.finished.connect(self.__finished)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 self.__timeoutTimer = QTimer(self)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 self.__timeoutTimer.setInterval(timeout)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 self.__timeoutTimer.timeout.connect(self.__timeout)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 self.__timedOut = False
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 def timedOut(self):
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 Public method to test, if the process timed out.
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 @return flag indicating a timeout
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 @rtype bool
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 return self.__timedOut
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 def timeoutInterval(self):
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 Public method to get the process timeout interval.
83
d841c572a465 Added the capability to perform a periodic check for outdated packages or packages with outdated dependencies.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 81
diff changeset
60
78
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 @return process timeout interval in milliseconds
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 @rtype int
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 return self.__timeoutTimer.interval()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 @pyqtSlot()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 def __timeout(self):
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 Private slot to handle the timer interval exoiration.
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 self.__timeoutTimer.stop()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 self.__timedOut = True
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 self.kill()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 self.timeout.emit()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 @pyqtSlot()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 def __started(self):
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 Private slot handling the process start.
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 self.__timedOut = False
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 self.__timeoutTimer.start()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 @pyqtSlot(int, QProcess.ExitStatus)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 def __finished(self, exitCode, exitStatus):
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 Private slot handling the end of the process.
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 @param exitCode exit code of the process (0 = success)
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 @type int
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 @param exitStatus exit status of the process
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 @type QProcess.ExitStatus
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 """
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 self.__timeoutTimer.stop()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 if exitStatus == QProcess.ExitStatus.CrashExit or exitCode != 0:
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 self.failed.emit()
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 else:
5efcdee9c170 Changed the long running "outdated" actions to use an asynchronous process with timeout.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 self.succeeded.emit()

eric ide

mercurial