From 5aef76953ce43cfb989adaf7089cb1521581cc8e Mon Sep 17 00:00:00 2001 From: "Nikita.Ashihmin" Date: Thu, 29 May 2025 14:03:13 +0400 Subject: [PATCH] PY-81238 Packages: Fix Project Generation Signed-off-by: Nikita.Ashihmin GitOrigin-RevId: edd4e3acd80657aa171fdd8aeae06cb9ce9cd439 --- .../impl/emptyProject/PyV3EmptyProjectSettings.kt | 8 +++++--- python/pluginResources/messages/PyBundle.properties | 7 ++++++- .../newProjectWizard/PyV3ProjectBaseGenerator.kt | 6 +++++- .../PyV3ProjectTypeSpecificSettings.kt | 4 ++-- .../packaging/management/PythonPackageManagerExt.kt | 13 +++++++++++++ 5 files changed, 31 insertions(+), 7 deletions(-) diff --git a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/newProjectWizard/impl/emptyProject/PyV3EmptyProjectSettings.kt b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/newProjectWizard/impl/emptyProject/PyV3EmptyProjectSettings.kt index 9dc1d77ee83e..d9817c205053 100644 --- a/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/newProjectWizard/impl/emptyProject/PyV3EmptyProjectSettings.kt +++ b/python/ide/impl/src/com/intellij/pycharm/community/ide/impl/newProjectWizard/impl/emptyProject/PyV3EmptyProjectSettings.kt @@ -9,16 +9,16 @@ import com.intellij.openapi.project.rootManager import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.vfs.VirtualFile import com.intellij.pycharm.community.ide.impl.newProjectWizard.welcome.PyWelcome -import com.jetbrains.python.errorProcessing.ErrorSink +import com.jetbrains.python.errorProcessing.PyResult import com.jetbrains.python.newProjectWizard.PyV3ProjectTypeSpecificSettings import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext class PyV3EmptyProjectSettings(var generateWelcomeScript: Boolean = false) : PyV3ProjectTypeSpecificSettings { - override suspend fun generateProject(module: Module, baseDir: VirtualFile, sdk: Sdk, errorSink: ErrorSink) { + override suspend fun generateProject(module: Module, baseDir: VirtualFile, sdk: Sdk): PyResult { if (!generateWelcomeScript) - return + return PyResult.success(Unit) val sourceRoot = module.rootManager.sourceRoots.firstOrNull() ?: baseDir val file = edtWriteAction { @@ -29,6 +29,8 @@ class PyV3EmptyProjectSettings(var generateWelcomeScript: Boolean = false) : PyV file.navigate(true) } } + + return PyResult.success(Unit) } override fun toString(): String { diff --git a/python/pluginResources/messages/PyBundle.properties b/python/pluginResources/messages/PyBundle.properties index f5281be172f6..0b1237d9bad2 100644 --- a/python/pluginResources/messages/PyBundle.properties +++ b/python/pluginResources/messages/PyBundle.properties @@ -972,6 +972,8 @@ python.project.view.typeshed.stubs=Typeshed Stubs python.project.view.bundled.stubs=Bundled Stubs python.project.view.user.skeletons.node=Extended Definitions + +python.packaging.installing.error.failed.to.find.specification=Failed to find specification for {0} python.packaging.installing.packaging.tools=Installing packaging tools\u2026 python.packaging.list.packages=Loading installed packages\u2026 python.packaging.check.is.package.installed=Checking if package {0} is installed\u2026 @@ -1677,6 +1679,8 @@ python.project.model.uv=Uv action.Python.UvSync.text=Sync All uv Projects action.Python.UvLink.text=Link All uv Projects + +python.project.model.progress.title.generating=Generating new project\u2026 python.project.model.progress.title.syncing.all.projects=Syncing all {0} projects python.project.model.progress.title.syncing.projects.at=Syncing {0} projects at {1} python.project.model.progress.title.unlinking.projects.at=Unlinking {0} projects at {1} @@ -1705,4 +1709,5 @@ uv.run.configuration.editor.field.check.sync=Warn about package synchronization uv.run.configuration.validation.sdk=Please specify a valid uv sdk uv.run.configuration.validation.script=Please specify a valid python script to execute -uv.run.configuration.validation.module=Please specify a valid python module to execute \ No newline at end of file +uv.run.configuration.validation.module=Please specify a valid python module to execute + diff --git a/python/src/com/jetbrains/python/newProjectWizard/PyV3ProjectBaseGenerator.kt b/python/src/com/jetbrains/python/newProjectWizard/PyV3ProjectBaseGenerator.kt index 78d27da8fe0b..057f20886af3 100644 --- a/python/src/com/jetbrains/python/newProjectWizard/PyV3ProjectBaseGenerator.kt +++ b/python/src/com/jetbrains/python/newProjectWizard/PyV3ProjectBaseGenerator.kt @@ -13,7 +13,9 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.platform.DirectoryProjectGenerator import com.intellij.platform.ProjectGeneratorPeer +import com.intellij.platform.ide.progress.withBackgroundProgress import com.intellij.util.concurrency.annotations.RequiresEdt +import com.jetbrains.python.PyBundle import com.jetbrains.python.Result import com.jetbrains.python.newProjectWizard.collector.PyProjectTypeGenerator import com.jetbrains.python.newProjectWizard.collector.PythonNewProjectWizardCollector.logPythonNewProjectGenerated @@ -90,7 +92,9 @@ abstract class PyV3ProjectBaseGenerator } \ No newline at end of file diff --git a/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerExt.kt b/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerExt.kt index cb15caabc406..65bdf4ec6cfa 100644 --- a/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerExt.kt +++ b/python/src/com/jetbrains/python/packaging/management/PythonPackageManagerExt.kt @@ -3,6 +3,8 @@ package com.jetbrains.python.packaging.management +import com.jetbrains.python.PyBundle +import com.jetbrains.python.errorProcessing.PyResult import com.jetbrains.python.packaging.common.PythonPackage import com.jetbrains.python.packaging.common.PythonRepositoryPackageSpecification import com.jetbrains.python.packaging.normalizePackageName @@ -12,6 +14,17 @@ import com.jetbrains.python.packaging.requirement.PyRequirementRelation import org.jetbrains.annotations.ApiStatus +@ApiStatus.Internal +suspend fun PythonPackageManager.installPackages(vararg packages: String): PyResult> { + waitForInit() + val specifications = packages.map { + findPackageSpecification(normalizePackageName(it)) + ?: return PyResult.localizedError(PyBundle.message("python.packaging.installing.error.failed.to.find.specification", it)) + } + return installPackage(PythonPackageInstallRequest.ByRepositoryPythonPackageSpecifications(specifications)) +} + + @ApiStatus.Internal fun PythonPackageManager.getInstalledPackageSnapshot(packageName: String, version: String? = null): PythonPackage? { val normalizedPackage = normalizePackageName(packageName)