Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py

branch
BgService
changeset 3241
957673fc463a
child 3412
9364dab2d472
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py	Fri Jan 31 22:11:45 2014 +0100
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2013 - 2014 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+# pylint: disable=C0103
+
+"""
+Module implementing an interface to add different languages to do a syntax
+check.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt4.QtCore import QObject, pyqtSignal
+
+from E5Gui.E5Application import e5App
+from Utilities import determinePythonVersion
+
+
+class SyntaxCheckService(QObject):
+    """
+    Implement the syntax check service.
+    
+    Plugins can add other languages to the syntax check by calling addLanguage
+    and support of an extra checker module on the client side which has to
+    connect directly to the background service.
+    """
+    syntaxChecked = pyqtSignal(str, bool, int, int, str, str, list)
+
+    def __init__(self):
+        """
+        Contructor of SyntaxCheckService.
+        
+        @param backgroundService to connect to (BackgroundService class)
+        """
+        super(SyntaxCheckService, self).__init__()
+        self.backgroundService = e5App().getObject("BackgroundService")
+        self.__supportedLanguages = {}
+
+    def __determineLanguage(self, filename, source):
+        """
+        Private methode to determine the language of the file.
+        
+        @return language of the file or None if not found (str or None)
+        """
+        pyVer = determinePythonVersion(filename, source)
+        if pyVer:
+            return 'Python{0}'.format(pyVer)
+        
+        for lang, (getArgs, getExt) in self.__supportedLanguages.items():
+            if filename.endswith(getExt()):
+                return lang
+        
+        return None
+
+    def addLanguage(
+            self, lang, path, module, getArgs, getExt, callback, onError):
+        """
+        Register the new language to the supported languages.
+        
+        @param lang new language to check syntax (str)
+        @param path full path to the module (str)
+        @param module name to import (str)
+        @param getArgs function to collect the required arguments to call the
+            syntax checker on client side (function)
+        @param getExt function that returns the supported file extensions of
+            the syntax checker (function)
+        @param callback function on service response (function)
+        @param onError callback function if client or service isn't available
+            (function)
+        """
+        self.__supportedLanguages[lang] = getArgs, getExt
+        # Connect to the background service
+        self.backgroundService.serviceConnect(
+            'syntax', lang, path, module, callback, onError)
+
+    def getLanguages(self):
+        """
+        Return the supported language names.
+        
+        @return list of languanges supported (list of str)
+        """
+        return list(self.__supportedLanguages.keys())
+
+    def removeLanguage(self, lang):
+        """
+        Remove the language from syntax check.
+        
+        @param lang language to remove (str)
+        """
+        self.__supportedLanguages.pop(lang, None)
+        self.backgroundService.serviceDisconnect('syntax', lang)
+
+    def getExtensions(self):
+        """
+        Return all supported file extensions for the syntax checker dialog.
+        
+        @return set of all supported file extensions (set of str)
+        """
+        extensions = set()
+        for getArgs, getExt in self.__supportedLanguages.values():
+            for ext in getExt():
+                extensions.add(ext)
+        return extensions
+
+    def syntaxCheck(self, lang, filename, source=""):
+        """
+        Method to prepare to compile one Python source file to Python bytecode
+        and to perform a pyflakes check in another task.
+        
+        @param lang language of the file or None to determine by internal
+            algorithm (str or None)
+        @param filename source filename (string)
+        @keyparam source string containing the code to check (string)
+        """
+        if not lang:
+            lang = self.__determineLanguage(filename, source)
+        if lang not in self.getLanguages():
+            return
+        data = [source]
+        # Call the getArgs function to get the required arguments
+        args = self.__supportedLanguages[lang][0]()
+        data.extend(args)
+        self.backgroundService.enqueueRequest('syntax', lang, filename, data)

eric ide

mercurial