[+] improve pip_resolve

1. add -r flag
    that can parse complicated
    requirements
    and format into a temp file
    for uv pip compile;
This commit is contained in:
Siarhei Siniak 2025-01-24 21:47:43 +03:00
parent 6ddfc7d2d7
commit 01aab0517a
2 changed files with 58 additions and 14 deletions

@ -3880,7 +3880,9 @@ class Command(enum.StrEnum):
backup = 'backup' backup = 'backup'
pip_resolve = 'pip_resolve' 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 from online.fxreader.pr34.commands_typed.pip import pip_resolve, pip_resolve_t
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
@ -3892,9 +3894,32 @@ def pip_resolve(args: list[str]) -> None:
], ],
required=True, 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) 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 = pip_resolve_t.kwargs_t.mode_t(
options.mode options.mode
) )
@ -3902,6 +3927,7 @@ def pip_resolve(args: list[str]) -> None:
resolve_res = pip_resolve( resolve_res = pip_resolve(
argv, argv,
mode=options.mode, mode=options.mode,
requirements=requirements,
) )
assert not resolve_res.txt is None assert not resolve_res.txt is None

@ -4,6 +4,7 @@ import sys
import enum import enum
import dataclasses import dataclasses
import subprocess import subprocess
import tempfile
import unittest.mock import unittest.mock
import logging import logging
@ -77,6 +78,7 @@ def pip_resolve_entries_to_txt(
def pip_resolve( def pip_resolve(
argv: list[str], argv: list[str],
mode: pip_resolve_t.kwargs_t.mode_t, mode: pip_resolve_t.kwargs_t.mode_t,
requirements: Optional[list[str]] = None,
) -> pip_resolve_t.res_t: ) -> pip_resolve_t.res_t:
if mode is pip_resolve_t.kwargs_t.mode_t.copy_paste: if mode is pip_resolve_t.kwargs_t.mode_t.copy_paste:
import pip._internal.commands.show import pip._internal.commands.show
@ -487,6 +489,22 @@ def pip_resolve(
txt=pip_compile, txt=pip_compile,
) )
elif mode is pip_resolve_t.kwargs_t.mode_t.uv_pip_compile: elif mode is pip_resolve_t.kwargs_t.mode_t.uv_pip_compile:
with contextlib.ExitStack() as stack:
if not requirements is None:
# assert len(argv) == 0
f = stack.enter_context(
tempfile.NamedTemporaryFile(
suffix='.txt',
)
)
f.write(
('\n'.join(requirements)).encode('utf-8')
)
f.flush()
argv.append(f.name)
if argv[0] == '--': if argv[0] == '--':
del argv[0] del argv[0]