--- a/eric6/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py Sun May 05 18:56:46 2019 +0200 +++ b/eric6/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py Mon May 06 18:46:08 2019 +0200 @@ -17,9 +17,10 @@ import sys import datetime -from PyQt5.QtCore import pyqtSlot, Qt +from PyQt5.QtCore import pyqtSlot, Qt, QUrl from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem, \ QListWidgetItem, QApplication +from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from E5Gui.E5Application import e5App from E5Gui import E5MessageBox, E5FileDialog @@ -39,6 +40,8 @@ It displays a dialog for entering the parameters for the E5MessageBox code generator. """ + ClassifiersUrl = "https://pypi.org/pypi?%3Aaction=list_classifiers" + def __init__(self, parent=None): """ Constructor @@ -48,6 +51,8 @@ super(SetupWizardDialog, self).__init__(parent) self.setupUi(self) + self.__replies = [] + self.dataTabWidget.setCurrentIndex(0) self.__packageDirCompleter = E5DirCompleter(self.packageEdit) @@ -69,13 +74,7 @@ self.maintainerEmailEdit]: lineEdit.setStyleSheet(self.__mandatoryStyleSheet) - self.developmentStatusComboBox.addItem("", "") - - self.__populateFromTroveLists() - - self.licenseClassifierComboBox.setCurrentIndex( - self.licenseClassifierComboBox.findText( - "(GPLv3)", Qt.MatchContains | Qt.MatchCaseSensitive)) + self.__loadClassifiersFromPyPI() self.__okButton = self.buttonBox.button(QDialogButtonBox.Ok) self.__okButton.setEnabled(False) @@ -109,9 +108,46 @@ self.__okButton.setEnabled(enable) - def __populateFromTroveLists(self): + def __loadClassifiersFromPyPI(self): + """ + Private method to populate the classifiers list with data retrieved + from PyPI. + """ + request = QNetworkRequest(QUrl(SetupWizardDialog.ClassifiersUrl)) + request.setAttribute(QNetworkRequest.CacheLoadControlAttribute, + QNetworkRequest.AlwaysNetwork) + reply = e5App().getObject("UserInterface").networkAccessManager().get( + request) + reply.finished.connect(lambda: self.__classifiersDownloadDone(reply)) + self.__replies.append(reply) + + @pyqtSlot() + def __classifiersDownloadDone(self, reply): + """ + Private slot called, after the classifiers file has been downloaded + from the internet. + + @param reply reference to the network reply + @type QNetworkReply + """ + reply.deleteLater() + if reply in self.__replies: + self.__replies.remove(reply) + if reply.error() == QNetworkReply.NoError: + ioEncoding = Preferences.getSystem("IOEncoding") + lines = str(reply.readAll(), ioEncoding, 'replace').splitlines() + + self.__populateClassifiers(lines) + + reply.close() + + @pyqtSlot() + def on_localClassifiersButton_clicked(self): """ Private method to populate lists from the Trove list file. + + Note: The trove list file was created from querying + "https://pypi.org/pypi?%3Aaction=list_classifiers". """ filename = os.path.join(os.path.dirname(__file__), "data", "trove_classifiers.txt") @@ -128,8 +164,24 @@ .format(filename, str(err))) return + self.__populateClassifiers(lines) + + def __populateClassifiers(self, classifiers): + """ + Private method to populate the classifiers. + + @param classifiers list of classifiers read from a local file or + retrieved from PyPI + @type list of str + """ + self.licenseClassifierComboBox.clear() + self.classifiersList.clear() + self.developmentStatusComboBox.clear() + + self.developmentStatusComboBox.addItem("", "") + self.__classifiersDict = {} - for line in lines: + for line in classifiers: line = line.strip() if line.startswith("License "): self.licenseClassifierComboBox.addItem( @@ -142,6 +194,10 @@ else: self.__addClassifierEntry(line) self.__classifiersDict = {} + + self.licenseClassifierComboBox.setCurrentIndex( + self.licenseClassifierComboBox.findText( + "(GPLv3)", Qt.MatchContains | Qt.MatchCaseSensitive)) def __addClassifierEntry(self, line): """