mirror of https://github.com/astral-sh/uv
8328 lines
299 KiB
Rust
8328 lines
299 KiB
Rust
#![allow(clippy::disallowed_types)]
|
|
|
|
#[cfg(feature = "git")]
|
|
use crate::common::{READ_ONLY_GITHUB_SSH_DEPLOY_KEY, READ_ONLY_GITHUB_TOKEN, decode_token};
|
|
use crate::common::{TestContext, apply_filters, uv_snapshot};
|
|
use anyhow::{Ok, Result};
|
|
use assert_cmd::assert::OutputAssertExt;
|
|
use assert_fs::prelude::*;
|
|
use indoc::{formatdoc, indoc};
|
|
use insta::assert_snapshot;
|
|
#[cfg(feature = "git")]
|
|
use std::path::Path;
|
|
use std::process::Stdio;
|
|
#[cfg(feature = "git")]
|
|
use uv_fs::Simplified;
|
|
use uv_static::EnvVars;
|
|
|
|
#[test]
|
|
fn requirements_txt_dependency() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_export_no_header() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-header"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_dependency_extra() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["flask[dotenv]"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
blinker==1.7.0 \
|
|
--hash=sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 \
|
|
--hash=sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182
|
|
# via flask
|
|
click==8.1.7 \
|
|
--hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \
|
|
--hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de
|
|
# via flask
|
|
colorama==0.4.6 ; sys_platform == 'win32' \
|
|
--hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
|
|
--hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6
|
|
# via click
|
|
flask==3.0.2 \
|
|
--hash=sha256:3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e \
|
|
--hash=sha256:822c03f4b799204250a7ee84b1eddc40665395333973dfb9deebfe425fefcb7d
|
|
# via project
|
|
itsdangerous==2.1.2 \
|
|
--hash=sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 \
|
|
--hash=sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a
|
|
# via flask
|
|
jinja2==3.1.3 \
|
|
--hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \
|
|
--hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90
|
|
# via flask
|
|
markupsafe==2.1.5 \
|
|
--hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \
|
|
--hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \
|
|
--hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \
|
|
--hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \
|
|
--hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \
|
|
--hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \
|
|
--hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \
|
|
--hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \
|
|
--hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \
|
|
--hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \
|
|
--hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5
|
|
# via
|
|
# jinja2
|
|
# werkzeug
|
|
python-dotenv==1.0.1 \
|
|
--hash=sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca \
|
|
--hash=sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a
|
|
# via flask
|
|
werkzeug==3.0.1 \
|
|
--hash=sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc \
|
|
--hash=sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10
|
|
# via flask
|
|
|
|
----- stderr -----
|
|
Resolved 10 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_project_extra() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions"]
|
|
|
|
[project.optional-dependencies]
|
|
async = ["anyio==3.7.0"]
|
|
pytest = ["iniconfig"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--extra").arg("pytest").arg("--extra").arg("async").arg("--no-extra").arg("pytest"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --extra pytest --extra async --no-extra pytest
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--extra").arg("pytest"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --extra pytest
|
|
-e .
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via project
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-extras"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --all-extras
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via project
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-extras").arg("--no-extra").arg("pytest"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --all-extras --no-extra pytest
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_prune() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"jupyter-client"
|
|
]
|
|
"#,
|
|
)?;
|
|
|
|
// project v0.1.0
|
|
// └── jupyter-client v8.6.1
|
|
// ├── jupyter-core v5.7.2
|
|
// │ ├── platformdirs v4.2.0
|
|
// │ └── traitlets v5.14.2
|
|
// ├── python-dateutil v2.9.0.post0
|
|
// │ └── six v1.16.0
|
|
// ├── pyzmq v25.1.2
|
|
// ├── tornado v6.4
|
|
// └── traitlets v5.14.2
|
|
|
|
uv_snapshot!(
|
|
context.filters(),
|
|
context.export()
|
|
.arg("--no-hashes")
|
|
.arg("--prune")
|
|
.arg("jupyter-core"),
|
|
@r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-hashes --prune jupyter-core
|
|
cffi==1.16.0 ; implementation_name == 'pypy'
|
|
# via pyzmq
|
|
jupyter-client==8.6.1
|
|
# via project
|
|
pycparser==2.21 ; implementation_name == 'pypy'
|
|
# via cffi
|
|
python-dateutil==2.9.0.post0
|
|
# via jupyter-client
|
|
pyzmq==25.1.2
|
|
# via jupyter-client
|
|
six==1.16.0
|
|
# via python-dateutil
|
|
tornado==6.4
|
|
# via jupyter-client
|
|
traitlets==5.14.2
|
|
# via jupyter-client
|
|
|
|
----- stderr -----
|
|
Resolved 12 packages in [TIME]
|
|
"
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_dependency_marker() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio ; sys_platform == 'darwin'", "iniconfig"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
anyio==4.3.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
# via project
|
|
idna==3.6 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via project
|
|
sniffio==1.3.1 ; sys_platform == 'darwin' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_dependency_multiple_markers() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.10"
|
|
dependencies = [
|
|
"trio ; python_version > '3.11'",
|
|
"trio ; sys_platform == 'win32'",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Note that the `python_version > '3.11'` markers disappear due to `requires-python = ">=3.12"`
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
attrs==23.2.0 ; python_full_version >= '3.12' or sys_platform == 'win32' \
|
|
--hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \
|
|
--hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1
|
|
# via
|
|
# outcome
|
|
# trio
|
|
cffi==1.16.0 ; (python_full_version >= '3.12' and implementation_name != 'pypy' and os_name == 'nt') or (implementation_name != 'pypy' and os_name == 'nt' and sys_platform == 'win32') \
|
|
--hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \
|
|
--hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \
|
|
--hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \
|
|
--hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \
|
|
--hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \
|
|
--hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \
|
|
--hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1
|
|
# via trio
|
|
exceptiongroup==1.2.0 ; python_full_version < '3.11' and sys_platform == 'win32' \
|
|
--hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \
|
|
--hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68
|
|
# via trio
|
|
idna==3.6 ; python_full_version >= '3.12' or sys_platform == 'win32' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via trio
|
|
outcome==1.3.0.post0 ; python_full_version >= '3.12' or sys_platform == 'win32' \
|
|
--hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \
|
|
--hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b
|
|
# via trio
|
|
pycparser==2.21 ; (python_full_version >= '3.12' and implementation_name != 'pypy' and os_name == 'nt') or (implementation_name != 'pypy' and os_name == 'nt' and sys_platform == 'win32') \
|
|
--hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
|
|
--hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
|
|
# via cffi
|
|
sniffio==1.3.1 ; python_full_version >= '3.12' or sys_platform == 'win32' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via trio
|
|
sortedcontainers==2.4.0 ; python_full_version >= '3.12' or sys_platform == 'win32' \
|
|
--hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \
|
|
--hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0
|
|
# via trio
|
|
trio==0.25.0 ; python_full_version >= '3.12' or sys_platform == 'win32' \
|
|
--hash=sha256:9b41f5993ad2c0e5f62d0acca320ec657fdb6b2a2c22b8c7aed6caf154475c4e \
|
|
--hash=sha256:e6458efe29cc543e557a91e614e2b51710eba2961669329ce9c862d50c6e8e81
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 10 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_dependency_conflicting_markers() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"trio==0.25.0 ; sys_platform == 'darwin'",
|
|
"trio==0.10.0 ; sys_platform == 'win32'",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
uv_snapshot!(context.filters(), context.lock(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 11 packages in [TIME]
|
|
"###);
|
|
|
|
let lock = context.read("uv.lock");
|
|
|
|
insta::with_settings!(
|
|
{
|
|
filters => context.filters(),
|
|
},
|
|
{
|
|
insta::assert_snapshot!(
|
|
lock, @r#"
|
|
version = 1
|
|
revision = 3
|
|
requires-python = ">=3.12"
|
|
resolution-markers = [
|
|
"sys_platform == 'darwin'",
|
|
"sys_platform == 'win32'",
|
|
"sys_platform != 'darwin' and sys_platform != 'win32'",
|
|
]
|
|
|
|
[options]
|
|
exclude-newer = "2024-03-25T00:00:00Z"
|
|
|
|
[[package]]
|
|
name = "async-generator"
|
|
version = "1.10"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
sdist = { url = "https://files.pythonhosted.org/packages/ce/b6/6fa6b3b598a03cba5e80f829e0dadbb49d7645f523d209b2fb7ea0bbb02a/async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144", size = 29870, upload-time = "2018-08-01T03:36:21.69Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/71/52/39d20e03abd0ac9159c162ec24b93fbcaa111e8400308f2465432495ca2b/async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", size = 18857, upload-time = "2018-08-01T03:36:20.029Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "attrs"
|
|
version = "23.2.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
sdist = { url = "https://files.pythonhosted.org/packages/e3/fc/f800d51204003fa8ae392c4e8278f256206e7a919b708eef054f5f4b650d/attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", size = 780820, upload-time = "2023-12-31T06:30:32.926Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1", size = 60752, upload-time = "2023-12-31T06:30:30.772Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "cffi"
|
|
version = "1.16.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
dependencies = [
|
|
{ name = "pycparser", marker = "sys_platform == 'win32'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/68/ce/95b0bae7968c65473e1298efb042e10cafc7bafc14d9e4f154008241c91d/cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", size = 512873, upload-time = "2023-09-28T18:02:04.656Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/c9/6e/751437067affe7ac0944b1ad4856ec11650da77f0dd8f305fae1117ef7bb/cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", size = 173564, upload-time = "2023-09-28T18:01:23.527Z" },
|
|
{ url = "https://files.pythonhosted.org/packages/e9/63/e285470a4880a4f36edabe4810057bd4b562c6ddcc165eacf9c3c7210b40/cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", size = 181956, upload-time = "2023-09-28T18:01:24.971Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2023-11-25T15:40:54.902Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "outcome"
|
|
version = "1.3.0.post0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
dependencies = [
|
|
{ name = "attrs", marker = "sys_platform == 'darwin' or sys_platform == 'win32'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060, upload-time = "2023-10-26T04:26:04.361Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692, upload-time = "2023-10-26T04:26:02.532Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
source = { editable = "." }
|
|
dependencies = [
|
|
{ name = "trio", version = "0.10.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" },
|
|
{ name = "trio", version = "0.25.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin'" },
|
|
]
|
|
|
|
[package.metadata]
|
|
requires-dist = [
|
|
{ name = "trio", marker = "sys_platform == 'darwin'", specifier = "==0.25.0" },
|
|
{ name = "trio", marker = "sys_platform == 'win32'", specifier = "==0.10.0" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "pycparser"
|
|
version = "2.21"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
sdist = { url = "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206", size = 170877, upload-time = "2021-11-06T12:48:46.095Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", size = 118697, upload-time = "2021-11-06T12:50:13.61Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2024-02-25T23:20:04.057Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "sortedcontainers"
|
|
version = "2.4.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "trio"
|
|
version = "0.10.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'win32'",
|
|
]
|
|
dependencies = [
|
|
{ name = "async-generator", marker = "sys_platform == 'win32'" },
|
|
{ name = "attrs", marker = "sys_platform == 'win32'" },
|
|
{ name = "cffi", marker = "os_name == 'nt' and sys_platform == 'win32'" },
|
|
{ name = "idna", marker = "sys_platform == 'win32'" },
|
|
{ name = "outcome", marker = "sys_platform == 'win32'" },
|
|
{ name = "sniffio", marker = "sys_platform == 'win32'" },
|
|
{ name = "sortedcontainers", marker = "sys_platform == 'win32'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/e6/20/37be7b5f47db6a9fbf905b5de5386e5b7193c45d07becb750db6f03cd117/trio-0.10.0.tar.gz", hash = "sha256:d323cc15f6406d15954af91e5e34af2001cc24163fdde29e3f88a227a1b53ab0", size = 402511, upload-time = "2019-01-08T09:59:04.649Z" }
|
|
|
|
[[package]]
|
|
name = "trio"
|
|
version = "0.25.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'darwin'",
|
|
]
|
|
dependencies = [
|
|
{ name = "attrs", marker = "sys_platform == 'darwin'" },
|
|
{ name = "idna", marker = "sys_platform == 'darwin'" },
|
|
{ name = "outcome", marker = "sys_platform == 'darwin'" },
|
|
{ name = "sniffio", marker = "sys_platform == 'darwin'" },
|
|
{ name = "sortedcontainers", marker = "sys_platform == 'darwin'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/b4/51/4f5ae37ec58768b9c30e5bc5b89431a7baf3fa9d0dda98983af6ef55eb47/trio-0.25.0.tar.gz", hash = "sha256:9b41f5993ad2c0e5f62d0acca320ec657fdb6b2a2c22b8c7aed6caf154475c4e", size = 551863, upload-time = "2024-03-17T02:53:47.736Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/17/c9/f86f89f14d52f9f2f652ce24cb2f60141a51d087db1563f3fba94ba07346/trio-0.25.0-py3-none-any.whl", hash = "sha256:e6458efe29cc543e557a91e614e2b51710eba2961669329ce9c862d50c6e8e81", size = 467161, upload-time = "2024-03-17T02:53:45.462Z" },
|
|
]
|
|
"#
|
|
);
|
|
}
|
|
);
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
async-generator==1.10 ; sys_platform == 'win32' \
|
|
--hash=sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b \
|
|
--hash=sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144
|
|
# via trio
|
|
attrs==23.2.0 ; sys_platform == 'darwin' or sys_platform == 'win32' \
|
|
--hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \
|
|
--hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1
|
|
# via
|
|
# outcome
|
|
# trio
|
|
cffi==1.16.0 ; os_name == 'nt' and sys_platform == 'win32' \
|
|
--hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \
|
|
--hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \
|
|
--hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0
|
|
# via trio
|
|
idna==3.6 ; sys_platform == 'darwin' or sys_platform == 'win32' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via trio
|
|
outcome==1.3.0.post0 ; sys_platform == 'darwin' or sys_platform == 'win32' \
|
|
--hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \
|
|
--hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b
|
|
# via trio
|
|
pycparser==2.21 ; os_name == 'nt' and sys_platform == 'win32' \
|
|
--hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
|
|
--hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
|
|
# via cffi
|
|
sniffio==1.3.1 ; sys_platform == 'darwin' or sys_platform == 'win32' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via trio
|
|
sortedcontainers==2.4.0 ; sys_platform == 'darwin' or sys_platform == 'win32' \
|
|
--hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \
|
|
--hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0
|
|
# via trio
|
|
trio==0.10.0 ; sys_platform == 'win32' \
|
|
--hash=sha256:d323cc15f6406d15954af91e5e34af2001cc24163fdde29e3f88a227a1b53ab0
|
|
# via project
|
|
trio==0.25.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9b41f5993ad2c0e5f62d0acca320ec657fdb6b2a2c22b8c7aed6caf154475c4e \
|
|
--hash=sha256:e6458efe29cc543e557a91e614e2b51710eba2961669329ce9c862d50c6e8e81
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 11 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_non_root() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig>=2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--package").arg("child"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --package child
|
|
-e ./child
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn allrequirements_txt_() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig>=2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-packages"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --all-packages
|
|
-e .
|
|
-e ./child
|
|
# via project
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_frozen() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig>=2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Remove the child `pyproject.toml`.
|
|
fs_err::remove_dir_all(child.path())?;
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-packages"), @r"
|
|
success: false
|
|
exit_code: 1
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: Failed to build `project @ file://[TEMP_DIR]/`
|
|
Caused by: Failed to parse entry: `child`
|
|
Caused by: `child` references a workspace in `tool.uv.sources` (e.g., `child = { workspace = true }`), but is not a workspace member
|
|
");
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-packages").arg("--frozen"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --all-packages --frozen
|
|
-e .
|
|
-e ./child
|
|
# via project
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_create_missing_dir() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export()
|
|
.arg("--output-file")
|
|
.arg("requirements/requirements.txt"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --output-file requirements/requirements.txt
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
//
|
|
// Read the file contents.
|
|
let contents = apply_filters(
|
|
fs_err::read_to_string(
|
|
context
|
|
.temp_dir
|
|
.child("requirements")
|
|
.child("requirements.txt"),
|
|
)
|
|
.unwrap(),
|
|
context.filters(),
|
|
);
|
|
insta::assert_snapshot!(contents, @r###"
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --output-file requirements/requirements.txt
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
"###);
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_non_project() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[tool.uv.workspace]
|
|
members = []
|
|
|
|
[dependency-groups]
|
|
async = ["anyio"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 3 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--group").arg("async"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group async
|
|
anyio==4.3.0 \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 3 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn virtual_empty() -> Result<()> {
|
|
// testing how `uv export` reacts to a pyproject with no `[project]` and nothing useful to it
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[tool.mycooltool]
|
|
wow = "someconfig"
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn virtual_dependency_group() -> Result<()> {
|
|
// testing basic `uv export --group` functionality
|
|
// when the pyproject.toml is fully virtual (no `[project]`)
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(indoc! {r#"
|
|
[dependency-groups]
|
|
foo = ["sortedcontainers"]
|
|
bar = ["iniconfig"]
|
|
dev = ["sniffio"]
|
|
"#})?;
|
|
|
|
// default groups
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 3 packages in [TIME]
|
|
");
|
|
|
|
// explicit --group
|
|
uv_snapshot!(context.filters(), context.export()
|
|
.arg("--group").arg("bar"), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group bar
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 3 packages in [TIME]
|
|
");
|
|
|
|
// explicit --only-group
|
|
uv_snapshot!(context.filters(), context.export()
|
|
.arg("--only-group").arg("foo"), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --only-group foo
|
|
sortedcontainers==2.4.0 \
|
|
--hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \
|
|
--hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 3 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(feature = "git")]
|
|
#[test]
|
|
fn requirements_txt_https_git_credentials() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
let token = decode_token(READ_ONLY_GITHUB_TOKEN);
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(&formatdoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["uv-private-pypackage @ git+https://{token}@github.com/astral-test/uv-private-pypackage"]
|
|
"#})?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// The token should not be included in the export
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
uv-private-pypackage @ git+https://github.com/astral-test/uv-private-pypackage@d780faf0ac91257d4d5a4f0c5a0e4509608c0071
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// SSH blocks too permissive key files, so we need to scope permissions for the file to the current
|
|
/// user.
|
|
#[cfg(feature = "git")]
|
|
fn reduce_ssh_key_file_permissions(key_file: &Path) -> Result<()> {
|
|
#[cfg(unix)]
|
|
{
|
|
use std::fs::Permissions;
|
|
use std::os::unix::fs::PermissionsExt;
|
|
|
|
fs_err::set_permissions(key_file, Permissions::from_mode(0o400))?;
|
|
}
|
|
#[cfg(windows)]
|
|
{
|
|
use std::process::Command;
|
|
|
|
// https://superuser.com/a/1489152
|
|
Command::new("icacls")
|
|
.arg(key_file)
|
|
.arg("/inheritance:r")
|
|
.assert()
|
|
.success();
|
|
Command::new("icacls")
|
|
.arg(key_file)
|
|
.arg("/grant:r")
|
|
.arg(format!("{}:R", whoami::username()))
|
|
.assert()
|
|
.success();
|
|
}
|
|
Ok(())
|
|
}
|
|
|
|
/// Don't redact the username `git` in SSH URLs.
|
|
#[cfg(feature = "git")]
|
|
#[test]
|
|
fn requirements_txt_ssh_git_username() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "debug"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["uv-private-pypackage @ git+ssh://git@github.com/astral-test/uv-private-pypackage.git@d780faf0ac91257d4d5a4f0c5a0e4509608c0071"]
|
|
"#,
|
|
)?;
|
|
|
|
let fake_deploy_key = context.temp_dir.child("fake_deploy_key");
|
|
fake_deploy_key.write_str("not a key")?;
|
|
reduce_ssh_key_file_permissions(&fake_deploy_key)?;
|
|
|
|
// Ensure that we fail without passing the correct key (and don't go to the dev machine's
|
|
// credential helper).
|
|
// Overriding UserKnownHostsFile prevents OpenSSH from writing into user's home directory.
|
|
let failing_git_ssh_command = format!(
|
|
"ssh -i {} -o IdentitiesOnly=yes -F /dev/null -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null",
|
|
fake_deploy_key.portable_display()
|
|
);
|
|
let mut filters = context.filters();
|
|
filters.push((
|
|
"process didn't exit successfully: .*",
|
|
"process didn't exit successfully: [GIT_COMMAND_ERROR]",
|
|
));
|
|
let load_key_error = regex::escape(r#"Load key "[TEMP_DIR]/fake_deploy_key":"#) + ".*";
|
|
filters.push((
|
|
&load_key_error,
|
|
r#"Load key "[TEMP_DIR]/fake_deploy_key": [ERROR]"#,
|
|
));
|
|
filters.push((
|
|
" *Warning: Permanently added 'github.com' \\(ED25519\\) to the list of known hosts.*\n",
|
|
"",
|
|
));
|
|
filters.push(("failed to clone into: .*", "failed to clone into: [PATH]"));
|
|
uv_snapshot!(filters, context.export().env(EnvVars::GIT_SSH_COMMAND, failing_git_ssh_command), @r#"
|
|
success: false
|
|
exit_code: 1
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: Failed to download and build `uv-private-pypackage @ git+ssh://git@github.com/astral-test/uv-private-pypackage.git@d780faf0ac91257d4d5a4f0c5a0e4509608c0071`
|
|
Caused by: Git operation failed
|
|
Caused by: failed to clone into: [PATH]
|
|
Caused by: failed to fetch branch, tag, or commit `d780faf0ac91257d4d5a4f0c5a0e4509608c0071`
|
|
Caused by: process didn't exit successfully: [GIT_COMMAND_ERROR]
|
|
--- stderr
|
|
Load key "[TEMP_DIR]/fake_deploy_key": [ERROR]
|
|
git@github.com: Permission denied (publickey).
|
|
fatal: Could not read from remote repository.
|
|
|
|
Please make sure you have the correct access rights
|
|
and the repository exists.
|
|
"#);
|
|
|
|
let ssh_deploy_key = context.temp_dir.child("uv_test_key");
|
|
ssh_deploy_key.write_str((decode_token(&[READ_ONLY_GITHUB_SSH_DEPLOY_KEY]) + "\n").as_str())?;
|
|
reduce_ssh_key_file_permissions(&ssh_deploy_key)?;
|
|
|
|
// Use the specified SSH key, and only that key, ignore `~/.ssh/config`, disable host key
|
|
// verification for Windows, don't write the accepted host to the user home.
|
|
let git_ssh_command = format!(
|
|
"ssh -i {} -o IdentitiesOnly=yes -F /dev/null -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null",
|
|
ssh_deploy_key.portable_display()
|
|
);
|
|
|
|
uv_snapshot!(context.filters(), context.export().env(EnvVars::GIT_SSH_COMMAND, git_ssh_command), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
uv-private-pypackage @ git+ssh://git@github.com/astral-test/uv-private-pypackage.git@d780faf0ac91257d4d5a4f0c5a0e4509608c0071
|
|
# via debug
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_https_credentials() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(&formatdoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig @ https://public:heron@pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl"]
|
|
"#})?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// The credentials are for a direct URL, and are included in the export
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
iniconfig @ https://public:heron@pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_non_project_marker() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[tool.uv.workspace]
|
|
members = []
|
|
|
|
[dependency-groups]
|
|
async = ["anyio ; sys_platform == 'darwin'"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 3 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--group").arg("async"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group async
|
|
anyio==4.3.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 ; sys_platform == 'darwin' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 3 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_non_project_workspace() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[dependency-groups]
|
|
async = ["anyio ; sys_platform == 'darwin'"]
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e ./child
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--group").arg("async"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group async
|
|
-e ./child
|
|
anyio==4.3.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
sniffio==1.3.1 ; sys_platform == 'darwin' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_non_project_fork() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[dependency-groups]
|
|
async = ["anyio"]
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==2.0.0 ; sys_platform == 'win32'", "anyio==3.0.0 ; sys_platform == 'linux'"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
let lock = context.read("uv.lock");
|
|
|
|
insta::with_settings!(
|
|
{
|
|
filters => context.filters(),
|
|
},
|
|
{
|
|
insta::assert_snapshot!(
|
|
lock, @r#"
|
|
version = 1
|
|
revision = 3
|
|
requires-python = ">=3.12"
|
|
resolution-markers = [
|
|
"sys_platform == 'win32'",
|
|
"sys_platform == 'linux'",
|
|
"sys_platform != 'linux' and sys_platform != 'win32'",
|
|
]
|
|
|
|
[options]
|
|
exclude-newer = "2024-03-25T00:00:00Z"
|
|
|
|
[manifest]
|
|
members = [
|
|
"child",
|
|
]
|
|
|
|
[manifest.dependency-groups]
|
|
async = [{ name = "anyio" }]
|
|
|
|
[[package]]
|
|
name = "anyio"
|
|
version = "2.0.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'win32'",
|
|
]
|
|
dependencies = [
|
|
{ name = "idna", marker = "sys_platform == 'win32'" },
|
|
{ name = "sniffio", marker = "sys_platform == 'win32'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/fe/dc/daeadb9b34093d3968afcc93946ee567cd6d2b402a96c608cb160f74d737/anyio-2.0.0.tar.gz", hash = "sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826", size = 91291, upload-time = "2020-09-11T09:22:49.334Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/8a/19/10fe682e962efd1610aa41376399fc3f3e002425449b02d0fb04749bb712/anyio-2.0.0-py3-none-any.whl", hash = "sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547", size = 62675, upload-time = "2020-09-11T09:22:48.119Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "anyio"
|
|
version = "3.0.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'linux'",
|
|
"sys_platform != 'linux' and sys_platform != 'win32'",
|
|
]
|
|
dependencies = [
|
|
{ name = "idna", marker = "sys_platform != 'win32'" },
|
|
{ name = "sniffio", marker = "sys_platform != 'win32'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/99/0d/65165f99e5f4f3b4c43a5ed9db0fb7aa655f5a58f290727a30528a87eb45/anyio-3.0.0.tar.gz", hash = "sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9", size = 116952, upload-time = "2021-04-20T14:02:14.75Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/3b/49/ebee263b69fe243bd1fd0a88bc6bb0f7732bf1794ba3273cb446351f9482/anyio-3.0.0-py3-none-any.whl", hash = "sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395", size = 72182, upload-time = "2021-04-20T14:02:13.663Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
source = { editable = "child" }
|
|
dependencies = [
|
|
{ name = "anyio", version = "2.0.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" },
|
|
{ name = "anyio", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux'" },
|
|
]
|
|
|
|
[package.metadata]
|
|
requires-dist = [
|
|
{ name = "anyio", marker = "sys_platform == 'linux'", specifier = "==3.0.0" },
|
|
{ name = "anyio", marker = "sys_platform == 'win32'", specifier = "==2.0.0" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2023-11-25T15:40:54.902Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2024-02-25T23:20:04.057Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
|
]
|
|
"#
|
|
);
|
|
}
|
|
);
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e ./child
|
|
anyio==2.0.0 ; sys_platform == 'win32' \
|
|
--hash=sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547 \
|
|
--hash=sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826
|
|
# via child
|
|
anyio==3.0.0 ; sys_platform == 'linux' \
|
|
--hash=sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9 \
|
|
--hash=sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395
|
|
# via child
|
|
idna==3.6 ; sys_platform == 'linux' or sys_platform == 'win32' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 ; sys_platform == 'linux' or sys_platform == 'win32' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--group").arg("async"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group async
|
|
-e ./child
|
|
anyio==2.0.0 ; sys_platform == 'win32' \
|
|
--hash=sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547 \
|
|
--hash=sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826
|
|
# via child
|
|
anyio==3.0.0 ; sys_platform != 'win32' \
|
|
--hash=sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9 \
|
|
--hash=sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395
|
|
# via child
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--group").arg("async").arg("--prune").arg("child"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group async --prune child
|
|
anyio==2.0.0 ; sys_platform == 'win32' \
|
|
--hash=sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547 \
|
|
--hash=sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826
|
|
anyio==3.0.0 ; sys_platform != 'win32' \
|
|
--hash=sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9 \
|
|
--hash=sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--prune").arg("child"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --prune child
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_relative_path() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let dependency = context.temp_dir.child("dependency");
|
|
dependency.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "dependency"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig>=2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let project = context.temp_dir.child("project");
|
|
project.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["dependency"]
|
|
|
|
[tool.uv.sources]
|
|
dependency = { path = "../dependency" }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().current_dir(&project).assert().success();
|
|
|
|
// Pipe the output to requirements.txt.
|
|
let file = std::fs::File::create(project.child("requirements.txt")).unwrap();
|
|
|
|
uv_snapshot!(context.filters(), context.export().stdout(Stdio::from(file)).current_dir(&project), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
|
Resolved 3 packages in [TIME]
|
|
"###);
|
|
|
|
// Read the file contents.
|
|
let contents = apply_filters(
|
|
fs_err::read_to_string(project.child("requirements.txt")).unwrap(),
|
|
context.filters(),
|
|
);
|
|
insta::assert_snapshot!(contents, @r###"
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
../dependency
|
|
# via project
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via dependency
|
|
"###);
|
|
|
|
// Install the dependencies.
|
|
uv_snapshot!(context.filters(), context.pip_install().arg("--requirement").arg("requirements.txt").current_dir(&project), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Using Python 3.12.[X] environment at: [VENV]/
|
|
Resolved 3 packages in [TIME]
|
|
Prepared 3 packages in [TIME]
|
|
Installed 3 packages in [TIME]
|
|
+ dependency==0.1.0 (from file://[TEMP_DIR]/dependency)
|
|
+ iniconfig==2.0.0
|
|
+ project==0.1.0 (from file://[TEMP_DIR]/project)
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn devrequirements_txt_() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions"]
|
|
|
|
[tool.uv]
|
|
dev-dependencies = ["anyio"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
anyio==4.3.0 \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
warning: The `tool.uv.dev-dependencies` field (used in `pyproject.toml`) is deprecated and will be removed in a future release; use `dependency-groups.dev` instead
|
|
Resolved 5 packages in [TIME]
|
|
");
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-dev"), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-dev
|
|
-e .
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
warning: The `tool.uv.dev-dependencies` field (used in `pyproject.toml`) is deprecated and will be removed in a future release; use `dependency-groups.dev` instead
|
|
Resolved 5 packages in [TIME]
|
|
");
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--only-dev"), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --only-dev
|
|
anyio==4.3.0 \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
warning: The `tool.uv.dev-dependencies` field (used in `pyproject.toml`) is deprecated and will be removed in a future release; use `dependency-groups.dev` instead
|
|
Resolved 5 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_no_hashes() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-hashes"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-hashes
|
|
-e .
|
|
anyio==3.7.0
|
|
# via project
|
|
idna==3.6
|
|
# via anyio
|
|
sniffio==1.3.1
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_output_file() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--output-file").arg("requirements.txt"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --output-file requirements.txt
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
let contents = apply_filters(context.read("requirements.txt"), context.filters());
|
|
insta::assert_snapshot!(contents, @r###"
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --output-file requirements.txt
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_no_emit() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig>=2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Exclude `anyio`.
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-emit-package").arg("anyio"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-emit-package anyio
|
|
-e .
|
|
-e ./child
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
// Exclude `project`.
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-emit-project"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-emit-project
|
|
-e ./child
|
|
# via project
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
// Exclude `child`.
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-emit-project").arg("--package").arg("child"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-emit-project --package child
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
// Exclude the workspace.
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-emit-workspace"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-emit-workspace
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
// Remove the member.
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
// Exclude the workspace.
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-emit-workspace"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-emit-workspace
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_only_emit() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig>=2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--only-emit-workspace"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --only-emit-workspace
|
|
-e .
|
|
-e ./child
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--only-emit-project"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --only-emit-project
|
|
-e .
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--only-emit-package").arg("anyio"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --only-emit-package anyio
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_no_editable() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig>=2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--no-editable"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --no-editable
|
|
.
|
|
./child
|
|
# via project
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via child
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_export_group() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions"]
|
|
|
|
[dependency-groups]
|
|
foo = ["anyio ; sys_platform == 'darwin'"]
|
|
bar = ["iniconfig"]
|
|
dev = ["sniffio"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--only-group").arg("bar"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --only-group bar
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--group").arg("foo"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group foo
|
|
anyio==4.3.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--group").arg("foo").arg("--group").arg("bar"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --group foo --group bar
|
|
anyio==4.3.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-groups"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --all-groups
|
|
anyio==4.3.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-groups").arg("--no-group").arg("bar"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --all-groups --no-group bar
|
|
anyio==4.3.0 ; sys_platform == 'darwin' \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
idna==3.6 ; sys_platform == 'darwin' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--all-groups").arg("--no-group").arg("baz"), @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
error: Group `baz` is not defined in the project's `dependency-groups` table
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_script() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let script = context.temp_dir.child("script.py");
|
|
script.write_str(indoc! {r#"
|
|
# /// script
|
|
# requires-python = ">=3.11"
|
|
# dependencies = [
|
|
# "anyio==2.0.0 ; sys_platform == 'win32'",
|
|
# "anyio==3.0.0 ; sys_platform == 'linux'"
|
|
# ]
|
|
# ///
|
|
"#})?;
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--script").arg(script.path()), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --script [TEMP_DIR]/script.py
|
|
anyio==2.0.0 ; sys_platform == 'win32' \
|
|
--hash=sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547 \
|
|
--hash=sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826
|
|
anyio==3.0.0 ; sys_platform == 'linux' \
|
|
--hash=sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9 \
|
|
--hash=sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395
|
|
idna==3.6 ; sys_platform == 'linux' or sys_platform == 'win32' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 ; sys_platform == 'linux' or sys_platform == 'win32' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
// If the lockfile didn't exist already, it shouldn't be persisted to disk.
|
|
assert!(!context.temp_dir.child("uv.lock").exists());
|
|
|
|
// Explicitly lock the script.
|
|
uv_snapshot!(context.filters(), context.lock().arg("--script").arg(script.path()), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
let lock = context.read("script.py.lock");
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r#"
|
|
version = 1
|
|
revision = 3
|
|
requires-python = ">=3.11"
|
|
resolution-markers = [
|
|
"sys_platform == 'win32'",
|
|
"sys_platform == 'linux'",
|
|
"sys_platform != 'linux' and sys_platform != 'win32'",
|
|
]
|
|
|
|
[options]
|
|
exclude-newer = "2024-03-25T00:00:00Z"
|
|
|
|
[manifest]
|
|
requirements = [
|
|
{ name = "anyio", marker = "sys_platform == 'linux'", specifier = "==3.0.0" },
|
|
{ name = "anyio", marker = "sys_platform == 'win32'", specifier = "==2.0.0" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "anyio"
|
|
version = "2.0.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'win32'",
|
|
]
|
|
dependencies = [
|
|
{ name = "idna", marker = "sys_platform == 'win32'" },
|
|
{ name = "sniffio", marker = "sys_platform == 'win32'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/fe/dc/daeadb9b34093d3968afcc93946ee567cd6d2b402a96c608cb160f74d737/anyio-2.0.0.tar.gz", hash = "sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826", size = 91291, upload-time = "2020-09-11T09:22:49.334Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/8a/19/10fe682e962efd1610aa41376399fc3f3e002425449b02d0fb04749bb712/anyio-2.0.0-py3-none-any.whl", hash = "sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547", size = 62675, upload-time = "2020-09-11T09:22:48.119Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "anyio"
|
|
version = "3.0.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'linux'",
|
|
]
|
|
dependencies = [
|
|
{ name = "idna", marker = "sys_platform == 'linux'" },
|
|
{ name = "sniffio", marker = "sys_platform == 'linux'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/99/0d/65165f99e5f4f3b4c43a5ed9db0fb7aa655f5a58f290727a30528a87eb45/anyio-3.0.0.tar.gz", hash = "sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9", size = 116952, upload-time = "2021-04-20T14:02:14.75Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/3b/49/ebee263b69fe243bd1fd0a88bc6bb0f7732bf1794ba3273cb446351f9482/anyio-3.0.0-py3-none-any.whl", hash = "sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395", size = 72182, upload-time = "2021-04-20T14:02:13.663Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2023-11-25T15:40:54.902Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2024-02-25T23:20:04.057Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
|
]
|
|
"#
|
|
);
|
|
});
|
|
|
|
// Update the dependencies.
|
|
script.write_str(indoc! {r#"
|
|
# /// script
|
|
# requires-python = ">=3.11"
|
|
# dependencies = [
|
|
# "anyio==2.0.0 ; sys_platform == 'win32'",
|
|
# "anyio==3.0.0 ; sys_platform == 'linux'",
|
|
# "iniconfig",
|
|
# ]
|
|
# ///
|
|
"#})?;
|
|
|
|
// `uv tree` should update the lockfile.
|
|
uv_snapshot!(context.filters(), context.export().arg("--script").arg(script.path()), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --script [TEMP_DIR]/script.py
|
|
anyio==2.0.0 ; sys_platform == 'win32' \
|
|
--hash=sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547 \
|
|
--hash=sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826
|
|
anyio==3.0.0 ; sys_platform == 'linux' \
|
|
--hash=sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9 \
|
|
--hash=sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395
|
|
idna==3.6 ; sys_platform == 'linux' or sys_platform == 'win32' \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
sniffio==1.3.1 ; sys_platform == 'linux' or sys_platform == 'win32' \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"###);
|
|
|
|
let lock = context.read("script.py.lock");
|
|
|
|
insta::with_settings!({
|
|
filters => context.filters(),
|
|
}, {
|
|
assert_snapshot!(
|
|
lock, @r#"
|
|
version = 1
|
|
revision = 3
|
|
requires-python = ">=3.11"
|
|
resolution-markers = [
|
|
"sys_platform == 'win32'",
|
|
"sys_platform == 'linux'",
|
|
"sys_platform != 'linux' and sys_platform != 'win32'",
|
|
]
|
|
|
|
[options]
|
|
exclude-newer = "2024-03-25T00:00:00Z"
|
|
|
|
[manifest]
|
|
requirements = [
|
|
{ name = "anyio", marker = "sys_platform == 'linux'", specifier = "==3.0.0" },
|
|
{ name = "anyio", marker = "sys_platform == 'win32'", specifier = "==2.0.0" },
|
|
{ name = "iniconfig" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "anyio"
|
|
version = "2.0.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'win32'",
|
|
]
|
|
dependencies = [
|
|
{ name = "idna", marker = "sys_platform == 'win32'" },
|
|
{ name = "sniffio", marker = "sys_platform == 'win32'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/fe/dc/daeadb9b34093d3968afcc93946ee567cd6d2b402a96c608cb160f74d737/anyio-2.0.0.tar.gz", hash = "sha256:ceca4669ffa3f02bf20ef3d6c2a0c323b16cdc71d1ce0b0bc03c6f1f36054826", size = 91291, upload-time = "2020-09-11T09:22:49.334Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/8a/19/10fe682e962efd1610aa41376399fc3f3e002425449b02d0fb04749bb712/anyio-2.0.0-py3-none-any.whl", hash = "sha256:0b8375c8fc665236cb4d143ea13e849eb9e074d727b1b5c27d88aba44ca8c547", size = 62675, upload-time = "2020-09-11T09:22:48.119Z" },
|
|
]
|
|
|
|
[[package]]
|
|
name = "anyio"
|
|
version = "3.0.0"
|
|
source = { registry = "https://pypi.org/simple" }
|
|
resolution-markers = [
|
|
"sys_platform == 'linux'",
|
|
]
|
|
dependencies = [
|
|
{ name = "idna", marker = "sys_platform == 'linux'" },
|
|
{ name = "sniffio", marker = "sys_platform == 'linux'" },
|
|
]
|
|
sdist = { url = "https://files.pythonhosted.org/packages/99/0d/65165f99e5f4f3b4c43a5ed9db0fb7aa655f5a58f290727a30528a87eb45/anyio-3.0.0.tar.gz", hash = "sha256:b553598332c050af19f7d41f73a7790142f5bc3d5eb8bd82f5e515ec22019bd9", size = 116952, upload-time = "2021-04-20T14:02:14.75Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/3b/49/ebee263b69fe243bd1fd0a88bc6bb0f7732bf1794ba3273cb446351f9482/anyio-3.0.0-py3-none-any.whl", hash = "sha256:e71c3d9d72291d12056c0265d07c6bbedf92332f78573e278aeb116f24f30395", size = 72182, upload-time = "2021-04-20T14:02:13.663Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2023-11-25T15:40:54.902Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f", size = 61567, upload-time = "2023-11-25T15:40:52.604Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2023-01-07T11:08:11.254Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892, upload-time = "2023-01-07T11:08:09.864Z" },
|
|
]
|
|
|
|
[[package]]
|
|
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, upload-time = "2024-02-25T23:20:04.057Z" }
|
|
wheels = [
|
|
{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
|
|
]
|
|
"#
|
|
);
|
|
});
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_conflicts() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig==1.1.1"]
|
|
|
|
[tool.uv]
|
|
conflicts = [
|
|
[
|
|
{ extra = "extra1" },
|
|
{ extra = "extra2" },
|
|
],
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
extra1 = ["sortedcontainers==2.3.0"]
|
|
extra2 = ["sortedcontainers==2.4.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
-e .
|
|
iniconfig==1.1.1 \
|
|
--hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \
|
|
--hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--extra").arg("extra1"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --extra extra1
|
|
-e .
|
|
iniconfig==1.1.1 \
|
|
--hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \
|
|
--hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32
|
|
# via project
|
|
sortedcontainers==2.3.0 \
|
|
--hash=sha256:37257a32add0a3ee490bb170b599e93095eed89a55da91fa9f48753ea12fd73f \
|
|
--hash=sha256:59cc937650cf60d677c16775597c89a960658a09cf7c1a668f86e1e4464b10a1
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--extra").arg("extra2"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --extra extra2
|
|
-e .
|
|
iniconfig==1.1.1 \
|
|
--hash=sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3 \
|
|
--hash=sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32
|
|
# via project
|
|
sortedcontainers==2.4.0 \
|
|
--hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \
|
|
--hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0
|
|
# via project
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--extra").arg("extra1").arg("--extra").arg("extra2"), @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
error: Extras `extra1` and `extra2` are incompatible with the declared conflicts: {`project[extra1]`, `project[extra2]`}
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_simple_conflict_markers() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12.0"
|
|
dependencies = ["anyio"]
|
|
|
|
[project.optional-dependencies]
|
|
cpu = [
|
|
"idna<=1",
|
|
]
|
|
cu124 = [
|
|
"idna<=2",
|
|
]
|
|
|
|
[tool.uv]
|
|
conflicts = [
|
|
[
|
|
{ extra = "cpu" },
|
|
{ extra = "cu124" },
|
|
],
|
|
]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
anyio==1.3.1 \
|
|
--hash=sha256:a46bb2b7743455434afd9adea848a3c4e0b7321aee3e9d08844b11d348d3b5a0 \
|
|
--hash=sha256:f21b4fafeec1b7db81e09a907e44e374a1e39718d782a488fdfcdcf949c8950c
|
|
# via project
|
|
async-generator==1.10 \
|
|
--hash=sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b \
|
|
--hash=sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--extra").arg("cpu"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --extra cpu
|
|
anyio==1.3.1 \
|
|
--hash=sha256:a46bb2b7743455434afd9adea848a3c4e0b7321aee3e9d08844b11d348d3b5a0 \
|
|
--hash=sha256:f21b4fafeec1b7db81e09a907e44e374a1e39718d782a488fdfcdcf949c8950c
|
|
# via project
|
|
async-generator==1.10 \
|
|
--hash=sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b \
|
|
--hash=sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144
|
|
# via anyio
|
|
idna==1.0 \
|
|
--hash=sha256:c31140a69ecae014d65e936e9a45d8a66e2ee29f5abbc656f69c705ad2f1507d
|
|
# via project
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn requirements_txt_complex_conflict_markers() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12.0"
|
|
dependencies = ["torch"]
|
|
|
|
[project.optional-dependencies]
|
|
cpu = [
|
|
"torch>=2.6.0",
|
|
"torchvision>=0.21.0",
|
|
]
|
|
cu124 = [
|
|
"torch>=2.6.0",
|
|
"torchvision>=0.21.0",
|
|
]
|
|
|
|
[tool.uv]
|
|
conflicts = [
|
|
[
|
|
{ extra = "cpu" },
|
|
{ extra = "cu124" },
|
|
],
|
|
]
|
|
|
|
[tool.uv.sources]
|
|
torch = [
|
|
{ index = "pytorch-cpu", extra = "cpu" },
|
|
{ index = "pytorch-cu124", extra = "cu124" },
|
|
]
|
|
torchvision = [
|
|
{ index = "pytorch-cpu", extra = "cpu" },
|
|
{ index = "pytorch-cu124", extra = "cu124" },
|
|
]
|
|
|
|
[[tool.uv.index]]
|
|
name = "pytorch-cpu"
|
|
url = "https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
explicit = true
|
|
|
|
[[tool.uv.index]]
|
|
name = "pytorch-cu124"
|
|
url = "https://astral-sh.github.io/pytorch-mirror/whl/cu124"
|
|
explicit = true
|
|
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
filelock==3.17.0 \
|
|
--hash=sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338 \
|
|
--hash=sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e
|
|
# via torch
|
|
fsspec==2024.12.0 \
|
|
--hash=sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f \
|
|
--hash=sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2
|
|
# via torch
|
|
jinja2==3.1.5 \
|
|
--hash=sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb \
|
|
--hash=sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb
|
|
# via torch
|
|
markupsafe==3.0.2 \
|
|
--hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \
|
|
--hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \
|
|
--hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \
|
|
--hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \
|
|
--hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \
|
|
--hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \
|
|
--hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \
|
|
--hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \
|
|
--hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \
|
|
--hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \
|
|
--hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \
|
|
--hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \
|
|
--hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \
|
|
--hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \
|
|
--hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \
|
|
--hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \
|
|
--hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \
|
|
--hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \
|
|
--hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \
|
|
--hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \
|
|
--hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \
|
|
--hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \
|
|
--hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \
|
|
--hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \
|
|
--hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \
|
|
--hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \
|
|
--hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \
|
|
--hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \
|
|
--hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \
|
|
--hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \
|
|
--hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430
|
|
# via jinja2
|
|
mpmath==1.3.0 \
|
|
--hash=sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f \
|
|
--hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c
|
|
# via sympy
|
|
networkx==3.4.2 \
|
|
--hash=sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1 \
|
|
--hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f
|
|
# via torch
|
|
nvidia-cublas-cu12==12.4.5.8 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3 \
|
|
--hash=sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b \
|
|
--hash=sha256:5a796786da89203a0657eda402bcdcec6180254a8ac22d72213abc42069522dc
|
|
# via
|
|
# nvidia-cudnn-cu12
|
|
# nvidia-cusolver-cu12
|
|
# torch
|
|
nvidia-cuda-cupti-cu12==12.4.127 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:5688d203301ab051449a2b1cb6690fbe90d2b372f411521c86018b950f3d7922 \
|
|
--hash=sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a \
|
|
--hash=sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb
|
|
# via torch
|
|
nvidia-cuda-nvrtc-cu12==12.4.127 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198 \
|
|
--hash=sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338 \
|
|
--hash=sha256:a961b2f1d5f17b14867c619ceb99ef6fcec12e46612711bcec78eb05068a60ec
|
|
# via torch
|
|
nvidia-cuda-runtime-cu12==12.4.127 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:09c2e35f48359752dfa822c09918211844a3d93c100a715d79b59591130c5e1e \
|
|
--hash=sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5 \
|
|
--hash=sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3
|
|
# via torch
|
|
nvidia-cudnn-cu12==9.1.0.70 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f \
|
|
--hash=sha256:6278562929433d68365a07a4a1546c237ba2849852c0d4b2262a486e805b977a
|
|
# via torch
|
|
nvidia-cufft-cu12==11.2.1.3 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399 \
|
|
--hash=sha256:d802f4954291101186078ccbe22fc285a902136f974d369540fd4a5333d1440b \
|
|
--hash=sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9
|
|
# via torch
|
|
nvidia-curand-cu12==10.3.5.147 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9 \
|
|
--hash=sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b \
|
|
--hash=sha256:f307cc191f96efe9e8f05a87096abc20d08845a841889ef78cb06924437f6771
|
|
# via torch
|
|
nvidia-cusolver-cu12==11.6.1.9 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260 \
|
|
--hash=sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e \
|
|
--hash=sha256:e77314c9d7b694fcebc84f58989f3aa4fb4cb442f12ca1a9bde50f5e8f6d1b9c
|
|
# via torch
|
|
nvidia-cusparse-cu12==12.3.1.170 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:9bc90fb087bc7b4c15641521f31c0371e9a612fc2ba12c338d3ae032e6b6797f \
|
|
--hash=sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3 \
|
|
--hash=sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1
|
|
# via
|
|
# nvidia-cusolver-cu12
|
|
# torch
|
|
nvidia-cusparselt-cu12==0.6.2 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:0057c91d230703924c0422feabe4ce768841f9b4b44d28586b6f6d2eb86fbe70 \
|
|
--hash=sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8 \
|
|
--hash=sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9
|
|
# via torch
|
|
nvidia-nccl-cu12==2.21.5 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0
|
|
# via torch
|
|
nvidia-nvjitlink-cu12==12.4.127 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57 \
|
|
--hash=sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83 \
|
|
--hash=sha256:fd9020c501d27d135f983c6d3e244b197a7ccad769e34df53a42e276b0e25fa1
|
|
# via
|
|
# nvidia-cufft-cu12
|
|
# nvidia-cusolver-cu12
|
|
# nvidia-cusparse-cu12
|
|
# torch
|
|
nvidia-nvtx-cu12==12.4.127 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:641dccaaa1139f3ffb0d3164b4b84f9d253397e38246a4f2f36728b48566d485 \
|
|
--hash=sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a \
|
|
--hash=sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3
|
|
# via torch
|
|
setuptools==75.8.0 \
|
|
--hash=sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6 \
|
|
--hash=sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3
|
|
# via torch
|
|
sympy==1.13.1 \
|
|
--hash=sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f \
|
|
--hash=sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8
|
|
# via torch
|
|
torch==2.6.0 \
|
|
--hash=sha256:2bb8987f3bb1ef2675897034402373ddfc8f5ef0e156e2d8cfc47cacafdda4a9 \
|
|
--hash=sha256:4874a73507a300a5d089ceaff616a569e7bb7c613c56f37f63ec3ffac65259cf \
|
|
--hash=sha256:510c73251bee9ba02ae1cb6c9d4ee0907b3ce6020e62784e2d7598e0cfa4d6cc \
|
|
--hash=sha256:7e1448426d0ba3620408218b50aa6ada88aeae34f7a239ba5431f6c8774b1239 \
|
|
--hash=sha256:9a610afe216a85a8b9bc9f8365ed561535c93e804c2a317ef7fabcc5deda0989 \
|
|
--hash=sha256:a0d5e1b9874c1a6c25556840ab8920569a7a4137afa8a63a32cee0bc7d89bd4b \
|
|
--hash=sha256:b789069020c5588c70d5c2158ac0aa23fd24a028f34a8b4fcb8fcb4d7efcf5fb \
|
|
--hash=sha256:ff96f4038f8af9f7ec4231710ed4549da1bdebad95923953a25045dcf6fd87e2
|
|
# via project
|
|
triton==3.2.0 ; platform_machine == 'x86_64' and sys_platform == 'linux' \
|
|
--hash=sha256:8d9b215efc1c26fa7eefb9a157915c92d52e000d2bf83e5f69704047e63f125c \
|
|
--hash=sha256:e5dfa23ba84541d7c0a531dfce76d8bcd19159d50a4a8b14ad01e91734a5c1b0
|
|
# via torch
|
|
typing-extensions==4.12.2 \
|
|
--hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \
|
|
--hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8
|
|
# via torch
|
|
|
|
----- stderr -----
|
|
Resolved 33 packages in [TIME]
|
|
");
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--extra").arg("cpu"), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --extra cpu
|
|
filelock==3.17.0 \
|
|
--hash=sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338 \
|
|
--hash=sha256:ee4e77401ef576ebb38cd7f13b9b28893194acc20a8e68e18730ba9c0e54660e
|
|
# via torch
|
|
fsspec==2024.12.0 \
|
|
--hash=sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f \
|
|
--hash=sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2
|
|
# via torch
|
|
jinja2==3.1.5 \
|
|
--hash=sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb \
|
|
--hash=sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb
|
|
# via torch
|
|
markupsafe==3.0.2 \
|
|
--hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \
|
|
--hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \
|
|
--hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \
|
|
--hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \
|
|
--hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \
|
|
--hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \
|
|
--hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \
|
|
--hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \
|
|
--hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \
|
|
--hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \
|
|
--hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \
|
|
--hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \
|
|
--hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \
|
|
--hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \
|
|
--hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \
|
|
--hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \
|
|
--hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \
|
|
--hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \
|
|
--hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \
|
|
--hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \
|
|
--hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \
|
|
--hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \
|
|
--hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \
|
|
--hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \
|
|
--hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \
|
|
--hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \
|
|
--hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \
|
|
--hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \
|
|
--hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \
|
|
--hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \
|
|
--hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430
|
|
# via jinja2
|
|
mpmath==1.3.0 \
|
|
--hash=sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f \
|
|
--hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c
|
|
# via sympy
|
|
networkx==3.4.2 \
|
|
--hash=sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1 \
|
|
--hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f
|
|
# via torch
|
|
numpy==2.2.2 \
|
|
--hash=sha256:0349b025e15ea9d05c3d63f9657707a4e1d471128a3b1d876c095f328f8ff7f0 \
|
|
--hash=sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2 \
|
|
--hash=sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4 \
|
|
--hash=sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648 \
|
|
--hash=sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be \
|
|
--hash=sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb \
|
|
--hash=sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd \
|
|
--hash=sha256:23ae9f0c2d889b7b2d88a3791f6c09e2ef827c2446f1c4a3e3e76328ee4afd9a \
|
|
--hash=sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84 \
|
|
--hash=sha256:2ffbb1acd69fdf8e89dd60ef6182ca90a743620957afb7066385a7bbe88dc748 \
|
|
--hash=sha256:3074634ea4d6df66be04f6728ee1d173cfded75d002c75fac79503a880bf3825 \
|
|
--hash=sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317 \
|
|
--hash=sha256:4525b88c11906d5ab1b0ec1f290996c0020dd318af8b49acaa46f198b1ffc283 \
|
|
--hash=sha256:463247edcee4a5537841d5350bc87fe8e92d7dd0e8c71c995d2c6eecb8208278 \
|
|
--hash=sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9 \
|
|
--hash=sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de \
|
|
--hash=sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369 \
|
|
--hash=sha256:5acea83b801e98541619af398cc0109ff48016955cc0818f478ee9ef1c5c3dcb \
|
|
--hash=sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49 \
|
|
--hash=sha256:8ec0636d3f7d68520afc6ac2dc4b8341ddb725039de042faf0e311599f54eb37 \
|
|
--hash=sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39 \
|
|
--hash=sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576 \
|
|
--hash=sha256:9dd47ff0cb2a656ad69c38da850df3454da88ee9a6fde0ba79acceee0e79daba \
|
|
--hash=sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7 \
|
|
--hash=sha256:ac9bea18d6d58a995fac1b2cb4488e17eceeac413af014b1dd26170b766d8467 \
|
|
--hash=sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc \
|
|
--hash=sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391 \
|
|
--hash=sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0 \
|
|
--hash=sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369 \
|
|
--hash=sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff \
|
|
--hash=sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f
|
|
# via torchvision
|
|
pillow==11.1.0 \
|
|
--hash=sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65 \
|
|
--hash=sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a \
|
|
--hash=sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352 \
|
|
--hash=sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20 \
|
|
--hash=sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c \
|
|
--hash=sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114 \
|
|
--hash=sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91 \
|
|
--hash=sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5 \
|
|
--hash=sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c \
|
|
--hash=sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756 \
|
|
--hash=sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861 \
|
|
--hash=sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1 \
|
|
--hash=sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a \
|
|
--hash=sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081 \
|
|
--hash=sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5 \
|
|
--hash=sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1 \
|
|
--hash=sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3 \
|
|
--hash=sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f \
|
|
--hash=sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c \
|
|
--hash=sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf \
|
|
--hash=sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b \
|
|
--hash=sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe \
|
|
--hash=sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc \
|
|
--hash=sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec \
|
|
--hash=sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3 \
|
|
--hash=sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0 \
|
|
--hash=sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6 \
|
|
--hash=sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547 \
|
|
--hash=sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9 \
|
|
--hash=sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab \
|
|
--hash=sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9
|
|
# via torchvision
|
|
setuptools==75.8.0 \
|
|
--hash=sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6 \
|
|
--hash=sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3
|
|
# via torch
|
|
sympy==1.13.1 \
|
|
--hash=sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f \
|
|
--hash=sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8
|
|
# via torch
|
|
torch==2.6.0 ; sys_platform == 'darwin'
|
|
# via
|
|
# project
|
|
# torchvision
|
|
torch==2.6.0+cpu ; sys_platform != 'darwin'
|
|
# via
|
|
# project
|
|
# torchvision
|
|
torchvision==0.21.0 ; (python_full_version < '3.14' and platform_machine == 'aarch64' and platform_python_implementation == 'CPython' and sys_platform == 'linux') or sys_platform == 'darwin'
|
|
# via project
|
|
torchvision==0.21.0+cpu ; (python_full_version >= '3.14' and sys_platform == 'linux') or (platform_machine != 'aarch64' and sys_platform == 'linux') or (platform_python_implementation != 'CPython' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')
|
|
# via project
|
|
typing-extensions==4.12.2 \
|
|
--hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \
|
|
--hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8
|
|
# via torch
|
|
|
|
----- stderr -----
|
|
Resolved 33 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Export requirements in the presence of a cycle.
|
|
#[test]
|
|
fn requirements_txt_cyclic_dependencies() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"testtools==2.3.0",
|
|
"fixtures==3.0.0",
|
|
]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
argparse==1.4.0 \
|
|
--hash=sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4 \
|
|
--hash=sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314
|
|
# via unittest2
|
|
extras==1.0.0 \
|
|
--hash=sha256:132e36de10b9c91d5d4cc620160a476e0468a88f16c9431817a6729611a81b4e \
|
|
--hash=sha256:f689f08df47e2decf76aa6208c081306e7bd472630eb1ec8a875c67de2366e87
|
|
# via testtools
|
|
fixtures==3.0.0 \
|
|
--hash=sha256:2a551b0421101de112d9497fb5f6fd25e5019391c0fbec9bad591ecae981420d \
|
|
--hash=sha256:fcf0d60234f1544da717a9738325812de1f42c2fa085e2d9252d8fff5712b2ef
|
|
# via
|
|
# project
|
|
# testtools
|
|
linecache2==1.0.0 \
|
|
--hash=sha256:4b26ff4e7110db76eeb6f5a7b64a82623839d595c2038eeda662f2a2db78e97c \
|
|
--hash=sha256:e78be9c0a0dfcbac712fe04fbf92b96cddae80b1b842f24248214c8496f006ef
|
|
# via traceback2
|
|
pbr==6.0.0 \
|
|
--hash=sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda \
|
|
--hash=sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9
|
|
# via
|
|
# fixtures
|
|
# testtools
|
|
python-mimeparse==1.6.0 \
|
|
--hash=sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78 \
|
|
--hash=sha256:a295f03ff20341491bfe4717a39cd0a8cc9afad619ba44b77e86b0ab8a2b8282
|
|
# via testtools
|
|
six==1.16.0 \
|
|
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
|
|
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
|
|
# via
|
|
# fixtures
|
|
# testtools
|
|
# unittest2
|
|
testtools==2.3.0 \
|
|
--hash=sha256:5827ec6cf8233e0f29f51025addd713ca010061204fdea77484a2934690a0559 \
|
|
--hash=sha256:a2be448869171b6e0f26d9544088b8b98439ec180ce272040236d570a40bcbed
|
|
# via
|
|
# fixtures
|
|
# project
|
|
traceback2==1.4.0 \
|
|
--hash=sha256:05acc67a09980c2ecfedd3423f7ae0104839eccb55fc645773e1caa0951c3030 \
|
|
--hash=sha256:8253cebec4b19094d67cc5ed5af99bf1dba1285292226e98a31929f87a5d6b23
|
|
# via
|
|
# testtools
|
|
# unittest2
|
|
unittest2==1.1.0 \
|
|
--hash=sha256:13f77d0875db6d9b435e1d4f41e74ad4cc2eb6e1d5c824996092b3430f088bb8 \
|
|
--hash=sha256:22882a0e418c284e1f718a822b3b022944d53d2d908e1690b319a9d3eb2c0579
|
|
# via testtools
|
|
|
|
----- stderr -----
|
|
Resolved 11 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Export requirements in the presence of a cycle, with conflicts enabled.
|
|
#[test]
|
|
fn requirements_txt_cyclic_dependencies_conflict() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"testtools==2.3.0",
|
|
"fixtures==3.0.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
cpu = ["anyio==3.0.0"]
|
|
gpu = ["anyio==4.0.0"]
|
|
|
|
[tool.uv]
|
|
package = false
|
|
conflicts = [
|
|
[
|
|
{ extra = "cpu" },
|
|
{ extra = "gpu" },
|
|
],
|
|
]
|
|
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export(), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
argparse==1.4.0 \
|
|
--hash=sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4 \
|
|
--hash=sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314
|
|
# via unittest2
|
|
extras==1.0.0 \
|
|
--hash=sha256:132e36de10b9c91d5d4cc620160a476e0468a88f16c9431817a6729611a81b4e \
|
|
--hash=sha256:f689f08df47e2decf76aa6208c081306e7bd472630eb1ec8a875c67de2366e87
|
|
# via testtools
|
|
fixtures==3.0.0 \
|
|
--hash=sha256:2a551b0421101de112d9497fb5f6fd25e5019391c0fbec9bad591ecae981420d \
|
|
--hash=sha256:fcf0d60234f1544da717a9738325812de1f42c2fa085e2d9252d8fff5712b2ef
|
|
# via
|
|
# project
|
|
# testtools
|
|
linecache2==1.0.0 \
|
|
--hash=sha256:4b26ff4e7110db76eeb6f5a7b64a82623839d595c2038eeda662f2a2db78e97c \
|
|
--hash=sha256:e78be9c0a0dfcbac712fe04fbf92b96cddae80b1b842f24248214c8496f006ef
|
|
# via traceback2
|
|
pbr==6.0.0 \
|
|
--hash=sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda \
|
|
--hash=sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9
|
|
# via
|
|
# fixtures
|
|
# testtools
|
|
python-mimeparse==1.6.0 \
|
|
--hash=sha256:76e4b03d700a641fd7761d3cd4fdbbdcd787eade1ebfac43f877016328334f78 \
|
|
--hash=sha256:a295f03ff20341491bfe4717a39cd0a8cc9afad619ba44b77e86b0ab8a2b8282
|
|
# via testtools
|
|
six==1.16.0 \
|
|
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
|
|
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
|
|
# via
|
|
# fixtures
|
|
# testtools
|
|
# unittest2
|
|
testtools==2.3.0 \
|
|
--hash=sha256:5827ec6cf8233e0f29f51025addd713ca010061204fdea77484a2934690a0559 \
|
|
--hash=sha256:a2be448869171b6e0f26d9544088b8b98439ec180ce272040236d570a40bcbed
|
|
# via
|
|
# fixtures
|
|
# project
|
|
traceback2==1.4.0 \
|
|
--hash=sha256:05acc67a09980c2ecfedd3423f7ae0104839eccb55fc645773e1caa0951c3030 \
|
|
--hash=sha256:8253cebec4b19094d67cc5ed5af99bf1dba1285292226e98a31929f87a5d6b23
|
|
# via
|
|
# testtools
|
|
# unittest2
|
|
unittest2==1.1.0 \
|
|
--hash=sha256:13f77d0875db6d9b435e1d4f41e74ad4cc2eb6e1d5c824996092b3430f088bb8 \
|
|
--hash=sha256:22882a0e418c284e1f718a822b3b022944d53d2d908e1690b319a9d3eb2c0579
|
|
# via testtools
|
|
|
|
----- stderr -----
|
|
Resolved 15 packages in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_dependency() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_export_no_header() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("--no-header"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_export_no_editable() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("--no-editable"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml --no-editable
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = "." }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_dependency_extra() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["flask[dotenv]"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "blinker"
|
|
version = "1.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a1/13/6df5fc090ff4e5d246baf1f45fe9e5623aa8565757dfa5bd243f6a545f9e/blinker-1.7.0.tar.gz", upload-time = 2023-11-01T22:06:01Z, size = 28134, hashes = { sha256 = "e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl", upload-time = 2023-11-01T22:06:00Z, size = 13068, hashes = { sha256 = "c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9" } }]
|
|
|
|
[[packages]]
|
|
name = "click"
|
|
version = "8.1.7"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", upload-time = 2023-08-17T17:29:11Z, size = 336121, hashes = { sha256 = "ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", upload-time = 2023-08-17T17:29:10Z, size = 97941, hashes = { sha256 = "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28" } }]
|
|
|
|
[[packages]]
|
|
name = "colorama"
|
|
version = "0.4.6"
|
|
marker = "sys_platform == 'win32'"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", upload-time = 2022-10-25T02:36:22Z, size = 27697, hashes = { sha256 = "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", upload-time = 2022-10-25T02:36:20Z, size = 25335, hashes = { sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" } }]
|
|
|
|
[[packages]]
|
|
name = "flask"
|
|
version = "3.0.2"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/3f/e0/a89e8120faea1edbfca1a9b171cff7f2bf62ec860bbafcb2c2387c0317be/flask-3.0.2.tar.gz", upload-time = 2024-02-03T21:11:44Z, size = 675248, hashes = { sha256 = "822c03f4b799204250a7ee84b1eddc40665395333973dfb9deebfe425fefcb7d" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce224fb4f766acb23/flask-3.0.2-py3-none-any.whl", upload-time = 2024-02-03T21:11:42Z, size = 101300, hashes = { sha256 = "3232e0e9c850d781933cf0207523d1ece087eb8d87b23777ae38456e2fbe7c6e" } }]
|
|
|
|
[[packages]]
|
|
name = "itsdangerous"
|
|
version = "2.1.2"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/7f/a1/d3fb83e7a61fa0c0d3d08ad0a94ddbeff3731c05212617dff3a94e097f08/itsdangerous-2.1.2.tar.gz", upload-time = 2022-03-24T15:12:15Z, size = 56143, hashes = { sha256 = "5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl", upload-time = 2022-03-24T15:12:13Z, size = 15749, hashes = { sha256 = "2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44" } }]
|
|
|
|
[[packages]]
|
|
name = "jinja2"
|
|
version = "3.1.3"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/b2/5e/3a21abf3cd467d7876045335e681d276ac32492febe6d98ad89562d1a7e1/Jinja2-3.1.3.tar.gz", upload-time = 2024-01-10T23:12:21Z, size = 268261, hashes = { sha256 = "ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" } }
|
|
wheels = [{ name = "jinja2-3.1.3-py3-none-any.whl", url = "https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl", upload-time = 2024-01-10T23:12:19Z, size = 133236, hashes = { sha256 = "7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa" } }]
|
|
|
|
[[packages]]
|
|
name = "markupsafe"
|
|
version = "2.1.5"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz", upload-time = 2024-02-02T16:31:22Z, size = 19384, hashes = { sha256 = "d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b" } }
|
|
wheels = [
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", url = "https://files.pythonhosted.org/packages/53/bd/583bf3e4c8d6a321938c13f49d44024dbe5ed63e0a7ba127e454a66da974/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", upload-time = 2024-02-02T16:30:33Z, size = 18215, hashes = { sha256 = "8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", url = "https://files.pythonhosted.org/packages/48/d6/e7cd795fc710292c3af3a06d80868ce4b02bfbbf370b7cee11d282815a2a/MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", upload-time = 2024-02-02T16:30:34Z, size = 14069, hashes = { sha256 = "3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", url = "https://files.pythonhosted.org/packages/51/b5/5d8ec796e2a08fc814a2c7d2584b55f889a55cf17dd1a90f2beb70744e5c/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", upload-time = 2024-02-02T16:30:35Z, size = 29452, hashes = { sha256 = "ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", url = "https://files.pythonhosted.org/packages/0a/0d/2454f072fae3b5a137c119abf15465d1771319dfe9e4acbb31722a0fff91/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", upload-time = 2024-02-02T16:30:36Z, size = 28462, hashes = { sha256 = "f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", url = "https://files.pythonhosted.org/packages/2d/75/fd6cb2e68780f72d47e6671840ca517bda5ef663d30ada7616b0462ad1e3/MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", upload-time = 2024-02-02T16:30:37Z, size = 27869, hashes = { sha256 = "ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", url = "https://files.pythonhosted.org/packages/b0/81/147c477391c2750e8fc7705829f7351cf1cd3be64406edcf900dc633feb2/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", upload-time = 2024-02-02T16:30:39Z, size = 33906, hashes = { sha256 = "d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", url = "https://files.pythonhosted.org/packages/8b/ff/9a52b71839d7a256b563e85d11050e307121000dcebc97df120176b3ad93/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", upload-time = 2024-02-02T16:30:40Z, size = 32296, hashes = { sha256 = "bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", url = "https://files.pythonhosted.org/packages/88/07/2dc76aa51b481eb96a4c3198894f38b480490e834479611a4053fbf08623/MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", upload-time = 2024-02-02T16:30:42Z, size = 33038, hashes = { sha256 = "58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-win32.whl", url = "https://files.pythonhosted.org/packages/96/0c/620c1fb3661858c0e37eb3cbffd8c6f732a67cd97296f725789679801b31/MarkupSafe-2.1.5-cp312-cp312-win32.whl", upload-time = 2024-02-02T16:30:43Z, size = 16572, hashes = { sha256 = "8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad" } },
|
|
{ name = "markupsafe-2.1.5-cp312-cp312-win_amd64.whl", url = "https://files.pythonhosted.org/packages/3f/14/c3554d512d5f9100a95e737502f4a2323a1959f6d0d01e0d0997b35f7b10/MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", upload-time = 2024-02-02T16:30:44Z, size = 17127, hashes = { sha256 = "823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb" } },
|
|
]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "python-dotenv"
|
|
version = "1.0.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", upload-time = 2024-01-23T06:33:00Z, size = 39115, hashes = { sha256 = "e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", upload-time = 2024-01-23T06:32:58Z, size = 19863, hashes = { sha256 = "f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" } }]
|
|
|
|
[[packages]]
|
|
name = "werkzeug"
|
|
version = "3.0.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/0d/cc/ff1904eb5eb4b455e442834dabf9427331ac0fa02853bf83db817a7dd53d/werkzeug-3.0.1.tar.gz", upload-time = 2023-10-24T20:57:50Z, size = 801436, hashes = { sha256 = "507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl", upload-time = 2023-10-24T20:57:47Z, size = 226669, hashes = { sha256 = "90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 10 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_project_extra() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions"]
|
|
|
|
[project.optional-dependencies]
|
|
async = ["anyio==3.7.0"]
|
|
pytest = ["iniconfig"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "typing-extensions"
|
|
version = "4.10.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", upload-time = 2024-02-25T22:12:49Z, size = 77558, hashes = { sha256 = "b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", upload-time = 2024-02-25T22:12:47Z, size = 33926, hashes = { sha256 = "69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"#);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("--extra").arg("pytest").arg("--extra").arg("async").arg("--no-extra").arg("pytest"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml --extra pytest --extra async --no-extra pytest
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
[[packages]]
|
|
name = "typing-extensions"
|
|
version = "4.10.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", upload-time = 2024-02-25T22:12:49Z, size = 77558, hashes = { sha256 = "b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", upload-time = 2024-02-25T22:12:47Z, size = 33926, hashes = { sha256 = "69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"#);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("--extra").arg("pytest"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml --extra pytest
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "iniconfig"
|
|
version = "2.0.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", upload-time = 2023-01-07T11:08:11Z, size = 4646, hashes = { sha256 = "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", upload-time = 2023-01-07T11:08:09Z, size = 5892, hashes = { sha256 = "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "typing-extensions"
|
|
version = "4.10.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", upload-time = 2024-02-25T22:12:49Z, size = 77558, hashes = { sha256 = "b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", upload-time = 2024-02-25T22:12:47Z, size = 33926, hashes = { sha256 = "69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"#);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("--all-extras"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml --all-extras
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "iniconfig"
|
|
version = "2.0.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", upload-time = 2023-01-07T11:08:11Z, size = 4646, hashes = { sha256 = "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", upload-time = 2023-01-07T11:08:09Z, size = 5892, hashes = { sha256 = "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
[[packages]]
|
|
name = "typing-extensions"
|
|
version = "4.10.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", upload-time = 2024-02-25T22:12:49Z, size = 77558, hashes = { sha256 = "b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", upload-time = 2024-02-25T22:12:47Z, size = 33926, hashes = { sha256 = "69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"#);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("--all-extras").arg("--no-extra").arg("pytest"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml --all-extras --no-extra pytest
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
[[packages]]
|
|
name = "typing-extensions"
|
|
version = "4.10.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/16/3a/0d26ce356c7465a19c9ea8814b960f8a36c3b0d07c323176620b7b483e44/typing_extensions-4.10.0.tar.gz", upload-time = 2024-02-25T22:12:49Z, size = 77558, hashes = { sha256 = "b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/f9/de/dc04a3ea60b22624b51c703a84bbe0184abcd1d0b9bc8074b5d6b7ab90bb/typing_extensions-4.10.0-py3-none-any.whl", upload-time = 2024-02-25T22:12:47Z, size = 33926, hashes = { sha256 = "69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_git_dependency() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["uv-public-pypackage"]
|
|
|
|
[tool.uv.sources]
|
|
uv-public-pypackage = { git = "git+https://github.com/astral-test/uv-public-pypackage" }
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "uv-public-pypackage"
|
|
version = "0.1.0"
|
|
vcs = { type = "git", url = "https://github.com/astral-test/uv-public-pypackage", commit-id = "b270df1a2fb5d012294e9aaf05e7e0bab1e6a389" }
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_wheel_url() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio @ https://files.pythonhosted.org/packages/14/fd/2f20c40b45e4fb4324834aea24bd4afdf1143390242c0b33774da0e2e34f/anyio-4.3.0-py3-none-any.whl"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "4.3.0"
|
|
archive = { url = "https://files.pythonhosted.org/packages/14/fd/2f20c40b45e4fb4324834aea24bd4afdf1143390242c0b33774da0e2e34f/anyio-4.3.0-py3-none-any.whl", hashes = { sha256 = "048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8" } }
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_sdist_url() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio @ https://files.pythonhosted.org/packages/db/4d/3970183622f0330d3c23d9b8a5f52e365e50381fd484d08e3285104333d3/anyio-4.3.0.tar.gz"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "4.3.0"
|
|
archive = { url = "https://files.pythonhosted.org/packages/db/4d/3970183622f0330d3c23d9b8a5f52e365e50381fd484d08e3285104333d3/anyio-4.3.0.tar.gz", hashes = { sha256 = "f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" } }
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_sdist_url_subdirectory() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["root"]
|
|
|
|
[tool.uv.sources]
|
|
root = { url = "https://github.com/user-attachments/files/18216295/subdirectory-test.tar.gz", subdirectory = "packages/root" }
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "4.3.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/db/4d/3970183622f0330d3c23d9b8a5f52e365e50381fd484d08e3285104333d3/anyio-4.3.0.tar.gz", upload-time = 2024-02-19T08:36:28Z, size = 159642, hashes = { sha256 = "f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/14/fd/2f20c40b45e4fb4324834aea24bd4afdf1143390242c0b33774da0e2e34f/anyio-4.3.0-py3-none-any.whl", upload-time = 2024-02-19T08:36:26Z, size = 85584, hashes = { sha256 = "048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "root"
|
|
version = "0.0.1"
|
|
archive = { url = "https://github.com/user-attachments/files/18216295/subdirectory-test.tar.gz#subdirectory=packages/root", subdirectory = "packages/root", hashes = { sha256 = "24b55efee28d08ad3cdc58903e359e820601baa6a4a4b3424311541ebcfb09d3" } }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_infer_output_format() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("-o").arg("requirements.txt"), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] -o requirements.txt
|
|
-e .
|
|
anyio==3.7.0 \
|
|
--hash=sha256:275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce \
|
|
--hash=sha256:eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0
|
|
# via project
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
");
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("-o").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] -o pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"#);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("-o").arg("pylock.dev.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] -o pylock.dev.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "anyio"
|
|
version = "3.7.0"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/c6/b3/fefbf7e78ab3b805dec67d698dc18dd505af7a18a8dd08868c9b4fa736b5/anyio-3.7.0.tar.gz", upload-time = 2023-05-27T11:12:46Z, size = 142737, hashes = { sha256 = "275d9973793619a5374e1c89a4f4ad3f4b0a5510a2b5b939444bee8f4c4d37ce" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/68/fe/7ce1926952c8a403b35029e194555558514b365ad77d75125f521a2bec62/anyio-3.7.0-py3-none-any.whl", upload-time = 2023-05-27T11:12:44Z, size = 80873, hashes = { sha256 = "eddca883c4175f14df8aedce21054bfca3adb70ffe76a9f607aef9d7fa2ea7f0" } }]
|
|
|
|
[[packages]]
|
|
name = "idna"
|
|
version = "3.6"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/bf/3f/ea4b9117521a1e9c50344b909be7886dd00a519552724809bb1f486986c2/idna-3.6.tar.gz", upload-time = 2023-11-25T15:40:54Z, size = 175426, hashes = { sha256 = "9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl", upload-time = 2023-11-25T15:40:52Z, size = 61567, hashes = { sha256 = "c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" } }]
|
|
|
|
[[packages]]
|
|
name = "project"
|
|
directory = { path = ".", editable = true }
|
|
|
|
[[packages]]
|
|
name = "sniffio"
|
|
version = "1.3.1"
|
|
index = "https://pypi.org/simple"
|
|
sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", upload-time = 2024-02-25T23:20:04Z, size = 20372, hashes = { sha256 = "f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } }
|
|
wheels = [{ url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", upload-time = 2024-02-25T23:20:01Z, size = 10235, hashes = { sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" } }]
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
"#);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("-o").arg("pyproject.toml"), @r"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
error: `pyproject.toml` is not a supported output format for `uv export` (supported formats: requirements.txt, pylock.toml, cyclonedx1.5)
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_filename() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio==3.7.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("-o").arg("test.toml"), @r"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
error: Expected the output filename to start with `pylock.` and end with `.toml` (e.g., `pylock.toml`, `pylock.dev.toml`); `test.toml` won't be recognized as a `pylock.toml` file in subsequent commands
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(feature = "git")]
|
|
#[test]
|
|
fn pep_751_https_git_credentials() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
let token = decode_token(READ_ONLY_GITHUB_TOKEN);
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(&formatdoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["uv-private-pypackage @ git+https://{token}@github.com/astral-test/uv-private-pypackage"]
|
|
"#})?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// The token should not be included in the export
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "uv-private-pypackage"
|
|
version = "0.1.0"
|
|
vcs = { type = "git", url = "https://github.com/astral-test/uv-private-pypackage", commit-id = "d780faf0ac91257d4d5a4f0c5a0e4509608c0071" }
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn pep_751_https_credentials() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(&formatdoc! {r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig @ https://public:heron@pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl"]
|
|
"#})?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// The credentials are for a direct URL, and are included in the export
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --format pylock.toml
|
|
lock-version = "1.0"
|
|
created-by = "uv"
|
|
requires-python = ">=3.12"
|
|
|
|
[[packages]]
|
|
name = "iniconfig"
|
|
version = "2.0.0"
|
|
archive = { url = "https://public:heron@pypi-proxy.fly.dev/basic-auth/files/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hashes = { sha256 = "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" } }
|
|
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Support `UV_NO_EDITABLE=1 uv export`.
|
|
///
|
|
/// <https://github.com/astral-sh/uv/issues/15103>
|
|
#[test]
|
|
fn no_editable_env_var() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
context
|
|
.init()
|
|
.arg("--lib")
|
|
.arg("--name")
|
|
.arg("project")
|
|
.arg(".")
|
|
.assert()
|
|
.success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().env(EnvVars::UV_NO_EDITABLE, "1"), @r"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR]
|
|
.
|
|
|
|
----- stderr -----
|
|
Resolved 1 package in [TIME]
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn export_only_group_and_extra_conflict() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
|
|
[project.optional-dependencies]
|
|
test = ["pytest"]
|
|
|
|
[dependency-groups]
|
|
dev = ["ruff"]
|
|
"#,
|
|
)?;
|
|
|
|
// Using --only-group and --extra together should error.
|
|
uv_snapshot!(context.filters(), context.export().arg("--only-group").arg("dev").arg("--extra").arg("test"), @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: the argument '--only-group <ONLY_GROUP>' cannot be used with '--extra <EXTRA>'
|
|
|
|
Usage: uv export --cache-dir [CACHE_DIR] --only-group <ONLY_GROUP> --exclude-newer <EXCLUDE_NEWER>
|
|
|
|
For more information, try '--help'.
|
|
"###);
|
|
|
|
// Using --only-group and --all-extras together should also error.
|
|
uv_snapshot!(context.filters(), context.export().arg("--only-group").arg("dev").arg("--all-extras"), @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: the argument '--only-group <ONLY_GROUP>' cannot be used with '--all-extras'
|
|
|
|
Usage: uv export --cache-dir [CACHE_DIR] --only-group <ONLY_GROUP> --exclude-newer <EXCLUDE_NEWER>
|
|
|
|
For more information, try '--help'.
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// The members in the workspace (`foo`) and in the lockfile (`bar`) mismatch.
|
|
#[test]
|
|
fn export_lock_workspace_mismatch_with_frozen() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
"#,
|
|
)?;
|
|
|
|
let pyproject_toml = context.temp_dir.child("uv.lock");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
version = 1
|
|
revision = 3
|
|
requires-python = ">=3.12"
|
|
|
|
[[package]]
|
|
name = "bar"
|
|
version = "0.1.0"
|
|
source = { virtual = "." }
|
|
dependencies = []
|
|
"#,
|
|
)?;
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--frozen"), @r"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: The lockfile at `uv.lock` needs to be updated, but `--frozen` was provided: Missing workspace member `foo`. To update the lockfile, run `uv lock`.
|
|
");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Export multiple packages within a workspace.
|
|
#[test]
|
|
fn multiple_packages() -> Result<()> {
|
|
let context = TestContext::new("3.12");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "root"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["foo", "bar", "baz"]
|
|
|
|
[tool.uv.sources]
|
|
foo = { workspace = true }
|
|
bar = { workspace = true }
|
|
baz = { workspace = true }
|
|
|
|
[tool.uv.workspace]
|
|
members = ["packages/*"]
|
|
"#,
|
|
)?;
|
|
|
|
context
|
|
.temp_dir
|
|
.child("packages")
|
|
.child("foo")
|
|
.child("pyproject.toml")
|
|
.write_str(
|
|
r#"
|
|
[project]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["anyio"]
|
|
"#,
|
|
)?;
|
|
|
|
context
|
|
.temp_dir
|
|
.child("packages")
|
|
.child("bar")
|
|
.child("pyproject.toml")
|
|
.write_str(
|
|
r#"
|
|
[project]
|
|
name = "bar"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions"]
|
|
"#,
|
|
)?;
|
|
|
|
context
|
|
.temp_dir
|
|
.child("packages")
|
|
.child("baz")
|
|
.child("pyproject.toml")
|
|
.write_str(
|
|
r#"
|
|
[project]
|
|
name = "baz"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Export `foo` and `bar`.
|
|
uv_snapshot!(context.filters(), context.export()
|
|
.arg("--package").arg("foo")
|
|
.arg("--package").arg("bar"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --package foo --package bar
|
|
-e ./packages/bar
|
|
-e ./packages/foo
|
|
anyio==4.3.0 \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
# via foo
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via bar
|
|
|
|
----- stderr -----
|
|
Resolved 9 packages in [TIME]
|
|
"###);
|
|
|
|
// Export `foo`, `bar`, and `baz`.
|
|
uv_snapshot!(context.filters(), context.export()
|
|
.arg("--package").arg("foo")
|
|
.arg("--package").arg("bar")
|
|
.arg("--package").arg("baz"), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
# This file was autogenerated by uv via the following command:
|
|
# uv export --cache-dir [CACHE_DIR] --package foo --package bar --package baz
|
|
-e ./packages/bar
|
|
-e ./packages/baz
|
|
-e ./packages/foo
|
|
anyio==4.3.0 \
|
|
--hash=sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8 \
|
|
--hash=sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6
|
|
# via foo
|
|
idna==3.6 \
|
|
--hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \
|
|
--hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f
|
|
# via anyio
|
|
iniconfig==2.0.0 \
|
|
--hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \
|
|
--hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374
|
|
# via baz
|
|
sniffio==1.3.1 \
|
|
--hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 \
|
|
--hash=sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc
|
|
# via anyio
|
|
typing-extensions==4.10.0 \
|
|
--hash=sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475 \
|
|
--hash=sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb
|
|
# via bar
|
|
|
|
----- stderr -----
|
|
Resolved 9 packages in [TIME]
|
|
"###);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_basic() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["urllib3==2.2.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-2@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"urllib3-2@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "urllib3-2@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_direct_url() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["idna @ https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "idna-2@3.6",
|
|
"name": "idna",
|
|
"version": "3.6",
|
|
"purl": "pkg:pypi/idna@3.6?download_url=https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "idna-2@3.6",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"idna-2@3.6"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(feature = "git")]
|
|
#[test]
|
|
fn cyclonedx_export_git_dependency() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["urllib3 @ git+https://github.com/urllib3/urllib3.git@2.2.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-2@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0?vcs_url=https://github.com/urllib3/urllib3.git%3Frev%3D2.2.0%2304df048cf4b1c3790c56e26c659db764aad62d6f"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"urllib3-2@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "urllib3-2@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 2 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_no_dependencies() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "standalone-project"
|
|
version = "1.0.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = []
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "standalone-project-1@1.0.0",
|
|
"name": "standalone-project",
|
|
"version": "1.0.0"
|
|
}
|
|
},
|
|
"components": [],
|
|
"dependencies": [
|
|
{
|
|
"ref": "standalone-project-1@1.0.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 1 package in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[cfg(feature = "git")]
|
|
#[test]
|
|
fn cyclonedx_export_mixed_source_types() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "mixed-project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"iniconfig==2.0.0", # PyPI registry package
|
|
"urllib3 @ git+https://github.com/urllib3/urllib3.git@2.2.0", # Git package
|
|
"idna @ https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl" # Direct URL package
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "mixed-project-1@0.1.0",
|
|
"name": "mixed-project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "idna-2@3.6",
|
|
"name": "idna",
|
|
"version": "3.6",
|
|
"purl": "pkg:pypi/idna@3.6?download_url=https://files.pythonhosted.org/packages/c2/e7/a82b05cf63a603df6e68d59ae6a68bf5064484a0718ea5033660af4b54a9/idna-3.6-py3-none-any.whl"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-3@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-4@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0?vcs_url=https://github.com/urllib3/urllib3.git%3Frev%3D2.2.0%2304df048cf4b1c3790c56e26c659db764aad62d6f"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "idna-2@3.6",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "iniconfig-3@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "mixed-project-1@0.1.0",
|
|
"dependsOn": [
|
|
"idna-2@3.6",
|
|
"iniconfig-3@2.0.0",
|
|
"urllib3-4@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "urllib3-4@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_project_extra() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions==4.10.0"]
|
|
|
|
[project.optional-dependencies]
|
|
url = ["urllib3==2.2.0"]
|
|
pytest = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-2@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"typing-extensions-2@4.10.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "typing-extensions-2@4.10.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_project_extra_with_optional_flag() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions==4.10.0"]
|
|
|
|
[project.optional-dependencies]
|
|
url = ["urllib3==2.2.0"]
|
|
pytest = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--all-extras"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-2@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-3@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-4@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "iniconfig-2@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-2@2.0.0",
|
|
"typing-extensions-3@4.10.0",
|
|
"urllib3-4@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "typing-extensions-3@4.10.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "urllib3-4@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_with_workspace_member() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["urllib3==2.2.0", "child1", "child2"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child1", "packages/*"]
|
|
|
|
[tool.uv.sources]
|
|
child1 = { workspace = true }
|
|
child2 = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child1 = context.temp_dir.child("child1");
|
|
child1.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child2 = context.temp_dir.child("packages").child("child2");
|
|
child2.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child2"
|
|
version = "0.2.9"
|
|
requires-python = ">=3.11"
|
|
dependencies = []
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--all-extras"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child1-2@0.1.0",
|
|
"name": "child1",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child1"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child2-3@0.2.9",
|
|
"name": "child2",
|
|
"version": "0.2.9",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "packages/child2"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-4@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-5@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child1-2@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-4@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "child2-3@0.2.9",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "iniconfig-4@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"child1-2@0.1.0",
|
|
"child2-3@0.2.9",
|
|
"urllib3-5@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "urllib3-5@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_workspace_non_root() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["urllib3==2.2.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--package").arg("child"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "child-1@0.1.0",
|
|
"name": "child",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-2@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child-1@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-2@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-2@2.0.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_workspace_with_extras() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["child"]
|
|
|
|
[project.optional-dependencies]
|
|
url = ["urllib3==2.2.0"]
|
|
test = ["iniconfig==2.0.0"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions==4.10.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child-2@0.1.0",
|
|
"name": "child",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-3@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child-2@0.1.0",
|
|
"dependsOn": [
|
|
"typing-extensions-3@4.10.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"child-2@0.1.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "typing-extensions-3@4.10.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--all-extras"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child-2@0.1.0",
|
|
"name": "child",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-3@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-4@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-5@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child-2@0.1.0",
|
|
"dependsOn": [
|
|
"typing-extensions-4@4.10.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-3@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"child-2@0.1.0",
|
|
"iniconfig-3@2.0.0",
|
|
"urllib3-5@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "typing-extensions-4@4.10.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "urllib3-5@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_workspace_frozen() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["urllib3==2.2.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Remove the child `pyproject.toml`.
|
|
fs_err::remove_dir_all(child.path())?;
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--all-packages"), @r"
|
|
success: false
|
|
exit_code: 1
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
error: Failed to build `project @ file://[TEMP_DIR]/`
|
|
Caused by: Failed to parse entry: `child`
|
|
Caused by: `child` references a workspace in `tool.uv.sources` (e.g., `child = { workspace = true }`), but is not a workspace member
|
|
");
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--all-packages").arg("--frozen"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-5",
|
|
"name": "project"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child-2@0.1.0",
|
|
"name": "child",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-3@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-4@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child-2@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-3@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-3@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"child-2@0.1.0",
|
|
"urllib3-4@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "urllib3-4@2.2.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-5",
|
|
"dependsOn": [
|
|
"child-2@0.1.0",
|
|
"project-1@0.1.0"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_workspace_all_packages() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["urllib3==2.2.0"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child1", "child2"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child1 = context.temp_dir.child("child1");
|
|
child1.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child2 = context.temp_dir.child("child2");
|
|
child2.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child2"
|
|
version = "0.2.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["sniffio==1.3.1"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--all-packages"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-7",
|
|
"name": "project"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child1-2@0.1.0",
|
|
"name": "child1",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child1"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child2-3@0.2.0",
|
|
"name": "child2",
|
|
"version": "0.2.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child2"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-4@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "sniffio-5@1.3.1",
|
|
"name": "sniffio",
|
|
"version": "1.3.1",
|
|
"purl": "pkg:pypi/sniffio@1.3.1"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-6@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child1-2@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-4@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "child2-3@0.2.0",
|
|
"dependsOn": [
|
|
"sniffio-5@1.3.1"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-4@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"urllib3-6@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "sniffio-5@1.3.1",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "urllib3-6@2.2.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-7",
|
|
"dependsOn": [
|
|
"child1-2@0.1.0",
|
|
"child2-3@0.2.0",
|
|
"project-1@0.1.0"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
// Contains a combination of combination of workspace and registry deps, with another workspace dep not depended on by the root
|
|
#[test]
|
|
fn cyclonedx_export_workspace_mixed_dependencies() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["child1", "urllib3==2.2.0"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child1", "child2"]
|
|
|
|
[tool.uv.sources]
|
|
child1 = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child1 = context.temp_dir.child("child1");
|
|
child1.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child1"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["child2", "iniconfig==2.0.0"]
|
|
|
|
[tool.uv.sources]
|
|
child2 = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child2 = context.temp_dir.child("child2");
|
|
child2.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child2"
|
|
version = "0.2.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["sniffio==1.3.1"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child1-2@0.1.0",
|
|
"name": "child1",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child1"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child2-3@0.2.0",
|
|
"name": "child2",
|
|
"version": "0.2.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child2"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-4@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "sniffio-5@1.3.1",
|
|
"name": "sniffio",
|
|
"version": "1.3.1",
|
|
"purl": "pkg:pypi/sniffio@1.3.1"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-6@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child1-2@0.1.0",
|
|
"dependsOn": [
|
|
"child2-3@0.2.0",
|
|
"iniconfig-4@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "child2-3@0.2.0",
|
|
"dependsOn": [
|
|
"sniffio-5@1.3.1"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-4@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"child1-2@0.1.0",
|
|
"urllib3-6@2.2.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "sniffio-5@1.3.1",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "urllib3-6@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 6 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_dependency_marker() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"urllib3==2.2.1 ; sys_platform == 'darwin'",
|
|
"iniconfig==2.0.0",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-2@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-3@2.2.1",
|
|
"name": "urllib3",
|
|
"version": "2.2.1",
|
|
"purl": "pkg:pypi/urllib3@2.2.1",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "sys_platform == 'darwin'"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "iniconfig-2@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-2@2.0.0",
|
|
"urllib3-3@2.2.1"
|
|
]
|
|
},
|
|
{
|
|
"ref": "urllib3-3@2.2.1",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 3 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_multiple_dependency_markers() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.10"
|
|
dependencies = [
|
|
"cryptography==42.0.5 ; python_version > '3.11'",
|
|
"cryptography==42.0.5 ; sys_platform == 'win32'",
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "cffi-2@1.16.0",
|
|
"name": "cffi",
|
|
"version": "1.16.0",
|
|
"purl": "pkg:pypi/cffi@1.16.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "(python_full_version >= '3.12' and platform_python_implementation != 'PyPy') or (platform_python_implementation != 'PyPy' and sys_platform == 'win32')"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "cryptography-3@42.0.5",
|
|
"name": "cryptography",
|
|
"version": "42.0.5",
|
|
"purl": "pkg:pypi/cryptography@42.0.5",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "python_full_version >= '3.12' or sys_platform == 'win32'"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "pycparser-4@2.21",
|
|
"name": "pycparser",
|
|
"version": "2.21",
|
|
"purl": "pkg:pypi/pycparser@2.21",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "(python_full_version >= '3.12' and platform_python_implementation != 'PyPy') or (platform_python_implementation != 'PyPy' and sys_platform == 'win32')"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "cffi-2@1.16.0",
|
|
"dependsOn": [
|
|
"pycparser-4@2.21"
|
|
]
|
|
},
|
|
{
|
|
"ref": "cryptography-3@42.0.5",
|
|
"dependsOn": [
|
|
"cffi-2@1.16.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"cryptography-3@42.0.5"
|
|
]
|
|
},
|
|
{
|
|
"ref": "pycparser-4@2.21",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_dependency_extra() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["cryptography[ssh]==42.0.5"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "bcrypt-2@4.1.2",
|
|
"name": "bcrypt",
|
|
"version": "4.1.2",
|
|
"purl": "pkg:pypi/bcrypt@4.1.2"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "cffi-3@1.16.0",
|
|
"name": "cffi",
|
|
"version": "1.16.0",
|
|
"purl": "pkg:pypi/cffi@1.16.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "platform_python_implementation != 'PyPy'"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "cryptography-4@42.0.5",
|
|
"name": "cryptography",
|
|
"version": "42.0.5",
|
|
"purl": "pkg:pypi/cryptography@42.0.5"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "pycparser-5@2.21",
|
|
"name": "pycparser",
|
|
"version": "2.21",
|
|
"purl": "pkg:pypi/pycparser@2.21",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "platform_python_implementation != 'PyPy'"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "bcrypt-2@4.1.2",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "cffi-3@1.16.0",
|
|
"dependsOn": [
|
|
"pycparser-5@2.21"
|
|
]
|
|
},
|
|
{
|
|
"ref": "cryptography-4@42.0.5",
|
|
"dependsOn": [
|
|
"bcrypt-2@4.1.2",
|
|
"cffi-3@1.16.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"cryptography-4@42.0.5"
|
|
]
|
|
},
|
|
{
|
|
"ref": "pycparser-5@2.21",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_prune() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"jupyter-client==8.6.1"
|
|
]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(
|
|
context.filters(),
|
|
context.export()
|
|
.arg("--format")
|
|
.arg("cyclonedx1.5")
|
|
.arg("--prune")
|
|
.arg("jupyter-core"),
|
|
@r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "cffi-2@1.16.0",
|
|
"name": "cffi",
|
|
"version": "1.16.0",
|
|
"purl": "pkg:pypi/cffi@1.16.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "implementation_name == 'pypy'"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "jupyter-client-3@8.6.1",
|
|
"name": "jupyter-client",
|
|
"version": "8.6.1",
|
|
"purl": "pkg:pypi/jupyter-client@8.6.1"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "pycparser-4@2.21",
|
|
"name": "pycparser",
|
|
"version": "2.21",
|
|
"purl": "pkg:pypi/pycparser@2.21",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "implementation_name == 'pypy'"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "python-dateutil-5@2.9.0.post0",
|
|
"name": "python-dateutil",
|
|
"version": "2.9.0.post0",
|
|
"purl": "pkg:pypi/python-dateutil@2.9.0.post0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "pyzmq-6@25.1.2",
|
|
"name": "pyzmq",
|
|
"version": "25.1.2",
|
|
"purl": "pkg:pypi/pyzmq@25.1.2"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "six-7@1.16.0",
|
|
"name": "six",
|
|
"version": "1.16.0",
|
|
"purl": "pkg:pypi/six@1.16.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "tornado-8@6.4",
|
|
"name": "tornado",
|
|
"version": "6.4",
|
|
"purl": "pkg:pypi/tornado@6.4"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "traitlets-9@5.14.2",
|
|
"name": "traitlets",
|
|
"version": "5.14.2",
|
|
"purl": "pkg:pypi/traitlets@5.14.2"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "cffi-2@1.16.0",
|
|
"dependsOn": [
|
|
"pycparser-4@2.21"
|
|
]
|
|
},
|
|
{
|
|
"ref": "jupyter-client-3@8.6.1",
|
|
"dependsOn": [
|
|
"python-dateutil-5@2.9.0.post0",
|
|
"pyzmq-6@25.1.2",
|
|
"tornado-8@6.4",
|
|
"traitlets-9@5.14.2"
|
|
]
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"jupyter-client-3@8.6.1"
|
|
]
|
|
},
|
|
{
|
|
"ref": "pycparser-4@2.21",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "python-dateutil-5@2.9.0.post0",
|
|
"dependsOn": [
|
|
"six-7@1.16.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "pyzmq-6@25.1.2",
|
|
"dependsOn": [
|
|
"cffi-2@1.16.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "six-7@1.16.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "tornado-8@6.4",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "traitlets-9@5.14.2",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 12 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#
|
|
);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_group() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions==4.10.0"]
|
|
|
|
[dependency-groups]
|
|
foo = ["urllib3==2.2.1 ; sys_platform == 'darwin'"]
|
|
bar = ["iniconfig==2.0.0"]
|
|
dev = ["sniffio==1.3.1"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Default exports include dev group
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "sniffio-2@1.3.1",
|
|
"name": "sniffio",
|
|
"version": "1.3.1",
|
|
"purl": "pkg:pypi/sniffio@1.3.1"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-3@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"sniffio-2@1.3.1",
|
|
"typing-extensions-3@4.10.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "sniffio-2@1.3.1",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "typing-extensions-3@4.10.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
// Export only specific group
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--only-group").arg("bar"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-2@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "iniconfig-2@2.0.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
// Export with additional group
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--group").arg("foo"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "sniffio-2@1.3.1",
|
|
"name": "sniffio",
|
|
"version": "1.3.1",
|
|
"purl": "pkg:pypi/sniffio@1.3.1"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-3@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-4@2.2.1",
|
|
"name": "urllib3",
|
|
"version": "2.2.1",
|
|
"purl": "pkg:pypi/urllib3@2.2.1",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "sys_platform == 'darwin'"
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"sniffio-2@1.3.1",
|
|
"typing-extensions-3@4.10.0",
|
|
"urllib3-4@2.2.1"
|
|
]
|
|
},
|
|
{
|
|
"ref": "sniffio-2@1.3.1",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "typing-extensions-3@4.10.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "urllib3-4@2.2.1",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 5 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_non_project() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[tool.uv.workspace]
|
|
members = []
|
|
|
|
[dependency-groups]
|
|
url = ["urllib3==2.2.1"]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Default export with no project section
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
]
|
|
},
|
|
"components": [],
|
|
"dependencies": []
|
|
}
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 1 package in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
// Export with group specified
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--group").arg("url"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
]
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-1@2.2.1",
|
|
"name": "urllib3",
|
|
"version": "2.2.1",
|
|
"purl": "pkg:pypi/urllib3@2.2.1"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "urllib3-1@2.2.1",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
|
|
Resolved 1 package in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_no_emit() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["urllib3==2.2.0", "child"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv.sources]
|
|
child = { workspace = true }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Exclude `urllib3`.
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--no-emit-package").arg("urllib3"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child-2@0.1.0",
|
|
"name": "child",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-3@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child-2@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-3@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-3@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"child-2@0.1.0"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
// Exclude `project`.
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--no-emit-project"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child-2@0.1.0",
|
|
"name": "child",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-3@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-4@2.2.0",
|
|
"name": "urllib3",
|
|
"version": "2.2.0",
|
|
"purl": "pkg:pypi/urllib3@2.2.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child-2@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-3@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-3@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "urllib3-4@2.2.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_relative_path() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let dependency = context.temp_dir.child("dependency");
|
|
dependency.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "dependency"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["iniconfig==2.0.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let project = context.temp_dir.child("project");
|
|
project.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["dependency"]
|
|
|
|
[tool.uv.sources]
|
|
dependency = { path = "../dependency" }
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().current_dir(&project).assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").current_dir(&project), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "dependency-2@0.1.0",
|
|
"name": "dependency",
|
|
"version": "0.1.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "iniconfig-3@2.0.0",
|
|
"name": "iniconfig",
|
|
"version": "2.0.0",
|
|
"purl": "pkg:pypi/iniconfig@2.0.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "dependency-2@0.1.0",
|
|
"dependsOn": [
|
|
"iniconfig-3@2.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "iniconfig-3@2.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"dependency-2@0.1.0"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Using CPython 3.12.[X] interpreter at: [PYTHON-3.12]
|
|
Resolved 3 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_cyclic_dependencies() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = [
|
|
"testtools==2.3.0",
|
|
"fixtures==3.0.0",
|
|
]
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "argparse-2@1.4.0",
|
|
"name": "argparse",
|
|
"version": "1.4.0",
|
|
"purl": "pkg:pypi/argparse@1.4.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "extras-3@1.0.0",
|
|
"name": "extras",
|
|
"version": "1.0.0",
|
|
"purl": "pkg:pypi/extras@1.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "fixtures-4@3.0.0",
|
|
"name": "fixtures",
|
|
"version": "3.0.0",
|
|
"purl": "pkg:pypi/fixtures@3.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "linecache2-5@1.0.0",
|
|
"name": "linecache2",
|
|
"version": "1.0.0",
|
|
"purl": "pkg:pypi/linecache2@1.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "pbr-6@6.0.0",
|
|
"name": "pbr",
|
|
"version": "6.0.0",
|
|
"purl": "pkg:pypi/pbr@6.0.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "python-mimeparse-7@1.6.0",
|
|
"name": "python-mimeparse",
|
|
"version": "1.6.0",
|
|
"purl": "pkg:pypi/python-mimeparse@1.6.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "six-8@1.16.0",
|
|
"name": "six",
|
|
"version": "1.16.0",
|
|
"purl": "pkg:pypi/six@1.16.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "testtools-9@2.3.0",
|
|
"name": "testtools",
|
|
"version": "2.3.0",
|
|
"purl": "pkg:pypi/testtools@2.3.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "traceback2-10@1.4.0",
|
|
"name": "traceback2",
|
|
"version": "1.4.0",
|
|
"purl": "pkg:pypi/traceback2@1.4.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "unittest2-11@1.1.0",
|
|
"name": "unittest2",
|
|
"version": "1.1.0",
|
|
"purl": "pkg:pypi/unittest2@1.1.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "argparse-2@1.4.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "extras-3@1.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "fixtures-4@3.0.0",
|
|
"dependsOn": [
|
|
"pbr-6@6.0.0",
|
|
"six-8@1.16.0",
|
|
"testtools-9@2.3.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "linecache2-5@1.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "pbr-6@6.0.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"fixtures-4@3.0.0",
|
|
"testtools-9@2.3.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "python-mimeparse-7@1.6.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "six-8@1.16.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "testtools-9@2.3.0",
|
|
"dependsOn": [
|
|
"extras-3@1.0.0",
|
|
"fixtures-4@3.0.0",
|
|
"pbr-6@6.0.0",
|
|
"python-mimeparse-7@1.6.0",
|
|
"six-8@1.16.0",
|
|
"traceback2-10@1.4.0",
|
|
"unittest2-11@1.1.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "traceback2-10@1.4.0",
|
|
"dependsOn": [
|
|
"linecache2-5@1.0.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "unittest2-11@1.1.0",
|
|
"dependsOn": [
|
|
"argparse-2@1.4.0",
|
|
"six-8@1.16.0",
|
|
"traceback2-10@1.4.0"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 11 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_dev_dependencies() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["typing-extensions==4.10.0"]
|
|
|
|
[tool.uv]
|
|
dev-dependencies = ["urllib3==2.2.1"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Default export includes dev dependencies
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-2@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-3@2.2.1",
|
|
"name": "urllib3",
|
|
"version": "2.2.1",
|
|
"purl": "pkg:pypi/urllib3@2.2.1"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"typing-extensions-2@4.10.0",
|
|
"urllib3-3@2.2.1"
|
|
]
|
|
},
|
|
{
|
|
"ref": "typing-extensions-2@4.10.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "urllib3-3@2.2.1",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
warning: The `tool.uv.dev-dependencies` field (used in `pyproject.toml`) is deprecated and will be removed in a future release; use `dependency-groups.dev` instead
|
|
Resolved 3 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
// Export without dev dependencies
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--no-dev"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-2@4.10.0",
|
|
"name": "typing-extensions",
|
|
"version": "4.10.0",
|
|
"purl": "pkg:pypi/typing-extensions@4.10.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"typing-extensions-2@4.10.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "typing-extensions-2@4.10.0",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
warning: The `tool.uv.dev-dependencies` field (used in `pyproject.toml`) is deprecated and will be removed in a future release; use `dependency-groups.dev` instead
|
|
Resolved 3 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
// Export only dev dependencies
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--only-dev"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "urllib3-2@2.2.1",
|
|
"name": "urllib3",
|
|
"version": "2.2.1",
|
|
"purl": "pkg:pypi/urllib3@2.2.1"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "urllib3-2@2.2.1",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
warning: The `tool.uv.dev-dependencies` field (used in `pyproject.toml`) is deprecated and will be removed in a future release; use `dependency-groups.dev` instead
|
|
Resolved 3 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_all_packages_conflicting_workspace_members() -> Result<()> {
|
|
let context = TestContext::new("3.12").with_cyclonedx_filters();
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["sortedcontainers==2.3.0"]
|
|
|
|
[tool.uv.workspace]
|
|
members = ["child"]
|
|
|
|
[tool.uv]
|
|
conflicts = [
|
|
[
|
|
{ package = "project" },
|
|
{ package = "child" },
|
|
],
|
|
]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
let child = context.temp_dir.child("child");
|
|
child.child("pyproject.toml").write_str(
|
|
r#"
|
|
[project]
|
|
name = "child"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["sortedcontainers==2.4.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
// Export with --all-packages to CycloneDX format should succeed as conflict detection is skipped
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5").arg("--all-packages"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-3",
|
|
"name": "project"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "child-2@0.1.0",
|
|
"name": "child",
|
|
"version": "0.1.0",
|
|
"properties": [
|
|
{
|
|
"name": "uv:workspace:path",
|
|
"value": "child"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "child-2@0.1.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-3",
|
|
"dependsOn": [
|
|
"child-2@0.1.0",
|
|
"project-1@0.1.0"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
warning: Declaring conflicts for packages (`package = ...`) is experimental and may change without warning. Pass `--preview-features package-conflicts` to disable this warning.
|
|
Resolved 4 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
// Should fail when exporting to `requirements.txt` or `pylock.toml`as conflict detection is enabled for these formats
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("requirements-txt").arg("--all-packages"), @r"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: Declaring conflicts for packages (`package = ...`) is experimental and may change without warning. Pass `--preview-features package-conflicts` to disable this warning.
|
|
Resolved 4 packages in [TIME]
|
|
error: Package `child` and package `project` are incompatible with the declared conflicts: {child, project}
|
|
");
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("pylock.toml").arg("--all-packages"), @r"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: Declaring conflicts for packages (`package = ...`) is experimental and may change without warning. Pass `--preview-features package-conflicts` to disable this warning.
|
|
Resolved 4 packages in [TIME]
|
|
error: Package `child` and package `project` are incompatible with the declared conflicts: {child, project}
|
|
");
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn cyclonedx_export_alternative_registry() -> Result<()> {
|
|
let context = TestContext::new("3.12")
|
|
.with_cyclonedx_filters()
|
|
.with_exclude_newer("2025-01-30T00:00:00Z");
|
|
|
|
let pyproject_toml = context.temp_dir.child("pyproject.toml");
|
|
pyproject_toml.write_str(
|
|
r#"
|
|
[project]
|
|
name = "project"
|
|
version = "0.1.0"
|
|
requires-python = ">=3.12"
|
|
dependencies = ["torch==2.6.0"]
|
|
|
|
[build-system]
|
|
requires = ["setuptools>=42"]
|
|
build-backend = "setuptools.build_meta"
|
|
|
|
[[tool.uv.index]]
|
|
name = "pytorch-cpu"
|
|
url = "https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
default = true
|
|
"#,
|
|
)?;
|
|
|
|
context.lock().assert().success();
|
|
|
|
uv_snapshot!(context.filters(), context.export().arg("--format").arg("cyclonedx1.5"), @r#"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
{
|
|
"bomFormat": "CycloneDX",
|
|
"specVersion": "1.5",
|
|
"version": 1,
|
|
"serialNumber": "[SERIAL_NUMBER]",
|
|
"metadata": {
|
|
"timestamp": "[TIMESTAMP]",
|
|
"tools": [
|
|
{
|
|
"vendor": "Astral Software Inc.",
|
|
"name": "uv",
|
|
"version": "[VERSION]"
|
|
}
|
|
],
|
|
"component": {
|
|
"type": "library",
|
|
"bom-ref": "project-1@0.1.0",
|
|
"name": "project",
|
|
"version": "0.1.0"
|
|
}
|
|
},
|
|
"components": [
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "filelock-2@3.13.1",
|
|
"name": "filelock",
|
|
"version": "3.13.1",
|
|
"purl": "pkg:pypi/filelock@3.13.1?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "fsspec-3@2024.6.1",
|
|
"name": "fsspec",
|
|
"version": "2024.6.1",
|
|
"purl": "pkg:pypi/fsspec@2024.6.1?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "jinja2-4@3.1.4",
|
|
"name": "jinja2",
|
|
"version": "3.1.4",
|
|
"purl": "pkg:pypi/jinja2@3.1.4?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "markupsafe-5@3.0.2",
|
|
"name": "markupsafe",
|
|
"version": "3.0.2",
|
|
"purl": "pkg:pypi/markupsafe@3.0.2?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "mpmath-6@1.3.0",
|
|
"name": "mpmath",
|
|
"version": "1.3.0",
|
|
"purl": "pkg:pypi/mpmath@1.3.0?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "networkx-7@3.3",
|
|
"name": "networkx",
|
|
"version": "3.3",
|
|
"purl": "pkg:pypi/networkx@3.3?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "setuptools-8@70.2.0",
|
|
"name": "setuptools",
|
|
"version": "70.2.0",
|
|
"purl": "pkg:pypi/setuptools@70.2.0?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "sympy-9@1.13.1",
|
|
"name": "sympy",
|
|
"version": "1.13.1",
|
|
"purl": "pkg:pypi/sympy@1.13.1?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "torch-10@2.6.0",
|
|
"name": "torch",
|
|
"version": "2.6.0",
|
|
"purl": "pkg:pypi/torch@2.6.0?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "sys_platform == 'darwin'"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "torch-11@2.6.0+cpu",
|
|
"name": "torch",
|
|
"version": "2.6.0+cpu",
|
|
"purl": "pkg:pypi/torch@2.6.0%2Bcpu?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu",
|
|
"properties": [
|
|
{
|
|
"name": "uv:package:marker",
|
|
"value": "sys_platform != 'darwin'"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "library",
|
|
"bom-ref": "typing-extensions-12@4.12.2",
|
|
"name": "typing-extensions",
|
|
"version": "4.12.2",
|
|
"purl": "pkg:pypi/typing-extensions@4.12.2?repository_url=https://astral-sh.github.io/pytorch-mirror/whl/cpu"
|
|
}
|
|
],
|
|
"dependencies": [
|
|
{
|
|
"ref": "filelock-2@3.13.1",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "fsspec-3@2024.6.1",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "jinja2-4@3.1.4",
|
|
"dependsOn": [
|
|
"markupsafe-5@3.0.2"
|
|
]
|
|
},
|
|
{
|
|
"ref": "markupsafe-5@3.0.2",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "mpmath-6@1.3.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "networkx-7@3.3",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "project-1@0.1.0",
|
|
"dependsOn": [
|
|
"torch-10@2.6.0",
|
|
"torch-11@2.6.0+cpu"
|
|
]
|
|
},
|
|
{
|
|
"ref": "setuptools-8@70.2.0",
|
|
"dependsOn": []
|
|
},
|
|
{
|
|
"ref": "sympy-9@1.13.1",
|
|
"dependsOn": [
|
|
"mpmath-6@1.3.0"
|
|
]
|
|
},
|
|
{
|
|
"ref": "torch-10@2.6.0",
|
|
"dependsOn": [
|
|
"filelock-2@3.13.1",
|
|
"fsspec-3@2024.6.1",
|
|
"jinja2-4@3.1.4",
|
|
"networkx-7@3.3",
|
|
"setuptools-8@70.2.0",
|
|
"sympy-9@1.13.1",
|
|
"typing-extensions-12@4.12.2"
|
|
]
|
|
},
|
|
{
|
|
"ref": "torch-11@2.6.0+cpu",
|
|
"dependsOn": [
|
|
"filelock-2@3.13.1",
|
|
"fsspec-3@2024.6.1",
|
|
"jinja2-4@3.1.4",
|
|
"networkx-7@3.3",
|
|
"setuptools-8@70.2.0",
|
|
"sympy-9@1.13.1",
|
|
"typing-extensions-12@4.12.2"
|
|
]
|
|
},
|
|
{
|
|
"ref": "typing-extensions-12@4.12.2",
|
|
"dependsOn": []
|
|
}
|
|
]
|
|
}
|
|
----- stderr -----
|
|
Resolved 12 packages in [TIME]
|
|
warning: `uv export --format=cyclonedx1.5` is experimental and may change without warning. Pass `--preview-features sbom-export` to disable this warning.
|
|
"#);
|
|
|
|
Ok(())
|
|
}
|