mirror of
https://github.com/astral-sh/uv.git
synced 2025-11-01 12:24:15 +00:00
Add preview mode and use for warning in uv run (#3192)
Adds hidden `--preview` / `--no-preview` flags with `UV_PREVIEW` environment variable support. Copies the `PreviewMode` type from Ruff. Does a little bit of extra work to port `uv run` to the new settings model. Note we allow `uv run` invocations without preview and only use its presence to toggle an experimental warning. ## Test plan ``` ❯ cargo run -q -- run --no-workspace -- python --version warning: `uv run` is experimental and may change without warning. Python 3.12.2 ❯ cargo run -q -- run --no-workspace --preview -- python --version Python 3.12.2 ❯ UV_PREVIEW=1 cargo run -q -- run --no-workspace -- python --version Python 3.12.2 ```
This commit is contained in:
parent
11c6a07bb5
commit
b9419e67aa
8 changed files with 109 additions and 3 deletions
|
|
@ -5,6 +5,7 @@ pub use constraints::*;
|
||||||
pub use name_specifiers::*;
|
pub use name_specifiers::*;
|
||||||
pub use overrides::*;
|
pub use overrides::*;
|
||||||
pub use package_options::*;
|
pub use package_options::*;
|
||||||
|
pub use preview::*;
|
||||||
pub use target_triple::*;
|
pub use target_triple::*;
|
||||||
|
|
||||||
mod authentication;
|
mod authentication;
|
||||||
|
|
@ -14,4 +15,5 @@ mod constraints;
|
||||||
mod name_specifiers;
|
mod name_specifiers;
|
||||||
mod overrides;
|
mod overrides;
|
||||||
mod package_options;
|
mod package_options;
|
||||||
|
mod preview;
|
||||||
mod target_triple;
|
mod target_triple;
|
||||||
|
|
|
||||||
37
crates/uv-configuration/src/preview.rs
Normal file
37
crates/uv-configuration/src/preview.rs
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
use std::fmt::{Display, Formatter};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
|
||||||
|
pub enum PreviewMode {
|
||||||
|
#[default]
|
||||||
|
Disabled,
|
||||||
|
Enabled,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PreviewMode {
|
||||||
|
pub fn is_enabled(&self) -> bool {
|
||||||
|
matches!(self, Self::Enabled)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_disabled(&self) -> bool {
|
||||||
|
matches!(self, Self::Disabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<bool> for PreviewMode {
|
||||||
|
fn from(version: bool) -> Self {
|
||||||
|
if version {
|
||||||
|
PreviewMode::Enabled
|
||||||
|
} else {
|
||||||
|
PreviewMode::Disabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for PreviewMode {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
Self::Disabled => write!(f, "disabled"),
|
||||||
|
Self::Enabled => write!(f, "enabled"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -33,6 +33,7 @@ pub(crate) struct Tools {
|
||||||
pub struct Options {
|
pub struct Options {
|
||||||
pub native_tls: Option<bool>,
|
pub native_tls: Option<bool>,
|
||||||
pub no_cache: Option<bool>,
|
pub no_cache: Option<bool>,
|
||||||
|
pub preview: Option<bool>,
|
||||||
pub cache_dir: Option<PathBuf>,
|
pub cache_dir: Option<PathBuf>,
|
||||||
pub pip: Option<PipOptions>,
|
pub pip: Option<PipOptions>,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,13 @@ pub(crate) struct GlobalArgs {
|
||||||
|
|
||||||
#[arg(global = true, long, overrides_with("native_tls"), hide = true)]
|
#[arg(global = true, long, overrides_with("native_tls"), hide = true)]
|
||||||
pub(crate) no_native_tls: bool,
|
pub(crate) no_native_tls: bool,
|
||||||
|
|
||||||
|
/// Whether to enable experimental, preview features.
|
||||||
|
#[arg(global = true, long, hide = true, env = "UV_PREVIEW", value_parser = clap::builder::BoolishValueParser::new(), overrides_with("no_preview"))]
|
||||||
|
pub(crate) preview: bool,
|
||||||
|
|
||||||
|
#[arg(global = true, long, overrides_with("preview"), hide = true)]
|
||||||
|
pub(crate) no_preview: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, clap::ValueEnum)]
|
#[derive(Debug, Clone, clap::ValueEnum)]
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,13 @@ use std::{env, iter};
|
||||||
use tempfile::{tempdir_in, TempDir};
|
use tempfile::{tempdir_in, TempDir};
|
||||||
use tokio::process::Command;
|
use tokio::process::Command;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
use uv_warnings::warn_user;
|
||||||
|
|
||||||
use uv_cache::Cache;
|
use uv_cache::Cache;
|
||||||
use uv_client::{BaseClientBuilder, RegistryClient, RegistryClientBuilder};
|
use uv_client::{BaseClientBuilder, RegistryClient, RegistryClientBuilder};
|
||||||
use uv_configuration::{
|
use uv_configuration::{
|
||||||
ConfigSettings, Constraints, NoBinary, NoBuild, Overrides, Reinstall, SetupPyStrategy,
|
ConfigSettings, Constraints, NoBinary, NoBuild, Overrides, PreviewMode, Reinstall,
|
||||||
|
SetupPyStrategy,
|
||||||
};
|
};
|
||||||
use uv_dispatch::BuildDispatch;
|
use uv_dispatch::BuildDispatch;
|
||||||
use uv_fs::Simplified;
|
use uv_fs::Simplified;
|
||||||
|
|
@ -45,9 +47,14 @@ pub(crate) async fn run(
|
||||||
mut requirements: Vec<RequirementsSource>,
|
mut requirements: Vec<RequirementsSource>,
|
||||||
isolated: bool,
|
isolated: bool,
|
||||||
no_workspace: bool,
|
no_workspace: bool,
|
||||||
|
preview: PreviewMode,
|
||||||
cache: &Cache,
|
cache: &Cache,
|
||||||
printer: Printer,
|
printer: Printer,
|
||||||
) -> Result<ExitStatus> {
|
) -> Result<ExitStatus> {
|
||||||
|
if preview.is_disabled() {
|
||||||
|
warn_user!("`uv run` is experimental and may change without warning.");
|
||||||
|
}
|
||||||
|
|
||||||
let command = if let Some(target) = target {
|
let command = if let Some(target) = target {
|
||||||
let target_path = PathBuf::from(&target);
|
let target_path = PathBuf::from(&target);
|
||||||
if target_path
|
if target_path
|
||||||
|
|
|
||||||
|
|
@ -476,6 +476,9 @@ async fn run() -> Result<ExitStatus> {
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
Commands::Run(args) => {
|
Commands::Run(args) => {
|
||||||
|
// Resolve the settings from the command-line arguments and workspace configuration.
|
||||||
|
let args = settings::RunSettings::resolve(args, workspace);
|
||||||
|
|
||||||
let requirements = args
|
let requirements = args
|
||||||
.with
|
.with
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
@ -502,6 +505,7 @@ async fn run() -> Result<ExitStatus> {
|
||||||
requirements,
|
requirements,
|
||||||
args.isolated,
|
args.isolated,
|
||||||
args.no_workspace,
|
args.no_workspace,
|
||||||
|
globals.preview,
|
||||||
&cache,
|
&cache,
|
||||||
printer,
|
printer,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
use std::ffi::OsString;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use distribution_types::IndexLocations;
|
use distribution_types::IndexLocations;
|
||||||
|
|
@ -5,7 +6,7 @@ use install_wheel_rs::linker::LinkMode;
|
||||||
use uv_cache::{CacheArgs, Refresh};
|
use uv_cache::{CacheArgs, Refresh};
|
||||||
use uv_client::Connectivity;
|
use uv_client::Connectivity;
|
||||||
use uv_configuration::{
|
use uv_configuration::{
|
||||||
ConfigSettings, IndexStrategy, KeyringProviderType, NoBinary, NoBuild, Reinstall,
|
ConfigSettings, IndexStrategy, KeyringProviderType, NoBinary, NoBuild, PreviewMode, Reinstall,
|
||||||
SetupPyStrategy, TargetTriple, Upgrade,
|
SetupPyStrategy, TargetTriple, Upgrade,
|
||||||
};
|
};
|
||||||
use uv_normalize::PackageName;
|
use uv_normalize::PackageName;
|
||||||
|
|
@ -16,7 +17,7 @@ use uv_workspace::{PipOptions, Workspace};
|
||||||
|
|
||||||
use crate::cli::{
|
use crate::cli::{
|
||||||
ColorChoice, GlobalArgs, Maybe, PipCheckArgs, PipCompileArgs, PipFreezeArgs, PipInstallArgs,
|
ColorChoice, GlobalArgs, Maybe, PipCheckArgs, PipCompileArgs, PipFreezeArgs, PipInstallArgs,
|
||||||
PipListArgs, PipShowArgs, PipSyncArgs, PipUninstallArgs, VenvArgs,
|
PipListArgs, PipShowArgs, PipSyncArgs, PipUninstallArgs, RunArgs, VenvArgs,
|
||||||
};
|
};
|
||||||
use crate::commands::ListFormat;
|
use crate::commands::ListFormat;
|
||||||
|
|
||||||
|
|
@ -28,6 +29,7 @@ pub(crate) struct GlobalSettings {
|
||||||
pub(crate) verbose: u8,
|
pub(crate) verbose: u8,
|
||||||
pub(crate) color: ColorChoice,
|
pub(crate) color: ColorChoice,
|
||||||
pub(crate) native_tls: bool,
|
pub(crate) native_tls: bool,
|
||||||
|
pub(crate) preview: PreviewMode,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GlobalSettings {
|
impl GlobalSettings {
|
||||||
|
|
@ -44,6 +46,11 @@ impl GlobalSettings {
|
||||||
native_tls: flag(args.native_tls, args.no_native_tls)
|
native_tls: flag(args.native_tls, args.no_native_tls)
|
||||||
.or(workspace.and_then(|workspace| workspace.options.native_tls))
|
.or(workspace.and_then(|workspace| workspace.options.native_tls))
|
||||||
.unwrap_or(false),
|
.unwrap_or(false),
|
||||||
|
preview: PreviewMode::from(
|
||||||
|
flag(args.preview, args.no_preview)
|
||||||
|
.or(workspace.and_then(|workspace| workspace.options.preview))
|
||||||
|
.unwrap_or(false),
|
||||||
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -71,6 +78,41 @@ impl CacheSettings {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The resolved settings to use for a `run` invocation.
|
||||||
|
#[allow(clippy::struct_excessive_bools)]
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub(crate) struct RunSettings {
|
||||||
|
// CLI-only settings.
|
||||||
|
pub(crate) target: Option<String>,
|
||||||
|
pub(crate) args: Vec<OsString>,
|
||||||
|
pub(crate) isolated: bool,
|
||||||
|
pub(crate) with: Vec<String>,
|
||||||
|
pub(crate) no_workspace: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RunSettings {
|
||||||
|
/// Resolve the [`RunSettings`] from the CLI and workspace configuration.
|
||||||
|
#[allow(clippy::needless_pass_by_value)]
|
||||||
|
pub(crate) fn resolve(args: RunArgs, _workspace: Option<Workspace>) -> Self {
|
||||||
|
let RunArgs {
|
||||||
|
target,
|
||||||
|
args,
|
||||||
|
isolated,
|
||||||
|
with,
|
||||||
|
no_workspace,
|
||||||
|
} = args;
|
||||||
|
|
||||||
|
Self {
|
||||||
|
// CLI-only settings.
|
||||||
|
target,
|
||||||
|
args,
|
||||||
|
isolated,
|
||||||
|
with,
|
||||||
|
no_workspace,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The resolved settings to use for a `pip compile` invocation.
|
/// The resolved settings to use for a `pip compile` invocation.
|
||||||
#[allow(clippy::struct_excessive_bools)]
|
#[allow(clippy::struct_excessive_bools)]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
|
||||||
6
uv.schema.json
generated
6
uv.schema.json
generated
|
|
@ -31,6 +31,12 @@
|
||||||
"type": "null"
|
"type": "null"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"type": [
|
||||||
|
"boolean",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue