eric6/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py

changeset 7005
342819f05839
parent 6942
2602857055c5
child 7192
a22eee00b052
--- 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):
         """

eric ide

mercurial