Mark Python 2.6 and 3.4 language levels as unsupported (PY-32814)

This commit is contained in:
Semyon Proshev
2019-01-14 15:10:20 +03:00
parent 47ccecc286
commit cb08bba0f0
10 changed files with 35 additions and 25 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -41,6 +41,9 @@ public enum LanguageLevel {
*/
@Deprecated
PYTHON25(25, false, true, false, false),
/**
* @apiNote This level is not supported since 2019.1.
*/
PYTHON26(26, true, true, false, false),
PYTHON27(27, true, true, true, false),
/**
@@ -67,16 +70,23 @@ public enum LanguageLevel {
*/
@Deprecated
PYTHON33(33, true, false, true, true),
/**
* @apiNote This level is not supported since 2019.1.
*/
PYTHON34(34, true, false, true, true),
PYTHON35(35, true, false, true, true),
PYTHON36(36, true, false, true, true),
PYTHON37(37, true, false, true, true);
/**
* This value is mostly bound to the compatibility of our debugger and helpers.
* You're free to gradually drop support of versions not mentioned here if they present too much hassle to maintain.
*/
public static final List<LanguageLevel> SUPPORTED_LEVELS =
ImmutableList.copyOf(
Stream
.of(values())
.filter(v -> v.myVersion > 33 || v.myVersion == 26 || v.myVersion == 27)
.filter(v -> v.myVersion > 34 || v.myVersion == 27)
.collect(Collectors.toList())
);
@@ -61,7 +61,7 @@ public class PyFunctionTypeAnnotationFile extends PyFileImpl implements PyExpres
@Override
public LanguageLevel getLanguageLevel() {
// The same as for .pyi files
return LanguageLevel.PYTHON35;
return LanguageLevel.getLatest();
}
@Override
@@ -43,14 +43,15 @@ import com.jetbrains.python.psi.types.PyTypeChecker;
import com.jetbrains.python.psi.types.TypeEvalContext;
import com.jetbrains.python.validation.CompatibilityVisitor;
import com.jetbrains.python.validation.UnsupportedFeaturesUtil;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.*;
/**
* User: catherine
@@ -71,14 +72,20 @@ public class PyCompatibilityInspection extends PyInspection {
public static final List<LanguageLevel> DEFAULT_PYTHON_VERSIONS = ImmutableList.of(LanguageLevel.PYTHON27, LanguageLevel.getLatest());
@NotNull
public static final List<String> SUPPORTED_LEVELS = ContainerUtil.map(LanguageLevel.SUPPORTED_LEVELS, LanguageLevel::toString);
public static final List<LanguageLevel> SUPPORTED_LEVELS = StreamEx
.of(LanguageLevel.values())
.filter(v -> v.isPython2() && v.isAtLeast(LanguageLevel.PYTHON26) || v.isAtLeast(LanguageLevel.PYTHON34))
.toImmutableList();
@NotNull
private static final List<String> SUPPORTED_IN_SETTINGS = ContainerUtil.map(SUPPORTED_LEVELS, LanguageLevel::toString);
// Legacy DefaultJDOMExternalizer requires public fields for proper serialization
public JDOMExternalizableStringList ourVersions = new JDOMExternalizableStringList();
public PyCompatibilityInspection () {
if (ApplicationManager.getApplication().isUnitTestMode()) {
ourVersions.addAll(SUPPORTED_LEVELS);
ourVersions.addAll(SUPPORTED_IN_SETTINGS);
}
else {
ourVersions.addAll(ContainerUtil.map(DEFAULT_PYTHON_VERSIONS, LanguageLevel::toString));
@@ -101,7 +108,7 @@ public class PyCompatibilityInspection extends PyInspection {
List<LanguageLevel> result = new ArrayList<>();
for (String version : ourVersions) {
if (SUPPORTED_LEVELS.contains(version)) {
if (SUPPORTED_IN_SETTINGS.contains(version)) {
LanguageLevel level = LanguageLevel.fromPythonVersion(version);
result.add(level);
}
@@ -119,8 +126,8 @@ public class PyCompatibilityInspection extends PyInspection {
@Override
public JComponent createOptionsPanel() {
final ElementsChooser<String> chooser = new ElementsChooser<>(true);
chooser.setElements(SUPPORTED_LEVELS, false);
chooser.markElements(ContainerUtil.filter(ourVersions, SUPPORTED_LEVELS::contains));
chooser.setElements(SUPPORTED_IN_SETTINGS, false);
chooser.markElements(ContainerUtil.filter(ourVersions, SUPPORTED_IN_SETTINGS::contains));
chooser.addElementsMarkListener(new ElementsChooser.ElementsMarkListener<String>() {
@Override
public void elementMarkChanged(String element, boolean isMarked) {
@@ -146,7 +146,7 @@ public class PyCompatibilityInspectionAdvertiser implements Annotator {
private static List<LanguageLevel> getVersionsNewerThan(@NotNull LanguageLevel version) {
final List<LanguageLevel> result = new ArrayList<>();
final LanguageLevel latest = LanguageLevel.getLatest();
for (LanguageLevel level : LanguageLevel.SUPPORTED_LEVELS) {
for (LanguageLevel level : PyCompatibilityInspection.SUPPORTED_LEVELS) {
if (version.isOlderThan(level) && latest.isAtLeast(level)) {
result.add(level);
}
@@ -49,11 +49,8 @@ import java.util.regex.Pattern;
public class PyPackageManagerImpl extends PyPackageManager {
private static final String SETUPTOOLS_VERSION = "39.1.0";
private static final String SETUPTOOLS_VERSION_26 = "36.8.0";
private static final String PIP_VERSION = "10.0.1";
private static final String PIP_VERSION_26 = "9.0.3";
private static final String VIRTUALENV_VERSION = "16.0.0";
private static final String VIRTUALENV_VERSION_26 = "15.2.0";
private static final int ERROR_NO_SETUPTOOLS = 3;
@@ -91,17 +88,16 @@ public class PyPackageManagerImpl extends PyPackageManager {
@Override
public void installManagement() throws ExecutionException {
final LanguageLevel languageLevel = PythonSdkType.getLanguageLevelForSdk(getSdk());
if (languageLevel.isOlderThan(LanguageLevel.PYTHON26)) {
if (languageLevel.isOlderThan(LanguageLevel.PYTHON27)) {
throw new ExecutionException("Package management for Python " + languageLevel + " is not supported. " +
"Upgrade your project interpreter to Python " + LanguageLevel.PYTHON26 + " or newer");
"Upgrade your project interpreter to Python " + LanguageLevel.PYTHON27 + " or newer");
}
final boolean py26 = languageLevel == LanguageLevel.PYTHON26;
if (!refreshAndCheckForSetuptools()) {
installManagement(PyPackageUtil.SETUPTOOLS + "-" + (py26 ? SETUPTOOLS_VERSION_26 : SETUPTOOLS_VERSION));
installManagement(PyPackageUtil.SETUPTOOLS + "-" + SETUPTOOLS_VERSION);
}
if (PyPackageUtil.findPackage(refreshAndGetPackages(false), PyPackageUtil.PIP) == null) {
installManagement(PyPackageUtil.PIP + "-" + (py26 ? PIP_VERSION_26 : PIP_VERSION));
installManagement(PyPackageUtil.PIP + "-" + PIP_VERSION);
}
}
@@ -316,9 +312,9 @@ public class PyPackageManagerImpl extends PyPackageManager {
final Sdk sdk = getSdk();
final LanguageLevel languageLevel = getOrRequestLanguageLevelForSdk(sdk);
if (languageLevel.isOlderThan(LanguageLevel.PYTHON26)) {
if (languageLevel.isOlderThan(LanguageLevel.PYTHON27)) {
throw new ExecutionException("Creating virtual environment for Python " + languageLevel + " is not supported. " +
"Upgrade your project interpreter to Python " + LanguageLevel.PYTHON26 + " or newer");
"Upgrade your project interpreter to Python " + LanguageLevel.PYTHON27 + " or newer");
}
final boolean usePyVenv = languageLevel.isAtLeast(LanguageLevel.PYTHON33);
@@ -335,8 +331,7 @@ public class PyPackageManagerImpl extends PyPackageManager {
args.add("--system-site-packages");
}
args.add(destinationDir);
final boolean py26 = languageLevel == LanguageLevel.PYTHON26;
final String name = "virtualenv-" + (py26 ? VIRTUALENV_VERSION_26 : VIRTUALENV_VERSION);
final String name = "virtualenv-" + VIRTUALENV_VERSION;
final String dirName = extractHelper(name + ".tar.gz");
try {
final String fileName = dirName + name + mySeparator + "virtualenv.py";
@@ -32,7 +32,7 @@ class PyiFile(viewProvider: FileViewProvider) : PyFileImpl(viewProvider, PyiLang
override fun toString(): String = "PyiFile:$name"
override fun getLanguageLevel(): LanguageLevel = LanguageLevel.PYTHON37
override fun getLanguageLevel(): LanguageLevel = LanguageLevel.getLatest()
override fun multiResolveName(name: String, exported: Boolean): List<RatedResolveResult> {
if (name == "function" && PyBuiltinCache.getInstance(this).builtinsFile == this) return emptyList()
@@ -74,9 +74,7 @@ class PyAddNewCondaEnvPanel(private val project: Project?,
layout = BorderLayout()
// https://conda.io/docs/user-guide/install/index.html#system-requirements
val supportedLanguageLevels =
listOf(LanguageLevel.PYTHON36, LanguageLevel.PYTHON35, LanguageLevel.PYTHON34, LanguageLevel.PYTHON27)
.map { it.toString() }
val supportedLanguageLevels = listOf(LanguageLevel.PYTHON36, LanguageLevel.PYTHON35, LanguageLevel.PYTHON27).map { it.toString() }
languageLevelsField = JComboBox(supportedLanguageLevels.toTypedArray()).apply {
selectedItem = if (itemCount > 0) getItemAt(0) else null