package org.python.pydev.plugin; import java.io.File; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.Path; import org.python.core.PyObject; import org.python.pydev.core.log.Log; import org.python.pydev.jython.IPythonInterpreter; import org.python.pydev.shared_core.string.StringUtils; public class JythonModules { private static final Object loadJythonLock = new Object(); private static PyObject pep8Module; public static PyObject getPep8Module(IPythonInterpreter interpreter) { if (pep8Module == null) { pep8Module = getPepJythonModule(interpreter, "pycodestyle"); } return pep8Module; } public static File getPep8Location() { return getPepModuleLocation("pycodestyle.py"); } /** * @param module: The name of the module (i.e.: pycodestyle, autopep8) * @return null if it was not able to get the pycodestyle module. */ private static PyObject getPepJythonModule(IPythonInterpreter interpreter, String module) { synchronized (loadJythonLock) { String s = "" + "import sys\n" + "add_to_pythonpath = '%s'\n" + "if add_to_pythonpath not in sys.path:\n" + " sys.path.append(add_to_pythonpath)\n" + "import " + module + "\n"; //put the parent dir of pycodestyle.py in the pythonpath. File pepModuleLoc = getPepModuleLocation(module + ".py"); if (pepModuleLoc == null) { return null; } s = StringUtils.format(s, StringUtils.replaceAllSlashes(pepModuleLoc.getParentFile().getAbsolutePath())); interpreter.exec(s); return interpreter.get(module); } } /** * @param moduleFilename: i.e.: pycodestyle.py, autopep8.py * @return */ private static File getPepModuleLocation(String moduleFilename) { try { String pep8Location = PydevPlugin.getScriptWithinPySrc( new Path("third_party").append("pep8").append(moduleFilename).toString()).toString(); File pep8Loc = new File(pep8Location); if (!pep8Loc.exists()) { Log.log("Specified location for " + moduleFilename + " does not exist (" + pep8Location + ")."); return null; } return pep8Loc; } catch (CoreException e) { Log.log("Error getting " + moduleFilename + " location", e); return null; } } }