A library for python version numbers and specifiers, implementing PEP 440. See Reimplementing PEP 440 for some background.
Higher level bindings to the requirements syntax are available in pep508_rs.
```rust use std::str::FromStr; use pep440rs::{parseversion_specifiers, Version, VersionSpecifier};
let version = Version::fromstr("1.19").unwrap(); let versionspecifier = VersionSpecifier::fromstr("==1.*").unwrap(); assert!(versionspecifier.contains(&version)); let versionspecifiers = parseversionspecifiers(">=1.16, <2.0").unwrap(); assert!(versionspecifiers.iter().all(|specifier| specifier.contains(&version))); ```
In python (pip install pep440_rs
):
```python from pep440_rs import Version, VersionSpecifier
assert Version("1.1a1").anyprerelease() assert Version("1.1.dev2").anyprerelease() assert not Version("1.1").any_prerelease() assert VersionSpecifier(">=1.0").contains(Version("1.1a1")) assert not VersionSpecifier(">=1.1").contains(Version("1.1a1"))
assert Version("1.1") >= Version("1.1a1") assert Version("2.0") in VersionSpecifier("==2") ```
PEP 440 has a lot of unintuitive features, including:
1!1.2.3
. Lower epoch always means lower
version (1.0 <=2!0.1
)^
), but a pseudo-semver tilde (~=
)1.0+local > 1.0
when sorting,
but ==1.0
matches 1.0+local
. While the ordering of versions itself is a total order
the version matching needs to catch all sorts of special cases