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`.
This commit is contained in:
Charlie Marsh 2024-06-25 02:37:08 +03:00 committed by GitHub
parent 25cde888ae
commit 7946509931
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 29 additions and 22 deletions

View file

@ -211,9 +211,11 @@ pub(crate) async fn pip_compile(
}; };
// Determine the Python requirement, if the user requested a specific version. // Determine the Python requirement, if the user requested a specific version.
let python_requirement = python_version let python_requirement = if let Some(python_version) = python_version.as_ref() {
.as_ref() PythonRequirement::from_python_version(&interpreter, python_version)
.map(|python_version| PythonRequirement::from_python_version(&interpreter, python_version)); } else {
PythonRequirement::from_interpreter(&interpreter)
};
// Determine the environment for the resolution. // Determine the environment for the resolution.
let (tags, markers) = resolution_environment(python_version, python_platform, &interpreter)?; let (tags, markers) = resolution_environment(python_version, python_platform, &interpreter)?;
@ -316,7 +318,6 @@ pub(crate) async fn pip_compile(
&hasher, &hasher,
&Reinstall::None, &Reinstall::None,
&upgrade, &upgrade,
&interpreter,
Some(&tags), Some(&tags),
Some(&markers), Some(&markers),
python_requirement, python_requirement,

View file

@ -23,7 +23,7 @@ use uv_installer::{SatisfiesResult, SitePackages};
use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_requirements::{RequirementsSource, RequirementsSpecification};
use uv_resolver::{ use uv_resolver::{
DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode, DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode,
ResolutionMode, PythonRequirement, ResolutionMode,
}; };
use uv_toolchain::{ use uv_toolchain::{
EnvironmentPreference, Prefix, PythonEnvironment, PythonVersion, Target, ToolchainRequest, EnvironmentPreference, Prefix, PythonEnvironment, PythonVersion, Target, ToolchainRequest,
@ -218,6 +218,13 @@ pub(crate) async fn pip_install(
let interpreter = environment.interpreter(); 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. // Determine the environment for the resolution.
let (tags, markers) = resolution_environment(python_version, python_platform, interpreter)?; let (tags, markers) = resolution_environment(python_version, python_platform, interpreter)?;
@ -327,10 +334,9 @@ pub(crate) async fn pip_install(
&hasher, &hasher,
&reinstall, &reinstall,
&upgrade, &upgrade,
interpreter,
Some(&tags), Some(&tags),
Some(&markers), Some(&markers),
None, python_requirement,
&client, &client,
&flat_index, &flat_index,
&index, &index,

View file

@ -37,7 +37,7 @@ use uv_resolver::{
DependencyMode, Exclusions, FlatIndex, InMemoryIndex, Manifest, Options, Preference, DependencyMode, Exclusions, FlatIndex, InMemoryIndex, Manifest, Options, Preference,
Preferences, PythonRequirement, ResolutionGraph, Resolver, Preferences, PythonRequirement, ResolutionGraph, Resolver,
}; };
use uv_toolchain::{Interpreter, PythonEnvironment}; use uv_toolchain::PythonEnvironment;
use uv_types::{HashStrategy, InFlight, InstalledPackagesProvider}; use uv_types::{HashStrategy, InFlight, InstalledPackagesProvider};
use uv_warnings::warn_user; use uv_warnings::warn_user;
@ -87,10 +87,9 @@ pub(crate) async fn resolve<InstalledPackages: InstalledPackagesProvider>(
hasher: &HashStrategy, hasher: &HashStrategy,
reinstall: &Reinstall, reinstall: &Reinstall,
upgrade: &Upgrade, upgrade: &Upgrade,
interpreter: &Interpreter,
tags: Option<&Tags>, tags: Option<&Tags>,
markers: Option<&MarkerEnvironment>, markers: Option<&MarkerEnvironment>,
python_requirement: Option<PythonRequirement>, python_requirement: PythonRequirement,
client: &RegistryClient, client: &RegistryClient,
flat_index: &FlatIndex, flat_index: &FlatIndex,
index: &InMemoryIndex, index: &InMemoryIndex,
@ -186,10 +185,6 @@ pub(crate) async fn resolve<InstalledPackages: InstalledPackagesProvider>(
let overrides = Overrides::from_requirements(overrides); let overrides = Overrides::from_requirements(overrides);
let preferences = Preferences::from_iter(preferences, markers); 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. // Determine any lookahead requirements.
let lookaheads = match options.dependency_mode { let lookaheads = match options.dependency_mode {
DependencyMode::Transitive => { DependencyMode::Transitive => {

View file

@ -22,7 +22,7 @@ use uv_installer::SitePackages;
use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_requirements::{RequirementsSource, RequirementsSpecification};
use uv_resolver::{ use uv_resolver::{
DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode, DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode,
ResolutionMode, PythonRequirement, ResolutionMode,
}; };
use uv_toolchain::{ use uv_toolchain::{
EnvironmentPreference, Prefix, PythonEnvironment, PythonVersion, Target, ToolchainRequest, EnvironmentPreference, Prefix, PythonEnvironment, PythonVersion, Target, ToolchainRequest,
@ -169,6 +169,13 @@ pub(crate) async fn pip_sync(
let interpreter = environment.interpreter(); 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. // Determine the environment for the resolution.
let (tags, markers) = resolution_environment(python_version, python_platform, interpreter)?; let (tags, markers) = resolution_environment(python_version, python_platform, interpreter)?;
@ -279,10 +286,9 @@ pub(crate) async fn pip_sync(
&hasher, &hasher,
&reinstall, &reinstall,
&upgrade, &upgrade,
interpreter,
Some(&tags), Some(&tags),
Some(&markers), Some(&markers),
None, python_requirement,
&client, &client,
&flat_index, &flat_index,
&index, &index,

View file

@ -220,10 +220,9 @@ pub(super) async fn do_lock(
&hasher, &hasher,
&Reinstall::default(), &Reinstall::default(),
upgrade, upgrade,
interpreter,
None, None,
None, None,
Some(python_requirement), python_requirement,
&client, &client,
&flat_index, &flat_index,
&index, &index,

View file

@ -16,7 +16,7 @@ use uv_fs::Simplified;
use uv_git::GitResolver; use uv_git::GitResolver;
use uv_installer::{SatisfiesResult, SitePackages}; use uv_installer::{SatisfiesResult, SitePackages};
use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_requirements::{RequirementsSource, RequirementsSpecification};
use uv_resolver::{FlatIndex, InMemoryIndex, OptionsBuilder, RequiresPython}; use uv_resolver::{FlatIndex, InMemoryIndex, OptionsBuilder, PythonRequirement, RequiresPython};
use uv_toolchain::{ use uv_toolchain::{
request_from_version_file, EnvironmentPreference, Interpreter, PythonEnvironment, Toolchain, request_from_version_file, EnvironmentPreference, Interpreter, PythonEnvironment, Toolchain,
ToolchainPreference, ToolchainRequest, VersionRequest, ToolchainPreference, ToolchainRequest, VersionRequest,
@ -345,6 +345,7 @@ pub(crate) async fn update_environment(
let interpreter = venv.interpreter(); let interpreter = venv.interpreter();
let tags = venv.interpreter().tags()?; let tags = venv.interpreter().tags()?;
let markers = venv.interpreter().markers(); let markers = venv.interpreter().markers();
let python_requirement = PythonRequirement::from_interpreter(interpreter);
// Initialize the registry client. // Initialize the registry client.
let client = RegistryClientBuilder::new(cache.clone()) let client = RegistryClientBuilder::new(cache.clone())
@ -421,10 +422,9 @@ pub(crate) async fn update_environment(
&hasher, &hasher,
reinstall, reinstall,
upgrade, upgrade,
interpreter,
Some(tags), Some(tags),
Some(markers), Some(markers),
None, python_requirement,
&client, &client,
&flat_index, &flat_index,
&index, &index,