Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace pybabel with a dedicated executable package #10726

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 46 additions & 38 deletions crates/uv/tests/it/tool_install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@ fn tool_install() {

#[test]
fn tool_install_with_editable() -> Result<()> {
static EXCLUDE_NEWER: &str = "2025-01-18T00:00:00Z";

let context = TestContext::new("3.12")
.with_filtered_counts()
.with_filtered_exe_suffix();
Expand All @@ -189,11 +191,12 @@ fn tool_install_with_editable() -> Result<()> {
)?;

uv_snapshot!(context.filters(), context.tool_install()
.env(EnvVars::UV_EXCLUDE_NEWER, EXCLUDE_NEWER)
.arg("--with-editable")
.arg("./src/anyio_local")
.arg("--with")
.arg("iniconfig")
.arg("flask")
.arg("executable-application")
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
Expand All @@ -206,15 +209,9 @@ fn tool_install_with_editable() -> Result<()> {
Prepared [N] packages in [TIME]
Installed [N] packages in [TIME]
+ anyio==4.3.0+foo (from file://[TEMP_DIR]/src/anyio_local)
+ blinker==1.7.0
+ click==8.1.7
+ flask==3.0.2
+ executable-application==0.3.0
+ iniconfig==2.0.0
+ itsdangerous==2.1.2
+ jinja2==3.1.3
+ markupsafe==2.1.5
+ werkzeug==3.0.1
Installed 1 executable: flask
Installed 1 executable: app
"###);

Ok(())
Expand Down Expand Up @@ -2596,15 +2593,18 @@ fn tool_install_bad_receipt() -> Result<()> {
/// that isn't properly normalized).
#[test]
fn tool_install_malformed_dist_info() {
static EXCLUDE_NEWER: &str = "2025-01-18T00:00:00Z";

let context = TestContext::new("3.12")
.with_filtered_counts()
.with_filtered_exe_suffix();
let tool_dir = context.temp_dir.child("tools");
let bin_dir = context.temp_dir.child("bin");

// Install `babel`
// Install `executable-application`
uv_snapshot!(context.filters(), context.tool_install()
.arg("babel")
.env(EnvVars::UV_EXCLUDE_NEWER, EXCLUDE_NEWER)
.arg("executable-application")
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
Expand All @@ -2616,17 +2616,19 @@ fn tool_install_malformed_dist_info() {
Resolved [N] packages in [TIME]
Prepared [N] packages in [TIME]
Installed [N] packages in [TIME]
+ babel==2.14.0
Installed 1 executable: pybabel
+ executable-application==0.3.0
Installed 1 executable: app
"###);

tool_dir.child("babel").assert(predicate::path::is_dir());
tool_dir
.child("babel")
.child("executable-application")
.assert(predicate::path::is_dir());
tool_dir
.child("executable-application")
.child("uv-receipt.toml")
.assert(predicate::path::exists());

let executable = bin_dir.child(format!("pybabel{}", std::env::consts::EXE_SUFFIX));
let executable = bin_dir.child(format!("app{}", std::env::consts::EXE_SUFFIX));
assert!(executable.exists());

// On Windows, we can't snapshot an executable file.
Expand All @@ -2636,10 +2638,10 @@ fn tool_install_malformed_dist_info() {
}, {
// Should run black in the virtual environment
assert_snapshot!(fs_err::read_to_string(executable).unwrap(), @r###"
#![TEMP_DIR]/tools/babel/bin/python
#![TEMP_DIR]/tools/executable-application/bin/python
# -*- coding: utf-8 -*-
import sys
from babel.messages.frontend import main
from executable_application import main
if __name__ == "__main__":
if sys.argv[0].endswith("-script.pyw"):
sys.argv[0] = sys.argv[0][:-11]
Expand All @@ -2654,15 +2656,15 @@ fn tool_install_malformed_dist_info() {
filters => context.filters(),
}, {
// We should have a tool receipt
assert_snapshot!(fs_err::read_to_string(tool_dir.join("babel").join("uv-receipt.toml")).unwrap(), @r###"
assert_snapshot!(fs_err::read_to_string(tool_dir.join("executable-application").join("uv-receipt.toml")).unwrap(), @r###"
[tool]
requirements = [{ name = "babel" }]
requirements = [{ name = "executable-application" }]
entrypoints = [
{ name = "pybabel", install-path = "[TEMP_DIR]/bin/pybabel" },
{ name = "app", install-path = "[TEMP_DIR]/bin/app" },
]
[tool.options]
exclude-newer = "2024-03-25T00:00:00Z"
exclude-newer = "2025-01-18T00:00:00Z"
"###);
});
}
Expand Down Expand Up @@ -2939,16 +2941,19 @@ fn tool_install_at_latest() {
/// Test installing a tool with `uv tool install {package} --from {package}@latest`.
#[test]
fn tool_install_from_at_latest() {
static EXCLUDE_NEWER: &str = "2025-01-18T00:00:00Z";

let context = TestContext::new("3.12")
.with_filtered_counts()
.with_filtered_exe_suffix();
let tool_dir = context.temp_dir.child("tools");
let bin_dir = context.temp_dir.child("bin");

uv_snapshot!(context.filters(), context.tool_install()
.arg("pybabel")
.env(EnvVars::UV_EXCLUDE_NEWER, EXCLUDE_NEWER)
.arg("app")
.arg("--from")
.arg("babel@latest")
.arg("executable-application@latest")
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
Expand All @@ -2960,39 +2965,42 @@ fn tool_install_from_at_latest() {
Resolved [N] packages in [TIME]
Prepared [N] packages in [TIME]
Installed [N] packages in [TIME]
+ babel==2.14.0
Installed 1 executable: pybabel
+ executable-application==0.3.0
Installed 1 executable: app
"###);

insta::with_settings!({
filters => context.filters(),
}, {
assert_snapshot!(fs_err::read_to_string(tool_dir.join("babel").join("uv-receipt.toml")).unwrap(), @r###"
assert_snapshot!(fs_err::read_to_string(tool_dir.join("executable-application").join("uv-receipt.toml")).unwrap(), @r###"
[tool]
requirements = [{ name = "babel" }]
requirements = [{ name = "executable-application" }]
entrypoints = [
{ name = "pybabel", install-path = "[TEMP_DIR]/bin/pybabel" },
{ name = "app", install-path = "[TEMP_DIR]/bin/app" },
]
[tool.options]
exclude-newer = "2024-03-25T00:00:00Z"
exclude-newer = "2025-01-18T00:00:00Z"
"###);
});
}

/// Test installing a tool with `uv tool install {package} --from {package}@{version}`.
#[test]
fn tool_install_from_at_version() {
static EXCLUDE_NEWER: &str = "2025-01-18T00:00:00Z";

let context = TestContext::new("3.12")
.with_filtered_counts()
.with_filtered_exe_suffix();
let tool_dir = context.temp_dir.child("tools");
let bin_dir = context.temp_dir.child("bin");

uv_snapshot!(context.filters(), context.tool_install()
.arg("pybabel")
.env(EnvVars::UV_EXCLUDE_NEWER, EXCLUDE_NEWER)
.arg("app")
.arg("--from")
.arg("[email protected].0")
.arg("[email protected].0")
.env(EnvVars::UV_TOOL_DIR, tool_dir.as_os_str())
.env(EnvVars::XDG_BIN_HOME, bin_dir.as_os_str())
.env(EnvVars::PATH, bin_dir.as_os_str()), @r###"
Expand All @@ -3004,22 +3012,22 @@ fn tool_install_from_at_version() {
Resolved [N] packages in [TIME]
Prepared [N] packages in [TIME]
Installed [N] packages in [TIME]
+ babel==2.13.0
Installed 1 executable: pybabel
+ executable-application==0.2.0
Installed 1 executable: app
"###);

insta::with_settings!({
filters => context.filters(),
}, {
assert_snapshot!(fs_err::read_to_string(tool_dir.join("babel").join("uv-receipt.toml")).unwrap(), @r###"
assert_snapshot!(fs_err::read_to_string(tool_dir.join("executable-application").join("uv-receipt.toml")).unwrap(), @r###"
[tool]
requirements = [{ name = "babel", specifier = "==2.13.0" }]
requirements = [{ name = "executable-application", specifier = "==0.2.0" }]
entrypoints = [
{ name = "pybabel", install-path = "[TEMP_DIR]/bin/pybabel" },
{ name = "app", install-path = "[TEMP_DIR]/bin/app" },
]
[tool.options]
exclude-newer = "2024-03-25T00:00:00Z"
exclude-newer = "2025-01-18T00:00:00Z"
"###);
});
}
Expand Down
Loading