diff --git a/crates/uv-configuration/src/extras.rs b/crates/uv-configuration/src/extras.rs new file mode 100644 index 000000000..7704ff2fc --- /dev/null +++ b/crates/uv-configuration/src/extras.rs @@ -0,0 +1,35 @@ +use uv_normalize::ExtraName; + +#[derive(Debug, Default, Clone)] +pub enum ExtrasSpecification { + #[default] + None, + All, + Some(Vec), +} + +impl ExtrasSpecification { + /// Determine the extras specification to use based on the command-line arguments. + pub fn from_args(all_extras: bool, extra: Vec) -> Self { + if all_extras { + ExtrasSpecification::All + } else if extra.is_empty() { + ExtrasSpecification::None + } else { + ExtrasSpecification::Some(extra) + } + } + + /// Returns true if a name is included in the extra specification. + pub fn contains(&self, name: &ExtraName) -> bool { + match self { + ExtrasSpecification::All => true, + ExtrasSpecification::None => false, + ExtrasSpecification::Some(extras) => extras.contains(name), + } + } + + pub fn is_empty(&self) -> bool { + matches!(self, ExtrasSpecification::None) + } +} diff --git a/crates/uv-configuration/src/lib.rs b/crates/uv-configuration/src/lib.rs index 38b32eee7..835e47cf4 100644 --- a/crates/uv-configuration/src/lib.rs +++ b/crates/uv-configuration/src/lib.rs @@ -3,6 +3,7 @@ pub use build_options::*; pub use concurrency::*; pub use config_settings::*; pub use constraints::*; +pub use extras::*; pub use name_specifiers::*; pub use overrides::*; pub use package_options::*; @@ -14,6 +15,7 @@ mod build_options; mod concurrency; mod config_settings; mod constraints; +mod extras; mod name_specifiers; mod overrides; mod package_options; diff --git a/crates/uv-requirements/src/pyproject.rs b/crates/uv-requirements/src/pyproject.rs index 2ea5a5676..13b13d0ed 100644 --- a/crates/uv-requirements/src/pyproject.rs +++ b/crates/uv-requirements/src/pyproject.rs @@ -24,13 +24,13 @@ use distribution_types::{Requirement, RequirementSource, Requirements}; use pep440_rs::VersionSpecifiers; use pep508_rs::{Pep508Error, RequirementOrigin, VerbatimUrl, VersionOrUrl}; use pypi_types::VerbatimParsedUrl; -use uv_configuration::PreviewMode; +use uv_configuration::{ExtrasSpecification, PreviewMode}; use uv_fs::Simplified; use uv_git::GitReference; use uv_normalize::{ExtraName, PackageName}; use uv_warnings::warn_user_once; -use crate::{ExtrasSpecification, Workspace}; +use crate::Workspace; #[derive(Debug, Error)] pub enum Pep621Error { @@ -683,12 +683,12 @@ mod test { use indoc::indoc; use insta::assert_snapshot; - use uv_configuration::PreviewMode; + use uv_configuration::{ExtrasSpecification, PreviewMode}; use uv_fs::Simplified; use uv_normalize::PackageName; use crate::ProjectWorkspace; - use crate::{ExtrasSpecification, RequirementsSpecification}; + use crate::RequirementsSpecification; fn from_source( contents: &str, diff --git a/crates/uv-requirements/src/source_tree.rs b/crates/uv-requirements/src/source_tree.rs index 5ee4e0a97..9d4fbe634 100644 --- a/crates/uv-requirements/src/source_tree.rs +++ b/crates/uv-requirements/src/source_tree.rs @@ -12,13 +12,12 @@ use distribution_types::{ }; use pep508_rs::RequirementOrigin; use pypi_types::VerbatimParsedUrl; +use uv_configuration::ExtrasSpecification; use uv_distribution::{DistributionDatabase, Reporter}; use uv_fs::Simplified; use uv_resolver::{InMemoryIndex, MetadataResponse}; use uv_types::{BuildContext, HashStrategy}; -use crate::ExtrasSpecification; - /// A resolver for requirements specified via source trees. /// /// Used, e.g., to determine the input requirements when a user specifies a `pyproject.toml` diff --git a/crates/uv-requirements/src/sources.rs b/crates/uv-requirements/src/sources.rs index 0ddc3ccbe..fca23c051 100644 --- a/crates/uv-requirements/src/sources.rs +++ b/crates/uv-requirements/src/sources.rs @@ -3,7 +3,6 @@ use std::path::{Path, PathBuf}; use console::Term; use uv_fs::Simplified; -use uv_normalize::ExtraName; use uv_warnings::warn_user; use crate::confirm; @@ -154,37 +153,3 @@ impl std::fmt::Display for RequirementsSource { } } } - -#[derive(Debug, Default, Clone)] -pub enum ExtrasSpecification { - #[default] - None, - All, - Some(Vec), -} - -impl ExtrasSpecification { - /// Determine the extras specification to use based on the command-line arguments. - pub fn from_args(all_extras: bool, extra: Vec) -> Self { - if all_extras { - ExtrasSpecification::All - } else if extra.is_empty() { - ExtrasSpecification::None - } else { - ExtrasSpecification::Some(extra) - } - } - - /// Returns true if a name is included in the extra specification. - pub fn contains(&self, name: &ExtraName) -> bool { - match self { - ExtrasSpecification::All => true, - ExtrasSpecification::None => false, - ExtrasSpecification::Some(extras) => extras.contains(name), - } - } - - pub fn is_empty(&self) -> bool { - matches!(self, ExtrasSpecification::None) - } -} diff --git a/crates/uv-requirements/src/specification.rs b/crates/uv-requirements/src/specification.rs index 481310c89..46992e1d7 100644 --- a/crates/uv-requirements/src/specification.rs +++ b/crates/uv-requirements/src/specification.rs @@ -47,13 +47,13 @@ use requirements_txt::{ EditableRequirement, FindLink, RequirementEntry, RequirementsTxt, RequirementsTxtRequirement, }; use uv_client::BaseClientBuilder; -use uv_configuration::{NoBinary, NoBuild, PreviewMode}; +use uv_configuration::{ExtrasSpecification, NoBinary, NoBuild, PreviewMode}; use uv_fs::Simplified; use uv_normalize::{ExtraName, PackageName}; use crate::pyproject::{Pep621Metadata, PyProjectToml}; use crate::ProjectWorkspace; -use crate::{ExtrasSpecification, RequirementsSource, Workspace, WorkspaceError}; +use crate::{RequirementsSource, Workspace, WorkspaceError}; #[derive(Debug, Default)] pub struct RequirementsSpecification { diff --git a/crates/uv/src/commands/pip/compile.rs b/crates/uv/src/commands/pip/compile.rs index fc7b90daf..58522add7 100644 --- a/crates/uv/src/commands/pip/compile.rs +++ b/crates/uv/src/commands/pip/compile.rs @@ -20,8 +20,8 @@ use uv_auth::store_credentials_from_url; use uv_cache::Cache; use uv_client::{BaseClientBuilder, Connectivity, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ - Concurrency, ConfigSettings, Constraints, IndexStrategy, NoBinary, NoBuild, Overrides, - PreviewMode, SetupPyStrategy, Upgrade, + Concurrency, ConfigSettings, Constraints, ExtrasSpecification, IndexStrategy, NoBinary, + NoBuild, Overrides, PreviewMode, SetupPyStrategy, Upgrade, }; use uv_configuration::{KeyringProviderType, TargetTriple}; use uv_dispatch::BuildDispatch; @@ -34,8 +34,8 @@ use uv_interpreter::{ use uv_interpreter::{PythonVersion, SourceSelector}; use uv_normalize::{ExtraName, PackageName}; use uv_requirements::{ - upgrade::read_lockfile, ExtrasSpecification, LookaheadResolver, NamedRequirementsResolver, - RequirementsSource, RequirementsSpecification, SourceTreeResolver, + upgrade::read_lockfile, LookaheadResolver, NamedRequirementsResolver, RequirementsSource, + RequirementsSpecification, SourceTreeResolver, }; use uv_resolver::{ AnnotationStyle, DependencyMode, DisplayResolutionGraph, ExcludeNewer, Exclusions, FlatIndex, diff --git a/crates/uv/src/commands/pip/install.rs b/crates/uv/src/commands/pip/install.rs index 0ab5ad3b2..ec98f7fc5 100644 --- a/crates/uv/src/commands/pip/install.rs +++ b/crates/uv/src/commands/pip/install.rs @@ -2,20 +2,20 @@ use std::borrow::Cow; use std::fmt::Write; use anstream::eprint; -use distribution_types::{IndexLocations, Resolution}; use fs_err as fs; use itertools::Itertools; use owo_colors::OwoColorize; use tracing::{debug, enabled, Level}; +use distribution_types::{IndexLocations, Resolution}; use install_wheel_rs::linker::LinkMode; use platform_tags::Tags; use uv_auth::store_credentials_from_url; use uv_cache::Cache; use uv_client::{BaseClientBuilder, Connectivity, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ - Concurrency, ConfigSettings, IndexStrategy, NoBinary, NoBuild, PreviewMode, Reinstall, - SetupPyStrategy, Upgrade, + Concurrency, ConfigSettings, ExtrasSpecification, IndexStrategy, NoBinary, NoBuild, + PreviewMode, Reinstall, SetupPyStrategy, Upgrade, }; use uv_configuration::{KeyringProviderType, TargetTriple}; use uv_dispatch::BuildDispatch; @@ -23,7 +23,7 @@ use uv_fs::Simplified; use uv_installer::{SatisfiesResult, SitePackages}; use uv_interpreter::{PythonEnvironment, PythonVersion, SystemPython, Target}; use uv_normalize::PackageName; -use uv_requirements::{ExtrasSpecification, RequirementsSource, RequirementsSpecification}; +use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_resolver::{ DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, Lock, OptionsBuilder, PreReleaseMode, ResolutionMode, diff --git a/crates/uv/src/commands/pip/operations.rs b/crates/uv/src/commands/pip/operations.rs index 108bf7528..a655dcb40 100644 --- a/crates/uv/src/commands/pip/operations.rs +++ b/crates/uv/src/commands/pip/operations.rs @@ -21,7 +21,8 @@ use platform_tags::Tags; use uv_cache::Cache; use uv_client::{BaseClientBuilder, RegistryClient}; use uv_configuration::{ - Concurrency, Constraints, NoBinary, Overrides, PreviewMode, Reinstall, Upgrade, + Concurrency, Constraints, ExtrasSpecification, NoBinary, Overrides, PreviewMode, Reinstall, + Upgrade, }; use uv_dispatch::BuildDispatch; use uv_distribution::DistributionDatabase; @@ -30,8 +31,8 @@ use uv_installer::{Downloader, Plan, Planner, SitePackages}; use uv_interpreter::{Interpreter, PythonEnvironment}; use uv_normalize::PackageName; use uv_requirements::{ - ExtrasSpecification, LookaheadResolver, NamedRequirementsResolver, RequirementsSource, - RequirementsSpecification, SourceTreeResolver, Workspace, + LookaheadResolver, NamedRequirementsResolver, RequirementsSource, RequirementsSpecification, + SourceTreeResolver, Workspace, }; use uv_resolver::{ DependencyMode, Exclusions, FlatIndex, InMemoryIndex, Manifest, Options, Preference, diff --git a/crates/uv/src/commands/pip/sync.rs b/crates/uv/src/commands/pip/sync.rs index b5785b497..88584e9f2 100644 --- a/crates/uv/src/commands/pip/sync.rs +++ b/crates/uv/src/commands/pip/sync.rs @@ -13,15 +13,15 @@ use uv_auth::store_credentials_from_url; use uv_cache::Cache; use uv_client::{BaseClientBuilder, Connectivity, FlatIndexClient, RegistryClientBuilder}; use uv_configuration::{ - Concurrency, ConfigSettings, IndexStrategy, NoBinary, NoBuild, PreviewMode, Reinstall, - SetupPyStrategy, Upgrade, + Concurrency, ConfigSettings, ExtrasSpecification, IndexStrategy, NoBinary, NoBuild, + PreviewMode, Reinstall, SetupPyStrategy, Upgrade, }; use uv_configuration::{KeyringProviderType, TargetTriple}; use uv_dispatch::BuildDispatch; use uv_fs::Simplified; use uv_installer::SitePackages; use uv_interpreter::{PythonEnvironment, PythonVersion, SystemPython, Target}; -use uv_requirements::{ExtrasSpecification, RequirementsSource, RequirementsSpecification}; +use uv_requirements::{RequirementsSource, RequirementsSpecification}; use uv_resolver::{ DependencyMode, ExcludeNewer, FlatIndex, InMemoryIndex, OptionsBuilder, PreReleaseMode, ResolutionMode, @@ -98,7 +98,7 @@ pub(crate) async fn pip_sync( constraints, overrides, None, - &ExtrasSpecification::default(), + &extras, &client_builder, preview, ) diff --git a/crates/uv/src/commands/project/lock.rs b/crates/uv/src/commands/project/lock.rs index 1d1bb3266..0b02ab164 100644 --- a/crates/uv/src/commands/project/lock.rs +++ b/crates/uv/src/commands/project/lock.rs @@ -6,11 +6,11 @@ use install_wheel_rs::linker::LinkMode; use uv_cache::Cache; use uv_client::{BaseClientBuilder, RegistryClientBuilder}; use uv_configuration::{ - Concurrency, ConfigSettings, NoBinary, NoBuild, PreviewMode, Reinstall, SetupPyStrategy, - Upgrade, + Concurrency, ConfigSettings, ExtrasSpecification, NoBinary, NoBuild, PreviewMode, Reinstall, + SetupPyStrategy, Upgrade, }; use uv_dispatch::BuildDispatch; -use uv_requirements::{ExtrasSpecification, ProjectWorkspace, RequirementsSpecification}; +use uv_requirements::{ProjectWorkspace, RequirementsSpecification}; use uv_resolver::{FlatIndex, InMemoryIndex, Options}; use uv_types::{BuildIsolation, EmptyInstalledPackages, HashStrategy, InFlight}; use uv_warnings::warn_user; diff --git a/crates/uv/src/commands/project/mod.rs b/crates/uv/src/commands/project/mod.rs index fb2dbf2fd..e812b1d29 100644 --- a/crates/uv/src/commands/project/mod.rs +++ b/crates/uv/src/commands/project/mod.rs @@ -5,25 +5,23 @@ use itertools::Itertools; use owo_colors::OwoColorize; use tracing::debug; -use crate::commands::pip; use distribution_types::{IndexLocations, Resolution}; use install_wheel_rs::linker::LinkMode; use uv_cache::Cache; use uv_client::{BaseClientBuilder, Connectivity, RegistryClientBuilder}; use uv_configuration::{ - Concurrency, ConfigSettings, NoBinary, NoBuild, PreviewMode, Reinstall, SetupPyStrategy, - Upgrade, + Concurrency, ConfigSettings, ExtrasSpecification, NoBinary, NoBuild, PreviewMode, Reinstall, + SetupPyStrategy, Upgrade, }; use uv_dispatch::BuildDispatch; use uv_fs::Simplified; use uv_installer::{SatisfiesResult, SitePackages}; use uv_interpreter::{find_default_interpreter, PythonEnvironment}; -use uv_requirements::{ - ExtrasSpecification, ProjectWorkspace, RequirementsSource, RequirementsSpecification, Workspace, -}; +use uv_requirements::{ProjectWorkspace, RequirementsSource, RequirementsSpecification, Workspace}; use uv_resolver::{FlatIndex, InMemoryIndex, Options}; use uv_types::{BuildIsolation, HashStrategy, InFlight}; +use crate::commands::pip; use crate::printer::Printer; pub(crate) mod lock; diff --git a/crates/uv/src/settings.rs b/crates/uv/src/settings.rs index 1b843cfe2..ca899b404 100644 --- a/crates/uv/src/settings.rs +++ b/crates/uv/src/settings.rs @@ -10,12 +10,11 @@ use install_wheel_rs::linker::LinkMode; use uv_cache::{CacheArgs, Refresh}; use uv_client::Connectivity; use uv_configuration::{ - Concurrency, ConfigSettings, IndexStrategy, KeyringProviderType, NoBinary, NoBuild, - PreviewMode, Reinstall, SetupPyStrategy, TargetTriple, Upgrade, + Concurrency, ConfigSettings, ExtrasSpecification, IndexStrategy, KeyringProviderType, NoBinary, + NoBuild, PreviewMode, Reinstall, SetupPyStrategy, TargetTriple, Upgrade, }; use uv_interpreter::{PythonVersion, Target}; use uv_normalize::PackageName; -use uv_requirements::ExtrasSpecification; use uv_resolver::{AnnotationStyle, DependencyMode, ExcludeNewer, PreReleaseMode, ResolutionMode}; use uv_workspace::{Combine, PipOptions, Workspace};