mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 21:35:00 +00:00
1402 lines
43 KiB
Rust
1402 lines
43 KiB
Rust
#![cfg(all(feature = "python", feature = "pypi"))]
|
|
|
|
use anyhow::Result;
|
|
use assert_fs::prelude::*;
|
|
use indoc::indoc;
|
|
use insta::assert_snapshot;
|
|
|
|
use common::{uv_snapshot, TestContext};
|
|
|
|
mod common;
|
|
|
|
/// Add a PyPI requirement.
|
|
#[test]
|
|
fn add_registry() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
# ...
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.add(&["anyio==3.7.0"]), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv add` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
Prepared 4 packages in [TIME]
|
|
Installed 4 packages in [TIME]
|
|
+ anyio==3.7.0
|
|
+ idna==3.6
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ sniffio==1.3.1
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
# ...
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"anyio==3.7.0",
|
|
]
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", size = 142737 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0", size = 80873 }]
|
|
|
|
[[distribution.dependencies]]
|
|
name = "idna"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "sniffio"
|
|
|
|
[[distribution]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567 }]
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
|
|
[[distribution.dependencies]]
|
|
name = "anyio"
|
|
|
|
[[distribution]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }]
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 4 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Add a Git requirement.
|
|
#[test]
|
|
fn add_git() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv lock` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Prepared 4 packages in [TIME]
|
|
Installed 4 packages in [TIME]
|
|
+ anyio==3.7.0
|
|
+ idna==3.6
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ sniffio==1.3.1
|
|
"###);
|
|
|
|
// Adding with an ambiguous Git reference will fail.
|
|
uv_snapshot!(context.filters(), context.add(&["uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@0.0.1"]).arg("--preview"), @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: Cannot resolve Git reference `0.0.1` for requirement `uv-public-pypackage`. Specify the reference with one of `--tag`, `--branch`, or `--rev`, or use the `--raw-sources` flag.
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.add(&["uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage"]).arg("--tag=0.0.1").arg("--preview"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
Prepared 2 packages in [TIME]
|
|
Uninstalled 1 package in [TIME]
|
|
Installed 2 packages in [TIME]
|
|
- project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ uv-public-pypackage==0.1.0 (from git+https://github.com/astral-test/uv-public-pypackage@0dacfd662c64cb4ceb16e6cf65a157a8b715b979?tag=0.0.1#0dacfd662c64cb4ceb16e6cf65a157a8b715b979)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"anyio==3.7.0",
|
|
"uv-public-pypackage",
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
uv-public-pypackage = { git = "https://github.com/astral-test/uv-public-pypackage", tag = "0.0.1" }
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", size = 142737 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0", size = 80873 }]
|
|
|
|
[[distribution.dependencies]]
|
|
name = "idna"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "sniffio"
|
|
|
|
[[distribution]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567 }]
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
|
|
[[distribution.dependencies]]
|
|
name = "anyio"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "uv-public-pypackage"
|
|
|
|
[[distribution]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }]
|
|
|
|
[[distribution]]
|
|
name = "uv-public-pypackage"
|
|
version = "0.1.0"
|
|
source = "git+https://github.com/astral-test/uv-public-pypackage?tag=0.0.1#0dacfd662c64cb4ceb16e6cf65a157a8b715b979"
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 5 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Add a Git requirement using the `--raw-sources` API.
|
|
#[test]
|
|
fn add_git_raw() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv lock` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Prepared 4 packages in [TIME]
|
|
Installed 4 packages in [TIME]
|
|
+ anyio==3.7.0
|
|
+ idna==3.6
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ sniffio==1.3.1
|
|
"###);
|
|
|
|
// Use an ambiguous tag reference, which would otherwise not resolve.
|
|
uv_snapshot!(context.filters(), context.add(&["uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@0.0.1"]).arg("--raw-sources").arg("--preview"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
Prepared 2 packages in [TIME]
|
|
Uninstalled 1 package in [TIME]
|
|
Installed 2 packages in [TIME]
|
|
- project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ uv-public-pypackage==0.1.0 (from git+https://github.com/astral-test/uv-public-pypackage@0dacfd662c64cb4ceb16e6cf65a157a8b715b979?rev=0.0.1#0dacfd662c64cb4ceb16e6cf65a157a8b715b979)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"anyio==3.7.0",
|
|
"uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@0.0.1",
|
|
]
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", size = 142737 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0", size = 80873 }]
|
|
|
|
[[distribution.dependencies]]
|
|
name = "idna"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "sniffio"
|
|
|
|
[[distribution]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567 }]
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
|
|
[[distribution.dependencies]]
|
|
name = "anyio"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "uv-public-pypackage"
|
|
|
|
[[distribution]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }]
|
|
|
|
[[distribution]]
|
|
name = "uv-public-pypackage"
|
|
version = "0.1.0"
|
|
source = "git+https://github.com/astral-test/uv-public-pypackage?rev=0.0.1#0dacfd662c64cb4ceb16e6cf65a157a8b715b979"
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 5 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Add an unnamed requirement.
|
|
#[test]
|
|
fn add_unnamed() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
# ...
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.add(&["git+https://github.com/astral-test/uv-public-pypackage"]).arg("--tag=0.0.1").arg("--preview"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
Prepared 2 packages in [TIME]
|
|
Installed 2 packages in [TIME]
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ uv-public-pypackage==0.1.0 (from git+https://github.com/astral-test/uv-public-pypackage@0dacfd662c64cb4ceb16e6cf65a157a8b715b979?tag=0.0.1#0dacfd662c64cb4ceb16e6cf65a157a8b715b979)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
# ...
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"uv-public-pypackage",
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
uv-public-pypackage = { git = "https://github.com/astral-test/uv-public-pypackage", tag = "0.0.1" }
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
|
|
[[distribution.dependencies]]
|
|
name = "uv-public-pypackage"
|
|
|
|
[[distribution]]
|
|
name = "uv-public-pypackage"
|
|
version = "0.1.0"
|
|
source = "git+https://github.com/astral-test/uv-public-pypackage?tag=0.0.1#0dacfd662c64cb4ceb16e6cf65a157a8b715b979"
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 2 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Add and remove a development dependency.
|
|
#[test]
|
|
fn add_remove_dev() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.add(&["anyio==3.7.0"]).arg("--dev"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv add` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
Prepared 4 packages in [TIME]
|
|
Installed 4 packages in [TIME]
|
|
+ anyio==3.7.0
|
|
+ idna==3.6
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ sniffio==1.3.1
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
|
|
[tool.uv]
|
|
dev-dependencies = [
|
|
"anyio==3.7.0",
|
|
]
|
|
"###
|
|
);
|
|
});
|
|
|
|
// `uv add` implies a full lock and sync, including development dependencies.
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", hash = "sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce", size = 142737 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", hash = "sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0", size = 80873 }]
|
|
|
|
[[distribution.dependencies]]
|
|
name = "idna"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "sniffio"
|
|
|
|
[[distribution]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567 }]
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
|
|
[distribution.dev-dependencies]
|
|
|
|
[[distribution.dev-dependencies.dev]]
|
|
name = "anyio"
|
|
|
|
[[distribution]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }]
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 4 packages in [TIME]
|
|
"###);
|
|
|
|
// This should fail without --dev.
|
|
uv_snapshot!(context.filters(), context.remove(&["anyio"]), @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv remove` is experimental and may change without warning.
|
|
warning: `anyio` is a development dependency; try calling `uv remove --dev`
|
|
error: The dependency `anyio` could not be found in `dependencies`
|
|
"###);
|
|
|
|
// Remove the dependency.
|
|
uv_snapshot!(context.filters(), context.remove(&["anyio"]).arg("--dev"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv remove` is experimental and may change without warning.
|
|
Resolved 1 package in [TIME]
|
|
Prepared 1 package in [TIME]
|
|
Uninstalled 4 packages in [TIME]
|
|
Installed 1 package in [TIME]
|
|
- anyio==3.7.0
|
|
- idna==3.6
|
|
- project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
- sniffio==1.3.1
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
|
|
[tool.uv]
|
|
dev-dependencies = []
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 1 package in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Add and remove a workspace dependency.
|
|
#[test]
|
|
fn add_remove_workspace() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let workspace = context.temp_dir.child("pyproject.toml");
|
|
workspace.write_str(indoc! {r#"
|
|
[tool.uv.workspace]
|
|
members = ["child1", "child2"]
|
|
"#})?;
|
|
|
|
let pyproject_toml = context.temp_dir.child("child1/pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
let pyproject_toml = context.temp_dir.child("child2/pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "child2"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
// Adding a workspace package with a mismatched source should error.
|
|
let mut add_cmd =
|
|
context.add(&["child2 @ git+https://github.com/astral-test/uv-public-pypackage"]);
|
|
add_cmd
|
|
.arg("--preview")
|
|
.arg("--package")
|
|
.arg("child1")
|
|
.current_dir(&context.temp_dir);
|
|
|
|
uv_snapshot!(context.filters(), add_cmd, @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: Workspace dependency `child2` must refer to local directory, not a Git repository
|
|
"###);
|
|
|
|
// Workspace packages should be detected automatically.
|
|
let child1 = context.temp_dir.join("child1");
|
|
let mut add_cmd = context.add(&["child2"]);
|
|
add_cmd
|
|
.arg("--preview")
|
|
.arg("--package")
|
|
.arg("child1")
|
|
.current_dir(&context.temp_dir);
|
|
|
|
uv_snapshot!(context.filters(), add_cmd, @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
Prepared 2 packages in [TIME]
|
|
Installed 2 packages in [TIME]
|
|
+ child1==0.1.0 (from file://[TEMP_DIR]/child1)
|
|
+ child2==0.1.0 (from file://[TEMP_DIR]/child2)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(child1.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"child2",
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
child2 = { workspace = true }
|
|
"###
|
|
);
|
|
});
|
|
|
|
// `uv add` implies a full lock and sync, including development dependencies.
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
source = "editable+child1"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "child2"
|
|
|
|
[[distribution]]
|
|
name = "child2"
|
|
version = "0.1.0"
|
|
source = "editable+child2"
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync().current_dir(&child1), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 2 packages in [TIME]
|
|
"###);
|
|
|
|
// Remove the dependency.
|
|
uv_snapshot!(context.filters(), context.remove(&["child2"]).current_dir(&child1), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv remove` is experimental and may change without warning.
|
|
Resolved 2 packages in [TIME]
|
|
Prepared 1 package in [TIME]
|
|
Uninstalled 2 packages in [TIME]
|
|
Installed 1 package in [TIME]
|
|
- child1==0.1.0 (from file://[TEMP_DIR]/child1)
|
|
+ child1==0.1.0 (from file://[TEMP_DIR]/child1)
|
|
- child2==0.1.0 (from file://[TEMP_DIR]/child2)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(child1.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
|
|
[tool.uv.sources]
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
source = "editable+child1"
|
|
|
|
[[distribution]]
|
|
name = "child2"
|
|
version = "0.1.0"
|
|
source = "editable+child2"
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync().current_dir(&child1), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 1 package in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Add a workspace dependency as an editable.
|
|
#[test]
|
|
fn add_workspace_editable() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let workspace = context.temp_dir.child("pyproject.toml");
|
|
workspace.write_str(indoc! {r#"
|
|
[tool.uv.workspace]
|
|
members = ["child1", "child2"]
|
|
"#})?;
|
|
|
|
let pyproject_toml = context.temp_dir.child("child1/pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
let pyproject_toml = context.temp_dir.child("child2/pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "child2"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
let child1 = context.temp_dir.join("child1");
|
|
let mut add_cmd = context.add(&["child2"]);
|
|
add_cmd
|
|
.arg("--editable")
|
|
.arg("--preview")
|
|
.current_dir(&child1);
|
|
|
|
uv_snapshot!(context.filters(), add_cmd, @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
Prepared 2 packages in [TIME]
|
|
Installed 2 packages in [TIME]
|
|
+ child1==0.1.0 (from file://[TEMP_DIR]/child1)
|
|
+ child2==0.1.0 (from file://[TEMP_DIR]/child2)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(child1.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"child2",
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
child2 = { workspace = true, editable = true }
|
|
"###
|
|
);
|
|
});
|
|
|
|
// `uv add` implies a full lock and sync, including development dependencies.
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
source = "editable+child1"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "child2"
|
|
|
|
[[distribution]]
|
|
name = "child2"
|
|
version = "0.1.0"
|
|
source = "editable+child2"
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync().current_dir(&child1), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 2 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Update a PyPI requirement.
|
|
#[test]
|
|
fn update_registry() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"anyio == 3.7.0 ; python_version >= '3.12'",
|
|
"anyio < 3.7.0 ; python_version < '3.12'",
|
|
]
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv lock` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Prepared 4 packages in [TIME]
|
|
Installed 4 packages in [TIME]
|
|
+ anyio==3.7.0
|
|
+ idna==3.6
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ sniffio==1.3.1
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.add(&["anyio==4.3.0"]), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv add` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
Prepared 2 packages in [TIME]
|
|
Uninstalled 2 packages in [TIME]
|
|
Installed 2 packages in [TIME]
|
|
- anyio==3.7.0
|
|
+ anyio==4.3.0
|
|
- project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"anyio==4.3.0",
|
|
]
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "anyio"
|
|
version = "4.3.0"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/db/4d/3970183622f0330d3c23d9b8a5f52e365e50381fd484d08e3285104333d3/anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6", size = 159642 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/14/fd/2f20c40b45e4fb4324834aea24bd4afdf1143390242c0b33774da0e2e34f/anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8", size = 85584 }]
|
|
|
|
[[distribution.dependencies]]
|
|
name = "idna"
|
|
|
|
[[distribution.dependencies]]
|
|
name = "sniffio"
|
|
|
|
[[distribution]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", size = 175426 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567 }]
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
|
|
[[distribution.dependencies]]
|
|
name = "anyio"
|
|
|
|
[[distribution]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }]
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 4 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Adding a dependency does not clean the environment.
|
|
#[test]
|
|
fn add_no_clean() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"anyio == 3.7.0",
|
|
]
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv lock` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Prepared 4 packages in [TIME]
|
|
Installed 4 packages in [TIME]
|
|
+ anyio==3.7.0
|
|
+ idna==3.6
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ sniffio==1.3.1
|
|
"###);
|
|
|
|
// Manually remove a dependency.
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.add(&["iniconfig==2.0.0"]), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv add` is experimental and may change without warning.
|
|
Resolved 2 packages in [TIME]
|
|
Prepared 2 packages in [TIME]
|
|
Uninstalled 1 package in [TIME]
|
|
Installed 2 packages in [TIME]
|
|
+ iniconfig==2.0.0
|
|
- project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"iniconfig==2.0.0",
|
|
]
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "iniconfig"
|
|
version = "2.0.0"
|
|
source = "registry+https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }]
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
|
|
[[distribution.dependencies]]
|
|
name = "iniconfig"
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile without cleaning the environment.
|
|
uv_snapshot!(context.filters(), context.sync().arg("--no-clean"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 2 packages in [TIME]
|
|
"###);
|
|
|
|
// Install from the lockfile, cleaning the environment.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Uninstalled 3 packages in [TIME]
|
|
- anyio==3.7.0
|
|
- idna==3.6
|
|
- sniffio==1.3.1
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Remove a PyPI requirement.
|
|
#[test]
|
|
fn remove_registry() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv lock` is experimental and may change without warning.
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Prepared 4 packages in [TIME]
|
|
Installed 4 packages in [TIME]
|
|
+ anyio==3.7.0
|
|
+ idna==3.6
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ sniffio==1.3.1
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.remove(&["anyio"]), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv remove` is experimental and may change without warning.
|
|
Resolved 1 package in [TIME]
|
|
Prepared 1 package in [TIME]
|
|
Uninstalled 4 packages in [TIME]
|
|
Installed 1 package in [TIME]
|
|
- anyio==3.7.0
|
|
- idna==3.6
|
|
- project==0.1.0 (from file://[TEMP_DIR]/)
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/)
|
|
- sniffio==1.3.1
|
|
"###);
|
|
|
|
let pyproject_toml = fs_err::read_to_string(context.temp_dir.join("pyproject.toml"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
pyproject_toml, @r###"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
"###
|
|
);
|
|
});
|
|
|
|
let lock = fs_err::read_to_string(context.temp_dir.join("uv.lock"))?;
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r###"
|
|
version = 1
|
|
requires-python = ">=3.12"
|
|
|
|
[[distribution]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = "editable+."
|
|
"###
|
|
);
|
|
});
|
|
|
|
// Install from the lockfile.
|
|
uv_snapshot!(context.filters(), context.sync(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv sync` is experimental and may change without warning.
|
|
Audited 1 package in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|