Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 37 additions & 24 deletions crates/uv-resolver/src/lock/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1227,19 +1227,23 @@ impl Lock {
self.fork_markers.as_slice()
}

/// The marker describing the universe of this resolution.
fn fork_markers_union(&self) -> MarkerTree {
if self.fork_markers.is_empty() {
return self.requires_python.to_marker_tree();
}
let mut fork_markers_union = MarkerTree::FALSE;
for fork_marker in &self.fork_markers {
fork_markers_union.or(fork_marker.pep508());
}
fork_markers_union
}

/// Checks whether the fork markers cover the entire supported marker space.
///
/// Returns the actually covered and the expected marker space on validation error.
pub fn check_marker_coverage(&self) -> Result<(), (MarkerTree, MarkerTree)> {
let fork_markers_union = if self.fork_markers().is_empty() {
self.requires_python.to_marker_tree()
} else {
let mut fork_markers_union = MarkerTree::FALSE;
for fork_marker in self.fork_markers() {
fork_markers_union.or(fork_marker.pep508());
}
fork_markers_union
};
let fork_markers_union = self.fork_markers_union();
let mut environments_union = if !self.supported_environments.is_empty() {
let mut environments_union = MarkerTree::FALSE;
for fork_marker in &self.supported_environments {
Expand Down Expand Up @@ -1271,15 +1275,7 @@ impl Lock {
&self,
new_requires_python: &RequiresPython,
) -> Result<(), (MarkerTree, MarkerTree)> {
let fork_markers_union = if self.fork_markers().is_empty() {
self.requires_python.to_marker_tree()
} else {
let mut fork_markers_union = MarkerTree::FALSE;
for fork_marker in self.fork_markers() {
fork_markers_union.or(fork_marker.pep508());
}
fork_markers_union
};
let fork_markers_union = self.fork_markers_union();
let new_requires_python = new_requires_python.to_marker_tree();
if fork_markers_union.is_disjoint(new_requires_python) {
Err((fork_markers_union, new_requires_python))
Expand Down Expand Up @@ -1314,6 +1310,11 @@ impl Lock {
}
}

// The simplified marker space covered by this resolution.
let simplified_environment =
SimplifiedMarkerTree::new(&self.requires_python, self.fork_markers_union())
.as_simplified_marker_tree();

if !self.supported_environments.is_empty() {
let supported_environments = each_element_on_its_line_array(
self.supported_environments
Expand Down Expand Up @@ -1626,7 +1627,11 @@ impl Lock {

let mut packages = ArrayOfTables::new();
for dist in &self.packages {
packages.push(dist.to_toml(&self.requires_python, &dist_count_by_name)?);
packages.push(dist.to_toml(
&self.requires_python,
simplified_environment,
&dist_count_by_name,
)?);
}

doc.insert("package", Item::ArrayOfTables(packages));
Expand Down Expand Up @@ -3674,6 +3679,7 @@ impl Package {
fn to_toml(
&self,
requires_python: &RequiresPython,
simplified_environment: MarkerTree,
dist_count_by_name: &FxHashMap<PackageName, u64>,
) -> Result<Table, toml_edit::ser::Error> {
let mut table = Table::new();
Expand All @@ -3691,7 +3697,7 @@ impl Package {

if !self.dependencies.is_empty() {
let deps = each_element_on_its_line_array(self.dependencies.iter().map(|dep| {
dep.to_toml(requires_python, dist_count_by_name)
dep.to_toml(simplified_environment, dist_count_by_name)
.into_inline_table()
}));
table.insert("dependencies", value(deps));
Expand All @@ -3701,7 +3707,7 @@ impl Package {
let mut optional_deps = Table::new();
for (extra, deps) in &self.optional_dependencies {
let deps = each_element_on_its_line_array(deps.iter().map(|dep| {
dep.to_toml(requires_python, dist_count_by_name)
dep.to_toml(simplified_environment, dist_count_by_name)
.into_inline_table()
}));
if !deps.is_empty() {
Expand All @@ -3717,7 +3723,7 @@ impl Package {
let mut dependency_groups = Table::new();
for (extra, deps) in &self.dependency_groups {
let deps = each_element_on_its_line_array(deps.iter().map(|dep| {
dep.to_toml(requires_python, dist_count_by_name)
dep.to_toml(simplified_environment, dist_count_by_name)
.into_inline_table()
}));
if !deps.is_empty() {
Expand Down Expand Up @@ -5744,7 +5750,7 @@ impl Dependency {
/// Returns the TOML representation of this dependency.
fn to_toml(
&self,
_requires_python: &RequiresPython,
simplified_environment: MarkerTree,
dist_count_by_name: &FxHashMap<PackageName, u64>,
) -> Table {
let mut table = Table::new();
Expand All @@ -5758,7 +5764,14 @@ impl Dependency {
.collect::<Array>();
table.insert("extra", value(extra_array));
}
if let Some(marker) = self.simplified_marker.try_to_string() {
// Avoid writing edge markers that are always fulfilled.
if !self
.simplified_marker
.as_simplified_marker_tree()
.negate()
.is_disjoint(simplified_environment)
&& let Some(marker) = self.simplified_marker.try_to_string()
{
table.insert("marker", value(marker));
}

Expand Down
40 changes: 20 additions & 20 deletions crates/uv/tests/lock/lock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18341,7 +18341,7 @@ fn lock_narrowed_python_version_upper() -> Result<()> {
version = "0.1.0"
source = { directory = "dependency" }
dependencies = [
{ name = "iniconfig", marker = "python_full_version >= '3.10'" },
{ name = "iniconfig" },
]

[package.metadata]
Expand All @@ -18361,7 +18361,7 @@ fn lock_narrowed_python_version_upper() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "dependency", marker = "python_full_version >= '3.10'" },
{ name = "dependency" },
]

[package.metadata]
Expand Down Expand Up @@ -18660,11 +18660,11 @@ fn lock_constrained_environment() -> Result<()> {
version = "24.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click", marker = "sys_platform != 'win32'" },
{ name = "mypy-extensions", marker = "sys_platform != 'win32'" },
{ name = "packaging", marker = "sys_platform != 'win32'" },
{ name = "pathspec", marker = "sys_platform != 'win32'" },
{ name = "platformdirs", marker = "sys_platform != 'win32'" },
{ name = "click" },
{ name = "mypy-extensions" },
{ name = "packaging" },
{ name = "pathspec" },
{ name = "platformdirs" },
]
sdist = { url = "https://files.pythonhosted.org/packages/8f/5f/bac24a952668c7482cfdb4ebf91ba57a796c9da8829363a772040c1a3312/black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", size = 634292, upload-time = "2024-03-15T19:35:43.699Z" }
wheels = [
Expand Down Expand Up @@ -18724,7 +18724,7 @@ fn lock_constrained_environment() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "black", marker = "sys_platform != 'win32'" },
{ name = "black" },
]

[package.metadata]
Expand Down Expand Up @@ -18989,11 +18989,11 @@ fn lock_constrained_environment_non_project() -> Result<()> {
version = "24.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click", marker = "sys_platform != 'win32'" },
{ name = "mypy-extensions", marker = "sys_platform != 'win32'" },
{ name = "packaging", marker = "sys_platform != 'win32'" },
{ name = "pathspec", marker = "sys_platform != 'win32'" },
{ name = "platformdirs", marker = "sys_platform != 'win32'" },
{ name = "click" },
{ name = "mypy-extensions" },
{ name = "packaging" },
{ name = "pathspec" },
{ name = "platformdirs" },
]
sdist = { url = "https://files.pythonhosted.org/packages/8f/5f/bac24a952668c7482cfdb4ebf91ba57a796c9da8829363a772040c1a3312/black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", size = 634292, upload-time = "2024-03-15T19:35:43.699Z" }
wheels = [
Expand All @@ -19008,7 +19008,7 @@ fn lock_constrained_environment_non_project() -> Result<()> {
version = "0.1.0"
source = { virtual = "child" }
dependencies = [
{ name = "black", marker = "sys_platform != 'win32'" },
{ name = "black" },
]

[package.metadata]
Expand Down Expand Up @@ -30468,7 +30468,7 @@ fn lock_arm() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "numpy", marker = "platform_machine == 'arm64'" },
{ name = "numpy" },
]

[package.metadata]
Expand Down Expand Up @@ -30544,7 +30544,7 @@ fn lock_x86_64() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "numpy", marker = "platform_machine == 'x86_64'" },
{ name = "numpy" },
]

[package.metadata]
Expand Down Expand Up @@ -30617,7 +30617,7 @@ fn lock_x86() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "numpy", marker = "platform_machine == 'i686'" },
{ name = "numpy" },
]

[package.metadata]
Expand Down Expand Up @@ -35788,7 +35788,7 @@ fn lock_android() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "deltachat-rpc-server", marker = "sys_platform == 'android'" },
{ name = "deltachat-rpc-server" },
]

[package.metadata]
Expand Down Expand Up @@ -35891,7 +35891,7 @@ fn lock_required_intersection() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "numpy", marker = "(platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'linux')" },
{ name = "numpy" },
]

[package.metadata]
Expand Down Expand Up @@ -36560,7 +36560,7 @@ fn lock_supported_environment_abi3_wheel() -> Result<()> {
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "abi3-package", marker = "python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform == 'linux'" },
{ name = "abi3-package" },
]

[package.metadata]
Expand Down
Loading
Loading