9453
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
1
|
# -*- coding: utf-8 -*- |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
2
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
3
|
# Copyright (c) 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
4
|
# |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
5
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
6
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
7
|
Module implementing a dialog showing the isort code formatting progress and the results. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
8
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
9
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
10
|
import copy |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
11
|
import io |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
12
|
import multiprocessing |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
13
|
import pathlib |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
14
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
15
|
from dataclasses import dataclass |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
16
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
17
|
from isort.settings import Config |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
18
|
from isort.api import check_file, sort_file |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
19
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
20
|
from PyQt6.QtCore import pyqtSlot, Qt, QCoreApplication |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
21
|
from PyQt6.QtWidgets import ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
22
|
QAbstractButton, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
23
|
QDialog, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
24
|
QDialogButtonBox, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
25
|
QHeaderView, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
26
|
QTreeWidgetItem, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
27
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
28
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
29
|
from eric7 import Preferences |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
30
|
from eric7.EricWidgets import EricMessageBox |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
31
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
32
|
from .FormattingDiffWidget import FormattingDiffWidget |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
33
|
from .IsortFormattingAction import IsortFormattingAction |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
34
|
from .IsortUtilities import suppressStderr |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
35
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
36
|
from .Ui_IsortFormattingDialog import Ui_IsortFormattingDialog |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
37
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
38
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
39
|
class IsortFormattingDialog(QDialog, Ui_IsortFormattingDialog): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
40
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
41
|
Class implementing a dialog showing the isort code formatting progress and the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
42
|
results. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
43
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
44
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
45
|
DataTypeRole = Qt.ItemDataRole.UserRole |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
46
|
DataRole = Qt.ItemDataRole.UserRole + 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
47
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
48
|
StatusColumn = 0 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
49
|
FileNameColumn = 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
50
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
51
|
def __init__( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
52
|
self, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
53
|
configuration, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
54
|
filesList, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
55
|
project=None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
56
|
action=IsortFormattingAction.Sort, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
57
|
parent=None, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
58
|
): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
59
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
60
|
Constructor |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
61
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
62
|
@param configuration dictionary containing the configuration parameters |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
63
|
@type dict |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
64
|
@param filesList list of absolute file paths to be processed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
65
|
@type list of str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
66
|
@param project reference to the project object (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
67
|
@type Project (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
68
|
@param action action to be performed (defaults to IsortFormattingAction.Sort) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
69
|
@type IsortFormattingAction (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
70
|
@param parent reference to the parent widget (defaults to None) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
71
|
@type QWidget (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
72
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
73
|
super().__init__(parent) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
74
|
self.setupUi(self) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
75
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
76
|
self.progressBar.setMaximum(len(filesList)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
77
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
78
|
self.resultsList.header().setSortIndicator(1, Qt.SortOrder.AscendingOrder) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
79
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
80
|
self.__config = copy.deepcopy(configuration) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
81
|
self.__config["quiet"] = True # we don't want extra output |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
82
|
self.__config["overwrite_in_place"] = True # we want to overwrite the files |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
83
|
if "config_source" in self.__config: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
84
|
del self.__config["config_source"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
85
|
self.__isortConfig = Config(**self.__config) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
86
|
self.__config["__action__"] = action # needed by the workers |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
87
|
self.__project = project |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
88
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
89
|
self.__filesList = filesList[:] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
90
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
91
|
self.__diffDialog = None |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
92
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
93
|
self.__allFilter = self.tr("<all>") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
94
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
95
|
self.__sortImportsButton = self.buttonBox.addButton( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
96
|
self.tr("Sort Imports"), QDialogButtonBox.ButtonRole.ActionRole |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
97
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
98
|
self.__sortImportsButton.setVisible(False) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
99
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
100
|
self.show() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
101
|
QCoreApplication.processEvents() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
102
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
103
|
self.__performAction() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
104
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
105
|
def __performAction(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
106
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
107
|
Private method to execute the requested formatting action. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
108
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
109
|
self.progressBar.setValue(0) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
110
|
self.progressBar.setVisible(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
111
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
112
|
self.statisticsGroup.setVisible(False) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
113
|
self.__statistics = IsortStatistics() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
114
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
115
|
self.__cancelled = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
116
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
117
|
self.statusFilterComboBox.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
118
|
self.resultsList.clear() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
119
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
120
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
121
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(False) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
122
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setDefault(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
123
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
124
|
files = self.__filterFiles(self.__filesList) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
125
|
if len(files) > 1: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
126
|
self.__formatManyFiles(files) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
127
|
elif len(files) == 1: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
128
|
self.__formatOneFile(files[0]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
129
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
130
|
def __filterFiles(self, filesList): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
131
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
132
|
Private method to filter the given list of files according the |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
133
|
configuration parameters. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
134
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
135
|
@param filesList list of files |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
136
|
@type list of str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
137
|
@return list of filtered files |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
138
|
@rtype list of str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
139
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
140
|
files = [] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
141
|
for file in filesList: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
142
|
if not self.__isortConfig.is_supported_filetype( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
143
|
file |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
144
|
) or self.__isortConfig.is_skipped(pathlib.Path(file)): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
145
|
self.__handleIsortResult(file, "skipped") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
146
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
147
|
files.append(file) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
148
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
149
|
return files |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
150
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
151
|
def __resort(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
152
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
153
|
Private method to resort the result list. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
154
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
155
|
self.resultsList.sortItems( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
156
|
self.resultsList.sortColumn(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
157
|
self.resultsList.header().sortIndicatorOrder(), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
158
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
159
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
160
|
def __resizeColumns(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
161
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
162
|
Private method to resize the columns of the result list. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
163
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
164
|
self.resultsList.header().resizeSections( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
165
|
QHeaderView.ResizeMode.ResizeToContents |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
166
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
167
|
self.resultsList.header().setStretchLastSection(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
168
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
169
|
def __populateStatusFilterCombo(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
170
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
171
|
Private method to populate the status filter combo box with allowed selections. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
172
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
173
|
allowedSelections = set() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
174
|
for row in range(self.resultsList.topLevelItemCount()): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
175
|
allowedSelections.add( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
176
|
self.resultsList.topLevelItem(row).text( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
177
|
IsortFormattingDialog.StatusColumn |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
178
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
179
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
180
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
181
|
self.statusFilterComboBox.addItem(self.__allFilter) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
182
|
self.statusFilterComboBox.addItems(sorted(allowedSelections)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
183
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
184
|
def __finish(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
185
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
186
|
Private method to perform some actions after the run was performed or canceled. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
187
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
188
|
self.__resort() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
189
|
self.__resizeColumns() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
190
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
191
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel).setEnabled(False) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
192
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setEnabled(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
193
|
self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setDefault(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
194
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
195
|
self.progressBar.setVisible(False) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
196
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
197
|
self.__sortImportsButton.setVisible( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
198
|
self.__config["__action__"] is not IsortFormattingAction.Sort |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
199
|
and self.__statistics.changeCount > 0 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
200
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
201
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
202
|
self.__updateStatistics() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
203
|
self.__populateStatusFilterCombo() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
204
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
205
|
def __updateStatistics(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
206
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
207
|
Private method to update the statistics about the recent formatting run and |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
208
|
make them visible. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
209
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
210
|
self.reformattedLabel.setText( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
211
|
self.tr("Reformatted:") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
212
|
if self.__config["__action__"] is IsortFormattingAction.Sort |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
213
|
else self.tr("Would Reformat:") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
214
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
215
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
216
|
total = self.progressBar.maximum() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
217
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
218
|
self.totalCountLabel.setText("{0:n}".format(total)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
219
|
self.skippedCountLabel.setText("{0:n}".format(self.__statistics.skippedCount)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
220
|
self.failuresCountLabel.setText("{0:n}".format(self.__statistics.failureCount)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
221
|
self.processedCountLabel.setText( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
222
|
"{0:n}".format(self.__statistics.processedCount) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
223
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
224
|
self.reformattedCountLabel.setText( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
225
|
"{0:n}".format(self.__statistics.changeCount) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
226
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
227
|
self.unchangedCountLabel.setText("{0:n}".format(self.__statistics.sameCount)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
228
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
229
|
self.statisticsGroup.setVisible(True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
230
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
231
|
@pyqtSlot(QAbstractButton) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
232
|
def on_buttonBox_clicked(self, button): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
233
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
234
|
Private slot to handle button presses of the dialog buttons. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
235
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
236
|
@param button reference to the pressed button |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
237
|
@type QAbstractButton |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
238
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
239
|
if button == self.buttonBox.button(QDialogButtonBox.StandardButton.Cancel): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
240
|
self.__cancelled = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
241
|
elif button == self.buttonBox.button(QDialogButtonBox.StandardButton.Close): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
242
|
self.accept() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
243
|
elif button is self.__sortImportsButton: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
244
|
self.__sortImportsButtonClicked() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
245
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
246
|
@pyqtSlot() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
247
|
def __sortImportsButtonClicked(self): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
248
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
249
|
Private slot handling the selection of the 'Sort Imports' button. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
250
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
251
|
self.__config["__action__"] = IsortFormattingAction.Sort |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
252
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
253
|
self.__performAction() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
254
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
255
|
@pyqtSlot(QTreeWidgetItem, int) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
256
|
def on_resultsList_itemDoubleClicked(self, item, column): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
257
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
258
|
Private slot handling a double click of a result item. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
259
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
260
|
@param item reference to the double clicked item |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
261
|
@type QTreeWidgetItem |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
262
|
@param column column number that was double clicked |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
263
|
@type int |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
264
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
265
|
dataType = item.data(0, IsortFormattingDialog.DataTypeRole) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
266
|
if dataType == "error": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
267
|
EricMessageBox.critical( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
268
|
self, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
269
|
self.tr("Formatting Failure"), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
270
|
self.tr("<p>Formatting failed due to this error.</p><p>{0}</p>").format( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
271
|
item.data(0, IsortFormattingDialog.DataRole) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
272
|
), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
273
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
274
|
elif dataType == "diff": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
275
|
if self.__diffDialog is None: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
276
|
self.__diffDialog = FormattingDiffWidget() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
277
|
self.__diffDialog.showDiff(item.data(0, IsortFormattingDialog.DataRole)) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
278
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
279
|
@pyqtSlot(str) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
280
|
def on_statusFilterComboBox_currentTextChanged(self, status): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
281
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
282
|
Private slot handling the selection of a status for items to be shown. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
283
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
284
|
@param status selected status |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
285
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
286
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
287
|
for row in range(self.resultsList.topLevelItemCount()): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
288
|
itm = self.resultsList.topLevelItem(row) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
289
|
itm.setHidden( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
290
|
status != self.__allFilter |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
291
|
and itm.text(IsortFormattingDialog.StatusColumn) != status |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
292
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
293
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
294
|
def closeEvent(self, evt): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
295
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
296
|
Protected slot implementing a close event handler. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
297
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
298
|
@param evt reference to the close event |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
299
|
@type QCloseEvent |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
300
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
301
|
if self.__diffDialog is not None: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
302
|
self.__diffDialog.close() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
303
|
evt.accept() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
304
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
305
|
def __handleIsortResult(self, filename, status, data=""): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
306
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
307
|
Private method to handle an isort formatting result. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
308
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
309
|
@param filename name of the processed file |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
310
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
311
|
@param status status of the performed action (one of 'changed', 'failed', |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
312
|
'skipped' or 'unchanged') |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
313
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
314
|
@param data action data (error message or unified diff) (defaults to "") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
315
|
@type str (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
316
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
317
|
isError = False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
318
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
319
|
if status == "changed": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
320
|
statusMsg = ( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
321
|
self.tr("would resort") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
322
|
if self.__config["__action__"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
323
|
in (IsortFormattingAction.Check, IsortFormattingAction.Diff) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
324
|
else self.tr("resorted") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
325
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
326
|
self.__statistics.changeCount += 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
327
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
328
|
elif status == "unchanged": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
329
|
statusMsg = self.tr("unchanged") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
330
|
self.__statistics.sameCount += 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
331
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
332
|
elif status == "skipped": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
333
|
statusMsg = self.tr("skipped") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
334
|
self.__statistics.skippedCount += 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
335
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
336
|
elif status == "failed": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
337
|
statusMsg = self.tr("failed") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
338
|
self.__statistics.failureCount += 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
339
|
isError = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
340
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
341
|
elif status == "unsupported": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
342
|
statusMsg = self.tr("error") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
343
|
data = self.tr("Unsupported 'isort' action ({0}) given.").format( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
344
|
self.__config["__action__"] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
345
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
346
|
self.__statistics.failureCount += 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
347
|
isError = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
348
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
349
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
350
|
statusMsg = self.tr("invalid status ({0})").format(status) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
351
|
self.__statistics.failureCount += 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
352
|
isError = True |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
353
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
354
|
if status != "skipped": |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
355
|
self.__statistics.processedCount += 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
356
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
357
|
if self.__project: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
358
|
filename = self.__project.getRelativePath(filename) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
359
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
360
|
itm = QTreeWidgetItem(self.resultsList, [statusMsg, filename]) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
361
|
if data: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
362
|
itm.setData( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
363
|
0, IsortFormattingDialog.DataTypeRole, "error" if isError else "diff" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
364
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
365
|
itm.setData(0, IsortFormattingDialog.DataRole, data) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
366
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
367
|
self.progressBar.setValue(self.progressBar.value() + 1) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
368
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
369
|
QCoreApplication.processEvents() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
370
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
371
|
def __formatManyFiles(self, files): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
372
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
373
|
Private method to format the list of files according the configuration using |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
374
|
multiple processes in parallel. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
375
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
376
|
@param files list of files to be processed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
377
|
@type list of str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
378
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
379
|
maxProcesses = Preferences.getUI("BackgroundServiceProcesses") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
380
|
if maxProcesses == 0: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
381
|
# determine based on CPU count |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
382
|
try: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
383
|
NumberOfProcesses = multiprocessing.cpu_count() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
384
|
if NumberOfProcesses >= 1: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
385
|
NumberOfProcesses -= 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
386
|
except NotImplementedError: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
387
|
NumberOfProcesses = 1 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
388
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
389
|
NumberOfProcesses = maxProcesses |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
390
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
391
|
# Create queues |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
392
|
taskQueue = multiprocessing.Queue() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
393
|
doneQueue = multiprocessing.Queue() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
394
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
395
|
# Submit tasks (initially two times the number of processes) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
396
|
tasks = len(files) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
397
|
initialTasks = min(2 * NumberOfProcesses, tasks) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
398
|
for _ in range(initialTasks): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
399
|
file = files.pop(0) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
400
|
taskQueue.put((file, self.__config["__action__"])) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
401
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
402
|
# Start worker processes |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
403
|
workers = [ |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
404
|
multiprocessing.Process( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
405
|
target=self.formattingWorkerTask, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
406
|
args=(taskQueue, doneQueue, self.__isortConfig), |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
407
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
408
|
for _ in range(NumberOfProcesses) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
409
|
] |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
410
|
for worker in workers: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
411
|
worker.start() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
412
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
413
|
# Get the results from the worker tasks |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
414
|
for _ in range(tasks): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
415
|
result = doneQueue.get() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
416
|
self.__handleIsortResult(result.filename, result.status, data=result.data) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
417
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
418
|
if self.__cancelled: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
419
|
break |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
420
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
421
|
if files: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
422
|
file = files.pop(0) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
423
|
taskQueue.put((file, self.__config["__action__"])) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
424
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
425
|
# Tell child processes to stop |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
426
|
for _ in range(NumberOfProcesses): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
427
|
taskQueue.put("STOP") |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
428
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
429
|
for worker in workers: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
430
|
worker.join() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
431
|
worker.close() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
432
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
433
|
taskQueue.close() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
434
|
doneQueue.close() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
435
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
436
|
self.__finish() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
437
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
438
|
@staticmethod |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
439
|
def formattingWorkerTask(inputQueue, outputQueue, isortConfig): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
440
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
441
|
Static method acting as the parallel worker for the formatting task. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
442
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
443
|
@param inputQueue input queue |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
444
|
@type multiprocessing.Queue |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
445
|
@param outputQueue output queue |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
446
|
@type multiprocessing.Queue |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
447
|
@param isortConfig config object for isort |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
448
|
@type isort.Config |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
449
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
450
|
for file, action in iter(inputQueue.get, "STOP"): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
451
|
if action == IsortFormattingAction.Diff: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
452
|
result = IsortFormattingDialog.__isortCheckFile( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
453
|
file, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
454
|
isortConfig, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
455
|
withDiff=True, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
456
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
457
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
458
|
elif action == IsortFormattingAction.Sort: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
459
|
result = IsortFormattingDialog.__isortSortFile( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
460
|
file, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
461
|
isortConfig, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
462
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
463
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
464
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
465
|
result = IsortResult( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
466
|
status="unsupported", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
467
|
filename=file, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
468
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
469
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
470
|
outputQueue.put(result) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
471
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
472
|
def __formatOneFile(self, file): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
473
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
474
|
Private method to format the list of files according the configuration. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
475
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
476
|
@param file name of the file to be processed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
477
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
478
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
479
|
if self.__config["__action__"] == IsortFormattingAction.Diff: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
480
|
result = IsortFormattingDialog.__isortCheckFile( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
481
|
file, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
482
|
self.__isortConfig, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
483
|
withDiff=True, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
484
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
485
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
486
|
elif self.__config["__action__"] == IsortFormattingAction.Sort: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
487
|
result = IsortFormattingDialog.__isortSortFile( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
488
|
file, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
489
|
self.__isortConfig, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
490
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
491
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
492
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
493
|
result = IsortResult( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
494
|
status="unsupported", |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
495
|
filename=file, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
496
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
497
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
498
|
self.__handleIsortResult(result.filename, result.status, data=result.data) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
499
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
500
|
self.__finish() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
501
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
502
|
@staticmethod |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
503
|
def __isortCheckFile(filename, isortConfig, withDiff=True): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
504
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
505
|
Static method to check, if a file's import statements need to be changed. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
506
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
507
|
@param filename name of the file to be processed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
508
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
509
|
@param isortConfig config object for isort |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
510
|
@type isort.Config |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
511
|
@param withDiff flag indicating to return a unified diff, if the file needs to |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
512
|
be changed (defaults to True) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
513
|
@type bool (optional) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
514
|
@return result object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
515
|
@rtype IsortResult |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
516
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
517
|
diffIO = io.StringIO() if withDiff else False |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
518
|
with suppressStderr(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
519
|
ok = check_file(filename, show_diff=diffIO, config=isortConfig) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
520
|
if withDiff: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
521
|
data = "" if ok else diffIO.getvalue() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
522
|
diffIO.close() |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
523
|
else: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
524
|
data = "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
525
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
526
|
status = "unchanged" if ok else "changed" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
527
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
528
|
return IsortResult(status=status, filename=filename, data=data) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
529
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
530
|
@staticmethod |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
531
|
def __isortSortFile(filename, isortConfig): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
532
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
533
|
Static method to sort the import statements of a file. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
534
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
535
|
@param filename name of the file to be processed |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
536
|
@type str |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
537
|
@param isortConfig config object for isort |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
538
|
@type isort.Config |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
539
|
@return result object |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
540
|
@rtype IsortResult |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
541
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
542
|
with suppressStderr(): |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
543
|
ok = sort_file( |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
544
|
filename, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
545
|
config=isortConfig, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
546
|
ask_to_apply=False, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
547
|
write_to_stdout=False, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
548
|
show_diff=False, |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
549
|
) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
550
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
551
|
status = "changed" if ok else "unchanged" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
552
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
553
|
return IsortResult(status=status, filename=filename) |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
554
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
555
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
556
|
@dataclass |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
557
|
class IsortStatistics: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
558
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
559
|
Class containing the isort reformatting statistic data. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
560
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
561
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
562
|
skippedCount: int = 0 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
563
|
changeCount: int = 0 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
564
|
sameCount: int = 0 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
565
|
failureCount: int = 0 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
566
|
processedCount: int = 0 |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
567
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
568
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
569
|
@dataclass |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
570
|
class IsortResult: |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
571
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
572
|
Class containing the isort reformatting result data. |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
573
|
""" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
574
|
|
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
575
|
status: str = "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
576
|
filename: str = "" |
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff
changeset
|
577
|
data: str = "" |