From 7e69f62093f5162f403cea2b3429479598bd284e Mon Sep 17 00:00:00 2001 From: konstin Date: Fri, 10 Oct 2025 19:15:00 +0200 Subject: [PATCH] Support empty requires --- crates/uv-distribution/src/distribution_database.rs | 7 +++++-- crates/uv-variant-frontend/src/error.rs | 2 ++ crates/uv-variant-frontend/src/lib.rs | 4 ++++ crates/uv-variants/src/variants_json.rs | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/uv-distribution/src/distribution_database.rs b/crates/uv-distribution/src/distribution_database.rs index 88b71bd30..7683b8913 100644 --- a/crates/uv-distribution/src/distribution_database.rs +++ b/crates/uv-distribution/src/distribution_database.rs @@ -695,7 +695,7 @@ impl<'a, Context: BuildContext> DistributionDatabase<'a, Context> { } else { Err(Error::VariantLockMissing { variant_lock: PathBuf::from(variant_lock_path), - requires: provider.requires.clone(), + requires: provider.requires.clone().unwrap_or_default(), plugin_api: provider.plugin_api.clone().unwrap_or_default().clone(), }) } @@ -1548,7 +1548,10 @@ fn satisfies_provider_requires( { return false; } - requested_provider.requires.iter().all(|requested| { + let Some(requires) = &requested_provider.requires else { + return true; + }; + requires.iter().all(|requested| { static_provider.resolved.iter().any(|resolved| { // We ignore extras for simplicity. &requested.name == resolved.name() diff --git a/crates/uv-variant-frontend/src/error.rs b/crates/uv-variant-frontend/src/error.rs index 53a4d631c..b104e78c6 100644 --- a/crates/uv-variant-frontend/src/error.rs +++ b/crates/uv-variant-frontend/src/error.rs @@ -23,6 +23,8 @@ pub enum Error { RequirementsInstall(&'static str, #[source] AnyErrorBuild), #[error("Failed to create temporary virtualenv")] Virtualenv(#[from] uv_virtualenv::Error), + #[error("Provider plugin `{0}` is missing `requires`")] + MissingRequires(String), #[error("Failed to run `{0}`")] CommandFailed(PathBuf, #[source] io::Error), #[error("The build backend returned an error")] diff --git a/crates/uv-variant-frontend/src/lib.rs b/crates/uv-variant-frontend/src/lib.rs index 795b3bb6f..c06746114 100644 --- a/crates/uv-variant-frontend/src/lib.rs +++ b/crates/uv-variant-frontend/src/lib.rs @@ -85,6 +85,8 @@ impl VariantBuild { // Resolve and install the provider requirements. let requirements = backend .requires + .as_ref() + .ok_or_else(|| Error::MissingRequires(backend_name.clone()))? .iter() .cloned() .map(Requirement::from) @@ -158,6 +160,8 @@ impl VariantBuild { let requires = self .backend .requires + .as_ref() + .ok_or_else(|| Error::MissingRequires(self.backend_name.clone()))? .iter() .filter(|requirement| { requirement.evaluate_markers( diff --git a/crates/uv-variants/src/variants_json.rs b/crates/uv-variants/src/variants_json.rs index 2ef5bd884..72f7f48af 100644 --- a/crates/uv-variants/src/variants_json.rs +++ b/crates/uv-variants/src/variants_json.rs @@ -178,7 +178,7 @@ pub struct Provider { )] pub enable_if: MarkerTree, /// Dependency specifiers for how to install the plugin - pub requires: Vec>, + pub requires: Option>>, /// Whether this plugin is run at install time. pub plugin_use: Option, }