diff -r 16a129d168f9 -r 8a15b05eeee3 src/eric7/CondaInterface/Conda.py --- a/src/eric7/CondaInterface/Conda.py Wed Apr 23 17:23:57 2025 +0200 +++ b/src/eric7/CondaInterface/Conda.py Wed Apr 23 18:02:09 2025 +0200 @@ -16,9 +16,12 @@ from eric7 import Preferences from eric7.EricWidgets import EricMessageBox +from eric7.EricWidgets.EricApplication import ericApp from eric7.SystemUtilities import OSUtilities +from eric7.VirtualEnv.VirtualenvMeta import VirtualenvMetaData +from eric7.VirtualEnv.VirtualenvRegistry import VirtualenvType -from . import condaVersion, rootPrefix +from . import condaVersion, isCondaAvailable, rootPrefix from .CondaExecDialog import CondaExecDialog @@ -36,6 +39,7 @@ condaEnvironmentRemoved = pyqtSignal() RootName = QCoreApplication.translate("Conda", "<root>") + EnvironmentType = "conda" def __init__(self, parent=None): """ @@ -48,10 +52,95 @@ self.__ui = parent + envManager = ericApp().getObject("VirtualEnvManager") + envManager.registerType( + VirtualenvType( + name=Conda.EnvironmentType, + visual_name=self.tr("Anaconda"), + createFunc=self.createCondaVirtualEnvironment, + deleteFunc=self.deleteCondaVirtualEnvironment, + defaultExecPathFunc=self.condaDefaultExecPath, + ) + ) + ####################################################################### ## environment related methods below ####################################################################### + def condaDefaultExecPath(self, venvDirectory): + """ + Public method returning the default PATH prefix for a conda environment. + + @param venvDirectory path of the virtual environment to generate the + default PATH prefix for + @type str + @return default PATH prefix string + @rtype str + """ + if OSUtilities.isWindowsPlatform(): + return os.pathsep.join( + [ + venvDirectory, + os.path.join(venvDirectory, "Scripts"), + os.path.join(venvDirectory, "Library", "bin"), + ] + ) + else: + return os.path.join(venvDirectory, "bin") + + def createCondaVirtualEnvironment(self, baseDir=""): + """ + Public method to create an anaconda/miniconda environment. + + Note: This method is used by the Virtual Environment Manager. + + @param baseDir base directory for the virtual environments (defaults to "") + @type str (optional) + """ + from .CondaEnvironmentConfigurationDialog import ( + CondaEnvironmentConfigurationDialog, + ) + + if not isCondaAvailable(): + EricMessageBox.critical( + self.__ui, + self.tr("Create Conda Environment"), + self.tr( + "Conda has not been installed or is not configured. Aborting..." + ), + ) + return + + dlg = CondaEnvironmentConfigurationDialog(baseDir=baseDir, parent=self.__ui) + if dlg.exec() == QDialog.DialogCode.Accepted: + resultDict = dlg.getData() + # now create the conda environment + ok, prefix, interpreter = self.createCondaEnvironment( + resultDict["arguments"] + ) + if ok and "--dry-run" not in resultDict["arguments"]: + ericApp().getObject("VirtualEnvManager").addVirtualEnv( + VirtualenvMetaData( + name=resultDict["logicalName"], + path=prefix, + interpreter=interpreter, + environment_type=Conda.EnvironmentType, + ) + ) + + def deleteCondaVirtualEnvironment(self, venvMetaData): + """ + Public method to delete a given anaconda/miniconda environment from disk. + + Note: This method is used by the Virtual Environment Manager. + + @param venvMetaData virtual environment meta data structure + @type VirtualenvMetaData + @return flag indicating success + @rtype bool + """ + return self.removeCondaEnvironment(prefix=venvMetaData.path) + def createCondaEnvironment(self, arguments): """ Public method to create a conda environment.