Skip to content

Commit

Permalink
Move conflicting dependencies into PubGrub
Browse files Browse the repository at this point in the history
  • Loading branch information
charliermarsh committed Feb 21, 2024
1 parent 71ec568 commit 9573239
Show file tree
Hide file tree
Showing 20 changed files with 464 additions and 364 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ owo-colors = { version = "4.0.0" }
petgraph = { version = "0.6.4" }
platform-info = { version = "2.0.2" }
plist = { version = "1.6.0" }
pubgrub = { git = "https://github.com/zanieb/pubgrub", rev = "9b6d89cb8a0c7902815c8b2ae99106ba322ffb14" }
pubgrub = { git = "https://github.com/zanieb/pubgrub", rev = "5d0270cc2932ab233bb7f66a09fb0764fed7154e" }
pyo3 = { version = "0.20.2" }
pyo3-log = { version = "0.9.0"}
pyproject-toml = { version = "0.10.0" }
Expand Down
2 changes: 1 addition & 1 deletion crates/uv-dev/src/resolve_cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ pub(crate) async fn resolve_cli(args: ResolveCliArgs) -> Result<()> {
&flat_index,
&index,
&build_dispatch,
);
)?;
let resolution_graph = resolver.resolve().await.with_context(|| {
format!(
"No solution found when resolving: {}",
Expand Down
2 changes: 1 addition & 1 deletion crates/uv-dispatch/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ impl<'a> BuildContext for BuildDispatch<'a> {
self.flat_index,
self.index,
self,
);
)?;
let graph = resolver.resolve().await.with_context(|| {
format!(
"No solution found when resolving: {}",
Expand Down
30 changes: 30 additions & 0 deletions crates/uv-resolver/src/constraints.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
use std::hash::BuildHasherDefault;

use rustc_hash::FxHashMap;

use pep508_rs::Requirement;
use uv_normalize::PackageName;

/// A set of constraints for a set of requirements.
#[derive(Debug, Default, Clone)]
pub(crate) struct Constraints(FxHashMap<PackageName, Vec<Requirement>>);

impl Constraints {
/// Create a new set of constraints from a set of requirements.
pub(crate) fn from_requirements(requirements: Vec<Requirement>) -> Self {
let mut constraints: FxHashMap<PackageName, Vec<Requirement>> =
FxHashMap::with_capacity_and_hasher(requirements.len(), BuildHasherDefault::default());
for requirement in requirements {
constraints
.entry(requirement.name.clone())
.or_default()
.push(requirement);
}
Self(constraints)
}

/// Get the constraints for a package.
pub(crate) fn get(&self, name: &PackageName) -> Option<&Vec<Requirement>> {
self.0.get(name)
}
}
33 changes: 33 additions & 0 deletions crates/uv-resolver/src/editables.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
use std::hash::BuildHasherDefault;

use rustc_hash::FxHashMap;

use distribution_types::LocalEditable;
use pypi_types::Metadata21;
use uv_normalize::PackageName;

/// A set of editable packages, indexed by package name.
#[derive(Debug, Default, Clone)]
pub(crate) struct Editables(FxHashMap<PackageName, (LocalEditable, Metadata21)>);

impl Editables {
/// Create a new set of editables from a set of requirements.
pub(crate) fn from_requirements(requirements: Vec<(LocalEditable, Metadata21)>) -> Self {
let mut editables =
FxHashMap::with_capacity_and_hasher(requirements.len(), BuildHasherDefault::default());
for (editable_requirement, metadata) in requirements {
editables.insert(metadata.name.clone(), (editable_requirement, metadata));
}
Self(editables)
}

/// Get the editable for a package.
pub(crate) fn get(&self, name: &PackageName) -> Option<&(LocalEditable, Metadata21)> {
self.0.get(name)
}

/// Iterate over all editables.
pub(crate) fn iter(&self) -> impl Iterator<Item = &(LocalEditable, Metadata21)> {
self.0.values()
}
}
6 changes: 4 additions & 2 deletions crates/uv-resolver/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ use indexmap::IndexMap;
use pubgrub::range::Range;
use pubgrub::report::{DefaultStringReporter, DerivationTree, Reporter};
use rustc_hash::FxHashMap;
use url::Url;

use distribution_types::{BuiltDist, IndexLocations, PathBuiltDist, PathSourceDist, SourceDist};
use once_map::OnceMap;
Expand Down Expand Up @@ -53,7 +52,10 @@ pub enum ResolveError {
ConflictingVersions(String, String),

#[error("Package `{0}` attempted to resolve via URL: {1}. URL dependencies must be expressed as direct requirements or constraints. Consider adding `{0} @ {1}` to your dependencies or constraints file.")]
DisallowedUrl(PackageName, Url),
DisallowedUrl(PackageName, String),

#[error("There are conflicting editable requirements for package `{0}`:\n- {1}\n- {2}")]
ConflictingEditables(PackageName, String, String),

#[error(transparent)]
DistributionType(#[from] distribution_types::Error),
Expand Down
2 changes: 2 additions & 0 deletions crates/uv-resolver/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ pub use resolver::{
};

mod candidate_selector;
mod constraints;
mod dependency_mode;
mod editables;
mod error;
mod finder;
mod manifest;
Expand Down
2 changes: 1 addition & 1 deletion crates/uv-resolver/src/overrides.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use itertools::Either;
use std::hash::BuildHasherDefault;

use itertools::Either;
use rustc_hash::FxHashMap;

use pep508_rs::Requirement;
Expand Down

0 comments on commit 9573239

Please sign in to comment.