Skip to content

Commit a9ea756

Browse files
Ignore Python patch version for --universal pip compile (#14405)
## Summary The idea here is that if a user runs `uv pip compile --universal`, we should ignore the patch version on the current interpreter. I think this makes sense... `--universal` tries to resolve for all future versions, so it seems a bit odd that we'd start at the _current_ patch version. Closes #14397.
1 parent 43f67a4 commit a9ea756

File tree

2 files changed

+66
-23
lines changed

2 files changed

+66
-23
lines changed

crates/uv/src/commands/pip/compile.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -337,13 +337,12 @@ pub(crate) async fn pip_compile(
337337

338338
// Determine the Python requirement, if the user requested a specific version.
339339
let python_requirement = if universal {
340-
let requires_python = RequiresPython::greater_than_equal_version(
341-
if let Some(python_version) = python_version.as_ref() {
342-
&python_version.version
343-
} else {
344-
interpreter.python_version()
345-
},
346-
);
340+
let requires_python = if let Some(python_version) = python_version.as_ref() {
341+
RequiresPython::greater_than_equal_version(&python_version.version)
342+
} else {
343+
let version = interpreter.python_minor_version();
344+
RequiresPython::greater_than_equal_version(&version)
345+
};
347346
PythonRequirement::from_requires_python(&interpreter, requires_python)
348347
} else if let Some(python_version) = python_version.as_ref() {
349348
PythonRequirement::from_python_version(&interpreter, python_version)

crates/uv/tests/it/pip_compile.rs

Lines changed: 60 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16345,7 +16345,7 @@ fn pep_751_compile_registry_wheel() -> Result<()> {
1634516345
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1634616346
lock-version = "1.0"
1634716347
created-by = "uv"
16348-
requires-python = ">=3.12.[X]"
16348+
requires-python = ">=3.12"
1634916349

1635016350
[[packages]]
1635116351
name = "iniconfig"
@@ -16394,7 +16394,7 @@ fn pep_751_compile_registry_sdist() -> Result<()> {
1639416394
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1639516395
lock-version = "1.0"
1639616396
created-by = "uv"
16397-
requires-python = ">=3.12.[X]"
16397+
requires-python = ">=3.12"
1639816398

1639916399
[[packages]]
1640016400
name = "source-distribution"
@@ -16478,7 +16478,7 @@ fn pep_751_compile_directory() -> Result<()> {
1647816478
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1647916479
lock-version = "1.0"
1648016480
created-by = "uv"
16481-
requires-python = ">=3.12.[X]"
16481+
requires-python = ">=3.12"
1648216482

1648316483
[[packages]]
1648416484
name = "anyio"
@@ -16549,7 +16549,7 @@ fn pep_751_compile_git() -> Result<()> {
1654916549
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1655016550
lock-version = "1.0"
1655116551
created-by = "uv"
16552-
requires-python = ">=3.12.[X]"
16552+
requires-python = ">=3.12"
1655316553

1655416554
[[packages]]
1655516555
name = "uv-public-pypackage"
@@ -16599,7 +16599,7 @@ fn pep_751_compile_url_wheel() -> Result<()> {
1659916599
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1660016600
lock-version = "1.0"
1660116601
created-by = "uv"
16602-
requires-python = ">=3.12.[X]"
16602+
requires-python = ">=3.12"
1660316603

1660416604
[[packages]]
1660516605
name = "anyio"
@@ -16663,7 +16663,7 @@ fn pep_751_compile_url_sdist() -> Result<()> {
1666316663
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1666416664
lock-version = "1.0"
1666516665
created-by = "uv"
16666-
requires-python = ">=3.12.[X]"
16666+
requires-python = ">=3.12"
1666716667

1666816668
[[packages]]
1666916669
name = "anyio"
@@ -16732,7 +16732,7 @@ fn pep_751_compile_path_wheel() -> Result<()> {
1673216732
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1673316733
lock-version = "1.0"
1673416734
created-by = "uv"
16735-
requires-python = ">=3.12.[X]"
16735+
requires-python = ">=3.12"
1673616736

1673716737
[[packages]]
1673816738
name = "iniconfig"
@@ -16770,7 +16770,7 @@ fn pep_751_compile_path_wheel() -> Result<()> {
1677016770
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o nested/pylock.toml
1677116771
lock-version = "1.0"
1677216772
created-by = "uv"
16773-
requires-python = ">=3.12.[X]"
16773+
requires-python = ">=3.12"
1677416774

1677516775
[[packages]]
1677616776
name = "iniconfig"
@@ -16811,7 +16811,7 @@ fn pep_751_compile_path_sdist() -> Result<()> {
1681116811
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1681216812
lock-version = "1.0"
1681316813
created-by = "uv"
16814-
requires-python = ">=3.12.[X]"
16814+
requires-python = ">=3.12"
1681516815

1681616816
[[packages]]
1681716817
name = "iniconfig"
@@ -16850,7 +16850,7 @@ fn pep_751_compile_path_sdist() -> Result<()> {
1685016850
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o nested/pylock.toml
1685116851
lock-version = "1.0"
1685216852
created-by = "uv"
16853-
requires-python = ">=3.12.[X]"
16853+
requires-python = ">=3.12"
1685416854

1685516855
[[packages]]
1685616856
name = "iniconfig"
@@ -16887,7 +16887,7 @@ fn pep_751_compile_preferences() -> Result<()> {
1688716887
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1688816888
lock-version = "1.0"
1688916889
created-by = "uv"
16890-
requires-python = ">=3.12.[X]"
16890+
requires-python = ">=3.12"
1689116891

1689216892
[[packages]]
1689316893
name = "anyio"
@@ -16928,7 +16928,7 @@ fn pep_751_compile_preferences() -> Result<()> {
1692816928
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1692916929
lock-version = "1.0"
1693016930
created-by = "uv"
16931-
requires-python = ">=3.12.[X]"
16931+
requires-python = ">=3.12"
1693216932

1693316933
[[packages]]
1693416934
name = "anyio"
@@ -16968,7 +16968,7 @@ fn pep_751_compile_preferences() -> Result<()> {
1696816968
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1696916969
lock-version = "1.0"
1697016970
created-by = "uv"
16971-
requires-python = ">=3.12.[X]"
16971+
requires-python = ">=3.12"
1697216972

1697316973
[[packages]]
1697416974
name = "anyio"
@@ -17007,7 +17007,7 @@ fn pep_751_compile_preferences() -> Result<()> {
1700717007
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml
1700817008
lock-version = "1.0"
1700917009
created-by = "uv"
17010-
requires-python = ">=3.12.[X]"
17010+
requires-python = ">=3.12"
1701117011

1701217012
[[packages]]
1701317013
name = "anyio"
@@ -17055,7 +17055,7 @@ fn pep_751_compile_warn() -> Result<()> {
1705517055
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml --emit-index-url
1705617056
lock-version = "1.0"
1705717057
created-by = "uv"
17058-
requires-python = ">=3.12.[X]"
17058+
requires-python = ">=3.12"
1705917059

1706017060
[[packages]]
1706117061
name = "iniconfig"
@@ -17268,7 +17268,7 @@ fn pep_751_compile_no_emit_package() -> Result<()> {
1726817268
# uv pip compile --cache-dir [CACHE_DIR] requirements.txt --universal -o pylock.toml --no-emit-package idna
1726917269
lock-version = "1.0"
1727017270
created-by = "uv"
17271-
requires-python = ">=3.12.[X]"
17271+
requires-python = ">=3.12"
1727217272

1727317273
[[packages]]
1727417274
name = "anyio"
@@ -17562,3 +17562,47 @@ fn git_path_transitive_dependency() -> Result<()> {
1756217562

1756317563
Ok(())
1756417564
}
17565+
17566+
/// Ensure that `--emit-index-annotation` plays nicely with `--annotation-style=line`.
17567+
#[test]
17568+
fn omit_python_patch_universal() -> Result<()> {
17569+
let context = TestContext::new("3.11");
17570+
17571+
let requirements_in = context.temp_dir.child("requirements.in");
17572+
requirements_in.write_str("redis")?;
17573+
17574+
uv_snapshot!(context.filters(), context.pip_compile()
17575+
.arg("requirements.in"), @r"
17576+
success: true
17577+
exit_code: 0
17578+
----- stdout -----
17579+
# This file was autogenerated by uv via the following command:
17580+
# uv pip compile --cache-dir [CACHE_DIR] requirements.in
17581+
redis==5.0.3
17582+
# via -r requirements.in
17583+
17584+
----- stderr -----
17585+
Resolved 1 package in [TIME]
17586+
"
17587+
);
17588+
17589+
uv_snapshot!(context.filters(), context.pip_compile()
17590+
.arg("requirements.in")
17591+
.arg("--universal"), @r"
17592+
success: true
17593+
exit_code: 0
17594+
----- stdout -----
17595+
# This file was autogenerated by uv via the following command:
17596+
# uv pip compile --cache-dir [CACHE_DIR] requirements.in --universal
17597+
async-timeout==4.0.3 ; python_full_version < '3.11.[X]'
17598+
# via redis
17599+
redis==5.0.3
17600+
# via -r requirements.in
17601+
17602+
----- stderr -----
17603+
Resolved 2 packages in [TIME]
17604+
"
17605+
);
17606+
17607+
Ok(())
17608+
}

0 commit comments

Comments
 (0)