[python] PY-81866 don't spam stub notifications while it's installing

(cherry picked from commit 5f8374cc36bff759e1a0a6a01917d71b8b15d836)

GitOrigin-RevId: 25440bd6c7f1c38d9de218d126e4abf17de0b00d
This commit is contained in:
Morgan Bartholomew
2025-06-17 21:22:32 +10:00
committed by intellij-monorepo-bot
parent b2325c2198
commit 40f0114010

View File

@@ -13,6 +13,7 @@ import com.intellij.notification.NotificationAction
import com.intellij.notification.NotificationGroupManager
import com.intellij.notification.NotificationType
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.ComponentManager
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project
@@ -27,6 +28,7 @@ import com.jetbrains.python.codeInsight.typing.PyStubPackagesAdvertiserCache.Com
import com.jetbrains.python.inspections.PyInspection
import com.jetbrains.python.inspections.PyInspectionVisitor
import com.jetbrains.python.inspections.quickfix.PyInstallRequirementsFix
import com.jetbrains.python.inspections.requirement.RunningPackagingTasksListener
import com.jetbrains.python.packaging.*
import com.jetbrains.python.packaging.requirement.PyRequirementRelation
import com.jetbrains.python.psi.PyFile
@@ -62,7 +64,7 @@ private class PyStubPackagesAdvertiser : PyInspection() {
override fun getOptionsPane() =
pane(stringList("ignoredPackages", PyPsiBundle.message("INSP.stub.packages.compatibility.ignored.packages.label")))
override fun buildVisitor(holder: ProblemsHolder,
isOnTheFly: Boolean,
session: LocalInspectionToolSession): PsiElementVisitor = Visitor(ignoredPackages, holder, session)
@@ -111,7 +113,7 @@ private class PyStubPackagesAdvertiser : PyInspection() {
if (availablePackages.isEmpty()) return
val ignoredStubPackages = (IGNORE + ignoredPackages).mapNotNull { packageManager.parseRequirement(it) }
val cache = ApplicationManager.getApplication().getService(PyStubPackagesAdvertiserCache::class.java).forSdk(sdk)
val cache = ApplicationManager.getApplication().getService<PyStubPackagesAdvertiserCache>().forSdk(sdk)
val forcedToLoad = processForcedPackages(file, sources, module, sdk, packageManager, ignoredStubPackages, cache)
val checkedToLoad = processCheckedPackages(file, sources, module, sdk, packageManager, ignoredStubPackages, cache)
@@ -161,7 +163,12 @@ private class PyStubPackagesAdvertiser : PyInspection() {
val (sourcesToLoad, cached) = splitIntoNotCachedAndCached(checkedSourcesToProcess(sources), cache)
val (reqs, args) = toRequirementsAndExtraArgs(cached, ignoredStubPackages)
val (unfilteredReqs, args) = toRequirementsAndExtraArgs(cached, ignoredStubPackages)
val status = file.project.getService<PyStubPackagesInstallingStatus>()
val reqs = unfilteredReqs.filterNot { status.markedAsInstalling(it.name) }
if (reqs.isNotEmpty()) {
val plural = reqs.size > 1
val reqsToString = PyPackageUtil.requirementsToString(reqs)
@@ -272,13 +279,13 @@ private class PyStubPackagesAdvertiser : PyInspection() {
val project = module.project
val stubPkgNamesToInstall = reqs.mapTo(mutableSetOf()) { it.name }
object : PyPackageManagerUI.Listener {
val installationListener = object : RunningPackagingTasksListener(module) {
override fun started() {
project.getService(PyStubPackagesInstallingStatus::class.java).markAsInstalling(stubPkgNamesToInstall)
project.getService<PyStubPackagesInstallingStatus>().markAsInstalling(stubPkgNamesToInstall)
}
override fun finished(exceptions: MutableList<ExecutionException>?) {
val status = project.getService(PyStubPackagesInstallingStatus::class.java)
override fun finished(exceptions: List<ExecutionException>) {
val status = project.getService<PyStubPackagesInstallingStatus>()
val stubPkgsToUninstall = PyStubPackagesCompatibilityInspection
.findIncompatibleRuntimeToStubPackages(sdk) { it.name in stubPkgNamesToInstall }
@@ -311,7 +318,7 @@ private class PyStubPackagesAdvertiser : PyInspection() {
}
val name = PyBundle.message("code.insight.stub.packages.install.requirements.fix.name", reqs.size)
return PyInstallRequirementsFix(name, sdk, reqs, args)
return PyInstallRequirementsFix(name, sdk, reqs, args, installationListener)
}
private fun createIgnorePackagesQuickFix(reqs: List<PyRequirement>, packageManager: PyPackageManager): LocalQuickFix {