From c8b62d5056d4932552979a022a8b8547e9d49ba6 Mon Sep 17 00:00:00 2001 From: Aleksandr Sorotskii Date: Tue, 12 Nov 2024 18:33:21 +0100 Subject: [PATCH] remove redundant pip based python package manager; PY-75983 (cherry picked from commit a1d3cb3a5f31763f38c6c5c2d7c7f855d83e1f0a) GitOrigin-RevId: c0ce987c8f9bdf3856cd69febe8a19a8af69491e --- .../packaging/conda/CondaPackageManager.kt | 8 +- .../management/PythonPackageManager.kt | 15 +++- .../packaging/pip/PipBasedPackageManager.kt | 73 ------------------- .../packaging/pip/PipPythonPackageManager.kt | 55 +++++++++++++- .../runAnything/PyRunAnythingPipProvider.kt | 3 +- .../python/sdk/poetry/PoetryPackageManager.kt | 13 ++-- 6 files changed, 79 insertions(+), 88 deletions(-) delete mode 100644 python/src/com/jetbrains/python/packaging/pip/PipBasedPackageManager.kt diff --git a/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt b/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt index 21e9167321b1..f7b77f56786e 100644 --- a/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt +++ b/python/src/com/jetbrains/python/packaging/conda/CondaPackageManager.kt @@ -17,7 +17,7 @@ import com.jetbrains.python.PyBundle.message import com.jetbrains.python.packaging.PyExecutionException import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonPackageSpecification -import com.jetbrains.python.packaging.pip.PipBasedPackageManager +import com.jetbrains.python.packaging.pip.PipPythonPackageManager import com.jetbrains.python.sdk.flavors.conda.PyCondaFlavorData import com.jetbrains.python.sdk.getOrCreateAdditionalData import com.jetbrains.python.sdk.targetEnvConfiguration @@ -27,8 +27,8 @@ import org.jetbrains.annotations.ApiStatus import org.jetbrains.annotations.Nls @ApiStatus.Experimental -class CondaPackageManager(project: Project, sdk: Sdk) : PipBasedPackageManager(project, sdk) { - override val repositoryManager: CondaRepositoryManger = CondaRepositoryManger(project, sdk) +class CondaPackageManager(project: Project, sdk: Sdk) : PipPythonPackageManager(project, sdk) { + override val repositoryManager = CondaRepositoryManger(project, sdk) override suspend fun installPackageCommand(specification: PythonPackageSpecification, options: List): Result = if (specification is CondaPackageSpecification) { @@ -72,7 +72,7 @@ class CondaPackageManager(project: Project, sdk: Sdk) : PipBasedPackageManager(p override suspend fun reloadPackagesCommand(): Result> = try { - val output =runConda("list", emptyList(), message("conda.packaging.list.progress")) + val output = runConda("list", emptyList(), message("conda.packaging.list.progress")) Result.success(parseCondaPackageList(output)) } catch (ex: ExecutionException) { diff --git a/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt b/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt index 00aa3f57edaf..7e43b9d64059 100644 --- a/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt +++ b/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt @@ -1,6 +1,7 @@ // Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.jetbrains.python.packaging.management +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.writeAction import com.intellij.openapi.components.service import com.intellij.openapi.project.Project @@ -8,6 +9,7 @@ import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.vfs.VfsUtil import com.intellij.util.messages.Topic +import com.jetbrains.python.packaging.PyPackageManager import com.jetbrains.python.packaging.common.PackageManagerHolder import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonPackageManagementListener @@ -39,8 +41,19 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) { return reloadPackages() } - abstract suspend fun reloadPackages(): Result> + open suspend fun reloadPackages(): Result> { + val packages = reloadPackagesCommand().getOrElse { + return Result.failure(it) + } + installedPackages = packages + ApplicationManager.getApplication().messageBus.apply { + syncPublisher(PACKAGE_MANAGEMENT_TOPIC).packagesChanged(sdk) + syncPublisher(PyPackageManager.PACKAGE_MANAGER_TOPIC).packagesRefreshed(sdk) + } + + return Result.success(packages) + } protected abstract suspend fun installPackageCommand(specification: PythonPackageSpecification, options: List): Result protected abstract suspend fun updatePackageCommand(specification: PythonPackageSpecification): Result diff --git a/python/src/com/jetbrains/python/packaging/pip/PipBasedPackageManager.kt b/python/src/com/jetbrains/python/packaging/pip/PipBasedPackageManager.kt deleted file mode 100644 index c3af0c8a7e58..000000000000 --- a/python/src/com/jetbrains/python/packaging/pip/PipBasedPackageManager.kt +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. -package com.jetbrains.python.packaging.pip - -import com.intellij.execution.ExecutionException -import com.intellij.openapi.application.ApplicationManager -import com.intellij.openapi.project.Project -import com.intellij.openapi.projectRoots.Sdk -import com.jetbrains.python.PyBundle -import com.jetbrains.python.packaging.PyPackageManager -import com.jetbrains.python.packaging.common.PythonPackage -import com.jetbrains.python.packaging.common.PythonPackageSpecification -import com.jetbrains.python.packaging.management.PythonPackageManager -import com.jetbrains.python.packaging.management.runPackagingTool -import org.jetbrains.annotations.ApiStatus - -@ApiStatus.Experimental -abstract class PipBasedPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(project, sdk) { - @Volatile - override var installedPackages: List = emptyList() - - override suspend fun installPackageCommand(specification: PythonPackageSpecification, options: List): Result = - try { - Result.success(runPackagingTool("install", specification.buildInstallationString() + options, PyBundle.message("python.packaging.install.progress", specification.name))) - } - catch (ex: ExecutionException) { - Result.failure(ex) - } - - override suspend fun updatePackageCommand(specification: PythonPackageSpecification): Result = - try { - Result.success(runPackagingTool("install", listOf("--upgrade") + specification.buildInstallationString(), PyBundle.message("python.packaging.update.progress", specification.name))) - } - catch (ex: ExecutionException) { - Result.failure(ex) - } - - override suspend fun uninstallPackageCommand(pkg: PythonPackage): Result = - try { - Result.success(runPackagingTool("uninstall", listOf(pkg.name), PyBundle.message("python.packaging.uninstall.progress", pkg.name))) - } - catch (ex: ExecutionException) { - Result.failure(ex) - } - - override suspend fun reloadPackagesCommand(): Result> = - try { - val output = runPackagingTool("list", emptyList(), PyBundle.message("python.packaging.list.progress")) - val packages = output.lineSequence() - .filter { it.isNotBlank() } - .map { - val line = it.split("\t") - PythonPackage(line[0], line[1], isEditableMode = false) - } - .sortedWith(compareBy(PythonPackage::name)) - .toList() - Result.success(packages) - } - catch (ex: ExecutionException) { - Result.failure(ex) - } - - override suspend fun reloadPackages(): Result> { - val packages = reloadPackagesCommand().onFailure { return Result.failure(it) }.getOrThrow() - installedPackages = packages - - ApplicationManager.getApplication().messageBus.apply { - syncPublisher(PACKAGE_MANAGEMENT_TOPIC).packagesChanged(sdk) - syncPublisher(PyPackageManager.PACKAGE_MANAGER_TOPIC).packagesRefreshed(sdk) - } - - return Result.success(packages) - } -} \ No newline at end of file diff --git a/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt b/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt index aac42408cf1b..7b03b2cb052b 100644 --- a/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt +++ b/python/src/com/jetbrains/python/packaging/pip/PipPythonPackageManager.kt @@ -1,11 +1,62 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.jetbrains.python.packaging.pip +import com.intellij.execution.ExecutionException import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk +import com.jetbrains.python.PyBundle +import com.jetbrains.python.packaging.common.PythonPackage +import com.jetbrains.python.packaging.common.PythonPackageSpecification +import com.jetbrains.python.packaging.management.PythonPackageManager +import com.jetbrains.python.packaging.management.PythonRepositoryManager +import com.jetbrains.python.packaging.management.runPackagingTool import org.jetbrains.annotations.ApiStatus +import kotlin.collections.plus @ApiStatus.Experimental -class PipPythonPackageManager(project: Project, sdk: Sdk) : PipBasedPackageManager(project, sdk) { - override val repositoryManager: PipRepositoryManager = PipRepositoryManager(project, sdk) +open class PipPythonPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(project, sdk) { + @Volatile + override var installedPackages: List = emptyList() + override val repositoryManager: PythonRepositoryManager = PipRepositoryManager(project, sdk) + + override suspend fun installPackageCommand(specification: PythonPackageSpecification, options: List): Result = + try { + Result.success(runPackagingTool("install", specification.buildInstallationString() + options, PyBundle.message("python.packaging.install.progress", specification.name))) + } + catch (ex: ExecutionException) { + Result.failure(ex) + } + + override suspend fun updatePackageCommand(specification: PythonPackageSpecification): Result = + try { + Result.success(runPackagingTool("install", listOf("--upgrade") + specification.buildInstallationString(), PyBundle.message("python.packaging.update.progress", specification.name))) + } + catch (ex: ExecutionException) { + Result.failure(ex) + } + + override suspend fun uninstallPackageCommand(pkg: PythonPackage): Result = + try { + Result.success(runPackagingTool("uninstall", listOf(pkg.name), PyBundle.message("python.packaging.uninstall.progress", pkg.name))) + } + catch (ex: ExecutionException) { + Result.failure(ex) + } + + override suspend fun reloadPackagesCommand(): Result> = + try { + val output = runPackagingTool("list", emptyList(), PyBundle.message("python.packaging.list.progress")) + val packages = output.lineSequence() + .filter { it.isNotBlank() } + .map { + val line = it.split("\t") + PythonPackage(line[0], line[1], isEditableMode = false) + } + .sortedWith(compareBy(PythonPackage::name)) + .toList() + Result.success(packages) + } + catch (ex: ExecutionException) { + Result.failure(ex) + } } \ No newline at end of file diff --git a/python/src/com/jetbrains/python/run/runAnything/PyRunAnythingPipProvider.kt b/python/src/com/jetbrains/python/run/runAnything/PyRunAnythingPipProvider.kt index 5327373144af..5133c67e9469 100644 --- a/python/src/com/jetbrains/python/run/runAnything/PyRunAnythingPipProvider.kt +++ b/python/src/com/jetbrains/python/run/runAnything/PyRunAnythingPipProvider.kt @@ -4,7 +4,6 @@ package com.jetbrains.python.run.runAnything import com.intellij.openapi.actionSystem.DataContext import com.jetbrains.python.PyBundle import com.jetbrains.python.packaging.management.PythonPackageManager -import com.jetbrains.python.packaging.pip.PipBasedPackageManager import com.jetbrains.python.packaging.repository.PyPIPackageRepository import com.jetbrains.python.packaging.repository.PyPackageRepository import com.jetbrains.python.psi.icons.PythonPsiApiIcons @@ -33,7 +32,7 @@ class PyRunAnythingPipProvider : PyRunAnythingPackageProvider() { override fun getPackageManager(dataContext: DataContext): PythonPackageManager? { val pythonSdk = getSdk(dataContext) ?: return null - return (PythonPackageManager.forSdk(dataContext.project, pythonSdk) as? PipBasedPackageManager) ?: return null + return PythonPackageManager.forSdk(dataContext.project, pythonSdk) } override fun getPackageRepository(dataContext: DataContext): PyPackageRepository? { diff --git a/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt b/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt index aeb1d2859a06..af86223c86ff 100644 --- a/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt +++ b/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt @@ -5,17 +5,19 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonPackageSpecification -import com.jetbrains.python.packaging.pip.PipBasedPackageManager +import com.jetbrains.python.packaging.management.PythonPackageManager import com.jetbrains.python.packaging.pip.PipRepositoryManager -import org.jetbrains.annotations.TestOnly import java.util.regex.Pattern +import org.jetbrains.annotations.TestOnly + +class PoetryPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(project, sdk) { + @Volatile + override var installedPackages: List = emptyList() + override val repositoryManager: PipRepositoryManager = PipRepositoryManager(project, sdk) -class PoetryPackageManager(project: Project, sdk: Sdk) : PipBasedPackageManager(project, sdk) { @Volatile private var outdatedPackages: Map = emptyMap() - override val repositoryManager: PipRepositoryManager = PipRepositoryManager(project, sdk) - override suspend fun installPackageCommand(specification: PythonPackageSpecification, options: List): Result = poetryInstallPackage(sdk, specification.getVersionForPoetry(), options) @@ -36,7 +38,6 @@ class PoetryPackageManager(project: Project, sdk: Sdk) : PipBasedPackageManager( internal fun getOutdatedPackages(): Map = outdatedPackages - /** * Updates the list of outdated packages by running the Poetry command * `poetry show --outdated`, parsing its output, and storing the results.