def lint_with_text(self, request, text): encoding_name = request.encoding.python_encoding_name cwd = request.cwd prefset = request.prefset prefName = "lint_%s_with_standard_python" % self.language_name_lc if not prefset.getBooleanPref(prefName): return try: # Get the Python interpreter (prefs or first valid one on the path). interpreter_pref_name = "%sDefaultInterpreter" % ( self.language_name_lc, ) python = prefset.getString(interpreter_pref_name) if not python: python = self._pythonInfo.executablePath if not python: return if not self._pythonInfo.isSupportedBinary(python): raise ServerException( nsError.NS_ERROR_FAILURE, "Invalid %r executable: %r" % (self.language_name, python)) # Determine the pycompile settings. if self.language_name == "Python3": compilePy = os.path.join(self._koDirSvc.supportDir, "python", "py3compile.py") if encoding_name not in self._simple_python3_string_encodings: # First, make sure the text is Unicode if type(text) == self._stringType: text = text.decode(encoding_name) # Now save it as utf-8 -- python3 knows how to read utf-8 text = text.encode("utf-8") else: compilePy = os.path.join(self._koDirSvc.supportDir, "python", "pycompile.py") if request.koDoc.displayPath.startswith("macro2://"): text = projectUtils.wrapPythonMacro(text) leadingWS = _leading_ws_re.match(text.splitlines()[1]).group(1) else: leadingWS = None # Save the current buffer to a temporary file. cwd = cwd or None # Standard Python syntax-checking files can live in a tmp directory # because the checker doesn't attempt to verify or read imported # modules. fout, tmpFileName = _localTmpFileName() fout.write(text) fout.close() results = koLintResults() try: argv = [python, '-u', compilePy, tmpFileName] #print "---- check syntax of the following with %r" % argv #sys.stdout.write(text) #print "-"*70 env = self._get_fixed_env(prefset) if sys.platform.startswith("win") and cwd is not None\ and cwd.startswith("\\\\"): # Don't try to switch to a UNC path because pycompile.py # ends up spitting out: # CMD.EXE was started with '\\netshare\apps\Komodo\stuff' as the current directory # path. UNC paths are not supported. Defaulting to Windows directory. # XXX Could perhaps try to ensure that command is not # run via "cmd.exe /c", but don't know if that would # help either. cwd = None p = process.ProcessOpen(argv, cwd=cwd, env=env, stdin=None) output, error = p.communicate() retval = p.returncode #print "-"*60, "env" #pprint(env) #print "-"*60, "output" #print output #print "-"*60, "error" #print error #print "-"*70 if retval: errmsg = "Error checking syntax: retval=%s, stderr=%s"\ % (retval, error) log.exception(errmsg) raise ServerException(nsError.NS_ERROR_UNEXPECTED, errmsg) else: # Parse syntax errors in the output. dicts = eval(output) for d in dicts: results.addResult(self._buildResult(d, leadingWS)) # Parse warnings in the error. results.addResults( self._parseWarnings(error, text, leadingWS)) finally: os.unlink(tmpFileName) except ServerException: log.exception("ServerException") raise except: # non-ServerException's are unexpected internal errors log.exception("unexpected internal error") raise return results
def lint_with_text(self, request, text): encoding_name = request.encoding.python_encoding_name cwd = request.cwd prefset = request.prefset prefName = "lint_%s_with_standard_python" % self.language_name_lc if not prefset.getBooleanPref(prefName): return try: # Get the Python interpreter (prefs or first valid one on the path). interpreter_pref_name = "%sDefaultInterpreter" % (self.language_name_lc, ) python = prefset.getString(interpreter_pref_name) if not python: python = self._pythonInfo.getExecutableFromPrefs(prefset) if not python: return if not self._pythonInfo.isSupportedBinary(python): raise ServerException(nsError.NS_ERROR_FAILURE, "Invalid %r executable: %r" % (self.language_name, python)) # Determine the pycompile settings. if self.language_name == "Python3": compilePy = os.path.join(self._koDirSvc.supportDir, "python", "py3compile.py") if encoding_name not in self._simple_python3_string_encodings: # First, make sure the text is Unicode if type(text) == self._stringType: text = text.decode(encoding_name) # Now save it as utf-8 -- python3 knows how to read utf-8 text = text.encode("utf-8") else: compilePy = os.path.join(self._koDirSvc.supportDir, "python", "pycompile.py") if request.koDoc.displayPath.startswith("macro2://"): text = projectUtils.wrapPythonMacro(text) leading_ws_re = re.compile(r'(\s*)') leadingWS = leading_ws_re.match(text.splitlines()[1]).group(1) else: leadingWS = None # Save the current buffer to a temporary file. cwd = cwd or None # Standard Python syntax-checking files can live in a tmp directory # because the checker doesn't attempt to verify or read imported # modules. fout, tmpFileName = _localTmpFileName() fout.write(text) fout.close() results = koLintResults() try: argv = [python, '-u', compilePy, tmpFileName] #print "---- check syntax of the following with %r" % argv #sys.stdout.write(text) #print "-"*70 env = self._get_fixed_env(prefset) if sys.platform.startswith("win") and cwd is not None\ and cwd.startswith("\\\\"): # Don't try to switch to a UNC path because pycompile.py # ends up spitting out: # CMD.EXE was started with '\\netshare\apps\Komodo\stuff' as the current directory # path. UNC paths are not supported. Defaulting to Windows directory. # XXX Could perhaps try to ensure that command is not # run via "cmd.exe /c", but don't know if that would # help either. cwd = None p = process.ProcessOpen(argv, cwd=cwd, env=env, stdin=None) output, error = p.communicate() retval = p.returncode #print "-"*60, "env" #pprint(env) #print "-"*60, "output" #print output #print "-"*60, "error" #print error #print "-"*70 if retval: errmsg = "Error checking syntax: retval=%s, stderr=%s"\ % (retval, error) log.exception(errmsg) raise ServerException(nsError.NS_ERROR_UNEXPECTED, errmsg) else: # Parse syntax errors in the output. dicts = eval(output) for d in dicts: results.addResult( self._buildResult(d, leadingWS) ) # Parse warnings in the error. results.addResults(self._parseWarnings(error, text, leadingWS)) finally: os.unlink(tmpFileName) except ServerException: log.exception("ServerException") raise except: # non-ServerException's are unexpected internal errors log.exception("unexpected internal error") raise return results