PY-81238 Packages: Fix Project Generation

Signed-off-by: Nikita.Ashihmin <nikita.ashihmin@jetbrains.com>

GitOrigin-RevId: edd4e3acd80657aa171fdd8aeae06cb9ce9cd439
This commit is contained in:
Nikita.Ashihmin
2025-05-31 10:40:24 +00:00
committed by intellij-monorepo-bot
parent e3c4abbc2d
commit 5aef76953c
5 changed files with 31 additions and 7 deletions
@@ -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<Unit> {
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 {
@@ -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
uv.run.configuration.validation.module=Please specify a valid python module to execute
@@ -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<TYPE_SPECIFIC_SETTINGS : PyV3ProjectType
// Either base settings (which create venv) might generate some or type-specific settings (like Django) may.
// So we expand it right after SDK generation, but if there are no files yet, we do it again after project generation
uiServices.expandProjectTreeView(project)
typeSpecificSettings.generateProject(module, baseDir, sdk, uiServices.errorSink)
withBackgroundProgress(project, PyBundle.message("python.project.model.progress.title.generating"), cancellable = true) {
typeSpecificSettings.generateProject(module, baseDir, sdk)
}
uiServices.expandProjectTreeView(project)
}
}
@@ -4,7 +4,7 @@ package com.jetbrains.python.newProjectWizard
import com.intellij.openapi.module.Module
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.vfs.VirtualFile
import com.jetbrains.python.errorProcessing.ErrorSink
import com.jetbrains.python.errorProcessing.PyResult
/**
* Implementation must have fields and generate project-specific (like Django) things using them i.e:
@@ -21,5 +21,5 @@ fun interface PyV3ProjectTypeSpecificSettings {
* Generate project-specific things in [baseDir].
* You might need to [installPackages] on [sdk].
*/
suspend fun generateProject(module: Module, baseDir: VirtualFile, sdk: Sdk, errorSink: ErrorSink)
suspend fun generateProject(module: Module, baseDir: VirtualFile, sdk: Sdk): PyResult<Unit>
}
@@ -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<List<PythonPackage>> {
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)