From 01aab0517a84a21ef67b74478f4391e1f2eff376 Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Fri, 24 Jan 2025 21:47:43 +0300 Subject: [PATCH] [+] improve pip_resolve 1. add -r flag that can parse complicated requirements and format into a temp file for uv pip compile; --- python/online/fxreader/pr34/commands.py | 28 +++++++++++- .../fxreader/pr34/commands_typed/pip.py | 44 +++++++++++++------ 2 files changed, 58 insertions(+), 14 deletions(-) diff --git a/python/online/fxreader/pr34/commands.py b/python/online/fxreader/pr34/commands.py index 38661d1..be2e24a 100644 --- a/python/online/fxreader/pr34/commands.py +++ b/python/online/fxreader/pr34/commands.py @@ -3880,7 +3880,9 @@ class Command(enum.StrEnum): backup = 'backup' pip_resolve = 'pip_resolve' -def pip_resolve(args: list[str]) -> None: +def pip_resolve( + args: list[str], +) -> None: from online.fxreader.pr34.commands_typed.pip import pip_resolve, pip_resolve_t parser = argparse.ArgumentParser() @@ -3892,9 +3894,32 @@ def pip_resolve(args: list[str]) -> None: ], required=True, ) + parser.add_argument( + '-r', '--requirement', + default=[], + dest='requirements', + type=str, + action='append', + help=r''' + requirement, + can be multiple in a single parameter, + all of them are to be split by whitespace + and printed into a temp file, + that is fed into uv pip compile + ''', + ) + options, argv = parser.parse_known_args(args) + requirements : Optional[list[str]] = [] + + for o in options.requirements: + requirements.extend(o.split()) + + if len(requirements) == 0: + requirements = None + options.mode = pip_resolve_t.kwargs_t.mode_t( options.mode ) @@ -3902,6 +3927,7 @@ def pip_resolve(args: list[str]) -> None: resolve_res = pip_resolve( argv, mode=options.mode, + requirements=requirements, ) assert not resolve_res.txt is None diff --git a/python/online/fxreader/pr34/commands_typed/pip.py b/python/online/fxreader/pr34/commands_typed/pip.py index 48e97b6..53419dd 100644 --- a/python/online/fxreader/pr34/commands_typed/pip.py +++ b/python/online/fxreader/pr34/commands_typed/pip.py @@ -4,6 +4,7 @@ import sys import enum import dataclasses import subprocess +import tempfile import unittest.mock import logging @@ -77,6 +78,7 @@ def pip_resolve_entries_to_txt( def pip_resolve( argv: list[str], mode: pip_resolve_t.kwargs_t.mode_t, + requirements: Optional[list[str]] = None, ) -> pip_resolve_t.res_t: if mode is pip_resolve_t.kwargs_t.mode_t.copy_paste: import pip._internal.commands.show @@ -487,20 +489,36 @@ def pip_resolve( txt=pip_compile, ) elif mode is pip_resolve_t.kwargs_t.mode_t.uv_pip_compile: - if argv[0] == '--': - del argv[0] + with contextlib.ExitStack() as stack: + if not requirements is None: + # assert len(argv) == 0 - pip_compile = subprocess.check_output( - [ - sys.executable, '-m', - 'uv', 'pip', 'compile', - '--generate-hashes', - *argv, - ], - ).decode('utf-8') + f = stack.enter_context( + tempfile.NamedTemporaryFile( + suffix='.txt', + ) + ) + f.write( + ('\n'.join(requirements)).encode('utf-8') + ) + f.flush() - return pip_resolve_t.res_t( - txt=pip_compile, - ) + argv.append(f.name) + + if argv[0] == '--': + del argv[0] + + pip_compile = subprocess.check_output( + [ + sys.executable, '-m', + 'uv', 'pip', 'compile', + '--generate-hashes', + *argv, + ], + ).decode('utf-8') + + return pip_resolve_t.res_t( + txt=pip_compile, + ) else: raise NotImplementedError