Python: Rename and move UIInfo to openapi to reuse it from other modules

GitOrigin-RevId: 2f46a6e934853d14600351112da292586938cd86
This commit is contained in:
Ilya.Kazakevich
2025-10-01 23:01:06 +00:00
committed by intellij-monorepo-bot
parent 13232ee81d
commit 894f26c7e9
21 changed files with 71 additions and 65 deletions
@@ -1,15 +0,0 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.python.community.services.shared
import org.jetbrains.annotations.Nls
import javax.swing.Icon
data class UICustomization(
/**
* i.e: "UV" for pythons found by UV
*/
val title: @Nls String,
val icon: Icon? = null,
) : Comparable<UICustomization> {
override fun compareTo(other: UICustomization): Int = title.compareTo(other.title)
}
@@ -1,9 +1,11 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.python.community.services.shared
import com.jetbrains.python.PyToolUIInfo
interface UiHolder {
/**
* UI hints on how to display this python to the end user: icon, title, etc
*/
val ui: UICustomization?
val ui: PyToolUIInfo?
}
@@ -2,6 +2,7 @@
package com.intellij.python.community.services.shared
import com.intellij.openapi.diagnostic.fileLogger
import com.jetbrains.python.PyToolUIInfo
import com.jetbrains.python.psi.LanguageLevel
import java.util.*
@@ -21,9 +22,9 @@ object LanguageLevelComparator : Comparator<LanguageLevelHolder> {
object UiComparator : Comparator<UiHolder> {
override fun compare(o1: UiHolder, o2: UiHolder): Int {
if (logger.isDebugEnabled) {
logger.debug("ui ${o1.ui?.title} vs ${o2.ui?.title}")
logger.debug("ui ${o1.ui?.toolName} vs ${o2.ui?.toolName}")
}
return Objects.compare(o1.ui, o2.ui, Comparator.nullsFirst(UICustomization::compareTo))
return Objects.compare(o1.ui, o2.ui, Comparator.nullsFirst(PyToolUIInfo::compareTo))
}
}
@@ -36,4 +37,4 @@ class LanguageLevelWithUiComparator<T> : Comparator<T> where T : LanguageLevelHo
}
}
private fun <T> T.string(): String where T : LanguageLevelHolder, T : UiHolder = "($languageLevel,${ui?.title})"
private fun <T> T.string(): String where T : LanguageLevelHolder, T : UiHolder = "($languageLevel,${ui?.toolName})"
@@ -3,7 +3,7 @@ package com.intellij.python.junit5Tests.unit.comparators
import com.intellij.python.community.services.shared.LanguageLevelHolder
import com.intellij.python.community.services.shared.LanguageLevelWithUiComparator
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.shared.UiHolder
import com.jetbrains.python.psi.LanguageLevel
import org.hamcrest.MatcherAssert
@@ -18,9 +18,9 @@ class ComparatorsTest {
val mocks = arrayOf(
MockLevel(LanguageLevel.PYTHON314),
MockLevel(LanguageLevel.PYTHON310),
MockLevel(LanguageLevel.PYTHON310, ui = UICustomization("A")),
MockLevel(LanguageLevel.PYTHON310, ui = UICustomization("Z")),
MockLevel(LanguageLevel.PYTHON310, ui = UICustomization("B")),
MockLevel(LanguageLevel.PYTHON310, ui = PyToolUIInfo("A")),
MockLevel(LanguageLevel.PYTHON310, ui = PyToolUIInfo("Z")),
MockLevel(LanguageLevel.PYTHON310, ui = PyToolUIInfo("B")),
MockLevel(LanguageLevel.PYTHON27),
MockLevel(LanguageLevel.PYTHON313),
)
@@ -30,9 +30,9 @@ class ComparatorsTest {
MockLevel(LanguageLevel.PYTHON314),
MockLevel(LanguageLevel.PYTHON313),
MockLevel(LanguageLevel.PYTHON310),
MockLevel(LanguageLevel.PYTHON310, ui = UICustomization("A")),
MockLevel(LanguageLevel.PYTHON310, ui = UICustomization("B")),
MockLevel(LanguageLevel.PYTHON310, ui = UICustomization("Z")),
MockLevel(LanguageLevel.PYTHON310, ui = PyToolUIInfo("A")),
MockLevel(LanguageLevel.PYTHON310, ui = PyToolUIInfo("B")),
MockLevel(LanguageLevel.PYTHON310, ui = PyToolUIInfo("Z")),
MockLevel(LanguageLevel.PYTHON27)
))
}
@@ -40,5 +40,5 @@ class ComparatorsTest {
private data class MockLevel(
override val languageLevel: LanguageLevel,
override val ui: UICustomization? = null,
override val ui: PyToolUIInfo? = null,
) : LanguageLevelHolder, UiHolder
@@ -8,7 +8,7 @@ import com.intellij.platform.eel.provider.localEel
import com.intellij.python.community.impl.venv.createVenv
import com.intellij.python.community.services.shared.LanguageLevelWithUiComparator
import com.intellij.python.community.services.shared.PythonWithUi
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.shared.VanillaPythonWithLanguageLevel
import com.jetbrains.python.PythonBinary
import com.jetbrains.python.Result
@@ -56,7 +56,7 @@ fun SystemPythonService(): SystemPythonService = ApplicationManager.getApplicati
*
* Instances could be obtained with [SystemPythonService]
*/
class SystemPython internal constructor(private val delegate: VanillaPythonWithLanguageLevel, override val ui: UICustomization?) : VanillaPythonWithLanguageLevel by delegate, PythonWithUi, Comparable<SystemPython> {
class SystemPython internal constructor(private val delegate: VanillaPythonWithLanguageLevel, override val ui: PyToolUIInfo?) : VanillaPythonWithLanguageLevel by delegate, PythonWithUi, Comparable<SystemPython> {
private companion object {
val comparator = LanguageLevelWithUiComparator<SystemPython>()
@@ -6,7 +6,7 @@ import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.getOrNull
import com.intellij.platform.eel.path.EelPath
import com.intellij.platform.eel.provider.asNioPath
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.systemPython.icons.PythonCommunityServicesSystemPythonIcons
import com.intellij.python.community.services.systemPython.SystemPythonProvider
import com.jetbrains.python.PythonBinary
@@ -56,9 +56,9 @@ private class AsdfSystemPythonProvider : SystemPythonProvider {
return PyResult.success(pythons)
}
override val uiCustomization: UICustomization?
override val uiCustomization: PyToolUIInfo?
get() {
// TODO: proper icon
return UICustomization(title = "asdf", icon = PythonCommunityServicesSystemPythonIcons.Asdf)
return PyToolUIInfo(toolName = "asdf", icon = PythonCommunityServicesSystemPythonIcons.Asdf)
}
}
@@ -4,7 +4,7 @@ package com.intellij.python.community.services.systemPython.impl.providers
import com.intellij.openapi.diagnostic.Logger
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.isMac
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.systemPython.icons.PythonCommunityServicesSystemPythonIcons
import com.intellij.python.community.services.systemPython.SystemPythonProvider
import com.jetbrains.python.PythonBinary
@@ -37,9 +37,9 @@ private class BrewSystemPythonProvider : SystemPythonProvider {
return PyResult.success(pythons)
}
override val uiCustomization: UICustomization?
override val uiCustomization: PyToolUIInfo
get() {
// TODO: proper icon
return UICustomization(title = "homebrew", icon = PythonCommunityServicesSystemPythonIcons.Homebrew)
return PyToolUIInfo(toolName = "homebrew", icon = PythonCommunityServicesSystemPythonIcons.Homebrew)
}
}
@@ -4,7 +4,7 @@ package com.intellij.python.community.services.systemPython.impl.providers
import com.intellij.openapi.diagnostic.Logger
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.isMac
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.systemPython.SystemPythonProvider
import com.jetbrains.python.PythonBinary
import com.jetbrains.python.errorProcessing.PyResult
@@ -51,7 +51,7 @@ private class MacSystemPythonProvider : SystemPythonProvider {
return PyResult.success(pythons)
}
override val uiCustomization: UICustomization?
override val uiCustomization: PyToolUIInfo?
get() {
// TODO:
return null
@@ -6,7 +6,7 @@ import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.getOrNull
import com.intellij.platform.eel.path.EelPath
import com.intellij.platform.eel.provider.asNioPath
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.systemPython.icons.PythonCommunityServicesSystemPythonIcons
import com.intellij.python.community.services.systemPython.SystemPythonProvider
import com.jetbrains.python.PythonBinary
@@ -56,9 +56,9 @@ private class PyenvSystemPythonProvider : SystemPythonProvider {
return PyResult.success(pythons)
}
override val uiCustomization: UICustomization?
override val uiCustomization: PyToolUIInfo?
get() {
// TODO: proper icon
return UICustomization(title = "pyenv", icon = PythonCommunityServicesSystemPythonIcons.Pyenv)
return PyToolUIInfo(toolName = "pyenv", icon = PythonCommunityServicesSystemPythonIcons.Pyenv)
}
}
@@ -6,7 +6,7 @@ import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.EelPlatform
import com.intellij.platform.eel.isMac
import com.intellij.python.community.services.systemPython.SystemPythonProvider
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.jetbrains.python.PythonBinary
import com.jetbrains.python.errorProcessing.PyResult
import kotlinx.coroutines.Dispatchers
@@ -48,7 +48,7 @@ private class UnixSystemPythonProvider : SystemPythonProvider {
return PyResult.success(pythons)
}
override val uiCustomization: UICustomization?
override val uiCustomization: PyToolUIInfo?
get() {
// TODO:
return null
@@ -3,7 +3,7 @@ package com.intellij.python.community.services.systemPython
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.platform.eel.EelApi
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.systemPython.SystemPythonProvider.Companion.EP
import com.jetbrains.python.PythonBinary
import com.jetbrains.python.errorProcessing.PyResult
@@ -19,7 +19,7 @@ interface SystemPythonProvider {
/**
* You can optionally customize how your pythons are displayed
*/
val uiCustomization: UICustomization? get() = null
val uiCustomization: PyToolUIInfo? get() = null
suspend fun findSystemPythons(eelApi: EelApi): PyResult<Set<PythonBinary>>
}
@@ -8,12 +8,11 @@ import com.intellij.openapi.diagnostic.fileLogger
import com.intellij.openapi.util.registry.RegistryManager
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.EelDescriptor
import com.intellij.platform.eel.EelMachine
import com.intellij.platform.eel.provider.getEelDescriptor
import com.intellij.platform.eel.provider.localEel
import com.intellij.python.community.impl.installer.PySdkToInstallManager
import com.intellij.python.community.services.internal.impl.VanillaPythonWithLanguageLevelImpl
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.systemPython.SystemPythonServiceImpl.MyServiceState
import com.intellij.python.community.services.systemPython.impl.Cache
import com.intellij.python.community.services.systemPython.impl.PySystemPythonBundle
@@ -107,7 +106,7 @@ internal class SystemPythonServiceImpl(scope: CoroutineScope) : SystemPythonServ
private suspend fun searchPythonsPhysicallyNoCache(eelApi: EelApi): List<SystemPython> = withContext(Dispatchers.IO) {
findPythonsMutex.withLock {
val pythonsUi = mutableMapOf<PythonBinary, UICustomization>()
val pythonsUi = mutableMapOf<PythonBinary, PyToolUIInfo>()
val pythonsFromExtensions = SystemPythonProvider.EP.extensionList
.flatMap { provider ->
@@ -36,7 +36,7 @@ import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import com.intellij.platform.eel.EelApi
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.jetbrains.python.PythonBinary
import com.jetbrains.python.errorProcessing.PyResult
import java.nio.file.Path
@@ -120,7 +120,7 @@ class SystemPythonServiceShowCaseTest {
private class CountingTestProvider(
private val result: PyResult<Set<PythonBinary>>,
override val uiCustomization: UICustomization? = null,
override val uiCustomization: PyToolUIInfo? = null,
) : SystemPythonProvider {
var calls: Int = 0
override suspend fun findSystemPythons(eelApi: EelApi): PyResult<Set<PythonBinary>> {
@@ -4,7 +4,7 @@ package com.intellij.python.junit5Tests.env.systemPython.impl
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.python.community.impl.venv.createVenv
import com.intellij.python.community.services.shared.UICustomization
import com.jetbrains.python.PyToolUIInfo
import com.intellij.python.community.services.systemPython.SystemPythonProvider
import com.intellij.python.community.services.systemPython.SystemPythonService
import com.intellij.python.junit5Tests.framework.env.PyEnvTestCase
@@ -17,7 +17,6 @@ import com.jetbrains.python.Result
import com.jetbrains.python.getOrThrow
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
@@ -48,7 +47,7 @@ class EnvProviderTest {
@TempDir venvDir: Path,
): Unit = timeoutRunBlocking {
val venvPython = createVenv(python, venvDir).getOrThrow()
val ui = UICustomization("myui")
val ui = PyToolUIInfo("myui")
val provider = InlineTestProvider(setOf(venvPython), ui)
ApplicationManager.getApplication().registerExtension(SystemPythonProvider.EP, provider, disposable)
val python = SystemPythonService().findSystemPythons(forceRefresh = true).first { it.pythonBinary == venvPython }
@@ -57,7 +56,7 @@ class EnvProviderTest {
private class InlineTestProvider(
private val pythons: Set<PythonBinary>,
override val uiCustomization: UICustomization?
override val uiCustomization: PyToolUIInfo?
) : SystemPythonProvider {
override suspend fun findSystemPythons(eelApi: EelApi) = Result.success(pythons)
}