From 79465099315be2480adb633b209fc5cf95df9c38 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Tue, 25 Jun 2024 02:37:08 +0300 Subject: [PATCH] Change Operations API to always accept `PythonRequirement` (#4498) ## Summary I think this is more intuitive than taking an `Option` and computing the requirement if it's `None`. --- crates/uv/src/commands/pip/compile.rs | 9 +++++---- crates/uv/src/commands/pip/install.rs | 12 +++++++++--- crates/uv/src/commands/pip/operations.rs | 9 ++------- crates/uv/src/commands/pip/sync.rs | 12 +++++++++--- crates/uv/src/commands/project/lock.rs | 3 +-- crates/uv/src/commands/project/mod.rs | 6 +++--- 6 files changed, 29 insertions(+), 22 deletions(-) diff --git a/crates/uv/src/commands/pip/compile.rs b/crates/uv/src/commands/pip/compile.rs index 827bda4e2..462e00fdc 100644 --- a/crates/uv/src/commands/pip/compile.rs +++ b/crates/uv/src/commands/pip/compile.rs @@ -211,9 +211,11 @@ pub(crate) async fn pip_compile( }; // Determine the Python requirement, if the user requested a specific version. - let python_requirement = python_version - .as_ref() - .map(|python_version| PythonRequirement::from_python_version(&interpreter, python_version)); + let python_requirement = if let Some(python_version) = python_version.as_ref() { + PythonRequirement::from_python_version(&interpreter, python_version) + } else { + PythonRequirement::from_interpreter(&interpreter) + }; // Determine the environment for the resolution. let (tags, markers) = resolution_environment(python_version, python_platform, &interpreter)?; @@ -316,7 +318,6 @@ pub(crate) async fn pip_compile( &hasher, &Reinstall::None, &upgrade, - &interpreter, Some(&tags), Some(&markers), python_requirement, diff --git a/crates/uv/src/commands/pip/install.rs b/crates/uv/src/commands/pip/install.rs index 6fd68a7e4..7d69677f9 100644 --- a/crates/uv/src/commands/pip/install.rs +++ b/crates/uv/src/commands/pip/install.rs @@ -23,7 +23,7 @@ use uv_installer::{SatisfiesResult, SitePackages}; use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_resolver::{ DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode, - ResolutionMode, + PythonRequirement, ResolutionMode, }; use uv_toolchain::{ EnvironmentPreference, Prefix, PythonEnvironment, PythonVersion, Target, ToolchainRequest, @@ -218,6 +218,13 @@ pub(crate) async fn pip_install( let interpreter = environment.interpreter(); + // Determine the Python requirement, if the user requested a specific version. + let python_requirement = if let Some(python_version) = python_version.as_ref() { + PythonRequirement::from_python_version(interpreter, python_version) + } else { + PythonRequirement::from_interpreter(interpreter) + }; + // Determine the environment for the resolution. let (tags, markers) = resolution_environment(python_version, python_platform, interpreter)?; @@ -327,10 +334,9 @@ pub(crate) async fn pip_install( &hasher, &reinstall, &upgrade, - interpreter, Some(&tags), Some(&markers), - None, + python_requirement, &client, &flat_index, &index, diff --git a/crates/uv/src/commands/pip/operations.rs b/crates/uv/src/commands/pip/operations.rs index f13a212d9..87b9ee3ba 100644 --- a/crates/uv/src/commands/pip/operations.rs +++ b/crates/uv/src/commands/pip/operations.rs @@ -37,7 +37,7 @@ use uv_resolver::{ DependencyMode, Exclusions, FlatIndex, InMemoryIndex, Manifest, Options, Preference, Preferences, PythonRequirement, ResolutionGraph, Resolver, }; -use uv_toolchain::{Interpreter, PythonEnvironment}; +use uv_toolchain::PythonEnvironment; use uv_types::{HashStrategy, InFlight, InstalledPackagesProvider}; use uv_warnings::warn_user; @@ -87,10 +87,9 @@ pub(crate) async fn resolve( hasher: &HashStrategy, reinstall: &Reinstall, upgrade: &Upgrade, - interpreter: &Interpreter, tags: Option<&Tags>, markers: Option<&MarkerEnvironment>, - python_requirement: Option, + python_requirement: PythonRequirement, client: &RegistryClient, flat_index: &FlatIndex, index: &InMemoryIndex, @@ -186,10 +185,6 @@ pub(crate) async fn resolve( let overrides = Overrides::from_requirements(overrides); let preferences = Preferences::from_iter(preferences, markers); - // Determine the Python requirement, defaulting to that of the interpreter. - let python_requirement = - python_requirement.unwrap_or_else(|| PythonRequirement::from_interpreter(interpreter)); - // Determine any lookahead requirements. let lookaheads = match options.dependency_mode { DependencyMode::Transitive => { diff --git a/crates/uv/src/commands/pip/sync.rs b/crates/uv/src/commands/pip/sync.rs index 01bc3b65b..774a1d574 100644 --- a/crates/uv/src/commands/pip/sync.rs +++ b/crates/uv/src/commands/pip/sync.rs @@ -22,7 +22,7 @@ use uv_installer::SitePackages; use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_resolver::{ DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode, - ResolutionMode, + PythonRequirement, ResolutionMode, }; use uv_toolchain::{ EnvironmentPreference, Prefix, PythonEnvironment, PythonVersion, Target, ToolchainRequest, @@ -169,6 +169,13 @@ pub(crate) async fn pip_sync( let interpreter = environment.interpreter(); + // Determine the Python requirement, if the user requested a specific version. + let python_requirement = if let Some(python_version) = python_version.as_ref() { + PythonRequirement::from_python_version(interpreter, python_version) + } else { + PythonRequirement::from_interpreter(interpreter) + }; + // Determine the environment for the resolution. let (tags, markers) = resolution_environment(python_version, python_platform, interpreter)?; @@ -279,10 +286,9 @@ pub(crate) async fn pip_sync( &hasher, &reinstall, &upgrade, - interpreter, Some(&tags), Some(&markers), - None, + python_requirement, &client, &flat_index, &index, diff --git a/crates/uv/src/commands/project/lock.rs b/crates/uv/src/commands/project/lock.rs index 2e06f4a59..b887761fe 100644 --- a/crates/uv/src/commands/project/lock.rs +++ b/crates/uv/src/commands/project/lock.rs @@ -220,10 +220,9 @@ pub(super) async fn do_lock( &hasher, &Reinstall::default(), upgrade, - interpreter, None, None, - Some(python_requirement), + python_requirement, &client, &flat_index, &index, diff --git a/crates/uv/src/commands/project/mod.rs b/crates/uv/src/commands/project/mod.rs index c06003f64..42710e2ab 100644 --- a/crates/uv/src/commands/project/mod.rs +++ b/crates/uv/src/commands/project/mod.rs @@ -16,7 +16,7 @@ use uv_fs::Simplified; use uv_git::GitResolver; use uv_installer::{SatisfiesResult, SitePackages}; use uv_requirements::{RequirementsSource, RequirementsSpecification}; -use uv_resolver::{FlatIndex, InMemoryIndex, OptionsBuilder, RequiresPython}; +use uv_resolver::{FlatIndex, InMemoryIndex, OptionsBuilder, PythonRequirement, RequiresPython}; use uv_toolchain::{ request_from_version_file, EnvironmentPreference, Interpreter, PythonEnvironment, Toolchain, ToolchainPreference, ToolchainRequest, VersionRequest, @@ -345,6 +345,7 @@ pub(crate) async fn update_environment( let interpreter = venv.interpreter(); let tags = venv.interpreter().tags()?; let markers = venv.interpreter().markers(); + let python_requirement = PythonRequirement::from_interpreter(interpreter); // Initialize the registry client. let client = RegistryClientBuilder::new(cache.clone()) @@ -421,10 +422,9 @@ pub(crate) async fn update_environment( &hasher, reinstall, upgrade, - interpreter, Some(tags), Some(markers), - None, + python_requirement, &client, &flat_index, &index,