diff --git a/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt b/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt index 2f9697ebb37d..2dc83807da80 100644 --- a/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt +++ b/python/src/com/jetbrains/python/packaging/management/PythonPackageManager.kt @@ -19,7 +19,6 @@ import com.jetbrains.python.getOrNull import com.jetbrains.python.onFailure import com.jetbrains.python.packaging.PyPackageManager import com.jetbrains.python.packaging.PyPackageName -import com.jetbrains.python.packaging.PythonDependenciesExtractor import com.jetbrains.python.packaging.common.PythonOutdatedPackage import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonPackageManagementListener @@ -53,13 +52,10 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos } - @get:ApiStatus.Internal - @set:ApiStatus.Internal - protected open var dependencies: List = emptyList() @ApiStatus.Internal @Volatile - protected open var installedPackages: List = emptyList() + protected var installedPackages: List = emptyList() @ApiStatus.Internal @Volatile @@ -102,7 +98,6 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos } waitForInit() - reloadDependencies() val normalizedPackagesNames = packages.map { PyPackageName.normalizePackageName(it) } uninstallPackageCommand(*normalizedPackagesNames.toTypedArray()).getOr { return it } @@ -115,7 +110,6 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos return it } - reloadDependencies() if (packages != installedPackages) { installedPackages = packages PyPackageCoroutine.launch(project) { @@ -197,16 +191,6 @@ abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Dispos @ApiStatus.Internal protected abstract suspend fun loadOutdatedPackagesCommand(): PyResult> - @ApiStatus.Internal - suspend fun reloadDependencies(): List { - val dependenciesExtractor = PythonDependenciesExtractor.forSdk(project, sdk) ?: return emptyList() - dependencies = dependenciesExtractor.extract() - return dependencies - } - - @ApiStatus.Internal - fun listDependencies(): List = dependencies - @ApiStatus.Internal suspend fun waitForInit() { initializationJob?.join() diff --git a/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingToolWindowService.kt b/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingToolWindowService.kt index 1f23e3cb2f03..07029ec3854d 100644 --- a/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingToolWindowService.kt +++ b/python/src/com/jetbrains/python/packaging/toolwindow/PyPackagingToolWindowService.kt @@ -21,9 +21,7 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.VirtualFileManager import com.jetbrains.python.PyBundle.message import com.jetbrains.python.getOrNull -import com.jetbrains.python.packaging.PyPackageName -import com.jetbrains.python.packaging.PyPackageService -import com.jetbrains.python.packaging.PyPackageVersionNormalizer +import com.jetbrains.python.packaging.* import com.jetbrains.python.packaging.cache.PythonSimpleRepositoryCache import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonPackageDetails @@ -34,7 +32,6 @@ import com.jetbrains.python.packaging.management.* import com.jetbrains.python.packaging.management.ui.PythonPackageManagerUI import com.jetbrains.python.packaging.packageRequirements.PackageNode import com.jetbrains.python.packaging.packageRequirements.PythonPackageRequirementsTreeExtractor -import com.jetbrains.python.packaging.pyRequirement import com.jetbrains.python.packaging.repository.* import com.jetbrains.python.packaging.statistics.PythonPackagesToolwindowStatisticsCollector import com.jetbrains.python.packaging.toolwindow.model.* @@ -285,9 +282,8 @@ class PyPackagingToolWindowService(val project: Project, val serviceScope: Corou suspend fun refreshInstalledPackages() { val sdk = currentSdk ?: return - val manager = manager ?: return withContext(Dispatchers.Default) { - val declaredPackages = manager.reloadDependencies() + val declaredPackages = PythonDependenciesExtractor.forSdk(project, sdk)?.extract() ?: emptyList() val installedDeclaredPackages = findInstalledDeclaredPackages(declaredPackages) val treeExtractor = PythonPackageRequirementsTreeExtractor.forSdk(sdk) @@ -313,9 +309,9 @@ class PyPackagingToolWindowService(val project: Project, val serviceScope: Corou } private suspend fun findInstalledDeclaredPackages(declaredPackages: List): List = - manager?.listInstalledPackages()?.filter { + manager.listInstalledPackages().filter { it.name in declaredPackages.map { pkg -> pkg.name } - } ?: emptyList() + } private suspend fun processPackagesWithRequirementsTree( packages: List, diff --git a/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt b/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt index 5d5ff34d2543..9ea71803fe23 100644 --- a/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt +++ b/python/src/com/jetbrains/python/sdk/poetry/PoetryPackageManager.kt @@ -6,6 +6,7 @@ import com.intellij.openapi.projectRoots.Sdk import com.jetbrains.python.PyBundle import com.jetbrains.python.errorProcessing.PyResult import com.jetbrains.python.packaging.PyPackageName +import com.jetbrains.python.packaging.PythonDependenciesExtractor import com.jetbrains.python.packaging.common.PythonOutdatedPackage import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonRepositoryPackageSpecification @@ -60,8 +61,8 @@ class PoetryPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(pr /** * Categorizes packages into standalone packages and pyproject.toml declared packages. */ - private fun categorizePackages(packages: Array): Pair, List> { - val dependencyNames = dependencies.map { it.name }.toSet() + private suspend fun categorizePackages(packages: Array): Pair, List> { + val dependencyNames = PythonDependenciesExtractor.forSdk(project, sdk)?.extract()?.map { it.name }?.toSet() ?: emptySet() return packages .map { PyPackageName.from(it) } .partition { it.name !in dependencyNames } diff --git a/python/src/com/jetbrains/python/sdk/uv/UvPackageManager.kt b/python/src/com/jetbrains/python/sdk/uv/UvPackageManager.kt index 633ef4811b70..5366173d13fa 100644 --- a/python/src/com/jetbrains/python/sdk/uv/UvPackageManager.kt +++ b/python/src/com/jetbrains/python/sdk/uv/UvPackageManager.kt @@ -5,6 +5,7 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.jetbrains.python.errorProcessing.PyResult import com.jetbrains.python.packaging.PyPackageName +import com.jetbrains.python.packaging.PythonDependenciesExtractor import com.jetbrains.python.packaging.common.PythonOutdatedPackage import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonRepositoryPackageSpecification @@ -53,8 +54,8 @@ internal class UvPackageManager(project: Project, sdk: Sdk, private val uv: UvLo /** * Categorizes packages into standalone packages and pyproject.toml declared packages. */ - private fun categorizePackages(packages: Array): Pair, List> { - val dependencyNames = dependencies.map { it.name }.toSet() + private suspend fun categorizePackages(packages: Array): Pair, List> { + val dependencyNames = PythonDependenciesExtractor.forSdk(project, sdk)?.extract()?.map { it.name }?.toSet() ?: emptySet() return packages .map { PyPackageName.from(it) } .partition { it.name !in dependencyNames || sdk.uvUsePackageManagement } diff --git a/python/testSrc/com/jetbrains/python/packaging/management/TestPackageManager.kt b/python/testSrc/com/jetbrains/python/packaging/management/TestPackageManager.kt index 37ee4b815525..6a2fdfae8071 100644 --- a/python/testSrc/com/jetbrains/python/packaging/management/TestPackageManager.kt +++ b/python/testSrc/com/jetbrains/python/packaging/management/TestPackageManager.kt @@ -14,11 +14,14 @@ import org.jetbrains.annotations.TestOnly @TestOnly class TestPythonPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(project, sdk) { - override var installedPackages: List = DEFAULT_PACKAGES.toMutableList() private var packageNames: List = emptyList() private var packageDetails: PythonPackageDetails? = null private var packageVersions: Map> = emptyMap() + init { + installedPackages = DEFAULT_PACKAGES.toMutableList() + } + override val repositoryManager: TestPythonRepositoryManager get() = TestPythonRepositoryManager(project) .withPackageNames(packageNames)