[python] PY-82518 Support GraalPy python version

(cherry picked from commit 3311ca83f0875a77c0fd370d5d66afc66f7393ca)

IJ-MR-178647

GitOrigin-RevId: 1d3583e8524ccee70a90918dfa57e11bd51c9641
This commit is contained in:
Alexey Katsman
2025-10-15 15:58:24 +02:00
committed by intellij-monorepo-bot
parent f52619319c
commit fd7ad7fcd7
2 changed files with 18 additions and 14 deletions

View File

@@ -31,6 +31,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -65,7 +66,7 @@ public abstract class PythonSdkFlavor<D extends PyFlavorData> {
.maximumSize(1000)
.build();
private static final Pattern VERSION_RE = Pattern.compile("(Python \\S+).*");
private static final Pattern VERSION_RE = Pattern.compile("((Python|GraalPy) (\\S+)).*", Pattern.DOTALL);
private static final Logger LOG = Logger.getInstance(PythonSdkFlavor.class);
@@ -436,8 +437,9 @@ public abstract class PythonSdkFlavor<D extends PyFlavorData> {
* @return level or null if no parsable output was found
*/
public static @Nullable LanguageLevel getLanguageLevelFromVersionStringStaticSafe(@NotNull String versionString) {
if (versionString.startsWith(PYTHON_VERSION_STRING_PREFIX)) {
return LanguageLevel.fromPythonVersionSafe(versionString.substring(PYTHON_VERSION_STRING_PREFIX.length()));
final Matcher m = VERSION_RE.matcher(versionString);
if (m.matches()) {
return LanguageLevel.fromPythonVersionSafe(m.group(3));
}
return null;
}

View File

@@ -30,23 +30,25 @@ import org.jetbrains.annotations.NotNull;
public class PySdkFlavorTest extends PyTestCase {
public void testPython27VersionString() {
final PythonSdkFlavor flavor = UnixPythonSdkFlavor.getInstance();
final String versionOutput = "Python 2.7.6\n";
final Sdk mockSdk = createMockSdk(flavor, versionOutput);
assertEquals("Python 2.7.6", mockSdk.getVersionString());
assertEquals(LanguageLevel.PYTHON27, flavor.getLanguageLevel(mockSdk));
testVersionAndFlavor("Python 2.7.6\n", "Python 2.7.6", LanguageLevel.PYTHON27);
}
public void testPython34VersionString() {
final PythonSdkFlavor flavor = UnixPythonSdkFlavor.getInstance();
final String versionOutput = "Python 3.4.0\n";
final Sdk mockSdk = createMockSdk(flavor, versionOutput);
assertEquals("Python 3.4.0", mockSdk.getVersionString());
assertEquals(LanguageLevel.PYTHON34, flavor.getLanguageLevel(mockSdk));
testVersionAndFlavor("Python 3.4.0\n", "Python 3.4.0", LanguageLevel.PYTHON34);
}
public void testGraalPyVersionString() {
testVersionAndFlavor("GraalPy 3.12.8 (Interpreted JVM Development Build)\n", "GraalPy 3.12.8", LanguageLevel.PYTHON312);
}
private void testVersionAndFlavor(
@NotNull String versionOutput, @NotNull String expectedVersionString, @NotNull LanguageLevel expectedLanguageLevel
) {
final PythonSdkFlavor<?> flavor = UnixPythonSdkFlavor.getInstance();
final Sdk mockSdk = createMockSdk(flavor, versionOutput);
assertEquals(expectedVersionString, mockSdk.getVersionString());
assertEquals(expectedLanguageLevel, flavor.getLanguageLevel(mockSdk));
}
// TODO: Add tests for MayaPy and IronPython SDK flavors