1
0

uv-upgrade 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #!/usr/bin/env python3
  2. import re
  3. import subprocess
  4. import tomllib
  5. from pathlib import Path
  6. def uv(subcommand: str, packages: list[str], group: str | None):
  7. extra_arguments = []
  8. if group:
  9. extra_arguments.extend(["--group", group])
  10. subprocess.check_call(["uv", subcommand, *packages, "--no-sync"] + extra_arguments)
  11. def main():
  12. """WARNING:
  13. from the `pyproject.toml` file, this may delete:
  14. - comments
  15. - upper bounds etc
  16. - markers
  17. - ordering of dependencies
  18. - tool.uv.sources
  19. """
  20. pyproject = tomllib.loads(Path("pyproject.toml").read_text())
  21. package_name_pattern = re.compile(r"^([-a-zA-Z\d]+)(\[[-a-zA-Z\d,]+])?")
  22. for group, dependencies in {
  23. None: pyproject["project"]["dependencies"],
  24. **pyproject.get("dependency-groups", {}),
  25. }.items():
  26. to_remove = []
  27. to_add = []
  28. for dependency in dependencies:
  29. package_match = package_name_pattern.match(dependency)
  30. assert package_match, f"invalid package name '{dependency}'"
  31. package, extras = package_match.groups()
  32. to_remove.append(package)
  33. to_add.append(f"{package}{extras or ''}")
  34. uv("remove", to_remove, group=group)
  35. uv("add", to_add, group=group)
  36. subprocess.check_call(["uv", "sync"])
  37. if __name__ == "__main__":
  38. main()