[+] integrate uv pip compile
This commit is contained in:
parent
ebbd1a2b5b
commit
528d9b1ce5
@ -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
|
|
Loading…
Reference in New Issue
Block a user