[+] integrate uv pip compile

This commit is contained in:
Siarhei Siniak 2025-01-23 12:17:07 +03:00
parent ebbd1a2b5b
commit 528d9b1ce5
4 changed files with 175 additions and 142 deletions

@ -3891,20 +3891,15 @@ def pip_resolve(args: list[str]) -> None:
options, argv = parser.parse_known_args(args) options, argv = parser.parse_known_args(args)
from online.fxreader.pr34.commands_typed.pip import pip_resolve from online.fxreader.pr34.commands_typed.pip import pip_resolve
sys.stdout.write('\n'.join([
'#%s\n%s %s' % ( resolve_res = pip_resolve(
o.url, argv,
o.constraint, mode=options.mode,
' '.join([ )
'--hash=sha256:%s' % o2
for o2 in o.sha256 assert not resolve_res.txt is None
])
) sys.stdout.write(resolve_res.txt)
for o in pip_resolve(
argv,
mode=options.mode,
)
]))
sys.stdout.flush() sys.stdout.flush()
def commands_cli( def commands_cli(

@ -14,7 +14,9 @@ import pip._internal.operations.prepare
import unittest.mock import unittest.mock
import logging import logging
from typing import (Literal,) from typing import (
Literal,
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -28,7 +30,14 @@ def pip_show(
) )
) )
class pip_resolve_t: class pip_resolve_t:
class kwargs_t:
class mode_t(enum.StrEnum):
copy_paste = "copy_paste"
monkey_patch = "monkey_patch"
uv_pip_compile = "uv_pip_compile"
class res_t: class res_t:
@dataclasses.dataclass @dataclasses.dataclass
class download_info_t: class download_info_t:
@ -36,29 +45,41 @@ class pip_resolve_t:
sha256: str sha256: str
constraint: str constraint: str
txt: Optional[str] = None
entries: Optional[list[download_info_t]] = None
def pip_resolve_entries_to_txt(
entries: list[pip_resolve_t.res_t.download_info_t]
) -> str:
return '\n'.join([
'#%s\n%s %s' % (
o.url,
o.constraint,
' '.join([
'--hash=sha256:%s' % o2
for o2 in o.sha256
])
)
for o in entries
])
def pip_resolve( def pip_resolve(
argv: list[str], argv: list[str],
mode: Literal['copy_paste', 'monkey_patch'], mode: pip_resolve_t.kwargs_t.mode_t,
) -> list[ ) -> list[pip_resolve_t.res_t.download_info_t]:
pip_resolve_t.res_t.download_info_t if mode is pip_resolve_t.kwargs_t.mode_t.copy_paste:
]:
if mode == 'copy_paste':
with contextlib.ExitStack() as stack: with contextlib.ExitStack() as stack:
stack.enter_context( stack.enter_context(pip._internal.utils.temp_dir.global_tempdir_manager())
pip._internal.utils.temp_dir.global_tempdir_manager()
)
t2 = pip._internal.cli.main_parser.create_main_parser() t2 = pip._internal.cli.main_parser.create_main_parser()
t3 = t2.parse_args(['download']) t3 = t2.parse_args(["download"])
t1 = pip._internal.commands.download.DownloadCommand( t1 = pip._internal.commands.download.DownloadCommand("blah", "shit")
'blah',
'shit'
)
stack.enter_context(t1.main_context()) stack.enter_context(t1.main_context())
#options = pip._internal.commands.download.Values() # options = pip._internal.commands.download.Values()
options = t3[0] options = t3[0]
options.python_version = None options.python_version = None
options.platforms = [] options.platforms = []
@ -83,7 +104,7 @@ def pip_resolve(
options.progress_bar = True options.progress_bar = True
options.require_hashes = None options.require_hashes = None
options.ignore_requires_python = None options.ignore_requires_python = None
#options.cache_dir # options.cache_dir
pip._internal.commands.download.cmdoptions.check_dist_restriction(options) pip._internal.commands.download.cmdoptions.check_dist_restriction(options)
# t1._in_main_context = True # t1._in_main_context = True
session = t1.get_default_session(options) session = t1.get_default_session(options)
@ -94,16 +115,21 @@ def pip_resolve(
target_python=target_python, target_python=target_python,
ignore_requires_python=options.ignore_requires_python, ignore_requires_python=options.ignore_requires_python,
) )
build_tracker = t1.enter_context(pip._internal.commands.download.get_build_tracker()) build_tracker = t1.enter_context(
reqs = t1.get_requirements([ pip._internal.commands.download.get_build_tracker()
#'pip', 'uv', 'ipython', )
*argv, reqs = t1.get_requirements(
], options, finder, session) [
#'pip', 'uv', 'ipython',
*argv,
],
options,
finder,
session,
)
pip._internal.commands.download.check_legacy_setup_py_options(options, reqs) pip._internal.commands.download.check_legacy_setup_py_options(options, reqs)
directory = pip._internal.commands.download.TempDirectory( directory = pip._internal.commands.download.TempDirectory(
delete=True, delete=True, kind="download", globally_managed=True
kind='download',
globally_managed=True
) )
preparer = t1.make_requirement_preparer( preparer = t1.make_requirement_preparer(
temp_build_dir=directory, temp_build_dir=directory,
@ -126,50 +152,59 @@ def pip_resolve(
t1.trace_basic_info(finder) t1.trace_basic_info(finder)
requirement_set = resolver.resolve(reqs, check_supported_wheels=True) requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
return [ res = pip_resolve_t.res_t(
pip_resolve_t.res_t.download_info_t( entries=[
constraint=k, pip_resolve_t.res_t.download_info_t(
sha256=v.download_info.info.hashes['sha256'], constraint=k,
url=v.download_info.url, sha256=v.download_info.info.hashes["sha256"],
) url=v.download_info.url,
for k, v in requirement_set.requirements.items() )
] for k, v in requirement_set.requirements.items()
elif mode == 'monkey_patch': ],
)
res.txt = pip_resolve_entries_to_txt(
res.entries
)
return res
elif mode is pip_resolve_t.kwargs_t.mode_t.monkey_patch:
downloader_call_def = pip._internal.network.download.Downloader.__call__ downloader_call_def = pip._internal.network.download.Downloader.__call__
def downloader_call(*args): def downloader_call(*args):
logger.info(dict( logger.info(
url=args[1].url, dict(
)) url=args[1].url,
)
)
return downloader_call_def(*args) return downloader_call_def(*args)
batch_downloader_call_def = pip._internal.network.download.BatchDownloader.__call__ batch_downloader_call_def = (
pip._internal.network.download.BatchDownloader.__call__
)
def batch_downloader_call(*args): def batch_downloader_call(*args):
# print(args) # print(args)
logger.info(dict( logger.info(
args=args, dict(
)) args=args,
)
)
return [ return [(o, ("/dev/null", None)) for o in args[1]]
(o, ('/dev/null', None))
for o in args[1]
]
#base_resolver_resolve_def = pip._internal.resolution.base.BaseResolver.resolve # base_resolver_resolve_def = pip._internal.resolution.base.BaseResolver.resolve
base_resolver_resolve_def = pip._internal.resolution.resolvelib.resolver.Resolver.resolve base_resolver_resolve_def = (
pip._internal.resolution.resolvelib.resolver.Resolver.resolve
)
result_requirements = [] result_requirements = []
def base_resolver_resolve(*args, **kwargs): def base_resolver_resolve(*args, **kwargs):
# print(args, kwargs) # print(args, kwargs)
res = base_resolver_resolve_def( res = base_resolver_resolve_def(*args, **kwargs)
*args,
**kwargs
)
result_requirements.append(res) result_requirements.append(res)
raise NotImplementedError raise NotImplementedError
@ -178,108 +213,96 @@ def pip_resolve(
get_http_url_def = pip._internal.operations.prepare.get_http_url get_http_url_def = pip._internal.operations.prepare.get_http_url
def get_http_url(link, download, download_dir=None, hashes=None): def get_http_url(link, download, download_dir=None, hashes=None):
logger.info(
dict(
url=link.url,
hashes=hashes,
)
)
logger.info(dict( if link.url.endswith(".whl"):
url=link.url, print("blah")
hashes=hashes,
))
if link.url.endswith('.whl'):
print('blah')
hashes = None hashes = None
return '/dev/null', None return "/dev/null", None
else: else:
return get_http_url_def( return get_http_url_def(link, download, download_dir, hashes)
link,
download,
download_dir,
hashes
)
prepare_linked_requirements_more_def = \ prepare_linked_requirements_more_def = pip._internal.operations.prepare.RequirementPreparer.prepare_linked_requirements_more
pip._internal.operations.prepare.RequirementPreparer\
.prepare_linked_requirements_more
def prepare_linked_requirements_more( def prepare_linked_requirements_more(_self, reqs, *args, **kwargs):
_self, reqs, *args, **kwargs
):
result_requirements.append(reqs) result_requirements.append(reqs)
raise NotImplementedError raise NotImplementedError
_complete_partial_requirements_def = \ _complete_partial_requirements_def = pip._internal.operations.prepare.RequirementPreparer._complete_partial_requirements
pip._internal.operations.prepare.RequirementPreparer\
._complete_partial_requirements
def _complete_partial_requirements( def _complete_partial_requirements(_self, reqs, *args, **kwargs):
_self, reqs, *args, **kwargs
):
result_requirements.append(reqs) result_requirements.append(reqs)
raise NotImplementedError raise NotImplementedError
patches = [] patches = []
patches.append( patches.append(
unittest.mock.patch.object( unittest.mock.patch.object(
pip._internal.network.download.Downloader, pip._internal.network.download.Downloader, "__call__", downloader_call
'__call__',
downloader_call
) )
) )
#patches.append( # patches.append(
# unittest.mock.patch.object( # unittest.mock.patch.object(
# pip._internal.network.download.BatchDownloader, # pip._internal.network.download.BatchDownloader,
# '__call__', # '__call__',
# batch_downloader_call # batch_downloader_call
# ) # )
#) # )
#patches.append( # patches.append(
# unittest.mock.patch.object( # unittest.mock.patch.object(
# pip._internal.resolution.base.BaseResolver, 'resolve', base_resolver_resolve)) # pip._internal.resolution.base.BaseResolver, 'resolve', base_resolver_resolve))
patches.append( patches.append(
unittest.mock.patch.object( unittest.mock.patch.object(
pip._internal.resolution.resolvelib.resolver.Resolver, pip._internal.resolution.resolvelib.resolver.Resolver,
'resolve', "resolve",
base_resolver_resolve base_resolver_resolve,
) )
) )
patches.append( patches.append(
unittest.mock.patch.object( unittest.mock.patch.object(
pip._internal.operations.prepare, pip._internal.operations.prepare,
'get_http_url', "get_http_url",
get_http_url, get_http_url,
) )
) )
patches.append( patches.append(
unittest.mock.patch.object( unittest.mock.patch.object(
pip._internal.operations.prepare.RequirementPreparer, pip._internal.operations.prepare.RequirementPreparer,
'prepare_linked_requirements_more', "prepare_linked_requirements_more",
prepare_linked_requirements_more prepare_linked_requirements_more,
) )
) )
#patches.append( # patches.append(
# unittest.mock.patch.object( # unittest.mock.patch.object(
# pip._internal.operations.prepare.RequirementPreparer, # pip._internal.operations.prepare.RequirementPreparer,
# '_complete_partial_requirements', # '_complete_partial_requirements',
# _complete_partial_requirements # _complete_partial_requirements
# ) # )
#) # )
with contextlib.ExitStack() as stack: with contextlib.ExitStack() as stack:
for p in patches: for p in patches:
stack.enter_context(p) stack.enter_context(p)
pip._internal.cli.main.main([ pip._internal.cli.main.main(
'download', [
'-q', "download",
'--no-cache', "-q",
'-d', "--no-cache",
'/dev/null', "-d",
*argv, "/dev/null",
# 'numpy', *argv,
]) # 'numpy',
]
)
#return sum([ # return sum([
# [ # [
# pip_resolve_t.res_t.download_info_t( # pip_resolve_t.res_t.download_info_t(
# constraint=k, # constraint=k,
@ -289,15 +312,47 @@ def pip_resolve(
# for k, v in o.requirements.items() # for k, v in o.requirements.items()
# ] # ]
# for o in result_requirements # for o in result_requirements
#], []) # ], [])
logger.warn(result_requirements) logger.warn(result_requirements)
return [
pip_resolve_t.res_t.download_info_t( res = pip_resolve_t.res_t(
constraint=str(o.req), entries=[
sha256=o.hashes()._allowed['sha256'], pip_resolve_t.res_t.download_info_t(
url=o.link.url, constraint=str(o.req),
) sha256=o.hashes()._allowed["sha256"],
for o in sum(result_requirements, []) url=o.link.url,
] )
for o in sum(result_requirements, [])
],
)
res.txt = pip_resolve_entries_to_txt(
res.entries
)
return res
elif mode is pip_resolve_t.kwargs_t.mode_t.uv_pip_compile:
pip_freeze = subprocess.check_output(
[
sys.executable,
"-m",
"uv",
"pip",
"freeze",
],
).decode('utf-8')
pip_compile = subprocess.check_output(
[
sys.executable, '-m',
'uv', 'pip', 'compile',
'--generate-hashes',
'-',
],
input=pip_freeze.encode('utf-8')
).decode('utf-8')
return pip_resolve_t.res_t(
txt=pip_compile,
)
else: else:
raise NotImplementedError raise NotImplementedError

@ -1 +0,0 @@
python-build

@ -1,16 +0,0 @@
ipython
jupyter
notebook
requests
pyquery
youtube-dl
gdown
aiohttp
mypy
ruff
cython
numpy
scoping
types-setuptools
uvloop
pydantic