--- 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.