From 36f7fa3917cf576d611aedd4cf53b79f02591d5d Mon Sep 17 00:00:00 2001 From: konsti Date: Tue, 4 Jun 2024 10:00:07 +0200 Subject: [PATCH] `impl TryFrom<&VersionSpecifiers> for PubGrubSpecifier` (#4010) Add a missing utility conversion method from PEP 440 versions specifiers to a pubgrub range. --- .../uv-resolver/src/pubgrub/dependencies.rs | 7 +------ crates/uv-resolver/src/pubgrub/specifier.rs | 20 +++++++++++++++++-- crates/uv-resolver/src/resolver/mod.rs | 9 ++------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/crates/uv-resolver/src/pubgrub/dependencies.rs b/crates/uv-resolver/src/pubgrub/dependencies.rs index 9ef4ff408..eca4c20a8 100644 --- a/crates/uv-resolver/src/pubgrub/dependencies.rs +++ b/crates/uv-resolver/src/pubgrub/dependencies.rs @@ -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 { diff --git a/crates/uv-resolver/src/pubgrub/specifier.rs b/crates/uv-resolver/src/pubgrub/specifier.rs index 7939beb45..77f2b4453 100644 --- a/crates/uv-resolver/src/pubgrub/specifier.rs +++ b/crates/uv-resolver/src/pubgrub/specifier.rs @@ -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 for Range { } } +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 { + 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 { let ranges = match specifier.operator() { Operator::Equal => { diff --git a/crates/uv-resolver/src/resolver/mod.rs b/crates/uv-resolver/src/resolver/mod.rs index de01e8f20..16c3a8863 100644 --- a/crates/uv-resolver/src/resolver/mod.rs +++ b/crates/uv-resolver/src/resolver/mod.rs @@ -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 ResolverState = + PubGrubSpecifier::try_from(&requires_python)?.into(); let package = &state.next; state