AssistantEric/APIsManager.py

changeset 131
7d868e8e1cfb
parent 127
1c7a8660933f
child 135
08cb4f36ad47
--- a/AssistantEric/APIsManager.py	Sat Nov 26 14:43:28 2016 +0100
+++ b/AssistantEric/APIsManager.py	Sat Dec 03 18:08:44 2016 +0100
@@ -23,6 +23,7 @@
 
 import QScintilla.Lexers
 
+import Globals
 import Utilities.ModuleParser
 import Utilities
 import Preferences
@@ -78,17 +79,23 @@
     """
     
     def __init__(self, proxy, language, apiFiles, projectPath="",
-                 refresh=False):
+                 refresh=False, projectType=""):
         """
         Constructor
         
-        @param proxy reference to the object that is proxied (DbAPIs)
-        @param language language of the APIs object (string)
-        @param apiFiles list of API files to process (list of strings)
+        @param proxy reference to the object that is proxied
+        @type DbAPIs
+        @param language language of the APIs object
+        @type str
+        @param apiFiles list of API files to process
+        @type list of str
         @param projectPath path of the project. Only needed, if the APIs
-            are extracted out of the sources of a project. (string)
+            are extracted out of the sources of a project.
+        @type str
         @param refresh flag indicating a refresh of the APIs of one file
-            (boolean)
+        @type bool
+        @param projectType type of the project
+        @type str
         """
         QThread.__init__(self)
         
@@ -105,10 +112,17 @@
         
         self.__proxy = proxy
         self.__language = language
+        self.__projectType = projectType
         self.__apiFiles = apiFiles[:]
         self.__aborted = False
         self.__projectPath = projectPath
         self.__refresh = refresh
+        
+        if self.__projectType:
+            self.__connectionName = "{0}_{1}".format(
+                self.__language, self.__projectType)
+        else:
+            self.__connectionName = self.__language
     
     def __autoCompletionWordSeparators(self, language):
         """
@@ -132,7 +146,7 @@
         
         @param apiFile filename of the raw API file (string)
         """
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         db.transaction()
         try:
             query = QSqlQuery(db)
@@ -249,7 +263,7 @@
         
         @param apiFile file name of the API file (string)
         """
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         db.transaction()
         try:
             query = QSqlQuery(db)
@@ -286,7 +300,7 @@
         if wseps is None:
             return
 
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         db.transaction()
         try:
             query = QSqlQuery(db)
@@ -410,7 +424,7 @@
         
         @param apiFile filename of the raw API file (string)
         """
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         db.transaction()
         try:
             query = QSqlQuery(db)
@@ -446,7 +460,7 @@
         """
         self.processing.emit(WorkerStatusStarted, "")
         
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         if db.isValid() and db.isOpen():
             # step 1: remove API files not wanted any longer
             if not self.__refresh:
@@ -574,22 +588,37 @@
         INSERT INTO mgmt (format) VALUES ({0:d})
         """.format(DB_VERSION)
     
-    def __init__(self, language, parent=None):
+    def __init__(self, language, projectType="", parent=None):
         """
         Constructor
         
-        @param language language of the APIs object (string)
-        @param parent reference to the parent object (QObject)
+        @param language language of the APIs object
+        @type str
+        @param projectType type of the project
+        @type str
+        @param parent reference to the parent object
+        @type QObject
         """
         QObject.__init__(self, parent)
-        self.setObjectName("DbAPIs_{0}".format(language))
+        if projectType:
+            self.setObjectName("DbAPIs_{0}_{1}".format(language, projectType))
+        else:
+            self.setObjectName("DbAPIs_{0}".format(language))
         
         self.__inPreparation = False
         self.__worker = None
         self.__workerQueue = []
         self.__opened = False
         
+        self.__projectType = projectType
         self.__language = language
+        
+        if self.__projectType:
+            self.__connectionName = "{0}_{1}".format(
+                self.__language, self.__projectType)
+        else:
+            self.__connectionName = self.__language
+        
         if self.__language == ApisNameProject:
             self.__initAsProject()
         else:
@@ -620,7 +649,12 @@
         else:
             self.__discardFirst = []
         self.__lexer = QScintilla.Lexers.getLexer(self.__language)
-        self.__apifiles = Preferences.getEditorAPI(self.__language)
+        try:
+            self.__apifiles = Preferences.getEditorAPI(
+                self.__language, projectType=self.__projectType)
+        except TypeError:
+            # older interface
+            self.__apifiles = Preferences.getEditorAPI(self.__language)
         self.__apifiles.sort()
         if self.__lexer is not None:
             self.__openAPIs()
@@ -635,10 +669,15 @@
             return os.path.join(self.__project.getProjectManagementDir(),
                                 "project-apis.db")
         else:
-            apiDir = os.path.join(Utilities.getConfigDir(), "APIs")
-            if not os.path.exists(apiDir):
-                os.makedirs(apiDir)
-            return os.path.join(apiDir, "{0}-api.db".format(self.__language))
+            apisDir = os.path.join(Globals.getConfigDir(), "APIs")
+            if not os.path.exists(apisDir):
+                os.makedirs(apisDir)
+            if self.__projectType:
+                filename = "{0}_{1}-api.db".format(self.__language,
+                                                   self.__projectType)
+            else:
+                filename = "{0}-api.db".format(self.__language)
+            return os.path.join(apisDir, filename)
     
     def close(self):
         """
@@ -655,8 +694,9 @@
                     if self.__worker is not None:
                         self.__worker.wait(5000)
         
