Check and update uv-managed project dependencies with optional pyproject pinning.
Project description
uvu
A clean standalone Python utility and library to check and update uv-managed project dependencies with optional target pinning back to your pyproject.toml. View on PyPI.
Features
- Workspace Support: Resolves standalone projects or complex
uvworkspaces interactively or via CLI flags. - Direct vs Transitive Identification: Inspects which dependencies are direct in your packages and which are transitive.
- Pyproject Pinning: Automatically updates version constraints in
pyproject.tomlfiles to match the newuv.lockvalues. - Safe TOML Handling: Error-resilient TOML reader with useful CLI messaging.
- Modern Integration: Integrates directly with the
uvtoolchain (uv lock,uv sync).
Installation
Install via pip or run directly using uv:
pip install uvu
Or run on-the-fly:
uvx uvu check
CLI Usage
You can use the short command uvu or the full command update-uv-packages.
Check available updates
Check for updates across the project:
uvu check
Example output:
Project: /path/to/project
Locked packages: 8 (3 direct in scope, 5 transitive)
Available compatible updates (4)
# package locked latest role
--- --------- -------- -------- -------------------------
1 click 8.0.1 8.4.2 direct (demo-app/project)
2 idna 2.10 3.18 transitive
3 requests 2.25.1 2.27.1 direct (demo-app/project)
4 urllib3 1.26.15 1.26.20 direct (demo-app/project)
Outdated packages blocked by constraints (1)
# package locked latest role blocked by
--- --------- -------- -------- ---------- --------------------
1 chardet 4.0.0 7.4.3 transitive required by requests
Check for updates and also list packages that are already up to date:
uvu check --verbose
Example output:
Project: /path/to/project
Locked packages: 8 (3 direct in scope, 5 transitive)
Available compatible updates (4)
# package locked latest role
--- --------- -------- -------- -------------------------
1 click 8.0.1 8.4.2 direct (demo-app/project)
2 idna 2.10 3.18 transitive
3 requests 2.25.1 2.27.1 direct (demo-app/project)
4 urllib3 1.26.15 1.26.20 direct (demo-app/project)
Outdated packages blocked by constraints (1)
# package locked latest role blocked by
--- --------- -------- -------- ---------- --------------------
1 chardet 4.0.0 7.4.3 transitive required by requests
Up to date (3)
certifi==2026.6.17 (transitive)
colorama==0.4.6 (transitive)
demo-app==0.1.0 (transitive)
Apply updates
Apply updates to specific packages or all packages:
# Update all available packages
uvu update --all
# Update specific packages
uvu update --packages requests urllib3
# Update and pin modified dependency versions back to pyproject.toml
uvu update --packages urllib3 click --pin-updated
Example output for uvu update --packages urllib3 click --pin-updated:
Project: /path/to/project
Locked packages: 8 (3 direct in scope, 5 transitive)
Available compatible updates (4)
# package locked latest role
--- --------- -------- -------- -------------------------
1 click 8.0.1 8.4.2 direct (demo-app/project)
2 idna 2.10 3.18 transitive
3 requests 2.25.1 2.27.1 direct (demo-app/project)
4 urllib3 1.26.15 1.26.20 direct (demo-app/project)
Outdated packages blocked by constraints (1)
# package locked latest role blocked by
--- --------- -------- -------- ---------- --------------------
1 chardet 4.0.0 7.4.3 transitive required by requests
Update report
=============
package before after
--------- -------- -------
click 8.0.1 8.4.2
urllib3 1.26.15 1.26.20
pyproject.toml pins
member group package requirement
-------- ------- --------- ----------------
demo-app project urllib3 urllib3==1.26.20
demo-app project click click==8.4.2
Programmatic API Usage
You can import and orchestrate updates directly inside other Python scripts:
from pathlib import Path
from uvu import UVDependencyManager
# Initialize the manager pointing to your project
manager = UVDependencyManager(start_dir=Path("/path/to/project"))
# Bootstrap layout and workspace members
# (Pass an empty Namespace or CLI args to control options)
import argparse
args = argparse.Namespace(all_members=True, yes=True)
manager.bootstrap(args=args)
# Discover updates
updates = manager.discover_updates()
for update in updates:
print(f"{update.name}: {update.current} -> {update.latest}")
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file uvu-0.1.3.tar.gz.
File metadata
- Download URL: uvu-0.1.3.tar.gz
- Upload date:
- Size: 219.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c12a2cf2d8a743207d3f43d0d1f9883cd8cafcee0b27f87c1afd53b7c915347
|
|
| MD5 |
41c683e79defad710e1974f6130ab688
|
|
| BLAKE2b-256 |
070690e02582117a155fece45903f6b4141fd6642c1e87838b00d59667669345
|
File details
Details for the file uvu-0.1.3-py3-none-any.whl.
File metadata
- Download URL: uvu-0.1.3-py3-none-any.whl
- Upload date:
- Size: 30.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd3f886123ec57879d498e048b104a66c78de5827063d8de19de4228e0a3a41d
|
|
| MD5 |
8e6e63114a212639aac79767ff487bfa
|
|
| BLAKE2b-256 |
e52563c0df8d6c27269bdbadcc6a0acf47febb51886db727f2645fa7247725a3
|