src/eric7/Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 9016
6f079c524e99
child 9212
1c5cf2022c7e
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2004 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog to enter the parameters for eric7_api.
8 """
9
10 import os
11 import copy
12
13 from PyQt6.QtCore import pyqtSlot, Qt
14 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
15
16 from EricWidgets.EricPathPicker import EricPathPickerModes
17
18 from .Ui_EricapiConfigDialog import Ui_EricapiConfigDialog
19
20 import Globals
21 import Utilities
22 import DocumentationTools
23
24 from eric7config import getConfig
25
26
27 class EricapiConfigDialog(QDialog, Ui_EricapiConfigDialog):
28 """
29 Class implementing a dialog to enter the parameters for eric7_api.
30 """
31 def __init__(self, project, parms=None, parent=None):
32 """
33 Constructor
34
35 @param project reference to the project object (Project.Project)
36 @param parms parameters to set in the dialog
37 @param parent parent widget of this dialog
38 """
39 super().__init__(parent)
40 self.setupUi(self)
41
42 self.outputFilePicker.setMode(EricPathPickerModes.SAVE_FILE_MODE)
43 self.outputFilePicker.setDefaultDirectory(project.getProjectPath())
44 self.outputFilePicker.setFilters(self.tr(
45 "API files (*.api);;All files (*)"))
46
47 self.ignoreDirPicker.setMode(EricPathPickerModes.DIRECTORY_MODE)
48 self.ignoreDirPicker.setDefaultDirectory(project.getProjectPath())
49
50 self.buttonBox.button(
51 QDialogButtonBox.StandardButton.Ok).setEnabled(False)
52 for language in sorted(
53 DocumentationTools.supportedExtensionsDictForApis.keys()):
54 self.languagesList.addItem(language)
55
56 self.ppath = project.getProjectPath()
57 self.project = project
58
59 self.__initializeDefaults()
60
61 # get a copy of the defaults to store the user settings
62 self.parameters = copy.deepcopy(self.defaults)
63
64 # combine it with the values of parms
65 if parms is not None:
66 self.parameters.update(parms)
67 self.parameters['outputFile'] = Utilities.toNativeSeparators(
68 self.parameters['outputFile'])
69
70 self.recursionCheckBox.setChecked(self.parameters['useRecursion'])
71 self.includePrivateCheckBox.setChecked(
72 self.parameters['includePrivate'])
73 self.outputFilePicker.setText(self.parameters['outputFile'])
74 self.baseEdit.setText(self.parameters['basePackage'])
75 self.ignoreDirsList.clear()
76 for d in self.parameters['ignoreDirectories']:
77 self.ignoreDirsList.addItem(d)
78 self.sourceExtEdit.setText(
79 ", ".join(self.parameters['sourceExtensions']))
80 self.excludeFilesEdit.setText(
81 ", ".join(self.parameters['ignoreFilePatterns']))
82 for language in self.parameters['languages']:
83 if language == "Python":
84 # convert Python to the more specific Python3
85 language = "Python3"
86 items = self.languagesList.findItems(
87 language, Qt.MatchFlag.MatchExactly)
88 items and items[0].setSelected(True)
89
90 def __initializeDefaults(self):
91 """
92 Private method to set the default values.
93
94 These are needed later on to generate the commandline
95 parameters.
96 """
97 self.defaults = {
98 'useRecursion': False,
99 'includePrivate': False,
100 'outputFile': '',
101 'basePackage': '',
102 'ignoreDirectories': [],
103 'ignoreFilePatterns': [],
104 'sourceExtensions': [],
105 }
106
107 lang = self.project.getProjectLanguage()
108 if lang in DocumentationTools.supportedExtensionsDictForApis:
109 self.defaults['languages'] = [lang]
110 else:
111 self.defaults['languages'] = ["Python3"]
112
113 def generateParameters(self):
114 """
115 Public method that generates the command line parameters.
116
117 It generates a list of strings to be used
118 to set the QProcess arguments for the ericapi call and
119 a dictionary containing the non default parameters. This
120 dictionary can be passed back upon object generation to overwrite
121 the default settings.
122
123 @return a tuple of the commandline parameters and non default
124 parameters (list of strings, dictionary)
125 """
126 parms = {}
127 args = []
128
129 # 1. the program name
130 args.append(Globals.getPythonExecutable())
131 args.append(
132 Utilities.normabsjoinpath(getConfig('ericDir'), "eric7_api.py"))
133
134 # 2. the commandline options
135 if self.parameters['outputFile'] != self.defaults['outputFile']:
136 parms['outputFile'] = Utilities.fromNativeSeparators(
137 self.project.getRelativePath(self.parameters['outputFile']))
138 args.append('-o')
139 if os.path.isabs(self.parameters['outputFile']):
140 args.append(self.parameters['outputFile'])
141 else:
142 args.append(
143 os.path.join(self.ppath, self.parameters['outputFile']))
144 else:
145 self.parameters['outputFile'] = self.defaults['outputFile']
146 if self.parameters['basePackage'] != self.defaults['basePackage']:
147 parms['basePackage'] = self.parameters['basePackage']
148 args.append('-b')
149 args.append(self.parameters['basePackage'])
150 if (
151 self.parameters['ignoreDirectories'] !=
152 self.defaults['ignoreDirectories']
153 ):
154 parms['ignoreDirectories'] = (
155 self.parameters['ignoreDirectories'][:]
156 )
157 for d in self.parameters['ignoreDirectories']:
158 args.append('-x')
159 args.append(d)
160 if (
161 self.parameters['ignoreFilePatterns'] !=
162 self.defaults['ignoreFilePatterns']
163 ):
164 parms['ignoreFilePatterns'] = (
165 self.parameters['ignoreFilePatterns'][:]
166 )
167 for pattern in self.parameters['ignoreFilePatterns']:
168 args.append("--exclude-file={0}".format(pattern))
169 if self.parameters['useRecursion'] != self.defaults['useRecursion']:
170 parms['useRecursion'] = self.parameters['useRecursion']
171 args.append('-r')
172 if (
173 self.parameters['sourceExtensions'] !=
174 self.defaults['sourceExtensions']
175 ):
176 parms['sourceExtensions'] = self.parameters['sourceExtensions'][:]
177 for ext in self.parameters['sourceExtensions']:
178 args.append('-t')
179 args.append(ext)
180 if (
181 self.parameters['includePrivate'] !=
182 self.defaults['includePrivate']
183 ):
184 parms['includePrivate'] = self.parameters['includePrivate']
185 args.append('-p')
186 parms['languages'] = self.parameters['languages'][:]
187 for lang in self.parameters['languages']:
188 args.append('--language={0}'.format(lang))
189
190 return (args, parms)
191
192 @pyqtSlot()
193 def on_outputFilePicker_aboutToShowPathPickerDialog(self):
194 """
195 Private slot called before the file selection dialog is shown.
196 """
197 startFile = self.outputFilePicker.text()
198 if not startFile:
199 self.outputFilePicker.setText(
200 self.project.getProjectName() + ".api")
201
202 @pyqtSlot(str)
203 def on_outputFilePicker_pathSelected(self, path):
204 """
205 Private slot handling the selection of an output file.
206
207 @param path path of the output file
208 @type str
209 """
210 # make it relative, if it is in a subdirectory of the project path
211 fn = self.project.getRelativePath(path)
212 self.outputFilePicker.setText(fn)
213
214 def on_outputFilePicker_textChanged(self, filename):
215 """
216 Private slot to enable/disable the "OK" button.
217
218 @param filename name of the file (string)
219 """
220 self.buttonBox.button(
221 QDialogButtonBox.StandardButton.Ok).setEnabled(filename != "")
222
223 @pyqtSlot(str)
224 def on_ignoreDirPicker_pathSelected(self, path):
225 """
226 Private slot handling the selection of a directory to be ignored.
227
228 @param path path of the directory to be ignored
229 @type str
230 """
231 # make it relative, if it is in a subdirectory of the project path
232 dn = self.project.getRelativePath(path)
233 while dn.endswith(os.sep):
234 dn = dn[:-1]
235 self.ignoreDirPicker.setText(dn)
236
237 @pyqtSlot()
238 def on_addButton_clicked(self):
239 """
240 Private slot to add the directory displayed to the listview.
241
242 The directory in the ignore directories
243 line edit is moved to the listbox above and the edit is cleared.
244 """
245 basename = os.path.basename(self.ignoreDirPicker.text())
246 if basename:
247 self.ignoreDirsList.addItem(basename)
248 self.ignoreDirPicker.clear()
249
250 @pyqtSlot()
251 def on_deleteButton_clicked(self):
252 """
253 Private slot to delete the currently selected directory of the listbox.
254 """
255 itm = self.ignoreDirsList.takeItem(self.ignoreDirsList.currentRow())
256 del itm
257
258 def accept(self):
259 """
260 Public slot called by the Ok button.
261
262 It saves the values in the parameters dictionary.
263 """
264 self.parameters['useRecursion'] = self.recursionCheckBox.isChecked()
265 self.parameters['includePrivate'] = (
266 self.includePrivateCheckBox.isChecked()
267 )
268 outfile = self.outputFilePicker.text()
269 if outfile != '':
270 outfile = os.path.normpath(outfile)
271 self.parameters['outputFile'] = outfile
272 self.parameters['basePackage'] = self.baseEdit.text()
273 self.parameters['ignoreDirectories'] = []
274 for row in range(0, self.ignoreDirsList.count()):
275 itm = self.ignoreDirsList.item(row)
276 self.parameters['ignoreDirectories'].append(
277 os.path.normpath(itm.text()))
278 extensions = self.sourceExtEdit.text().split(',')
279 self.parameters['sourceExtensions'] = [
280 ext.strip() for ext in extensions if len(ext) > 0
281 ]
282 patterns = self.excludeFilesEdit.text().split(',')
283 self.parameters['ignoreFilePatterns'] = [
284 pattern.strip() for pattern in patterns
285 ]
286 self.parameters['languages'] = []
287 for itm in self.languagesList.selectedItems():
288 self.parameters['languages'].append(itm.text())
289
290 # call the accept slot of the base class
291 super().accept()

eric ide

mercurial