-        if QSqlDatabase and QSqlDatabase.database(self.__language).isOpen():
-            QSqlDatabase.database(self.__language).close()
+        if QSqlDatabase and QSqlDatabase.database(
+                self.__connectionName).isOpen():
+            QSqlDatabase.database(self.__connectionName).close()
             QSqlDatabase.removeDatabase(self.__language)
         
         self.__opened = False
@@ -667,10 +707,10 @@
         
         @return flag indicating the database status (boolean)
         """
-        db = QSqlDatabase.database(self.__language, False)
+        db = QSqlDatabase.database(self.__connectionName, False)
         if not db.isValid():
             # the database connection is a new one
-            db = QSqlDatabase.addDatabase("QSQLITE", self.__language)
+            db = QSqlDatabase.addDatabase("QSQLITE", self.__connectionName)
             dbName = self._apiDbName()
             if self.__language == ApisNameProject and \
                     not os.path.exists(
@@ -680,7 +720,7 @@
                 db.setDatabaseName(dbName)
                 opened = db.open()
             if not opened:
-                QSqlDatabase.removeDatabase(self.__language)
+                QSqlDatabase.removeDatabase(self.__connectionName)
         else:
             opened = True
         return opened
@@ -689,7 +729,7 @@
         """
         Private method to create an API database.
         """
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         db.transaction()
         try:
             query = QSqlQuery(db)
@@ -728,7 +768,7 @@
         """
         apiFiles = []
         
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         db.transaction()
         try:
             query = QSqlQuery(db)
@@ -747,7 +787,7 @@
         
         @return flag indicating the prepared status (boolean)
         """
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         prepared = len(db.tables()) > 0
         if prepared:
             db.transaction()
@@ -782,7 +822,7 @@
         """
         completions = []
         
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen() and not self.__inPreparation:
             db.transaction()
             try:
@@ -845,7 +885,7 @@
         """
         calltips = []
         
-        db = QSqlDatabase.database(self.__language)
+        db = QSqlDatabase.database(self.__connectionName)
         if db.isOpen() and not self.__inPreparation:
             if self.autoCompletionWordSeparators():
                 contextSeparator = self.autoCompletionWordSeparators()[0]
@@ -985,10 +1025,17 @@
                 [f for f in self.__getProjectFormSources() if
                  f not in apiFiles])
             projectPath = self.__project.getProjectPath()
+            projectType = ""
         else:
-            apiFiles = Preferences.getEditorAPI(self.__language)
+            try:
+                apiFiles = Preferences.getEditorAPI(
+                    self.__language, projectType=self.__projectType)
+            except TypeError:
+                # older interface
+                apiFiles = Preferences.getEditorAPI(self.__language)
+            projectType = self.__projectType
         self.__worker = DbAPIsWorker(self, self.__language, apiFiles,
-                                     projectPath)
+                                     projectPath, projectType=projectType)
         self.__worker.processing.connect(
             self.__processingStatus, Qt.QueuedConnection)
         self.__worker.start()
@@ -1006,10 +1053,13 @@
             if self.__language == ApisNameProject:
                 projectPath = self.__project.getProjectPath()
                 apiFiles = [apiFiles[0].replace(projectPath + os.sep, "")]
+                projectType = ""
             else:
                 projectPath = ""
+                projectType = self.__projectType
             self.__worker = DbAPIsWorker(self, self.__language, apiFiles,
-                                         projectPath, refresh=True)
+                                         projectPath, projectType=projectType,
+                                         refresh=True)
             self.__worker.processing.connect(
                 self.__processingStatus, Qt.QueuedConnection)
             self.__worker.start()
@@ -1122,7 +1172,7 @@
         @param parent reference to the parent object (QObject)
         """
         QObject.__init__(self, parent)
-        self.setObjectName("APIsManager")
+        self.setObjectName("Assistant_APIsManager")
         
         self.__mw = mainWindow
         
@@ -1136,7 +1186,7 @@
         for api in list(self.__apis.values()):
             api and api.prepareAPIs()
     
-    def getAPIs(self, language):
+    def getAPIs(self, language, projectType=""):
         """
         Public method to get an apis object for autocompletion/calltips.
         
@@ -1144,22 +1194,43 @@
         This saves memory for languages, that might not be needed at the
         moment.
         
-        @param language the language of the requested api object (string)
-        @return the apis object (APIs)
+        @param language language of the requested APIs object
+        @type str
+        @param projectType type of the project
+        @type str
+        @return reference to the APIs object
+        @rtype APIs
         """
         try:
-            return self.__apis[language]
+            return self.__apis[(language, projectType)]
         except KeyError:
-            if language in QScintilla.Lexers.getSupportedLanguages() or \
+            if language in self.__supportedApiLanguages() or \
                language == ApisNameProject:
                 # create the api object
-                api = DbAPIs(language)
+                api = DbAPIs(language, projectType=projectType)
                 api.apiPreparationStatus.connect(self.__apiPreparationStatus)
-                self.__apis[language] = api
-                return self.__apis[language]
+                self.__apis[(language, projectType)] = api
+                return self.__apis[(language, projectType)]
             else:
                 return None
     
+    def __supportedApiLanguages(self):
+        """
+        Private method to build a list of supported API languages.
+        
+        Note: This is a compatibility method to make this code work with
+        older eric versions.
+        
+        @return list of supported API languages
+        @rtype list of str
+        """
+        try:
+            return QScintilla.Lexers.getSupportedApiLanguages()
+        except AttributeError:
+            return [lang for lang in
+                    QScintilla.Lexers.getSupportedLanguages().keys()
+                    if lang != "Guessed" and not lang.startswith("Pygments|")]
+    
     def deactivate(self):
         """
         Public method to perform actions upon deactivation.

eric ide

mercurial