impl TryFrom<&VersionSpecifiers> for PubGrubSpecifier (#4010)

Add a missing utility conversion method from PEP 440 versions specifiers
to a pubgrub range.
This commit is contained in:
konsti 2024-06-04 10:00:07 +02:00 committed by GitHub
parent 40e0dddd00
commit 36f7fa3917
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 21 additions and 15 deletions

View file

@ -228,12 +228,7 @@ impl PubGrubRequirement {
range.intersection(&specifier.into())
})?
} else {
specifier
.iter()
.map(PubGrubSpecifier::try_from)
.fold_ok(Range::full(), |range, specifier| {
range.intersection(&specifier.into())
})?
PubGrubSpecifier::try_from(specifier)?.into()
};
Ok(Self {

View file

@ -1,6 +1,7 @@
use itertools::Itertools;
use pubgrub::range::Range;
use pep440_rs::{Operator, PreRelease, Version, VersionSpecifier};
use pep440_rs::{Operator, PreRelease, Version, VersionSpecifier, VersionSpecifiers};
use crate::ResolveError;
@ -15,10 +16,25 @@ impl From<PubGrubSpecifier> for Range<Version> {
}
}
impl TryFrom<&VersionSpecifiers> for PubGrubSpecifier {
type Error = ResolveError;
/// Convert a PEP 440 specifier to a PubGrub-compatible version range.
fn try_from(specifiers: &VersionSpecifiers) -> Result<Self, ResolveError> {
let range = specifiers
.iter()
.map(crate::pubgrub::PubGrubSpecifier::try_from)
.fold_ok(Range::full(), |range, specifier| {
range.intersection(&specifier.into())
})?;
Ok(Self(range))
}
}
impl TryFrom<&VersionSpecifier> for PubGrubSpecifier {
type Error = ResolveError;
/// Convert a PEP 508 specifier to a PubGrub-compatible version range.
/// Convert a PEP 440 specifier to a PubGrub-compatible version range.
fn try_from(specifier: &VersionSpecifier) -> Result<Self, ResolveError> {
let ranges = match specifier.operator() {
Operator::Equal => {

View file

@ -7,7 +7,6 @@ use std::thread;
use dashmap::DashMap;
use futures::{FutureExt, StreamExt, TryFutureExt};
use itertools::Itertools;
use pubgrub::error::PubGrubError;
use pubgrub::range::Range;
use pubgrub::solver::{Incompatibility, State};
@ -412,12 +411,8 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
)),
) = reason
{
let python_version = requires_python
.iter()
.map(PubGrubSpecifier::try_from)
.fold_ok(Range::full(), |range, specifier| {
range.intersection(&specifier.into())
})?;
let python_version: Range<Version> =
PubGrubSpecifier::try_from(&requires_python)?.into();
let package = &state.next;
state