PY-20522 Fixed: Pycharm doesn't understand "compatible release" (~=) in requirements.txt?

Support compatible relation by splitting it into `>=` and `==` relation.
This commit is contained in:
Semyon Proshev
2017-05-15 22:22:23 +03:00
parent cc2c8ad1e1
commit 2cde0c4c5d
2 changed files with 54 additions and 1 deletions
@@ -99,7 +99,10 @@ public class PyRequirementVersionSpec {
case NE:
return VERSION_COMPARATOR.compare(version, myVersion) != 0;
case COMPATIBLE:
return false; // TODO: implement matching version against compatible relation
Objects.requireNonNull(myParsedVersion);
return new PyRequirementVersionSpec(PyRequirementRelation.GTE, myParsedVersion).matches(version) &&
new PyRequirementVersionSpec(PyRequirementRelation.EQ, toEqPartOfCompatibleRelation(myParsedVersion)).matches(version);
case STR_EQ:
return version.equals(myVersion);
default:
@@ -124,4 +127,14 @@ public class PyRequirementVersionSpec {
return Pair.createNonNull(publicVersion, localVersion);
}
@NotNull
private static PyRequirementVersion toEqPartOfCompatibleRelation(@NotNull PyRequirementVersion version) {
final String release = version.getRelease();
final int lastPoint = release.lastIndexOf(".");
if (lastPoint == -1) return version;
return new PyRequirementVersion(version.getEpoch(), release.substring(0, lastPoint) + "*", null, null, null, null);
}
}
@@ -2320,6 +2320,46 @@ public class PyRequirementTest extends PyTestCase {
assertEquals(negativeLocalVersion, negativeRequirement.match(Collections.singletonList(negativeLocalVersion)));
}
// https://www.python.org/dev/peps/pep-0440/#compatible-release
// PY-20522
public void testMatchingCompatible() {
final PyRequirement requirement = PyRequirement.fromLine("foo~=2.2");
final PyPackage release = new PyPackage("foo", "2.3", null, Collections.emptyList());
final PyPackage pre = new PyPackage("foo", "2.3a1", null, Collections.emptyList());
final PyPackage post = new PyPackage("foo", "2.3.post1", null, Collections.emptyList());
final PyPackage dev = new PyPackage("foo", "2.3.dev1", null, Collections.emptyList());
final PyPackage localVersion = new PyPackage("foo", "2.3+local.version", null, Collections.emptyList());
assertEquals(release, requirement.match(Collections.singletonList(release)));
assertEquals(pre, requirement.match(Collections.singletonList(pre)));
assertEquals(post, requirement.match(Collections.singletonList(post)));
assertEquals(dev, requirement.match(Collections.singletonList(dev)));
assertEquals(localVersion, requirement.match(Collections.singletonList(localVersion)));
final PyRequirement moreModernRequirement = PyRequirement.fromLine("foo~=2.4");
assertNull(moreModernRequirement.match(Arrays.asList(release, pre, post, dev, localVersion)));
}
// https://www.python.org/dev/peps/pep-0440/#compatible-release
// PY-20522
public void testMatchingCompatibleWithTrailingZero() {
final PyRequirement requirement = PyRequirement.fromLine("foo~=2.20.0");
final PyPackage release = new PyPackage("foo", "2.20.3", null, Collections.emptyList());
final PyPackage pre = new PyPackage("foo", "2.20.3a1", null, Collections.emptyList());
final PyPackage post = new PyPackage("foo", "2.20.3.post1", null, Collections.emptyList());
final PyPackage dev = new PyPackage("foo", "2.20.3.dev1", null, Collections.emptyList());
final PyPackage localVersion = new PyPackage("foo", "2.20.3+local.version", null, Collections.emptyList());
assertEquals(release, requirement.match(Collections.singletonList(release)));
assertEquals(pre, requirement.match(Collections.singletonList(pre)));
assertEquals(post, requirement.match(Collections.singletonList(post)));
assertEquals(dev, requirement.match(Collections.singletonList(dev)));
assertEquals(localVersion, requirement.match(Collections.singletonList(localVersion)));
final PyRequirement moreModernRequirement = PyRequirement.fromLine("foo~=2.21.0");
assertNull(moreModernRequirement.match(Arrays.asList(release, pre, post, dev, localVersion)));
}
// OPTIONS
public void testOptions() {
assertEmpty(