From 976ec414353e1d6d23b514ec8dad5c2867c51cab Mon Sep 17 00:00:00 2001 From: Guilherme Espada Date: Thu, 29 Feb 2024 02:55:10 +0000 Subject: [PATCH] Hacky implementation of using UV to install deps --- pre_commit/languages/python.py | 50 ++++++++++++++++++++++++++++++++-- setup.cfg | 1 + 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/pre_commit/languages/python.py b/pre_commit/languages/python.py index 9f4bf69a..151061ee 100644 --- a/pre_commit/languages/python.py +++ b/pre_commit/languages/python.py @@ -6,6 +6,10 @@ import os import sys from collections.abc import Generator from collections.abc import Sequence +from pathlib import Path + +import tomlkit +from tomlkit import TOMLDocument import pre_commit.constants as C from pre_commit import lang_base @@ -207,8 +211,50 @@ def install_environment( python = norm_version(version) if python is not None: venv_cmd.extend(('-p', python)) - install_cmd = ('python', '-mpip', 'install', '.', *additional_dependencies) + pip_cmd = None + if 'PRE_COMMIT_USE_UV' in os.environ: + proj_file = prefix.path() / Path('pyproject.toml') + if proj_file.exists(): + with open(proj_file) as fd: + parsed = tomlkit.parse(fd.read()) + + def try_navigate(*coords: str) -> TOMLDocument | None: + curr = parsed + for coord in coords: + if coord not in curr: + return None + curr = curr[coord] + return curr + + name = try_navigate('tool', 'poetry', 'name') + + if name is None: + name = try_navigate('project', 'name') + + if name is not None: + pip_cmd = ( + 'uv', + 'pip', + 'install', + f"{name} @ .", + *additional_dependencies, + ) cmd_output_b(*venv_cmd, cwd='/') with in_env(prefix, version): - lang_base.setup_cmd(prefix, install_cmd) + if pip_cmd is not None: + try: + lang_base.setup_cmd(prefix, pip_cmd) + return + except CalledProcessError: + pass # fallback + lang_base.setup_cmd( + prefix, + ( + 'python', + '-mpip', + 'install', + '.', + *additional_dependencies, + ), + ) diff --git a/setup.cfg b/setup.cfg index a447bbb9..bd47a895 100644 --- a/setup.cfg +++ b/setup.cfg @@ -23,6 +23,7 @@ install_requires = identify>=1.0.0 nodeenv>=0.11.1 pyyaml>=5.1 + tomlkit>=0.12.4 virtualenv>=20.10.0 python_requires = >=3.9