mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
PY-79486: Cleanup (WIP)
We now have only one (`python.pyproject.model`) registry key enabled by default. Number of boilerplate was a little bit decreased too. GitOrigin-RevId: 0f7ecf324be038430230d9865688ce22ee922de6
This commit is contained in:
committed by
intellij-monorepo-bot
parent
de83ec0069
commit
3d6abaf160
+2
-1
@@ -12,6 +12,7 @@ import com.jetbrains.python.errorProcessing.MessageError
|
||||
import com.jetbrains.python.errorProcessing.PyResult
|
||||
import com.jetbrains.python.getOrNull
|
||||
import com.jetbrains.python.onSuccess
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.uv.UvProjectModelService
|
||||
import com.jetbrains.python.sdk.*
|
||||
import com.jetbrains.python.sdk.configuration.PyProjectSdkConfigurationExtension
|
||||
@@ -45,7 +46,7 @@ class PyUvSdkConfiguration : PyProjectSdkConfigurationExtension {
|
||||
|
||||
private suspend fun createUv(module: Module): PyResult<Sdk> {
|
||||
val sdkAssociatedModule: Module
|
||||
if (Registry.`is`("python.project.model.uv", false)) {
|
||||
if (enablePyProjectToml) {
|
||||
val uvWorkspace = UvProjectModelService.findWorkspace(module)
|
||||
sdkAssociatedModule = uvWorkspace?.root ?: module
|
||||
}
|
||||
|
||||
@@ -659,10 +659,8 @@
|
||||
<!-- Setting up cross-module dependencies -->
|
||||
<registryKey key="python.detect.cross.module.dependencies" defaultValue="false"
|
||||
description="Try to detect and automatically set-up module dependencies in a multi-module project"/>
|
||||
<registryKey key="python.project.model.poetry" defaultValue="false" restartRequired="true"
|
||||
description="Automatically set up multi-module Poetry projects"/>
|
||||
<registryKey key="python.project.model.uv" defaultValue="false" restartRequired="true"
|
||||
description="Automatically set up multi-module uv projects"/>
|
||||
<registryKey key="python.pyproject.model" defaultValue="true" restartRequired="true"
|
||||
description="Automatically set up multi-module pyproject.toml-based projects"/>
|
||||
|
||||
<feedback.idleFeedbackSurvey implementation="com.jetbrains.python.statistics.feedback.PythonJobSurvey"/>
|
||||
<statistics.counterUsagesCollector implementationClass="com.jetbrains.python.statistics.feedback.PythonJobStatisticsCollector"/>
|
||||
|
||||
@@ -11,6 +11,7 @@ import com.intellij.openapi.util.registry.Registry;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.jetbrains.python.projectModel.ProjectModelKt;
|
||||
import com.jetbrains.python.psi.PyUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -36,7 +37,7 @@ public final class PyDirectoryIconProvider extends IconProvider {
|
||||
}
|
||||
|
||||
private static boolean isMultimoduleProjectDetectionEnabled() {
|
||||
return Registry.is("python.project.model.uv") || Registry.is("python.project.model.poetry");
|
||||
return ProjectModelKt.getEnablePyProjectToml();
|
||||
}
|
||||
|
||||
private static boolean isSpecialDirectory(@NotNull PsiDirectory directory) {
|
||||
|
||||
@@ -43,6 +43,7 @@ import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.workspaceModel.ide.impl.legacyBridge.module.ModuleEntityUtils;
|
||||
import com.jetbrains.python.PyPsiBundle;
|
||||
import com.jetbrains.python.PythonIdeLanguageCustomization;
|
||||
import com.jetbrains.python.projectModel.ProjectModelKt;
|
||||
import com.jetbrains.python.projectModel.uv.UvProjectModelService;
|
||||
import com.jetbrains.python.projectModel.uv.UvProjectModelService.UvWorkspace;
|
||||
import com.jetbrains.python.psi.LanguageLevel;
|
||||
@@ -131,7 +132,7 @@ public final class PyInterpreterInspection extends PyInspection {
|
||||
boolean isAlreadyUsedByModule = (PySdkExtKt.getPythonSdk(module) == sdk);
|
||||
boolean isAssociatedWithThisModule = associatedModulePath != null && associatedModulePath.equals(BasePySdkExtKt.getBasePath(module));
|
||||
// TODO: this logic should be generalized via the workspace manager
|
||||
boolean isAssociatedWithUvRoot = associatedModulePath != null && Registry.is("python.project.model.uv", false) &&
|
||||
boolean isAssociatedWithUvRoot = associatedModulePath != null && ProjectModelKt.getEnablePyProjectToml() &&
|
||||
isAssociatedWithUvWorkspaceRootModule(associatedModulePath, module);
|
||||
|
||||
if (!isAlreadyUsedByModule && !isAssociatedWithThisModule && !isAssociatedWithUvRoot &&
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.jetbrains.python.projectModel
|
||||
|
||||
import com.intellij.ide.impl.runUnderModalProgressIfIsEdt
|
||||
import com.intellij.openapi.externalSystem.importing.AbstractOpenProjectProvider
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.projectImport.ProjectOpenProcessor
|
||||
|
||||
/**
|
||||
* Automatically configures a new project without `.idea/` as a project managed by Poetry if there is
|
||||
* a top-level pyproject.toml at the project root.
|
||||
* The user will be asked if
|
||||
* - There are several possible build systems for the project.
|
||||
* - The top-level pyproject.toml is added afterward in a project with existing `.idea/`.
|
||||
* - pyproject.toml files are found in non-top-level directories (requires IJPL-180733).
|
||||
*/
|
||||
internal abstract class PyProjectTomlOpenProcessorBase : ProjectOpenProcessor() {
|
||||
abstract val importProvider: AbstractOpenProjectProvider
|
||||
|
||||
final override fun canOpenProject(file: VirtualFile): Boolean = enablePyProjectToml && importProvider.canOpenProject(file)
|
||||
|
||||
final override fun doOpenProject(virtualFile: VirtualFile, projectToClose: Project?, forceOpenInNewFrame: Boolean): Project? {
|
||||
@Suppress("DEPRECATION") // Can't get rid of it because the platform doesn't provide neither suspend API nor thread guarantee
|
||||
return runUnderModalProgressIfIsEdt { importProvider.openProject(virtualFile, projectToClose, forceOpenInNewFrame) }
|
||||
}
|
||||
|
||||
final override suspend fun openProjectAsync(
|
||||
virtualFile: VirtualFile,
|
||||
projectToClose: Project?,
|
||||
forceOpenInNewFrame: Boolean,
|
||||
): Project? {
|
||||
return importProvider.openProject(virtualFile, projectToClose, forceOpenInNewFrame)
|
||||
}
|
||||
|
||||
final override fun canImportProjectAfterwards(): Boolean = true
|
||||
|
||||
// TODO Requires IJPL-180733
|
||||
|
||||
final override suspend fun importProjectAfterwardsAsync(project: Project, file: VirtualFile) {
|
||||
importProvider.linkToExistingProjectAsync(file, project)
|
||||
}
|
||||
}
|
||||
@@ -7,11 +7,11 @@ import com.intellij.openapi.actionSystem.AnActionEvent
|
||||
import com.intellij.openapi.components.Service
|
||||
import com.intellij.openapi.components.service
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.platform.backend.observation.ActivityKey
|
||||
import com.intellij.platform.backend.observation.launchTracked
|
||||
import com.intellij.platform.backend.observation.trackActivityBlocking
|
||||
import com.jetbrains.python.PyBundle
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.poetry.PoetryLinkAction.CoroutineScopeService.Companion.coroutineScope
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import org.jetbrains.annotations.Nls
|
||||
@@ -32,7 +32,7 @@ internal class PoetryLinkAction : AnAction() {
|
||||
}
|
||||
|
||||
override fun update(e: AnActionEvent) {
|
||||
e.presentation.isEnabledAndVisible = Registry.`is`("python.project.model.poetry")
|
||||
e.presentation.isEnabledAndVisible = enablePyProjectToml
|
||||
}
|
||||
|
||||
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
|
||||
|
||||
@@ -9,7 +9,6 @@ import com.intellij.openapi.externalSystem.autoimport.*
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.startup.ProjectActivity
|
||||
import com.intellij.openapi.util.io.toCanonicalPath
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.platform.backend.observation.launchTracked
|
||||
import com.intellij.platform.backend.workspace.workspaceModel
|
||||
import com.intellij.platform.workspace.jps.entities.ContentRootEntity
|
||||
@@ -18,6 +17,7 @@ import com.intellij.platform.workspace.storage.impl.url.toVirtualFileUrl
|
||||
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
|
||||
import com.intellij.python.pyproject.PY_PROJECT_TOML
|
||||
import com.intellij.workspaceModel.ide.toPath
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.poetry.PoetryProjectAware.CoroutineScopeService.Companion.coroutineScope
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import java.nio.file.Path
|
||||
@@ -42,7 +42,7 @@ internal class PoetryProjectAware(
|
||||
}
|
||||
|
||||
override fun reloadProject(context: ExternalSystemProjectReloadContext) {
|
||||
project.coroutineScope.launchTracked {
|
||||
project.coroutineScope.launchTracked {
|
||||
PoetryProjectModelService.syncProjectModelRoot(project, Path.of(projectId.externalProjectPath))
|
||||
}
|
||||
}
|
||||
@@ -70,14 +70,14 @@ internal class PoetryProjectAware(
|
||||
get() = service<CoroutineScopeService>().coroutineScope
|
||||
}
|
||||
}
|
||||
|
||||
internal class PoetrySyncStartupActivity: ProjectActivity {
|
||||
|
||||
internal class PoetrySyncStartupActivity : ProjectActivity {
|
||||
init {
|
||||
if (!Registry.`is`("python.project.model.poetry")) {
|
||||
if (!enablePyProjectToml) {
|
||||
throw ExtensionNotApplicableException.create()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override suspend fun execute(project: Project) {
|
||||
val projectTracker = ExternalSystemProjectTracker.getInstance(project)
|
||||
project.service<PoetrySettings>().getLinkedProjects().forEach { projectRoot ->
|
||||
@@ -89,13 +89,13 @@ internal class PoetryProjectAware(
|
||||
}
|
||||
}
|
||||
|
||||
internal class PoetryListener(private val project: Project): PoetrySettingsListener {
|
||||
internal class PoetryListener(private val project: Project) : PoetrySettingsListener {
|
||||
init {
|
||||
if (!Registry.`is`("python.project.model.poetry")) {
|
||||
if (!enablePyProjectToml) {
|
||||
throw ExtensionNotApplicableException.create()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun onLinkedProjectAdded(projectRoot: Path) {
|
||||
val projectTracker = ExternalSystemProjectTracker.getInstance(project)
|
||||
val projectId = ExternalSystemProjectId(PoetryConstants.SYSTEM_ID, projectRoot.toCanonicalPath())
|
||||
|
||||
@@ -1,50 +1,15 @@
|
||||
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.jetbrains.python.projectModel.poetry
|
||||
|
||||
import com.intellij.ide.impl.runUnderModalProgressIfIsEdt
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.projectImport.ProjectOpenProcessor
|
||||
import com.jetbrains.python.PyBundle
|
||||
import com.jetbrains.python.icons.PythonIcons
|
||||
import com.jetbrains.python.projectModel.PyProjectTomlOpenProcessorBase
|
||||
import org.jetbrains.annotations.Nls
|
||||
import javax.swing.Icon
|
||||
|
||||
/**
|
||||
* Automatically configures a new project without `.idea/` as a project managed by Poetry if there is
|
||||
* a top-level pyproject.toml at the project root.
|
||||
* The user will be asked if
|
||||
* - There are several possible build systems for the project.
|
||||
* - The top-level pyproject.toml is added afterward in a project with existing `.idea/`.
|
||||
* - pyproject.toml files are found in non-top-level directories (requires IJPL-180733).
|
||||
*/
|
||||
internal class PoetryProjectOpenProcessor: ProjectOpenProcessor() {
|
||||
private val importProvider = PoetryProjectOpenProvider()
|
||||
|
||||
|
||||
internal class PoetryProjectOpenProcessor : PyProjectTomlOpenProcessorBase() {
|
||||
override val importProvider = PoetryProjectOpenProvider()
|
||||
override val name: @Nls String = PyBundle.message("python.project.model.poetry")
|
||||
|
||||
override val icon: Icon?
|
||||
get() = PythonIcons.Python.Origami
|
||||
|
||||
override fun canOpenProject(file: VirtualFile): Boolean {
|
||||
return Registry.`is`("python.project.model.poetry") && importProvider.canOpenProject(file)
|
||||
}
|
||||
|
||||
override fun doOpenProject(virtualFile: VirtualFile, projectToClose: Project?, forceOpenInNewFrame: Boolean): Project? {
|
||||
return runUnderModalProgressIfIsEdt { importProvider.openProject(virtualFile, projectToClose, forceOpenInNewFrame) }
|
||||
}
|
||||
|
||||
override suspend fun openProjectAsync(virtualFile: VirtualFile,
|
||||
projectToClose: Project?,
|
||||
forceOpenInNewFrame: Boolean): Project? {
|
||||
return importProvider.openProject(virtualFile, projectToClose, forceOpenInNewFrame)
|
||||
}
|
||||
|
||||
override fun canImportProjectAfterwards(): Boolean = true
|
||||
|
||||
// TODO Requires IJPL-180733
|
||||
override suspend fun importProjectAfterwardsAsync(project: Project, file: VirtualFile) {
|
||||
importProvider.linkToExistingProjectAsync(file, project)
|
||||
}
|
||||
override val icon: Icon = PythonIcons.Python.Origami
|
||||
}
|
||||
@@ -7,11 +7,11 @@ import com.intellij.openapi.actionSystem.AnActionEvent
|
||||
import com.intellij.openapi.components.Service
|
||||
import com.intellij.openapi.components.service
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.platform.backend.observation.ActivityKey
|
||||
import com.intellij.platform.backend.observation.launchTracked
|
||||
import com.intellij.platform.backend.observation.trackActivityBlocking
|
||||
import com.jetbrains.python.PyBundle
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.poetry.PoetrySyncAction.CoroutineScopeService.Companion.coroutineScope
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import org.jetbrains.annotations.Nls
|
||||
@@ -30,7 +30,7 @@ internal class PoetrySyncAction : AnAction() {
|
||||
}
|
||||
|
||||
override fun update(e: AnActionEvent) {
|
||||
e.presentation.isEnabledAndVisible = Registry.`is`("python.project.model.poetry")
|
||||
e.presentation.isEnabledAndVisible = enablePyProjectToml
|
||||
}
|
||||
|
||||
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
|
||||
|
||||
@@ -8,8 +8,8 @@ import com.intellij.openapi.externalSystem.autolink.ExternalSystemUnlinkedProjec
|
||||
import com.intellij.openapi.externalSystem.model.ProjectSystemId
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.io.toCanonicalPath
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import java.nio.file.Path
|
||||
|
||||
internal class PoetryUnlinkedProjectAware : ExternalSystemUnlinkedProjectAware {
|
||||
@@ -18,7 +18,7 @@ internal class PoetryUnlinkedProjectAware : ExternalSystemUnlinkedProjectAware {
|
||||
override val systemId: ProjectSystemId = PoetryConstants.SYSTEM_ID
|
||||
|
||||
override fun isBuildFile(project: Project, buildFile: VirtualFile): Boolean {
|
||||
return Registry.`is`("python.project.model.poetry") && openProvider.canOpenProject(buildFile)
|
||||
return enablePyProjectToml && openProvider.canOpenProject(buildFile)
|
||||
}
|
||||
|
||||
override fun isLinkedProject(project: Project, externalProjectPath: String): Boolean {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
package com.jetbrains.python.projectModel
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
@@ -10,6 +11,12 @@ import java.nio.file.Path
|
||||
import kotlin.io.path.ExperimentalPathApi
|
||||
import kotlin.io.path.visitFileTree
|
||||
|
||||
|
||||
/**
|
||||
* Convert `pyproject.toml` to modules
|
||||
*/
|
||||
val enablePyProjectToml: Boolean get() = Registry.`is`("python.pyproject.model")
|
||||
|
||||
/**
|
||||
* Represents a graph of modules residing under a common root directory.
|
||||
* These modules might depend on each other, but it's not a requirement.
|
||||
|
||||
@@ -12,6 +12,7 @@ import com.intellij.platform.backend.observation.ActivityKey
|
||||
import com.intellij.platform.backend.observation.launchTracked
|
||||
import com.intellij.platform.backend.observation.trackActivityBlocking
|
||||
import com.jetbrains.python.PyBundle
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.uv.UvLinkAction.CoroutineScopeService.Companion.coroutineScope
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import org.jetbrains.annotations.Nls
|
||||
@@ -32,7 +33,7 @@ internal class UvLinkAction : AnAction() {
|
||||
}
|
||||
|
||||
override fun update(e: AnActionEvent) {
|
||||
e.presentation.isEnabledAndVisible = Registry.`is`("python.project.model.uv")
|
||||
e.presentation.isEnabledAndVisible = enablePyProjectToml
|
||||
}
|
||||
|
||||
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
|
||||
|
||||
@@ -9,7 +9,6 @@ import com.intellij.openapi.externalSystem.autoimport.*
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.startup.ProjectActivity
|
||||
import com.intellij.openapi.util.io.toCanonicalPath
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.platform.backend.observation.launchTracked
|
||||
import com.intellij.platform.backend.workspace.workspaceModel
|
||||
import com.intellij.platform.workspace.jps.entities.ContentRootEntity
|
||||
@@ -18,6 +17,7 @@ import com.intellij.platform.workspace.storage.impl.url.toVirtualFileUrl
|
||||
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
|
||||
import com.intellij.python.pyproject.PY_PROJECT_TOML
|
||||
import com.intellij.workspaceModel.ide.toPath
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.uv.UvProjectAware.CoroutineScopeService.Companion.coroutineScope
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import java.nio.file.Path
|
||||
@@ -42,7 +42,7 @@ internal class UvProjectAware(
|
||||
}
|
||||
|
||||
override fun reloadProject(context: ExternalSystemProjectReloadContext) {
|
||||
project.coroutineScope.launchTracked {
|
||||
project.coroutineScope.launchTracked {
|
||||
UvProjectModelService.syncProjectModelRoot(project, Path.of(projectId.externalProjectPath))
|
||||
}
|
||||
}
|
||||
@@ -70,14 +70,14 @@ internal class UvProjectAware(
|
||||
get() = service<CoroutineScopeService>().coroutineScope
|
||||
}
|
||||
}
|
||||
|
||||
private class UvSyncStartupActivity: ProjectActivity {
|
||||
|
||||
internal class UvSyncStartupActivity : ProjectActivity {
|
||||
init {
|
||||
if (!Registry.`is`("python.project.model.uv")) {
|
||||
if (!enablePyProjectToml) {
|
||||
throw ExtensionNotApplicableException.create()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override suspend fun execute(project: Project) {
|
||||
val projectTracker = ExternalSystemProjectTracker.getInstance(project)
|
||||
project.service<UvSettings>().getLinkedProjects().forEach { projectRoot ->
|
||||
@@ -88,14 +88,14 @@ internal class UvProjectAware(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class UvListener(private val project: Project): UvSettingsListener {
|
||||
|
||||
internal class UvListener(private val project: Project) : UvSettingsListener {
|
||||
init {
|
||||
if (!Registry.`is`("python.project.model.uv")) {
|
||||
if (!enablePyProjectToml) {
|
||||
throw ExtensionNotApplicableException.create()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun onLinkedProjectAdded(projectRoot: Path) {
|
||||
val projectTracker = ExternalSystemProjectTracker.getInstance(project)
|
||||
val projectId = ExternalSystemProjectId(UvConstants.SYSTEM_ID, projectRoot.toCanonicalPath())
|
||||
|
||||
@@ -1,50 +1,14 @@
|
||||
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
|
||||
package com.jetbrains.python.projectModel.uv
|
||||
|
||||
import com.intellij.ide.impl.runUnderModalProgressIfIsEdt
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.projectImport.ProjectOpenProcessor
|
||||
import com.jetbrains.python.PyBundle
|
||||
import com.jetbrains.python.icons.PythonIcons
|
||||
import com.jetbrains.python.projectModel.PyProjectTomlOpenProcessorBase
|
||||
import org.jetbrains.annotations.Nls
|
||||
import javax.swing.Icon
|
||||
|
||||
/**
|
||||
* Automatically configures a new project without `.idea/` as a project managed by uv if there is
|
||||
* a top-level pyproject.toml at the project root.
|
||||
* The user will be asked if
|
||||
* - There are several possible build systems for the project.
|
||||
* - The top-level pyproject.toml is added afterward in a project with existing `.idea/`.
|
||||
* - pyproject.toml files are found in non-top-level directories (requires IJPL-180733).
|
||||
*/
|
||||
internal class UvProjectOpenProcessor: ProjectOpenProcessor() {
|
||||
private val importProvider = UvProjectOpenProvider()
|
||||
|
||||
internal class UvProjectOpenProcessor : PyProjectTomlOpenProcessorBase() {
|
||||
override val importProvider = UvProjectOpenProvider()
|
||||
override val name: @Nls String = PyBundle.message("python.project.model.uv")
|
||||
|
||||
override val icon: Icon?
|
||||
get() = PythonIcons.UV
|
||||
|
||||
override fun canOpenProject(file: VirtualFile): Boolean {
|
||||
return Registry.`is`("python.project.model.uv") && importProvider.canOpenProject(file)
|
||||
}
|
||||
|
||||
override fun doOpenProject(virtualFile: VirtualFile, projectToClose: Project?, forceOpenInNewFrame: Boolean): Project? {
|
||||
return runUnderModalProgressIfIsEdt { importProvider.openProject(virtualFile, projectToClose, forceOpenInNewFrame) }
|
||||
}
|
||||
|
||||
override suspend fun openProjectAsync(virtualFile: VirtualFile,
|
||||
projectToClose: Project?,
|
||||
forceOpenInNewFrame: Boolean): Project? {
|
||||
return importProvider.openProject(virtualFile, projectToClose, forceOpenInNewFrame)
|
||||
}
|
||||
|
||||
override fun canImportProjectAfterwards(): Boolean = true
|
||||
|
||||
// TODO Requires IJPL-180733
|
||||
override suspend fun importProjectAfterwardsAsync(project: Project, file: VirtualFile) {
|
||||
importProvider.linkToExistingProjectAsync(file, project)
|
||||
}
|
||||
override val icon: Icon = PythonIcons.UV
|
||||
}
|
||||
@@ -7,11 +7,11 @@ import com.intellij.openapi.actionSystem.AnActionEvent
|
||||
import com.intellij.openapi.components.Service
|
||||
import com.intellij.openapi.components.service
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.platform.backend.observation.ActivityKey
|
||||
import com.intellij.platform.backend.observation.launchTracked
|
||||
import com.intellij.platform.backend.observation.trackActivityBlocking
|
||||
import com.jetbrains.python.PyBundle
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.uv.UvSyncAction.CoroutineScopeService.Companion.coroutineScope
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import org.jetbrains.annotations.Nls
|
||||
@@ -30,7 +30,7 @@ internal class UvSyncAction : AnAction() {
|
||||
}
|
||||
|
||||
override fun update(e: AnActionEvent) {
|
||||
e.presentation.isEnabledAndVisible = Registry.Companion.`is`("python.project.model.uv")
|
||||
e.presentation.isEnabledAndVisible = enablePyProjectToml
|
||||
}
|
||||
|
||||
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
|
||||
|
||||
@@ -8,17 +8,17 @@ import com.intellij.openapi.externalSystem.autolink.ExternalSystemUnlinkedProjec
|
||||
import com.intellij.openapi.externalSystem.model.ProjectSystemId
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.openapi.util.io.toCanonicalPath
|
||||
import com.intellij.openapi.util.registry.Registry
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import java.nio.file.Path
|
||||
|
||||
internal class UvUnlinkedProjectAware : ExternalSystemUnlinkedProjectAware {
|
||||
private val openProvider = UvProjectOpenProvider()
|
||||
|
||||
|
||||
override val systemId: ProjectSystemId = UvConstants.SYSTEM_ID
|
||||
|
||||
override fun isBuildFile(project: Project, buildFile: VirtualFile): Boolean {
|
||||
return Registry.`is`("python.project.model.uv") && openProvider.canOpenProject(buildFile)
|
||||
return enablePyProjectToml && openProvider.canOpenProject(buildFile)
|
||||
}
|
||||
|
||||
override fun isLinkedProject(project: Project, externalProjectPath: String): Boolean {
|
||||
|
||||
@@ -21,6 +21,7 @@ import com.jetbrains.python.PySdkBundle
|
||||
import com.jetbrains.python.PythonPluginDisposable
|
||||
import com.jetbrains.python.errorProcessing.PyResult
|
||||
import com.jetbrains.python.packaging.utils.PyPackageCoroutine
|
||||
import com.jetbrains.python.projectModel.enablePyProjectToml
|
||||
import com.jetbrains.python.projectModel.uv.UvProjectModelService
|
||||
import com.jetbrains.python.sdk.PySdkPopupFactory
|
||||
import com.jetbrains.python.sdk.configuration.suppressors.PyInterpreterInspectionSuppressor
|
||||
@@ -62,7 +63,7 @@ object PyProjectSdkConfiguration {
|
||||
} ?: return false
|
||||
|
||||
// TODO Move this to PyUvSdkConfiguration, show better notification
|
||||
if (sdk.isUv && Registry.`is`("python.project.model.uv", false)) {
|
||||
if (sdk.isUv && enablePyProjectToml) {
|
||||
val ws = UvProjectModelService.findWorkspace(module)
|
||||
if (ws != null) {
|
||||
for (wsModule in ws.members + ws.root) {
|
||||
|
||||
+3
-3
@@ -17,7 +17,7 @@ import org.junit.jupiter.api.Test
|
||||
import kotlin.io.path.writeText
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
@RegistryKey("python.project.model.poetry", "true")
|
||||
@RegistryKey("python.pyproject.model", "true")
|
||||
@TestApplication
|
||||
class PoetryProjectOpenIntegrationTest {
|
||||
private val testRoot by tempPathFixture()
|
||||
@@ -57,7 +57,7 @@ class PoetryProjectOpenIntegrationTest {
|
||||
@Test
|
||||
fun `project with top-level PEP-621 pyproject-toml containing tool-poetry table is automatically linked`() = timeoutRunBlocking(timeout = 20.seconds) {
|
||||
val projectPath = testRoot.resolve("project")
|
||||
|
||||
|
||||
projectPath.createFile(PY_PROJECT_TOML).writeText("""
|
||||
[project]
|
||||
name = "project"
|
||||
@@ -76,7 +76,7 @@ class PoetryProjectOpenIntegrationTest {
|
||||
@Test
|
||||
fun `project with top-level poetry-lock is automatically linked`() = timeoutRunBlocking(timeout = 20.seconds) {
|
||||
val projectPath = testRoot.resolve("project")
|
||||
|
||||
|
||||
projectPath.createFile("poetry.lock").writeText("""""")
|
||||
|
||||
projectPath.createFile(PY_PROJECT_TOML).writeText("""
|
||||
|
||||
+2
-2
@@ -23,7 +23,7 @@ import org.junit.jupiter.api.Assertions
|
||||
import org.junit.jupiter.api.Test
|
||||
import kotlin.io.path.writeText
|
||||
|
||||
@RegistryKey("python.project.model.poetry", "true")
|
||||
@RegistryKey("python.pyproject.model", "true")
|
||||
@TestApplication
|
||||
class PoetryProjectSyncIntegrationTest {
|
||||
private val testRootFixture = tempPathFixture()
|
||||
@@ -125,7 +125,7 @@ class PoetryProjectSyncIntegrationTest {
|
||||
DependencyAssertions.assertDependencies(module, INHERITED_SDK, MODULE_SOURCE)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
suspend fun syncAllProjects(project: Project) {
|
||||
multiprojectFixture.awaitProjectConfiguration(project) {
|
||||
PoetryProjectModelService.syncAllProjectModelRoots(project)
|
||||
|
||||
@@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test
|
||||
import kotlin.io.path.writeText
|
||||
import kotlin.time.Duration.Companion.seconds
|
||||
|
||||
@RegistryKey("python.project.model.uv", "true")
|
||||
@RegistryKey("python.pyproject.model", "true")
|
||||
@TestApplication
|
||||
class UvProjectOpenIntegrationTest {
|
||||
private val testRoot by tempPathFixture()
|
||||
|
||||
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.Test
|
||||
import java.nio.file.Path
|
||||
import kotlin.io.path.writeText
|
||||
|
||||
@RegistryKey("python.project.model.uv", "true")
|
||||
@RegistryKey("python.pyproject.model", "true")
|
||||
@TestApplication
|
||||
class UvProjectSyncIntegrationTest {
|
||||
private val testRootFixture = tempPathFixture()
|
||||
|
||||
Reference in New Issue
Block a user