From 4ca3103fdcc25c6a555dc2be8aa6c185ab9bc457 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Thu, 9 Oct 2025 01:00:46 +0200 Subject: [PATCH 01/15] Initial commit Update to maven project (allows running in eclipse) Updated linux properties for tests --- .project | 17 +++++++++++ .../my_django_proj_17/.pydevproject | 28 +++++++++++++------ .../pydev/core/TestDependent.linux.properties | 11 ++++---- 3 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 .project diff --git a/.project b/.project new file mode 100644 index 0000000000..276b6b99b6 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + Pydev + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/plugins/org.python.pydev.core/pysrc/tests_python/my_django_proj_17/.pydevproject b/plugins/org.python.pydev.core/pysrc/tests_python/my_django_proj_17/.pydevproject index 6e842d0158..594f7b2b11 100644 --- a/plugins/org.python.pydev.core/pysrc/tests_python/my_django_proj_17/.pydevproject +++ b/plugins/org.python.pydev.core/pysrc/tests_python/my_django_proj_17/.pydevproject @@ -1,12 +1,22 @@ - -DJANGO_MANAGE_LOCATION -manage.py - - -/${PROJECT_DIR_NAME} - -python 2.7 -Default + + + + DJANGO_MANAGE_LOCATION + + manage.py + + + + + + /${PROJECT_DIR_NAME} + + + + python interpreter + + Default + diff --git a/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties b/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties index b71d632805..c0faefe489 100644 --- a/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties +++ b/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties @@ -1,8 +1,8 @@ -PYTHON_INSTALL = /home/fabio/miniconda3/envs/py310/lib/python3.10/ -PYTHON_EXE = /home/fabio/miniconda3/envs/py310/bin/python3 +PYTHON_INSTALL = /home/martin/.local/share/virtualenvs/3.13/lib/python3.13/ +PYTHON_EXE = /home/martin/.local/share/virtualenvs/3.13/pydev/bin/python -TEST_PYDEV_BASE_LOC=/home/fabio/Desktop/Pydev/plugins/ +TEST_PYDEV_BASE_LOC=/home/martin/git/ePydev/plugins/ #CONDA_PYTHON_38_ENV=C:/bin/Miniconda/envs/py_38_tests/ @@ -17,7 +17,7 @@ TEST_PYDEV_BASE_LOC=/home/fabio/Desktop/Pydev/plugins/ #PYTHON2_MX_PACKAGES=/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/ #PYTHON2_PIL_PACKAGES=/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/ -PYTHON_LIB=/home/fabio/miniconda3/envs/py310/lib/python3.10/ +PYTHON_LIB=/home/martin/.local/share/virtualenvs/3.13/lib/python3.13/ #java info JAVA_LOCATION=/usr/bin/java @@ -40,5 +40,4 @@ JAVA_LOCATION=/usr/bin/java #CYGWIN_CYGPATH_LOCATION=null #/usr/bin/cygpath.exe -#CYGWIN_UNIX_CYGPATH_LOCATION=null - +#CYGWIN_UNIX_CYGPATH_LOCATION=null \ No newline at end of file From 6b46803927be157467cf1d3d4ff2331288947644 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Thu, 9 Oct 2025 02:46:28 +0200 Subject: [PATCH 02/15] Add poetry install/add Adds a new preference to PydevRootPrefs POETRY_BIN (path to poetry) New menu container for poetry - Install, installs using poetry - Add, adds a package using poetry --- plugins/org.python.pydev.poetry/.classpath | 11 ++ plugins/org.python.pydev.poetry/.gitignore | 1 + plugins/org.python.pydev.poetry/.project | 34 +++++ .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 9 ++ .../.settings/org.eclipse.m2e.core.prefs | 4 + .../META-INF/MANIFEST.MF | 36 +++++ .../org.python.pydev.poetry/build.properties | 7 + .../icons/PythonPoetry.png | Bin 0 -> 16497 bytes .../icons/PythonPoetry.svg | 42 ++++++ plugins/org.python.pydev.poetry/plugin.xml | 35 +++++ plugins/org.python.pydev.poetry/pom.xml | 24 +++ .../org/python/pydev/poetry/PoetryPlugin.java | 48 ++++++ .../pydev/poetry/ui/actions/PoetryAction.java | 121 +++++++++++++++ .../ui/actions/project/PoetryAddAction.java | 57 +++++++ .../actions/project/PoetryInstallAction.java | 142 ++++++++++++++++++ .../preferences/PydevPrefsInitializer.java | 1 + .../plugin/preferences/PydevRootPrefs.java | 21 +++ pom.xml | 1 + 19 files changed, 596 insertions(+) create mode 100644 plugins/org.python.pydev.poetry/.classpath create mode 100644 plugins/org.python.pydev.poetry/.gitignore create mode 100644 plugins/org.python.pydev.poetry/.project create mode 100644 plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs create mode 100644 plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs create mode 100644 plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs create mode 100644 plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF create mode 100644 plugins/org.python.pydev.poetry/build.properties create mode 100644 plugins/org.python.pydev.poetry/icons/PythonPoetry.png create mode 100644 plugins/org.python.pydev.poetry/icons/PythonPoetry.svg create mode 100644 plugins/org.python.pydev.poetry/plugin.xml create mode 100644 plugins/org.python.pydev.poetry/pom.xml create mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java create mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java create mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryAddAction.java create mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryInstallAction.java diff --git a/plugins/org.python.pydev.poetry/.classpath b/plugins/org.python.pydev.poetry/.classpath new file mode 100644 index 0000000000..3628e33687 --- /dev/null +++ b/plugins/org.python.pydev.poetry/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/plugins/org.python.pydev.poetry/.gitignore b/plugins/org.python.pydev.poetry/.gitignore new file mode 100644 index 0000000000..eabfc6514f --- /dev/null +++ b/plugins/org.python.pydev.poetry/.gitignore @@ -0,0 +1 @@ +pydev_poetry.jar diff --git a/plugins/org.python.pydev.poetry/.project b/plugins/org.python.pydev.poetry/.project new file mode 100644 index 0000000000..49a6cfdb4a --- /dev/null +++ b/plugins/org.python.pydev.poetry/.project @@ -0,0 +1,34 @@ + + + org.python.pydev.poetry + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs b/plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..99f26c0203 --- /dev/null +++ b/plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs b/plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..62ef3488cc --- /dev/null +++ b/plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs b/plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000000..f897a7f1cb --- /dev/null +++ b/plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF b/plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..8ef4d9a5f1 --- /dev/null +++ b/plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF @@ -0,0 +1,36 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: PyPdev Poetry +Bundle-SymbolicName: org.python.pydev.poetry;singleton:=true +Bundle-Version: 13.1.0.qualifier +Bundle-Vendor: Brainwy Software Ltda +Bundle-Activator: org.python.pydev.poetry.PoetryPlugin +Eclipse-BundleShape: dir +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + org.eclipse.jface.text, + org.python.pydev;bundle-version="[13.1.0,13.1.1)", + org.python.pydev.core;bundle-version="[13.1.0,13.1.1)", + org.junit;bundle-version="4.0";resolution:=optional, + org.python.pydev.ast;bundle-version="[13.1.0,13.1.1)", + org.python.pydev.parser;bundle-version="[13.1.0,13.1.1)", + org.eclipse.ui.editors, + org.eclipse.ui.workbench.texteditor, + org.eclipse.core.resources, + org.eclipse.core.variables, + org.eclipse.debug.core, + org.eclipse.debug.ui, + org.python.pydev.debug;bundle-version="[13.1.0,13.1.1)", + org.eclipse.ui.console, + org.eclipse.ui, + org.python.pydev.jython;bundle-version="[13.1.0,13.1.1)", + org.eclipse.search, + org.eclipse.ui.ide, + org.python.pydev.customizations;bundle-version="[13.1.0,13.1.1)", + org.eclipse.core.expressions, + org.python.pydev.shared_ui;bundle-version="[13.1.0,13.1.1)", + org.python.pydev.shared_interactive_console;bundle-version="[13.1.0,13.1.1)" +Bundle-ActivationPolicy: lazy +Bundle-ClassPath: pydev_poetry.jar +Bundle-RequiredExecutionEnvironment: JavaSE-17 +Automatic-Module-Name: org.python.pydev.poetry diff --git a/plugins/org.python.pydev.poetry/build.properties b/plugins/org.python.pydev.poetry/build.properties new file mode 100644 index 0000000000..46727c0874 --- /dev/null +++ b/plugins/org.python.pydev.poetry/build.properties @@ -0,0 +1,7 @@ +bin.includes = META-INF/,\ + pydev_poetry.jar,\ + plugin.xml,\ + icons/ + jars.compile.order = pydev_poetry.jar +source.pydev_poetry.jar = src/ +output.pydev_poetry.jar = bin/ diff --git a/plugins/org.python.pydev.poetry/icons/PythonPoetry.png b/plugins/org.python.pydev.poetry/icons/PythonPoetry.png new file mode 100644 index 0000000000000000000000000000000000000000..c22e6fbbc977fabb9c1a87c7939b1b486493aae0 GIT binary patch literal 16497 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 literal 0 HcmV?d00001 diff --git a/plugins/org.python.pydev.poetry/icons/PythonPoetry.svg b/plugins/org.python.pydev.poetry/icons/PythonPoetry.svg new file mode 100644 index 0000000000..2dfd64b6ea --- /dev/null +++ b/plugins/org.python.pydev.poetry/icons/PythonPoetry.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/org.python.pydev.poetry/plugin.xml b/plugins/org.python.pydev.poetry/plugin.xml new file mode 100644 index 0000000000..4e675b1952 --- /dev/null +++ b/plugins/org.python.pydev.poetry/plugin.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + diff --git a/plugins/org.python.pydev.poetry/pom.xml b/plugins/org.python.pydev.poetry/pom.xml new file mode 100644 index 0000000000..ae91729231 --- /dev/null +++ b/plugins/org.python.pydev.poetry/pom.xml @@ -0,0 +1,24 @@ + + + + 4.0.0 + + org.python.pydev + plugins + 13.1.0-SNAPSHOT + ../pom.xml + + org.python.pydev.poetry + eclipse-plugin + diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java new file mode 100644 index 0000000000..b175e29c0f --- /dev/null +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java @@ -0,0 +1,48 @@ +package org.python.pydev.poetry; + +import org.eclipse.core.runtime.Plugin; +import org.osgi.framework.BundleContext; + +public class PoetryPlugin extends Plugin { + + private static PoetryPlugin plugin; + + /** + * The constructor. + */ + public PoetryPlugin() { + plugin = this; + } + + /** + * This method is called when the plug-in is stopped + */ + @Override + public void stop(BundleContext context) throws Exception { + super.stop(context); + plugin = null; + } + + /** + * Returns the shared instance. + */ + public static PoetryPlugin getDefault() { + return plugin; + } + + /** + * Returns an image descriptor for the image file at the given plug-in relative + * path. + * + * @param path the path + * @return the image descriptor + */ +// public static ImageDescriptor getImageDescriptor(String path) { +// return AbstractUIPlugin.imageDescriptorFromPlugin("org.python.pydev.django", path); +// } + + public static String getPluginID() { + return getDefault().getBundle().getSymbolicName(); + } + +} diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java new file mode 100644 index 0000000000..f5e8416d7c --- /dev/null +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java @@ -0,0 +1,121 @@ +/** + * + */ +package org.python.pydev.poetry.ui.actions; + +import java.io.IOException; +import java.util.ArrayList; + +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.swt.widgets.Shell; +import org.python.pydev.plugin.PydevPlugin; +import org.python.pydev.plugin.preferences.PydevRootPrefs; +import org.python.pydev.shared_ui.utils.UIUtils; + +/** + * Run a poetry command and return the result. Uses a process builder to execute + * a command using poetry as the executable. + */ +public class PoetryAction { + public enum Commands { + INSTALL("install"), ENV("env"), LOCK("lock"), SYNC("sync"), UPDATE("update"); + + private String command; + + private Commands(String command) { + this.command = command; + } + + public String command() { + return this.command; + } + } + + private String errorTitle; + private String errorMsg; + private String projectRoot; + private String pythonPath; + public Boolean OK = true; + public String poetryBin; + + /** + * + * @param projectRoot The path to the directory containing pyproject.toml + */ + public PoetryAction(String projectRoot) { + poetryBin = PydevPlugin.getDefault().getPreferenceStore().getString(PydevRootPrefs.POETRY_BIN); + if (poetryBin == null) { + errorTitle = "Poetry not configured"; + errorMsg = "The path to poetry could not be found.\n"; + errorMsg += "Please configure the poetry in"; + OK = false; + } + this.projectRoot = projectRoot; + } + + private Boolean checkError() { + if (errorMsg != null) { + Shell shell = UIUtils.getActiveShell(); + MessageDialog.openError(shell, errorTitle, errorMsg); + return false; + } + return true; + } + + /** + * Returns the path to the python executable of a pyproject virtual environment. + * + * @return the path to python + */ + public String getPython() { + if (pythonPath == null) { + String[] args = { Commands.ENV.command(), "info", "-e" }; + pythonPath = runCommand(args); + } + return pythonPath; + } + + /** + * Install the project + * + * @return result of `poetry install` + */ + public String install() { + return runCommand(new String[] { Commands.INSTALL.command() }); + } + + /** + * Returns the output of running `poetry args...` + * + * @param args List of arguments to pass to poetry e.g. "[poetry] env info" + * @return The command output + */ + public String runCommand(String[] args) { + String output = null; + Boolean ok = checkError(); + if (!ok) { + return output; + } + + ArrayList poetryArgs = new ArrayList(); + poetryArgs.add(poetryBin); + + for (String a : args) { + poetryArgs.add(a); + } + poetryArgs.add("-C"); + poetryArgs.add(projectRoot); + + ProcessBuilder pb = new ProcessBuilder(poetryArgs); + Process p; + try { + p = pb.start(); + output = new String(p.getInputStream().readAllBytes()).strip(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return output; + } + +} diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryAddAction.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryAddAction.java new file mode 100644 index 0000000000..57547b64bf --- /dev/null +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryAddAction.java @@ -0,0 +1,57 @@ +/** + * + */ +package org.python.pydev.poetry.ui.actions.project; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.window.Window; +import org.python.pydev.poetry.ui.actions.PoetryAction; +import org.python.pydev.shared_ui.EditorUtils; +import org.python.pydev.ui.actions.container.PyContainerAction; + +/** + * + */ +public class PoetryAddAction extends PyContainerAction { + private IProject project; + + @Override + protected boolean confirmRun() { + return true; + } + + @Override + protected void afterRun(int resourcesAffected) { + } + + @Override + protected boolean needsUIThread() { + return true; + } + + @Override + protected int doActionOnContainer(IContainer container, IProgressMonitor monitor) { + monitor.beginTask("Installing python package...", 100); + monitor.worked(50); + project = container.getProject(); + InputDialog dialog = new InputDialog(EditorUtils.getShell(), "App to install", + "Name of the python App to install", null, null); + int open = dialog.open(); + if (open != Window.OK) { + return -1; + } + String appName = dialog.getValue(); + System.out.println("App to install: " + appName); + PoetryAction poetry = new PoetryAction(project.getLocation().toString()); + String result = poetry.runCommand(new String[] { "add", appName }); + if (!result.contains(appName)) { + System.out.println("Could not install " + appName + ".\nOutput: " + result); + } + monitor.worked(100); + monitor.done(); + return 0; + } +} diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryInstallAction.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryInstallAction.java new file mode 100644 index 0000000000..ab9211360d --- /dev/null +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryInstallAction.java @@ -0,0 +1,142 @@ +package org.python.pydev.poetry.ui.actions.project; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectNature; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.jface.dialogs.MessageDialog; +import org.python.pydev.ast.interpreter_managers.InterpreterManagersAPI; +import org.python.pydev.core.IInterpreterInfo; +import org.python.pydev.core.IInterpreterManager; +import org.python.pydev.core.MisconfigurationException; +import org.python.pydev.core.PythonNatureWithoutProjectException; +import org.python.pydev.plugin.nature.PythonNature; +import org.python.pydev.poetry.ui.actions.PoetryAction; +import org.python.pydev.shared_ui.EditorUtils; +import org.python.pydev.ui.actions.container.PyContainerAction; + +public class PoetryInstallAction extends PyContainerAction { + private IPath absPath; + private IProject project; + private String pythonBin; + + @Override + protected boolean confirmRun() { + return true; + } + + @Override + protected void afterRun(int resourcesAffected) { + } + + @Override + protected boolean needsUIThread() { + return true; + } + + @Override + protected int doActionOnContainer(IContainer container, IProgressMonitor monitor) { + monitor.beginTask("Installing project with poetry...", 100); + MessageDialog confirm = new MessageDialog(EditorUtils.getShell(), "Install using poetry", null, + "This will install using...", MessageDialog.QUESTION_WITH_CANCEL, 0, new String[] { "OK", "Cancel" }); + confirm.open(); + if (confirm.getReturnCode() == 1) { + return 0; + } + project = container.getProject(); + absPath = project.getLocation(); + PoetryAction poetry = new PoetryAction(absPath.toString()); + String result = poetry.install(); + monitor.worked(50); + System.out.println("Result: " + result); + pythonBin = poetry.getPython(); + System.out.println("Python found at: " + pythonBin); + PythonNature nature = getNature(); + if (nature == null) { + // This should never happen + } else { + System.out.println("Nature: " + nature); + setInterpreter(nature); + } + monitor.done(); + return 0; + } + + private PythonNature getNature() { + IProjectNature nature; + try { + nature = project.getNature(PythonNature.PYTHON_NATURE_ID); + return (PythonNature) nature; + } catch (CoreException e) { + return null; + } + } + + private void setInterpreter(PythonNature nature) { + IInterpreterInfo interpreter; + try { + interpreter = nature.getProjectInterpreter(); + String name = interpreter.getName(); + System.out.println("Name: " + name); + } catch (MisconfigurationException e) { + String missingInterpeter = "Interpreter: " + project.getName() + " not found"; + if (Objects.equals("Python not configured.", e.getMessage())) { + System.out.println("Misconfiguration error, no interpreters configured."); + setDefaultInterpreter(nature); + } else if (Objects.equals(missingInterpeter, e.getMessage().toString())) { + System.out.println("Misconfiguration error, project interpreter not configured."); + updateInterpererInfo(nature); + } else { + System.out.println("Unknown error: Message: " + e.getMessage()); + e.printStackTrace(); + } + } catch (PythonNatureWithoutProjectException e1) { + System.out.println("No project nature."); + e1.printStackTrace(); + } + } + + private void setDefaultInterpreter(PythonNature nature) { + System.out.println("Setting default interpreter."); + IInterpreterManager pythonInterpreterManager = InterpreterManagersAPI.getPythonInterpreterManager(); + IInterpreterInfo projectInterpreter = pythonInterpreterManager.createInterpreterInfo(pythonBin, + new NullProgressMonitor(), false); + projectInterpreter.setName(project.getName()); + pythonInterpreterManager.setInfos(new IInterpreterInfo[] { projectInterpreter }, null, + new NullProgressMonitor()); + System.out.println("Configured!"); + try { + nature.setVersion(PythonNature.PYTHON_VERSION_INTERPRETER, project.getName()); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void updateInterpererInfo(PythonNature nature) { + IInterpreterManager pythonInterpreterManager = InterpreterManagersAPI.getPythonInterpreterManager(); + IInterpreterInfo[] infos = pythonInterpreterManager.getInterpreterInfos(); + IInterpreterInfo projectInterpreter = pythonInterpreterManager.createInterpreterInfo(pythonBin, + new NullProgressMonitor(), false); + projectInterpreter.setName(project.getName()); + Set existing = new HashSet(); + ArrayList newInfos = new ArrayList(); + for (IInterpreterInfo info : infos) { + existing.add(info.getName()); + newInfos.add(info); + } + newInfos.add(projectInterpreter); + pythonInterpreterManager.setInfos(newInfos.toArray(new IInterpreterInfo[newInfos.size()]), existing, + new NullProgressMonitor()); + + } + +} diff --git a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java index 6bace53f07..23c12608a8 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java +++ b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java @@ -291,6 +291,7 @@ public void initializeDefaultPreferences() { //root node.putBoolean(PydevRootPrefs.CHECK_PREFERRED_PYDEV_SETTINGS, PydevRootPrefs.DEFAULT_CHECK_PREFERRED_PYDEV_SETTINGS); + node.put(PydevRootPrefs.POETRY_BIN, PydevRootPrefs.getDefaultPoetryBinPreference()); } diff --git a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java index b8ace46ad6..7651eb5c6d 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java +++ b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java @@ -8,6 +8,7 @@ import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.FileFieldEditor; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Composite; @@ -17,6 +18,7 @@ import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.preferences.CheckDefaultPreferencesDialog.CheckInfo; import org.python.pydev.shared_core.string.StringUtils; +import org.python.pydev.shared_core.utils.PlatformUtils; import org.python.pydev.shared_ui.dialogs.DialogHelpers; import org.python.pydev.shared_ui.field_editors.ButtonFieldEditor; @@ -24,6 +26,7 @@ public class PydevRootPrefs extends FieldEditorPreferencePage implements IWorkbe public static final String CHECK_PREFERRED_PYDEV_SETTINGS = "CHECK_PREFERRED_PYDEV_SETTINGS"; public static final boolean DEFAULT_CHECK_PREFERRED_PYDEV_SETTINGS = true; + public static final String POETRY_BIN = "POETRY_BIN"; public PydevRootPrefs() { setDescription(StringUtils.format("PyDev version: %s", @@ -63,6 +66,7 @@ public void widgetSelected(SelectionEvent e) { public void widgetDefaultSelected(SelectionEvent e) { } })); + addField(new FileFieldEditor(POETRY_BIN, "\nPoetry path", p)); } public static void setCheckPreferredPydevSettings(boolean b) { @@ -73,4 +77,21 @@ public static boolean getCheckPreferredPydevSettings() { return PydevPlugin.getDefault().getPreferenceStore().getBoolean(CHECK_PREFERRED_PYDEV_SETTINGS); } + /** + * Gets the default poetry install location. + * + * @return The path to the poetry bin + */ + public static String getDefaultPoetryBinPreference() { + String path; + if (PlatformUtils.isWindowsPlatform()) { + path = System.getenv("APPDATA") + "\\poetry"; + } else if (PlatformUtils.isMacOsPlatform()) { + path = System.getenv("HOME") + "/Library/Application Support/pypoetry"; + } else { + path = System.getenv("HOME") + "/.local/share/pypoetry/venv/bin/poetry"; + } + return path; + } + } diff --git a/pom.xml b/pom.xml index d21754c35d..734eb68bb0 100644 --- a/pom.xml +++ b/pom.xml @@ -177,6 +177,7 @@ org.python.pydev.help org.python.pydev.jython org.python.pydev.parser + org.python.pydev.poetry org.python.pydev.refactoring org.python.pydev.shared_core org.python.pydev.shared_interactive_console From 0af39eae6aa71226c4ba36250e96a7cd6e753e20 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Thu, 9 Oct 2025 03:39:39 +0200 Subject: [PATCH 03/15] Adds lock/sync Implements 'poetry lock' and 'poetry sync' --- plugins/org.python.pydev.poetry/plugin.xml | 20 ++++++- .../pydev/poetry/ui/actions/PoetryAction.java | 8 +++ .../poetry/ui/actions/project/PoetryLock.java | 49 +++++++++++++++++ .../poetry/ui/actions/project/PoetrySync.java | 52 +++++++++++++++++++ 4 files changed, 127 insertions(+), 2 deletions(-) create mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java create mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java diff --git a/plugins/org.python.pydev.poetry/plugin.xml b/plugins/org.python.pydev.poetry/plugin.xml index 4e675b1952..6dbb59ae35 100644 --- a/plugins/org.python.pydev.poetry/plugin.xml +++ b/plugins/org.python.pydev.poetry/plugin.xml @@ -17,7 +17,23 @@ id="org.python.pydev.poetry.ui.actions.project.poetryInstallAction" label="Poetry install" menubarPath="org.python.pydev.poetry.ui.poetry.menu/misc" - tooltip="Install using poetry"> + tooltip="Installs the project dependencies"> + + + + + tooltip="Adds a new dependency to pyproject.toml and installs it"> diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java index f5e8416d7c..b1ca833eb3 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java @@ -84,6 +84,14 @@ public String install() { return runCommand(new String[] { Commands.INSTALL.command() }); } + public String sync() { + return runCommand(new String[] { Commands.SYNC.command() }); + } + + public String lock() { + return runCommand(new String[] { Commands.LOCK.command() }); + } + /** * Returns the output of running `poetry args...` * diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java new file mode 100644 index 0000000000..11b8a01c03 --- /dev/null +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java @@ -0,0 +1,49 @@ +package org.python.pydev.poetry.ui.actions.project; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.python.pydev.poetry.ui.actions.PoetryAction; +import org.python.pydev.ui.actions.container.PyContainerAction; + +public class PoetryLock extends PyContainerAction { + + @Override + protected boolean confirmRun() { + // TODO Auto-generated method stub + return true; + } + + @Override + protected void afterRun(int resourcesAffected) { + // TODO Auto-generated method stub + + } + + @Override + protected int doActionOnContainer(IContainer container, IProgressMonitor monitor) { + monitor.beginTask("Locking project dependencies...", 100); + monitor.worked(1); + if (monitor.isCanceled()) { + return 0; + } + + IProject project = container.getProject(); + IPath absPath = project.getLocation(); + PoetryAction poetry = new PoetryAction(absPath.toString()); + poetry.lock(); + monitor.worked(50); + monitor.done(); + try { + project.refreshLocal(1, monitor); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + monitor.worked(100); + return 0; + } + +} diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java new file mode 100644 index 0000000000..86c558a580 --- /dev/null +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java @@ -0,0 +1,52 @@ +package org.python.pydev.poetry.ui.actions.project; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.python.pydev.poetry.ui.actions.PoetryAction; +import org.python.pydev.ui.actions.container.PyContainerAction; + +public class PoetrySync extends PyContainerAction { + private IPath absPath; + private IProject project; + + @Override + protected boolean confirmRun() { + return true; + } + + @Override + protected void afterRun(int resourcesAffected) { + } + + @Override + protected boolean needsUIThread() { + return true; + } + + @Override + protected int doActionOnContainer(IContainer container, IProgressMonitor monitor) { + monitor.beginTask("Syncronising project dependencies...", 100); + monitor.worked(1); + if (monitor.isCanceled()) { + return 0; + } + + project = container.getProject(); + absPath = project.getLocation(); + PoetryAction poetry = new PoetryAction(absPath.toString()); + poetry.sync(); + monitor.worked(50); + monitor.done(); + try { + project.refreshLocal(1, monitor); + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + monitor.worked(100); + return 0; + } +} From 9069d4f12dc7a7d69c5302eb4563fa26b3ba1ffe Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Thu, 9 Oct 2025 07:30:51 +0200 Subject: [PATCH 04/15] Fixes for monitor progress --- .../org/python/pydev/poetry/ui/actions/project/PoetryLock.java | 2 +- .../org/python/pydev/poetry/ui/actions/project/PoetrySync.java | 2 +- .../python/pydev/plugin/preferences/PydevPrefsInitializer.java | 2 +- .../src/org/python/pydev/plugin/preferences/PydevRootPrefs.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java index 11b8a01c03..93f7d258be 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java @@ -35,7 +35,6 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor PoetryAction poetry = new PoetryAction(absPath.toString()); poetry.lock(); monitor.worked(50); - monitor.done(); try { project.refreshLocal(1, monitor); } catch (CoreException e) { @@ -43,6 +42,7 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor e.printStackTrace(); } monitor.worked(100); + monitor.done(); return 0; } diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java index 86c558a580..8909ab7c2b 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java @@ -39,7 +39,6 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor PoetryAction poetry = new PoetryAction(absPath.toString()); poetry.sync(); monitor.worked(50); - monitor.done(); try { project.refreshLocal(1, monitor); } catch (CoreException e) { @@ -47,6 +46,7 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor e.printStackTrace(); } monitor.worked(100); + monitor.done(); return 0; } } diff --git a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java index 23c12608a8..9786de480c 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java +++ b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java @@ -37,7 +37,7 @@ public void initializeDefaultPreferences() { Preferences node = DefaultScope.INSTANCE.getNode(SharedCorePlugin.DEFAULT_PYDEV_PREFERENCES_SCOPE); node.putInt(IWizardNewProjectNameAndLocationPage.PYDEV_NEW_PROJECT_CREATE_PREFERENCES, - IWizardNewProjectNameAndLocationPage.PYDEV_NEW_PROJECT_CREATE_PROJECT_AS_SRC_FOLDER); + IWizardNewProjectNameAndLocationPage.PYDEV_NEW_PROJECT_CREATE_SRC_FOLDER); //comment blocks node.put(CommentBlocksPreferences.MULTI_BLOCK_COMMENT_CHAR, diff --git a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java index 7651eb5c6d..a20c002ae5 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java +++ b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java @@ -66,7 +66,7 @@ public void widgetSelected(SelectionEvent e) { public void widgetDefaultSelected(SelectionEvent e) { } })); - addField(new FileFieldEditor(POETRY_BIN, "\nPoetry path", p)); + addField(new FileFieldEditor(POETRY_BIN, "Poetry path", p)); } public static void setCheckPreferredPydevSettings(boolean b) { From fad96996b2e4d757aa6e920ede9565051c52a1ff Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Fri, 10 Oct 2025 21:23:32 +0200 Subject: [PATCH 05/15] Moved poetry package Split base component to org.python.pydev.core and ui actions to org.python.pydev.plugin --- .../META-INF/MANIFEST.MF | 1 + .../package_manager/BasePackageManager.java | 129 ++++++++++++++++++ .../package_manager/PoetryPackageManager.java | 62 +++++++++ plugins/org.python.pydev.poetry/pom.xml | 1 + .../pydev/poetry/ui/actions/PoetryAction.java | 4 +- plugins/org.python.pydev/plugin.xml | 46 +++++++ .../ui/actions/project/PoetryAddAction.java | 14 +- .../actions/project/PoetryInstallAction.java | 34 ++--- .../pydev}/ui/actions/project/PoetryLock.java | 11 +- .../pydev}/ui/actions/project/PoetrySync.java | 11 +- pom.xml | 1 - 11 files changed, 277 insertions(+), 37 deletions(-) create mode 100644 plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java create mode 100644 plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java rename plugins/{org.python.pydev.poetry/src/org/python/pydev/poetry => org.python.pydev/src/org/python/pydev}/ui/actions/project/PoetryAddAction.java (73%) rename plugins/{org.python.pydev.poetry/src/org/python/pydev/poetry => org.python.pydev/src/org/python/pydev}/ui/actions/project/PoetryInstallAction.java (83%) rename plugins/{org.python.pydev.poetry/src/org/python/pydev/poetry => org.python.pydev/src/org/python/pydev}/ui/actions/project/PoetryLock.java (81%) rename plugins/{org.python.pydev.poetry/src/org/python/pydev/poetry => org.python.pydev/src/org/python/pydev}/ui/actions/project/PoetrySync.java (82%) diff --git a/plugins/org.python.pydev.core/META-INF/MANIFEST.MF b/plugins/org.python.pydev.core/META-INF/MANIFEST.MF index 2f2baea0c7..6650905252 100644 --- a/plugins/org.python.pydev.core/META-INF/MANIFEST.MF +++ b/plugins/org.python.pydev.core/META-INF/MANIFEST.MF @@ -34,6 +34,7 @@ Export-Package: org.python.copiedfromeclipsesrc, org.python.pydev.core.log, org.python.pydev.core.logging, org.python.pydev.core.nature, + org.python.pydev.core.package_manager, org.python.pydev.core.parser, org.python.pydev.core.partition, org.python.pydev.core.performanceeval, diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java new file mode 100644 index 0000000000..cf3b126dea --- /dev/null +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java @@ -0,0 +1,129 @@ +/** + * Base package manager + * + * Using either poetry or uv, manage the commands available to apply to a project. + * + * @author Martin Whitehouse + */ +package org.python.pydev.core.package_manager; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +import org.eclipse.core.runtime.Platform; +import org.python.pydev.core.log.Log; + +/** + * Using ProcessBuilder, runs the commands to achieve e.g. `poetry install + * package_name`. + */ +abstract public class BasePackageManager { + public enum Commands { + INSTALL("install"), ENV("env"), LOCK("lock"), SYNC("sync"), UPDATE("update"); + + private String command; + + private Commands(String command) { + this.command = command; + } + + public String command() { + return this.command; + } + } + + /** + * Argument to use for changing to the project directory. + */ + private String chDirArg; + + /** + * Name of the task + */ + protected String taskName; + + /** + * Path to the project directory + */ + private String projectRoot; + + /** + * Path to the binary + */ + private String binPath; + + /** + * Title to use when binary can't be found. + */ + private String errorTitle; + /** + * Message to display. + */ + private String errorMsg; + + public BasePackageManager(String projectRoot, String name, String prefsName, String chDirAarg) { + this.projectRoot = projectRoot; + this.chDirArg = chDirAarg; + binPath = Platform.getPreferencesService().getString("org.python.pydev", prefsName, null, null); + File f = null; + if (binPath != null) { + f = new File(binPath); + } + if (binPath == null | !(f != null && f.exists() && !f.isDirectory())) { + errorTitle = name + " not configured"; + errorMsg = "The path to " + name + "could not be found.\n"; + errorMsg += "Please configure the path to " + name; + } + } + + private Boolean checkError() { + if (errorMsg != null) { + Log.log(errorTitle + "\n" + errorMsg); + // Shell shell = UIUtils.getActiveShell(); + // MessageDialog.openError(shell, errorTitle, errorMsg); + return false; + } + return true; + } + + abstract protected ArrayList getCommandArgs(String args); + + abstract protected ArrayList getCommandArgs(String[] args); + + /** + * Returns the output of running `poetry args...` + * + * @param args List of arguments to pass to binPath e.g. "[poetry] env info" + * @return The command output + */ + public String runCommand(ArrayList args) { + String output = null; + if (!checkError()) { + return output; + } + ArrayList commandArgs = new ArrayList(); + + commandArgs.add(binPath); + commandArgs.add(chDirArg); + commandArgs.add(projectRoot); + + for (String arg : args) { + commandArgs.add(arg); + } + + ProcessBuilder pb = new ProcessBuilder(commandArgs); + Process p; + + try { + p = pb.start(); + output = new String(p.getInputStream().readAllBytes()).strip(); + } catch (IOException e) { + // TODO Auto-generated catch block + Log.log(e); + } + + return output; + } + +} diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java new file mode 100644 index 0000000000..ad08b67240 --- /dev/null +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java @@ -0,0 +1,62 @@ +package org.python.pydev.core.package_manager; + +import java.util.ArrayList; + +public class PoetryPackageManager extends BasePackageManager { + final private static String PREFS_NAME = "POETRY_BIN"; + private String pythonPath; + + public PoetryPackageManager(String projectRoot) { + super(projectRoot, "poetry", PREFS_NAME, "-C"); + } + + @Override + protected ArrayList getCommandArgs(String args) { + ArrayList parsedArgs = new ArrayList(); + parsedArgs.add(args); + return parsedArgs; + } + + @Override + protected ArrayList getCommandArgs(String[] args) { + ArrayList parsedArgs = new ArrayList(); + for (String arg : args) { + parsedArgs.add(arg); + } + return parsedArgs; + } + + public String install() { + return runCommand(getCommandArgs("install")); + } + + public String add(String appName) { + ArrayList args = getCommandArgs("add"); + String[] apps = appName.split(" "); + for (String app : apps) { + args.add(app); + } + return runCommand(args); + } + + public String lock() { + return runCommand(getCommandArgs("lock")); + } + + public String sync() { + return runCommand(getCommandArgs("sync")); + } + + /** + * Returns the path to the python executable of a pyproject virtual environment. + * + * @return the path to python + */ + public String getPython() { + if (pythonPath == null) { + pythonPath = runCommand(getCommandArgs(new String[] { "env", "info", "-e" })); + } + return pythonPath; + } + +} diff --git a/plugins/org.python.pydev.poetry/pom.xml b/plugins/org.python.pydev.poetry/pom.xml index ae91729231..f24d340347 100644 --- a/plugins/org.python.pydev.poetry/pom.xml +++ b/plugins/org.python.pydev.poetry/pom.xml @@ -19,6 +19,7 @@ 13.1.0-SNAPSHOT ../pom.xml + org.python.pydev org.python.pydev.poetry eclipse-plugin diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java index b1ca833eb3..16819a8e47 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java +++ b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java @@ -3,6 +3,7 @@ */ package org.python.pydev.poetry.ui.actions; +import java.io.File; import java.io.IOException; import java.util.ArrayList; @@ -44,7 +45,8 @@ public String command() { */ public PoetryAction(String projectRoot) { poetryBin = PydevPlugin.getDefault().getPreferenceStore().getString(PydevRootPrefs.POETRY_BIN); - if (poetryBin == null) { + File f = new File(poetryBin); + if (poetryBin == null | !(f.exists() && !f.isDirectory())) { errorTitle = "Poetry not configured"; errorMsg = "The path to poetry could not be found.\n"; errorMsg += "Please configure the poetry in"; diff --git a/plugins/org.python.pydev/plugin.xml b/plugins/org.python.pydev/plugin.xml index a8542c58db..1a0dd1ed5e 100644 --- a/plugins/org.python.pydev/plugin.xml +++ b/plugins/org.python.pydev/plugin.xml @@ -121,6 +121,52 @@ + + + + + + + + + + + + + + + + + + diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryAddAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAddAction.java similarity index 73% rename from plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryAddAction.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAddAction.java index 57547b64bf..cb19d03d90 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryAddAction.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAddAction.java @@ -1,14 +1,14 @@ /** * */ -package org.python.pydev.poetry.ui.actions.project; +package org.python.pydev.ui.actions.project; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.window.Window; -import org.python.pydev.poetry.ui.actions.PoetryAction; +import org.python.pydev.core.package_manager.PoetryPackageManager; import org.python.pydev.shared_ui.EditorUtils; import org.python.pydev.ui.actions.container.PyContainerAction; @@ -37,6 +37,9 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor monitor.beginTask("Installing python package...", 100); monitor.worked(50); project = container.getProject(); + String path = project.getLocation().toString(); + PoetryPackageManager pm = new PoetryPackageManager(path); +// pm.Commands; InputDialog dialog = new InputDialog(EditorUtils.getShell(), "App to install", "Name of the python App to install", null, null); int open = dialog.open(); @@ -44,12 +47,7 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor return -1; } String appName = dialog.getValue(); - System.out.println("App to install: " + appName); - PoetryAction poetry = new PoetryAction(project.getLocation().toString()); - String result = poetry.runCommand(new String[] { "add", appName }); - if (!result.contains(appName)) { - System.out.println("Could not install " + appName + ".\nOutput: " + result); - } + pm.add(appName); monitor.worked(100); monitor.done(); return 0; diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryInstallAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstallAction.java similarity index 83% rename from plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryInstallAction.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstallAction.java index ab9211360d..40d56e2ae2 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryInstallAction.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstallAction.java @@ -1,4 +1,4 @@ -package org.python.pydev.poetry.ui.actions.project; +package org.python.pydev.ui.actions.project; import java.util.ArrayList; import java.util.HashSet; @@ -18,8 +18,9 @@ import org.python.pydev.core.IInterpreterManager; import org.python.pydev.core.MisconfigurationException; import org.python.pydev.core.PythonNatureWithoutProjectException; +import org.python.pydev.core.log.Log; +import org.python.pydev.core.package_manager.PoetryPackageManager; import org.python.pydev.plugin.nature.PythonNature; -import org.python.pydev.poetry.ui.actions.PoetryAction; import org.python.pydev.shared_ui.EditorUtils; import org.python.pydev.ui.actions.container.PyContainerAction; @@ -53,17 +54,16 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor } project = container.getProject(); absPath = project.getLocation(); - PoetryAction poetry = new PoetryAction(absPath.toString()); - String result = poetry.install(); + PoetryPackageManager pm = new PoetryPackageManager(absPath.toString()); + String result = pm.install(); monitor.worked(50); - System.out.println("Result: " + result); - pythonBin = poetry.getPython(); - System.out.println("Python found at: " + pythonBin); + Log.logInfo("Result: " + result); + pythonBin = pm.getPython(); + Log.logInfo("Python found at: " + pythonBin); PythonNature nature = getNature(); if (nature == null) { // This should never happen } else { - System.out.println("Nature: " + nature); setInterpreter(nature); } monitor.done(); @@ -85,34 +85,34 @@ private void setInterpreter(PythonNature nature) { try { interpreter = nature.getProjectInterpreter(); String name = interpreter.getName(); - System.out.println("Name: " + name); + Log.logInfo("Name: " + name); } catch (MisconfigurationException e) { String missingInterpeter = "Interpreter: " + project.getName() + " not found"; if (Objects.equals("Python not configured.", e.getMessage())) { - System.out.println("Misconfiguration error, no interpreters configured."); + Log.logInfo("Misconfiguration error, no interpreters configured."); setDefaultInterpreter(nature); } else if (Objects.equals(missingInterpeter, e.getMessage().toString())) { - System.out.println("Misconfiguration error, project interpreter not configured."); + Log.logInfo("Misconfiguration error, project interpreter not configured."); updateInterpererInfo(nature); } else { - System.out.println("Unknown error: Message: " + e.getMessage()); - e.printStackTrace(); + Log.logInfo("Unknown error: Message: " + e.getMessage()); + Log.log(e); } } catch (PythonNatureWithoutProjectException e1) { - System.out.println("No project nature."); - e1.printStackTrace(); + Log.logInfo("No project nature."); + Log.log(e1); } } private void setDefaultInterpreter(PythonNature nature) { - System.out.println("Setting default interpreter."); + Log.logInfo("Setting default interpreter."); IInterpreterManager pythonInterpreterManager = InterpreterManagersAPI.getPythonInterpreterManager(); IInterpreterInfo projectInterpreter = pythonInterpreterManager.createInterpreterInfo(pythonBin, new NullProgressMonitor(), false); projectInterpreter.setName(project.getName()); pythonInterpreterManager.setInfos(new IInterpreterInfo[] { projectInterpreter }, null, new NullProgressMonitor()); - System.out.println("Configured!"); + Log.logInfo("Configured!"); try { nature.setVersion(PythonNature.PYTHON_VERSION_INTERPRETER, project.getName()); } catch (CoreException e) { diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryLock.java similarity index 81% rename from plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryLock.java index 93f7d258be..9b948f8587 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetryLock.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryLock.java @@ -1,11 +1,12 @@ -package org.python.pydev.poetry.ui.actions.project; +package org.python.pydev.ui.actions.project; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; -import org.python.pydev.poetry.ui.actions.PoetryAction; +import org.python.pydev.core.log.Log; +import org.python.pydev.core.package_manager.PoetryPackageManager; import org.python.pydev.ui.actions.container.PyContainerAction; public class PoetryLock extends PyContainerAction { @@ -32,14 +33,14 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor IProject project = container.getProject(); IPath absPath = project.getLocation(); - PoetryAction poetry = new PoetryAction(absPath.toString()); - poetry.lock(); + PoetryPackageManager pm = new PoetryPackageManager(absPath.toString()); + pm.lock(); monitor.worked(50); try { project.refreshLocal(1, monitor); } catch (CoreException e) { // TODO Auto-generated catch block - e.printStackTrace(); + Log.log(e); } monitor.worked(100); monitor.done(); diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetrySync.java similarity index 82% rename from plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetrySync.java index 8909ab7c2b..f8baef8d65 100644 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/project/PoetrySync.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetrySync.java @@ -1,11 +1,12 @@ -package org.python.pydev.poetry.ui.actions.project; +package org.python.pydev.ui.actions.project; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; -import org.python.pydev.poetry.ui.actions.PoetryAction; +import org.python.pydev.core.log.Log; +import org.python.pydev.core.package_manager.PoetryPackageManager; import org.python.pydev.ui.actions.container.PyContainerAction; public class PoetrySync extends PyContainerAction { @@ -36,14 +37,14 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor project = container.getProject(); absPath = project.getLocation(); - PoetryAction poetry = new PoetryAction(absPath.toString()); - poetry.sync(); + PoetryPackageManager pm = new PoetryPackageManager(absPath.toString()); + pm.sync(); monitor.worked(50); try { project.refreshLocal(1, monitor); } catch (CoreException e) { // TODO Auto-generated catch block - e.printStackTrace(); + Log.log(e); } monitor.worked(100); monitor.done(); diff --git a/pom.xml b/pom.xml index 734eb68bb0..d21754c35d 100644 --- a/pom.xml +++ b/pom.xml @@ -177,7 +177,6 @@ org.python.pydev.help org.python.pydev.jython org.python.pydev.parser - org.python.pydev.poetry org.python.pydev.refactoring org.python.pydev.shared_core org.python.pydev.shared_interactive_console From 31c9b9aee92ea49de0e50d4405c2edd7f5341d68 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Fri, 10 Oct 2025 21:27:54 +0200 Subject: [PATCH 06/15] Removed original plugin --- plugins/org.python.pydev.poetry/.classpath | 11 -- plugins/org.python.pydev.poetry/.gitignore | 1 - plugins/org.python.pydev.poetry/.project | 34 ----- .../org.eclipse.core.resources.prefs | 2 - .../.settings/org.eclipse.jdt.core.prefs | 9 -- .../.settings/org.eclipse.m2e.core.prefs | 4 - .../META-INF/MANIFEST.MF | 36 ----- .../org.python.pydev.poetry/build.properties | 7 - .../icons/PythonPoetry.png | Bin 16497 -> 0 bytes .../icons/PythonPoetry.svg | 42 ------ plugins/org.python.pydev.poetry/plugin.xml | 51 ------- plugins/org.python.pydev.poetry/pom.xml | 25 ---- .../org/python/pydev/poetry/PoetryPlugin.java | 48 ------- .../pydev/poetry/ui/actions/PoetryAction.java | 131 ------------------ 14 files changed, 401 deletions(-) delete mode 100644 plugins/org.python.pydev.poetry/.classpath delete mode 100644 plugins/org.python.pydev.poetry/.gitignore delete mode 100644 plugins/org.python.pydev.poetry/.project delete mode 100644 plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs delete mode 100644 plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs delete mode 100644 plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs delete mode 100644 plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF delete mode 100644 plugins/org.python.pydev.poetry/build.properties delete mode 100644 plugins/org.python.pydev.poetry/icons/PythonPoetry.png delete mode 100644 plugins/org.python.pydev.poetry/icons/PythonPoetry.svg delete mode 100644 plugins/org.python.pydev.poetry/plugin.xml delete mode 100644 plugins/org.python.pydev.poetry/pom.xml delete mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java delete mode 100644 plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java diff --git a/plugins/org.python.pydev.poetry/.classpath b/plugins/org.python.pydev.poetry/.classpath deleted file mode 100644 index 3628e33687..0000000000 --- a/plugins/org.python.pydev.poetry/.classpath +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/plugins/org.python.pydev.poetry/.gitignore b/plugins/org.python.pydev.poetry/.gitignore deleted file mode 100644 index eabfc6514f..0000000000 --- a/plugins/org.python.pydev.poetry/.gitignore +++ /dev/null @@ -1 +0,0 @@ -pydev_poetry.jar diff --git a/plugins/org.python.pydev.poetry/.project b/plugins/org.python.pydev.poetry/.project deleted file mode 100644 index 49a6cfdb4a..0000000000 --- a/plugins/org.python.pydev.poetry/.project +++ /dev/null @@ -1,34 +0,0 @@ - - - org.python.pydev.poetry - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs b/plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 99f26c0203..0000000000 --- a/plugins/org.python.pydev.poetry/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,2 +0,0 @@ -eclipse.preferences.version=1 -encoding/=UTF-8 diff --git a/plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs b/plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 62ef3488cc..0000000000 --- a/plugins/org.python.pydev.poetry/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,9 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 -org.eclipse.jdt.core.compiler.compliance=17 -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning -org.eclipse.jdt.core.compiler.release=enabled -org.eclipse.jdt.core.compiler.source=17 diff --git a/plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs b/plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f1cb..0000000000 --- a/plugins/org.python.pydev.poetry/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF b/plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF deleted file mode 100644 index 8ef4d9a5f1..0000000000 --- a/plugins/org.python.pydev.poetry/META-INF/MANIFEST.MF +++ /dev/null @@ -1,36 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: PyPdev Poetry -Bundle-SymbolicName: org.python.pydev.poetry;singleton:=true -Bundle-Version: 13.1.0.qualifier -Bundle-Vendor: Brainwy Software Ltda -Bundle-Activator: org.python.pydev.poetry.PoetryPlugin -Eclipse-BundleShape: dir -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.jface.text, - org.python.pydev;bundle-version="[13.1.0,13.1.1)", - org.python.pydev.core;bundle-version="[13.1.0,13.1.1)", - org.junit;bundle-version="4.0";resolution:=optional, - org.python.pydev.ast;bundle-version="[13.1.0,13.1.1)", - org.python.pydev.parser;bundle-version="[13.1.0,13.1.1)", - org.eclipse.ui.editors, - org.eclipse.ui.workbench.texteditor, - org.eclipse.core.resources, - org.eclipse.core.variables, - org.eclipse.debug.core, - org.eclipse.debug.ui, - org.python.pydev.debug;bundle-version="[13.1.0,13.1.1)", - org.eclipse.ui.console, - org.eclipse.ui, - org.python.pydev.jython;bundle-version="[13.1.0,13.1.1)", - org.eclipse.search, - org.eclipse.ui.ide, - org.python.pydev.customizations;bundle-version="[13.1.0,13.1.1)", - org.eclipse.core.expressions, - org.python.pydev.shared_ui;bundle-version="[13.1.0,13.1.1)", - org.python.pydev.shared_interactive_console;bundle-version="[13.1.0,13.1.1)" -Bundle-ActivationPolicy: lazy -Bundle-ClassPath: pydev_poetry.jar -Bundle-RequiredExecutionEnvironment: JavaSE-17 -Automatic-Module-Name: org.python.pydev.poetry diff --git a/plugins/org.python.pydev.poetry/build.properties b/plugins/org.python.pydev.poetry/build.properties deleted file mode 100644 index 46727c0874..0000000000 --- a/plugins/org.python.pydev.poetry/build.properties +++ /dev/null @@ -1,7 +0,0 @@ -bin.includes = META-INF/,\ - pydev_poetry.jar,\ - plugin.xml,\ - icons/ - jars.compile.order = pydev_poetry.jar -source.pydev_poetry.jar = src/ -output.pydev_poetry.jar = bin/ diff --git a/plugins/org.python.pydev.poetry/icons/PythonPoetry.png b/plugins/org.python.pydev.poetry/icons/PythonPoetry.png deleted file mode 100644 index c22e6fbbc977fabb9c1a87c7939b1b486493aae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16497 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 diff --git a/plugins/org.python.pydev.poetry/icons/PythonPoetry.svg b/plugins/org.python.pydev.poetry/icons/PythonPoetry.svg deleted file mode 100644 index 2dfd64b6ea..0000000000 --- a/plugins/org.python.pydev.poetry/icons/PythonPoetry.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/org.python.pydev.poetry/plugin.xml b/plugins/org.python.pydev.poetry/plugin.xml deleted file mode 100644 index 6dbb59ae35..0000000000 --- a/plugins/org.python.pydev.poetry/plugin.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/org.python.pydev.poetry/pom.xml b/plugins/org.python.pydev.poetry/pom.xml deleted file mode 100644 index f24d340347..0000000000 --- a/plugins/org.python.pydev.poetry/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - 4.0.0 - - org.python.pydev - plugins - 13.1.0-SNAPSHOT - ../pom.xml - - org.python.pydev - org.python.pydev.poetry - eclipse-plugin - diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java deleted file mode 100644 index b175e29c0f..0000000000 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/PoetryPlugin.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.python.pydev.poetry; - -import org.eclipse.core.runtime.Plugin; -import org.osgi.framework.BundleContext; - -public class PoetryPlugin extends Plugin { - - private static PoetryPlugin plugin; - - /** - * The constructor. - */ - public PoetryPlugin() { - plugin = this; - } - - /** - * This method is called when the plug-in is stopped - */ - @Override - public void stop(BundleContext context) throws Exception { - super.stop(context); - plugin = null; - } - - /** - * Returns the shared instance. - */ - public static PoetryPlugin getDefault() { - return plugin; - } - - /** - * Returns an image descriptor for the image file at the given plug-in relative - * path. - * - * @param path the path - * @return the image descriptor - */ -// public static ImageDescriptor getImageDescriptor(String path) { -// return AbstractUIPlugin.imageDescriptorFromPlugin("org.python.pydev.django", path); -// } - - public static String getPluginID() { - return getDefault().getBundle().getSymbolicName(); - } - -} diff --git a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java b/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java deleted file mode 100644 index 16819a8e47..0000000000 --- a/plugins/org.python.pydev.poetry/src/org/python/pydev/poetry/ui/actions/PoetryAction.java +++ /dev/null @@ -1,131 +0,0 @@ -/** - * - */ -package org.python.pydev.poetry.ui.actions; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; - -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.swt.widgets.Shell; -import org.python.pydev.plugin.PydevPlugin; -import org.python.pydev.plugin.preferences.PydevRootPrefs; -import org.python.pydev.shared_ui.utils.UIUtils; - -/** - * Run a poetry command and return the result. Uses a process builder to execute - * a command using poetry as the executable. - */ -public class PoetryAction { - public enum Commands { - INSTALL("install"), ENV("env"), LOCK("lock"), SYNC("sync"), UPDATE("update"); - - private String command; - - private Commands(String command) { - this.command = command; - } - - public String command() { - return this.command; - } - } - - private String errorTitle; - private String errorMsg; - private String projectRoot; - private String pythonPath; - public Boolean OK = true; - public String poetryBin; - - /** - * - * @param projectRoot The path to the directory containing pyproject.toml - */ - public PoetryAction(String projectRoot) { - poetryBin = PydevPlugin.getDefault().getPreferenceStore().getString(PydevRootPrefs.POETRY_BIN); - File f = new File(poetryBin); - if (poetryBin == null | !(f.exists() && !f.isDirectory())) { - errorTitle = "Poetry not configured"; - errorMsg = "The path to poetry could not be found.\n"; - errorMsg += "Please configure the poetry in"; - OK = false; - } - this.projectRoot = projectRoot; - } - - private Boolean checkError() { - if (errorMsg != null) { - Shell shell = UIUtils.getActiveShell(); - MessageDialog.openError(shell, errorTitle, errorMsg); - return false; - } - return true; - } - - /** - * Returns the path to the python executable of a pyproject virtual environment. - * - * @return the path to python - */ - public String getPython() { - if (pythonPath == null) { - String[] args = { Commands.ENV.command(), "info", "-e" }; - pythonPath = runCommand(args); - } - return pythonPath; - } - - /** - * Install the project - * - * @return result of `poetry install` - */ - public String install() { - return runCommand(new String[] { Commands.INSTALL.command() }); - } - - public String sync() { - return runCommand(new String[] { Commands.SYNC.command() }); - } - - public String lock() { - return runCommand(new String[] { Commands.LOCK.command() }); - } - - /** - * Returns the output of running `poetry args...` - * - * @param args List of arguments to pass to poetry e.g. "[poetry] env info" - * @return The command output - */ - public String runCommand(String[] args) { - String output = null; - Boolean ok = checkError(); - if (!ok) { - return output; - } - - ArrayList poetryArgs = new ArrayList(); - poetryArgs.add(poetryBin); - - for (String a : args) { - poetryArgs.add(a); - } - poetryArgs.add("-C"); - poetryArgs.add(projectRoot); - - ProcessBuilder pb = new ProcessBuilder(poetryArgs); - Process p; - try { - p = pb.start(); - output = new String(p.getInputStream().readAllBytes()).strip(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return output; - } - -} From 9c5de935fd06692999a367161df45fdca7b35197 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Fri, 10 Oct 2025 21:47:17 +0200 Subject: [PATCH 07/15] Restored icons --- .../org.python.pydev/icons/PythonPoetry.png | Bin 0 -> 16497 bytes .../org.python.pydev/icons/PythonPoetry.svg | 42 ++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 plugins/org.python.pydev/icons/PythonPoetry.png create mode 100644 plugins/org.python.pydev/icons/PythonPoetry.svg diff --git a/plugins/org.python.pydev/icons/PythonPoetry.png b/plugins/org.python.pydev/icons/PythonPoetry.png new file mode 100644 index 0000000000000000000000000000000000000000..c22e6fbbc977fabb9c1a87c7939b1b486493aae0 GIT binary patch literal 16497 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 literal 0 HcmV?d00001 diff --git a/plugins/org.python.pydev/icons/PythonPoetry.svg b/plugins/org.python.pydev/icons/PythonPoetry.svg new file mode 100644 index 0000000000..2dfd64b6ea --- /dev/null +++ b/plugins/org.python.pydev/icons/PythonPoetry.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 6660f80a75b31787c9feceb1f9f39b5332fa2883 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Sat, 11 Oct 2025 08:58:54 +0200 Subject: [PATCH 08/15] Refactored to add PyPoetryAction for project Added base class to handle common tasks for poetry actions --- .../package_manager/BasePackageManager.java | 1 - .../package_manager/PoetryPackageManager.java | 14 ++++- plugins/org.python.pydev/plugin.xml | 16 +++++ .../plugin/preferences/PydevRootPrefs.java | 3 +- .../ui/actions/container/PyPoetryAction.java | 58 +++++++++++++++++++ .../ui/actions/project/PoetryAddAction.java | 38 +++--------- .../actions/project/PoetryInstallAction.java | 15 +++++ .../pydev/ui/actions/project/PoetryLock.java | 45 ++------------ .../actions/project/PoetryRemoveAction.java | 32 ++++++++++ .../pydev/ui/actions/project/PoetrySync.java | 48 ++------------- .../actions/project/PoetryUpdateAction.java | 22 +++++++ 11 files changed, 178 insertions(+), 114 deletions(-) create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyPoetryAction.java create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryRemoveAction.java create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryUpdateAction.java diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java index cf3b126dea..286e0a500a 100644 --- a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java @@ -119,7 +119,6 @@ public String runCommand(ArrayList args) { p = pb.start(); output = new String(p.getInputStream().readAllBytes()).strip(); } catch (IOException e) { - // TODO Auto-generated catch block Log.log(e); } diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java index ad08b67240..4d0b71897d 100644 --- a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java @@ -3,7 +3,7 @@ import java.util.ArrayList; public class PoetryPackageManager extends BasePackageManager { - final private static String PREFS_NAME = "POETRY_BIN"; + final public static String PREFS_NAME = "POETRY_BIN"; private String pythonPath; public PoetryPackageManager(String projectRoot) { @@ -47,6 +47,18 @@ public String sync() { return runCommand(getCommandArgs("sync")); } + public String update() { + return runCommand(getCommandArgs("update")); + } + + public String remove(String appName) { + ArrayList args = getCommandArgs("remove"); + for (String app : appName.split(" ")) { + args.add(app); + } + return runCommand(args); + } + /** * Returns the path to the python executable of a pyproject virtual environment. * diff --git a/plugins/org.python.pydev/plugin.xml b/plugins/org.python.pydev/plugin.xml index 1a0dd1ed5e..46fa90b46e 100644 --- a/plugins/org.python.pydev/plugin.xml +++ b/plugins/org.python.pydev/plugin.xml @@ -155,6 +155,22 @@ menubarPath="org.python.pydev.poetry.ui.poetry.menu/misc" tooltip="Locks the project dependencies"> + + + + Date: Sat, 11 Oct 2025 21:06:41 +0200 Subject: [PATCH 09/15] Remove avoid conflict --- .project | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .project diff --git a/.project b/.project deleted file mode 100644 index 276b6b99b6..0000000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Pydev - - - - - - org.eclipse.m2e.core.maven2Builder - - - - - - org.eclipse.m2e.core.maven2Nature - - From 422f663a3f451020ac14e9011f89ec6bdd7d3597 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Sat, 11 Oct 2025 22:54:32 +0200 Subject: [PATCH 10/15] Refactored to make use of common commands Removed suffix 'Action' Moved common package manger actions to BasePackageManger --- .../package_manager/BasePackageManager.java | 41 +++++++++++++++++-- .../package_manager/PoetryPackageManager.java | 34 +-------------- .../ui/actions/container/PyPoetryAction.java | 4 ++ .../{PoetryAddAction.java => PoetryAdd.java} | 2 +- ...yInstallAction.java => PoetryInstall.java} | 3 +- ...tryRemoveAction.java => PoetryRemove.java} | 6 +-- ...tryUpdateAction.java => PoetryUpdate.java} | 2 +- 7 files changed, 48 insertions(+), 44 deletions(-) rename plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/{PoetryAddAction.java => PoetryAdd.java} (93%) rename plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/{PoetryInstallAction.java => PoetryInstall.java} (98%) rename plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/{PoetryRemoveAction.java => PoetryRemove.java} (82%) rename plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/{PoetryUpdateAction.java => PoetryUpdate.java} (85%) diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java index 286e0a500a..0e99258e2f 100644 --- a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java @@ -80,16 +80,49 @@ public BasePackageManager(String projectRoot, String name, String prefsName, Str private Boolean checkError() { if (errorMsg != null) { Log.log(errorTitle + "\n" + errorMsg); - // Shell shell = UIUtils.getActiveShell(); - // MessageDialog.openError(shell, errorTitle, errorMsg); return false; } return true; } - abstract protected ArrayList getCommandArgs(String args); + protected ArrayList getCommandArgs(String args) { + ArrayList parsedArgs = new ArrayList(); + parsedArgs.add(args); + return parsedArgs; + } + + protected ArrayList getCommandArgs(String[] args) { + ArrayList parsedArgs = new ArrayList(); + for (String arg : args) { + parsedArgs.add(arg); + } + return parsedArgs; + } + + public String add(String appName) { + ArrayList args = getCommandArgs("add"); + String[] apps = appName.split(" "); + for (String app : apps) { + args.add(app); + } + return runCommand(args); + } + + public String lock() { + return runCommand(getCommandArgs("lock")); + } - abstract protected ArrayList getCommandArgs(String[] args); + public String sync() { + return runCommand(getCommandArgs("sync")); + } + + public String remove(String appName) { + ArrayList args = getCommandArgs("remove"); + for (String app : appName.split(" ")) { + args.add(app); + } + return runCommand(args); + } /** * Returns the output of running `poetry args...` diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java index 4d0b71897d..934388f063 100644 --- a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/PoetryPackageManager.java @@ -10,26 +10,11 @@ public PoetryPackageManager(String projectRoot) { super(projectRoot, "poetry", PREFS_NAME, "-C"); } - @Override - protected ArrayList getCommandArgs(String args) { - ArrayList parsedArgs = new ArrayList(); - parsedArgs.add(args); - return parsedArgs; - } - - @Override - protected ArrayList getCommandArgs(String[] args) { - ArrayList parsedArgs = new ArrayList(); - for (String arg : args) { - parsedArgs.add(arg); - } - return parsedArgs; - } - public String install() { return runCommand(getCommandArgs("install")); } + @Override public String add(String appName) { ArrayList args = getCommandArgs("add"); String[] apps = appName.split(" "); @@ -39,26 +24,10 @@ public String add(String appName) { return runCommand(args); } - public String lock() { - return runCommand(getCommandArgs("lock")); - } - - public String sync() { - return runCommand(getCommandArgs("sync")); - } - public String update() { return runCommand(getCommandArgs("update")); } - public String remove(String appName) { - ArrayList args = getCommandArgs("remove"); - for (String app : appName.split(" ")) { - args.add(app); - } - return runCommand(args); - } - /** * Returns the path to the python executable of a pyproject virtual environment. * @@ -70,5 +39,4 @@ public String getPython() { } return pythonPath; } - } diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyPoetryAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyPoetryAction.java index ffc2f8b2f1..22fd8168f2 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyPoetryAction.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyPoetryAction.java @@ -35,10 +35,14 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor return 0; } monitor.beginTask(getTaskName(), 100); + monitor.worked(1); IProject project = container.getProject(); pm = new PoetryPackageManager(project.getLocation().toString()); String result = runCommand(); int affected = 1; + if (monitor.isCanceled()) { + return 0; + } monitor.worked(50); if (!Objects.equals(result, "")) { try { diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAddAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAdd.java similarity index 93% rename from plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAddAction.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAdd.java index 8671bafe78..f72860b3cd 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAddAction.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryAdd.java @@ -11,7 +11,7 @@ /** * */ -public class PoetryAddAction extends PyPoetryAction { +public class PoetryAdd extends PyPoetryAction { @Override protected String getTaskName() { diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstallAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstall.java similarity index 98% rename from plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstallAction.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstall.java index 48e36942f1..0eee709db2 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstallAction.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryInstall.java @@ -24,7 +24,7 @@ import org.python.pydev.shared_ui.EditorUtils; import org.python.pydev.ui.actions.container.PyContainerAction; -public class PoetryInstallAction extends PyContainerAction { +public class PoetryInstall extends PyContainerAction { private IPath absPath; private IProject project; private String pythonBin; @@ -77,7 +77,6 @@ protected int doActionOnContainer(IContainer container, IProgressMonitor monitor try { project.refreshLocal(1, monitor); } catch (CoreException e) { - // TODO Auto-generated catch block Log.log(e); } monitor.worked(100); diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryRemoveAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryRemove.java similarity index 82% rename from plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryRemoveAction.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryRemove.java index 6fe78a8753..bb476eef90 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryRemoveAction.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryRemove.java @@ -11,7 +11,7 @@ /** * */ -public class PoetryRemoveAction extends PyPoetryAction { +public class PoetryRemove extends PyPoetryAction { @Override protected String getTaskName() { @@ -20,8 +20,8 @@ protected String getTaskName() { @Override protected String runCommand() { - InputDialog dialog = new InputDialog(EditorUtils.getShell(), "App to install", - "Name of the python App to install", null, null); + InputDialog dialog = new InputDialog(EditorUtils.getShell(), "App to remove", + "Name of the python App to remove", null, null); int open = dialog.open(); if (open != Window.OK) { return ""; diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryUpdateAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryUpdate.java similarity index 85% rename from plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryUpdateAction.java rename to plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryUpdate.java index 3d76f1c6c1..fc85d63dac 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryUpdateAction.java +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/PoetryUpdate.java @@ -8,7 +8,7 @@ /** * */ -public class PoetryUpdateAction extends PyPoetryAction { +public class PoetryUpdate extends PyPoetryAction { @Override protected String getTaskName() { From 146890089e6e09ff799f8f05e8bb40629407df7c Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Sat, 11 Oct 2025 22:54:57 +0200 Subject: [PATCH 11/15] Add UV supoprt UV actions for add,remove,sync nd lock --- .../package_manager/UVPackageManager.java | 22 ++++++ plugins/org.python.pydev/icons/uv.svg | 4 + plugins/org.python.pydev/plugin.xml | 73 +++++++++++++++---- .../preferences/PydevPrefsInitializer.java | 1 + .../plugin/preferences/PydevRootPrefs.java | 18 +++++ .../ui/actions/container/PyUVAction.java | 61 ++++++++++++++++ .../pydev/ui/actions/project/UVAdd.java | 33 +++++++++ .../pydev/ui/actions/project/UVLock.java | 17 +++++ .../pydev/ui/actions/project/UVRemove.java | 33 +++++++++ .../pydev/ui/actions/project/UVSync.java | 17 +++++ 10 files changed, 263 insertions(+), 16 deletions(-) create mode 100644 plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/UVPackageManager.java create mode 100644 plugins/org.python.pydev/icons/uv.svg create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyUVAction.java create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVAdd.java create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVLock.java create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVRemove.java create mode 100644 plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVSync.java diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/UVPackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/UVPackageManager.java new file mode 100644 index 0000000000..bda4c5df99 --- /dev/null +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/UVPackageManager.java @@ -0,0 +1,22 @@ +package org.python.pydev.core.package_manager; + +public class UVPackageManager extends BasePackageManager { + final public static String PREFS_NAME = "UV_BIN"; + private String pythonPath; + + public UVPackageManager(String projectRoot) { + super(projectRoot, "uv", PREFS_NAME, "--directory"); + } + + /** + * Returns the path to the python executable of a pyproject virtual environment. + * + * @return the path to python + */ + public String getPython() { + if (pythonPath == null) { + pythonPath = runCommand(getCommandArgs(new String[] { "python", "find" })); + } + return pythonPath; + } +} diff --git a/plugins/org.python.pydev/icons/uv.svg b/plugins/org.python.pydev/icons/uv.svg new file mode 100644 index 0000000000..1701389d67 --- /dev/null +++ b/plugins/org.python.pydev/icons/uv.svg @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/org.python.pydev/plugin.xml b/plugins/org.python.pydev/plugin.xml index 46fa90b46e..de4b8e2c3d 100644 --- a/plugins/org.python.pydev/plugin.xml +++ b/plugins/org.python.pydev/plugin.xml @@ -127,16 +127,15 @@ adaptable="true" id="org.python.pydev.ui.actions.project" objectClass="org.eclipse.core.resources.IProject"> - + - - - + + + + + + + + + + + + + + + + + diff --git a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java index 9786de480c..56f9d0d44f 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java +++ b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevPrefsInitializer.java @@ -292,6 +292,7 @@ public void initializeDefaultPreferences() { node.putBoolean(PydevRootPrefs.CHECK_PREFERRED_PYDEV_SETTINGS, PydevRootPrefs.DEFAULT_CHECK_PREFERRED_PYDEV_SETTINGS); node.put(PydevRootPrefs.POETRY_BIN, PydevRootPrefs.getDefaultPoetryBinPreference()); + node.put(PydevRootPrefs.UV_BIN, PydevRootPrefs.getDefaultUVBinPreference()); } diff --git a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java index bc4310c043..39d0ddb28d 100644 --- a/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java +++ b/plugins/org.python.pydev/src/org/python/pydev/plugin/preferences/PydevRootPrefs.java @@ -16,6 +16,7 @@ import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.python.pydev.core.package_manager.PoetryPackageManager; +import org.python.pydev.core.package_manager.UVPackageManager; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.preferences.CheckDefaultPreferencesDialog.CheckInfo; import org.python.pydev.shared_core.string.StringUtils; @@ -28,6 +29,7 @@ public class PydevRootPrefs extends FieldEditorPreferencePage implements IWorkbe public static final String CHECK_PREFERRED_PYDEV_SETTINGS = "CHECK_PREFERRED_PYDEV_SETTINGS"; public static final boolean DEFAULT_CHECK_PREFERRED_PYDEV_SETTINGS = true; public static final String POETRY_BIN = "POETRY_BIN"; + public static final String UV_BIN = "UV_BIN"; public PydevRootPrefs() { setDescription(StringUtils.format("PyDev version: %s", @@ -68,6 +70,7 @@ public void widgetDefaultSelected(SelectionEvent e) { } })); addField(new FileFieldEditor(PoetryPackageManager.PREFS_NAME, "Poetry path", p)); + addField(new FileFieldEditor(UVPackageManager.PREFS_NAME, "UV path", p)); } public static void setCheckPreferredPydevSettings(boolean b) { @@ -95,4 +98,19 @@ public static String getDefaultPoetryBinPreference() { return path; } + /** + * Gets the default UV install location. + * + * @return The path to the uv bin + */ + public static String getDefaultUVBinPreference() { + String path; + if (PlatformUtils.isWindowsPlatform()) { + path = System.getenv("APPDATA") + "\\bin\\uv"; + } else { + path = System.getenv("HOME") + "/.local/bin/uv"; + } + return path; + } + } diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyUVAction.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyUVAction.java new file mode 100644 index 0000000000..056a586857 --- /dev/null +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/container/PyUVAction.java @@ -0,0 +1,61 @@ +package org.python.pydev.ui.actions.container; + +import java.util.Objects; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.python.pydev.core.log.Log; +import org.python.pydev.core.package_manager.UVPackageManager; + +public abstract class PyUVAction extends PyContainerAction { + protected UVPackageManager pm; + + @Override + protected boolean confirmRun() { + return true; + } + + @Override + protected void afterRun(int resourcesAffected) { + } + + @Override + protected boolean needsUIThread() { + return true; + } + + abstract protected String getTaskName(); + + @Override + protected int doActionOnContainer(IContainer container, IProgressMonitor monitor) { + if (monitor.isCanceled()) { + return 0; + } + monitor.beginTask(getTaskName(), 100); + monitor.worked(1); + IProject project = container.getProject(); + pm = new UVPackageManager(project.getLocation().toString()); + String result = runCommand(); + int affected = 1; + if (monitor.isCanceled()) { + return 0; + } + monitor.worked(50); + if (!Objects.equals(result, "")) { + try { + project.refreshLocal(IResource.DEPTH_INFINITE, monitor); + } catch (CoreException e) { + Log.log(e); + } + affected = 0; + } + monitor.worked(100); + monitor.done(); + return affected; + } + + abstract protected String runCommand(); +} diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVAdd.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVAdd.java new file mode 100644 index 0000000000..d6eeef29c1 --- /dev/null +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVAdd.java @@ -0,0 +1,33 @@ +/** + * + */ +package org.python.pydev.ui.actions.project; + +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.window.Window; +import org.python.pydev.shared_ui.EditorUtils; +import org.python.pydev.ui.actions.container.PyUVAction; + +/** + * + */ +public class UVAdd extends PyUVAction { + + @Override + protected String getTaskName() { + return "Installing python package..."; + } + + @Override + protected String runCommand() { + InputDialog dialog = new InputDialog(EditorUtils.getShell(), "App to install", + "Name of the python App to install", null, null); + int open = dialog.open(); + if (open != Window.OK) { + return ""; + } + String appName = dialog.getValue(); + return pm.add(appName); + } + +} diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVLock.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVLock.java new file mode 100644 index 0000000000..902ca6ee8b --- /dev/null +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVLock.java @@ -0,0 +1,17 @@ +package org.python.pydev.ui.actions.project; + +import org.python.pydev.ui.actions.container.PyUVAction; + +public class UVLock extends PyUVAction { + + @Override + protected String getTaskName() { + return "Locking project dependencies..."; + } + + @Override + protected String runCommand() { + return pm.lock(); + } + +} diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVRemove.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVRemove.java new file mode 100644 index 0000000000..ea4d184704 --- /dev/null +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVRemove.java @@ -0,0 +1,33 @@ +/** + * + */ +package org.python.pydev.ui.actions.project; + +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.window.Window; +import org.python.pydev.shared_ui.EditorUtils; +import org.python.pydev.ui.actions.container.PyUVAction; + +/** + * + */ +public class UVRemove extends PyUVAction { + + @Override + protected String getTaskName() { + return "Installing python package..."; + } + + @Override + protected String runCommand() { + InputDialog dialog = new InputDialog(EditorUtils.getShell(), "App to remove", + "Name of the python App to remove", null, null); + int open = dialog.open(); + if (open != Window.OK) { + return ""; + } + String appName = dialog.getValue(); + return pm.remove(appName); + } + +} diff --git a/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVSync.java b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVSync.java new file mode 100644 index 0000000000..4a8311d5ab --- /dev/null +++ b/plugins/org.python.pydev/src/org/python/pydev/ui/actions/project/UVSync.java @@ -0,0 +1,17 @@ +package org.python.pydev.ui.actions.project; + +import org.python.pydev.ui.actions.container.PyUVAction; + +public class UVSync extends PyUVAction { + + @Override + protected String getTaskName() { + return "Syncronising project dependencies..."; + } + + @Override + protected String runCommand() { + return pm.sync(); + } + +} From 1127038430f342554814a58bd2d21c8228fe30bd Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Sat, 11 Oct 2025 22:59:53 +0200 Subject: [PATCH 12/15] Revert test file for upstream --- .../python/pydev/core/TestDependent.linux.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties b/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties index c0faefe489..c2edc63c73 100644 --- a/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties +++ b/plugins/org.python.pydev.core/tests/org/python/pydev/core/TestDependent.linux.properties @@ -1,8 +1,8 @@ -PYTHON_INSTALL = /home/martin/.local/share/virtualenvs/3.13/lib/python3.13/ -PYTHON_EXE = /home/martin/.local/share/virtualenvs/3.13/pydev/bin/python +PYTHON_INSTALL = /home/fabio/miniconda3/envs/py310/lib/python3.10/ +PYTHON_EXE = /home/fabio/miniconda3/envs/py310/bin/python3 -TEST_PYDEV_BASE_LOC=/home/martin/git/ePydev/plugins/ +TEST_PYDEV_BASE_LOC=/home/fabio/Desktop/Pydev/plugins/ #CONDA_PYTHON_38_ENV=C:/bin/Miniconda/envs/py_38_tests/ @@ -17,7 +17,7 @@ TEST_PYDEV_BASE_LOC=/home/martin/git/ePydev/plugins/ #PYTHON2_MX_PACKAGES=/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/ #PYTHON2_PIL_PACKAGES=/opt/hostedtoolcache/Python/3.8.12/x64/lib/python3.8/site-packages/ -PYTHON_LIB=/home/martin/.local/share/virtualenvs/3.13/lib/python3.13/ +PYTHON_LIB=/home/fabio/miniconda3/envs/py310/lib/python3.10/ #java info JAVA_LOCATION=/usr/bin/java @@ -40,4 +40,4 @@ JAVA_LOCATION=/usr/bin/java #CYGWIN_CYGPATH_LOCATION=null #/usr/bin/cygpath.exe -#CYGWIN_UNIX_CYGPATH_LOCATION=null \ No newline at end of file +#CYGWIN_UNIX_CYGPATH_LOCATION=null From a190deb00b0db1b7562f8105eeb7edc6473718a3 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Sat, 11 Oct 2025 23:04:37 +0200 Subject: [PATCH 13/15] Removed unused attributes --- .../package_manager/BasePackageManager.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java index 0e99258e2f..9ba61b8773 100644 --- a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java @@ -19,30 +19,12 @@ * package_name`. */ abstract public class BasePackageManager { - public enum Commands { - INSTALL("install"), ENV("env"), LOCK("lock"), SYNC("sync"), UPDATE("update"); - - private String command; - - private Commands(String command) { - this.command = command; - } - - public String command() { - return this.command; - } - } /** * Argument to use for changing to the project directory. */ private String chDirArg; - /** - * Name of the task - */ - protected String taskName; - /** * Path to the project directory */ From 89e5e058512fc1e3869e8cb0c93cdac1c88031d0 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Tue, 10 Feb 2026 16:47:27 +1100 Subject: [PATCH 14/15] Removed export not required --- plugins/org.python.pydev.core/META-INF/MANIFEST.MF | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/org.python.pydev.core/META-INF/MANIFEST.MF b/plugins/org.python.pydev.core/META-INF/MANIFEST.MF index 6650905252..2f2baea0c7 100644 --- a/plugins/org.python.pydev.core/META-INF/MANIFEST.MF +++ b/plugins/org.python.pydev.core/META-INF/MANIFEST.MF @@ -34,7 +34,6 @@ Export-Package: org.python.copiedfromeclipsesrc, org.python.pydev.core.log, org.python.pydev.core.logging, org.python.pydev.core.nature, - org.python.pydev.core.package_manager, org.python.pydev.core.parser, org.python.pydev.core.partition, org.python.pydev.core.performanceeval, From 4301b06f104c30a29b277002e8d821fcb0ef1f38 Mon Sep 17 00:00:00 2001 From: Martin Whitehouse Date: Tue, 10 Feb 2026 17:17:28 +1100 Subject: [PATCH 15/15] Changed to use `Arrays.asList` --- .../META-INF/MANIFEST.MF | 1 + .../package_manager/BasePackageManager.java | 30 +++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/plugins/org.python.pydev.core/META-INF/MANIFEST.MF b/plugins/org.python.pydev.core/META-INF/MANIFEST.MF index 2f2baea0c7..6650905252 100644 --- a/plugins/org.python.pydev.core/META-INF/MANIFEST.MF +++ b/plugins/org.python.pydev.core/META-INF/MANIFEST.MF @@ -34,6 +34,7 @@ Export-Package: org.python.copiedfromeclipsesrc, org.python.pydev.core.log, org.python.pydev.core.logging, org.python.pydev.core.nature, + org.python.pydev.core.package_manager, org.python.pydev.core.parser, org.python.pydev.core.partition, org.python.pydev.core.performanceeval, diff --git a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java index 9ba61b8773..88d659db27 100644 --- a/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java +++ b/plugins/org.python.pydev.core/src/org/python/pydev/core/package_manager/BasePackageManager.java @@ -10,6 +10,8 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.eclipse.core.runtime.Platform; import org.python.pydev.core.log.Log; @@ -19,12 +21,30 @@ * package_name`. */ abstract public class BasePackageManager { + public enum Commands { + INSTALL("install"), ENV("env"), LOCK("lock"), SYNC("sync"), UPDATE("update"); + + private String command; + + private Commands(String command) { + this.command = command; + } + + public String command() { + return this.command; + } + } /** * Argument to use for changing to the project directory. */ private String chDirArg; + /** + * Name of the task + */ + protected String taskName; + /** * Path to the project directory */ @@ -68,9 +88,7 @@ private Boolean checkError() { } protected ArrayList getCommandArgs(String args) { - ArrayList parsedArgs = new ArrayList(); - parsedArgs.add(args); - return parsedArgs; + return new ArrayList(Arrays.asList(args)); } protected ArrayList getCommandArgs(String[] args) { @@ -82,7 +100,7 @@ protected ArrayList getCommandArgs(String[] args) { } public String add(String appName) { - ArrayList args = getCommandArgs("add"); + List args = getCommandArgs("add"); String[] apps = appName.split(" "); for (String app : apps) { args.add(app); @@ -99,7 +117,7 @@ public String sync() { } public String remove(String appName) { - ArrayList args = getCommandArgs("remove"); + List args = getCommandArgs("remove"); for (String app : appName.split(" ")) { args.add(app); } @@ -112,7 +130,7 @@ public String remove(String appName) { * @param args List of arguments to pass to binPath e.g. "[poetry] env info" * @return The command output */ - public String runCommand(ArrayList args) { + public String runCommand(List args) { String output = null; if (!checkError()) { return output;