PY-88148 PY-88157

Fix gray package colors for non-uv/poetry. Now getDeclaredPackageNames() from PythonPackageManager returns extracted declared deps for pyprojec.toml managers and all installed names for others.

Added refresh of packages in PTW after removing some pkg.

(cherry picked from commit 7942e4274aaadbf1c8b6ebce5abe27294624d41d)

IJ-MR-195246

GitOrigin-RevId: 53348fcd3ec2ddb4d7678421898ba05079341298
This commit is contained in:
TimurMalanin
2026-03-10 21:34:36 +00:00
committed by intellij-monorepo-bot
parent 33ecee8b25
commit 8bf5f7f51e
4 changed files with 20 additions and 7 deletions

View File

@@ -59,7 +59,17 @@ import kotlin.jvm.Throws
* @see com.jetbrains.python.packaging.management.ui.PythonPackageManagerUI to execute commands with UI handlers
*/
@ApiStatus.Experimental
abstract class PythonPackageManager(val project: Project, val sdk: Sdk) : Disposable.Default {
abstract class PythonPackageManager @ApiStatus.Internal constructor(
val project: Project,
val sdk: Sdk,
/**
* Whether this manager has an explicit list of top-level dependencies (e.g. from pyproject.toml).
* When true, only packages from [extractDependenciesCached] are treated as "declared" in the UI,
* and the rest are shown as transitive.
* When false (default), all installed packages are considered declared.
*/
internal val installedMightBeTransitive: Boolean = false,
) : Disposable.Default {
private val isInited = AtomicBoolean(false)
private val initializationJob = PyPackageCoroutine.launch(project, NON_INTERACTIVE_ROOT_TRACE_CONTEXT, start = CoroutineStart.LAZY) {
initInstalledPackages()

View File

@@ -294,6 +294,7 @@ class PyPackagingToolWindowService(val project: Project, val serviceScope: Corou
text = message("python.packaging.notification.deleted", selectedPackages.joinToString(", ") { it.name }),
displayId = PYTHON_PACKAGE_DELETED
)
refreshInstalledPackages()
toolWindowPanel?.clearFocus()
}
}
@@ -394,10 +395,12 @@ class PyPackagingToolWindowService(val project: Project, val serviceScope: Corou
suspend fun refreshInstalledPackages() {
val context = sdkContext ?: return
val declaredPackageNames = context.manager.extractDependenciesCached()
?.getOrNull()
?.map { it.name }?.toSet()
?: emptySet()
val declaredPackageNames = if (context.manager.installedMightBeTransitive) {
context.manager.extractDependenciesCached()?.getOrNull() ?: emptyList()
}
else {
context.manager.listInstalledPackages()
}.mapTo(mutableSetOf()) { it.name }
withContext(Dispatchers.Default) {
val packageIndex = PackageIndex(context.manager)

View File

@@ -25,7 +25,7 @@ import org.jetbrains.annotations.TestOnly
import java.nio.file.Path
@ApiStatus.Internal
class PoetryPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(project, sdk) {
class PoetryPackageManager(project: Project, sdk: Sdk) : PythonPackageManager(project, sdk, installedMightBeTransitive = true) {
override val repositoryManager: PythonRepositoryManager = PipRepositoryManager.getInstance(project)
override suspend fun syncCommand(): PyResult<Unit> {

View File

@@ -31,7 +31,7 @@ import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
internal class UvPackageManager(project: Project, sdk: Sdk, uvExecutionContextDeferred: Deferred<UvExecutionContext<*>>) : PythonPackageManager(project, sdk) {
internal class UvPackageManager(project: Project, sdk: Sdk, uvExecutionContextDeferred: Deferred<UvExecutionContext<*>>) : PythonPackageManager(project, sdk, installedMightBeTransitive = true) {
override val repositoryManager: PythonRepositoryManager = PipRepositoryManager.getInstance(project)
private lateinit var uvLowLevel: PyResult<UvLowLevel<*>>
private val uvExecutionContextDeferred = uvExecutionContextDeferred.also { it.cancelOnDispose(this) }