diff --git a/python/intellij.python.community.impl.iml b/python/intellij.python.community.impl.iml index a0bda1516708..457daa46ea23 100644 --- a/python/intellij.python.community.impl.iml +++ b/python/intellij.python.community.impl.iml @@ -1,5 +1,27 @@ + + + + + + + + + + + + + + $KOTLIN_BUNDLED$/lib/kotlinx-serialization-compiler-plugin.jar + + + + + + + diff --git a/python/python-psi-impl/src/com/jetbrains/python/packaging/PyRequirements.kt b/python/python-psi-impl/src/com/jetbrains/python/packaging/PyRequirements.kt index 811f476007ef..e8b7e955e0f0 100644 --- a/python/python-psi-impl/src/com/jetbrains/python/packaging/PyRequirements.kt +++ b/python/python-psi-impl/src/com/jetbrains/python/packaging/PyRequirements.kt @@ -2,6 +2,8 @@ package com.jetbrains.python.packaging import com.intellij.openapi.util.text.StringUtil +import com.jetbrains.python.errorProcessing.PyResult +import com.jetbrains.python.errorProcessing.failure import com.jetbrains.python.packaging.requirement.PyRequirementRelation import com.jetbrains.python.packaging.requirement.PyRequirementVersionSpec @@ -35,6 +37,16 @@ fun pyRequirement(name: String, relation: PyRequirementRelation, version: String return PyRequirementImpl(name, listOf(versionSpec), listOf(name + relation.presentableText + version), "") } + +fun String.parseVersionSpec(): PyResult { + val value = trim() + val relation = PyRequirementRelation.entries.lastOrNull { value.startsWith(it.presentableText) } + ?: return failure("Could not parse relation from: $value") + + val version = value.removePrefix(relation.presentableText) + return PyResult.success(pyRequirementVersionSpec(relation, version)) +} + /** * This method could be used to obtain [PyRequirementVersionSpec] instances with specified relation and version. * If given version could not be normalized, then specified relation will be replaced with [PyRequirementRelation.STR_EQ]. @@ -64,9 +76,11 @@ fun pyRequirementVersionSpec(relation: PyRequirementRelation, version: PyPackage /** * Instances of this class MUST be obtained from [pyRequirementVersionSpec]. */ -private data class PyRequirementVersionSpecImpl(private val relation: PyRequirementRelation, - private val parsedVersion: PyPackageVersion?, - private val version: String) : PyRequirementVersionSpec { +private data class PyRequirementVersionSpecImpl( + private val relation: PyRequirementRelation, + private val parsedVersion: PyPackageVersion?, + private val version: String, +) : PyRequirementVersionSpec { override fun getRelation() = relation override fun getVersion() = version diff --git a/python/src/com/jetbrains/python/packaging/conda/CondaParseUtils.kt b/python/src/com/jetbrains/python/packaging/conda/CondaParseUtils.kt index 82eeb303cfb3..1ce2a0030106 100644 --- a/python/src/com/jetbrains/python/packaging/conda/CondaParseUtils.kt +++ b/python/src/com/jetbrains/python/packaging/conda/CondaParseUtils.kt @@ -21,14 +21,14 @@ internal object CondaParseUtils { } @Serializable - private data class CondaOutput(val actions: CondaOutputActions) + private data class CondaOutput(val actions: CondaOutputActions = CondaOutputActions()) @Serializable private data class CondaOutputActions( @SerialName("LINK") - val link: List, + val link: List = emptyList(), @SerialName("UNLINK") - val unlink: List, + val unlink: List = emptyList(), ) @Serializable diff --git a/python/src/com/jetbrains/python/requirements/UnsatisfiedRequirementInspection.kt b/python/src/com/jetbrains/python/requirements/UnsatisfiedRequirementInspection.kt index 7714ad8e2e3f..291ea59cfe21 100644 --- a/python/src/com/jetbrains/python/requirements/UnsatisfiedRequirementInspection.kt +++ b/python/src/com/jetbrains/python/requirements/UnsatisfiedRequirementInspection.kt @@ -29,7 +29,6 @@ import com.jetbrains.python.packaging.common.runPackagingOperationOrShowErrorDia import com.jetbrains.python.packaging.management.PythonPackageManager import com.jetbrains.python.packaging.management.runPackagingTool import com.jetbrains.python.packaging.management.toInstallRequest -import com.jetbrains.python.packaging.requirement.PyRequirementRelation import com.jetbrains.python.packaging.toolwindow.PyPackagingToolWindowService import com.jetbrains.python.requirements.psi.NameReq import com.jetbrains.python.requirements.psi.Requirement @@ -134,7 +133,7 @@ private class InstallRequirementQuickFix(requirement: Requirement) : LocalQuickF val file = descriptor.psiElement.containingFile ?: return val sdk = getPythonSdk(file) ?: return val versionSpecStr = if (requirement is NameReq) requirement.versionspec?.text else null - val versionSpec = versionSpecStr?.let { pyRequirementVersionSpec(PyRequirementRelation.EQ, it) } // TODO CHECK + val versionSpec = versionSpecStr?.parseVersionSpec()?.getOr { return } val name = requirement.displayName project.service().serviceScope.launch(Dispatchers.IO) { @@ -162,7 +161,7 @@ private class InstallRequirementQuickFix(requirement: Requirement) : LocalQuickF } val manager = PythonPackageManager.forSdk(project, sdk) val specs = infos.mapNotNull { (name, versionSpecStr) -> - val versionSpec = versionSpecStr?.let { pyRequirementVersionSpec(PyRequirementRelation.EQ, it) } // TODO CHECK + val versionSpec = versionSpecStr?.parseVersionSpec()?.getOr { return@mapNotNull null } manager.createPackageSpecificationWithSpec(name, versionSpec) }