From 1512e07a2e7c05b7c9fcb457f35c7ef0f25d8d9b Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 9 Apr 2024 11:35:53 -0500 Subject: [PATCH] Split configuration options out of `uv-types` (#2924) Needed to prevent circular dependencies in my toolchain work (#2931). I think this is probably a reasonable change as we move towards persistent configuration too? Unfortunately `BuildIsolation` needs to be in `uv-types` to avoid circular dependencies still. We might be able to resolve that in the future. --- Cargo.lock | 30 +++++++++++++++++-- Cargo.toml | 1 + crates/requirements-txt/Cargo.toml | 2 +- crates/requirements-txt/src/lib.rs | 2 +- crates/uv-build/Cargo.toml | 1 + crates/uv-build/src/lib.rs | 5 ++-- crates/uv-client/Cargo.toml | 2 +- crates/uv-client/src/flat_index.rs | 2 +- crates/uv-client/src/registry_client.rs | 2 +- crates/uv-configuration/Cargo.toml | 30 +++++++++++++++++++ .../src/build_options.rs | 15 ---------- .../src/config_settings.rs | 0 .../src/constraints.rs | 0 crates/uv-configuration/src/lib.rs | 13 ++++++++ .../src/name_specifiers.rs | 0 .../src/overrides.rs | 0 .../src/package_options.rs | 0 crates/uv-dev/Cargo.toml | 1 + crates/uv-dev/src/build.rs | 6 ++-- crates/uv-dev/src/resolve_cli.rs | 3 +- crates/uv-dev/src/resolve_many.rs | 4 +-- crates/uv-dispatch/Cargo.toml | 2 +- crates/uv-dispatch/src/lib.rs | 6 ++-- crates/uv-distribution/Cargo.toml | 2 +- .../src/distribution_database.rs | 3 +- crates/uv-distribution/src/source/mod.rs | 3 +- crates/uv-installer/Cargo.toml | 1 + crates/uv-installer/src/plan.rs | 2 +- crates/uv-requirements/Cargo.toml | 1 + crates/uv-requirements/src/lookahead.rs | 3 +- crates/uv-requirements/src/specification.rs | 2 +- crates/uv-requirements/src/upgrade.rs | 2 +- crates/uv-resolver/Cargo.toml | 1 + crates/uv-resolver/src/exclusions.rs | 2 +- crates/uv-resolver/src/manifest.rs | 3 +- .../uv-resolver/src/pubgrub/dependencies.rs | 2 +- crates/uv-resolver/src/resolver/mod.rs | 3 +- crates/uv-resolver/src/resolver/provider.rs | 3 +- crates/uv-resolver/src/version_map.rs | 2 +- crates/uv-resolver/tests/resolver.rs | 6 ++-- crates/uv-types/Cargo.toml | 1 + crates/uv-types/src/builds.rs | 15 ++++++++++ crates/uv-types/src/lib.rs | 14 ++------- crates/uv-types/src/traits.rs | 3 +- crates/uv/Cargo.toml | 1 + crates/uv/src/commands/pip_compile.rs | 9 +++--- crates/uv/src/commands/pip_install.rs | 9 +++--- crates/uv/src/commands/pip_sync.rs | 8 ++--- crates/uv/src/commands/venv.rs | 6 ++-- crates/uv/src/main.rs | 10 +++---- 50 files changed, 155 insertions(+), 89 deletions(-) create mode 100644 crates/uv-configuration/Cargo.toml rename crates/{uv-types => uv-configuration}/src/build_options.rs (96%) rename crates/{uv-types => uv-configuration}/src/config_settings.rs (100%) rename crates/{uv-types => uv-configuration}/src/constraints.rs (100%) create mode 100644 crates/uv-configuration/src/lib.rs rename crates/{uv-types => uv-configuration}/src/name_specifiers.rs (100%) rename crates/{uv-types => uv-configuration}/src/overrides.rs (100%) rename crates/{uv-types => uv-configuration}/src/package_options.rs (100%) create mode 100644 crates/uv-types/src/builds.rs diff --git a/Cargo.lock b/Cargo.lock index 1f6272a44..244e925c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2952,9 +2952,9 @@ dependencies = [ "unscanny", "url", "uv-client", + "uv-configuration", "uv-fs", "uv-normalize", - "uv-types", "uv-warnings", ] @@ -4328,6 +4328,7 @@ dependencies = [ "uv-auth", "uv-cache", "uv-client", + "uv-configuration", "uv-dispatch", "uv-distribution", "uv-fs", @@ -4384,6 +4385,7 @@ dependencies = [ "tokio", "toml", "tracing", + "uv-configuration", "uv-fs", "uv-interpreter", "uv-types", @@ -4458,14 +4460,30 @@ dependencies = [ "urlencoding", "uv-auth", "uv-cache", + "uv-configuration", "uv-fs", "uv-normalize", - "uv-types", "uv-version", "uv-warnings", "webpki-roots", ] +[[package]] +name = "uv-configuration" +version = "0.0.1" +dependencies = [ + "anyhow", + "clap", + "distribution-types", + "itertools 0.12.1", + "pep508_rs", + "rustc-hash", + "serde", + "serde_json", + "uv-cache", + "uv-normalize", +] + [[package]] name = "uv-dev" version = "0.0.1" @@ -4500,6 +4518,7 @@ dependencies = [ "uv-build", "uv-cache", "uv-client", + "uv-configuration", "uv-dispatch", "uv-installer", "uv-interpreter", @@ -4523,9 +4542,9 @@ dependencies = [ "uv-build", "uv-cache", "uv-client", + "uv-configuration", "uv-installer", "uv-interpreter", - "uv-requirements", "uv-resolver", "uv-types", ] @@ -4560,6 +4579,7 @@ dependencies = [ "url", "uv-cache", "uv-client", + "uv-configuration", "uv-extract", "uv-fs", "uv-git", @@ -4652,6 +4672,7 @@ dependencies = [ "url", "uv-cache", "uv-client", + "uv-configuration", "uv-distribution", "uv-extract", "uv-fs", @@ -4725,6 +4746,7 @@ dependencies = [ "tracing", "url", "uv-client", + "uv-configuration", "uv-distribution", "uv-fs", "uv-normalize", @@ -4771,6 +4793,7 @@ dependencies = [ "url", "uv-cache", "uv-client", + "uv-configuration", "uv-distribution", "uv-interpreter", "uv-normalize", @@ -4792,6 +4815,7 @@ dependencies = [ "serde", "serde_json", "uv-cache", + "uv-configuration", "uv-interpreter", "uv-normalize", ] diff --git a/Cargo.toml b/Cargo.toml index c70896fab..5e4a53df1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ uv-normalize = { path = "crates/uv-normalize" } uv-requirements = { path = "crates/uv-requirements" } uv-resolver = { path = "crates/uv-resolver" } uv-types = { path = "crates/uv-types" } +uv-configuration = { path = "crates/uv-configuration" } uv-trampoline = { path = "crates/uv-trampoline" } uv-version = { path = "crates/uv-version" } uv-virtualenv = { path = "crates/uv-virtualenv" } diff --git a/crates/requirements-txt/Cargo.toml b/crates/requirements-txt/Cargo.toml index 17c7525b6..0d91710db 100644 --- a/crates/requirements-txt/Cargo.toml +++ b/crates/requirements-txt/Cargo.toml @@ -17,7 +17,7 @@ pep508_rs = { workspace = true, features = ["rkyv", "serde", "non-pep508-extensi uv-client = { workspace = true } uv-fs = { workspace = true } uv-normalize = { workspace = true } -uv-types = { workspace = true } +uv-configuration = { workspace = true } uv-warnings = { workspace = true } fs-err = { workspace = true } diff --git a/crates/requirements-txt/src/lib.rs b/crates/requirements-txt/src/lib.rs index 47968a3e3..17732dc12 100644 --- a/crates/requirements-txt/src/lib.rs +++ b/crates/requirements-txt/src/lib.rs @@ -52,9 +52,9 @@ use pep508_rs::{ #[cfg(feature = "http")] use uv_client::BaseClient; use uv_client::BaseClientBuilder; +use uv_configuration::{NoBinary, NoBuild, PackageNameSpecifier}; use uv_fs::{normalize_url_path, Simplified}; use uv_normalize::ExtraName; -use uv_types::{NoBinary, NoBuild, PackageNameSpecifier}; use uv_warnings::warn_user; /// We emit one of those for each requirements.txt entry diff --git a/crates/uv-build/Cargo.toml b/crates/uv-build/Cargo.toml index 1bfb137d7..2d8f70278 100644 --- a/crates/uv-build/Cargo.toml +++ b/crates/uv-build/Cargo.toml @@ -20,6 +20,7 @@ pep508_rs = { workspace = true } uv-fs = { workspace = true } uv-interpreter = { workspace = true } uv-types = { workspace = true, features = ["serde"] } +uv-configuration = { workspace = true, features = ["serde"] } uv-virtualenv = { workspace = true } anyhow = { workspace = true } diff --git a/crates/uv-build/src/lib.rs b/crates/uv-build/src/lib.rs index 0606c371f..6c914de66 100644 --- a/crates/uv-build/src/lib.rs +++ b/crates/uv-build/src/lib.rs @@ -28,11 +28,10 @@ use tracing::{debug, info_span, instrument, Instrument}; use distribution_types::Resolution; use pep440_rs::Version; use pep508_rs::{PackageName, Requirement}; +use uv_configuration::{BuildKind, ConfigSettings, SetupPyStrategy}; use uv_fs::{PythonExt, Simplified}; use uv_interpreter::{Interpreter, PythonEnvironment}; -use uv_types::{ - BuildContext, BuildIsolation, BuildKind, ConfigSettings, SetupPyStrategy, SourceBuildTrait, -}; +use uv_types::{BuildContext, BuildIsolation, SourceBuildTrait}; /// e.g. `pygraphviz/graphviz_wrap.c:3020:10: fatal error: graphviz/cgraph.h: No such file or directory` static MISSING_HEADER_RE: Lazy = Lazy::new(|| { diff --git a/crates/uv-client/Cargo.toml b/crates/uv-client/Cargo.toml index 139c03983..bddd71163 100644 --- a/crates/uv-client/Cargo.toml +++ b/crates/uv-client/Cargo.toml @@ -15,7 +15,7 @@ uv-auth = { workspace = true } uv-cache = { workspace = true } uv-fs = { workspace = true, features = ["tokio"] } uv-normalize = { workspace = true } -uv-types = { workspace = true } +uv-configuration = { workspace = true } uv-version = { workspace = true } uv-warnings = { workspace = true } pypi-types = { workspace = true } diff --git a/crates/uv-client/src/flat_index.rs b/crates/uv-client/src/flat_index.rs index 45eac5af8..d44b28464 100644 --- a/crates/uv-client/src/flat_index.rs +++ b/crates/uv-client/src/flat_index.rs @@ -19,8 +19,8 @@ use pep508_rs::VerbatimUrl; use platform_tags::Tags; use pypi_types::Hashes; use uv_cache::{Cache, CacheBucket}; +use uv_configuration::{NoBinary, NoBuild}; use uv_normalize::PackageName; -use uv_types::{NoBinary, NoBuild}; use crate::cached_client::{CacheControl, CachedClientError}; use crate::html::SimpleHtml; diff --git a/crates/uv-client/src/registry_client.rs b/crates/uv-client/src/registry_client.rs index cf2b23771..2b740e745 100644 --- a/crates/uv-client/src/registry_client.rs +++ b/crates/uv-client/src/registry_client.rs @@ -22,8 +22,8 @@ use platform_tags::Platform; use pypi_types::{Metadata23, SimpleJson}; use uv_auth::KeyringProvider; use uv_cache::{Cache, CacheBucket, WheelCache}; +use uv_configuration::IndexStrategy; use uv_normalize::PackageName; -use uv_types::IndexStrategy; use crate::base_client::{BaseClient, BaseClientBuilder}; use crate::cached_client::CacheControl; diff --git a/crates/uv-configuration/Cargo.toml b/crates/uv-configuration/Cargo.toml new file mode 100644 index 000000000..67524ef8d --- /dev/null +++ b/crates/uv-configuration/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "uv-configuration" +version = "0.0.1" +edition = { workspace = true } +rust-version = { workspace = true } +homepage = { workspace = true } +documentation = { workspace = true } +repository = { workspace = true } +authors = { workspace = true } +license = { workspace = true } + +[lints] +workspace = true + +[dependencies] +distribution-types = { workspace = true } +pep508_rs = { workspace = true } +uv-cache = { workspace = true } +uv-normalize = { workspace = true } + +anyhow = { workspace = true } +clap = { workspace = true, features = ["derive"], optional = true } +itertools = { workspace = true } +rustc-hash = { workspace = true } +serde = { workspace = true, optional = true } +serde_json = { workspace = true, optional = true } + +[features] +default = [] +serde = ["dep:serde", "dep:serde_json"] diff --git a/crates/uv-types/src/build_options.rs b/crates/uv-configuration/src/build_options.rs similarity index 96% rename from crates/uv-types/src/build_options.rs rename to crates/uv-configuration/src/build_options.rs index bcdaee92b..14c8677a7 100644 --- a/crates/uv-types/src/build_options.rs +++ b/crates/uv-configuration/src/build_options.rs @@ -1,24 +1,9 @@ use std::fmt::{Display, Formatter}; use pep508_rs::PackageName; -use uv_interpreter::PythonEnvironment; use crate::{PackageNameSpecifier, PackageNameSpecifiers}; -/// Whether to enforce build isolation when building source distributions. -#[derive(Debug, Copy, Clone)] -pub enum BuildIsolation<'a> { - Isolated, - Shared(&'a PythonEnvironment), -} - -impl<'a> BuildIsolation<'a> { - /// Returns `true` if build isolation is enforced. - pub fn is_isolated(&self) -> bool { - matches!(self, Self::Isolated) - } -} - /// The strategy to use when building source distributions that lack a `pyproject.toml`. #[derive(Copy, Clone, Debug, Default, PartialEq, Eq)] pub enum SetupPyStrategy { diff --git a/crates/uv-types/src/config_settings.rs b/crates/uv-configuration/src/config_settings.rs similarity index 100% rename from crates/uv-types/src/config_settings.rs rename to crates/uv-configuration/src/config_settings.rs diff --git a/crates/uv-types/src/constraints.rs b/crates/uv-configuration/src/constraints.rs similarity index 100% rename from crates/uv-types/src/constraints.rs rename to crates/uv-configuration/src/constraints.rs diff --git a/crates/uv-configuration/src/lib.rs b/crates/uv-configuration/src/lib.rs new file mode 100644 index 000000000..665568f2b --- /dev/null +++ b/crates/uv-configuration/src/lib.rs @@ -0,0 +1,13 @@ +pub use build_options::*; +pub use config_settings::*; +pub use constraints::*; +pub use name_specifiers::*; +pub use overrides::*; +pub use package_options::*; + +mod build_options; +mod config_settings; +mod constraints; +mod name_specifiers; +mod overrides; +mod package_options; diff --git a/crates/uv-types/src/name_specifiers.rs b/crates/uv-configuration/src/name_specifiers.rs similarity index 100% rename from crates/uv-types/src/name_specifiers.rs rename to crates/uv-configuration/src/name_specifiers.rs diff --git a/crates/uv-types/src/overrides.rs b/crates/uv-configuration/src/overrides.rs similarity index 100% rename from crates/uv-types/src/overrides.rs rename to crates/uv-configuration/src/overrides.rs diff --git a/crates/uv-types/src/package_options.rs b/crates/uv-configuration/src/package_options.rs similarity index 100% rename from crates/uv-types/src/package_options.rs rename to crates/uv-configuration/src/package_options.rs diff --git a/crates/uv-dev/Cargo.toml b/crates/uv-dev/Cargo.toml index 7ad14c089..764bdd3fc 100644 --- a/crates/uv-dev/Cargo.toml +++ b/crates/uv-dev/Cargo.toml @@ -29,6 +29,7 @@ uv-interpreter = { workspace = true } uv-normalize = { workspace = true } uv-resolver = { workspace = true } uv-types = { workspace = true } +uv-configuration = { workspace = true } # Any dependencies that are exclusively used in `uv-dev` should be listed as non-workspace # dependencies, to ensure that we're forced to think twice before including them in other crates. diff --git a/crates/uv-dev/src/build.rs b/crates/uv-dev/src/build.rs index 0a49a0883..20430e1a0 100644 --- a/crates/uv-dev/src/build.rs +++ b/crates/uv-dev/src/build.rs @@ -10,13 +10,11 @@ use rustc_hash::FxHashMap; use uv_build::{SourceBuild, SourceBuildContext}; use uv_cache::{Cache, CacheArgs}; use uv_client::{FlatIndex, RegistryClientBuilder}; +use uv_configuration::{BuildKind, ConfigSettings, NoBinary, NoBuild, SetupPyStrategy}; use uv_dispatch::BuildDispatch; use uv_interpreter::PythonEnvironment; use uv_resolver::InMemoryIndex; -use uv_types::NoBinary; -use uv_types::{ - BuildContext, BuildIsolation, BuildKind, ConfigSettings, InFlight, NoBuild, SetupPyStrategy, -}; +use uv_types::{BuildContext, BuildIsolation, InFlight}; #[derive(Parser)] pub(crate) struct BuildArgs { diff --git a/crates/uv-dev/src/resolve_cli.rs b/crates/uv-dev/src/resolve_cli.rs index 3d9bb3cc7..27aa0748b 100644 --- a/crates/uv-dev/src/resolve_cli.rs +++ b/crates/uv-dev/src/resolve_cli.rs @@ -13,11 +13,12 @@ use distribution_types::{FlatIndexLocation, IndexLocations, IndexUrl, Resolution use pep508_rs::Requirement; use uv_cache::{Cache, CacheArgs}; use uv_client::{FlatIndex, FlatIndexClient, RegistryClientBuilder}; +use uv_configuration::{ConfigSettings, NoBinary, NoBuild, SetupPyStrategy}; use uv_dispatch::BuildDispatch; use uv_installer::SitePackages; use uv_interpreter::PythonEnvironment; use uv_resolver::{InMemoryIndex, Manifest, Options, Resolver}; -use uv_types::{BuildIsolation, ConfigSettings, InFlight, NoBinary, NoBuild, SetupPyStrategy}; +use uv_types::{BuildIsolation, InFlight}; #[derive(ValueEnum, Default, Clone)] pub(crate) enum ResolveCliFormat { diff --git a/crates/uv-dev/src/resolve_many.rs b/crates/uv-dev/src/resolve_many.rs index bd0e53b1c..07f1ddc18 100644 --- a/crates/uv-dev/src/resolve_many.rs +++ b/crates/uv-dev/src/resolve_many.rs @@ -15,12 +15,12 @@ use pep440_rs::{Version, VersionSpecifier, VersionSpecifiers}; use pep508_rs::{Requirement, VersionOrUrl}; use uv_cache::{Cache, CacheArgs}; use uv_client::{FlatIndex, OwnedArchive, RegistryClient, RegistryClientBuilder}; +use uv_configuration::{ConfigSettings, NoBinary, NoBuild, SetupPyStrategy}; use uv_dispatch::BuildDispatch; use uv_interpreter::PythonEnvironment; use uv_normalize::PackageName; use uv_resolver::InMemoryIndex; -use uv_types::NoBinary; -use uv_types::{BuildContext, BuildIsolation, ConfigSettings, InFlight, NoBuild, SetupPyStrategy}; +use uv_types::{BuildContext, BuildIsolation, InFlight}; #[derive(Parser)] pub(crate) struct ResolveManyArgs { diff --git a/crates/uv-dispatch/Cargo.toml b/crates/uv-dispatch/Cargo.toml index 727e11668..7cd8476d4 100644 --- a/crates/uv-dispatch/Cargo.toml +++ b/crates/uv-dispatch/Cargo.toml @@ -21,9 +21,9 @@ uv-cache = { workspace = true } uv-client = { workspace = true } uv-installer = { workspace = true } uv-interpreter = { workspace = true } -uv-requirements = { workspace = true } uv-resolver = { workspace = true } uv-types = { workspace = true } +uv-configuration = { workspace = true } anyhow = { workspace = true } futures = { workspace = true } diff --git a/crates/uv-dispatch/src/lib.rs b/crates/uv-dispatch/src/lib.rs index 7a73c81d4..52f1cdda2 100644 --- a/crates/uv-dispatch/src/lib.rs +++ b/crates/uv-dispatch/src/lib.rs @@ -17,13 +17,11 @@ use pep508_rs::Requirement; use uv_build::{SourceBuild, SourceBuildContext}; use uv_cache::Cache; use uv_client::{FlatIndex, RegistryClient}; +use uv_configuration::{BuildKind, ConfigSettings, NoBinary, NoBuild, Reinstall, SetupPyStrategy}; use uv_installer::{Downloader, Installer, Plan, Planner, SitePackages}; use uv_interpreter::{Interpreter, PythonEnvironment}; use uv_resolver::{InMemoryIndex, Manifest, Options, Resolver}; -use uv_types::{ - BuildContext, BuildIsolation, BuildKind, ConfigSettings, EmptyInstalledPackages, InFlight, - NoBinary, NoBuild, Reinstall, SetupPyStrategy, -}; +use uv_types::{BuildContext, BuildIsolation, EmptyInstalledPackages, InFlight}; /// The main implementation of [`BuildContext`], used by the CLI, see [`BuildContext`] /// documentation. diff --git a/crates/uv-distribution/Cargo.toml b/crates/uv-distribution/Cargo.toml index 42b8c9e12..53d244433 100644 --- a/crates/uv-distribution/Cargo.toml +++ b/crates/uv-distribution/Cargo.toml @@ -28,6 +28,7 @@ uv-fs = { workspace = true, features = ["tokio"] } uv-git = { workspace = true, features = ["vendored-openssl"] } uv-normalize = { workspace = true } uv-types = { workspace = true } +uv-configuration = { workspace = true } anyhow = { workspace = true } fs-err = { workspace = true } @@ -46,4 +47,3 @@ tokio-util = { workspace = true, features = ["compat"] } tracing = { workspace = true } url = { workspace = true } zip = { workspace = true } - diff --git a/crates/uv-distribution/src/distribution_database.rs b/crates/uv-distribution/src/distribution_database.rs index 477a408b1..6ece58e51 100644 --- a/crates/uv-distribution/src/distribution_database.rs +++ b/crates/uv-distribution/src/distribution_database.rs @@ -17,8 +17,9 @@ use platform_tags::Tags; use pypi_types::Metadata23; use uv_cache::{ArchiveTimestamp, CacheBucket, CacheEntry, CachedByTimestamp, WheelCache}; use uv_client::{CacheControl, CachedClientError, Connectivity, RegistryClient}; +use uv_configuration::{NoBinary, NoBuild}; use uv_fs::write_atomic; -use uv_types::{BuildContext, NoBinary, NoBuild}; +use uv_types::BuildContext; use crate::locks::Locks; use crate::{Error, LocalWheel, Reporter, SourceDistributionBuilder}; diff --git a/crates/uv-distribution/src/source/mod.rs b/crates/uv-distribution/src/source/mod.rs index 59c86adb3..34b52c105 100644 --- a/crates/uv-distribution/src/source/mod.rs +++ b/crates/uv-distribution/src/source/mod.rs @@ -28,8 +28,9 @@ use uv_cache::{ use uv_client::{ CacheControl, CachedClientError, Connectivity, DataWithCachePolicy, RegistryClient, }; +use uv_configuration::{BuildKind, NoBuild}; use uv_fs::write_atomic; -use uv_types::{BuildContext, BuildKind, NoBuild, SourceBuildTrait}; +use uv_types::{BuildContext, SourceBuildTrait}; use crate::error::Error; use crate::git::{fetch_git_archive, resolve_precise}; diff --git a/crates/uv-installer/Cargo.toml b/crates/uv-installer/Cargo.toml index efb269cc2..413664f62 100644 --- a/crates/uv-installer/Cargo.toml +++ b/crates/uv-installer/Cargo.toml @@ -29,6 +29,7 @@ uv-interpreter = { workspace = true } uv-normalize = { workspace = true } uv-types = { workspace = true } uv-warnings = { workspace = true } +uv-configuration = { workspace = true } anyhow = { workspace = true } async-channel = { workspace = true } diff --git a/crates/uv-installer/src/plan.rs b/crates/uv-installer/src/plan.rs index d6ef6668c..985a6f732 100644 --- a/crates/uv-installer/src/plan.rs +++ b/crates/uv-installer/src/plan.rs @@ -13,10 +13,10 @@ use distribution_types::{ use pep508_rs::{Requirement, VersionOrUrl}; use platform_tags::Tags; use uv_cache::{ArchiveTarget, ArchiveTimestamp, Cache, CacheBucket, WheelCache}; +use uv_configuration::{NoBinary, Reinstall}; use uv_distribution::{BuiltWheelIndex, RegistryWheelIndex}; use uv_fs::Simplified; use uv_interpreter::PythonEnvironment; -use uv_types::{NoBinary, Reinstall}; use crate::{ResolvedEditable, SitePackages}; diff --git a/crates/uv-requirements/Cargo.toml b/crates/uv-requirements/Cargo.toml index c2befe770..658a89479 100644 --- a/crates/uv-requirements/Cargo.toml +++ b/crates/uv-requirements/Cargo.toml @@ -23,6 +23,7 @@ uv-normalize = { workspace = true } uv-resolver = { workspace = true, features = ["clap"] } uv-types = { workspace = true } uv-warnings = { workspace = true } +uv-configuration = { workspace = true } anyhow = { workspace = true } configparser = { workspace = true } diff --git a/crates/uv-requirements/src/lookahead.rs b/crates/uv-requirements/src/lookahead.rs index 685b475ab..d2c0131fc 100644 --- a/crates/uv-requirements/src/lookahead.rs +++ b/crates/uv-requirements/src/lookahead.rs @@ -10,9 +10,10 @@ use distribution_types::{Dist, DistributionMetadata, LocalEditable}; use pep508_rs::{MarkerEnvironment, Requirement, VersionOrUrl}; use pypi_types::Metadata23; use uv_client::RegistryClient; +use uv_configuration::{Constraints, Overrides}; use uv_distribution::{DistributionDatabase, Reporter}; use uv_resolver::{InMemoryIndex, MetadataResponse}; -use uv_types::{BuildContext, Constraints, Overrides, RequestedRequirements}; +use uv_types::{BuildContext, RequestedRequirements}; /// A resolver for resolving lookahead requirements from direct URLs. /// diff --git a/crates/uv-requirements/src/specification.rs b/crates/uv-requirements/src/specification.rs index eb73de073..a952e5473 100644 --- a/crates/uv-requirements/src/specification.rs +++ b/crates/uv-requirements/src/specification.rs @@ -9,9 +9,9 @@ use distribution_types::{FlatIndexLocation, IndexUrl}; use pep508_rs::{Requirement, RequirementsTxtRequirement}; use requirements_txt::{EditableRequirement, FindLink, RequirementsTxt}; use uv_client::BaseClientBuilder; +use uv_configuration::{NoBinary, NoBuild}; use uv_fs::Simplified; use uv_normalize::{ExtraName, PackageName}; -use uv_types::{NoBinary, NoBuild}; use crate::pyproject::{Pep621Metadata, PyProjectToml}; use crate::{ExtrasSpecification, RequirementsSource}; diff --git a/crates/uv-requirements/src/upgrade.rs b/crates/uv-requirements/src/upgrade.rs index 49a1cc1e3..46c22ca0e 100644 --- a/crates/uv-requirements/src/upgrade.rs +++ b/crates/uv-requirements/src/upgrade.rs @@ -4,8 +4,8 @@ use anyhow::Result; use requirements_txt::RequirementsTxt; use uv_client::{BaseClientBuilder, Connectivity}; +use uv_configuration::Upgrade; use uv_resolver::{Preference, PreferenceError}; -use uv_types::Upgrade; /// Load the preferred requirements from an existing lockfile, applying the upgrade strategy. pub async fn read_lockfile( diff --git a/crates/uv-resolver/Cargo.toml b/crates/uv-resolver/Cargo.toml index ece532d2b..1c8c5dbb3 100644 --- a/crates/uv-resolver/Cargo.toml +++ b/crates/uv-resolver/Cargo.toml @@ -30,6 +30,7 @@ uv-interpreter = { workspace = true } uv-normalize = { workspace = true } uv-types = { workspace = true } uv-warnings = { workspace = true } +uv-configuration = { workspace = true } anstream = { workspace = true } anyhow = { workspace = true } diff --git a/crates/uv-resolver/src/exclusions.rs b/crates/uv-resolver/src/exclusions.rs index e7c6ade4d..34593af9d 100644 --- a/crates/uv-resolver/src/exclusions.rs +++ b/crates/uv-resolver/src/exclusions.rs @@ -1,6 +1,6 @@ use pep508_rs::PackageName; use rustc_hash::FxHashSet; -use uv_types::{Reinstall, Upgrade}; +use uv_configuration::{Reinstall, Upgrade}; /// Tracks locally installed packages that should not be selected during resolution. #[derive(Debug, Default, Clone)] diff --git a/crates/uv-resolver/src/manifest.rs b/crates/uv-resolver/src/manifest.rs index e6b6607f6..2801aef1b 100644 --- a/crates/uv-resolver/src/manifest.rs +++ b/crates/uv-resolver/src/manifest.rs @@ -1,8 +1,9 @@ use distribution_types::LocalEditable; use pep508_rs::{MarkerEnvironment, Requirement}; use pypi_types::Metadata23; +use uv_configuration::{Constraints, Overrides}; use uv_normalize::PackageName; -use uv_types::{Constraints, Overrides, RequestedRequirements}; +use uv_types::RequestedRequirements; use crate::{preferences::Preference, Exclusions}; diff --git a/crates/uv-resolver/src/pubgrub/dependencies.rs b/crates/uv-resolver/src/pubgrub/dependencies.rs index 28760cee5..6920fb0c1 100644 --- a/crates/uv-resolver/src/pubgrub/dependencies.rs +++ b/crates/uv-resolver/src/pubgrub/dependencies.rs @@ -5,8 +5,8 @@ use tracing::warn; use distribution_types::Verbatim; use pep440_rs::Version; use pep508_rs::{MarkerEnvironment, Requirement, VersionOrUrl}; +use uv_configuration::{Constraints, Overrides}; use uv_normalize::{ExtraName, PackageName}; -use uv_types::{Constraints, Overrides}; use crate::pubgrub::specifier::PubGrubSpecifier; use crate::pubgrub::PubGrubPackage; diff --git a/crates/uv-resolver/src/resolver/mod.rs b/crates/uv-resolver/src/resolver/mod.rs index 6fb72512b..11ec5a9b0 100644 --- a/crates/uv-resolver/src/resolver/mod.rs +++ b/crates/uv-resolver/src/resolver/mod.rs @@ -27,10 +27,11 @@ use platform_tags::Tags; use pypi_types::Metadata23; pub(crate) use urls::Urls; use uv_client::{FlatIndex, RegistryClient}; +use uv_configuration::{Constraints, Overrides}; use uv_distribution::DistributionDatabase; use uv_interpreter::Interpreter; use uv_normalize::PackageName; -use uv_types::{BuildContext, Constraints, InstalledPackagesProvider, Overrides}; +use uv_types::{BuildContext, InstalledPackagesProvider}; use crate::candidate_selector::{CandidateDist, CandidateSelector}; use crate::editables::Editables; diff --git a/crates/uv-resolver/src/resolver/provider.rs b/crates/uv-resolver/src/resolver/provider.rs index af89f5820..10c89a001 100644 --- a/crates/uv-resolver/src/resolver/provider.rs +++ b/crates/uv-resolver/src/resolver/provider.rs @@ -7,9 +7,10 @@ use distribution_types::{Dist, IndexLocations}; use platform_tags::Tags; use pypi_types::Metadata23; use uv_client::{FlatIndex, RegistryClient}; +use uv_configuration::{NoBinary, NoBuild}; use uv_distribution::DistributionDatabase; use uv_normalize::PackageName; -use uv_types::{BuildContext, NoBinary, NoBuild}; +use uv_types::BuildContext; use crate::python_requirement::PythonRequirement; use crate::version_map::VersionMap; diff --git a/crates/uv-resolver/src/version_map.rs b/crates/uv-resolver/src/version_map.rs index 3d0de4189..4eb5f5285 100644 --- a/crates/uv-resolver/src/version_map.rs +++ b/crates/uv-resolver/src/version_map.rs @@ -15,8 +15,8 @@ use platform_tags::Tags; use pypi_types::{Hashes, Yanked}; use rkyv::{de::deserializers::SharedDeserializeMap, Deserialize}; use uv_client::{FlatDistributions, OwnedArchive, SimpleMetadata, VersionFiles}; +use uv_configuration::{NoBinary, NoBuild}; use uv_normalize::PackageName; -use uv_types::{NoBinary, NoBuild}; use uv_warnings::warn_user_once; use crate::{python_requirement::PythonRequirement, yanks::AllowedYanks}; diff --git a/crates/uv-resolver/tests/resolver.rs b/crates/uv-resolver/tests/resolver.rs index 3fc94d237..69734adbb 100644 --- a/crates/uv-resolver/tests/resolver.rs +++ b/crates/uv-resolver/tests/resolver.rs @@ -15,15 +15,13 @@ use pep508_rs::{MarkerEnvironment, Requirement, StringVersion}; use platform_tags::{Arch, Os, Platform, Tags}; use uv_cache::Cache; use uv_client::{FlatIndex, RegistryClientBuilder}; +use uv_configuration::{BuildKind, Constraints, NoBinary, NoBuild, Overrides, SetupPyStrategy}; use uv_interpreter::{find_default_python, Interpreter, PythonEnvironment}; use uv_resolver::{ DisplayResolutionGraph, Exclusions, InMemoryIndex, Manifest, Options, OptionsBuilder, PreReleaseMode, Preference, ResolutionGraph, ResolutionMode, Resolver, }; -use uv_types::{ - BuildContext, BuildIsolation, BuildKind, Constraints, EmptyInstalledPackages, NoBinary, - NoBuild, Overrides, SetupPyStrategy, SourceBuildTrait, -}; +use uv_types::{BuildContext, BuildIsolation, EmptyInstalledPackages, SourceBuildTrait}; // Exclude any packages uploaded after this date. static EXCLUDE_NEWER: Lazy> = Lazy::new(|| { diff --git a/crates/uv-types/Cargo.toml b/crates/uv-types/Cargo.toml index 4fe6ccb29..a4f22dd51 100644 --- a/crates/uv-types/Cargo.toml +++ b/crates/uv-types/Cargo.toml @@ -19,6 +19,7 @@ pep508_rs = { workspace = true } uv-cache = { workspace = true } uv-interpreter = { workspace = true } uv-normalize = { workspace = true } +uv-configuration = { workspace = true } anyhow = { workspace = true } clap = { workspace = true, features = ["derive"], optional = true } diff --git a/crates/uv-types/src/builds.rs b/crates/uv-types/src/builds.rs new file mode 100644 index 000000000..9cc80f7e2 --- /dev/null +++ b/crates/uv-types/src/builds.rs @@ -0,0 +1,15 @@ +use uv_interpreter::PythonEnvironment; + +/// Whether to enforce build isolation when building source distributions. +#[derive(Debug, Copy, Clone)] +pub enum BuildIsolation<'a> { + Isolated, + Shared(&'a PythonEnvironment), +} + +impl<'a> BuildIsolation<'a> { + /// Returns `true` if build isolation is enforced. + pub fn is_isolated(&self) -> bool { + matches!(self, Self::Isolated) + } +} diff --git a/crates/uv-types/src/lib.rs b/crates/uv-types/src/lib.rs index 40a0edc0a..cf28981fd 100644 --- a/crates/uv-types/src/lib.rs +++ b/crates/uv-types/src/lib.rs @@ -1,20 +1,10 @@ //! Fundamental types shared across `uv` crates. -pub use build_options::*; -pub use config_settings::*; -pub use constraints::*; +pub use builds::*; pub use downloads::*; -pub use name_specifiers::*; -pub use overrides::*; -pub use package_options::*; pub use requirements::*; pub use traits::*; -mod build_options; -mod config_settings; -mod constraints; +mod builds; mod downloads; -mod name_specifiers; -mod overrides; -mod package_options; mod requirements; mod traits; diff --git a/crates/uv-types/src/traits.rs b/crates/uv-types/src/traits.rs index 7370d2c5c..62b2ea818 100644 --- a/crates/uv-types/src/traits.rs +++ b/crates/uv-types/src/traits.rs @@ -9,7 +9,8 @@ use pep508_rs::{PackageName, Requirement}; use uv_cache::Cache; use uv_interpreter::{Interpreter, PythonEnvironment}; -use crate::{BuildIsolation, BuildKind, NoBinary, NoBuild, SetupPyStrategy}; +use crate::BuildIsolation; +use uv_configuration::{BuildKind, NoBinary, NoBuild, SetupPyStrategy}; /// Avoids cyclic crate dependencies between resolver, installer and builder. /// diff --git a/crates/uv/Cargo.toml b/crates/uv/Cargo.toml index a9f4d76be..bea8b34aa 100644 --- a/crates/uv/Cargo.toml +++ b/crates/uv/Cargo.toml @@ -32,6 +32,7 @@ uv-normalize = { workspace = true } uv-requirements = { workspace = true } uv-resolver = { workspace = true, features = ["clap"] } uv-types = { workspace = true, features = ["clap"] } +uv-configuration = { workspace = true, features = ["clap"] } uv-virtualenv = { workspace = true } uv-warnings = { workspace = true } diff --git a/crates/uv/src/commands/pip_compile.rs b/crates/uv/src/commands/pip_compile.rs index 55c781921..a635c6ed0 100644 --- a/crates/uv/src/commands/pip_compile.rs +++ b/crates/uv/src/commands/pip_compile.rs @@ -22,6 +22,10 @@ use uv_cache::Cache; use uv_client::{ BaseClientBuilder, Connectivity, FlatIndex, FlatIndexClient, RegistryClientBuilder, }; +use uv_configuration::{ + ConfigSettings, Constraints, IndexStrategy, NoBinary, NoBuild, Overrides, SetupPyStrategy, + Upgrade, +}; use uv_dispatch::BuildDispatch; use uv_fs::Simplified; use uv_installer::Downloader; @@ -35,10 +39,7 @@ use uv_resolver::{ AnnotationStyle, DependencyMode, DisplayResolutionGraph, Exclusions, InMemoryIndex, Manifest, OptionsBuilder, PreReleaseMode, PythonRequirement, ResolutionMode, Resolver, }; -use uv_types::{ - BuildIsolation, ConfigSettings, Constraints, EmptyInstalledPackages, InFlight, IndexStrategy, - NoBinary, NoBuild, Overrides, SetupPyStrategy, Upgrade, -}; +use uv_types::{BuildIsolation, EmptyInstalledPackages, InFlight}; use uv_warnings::warn_user; use crate::commands::reporters::{DownloadReporter, ResolverReporter}; diff --git a/crates/uv/src/commands/pip_install.rs b/crates/uv/src/commands/pip_install.rs index af1bb8c32..bc002de4a 100644 --- a/crates/uv/src/commands/pip_install.rs +++ b/crates/uv/src/commands/pip_install.rs @@ -24,6 +24,10 @@ use uv_client::{ BaseClientBuilder, Connectivity, FlatIndex, FlatIndexClient, RegistryClient, RegistryClientBuilder, }; +use uv_configuration::{ + ConfigSettings, Constraints, IndexStrategy, NoBinary, NoBuild, Overrides, Reinstall, + SetupPyStrategy, Upgrade, +}; use uv_dispatch::BuildDispatch; use uv_fs::Simplified; use uv_installer::{BuiltEditable, Downloader, Plan, Planner, ResolvedEditable, SitePackages}; @@ -37,10 +41,7 @@ use uv_resolver::{ DependencyMode, Exclusions, InMemoryIndex, Manifest, Options, OptionsBuilder, PreReleaseMode, Preference, ResolutionGraph, ResolutionMode, Resolver, }; -use uv_types::{ - BuildIsolation, ConfigSettings, Constraints, InFlight, IndexStrategy, NoBinary, NoBuild, - Overrides, Reinstall, SetupPyStrategy, Upgrade, -}; +use uv_types::{BuildIsolation, InFlight}; use uv_warnings::warn_user; use crate::commands::reporters::{DownloadReporter, InstallReporter, ResolverReporter}; diff --git a/crates/uv/src/commands/pip_sync.rs b/crates/uv/src/commands/pip_sync.rs index 289281614..5229613b7 100644 --- a/crates/uv/src/commands/pip_sync.rs +++ b/crates/uv/src/commands/pip_sync.rs @@ -19,6 +19,9 @@ use uv_client::{ BaseClientBuilder, Connectivity, FlatIndex, FlatIndexClient, RegistryClient, RegistryClientBuilder, }; +use uv_configuration::{ + ConfigSettings, IndexStrategy, NoBinary, NoBuild, Reinstall, SetupPyStrategy, +}; use uv_dispatch::BuildDispatch; use uv_fs::Simplified; use uv_installer::{is_dynamic, Downloader, Plan, Planner, ResolvedEditable, SitePackages}; @@ -28,10 +31,7 @@ use uv_requirements::{ SourceTreeResolver, }; use uv_resolver::{DependencyMode, InMemoryIndex, Manifest, OptionsBuilder, Resolver}; -use uv_types::{ - BuildIsolation, ConfigSettings, EmptyInstalledPackages, InFlight, IndexStrategy, NoBinary, - NoBuild, Reinstall, SetupPyStrategy, -}; +use uv_types::{BuildIsolation, EmptyInstalledPackages, InFlight}; use uv_warnings::warn_user; use crate::commands::reporters::{DownloadReporter, InstallReporter, ResolverReporter}; diff --git a/crates/uv/src/commands/venv.rs b/crates/uv/src/commands/venv.rs index 160e7e332..153a5f756 100644 --- a/crates/uv/src/commands/venv.rs +++ b/crates/uv/src/commands/venv.rs @@ -16,14 +16,12 @@ use pep508_rs::Requirement; use uv_auth::{KeyringProvider, GLOBAL_AUTH_STORE}; use uv_cache::Cache; use uv_client::{Connectivity, FlatIndex, FlatIndexClient, RegistryClientBuilder}; +use uv_configuration::{ConfigSettings, IndexStrategy, NoBinary, NoBuild, SetupPyStrategy}; use uv_dispatch::BuildDispatch; use uv_fs::Simplified; use uv_interpreter::{find_default_python, find_requested_python, Error}; use uv_resolver::{InMemoryIndex, OptionsBuilder}; -use uv_types::{ - BuildContext, BuildIsolation, ConfigSettings, InFlight, IndexStrategy, NoBinary, NoBuild, - SetupPyStrategy, -}; +use uv_types::{BuildContext, BuildIsolation, InFlight}; use crate::commands::ExitStatus; use crate::printer::Printer; diff --git a/crates/uv/src/main.rs b/crates/uv/src/main.rs index 913069bf4..134e11a30 100644 --- a/crates/uv/src/main.rs +++ b/crates/uv/src/main.rs @@ -16,15 +16,15 @@ use distribution_types::{FlatIndexLocation, IndexLocations, IndexUrl}; use uv_auth::KeyringProvider; use uv_cache::{Cache, CacheArgs, Refresh}; use uv_client::Connectivity; +use uv_configuration::{ + ConfigSettingEntry, ConfigSettings, NoBuild, PackageNameSpecifier, Reinstall, SetupPyStrategy, + Upgrade, +}; +use uv_configuration::{IndexStrategy, NoBinary}; use uv_interpreter::PythonVersion; use uv_normalize::{ExtraName, PackageName}; use uv_requirements::{ExtrasSpecification, RequirementsSource}; use uv_resolver::{AnnotationStyle, DependencyMode, PreReleaseMode, ResolutionMode}; -use uv_types::{ - ConfigSettingEntry, ConfigSettings, NoBuild, PackageNameSpecifier, Reinstall, SetupPyStrategy, - Upgrade, -}; -use uv_types::{IndexStrategy, NoBinary}; use crate::commands::{extra_name_with_clap_error, ExitStatus, ListFormat, VersionFormat}; use crate::compat::CompatArgs;