Add files using upload-large-folder tool
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/_identifier.py +6 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/async_utils.py +84 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/constants.py +20 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/ext.py +869 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/METADATA +35 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/RECORD +17 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/WHEEL +5 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/METADATA +35 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/RECORD +113 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/WHEEL +5 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/top_level.txt +1 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip-24.3.1.dist-info/RECORD +853 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip-24.3.1.dist-info/WHEEL +5 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/__init__.py +18 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/build_env.py +319 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py +21 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/base.py +53 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/installed.py +29 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py +158 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py +42 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/index/collector.py +494 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py +138 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py +37 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/constructors.py +560 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/req_set.py +82 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py +633 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/autograd.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/lazy.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/structured.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/translate.cpython-311.pyc +0 -0
- tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/functionalization.py +199 -0
tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/__pycache__/visitor.cpython-311.pyc
ADDED
|
Binary file (5.73 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/_identifier.py
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
|
| 3 |
+
# generated by scripts/generate_identifier_pattern.py
|
| 4 |
+
pattern = re.compile(
|
| 5 |
+
r"[\w·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ܑۭܰ-݊ަ-ް߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣঁ-ঃ়া-ৄেৈো-্ৗৢৣ৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑੰੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣஂா-ூெ-ைொ-்ௗఀ-ఄా-ౄె-ైొ-్ౕౖౢౣಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣංඃ්ා-ුූෘ-ෟෲෳัิ-ฺ็-๎ັິ-ູົຼ່-ໍ༹༘༙༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏႚ-ႝ፝-፟ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝᠋-᠍ᢅᢆᢩᤠ-ᤫᤰ-᤻ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼᪰-᪽ᬀ-ᬄ᬴-᭄᭫-᭳ᮀ-ᮂᮡ-ᮭ᯦-᯳ᰤ-᰷᳐-᳔᳒-᳨᳭ᳲ-᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰℘℮⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣠-꣱ꣿꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀ꧥꨩ-ꨶꩃꩌꩍꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭ﬞ︀-️︠-︯︳︴﹍-﹏_𐇽𐋠𐍶-𐍺𐨁-𐨃𐨅𐨆𐨌-𐨏𐨸-𐨿𐨺𐫦𐫥𐴤-𐽆𐴧-𐽐𑀀-𑀂𑀸-𑁆𑁿-𑂂𑂰-𑂺𑄀-𑄂𑄧-𑄴𑅅𑅆𑅳𑆀-𑆂𑆳-𑇀𑇉-𑇌𑈬-𑈷𑈾𑋟-𑋪𑌀-𑌃𑌻𑌼𑌾-𑍄𑍇𑍈𑍋-𑍍𑍗𑍢𑍣𑍦-𑍬𑍰-𑍴𑐵-𑑆𑑞𑒰-𑓃𑖯-𑖵𑖸-𑗀𑗜𑗝𑘰-𑙀𑚫-𑚷𑜝-𑜫𑠬-𑠺𑨁-𑨊𑨳-𑨹𑨻-𑨾𑩇𑩑-𑩛𑪊-𑪙𑰯-𑰶𑰸-𑰿𑲒-𑲧𑲩-𑲶𑴱-𑴶𑴺𑴼𑴽𑴿-𑵅𑵇𑶊-𑶎𑶐𑶑𑶓-𑶗𑻳-𑻶𖫰-𖫴𖬰-𖬶𖽑-𖽾𖾏-𖾒𛲝𛲞𝅥-𝅩𝅭-𝅲𝅻-𝆂𝆅-𝆋𝆪-𝆭𝉂-𝉄𝨀-𝨶𝨻-𝩬𝩵𝪄𝪛-𝪟𝪡-𝪯𞀀-𞀆𞀈-𞀘𞀛-𞀡𞀣𞀤𞀦-𞣐𞀪-𞣖𞥄-𞥊󠄀-󠇯]+" # noqa: B950
|
| 6 |
+
)
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/async_utils.py
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import inspect
|
| 2 |
+
import typing as t
|
| 3 |
+
from functools import WRAPPER_ASSIGNMENTS
|
| 4 |
+
from functools import wraps
|
| 5 |
+
|
| 6 |
+
from .utils import _PassArg
|
| 7 |
+
from .utils import pass_eval_context
|
| 8 |
+
|
| 9 |
+
V = t.TypeVar("V")
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def async_variant(normal_func): # type: ignore
|
| 13 |
+
def decorator(async_func): # type: ignore
|
| 14 |
+
pass_arg = _PassArg.from_obj(normal_func)
|
| 15 |
+
need_eval_context = pass_arg is None
|
| 16 |
+
|
| 17 |
+
if pass_arg is _PassArg.environment:
|
| 18 |
+
|
| 19 |
+
def is_async(args: t.Any) -> bool:
|
| 20 |
+
return t.cast(bool, args[0].is_async)
|
| 21 |
+
|
| 22 |
+
else:
|
| 23 |
+
|
| 24 |
+
def is_async(args: t.Any) -> bool:
|
| 25 |
+
return t.cast(bool, args[0].environment.is_async)
|
| 26 |
+
|
| 27 |
+
# Take the doc and annotations from the sync function, but the
|
| 28 |
+
# name from the async function. Pallets-Sphinx-Themes
|
| 29 |
+
# build_function_directive expects __wrapped__ to point to the
|
| 30 |
+
# sync function.
|
| 31 |
+
async_func_attrs = ("__module__", "__name__", "__qualname__")
|
| 32 |
+
normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs))
|
| 33 |
+
|
| 34 |
+
@wraps(normal_func, assigned=normal_func_attrs)
|
| 35 |
+
@wraps(async_func, assigned=async_func_attrs, updated=())
|
| 36 |
+
def wrapper(*args, **kwargs): # type: ignore
|
| 37 |
+
b = is_async(args)
|
| 38 |
+
|
| 39 |
+
if need_eval_context:
|
| 40 |
+
args = args[1:]
|
| 41 |
+
|
| 42 |
+
if b:
|
| 43 |
+
return async_func(*args, **kwargs)
|
| 44 |
+
|
| 45 |
+
return normal_func(*args, **kwargs)
|
| 46 |
+
|
| 47 |
+
if need_eval_context:
|
| 48 |
+
wrapper = pass_eval_context(wrapper)
|
| 49 |
+
|
| 50 |
+
wrapper.jinja_async_variant = True
|
| 51 |
+
return wrapper
|
| 52 |
+
|
| 53 |
+
return decorator
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
_common_primitives = {int, float, bool, str, list, dict, tuple, type(None)}
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V":
|
| 60 |
+
# Avoid a costly call to isawaitable
|
| 61 |
+
if type(value) in _common_primitives:
|
| 62 |
+
return t.cast("V", value)
|
| 63 |
+
|
| 64 |
+
if inspect.isawaitable(value):
|
| 65 |
+
return await t.cast("t.Awaitable[V]", value)
|
| 66 |
+
|
| 67 |
+
return t.cast("V", value)
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
async def auto_aiter(
|
| 71 |
+
iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]",
|
| 72 |
+
) -> "t.AsyncIterator[V]":
|
| 73 |
+
if hasattr(iterable, "__aiter__"):
|
| 74 |
+
async for item in t.cast("t.AsyncIterable[V]", iterable):
|
| 75 |
+
yield item
|
| 76 |
+
else:
|
| 77 |
+
for item in iterable:
|
| 78 |
+
yield item
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
async def auto_to_list(
|
| 82 |
+
value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]",
|
| 83 |
+
) -> t.List["V"]:
|
| 84 |
+
return [x async for x in auto_aiter(value)]
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/constants.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#: list of lorem ipsum words used by the lipsum() helper function
|
| 2 |
+
LOREM_IPSUM_WORDS = """\
|
| 3 |
+
a ac accumsan ad adipiscing aenean aliquam aliquet amet ante aptent arcu at
|
| 4 |
+
auctor augue bibendum blandit class commodo condimentum congue consectetuer
|
| 5 |
+
consequat conubia convallis cras cubilia cum curabitur curae cursus dapibus
|
| 6 |
+
diam dictum dictumst dignissim dis dolor donec dui duis egestas eget eleifend
|
| 7 |
+
elementum elit enim erat eros est et etiam eu euismod facilisi facilisis fames
|
| 8 |
+
faucibus felis fermentum feugiat fringilla fusce gravida habitant habitasse hac
|
| 9 |
+
hendrerit hymenaeos iaculis id imperdiet in inceptos integer interdum ipsum
|
| 10 |
+
justo lacinia lacus laoreet lectus leo libero ligula litora lobortis lorem
|
| 11 |
+
luctus maecenas magna magnis malesuada massa mattis mauris metus mi molestie
|
| 12 |
+
mollis montes morbi mus nam nascetur natoque nec neque netus nibh nisi nisl non
|
| 13 |
+
nonummy nostra nulla nullam nunc odio orci ornare parturient pede pellentesque
|
| 14 |
+
penatibus per pharetra phasellus placerat platea porta porttitor posuere
|
| 15 |
+
potenti praesent pretium primis proin pulvinar purus quam quis quisque rhoncus
|
| 16 |
+
ridiculus risus rutrum sagittis sapien scelerisque sed sem semper senectus sit
|
| 17 |
+
sociis sociosqu sodales sollicitudin suscipit suspendisse taciti tellus tempor
|
| 18 |
+
tempus tincidunt torquent tortor tristique turpis ullamcorper ultrices
|
| 19 |
+
ultricies urna ut varius vehicula vel velit venenatis vestibulum vitae vivamus
|
| 20 |
+
viverra volutpat vulputate"""
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/jinja2/ext.py
ADDED
|
@@ -0,0 +1,869 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Extension API for adding custom tags and behavior."""
|
| 2 |
+
import pprint
|
| 3 |
+
import re
|
| 4 |
+
import typing as t
|
| 5 |
+
|
| 6 |
+
from markupsafe import Markup
|
| 7 |
+
|
| 8 |
+
from . import defaults
|
| 9 |
+
from . import nodes
|
| 10 |
+
from .environment import Environment
|
| 11 |
+
from .exceptions import TemplateAssertionError
|
| 12 |
+
from .exceptions import TemplateSyntaxError
|
| 13 |
+
from .runtime import concat # type: ignore
|
| 14 |
+
from .runtime import Context
|
| 15 |
+
from .runtime import Undefined
|
| 16 |
+
from .utils import import_string
|
| 17 |
+
from .utils import pass_context
|
| 18 |
+
|
| 19 |
+
if t.TYPE_CHECKING:
|
| 20 |
+
import typing_extensions as te
|
| 21 |
+
from .lexer import Token
|
| 22 |
+
from .lexer import TokenStream
|
| 23 |
+
from .parser import Parser
|
| 24 |
+
|
| 25 |
+
class _TranslationsBasic(te.Protocol):
|
| 26 |
+
def gettext(self, message: str) -> str:
|
| 27 |
+
...
|
| 28 |
+
|
| 29 |
+
def ngettext(self, singular: str, plural: str, n: int) -> str:
|
| 30 |
+
pass
|
| 31 |
+
|
| 32 |
+
class _TranslationsContext(_TranslationsBasic):
|
| 33 |
+
def pgettext(self, context: str, message: str) -> str:
|
| 34 |
+
...
|
| 35 |
+
|
| 36 |
+
def npgettext(self, context: str, singular: str, plural: str, n: int) -> str:
|
| 37 |
+
...
|
| 38 |
+
|
| 39 |
+
_SupportedTranslations = t.Union[_TranslationsBasic, _TranslationsContext]
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
# I18N functions available in Jinja templates. If the I18N library
|
| 43 |
+
# provides ugettext, it will be assigned to gettext.
|
| 44 |
+
GETTEXT_FUNCTIONS: t.Tuple[str, ...] = (
|
| 45 |
+
"_",
|
| 46 |
+
"gettext",
|
| 47 |
+
"ngettext",
|
| 48 |
+
"pgettext",
|
| 49 |
+
"npgettext",
|
| 50 |
+
)
|
| 51 |
+
_ws_re = re.compile(r"\s*\n\s*")
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
class Extension:
|
| 55 |
+
"""Extensions can be used to add extra functionality to the Jinja template
|
| 56 |
+
system at the parser level. Custom extensions are bound to an environment
|
| 57 |
+
but may not store environment specific data on `self`. The reason for
|
| 58 |
+
this is that an extension can be bound to another environment (for
|
| 59 |
+
overlays) by creating a copy and reassigning the `environment` attribute.
|
| 60 |
+
|
| 61 |
+
As extensions are created by the environment they cannot accept any
|
| 62 |
+
arguments for configuration. One may want to work around that by using
|
| 63 |
+
a factory function, but that is not possible as extensions are identified
|
| 64 |
+
by their import name. The correct way to configure the extension is
|
| 65 |
+
storing the configuration values on the environment. Because this way the
|
| 66 |
+
environment ends up acting as central configuration storage the
|
| 67 |
+
attributes may clash which is why extensions have to ensure that the names
|
| 68 |
+
they choose for configuration are not too generic. ``prefix`` for example
|
| 69 |
+
is a terrible name, ``fragment_cache_prefix`` on the other hand is a good
|
| 70 |
+
name as includes the name of the extension (fragment cache).
|
| 71 |
+
"""
|
| 72 |
+
|
| 73 |
+
identifier: t.ClassVar[str]
|
| 74 |
+
|
| 75 |
+
def __init_subclass__(cls) -> None:
|
| 76 |
+
cls.identifier = f"{cls.__module__}.{cls.__name__}"
|
| 77 |
+
|
| 78 |
+
#: if this extension parses this is the list of tags it's listening to.
|
| 79 |
+
tags: t.Set[str] = set()
|
| 80 |
+
|
| 81 |
+
#: the priority of that extension. This is especially useful for
|
| 82 |
+
#: extensions that preprocess values. A lower value means higher
|
| 83 |
+
#: priority.
|
| 84 |
+
#:
|
| 85 |
+
#: .. versionadded:: 2.4
|
| 86 |
+
priority = 100
|
| 87 |
+
|
| 88 |
+
def __init__(self, environment: Environment) -> None:
|
| 89 |
+
self.environment = environment
|
| 90 |
+
|
| 91 |
+
def bind(self, environment: Environment) -> "Extension":
|
| 92 |
+
"""Create a copy of this extension bound to another environment."""
|
| 93 |
+
rv = object.__new__(self.__class__)
|
| 94 |
+
rv.__dict__.update(self.__dict__)
|
| 95 |
+
rv.environment = environment
|
| 96 |
+
return rv
|
| 97 |
+
|
| 98 |
+
def preprocess(
|
| 99 |
+
self, source: str, name: t.Optional[str], filename: t.Optional[str] = None
|
| 100 |
+
) -> str:
|
| 101 |
+
"""This method is called before the actual lexing and can be used to
|
| 102 |
+
preprocess the source. The `filename` is optional. The return value
|
| 103 |
+
must be the preprocessed source.
|
| 104 |
+
"""
|
| 105 |
+
return source
|
| 106 |
+
|
| 107 |
+
def filter_stream(
|
| 108 |
+
self, stream: "TokenStream"
|
| 109 |
+
) -> t.Union["TokenStream", t.Iterable["Token"]]:
|
| 110 |
+
"""It's passed a :class:`~jinja2.lexer.TokenStream` that can be used
|
| 111 |
+
to filter tokens returned. This method has to return an iterable of
|
| 112 |
+
:class:`~jinja2.lexer.Token`\\s, but it doesn't have to return a
|
| 113 |
+
:class:`~jinja2.lexer.TokenStream`.
|
| 114 |
+
"""
|
| 115 |
+
return stream
|
| 116 |
+
|
| 117 |
+
def parse(self, parser: "Parser") -> t.Union[nodes.Node, t.List[nodes.Node]]:
|
| 118 |
+
"""If any of the :attr:`tags` matched this method is called with the
|
| 119 |
+
parser as first argument. The token the parser stream is pointing at
|
| 120 |
+
is the name token that matched. This method has to return one or a
|
| 121 |
+
list of multiple nodes.
|
| 122 |
+
"""
|
| 123 |
+
raise NotImplementedError()
|
| 124 |
+
|
| 125 |
+
def attr(
|
| 126 |
+
self, name: str, lineno: t.Optional[int] = None
|
| 127 |
+
) -> nodes.ExtensionAttribute:
|
| 128 |
+
"""Return an attribute node for the current extension. This is useful
|
| 129 |
+
to pass constants on extensions to generated template code.
|
| 130 |
+
|
| 131 |
+
::
|
| 132 |
+
|
| 133 |
+
self.attr('_my_attribute', lineno=lineno)
|
| 134 |
+
"""
|
| 135 |
+
return nodes.ExtensionAttribute(self.identifier, name, lineno=lineno)
|
| 136 |
+
|
| 137 |
+
def call_method(
|
| 138 |
+
self,
|
| 139 |
+
name: str,
|
| 140 |
+
args: t.Optional[t.List[nodes.Expr]] = None,
|
| 141 |
+
kwargs: t.Optional[t.List[nodes.Keyword]] = None,
|
| 142 |
+
dyn_args: t.Optional[nodes.Expr] = None,
|
| 143 |
+
dyn_kwargs: t.Optional[nodes.Expr] = None,
|
| 144 |
+
lineno: t.Optional[int] = None,
|
| 145 |
+
) -> nodes.Call:
|
| 146 |
+
"""Call a method of the extension. This is a shortcut for
|
| 147 |
+
:meth:`attr` + :class:`jinja2.nodes.Call`.
|
| 148 |
+
"""
|
| 149 |
+
if args is None:
|
| 150 |
+
args = []
|
| 151 |
+
if kwargs is None:
|
| 152 |
+
kwargs = []
|
| 153 |
+
return nodes.Call(
|
| 154 |
+
self.attr(name, lineno=lineno),
|
| 155 |
+
args,
|
| 156 |
+
kwargs,
|
| 157 |
+
dyn_args,
|
| 158 |
+
dyn_kwargs,
|
| 159 |
+
lineno=lineno,
|
| 160 |
+
)
|
| 161 |
+
|
| 162 |
+
|
| 163 |
+
@pass_context
|
| 164 |
+
def _gettext_alias(
|
| 165 |
+
__context: Context, *args: t.Any, **kwargs: t.Any
|
| 166 |
+
) -> t.Union[t.Any, Undefined]:
|
| 167 |
+
return __context.call(__context.resolve("gettext"), *args, **kwargs)
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
def _make_new_gettext(func: t.Callable[[str], str]) -> t.Callable[..., str]:
|
| 171 |
+
@pass_context
|
| 172 |
+
def gettext(__context: Context, __string: str, **variables: t.Any) -> str:
|
| 173 |
+
rv = __context.call(func, __string)
|
| 174 |
+
if __context.eval_ctx.autoescape:
|
| 175 |
+
rv = Markup(rv)
|
| 176 |
+
# Always treat as a format string, even if there are no
|
| 177 |
+
# variables. This makes translation strings more consistent
|
| 178 |
+
# and predictable. This requires escaping
|
| 179 |
+
return rv % variables # type: ignore
|
| 180 |
+
|
| 181 |
+
return gettext
|
| 182 |
+
|
| 183 |
+
|
| 184 |
+
def _make_new_ngettext(func: t.Callable[[str, str, int], str]) -> t.Callable[..., str]:
|
| 185 |
+
@pass_context
|
| 186 |
+
def ngettext(
|
| 187 |
+
__context: Context,
|
| 188 |
+
__singular: str,
|
| 189 |
+
__plural: str,
|
| 190 |
+
__num: int,
|
| 191 |
+
**variables: t.Any,
|
| 192 |
+
) -> str:
|
| 193 |
+
variables.setdefault("num", __num)
|
| 194 |
+
rv = __context.call(func, __singular, __plural, __num)
|
| 195 |
+
if __context.eval_ctx.autoescape:
|
| 196 |
+
rv = Markup(rv)
|
| 197 |
+
# Always treat as a format string, see gettext comment above.
|
| 198 |
+
return rv % variables # type: ignore
|
| 199 |
+
|
| 200 |
+
return ngettext
|
| 201 |
+
|
| 202 |
+
|
| 203 |
+
def _make_new_pgettext(func: t.Callable[[str, str], str]) -> t.Callable[..., str]:
|
| 204 |
+
@pass_context
|
| 205 |
+
def pgettext(
|
| 206 |
+
__context: Context, __string_ctx: str, __string: str, **variables: t.Any
|
| 207 |
+
) -> str:
|
| 208 |
+
variables.setdefault("context", __string_ctx)
|
| 209 |
+
rv = __context.call(func, __string_ctx, __string)
|
| 210 |
+
|
| 211 |
+
if __context.eval_ctx.autoescape:
|
| 212 |
+
rv = Markup(rv)
|
| 213 |
+
|
| 214 |
+
# Always treat as a format string, see gettext comment above.
|
| 215 |
+
return rv % variables # type: ignore
|
| 216 |
+
|
| 217 |
+
return pgettext
|
| 218 |
+
|
| 219 |
+
|
| 220 |
+
def _make_new_npgettext(
|
| 221 |
+
func: t.Callable[[str, str, str, int], str]
|
| 222 |
+
) -> t.Callable[..., str]:
|
| 223 |
+
@pass_context
|
| 224 |
+
def npgettext(
|
| 225 |
+
__context: Context,
|
| 226 |
+
__string_ctx: str,
|
| 227 |
+
__singular: str,
|
| 228 |
+
__plural: str,
|
| 229 |
+
__num: int,
|
| 230 |
+
**variables: t.Any,
|
| 231 |
+
) -> str:
|
| 232 |
+
variables.setdefault("context", __string_ctx)
|
| 233 |
+
variables.setdefault("num", __num)
|
| 234 |
+
rv = __context.call(func, __string_ctx, __singular, __plural, __num)
|
| 235 |
+
|
| 236 |
+
if __context.eval_ctx.autoescape:
|
| 237 |
+
rv = Markup(rv)
|
| 238 |
+
|
| 239 |
+
# Always treat as a format string, see gettext comment above.
|
| 240 |
+
return rv % variables # type: ignore
|
| 241 |
+
|
| 242 |
+
return npgettext
|
| 243 |
+
|
| 244 |
+
|
| 245 |
+
class InternationalizationExtension(Extension):
|
| 246 |
+
"""This extension adds gettext support to Jinja."""
|
| 247 |
+
|
| 248 |
+
tags = {"trans"}
|
| 249 |
+
|
| 250 |
+
# TODO: the i18n extension is currently reevaluating values in a few
|
| 251 |
+
# situations. Take this example:
|
| 252 |
+
# {% trans count=something() %}{{ count }} foo{% pluralize
|
| 253 |
+
# %}{{ count }} fooss{% endtrans %}
|
| 254 |
+
# something is called twice here. One time for the gettext value and
|
| 255 |
+
# the other time for the n-parameter of the ngettext function.
|
| 256 |
+
|
| 257 |
+
def __init__(self, environment: Environment) -> None:
|
| 258 |
+
super().__init__(environment)
|
| 259 |
+
environment.globals["_"] = _gettext_alias
|
| 260 |
+
environment.extend(
|
| 261 |
+
install_gettext_translations=self._install,
|
| 262 |
+
install_null_translations=self._install_null,
|
| 263 |
+
install_gettext_callables=self._install_callables,
|
| 264 |
+
uninstall_gettext_translations=self._uninstall,
|
| 265 |
+
extract_translations=self._extract,
|
| 266 |
+
newstyle_gettext=False,
|
| 267 |
+
)
|
| 268 |
+
|
| 269 |
+
def _install(
|
| 270 |
+
self, translations: "_SupportedTranslations", newstyle: t.Optional[bool] = None
|
| 271 |
+
) -> None:
|
| 272 |
+
# ugettext and ungettext are preferred in case the I18N library
|
| 273 |
+
# is providing compatibility with older Python versions.
|
| 274 |
+
gettext = getattr(translations, "ugettext", None)
|
| 275 |
+
if gettext is None:
|
| 276 |
+
gettext = translations.gettext
|
| 277 |
+
ngettext = getattr(translations, "ungettext", None)
|
| 278 |
+
if ngettext is None:
|
| 279 |
+
ngettext = translations.ngettext
|
| 280 |
+
|
| 281 |
+
pgettext = getattr(translations, "pgettext", None)
|
| 282 |
+
npgettext = getattr(translations, "npgettext", None)
|
| 283 |
+
self._install_callables(
|
| 284 |
+
gettext, ngettext, newstyle=newstyle, pgettext=pgettext, npgettext=npgettext
|
| 285 |
+
)
|
| 286 |
+
|
| 287 |
+
def _install_null(self, newstyle: t.Optional[bool] = None) -> None:
|
| 288 |
+
import gettext
|
| 289 |
+
|
| 290 |
+
translations = gettext.NullTranslations()
|
| 291 |
+
|
| 292 |
+
if hasattr(translations, "pgettext"):
|
| 293 |
+
# Python < 3.8
|
| 294 |
+
pgettext = translations.pgettext
|
| 295 |
+
else:
|
| 296 |
+
|
| 297 |
+
def pgettext(c: str, s: str) -> str:
|
| 298 |
+
return s
|
| 299 |
+
|
| 300 |
+
if hasattr(translations, "npgettext"):
|
| 301 |
+
npgettext = translations.npgettext
|
| 302 |
+
else:
|
| 303 |
+
|
| 304 |
+
def npgettext(c: str, s: str, p: str, n: int) -> str:
|
| 305 |
+
return s if n == 1 else p
|
| 306 |
+
|
| 307 |
+
self._install_callables(
|
| 308 |
+
gettext=translations.gettext,
|
| 309 |
+
ngettext=translations.ngettext,
|
| 310 |
+
newstyle=newstyle,
|
| 311 |
+
pgettext=pgettext,
|
| 312 |
+
npgettext=npgettext,
|
| 313 |
+
)
|
| 314 |
+
|
| 315 |
+
def _install_callables(
|
| 316 |
+
self,
|
| 317 |
+
gettext: t.Callable[[str], str],
|
| 318 |
+
ngettext: t.Callable[[str, str, int], str],
|
| 319 |
+
newstyle: t.Optional[bool] = None,
|
| 320 |
+
pgettext: t.Optional[t.Callable[[str, str], str]] = None,
|
| 321 |
+
npgettext: t.Optional[t.Callable[[str, str, str, int], str]] = None,
|
| 322 |
+
) -> None:
|
| 323 |
+
if newstyle is not None:
|
| 324 |
+
self.environment.newstyle_gettext = newstyle # type: ignore
|
| 325 |
+
if self.environment.newstyle_gettext: # type: ignore
|
| 326 |
+
gettext = _make_new_gettext(gettext)
|
| 327 |
+
ngettext = _make_new_ngettext(ngettext)
|
| 328 |
+
|
| 329 |
+
if pgettext is not None:
|
| 330 |
+
pgettext = _make_new_pgettext(pgettext)
|
| 331 |
+
|
| 332 |
+
if npgettext is not None:
|
| 333 |
+
npgettext = _make_new_npgettext(npgettext)
|
| 334 |
+
|
| 335 |
+
self.environment.globals.update(
|
| 336 |
+
gettext=gettext, ngettext=ngettext, pgettext=pgettext, npgettext=npgettext
|
| 337 |
+
)
|
| 338 |
+
|
| 339 |
+
def _uninstall(self, translations: "_SupportedTranslations") -> None:
|
| 340 |
+
for key in ("gettext", "ngettext", "pgettext", "npgettext"):
|
| 341 |
+
self.environment.globals.pop(key, None)
|
| 342 |
+
|
| 343 |
+
def _extract(
|
| 344 |
+
self,
|
| 345 |
+
source: t.Union[str, nodes.Template],
|
| 346 |
+
gettext_functions: t.Sequence[str] = GETTEXT_FUNCTIONS,
|
| 347 |
+
) -> t.Iterator[
|
| 348 |
+
t.Tuple[int, str, t.Union[t.Optional[str], t.Tuple[t.Optional[str], ...]]]
|
| 349 |
+
]:
|
| 350 |
+
if isinstance(source, str):
|
| 351 |
+
source = self.environment.parse(source)
|
| 352 |
+
return extract_from_ast(source, gettext_functions)
|
| 353 |
+
|
| 354 |
+
def parse(self, parser: "Parser") -> t.Union[nodes.Node, t.List[nodes.Node]]:
|
| 355 |
+
"""Parse a translatable tag."""
|
| 356 |
+
lineno = next(parser.stream).lineno
|
| 357 |
+
|
| 358 |
+
context = None
|
| 359 |
+
context_token = parser.stream.next_if("string")
|
| 360 |
+
|
| 361 |
+
if context_token is not None:
|
| 362 |
+
context = context_token.value
|
| 363 |
+
|
| 364 |
+
# find all the variables referenced. Additionally a variable can be
|
| 365 |
+
# defined in the body of the trans block too, but this is checked at
|
| 366 |
+
# a later state.
|
| 367 |
+
plural_expr: t.Optional[nodes.Expr] = None
|
| 368 |
+
plural_expr_assignment: t.Optional[nodes.Assign] = None
|
| 369 |
+
num_called_num = False
|
| 370 |
+
variables: t.Dict[str, nodes.Expr] = {}
|
| 371 |
+
trimmed = None
|
| 372 |
+
while parser.stream.current.type != "block_end":
|
| 373 |
+
if variables:
|
| 374 |
+
parser.stream.expect("comma")
|
| 375 |
+
|
| 376 |
+
# skip colon for python compatibility
|
| 377 |
+
if parser.stream.skip_if("colon"):
|
| 378 |
+
break
|
| 379 |
+
|
| 380 |
+
token = parser.stream.expect("name")
|
| 381 |
+
if token.value in variables:
|
| 382 |
+
parser.fail(
|
| 383 |
+
f"translatable variable {token.value!r} defined twice.",
|
| 384 |
+
token.lineno,
|
| 385 |
+
exc=TemplateAssertionError,
|
| 386 |
+
)
|
| 387 |
+
|
| 388 |
+
# expressions
|
| 389 |
+
if parser.stream.current.type == "assign":
|
| 390 |
+
next(parser.stream)
|
| 391 |
+
variables[token.value] = var = parser.parse_expression()
|
| 392 |
+
elif trimmed is None and token.value in ("trimmed", "notrimmed"):
|
| 393 |
+
trimmed = token.value == "trimmed"
|
| 394 |
+
continue
|
| 395 |
+
else:
|
| 396 |
+
variables[token.value] = var = nodes.Name(token.value, "load")
|
| 397 |
+
|
| 398 |
+
if plural_expr is None:
|
| 399 |
+
if isinstance(var, nodes.Call):
|
| 400 |
+
plural_expr = nodes.Name("_trans", "load")
|
| 401 |
+
variables[token.value] = plural_expr
|
| 402 |
+
plural_expr_assignment = nodes.Assign(
|
| 403 |
+
nodes.Name("_trans", "store"), var
|
| 404 |
+
)
|
| 405 |
+
else:
|
| 406 |
+
plural_expr = var
|
| 407 |
+
num_called_num = token.value == "num"
|
| 408 |
+
|
| 409 |
+
parser.stream.expect("block_end")
|
| 410 |
+
|
| 411 |
+
plural = None
|
| 412 |
+
have_plural = False
|
| 413 |
+
referenced = set()
|
| 414 |
+
|
| 415 |
+
# now parse until endtrans or pluralize
|
| 416 |
+
singular_names, singular = self._parse_block(parser, True)
|
| 417 |
+
if singular_names:
|
| 418 |
+
referenced.update(singular_names)
|
| 419 |
+
if plural_expr is None:
|
| 420 |
+
plural_expr = nodes.Name(singular_names[0], "load")
|
| 421 |
+
num_called_num = singular_names[0] == "num"
|
| 422 |
+
|
| 423 |
+
# if we have a pluralize block, we parse that too
|
| 424 |
+
if parser.stream.current.test("name:pluralize"):
|
| 425 |
+
have_plural = True
|
| 426 |
+
next(parser.stream)
|
| 427 |
+
if parser.stream.current.type != "block_end":
|
| 428 |
+
token = parser.stream.expect("name")
|
| 429 |
+
if token.value not in variables:
|
| 430 |
+
parser.fail(
|
| 431 |
+
f"unknown variable {token.value!r} for pluralization",
|
| 432 |
+
token.lineno,
|
| 433 |
+
exc=TemplateAssertionError,
|
| 434 |
+
)
|
| 435 |
+
plural_expr = variables[token.value]
|
| 436 |
+
num_called_num = token.value == "num"
|
| 437 |
+
parser.stream.expect("block_end")
|
| 438 |
+
plural_names, plural = self._parse_block(parser, False)
|
| 439 |
+
next(parser.stream)
|
| 440 |
+
referenced.update(plural_names)
|
| 441 |
+
else:
|
| 442 |
+
next(parser.stream)
|
| 443 |
+
|
| 444 |
+
# register free names as simple name expressions
|
| 445 |
+
for name in referenced:
|
| 446 |
+
if name not in variables:
|
| 447 |
+
variables[name] = nodes.Name(name, "load")
|
| 448 |
+
|
| 449 |
+
if not have_plural:
|
| 450 |
+
plural_expr = None
|
| 451 |
+
elif plural_expr is None:
|
| 452 |
+
parser.fail("pluralize without variables", lineno)
|
| 453 |
+
|
| 454 |
+
if trimmed is None:
|
| 455 |
+
trimmed = self.environment.policies["ext.i18n.trimmed"]
|
| 456 |
+
if trimmed:
|
| 457 |
+
singular = self._trim_whitespace(singular)
|
| 458 |
+
if plural:
|
| 459 |
+
plural = self._trim_whitespace(plural)
|
| 460 |
+
|
| 461 |
+
node = self._make_node(
|
| 462 |
+
singular,
|
| 463 |
+
plural,
|
| 464 |
+
context,
|
| 465 |
+
variables,
|
| 466 |
+
plural_expr,
|
| 467 |
+
bool(referenced),
|
| 468 |
+
num_called_num and have_plural,
|
| 469 |
+
)
|
| 470 |
+
node.set_lineno(lineno)
|
| 471 |
+
if plural_expr_assignment is not None:
|
| 472 |
+
return [plural_expr_assignment, node]
|
| 473 |
+
else:
|
| 474 |
+
return node
|
| 475 |
+
|
| 476 |
+
def _trim_whitespace(self, string: str, _ws_re: t.Pattern[str] = _ws_re) -> str:
|
| 477 |
+
return _ws_re.sub(" ", string.strip())
|
| 478 |
+
|
| 479 |
+
def _parse_block(
|
| 480 |
+
self, parser: "Parser", allow_pluralize: bool
|
| 481 |
+
) -> t.Tuple[t.List[str], str]:
|
| 482 |
+
"""Parse until the next block tag with a given name."""
|
| 483 |
+
referenced = []
|
| 484 |
+
buf = []
|
| 485 |
+
|
| 486 |
+
while True:
|
| 487 |
+
if parser.stream.current.type == "data":
|
| 488 |
+
buf.append(parser.stream.current.value.replace("%", "%%"))
|
| 489 |
+
next(parser.stream)
|
| 490 |
+
elif parser.stream.current.type == "variable_begin":
|
| 491 |
+
next(parser.stream)
|
| 492 |
+
name = parser.stream.expect("name").value
|
| 493 |
+
referenced.append(name)
|
| 494 |
+
buf.append(f"%({name})s")
|
| 495 |
+
parser.stream.expect("variable_end")
|
| 496 |
+
elif parser.stream.current.type == "block_begin":
|
| 497 |
+
next(parser.stream)
|
| 498 |
+
block_name = (
|
| 499 |
+
parser.stream.current.value
|
| 500 |
+
if parser.stream.current.type == "name"
|
| 501 |
+
else None
|
| 502 |
+
)
|
| 503 |
+
if block_name == "endtrans":
|
| 504 |
+
break
|
| 505 |
+
elif block_name == "pluralize":
|
| 506 |
+
if allow_pluralize:
|
| 507 |
+
break
|
| 508 |
+
parser.fail(
|
| 509 |
+
"a translatable section can have only one pluralize section"
|
| 510 |
+
)
|
| 511 |
+
elif block_name == "trans":
|
| 512 |
+
parser.fail(
|
| 513 |
+
"trans blocks can't be nested; did you mean `endtrans`?"
|
| 514 |
+
)
|
| 515 |
+
parser.fail(
|
| 516 |
+
f"control structures in translatable sections are not allowed; "
|
| 517 |
+
f"saw `{block_name}`"
|
| 518 |
+
)
|
| 519 |
+
elif parser.stream.eos:
|
| 520 |
+
parser.fail("unclosed translation block")
|
| 521 |
+
else:
|
| 522 |
+
raise RuntimeError("internal parser error")
|
| 523 |
+
|
| 524 |
+
return referenced, concat(buf)
|
| 525 |
+
|
| 526 |
+
def _make_node(
|
| 527 |
+
self,
|
| 528 |
+
singular: str,
|
| 529 |
+
plural: t.Optional[str],
|
| 530 |
+
context: t.Optional[str],
|
| 531 |
+
variables: t.Dict[str, nodes.Expr],
|
| 532 |
+
plural_expr: t.Optional[nodes.Expr],
|
| 533 |
+
vars_referenced: bool,
|
| 534 |
+
num_called_num: bool,
|
| 535 |
+
) -> nodes.Output:
|
| 536 |
+
"""Generates a useful node from the data provided."""
|
| 537 |
+
newstyle = self.environment.newstyle_gettext # type: ignore
|
| 538 |
+
node: nodes.Expr
|
| 539 |
+
|
| 540 |
+
# no variables referenced? no need to escape for old style
|
| 541 |
+
# gettext invocations only if there are vars.
|
| 542 |
+
if not vars_referenced and not newstyle:
|
| 543 |
+
singular = singular.replace("%%", "%")
|
| 544 |
+
if plural:
|
| 545 |
+
plural = plural.replace("%%", "%")
|
| 546 |
+
|
| 547 |
+
func_name = "gettext"
|
| 548 |
+
func_args: t.List[nodes.Expr] = [nodes.Const(singular)]
|
| 549 |
+
|
| 550 |
+
if context is not None:
|
| 551 |
+
func_args.insert(0, nodes.Const(context))
|
| 552 |
+
func_name = f"p{func_name}"
|
| 553 |
+
|
| 554 |
+
if plural_expr is not None:
|
| 555 |
+
func_name = f"n{func_name}"
|
| 556 |
+
func_args.extend((nodes.Const(plural), plural_expr))
|
| 557 |
+
|
| 558 |
+
node = nodes.Call(nodes.Name(func_name, "load"), func_args, [], None, None)
|
| 559 |
+
|
| 560 |
+
# in case newstyle gettext is used, the method is powerful
|
| 561 |
+
# enough to handle the variable expansion and autoescape
|
| 562 |
+
# handling itself
|
| 563 |
+
if newstyle:
|
| 564 |
+
for key, value in variables.items():
|
| 565 |
+
# the function adds that later anyways in case num was
|
| 566 |
+
# called num, so just skip it.
|
| 567 |
+
if num_called_num and key == "num":
|
| 568 |
+
continue
|
| 569 |
+
node.kwargs.append(nodes.Keyword(key, value))
|
| 570 |
+
|
| 571 |
+
# otherwise do that here
|
| 572 |
+
else:
|
| 573 |
+
# mark the return value as safe if we are in an
|
| 574 |
+
# environment with autoescaping turned on
|
| 575 |
+
node = nodes.MarkSafeIfAutoescape(node)
|
| 576 |
+
if variables:
|
| 577 |
+
node = nodes.Mod(
|
| 578 |
+
node,
|
| 579 |
+
nodes.Dict(
|
| 580 |
+
[
|
| 581 |
+
nodes.Pair(nodes.Const(key), value)
|
| 582 |
+
for key, value in variables.items()
|
| 583 |
+
]
|
| 584 |
+
),
|
| 585 |
+
)
|
| 586 |
+
return nodes.Output([node])
|
| 587 |
+
|
| 588 |
+
|
| 589 |
+
class ExprStmtExtension(Extension):
|
| 590 |
+
"""Adds a `do` tag to Jinja that works like the print statement just
|
| 591 |
+
that it doesn't print the return value.
|
| 592 |
+
"""
|
| 593 |
+
|
| 594 |
+
tags = {"do"}
|
| 595 |
+
|
| 596 |
+
def parse(self, parser: "Parser") -> nodes.ExprStmt:
|
| 597 |
+
node = nodes.ExprStmt(lineno=next(parser.stream).lineno)
|
| 598 |
+
node.node = parser.parse_tuple()
|
| 599 |
+
return node
|
| 600 |
+
|
| 601 |
+
|
| 602 |
+
class LoopControlExtension(Extension):
|
| 603 |
+
"""Adds break and continue to the template engine."""
|
| 604 |
+
|
| 605 |
+
tags = {"break", "continue"}
|
| 606 |
+
|
| 607 |
+
def parse(self, parser: "Parser") -> t.Union[nodes.Break, nodes.Continue]:
|
| 608 |
+
token = next(parser.stream)
|
| 609 |
+
if token.value == "break":
|
| 610 |
+
return nodes.Break(lineno=token.lineno)
|
| 611 |
+
return nodes.Continue(lineno=token.lineno)
|
| 612 |
+
|
| 613 |
+
|
| 614 |
+
class DebugExtension(Extension):
|
| 615 |
+
"""A ``{% debug %}`` tag that dumps the available variables,
|
| 616 |
+
filters, and tests.
|
| 617 |
+
|
| 618 |
+
.. code-block:: html+jinja
|
| 619 |
+
|
| 620 |
+
<pre>{% debug %}</pre>
|
| 621 |
+
|
| 622 |
+
.. code-block:: text
|
| 623 |
+
|
| 624 |
+
{'context': {'cycler': <class 'jinja2.utils.Cycler'>,
|
| 625 |
+
...,
|
| 626 |
+
'namespace': <class 'jinja2.utils.Namespace'>},
|
| 627 |
+
'filters': ['abs', 'attr', 'batch', 'capitalize', 'center', 'count', 'd',
|
| 628 |
+
..., 'urlencode', 'urlize', 'wordcount', 'wordwrap', 'xmlattr'],
|
| 629 |
+
'tests': ['!=', '<', '<=', '==', '>', '>=', 'callable', 'defined',
|
| 630 |
+
..., 'odd', 'sameas', 'sequence', 'string', 'undefined', 'upper']}
|
| 631 |
+
|
| 632 |
+
.. versionadded:: 2.11.0
|
| 633 |
+
"""
|
| 634 |
+
|
| 635 |
+
tags = {"debug"}
|
| 636 |
+
|
| 637 |
+
def parse(self, parser: "Parser") -> nodes.Output:
|
| 638 |
+
lineno = parser.stream.expect("name:debug").lineno
|
| 639 |
+
context = nodes.ContextReference()
|
| 640 |
+
result = self.call_method("_render", [context], lineno=lineno)
|
| 641 |
+
return nodes.Output([result], lineno=lineno)
|
| 642 |
+
|
| 643 |
+
def _render(self, context: Context) -> str:
|
| 644 |
+
result = {
|
| 645 |
+
"context": context.get_all(),
|
| 646 |
+
"filters": sorted(self.environment.filters.keys()),
|
| 647 |
+
"tests": sorted(self.environment.tests.keys()),
|
| 648 |
+
}
|
| 649 |
+
|
| 650 |
+
# Set the depth since the intent is to show the top few names.
|
| 651 |
+
return pprint.pformat(result, depth=3, compact=True)
|
| 652 |
+
|
| 653 |
+
|
| 654 |
+
def extract_from_ast(
|
| 655 |
+
ast: nodes.Template,
|
| 656 |
+
gettext_functions: t.Sequence[str] = GETTEXT_FUNCTIONS,
|
| 657 |
+
babel_style: bool = True,
|
| 658 |
+
) -> t.Iterator[
|
| 659 |
+
t.Tuple[int, str, t.Union[t.Optional[str], t.Tuple[t.Optional[str], ...]]]
|
| 660 |
+
]:
|
| 661 |
+
"""Extract localizable strings from the given template node. Per
|
| 662 |
+
default this function returns matches in babel style that means non string
|
| 663 |
+
parameters as well as keyword arguments are returned as `None`. This
|
| 664 |
+
allows Babel to figure out what you really meant if you are using
|
| 665 |
+
gettext functions that allow keyword arguments for placeholder expansion.
|
| 666 |
+
If you don't want that behavior set the `babel_style` parameter to `False`
|
| 667 |
+
which causes only strings to be returned and parameters are always stored
|
| 668 |
+
in tuples. As a consequence invalid gettext calls (calls without a single
|
| 669 |
+
string parameter or string parameters after non-string parameters) are
|
| 670 |
+
skipped.
|
| 671 |
+
|
| 672 |
+
This example explains the behavior:
|
| 673 |
+
|
| 674 |
+
>>> from jinja2 import Environment
|
| 675 |
+
>>> env = Environment()
|
| 676 |
+
>>> node = env.parse('{{ (_("foo"), _(), ngettext("foo", "bar", 42)) }}')
|
| 677 |
+
>>> list(extract_from_ast(node))
|
| 678 |
+
[(1, '_', 'foo'), (1, '_', ()), (1, 'ngettext', ('foo', 'bar', None))]
|
| 679 |
+
>>> list(extract_from_ast(node, babel_style=False))
|
| 680 |
+
[(1, '_', ('foo',)), (1, 'ngettext', ('foo', 'bar'))]
|
| 681 |
+
|
| 682 |
+
For every string found this function yields a ``(lineno, function,
|
| 683 |
+
message)`` tuple, where:
|
| 684 |
+
|
| 685 |
+
* ``lineno`` is the number of the line on which the string was found,
|
| 686 |
+
* ``function`` is the name of the ``gettext`` function used (if the
|
| 687 |
+
string was extracted from embedded Python code), and
|
| 688 |
+
* ``message`` is the string, or a tuple of strings for functions
|
| 689 |
+
with multiple string arguments.
|
| 690 |
+
|
| 691 |
+
This extraction function operates on the AST and is because of that unable
|
| 692 |
+
to extract any comments. For comment support you have to use the babel
|
| 693 |
+
extraction interface or extract comments yourself.
|
| 694 |
+
"""
|
| 695 |
+
out: t.Union[t.Optional[str], t.Tuple[t.Optional[str], ...]]
|
| 696 |
+
|
| 697 |
+
for node in ast.find_all(nodes.Call):
|
| 698 |
+
if (
|
| 699 |
+
not isinstance(node.node, nodes.Name)
|
| 700 |
+
or node.node.name not in gettext_functions
|
| 701 |
+
):
|
| 702 |
+
continue
|
| 703 |
+
|
| 704 |
+
strings: t.List[t.Optional[str]] = []
|
| 705 |
+
|
| 706 |
+
for arg in node.args:
|
| 707 |
+
if isinstance(arg, nodes.Const) and isinstance(arg.value, str):
|
| 708 |
+
strings.append(arg.value)
|
| 709 |
+
else:
|
| 710 |
+
strings.append(None)
|
| 711 |
+
|
| 712 |
+
for _ in node.kwargs:
|
| 713 |
+
strings.append(None)
|
| 714 |
+
if node.dyn_args is not None:
|
| 715 |
+
strings.append(None)
|
| 716 |
+
if node.dyn_kwargs is not None:
|
| 717 |
+
strings.append(None)
|
| 718 |
+
|
| 719 |
+
if not babel_style:
|
| 720 |
+
out = tuple(x for x in strings if x is not None)
|
| 721 |
+
|
| 722 |
+
if not out:
|
| 723 |
+
continue
|
| 724 |
+
else:
|
| 725 |
+
if len(strings) == 1:
|
| 726 |
+
out = strings[0]
|
| 727 |
+
else:
|
| 728 |
+
out = tuple(strings)
|
| 729 |
+
|
| 730 |
+
yield node.lineno, node.node.name, out
|
| 731 |
+
|
| 732 |
+
|
| 733 |
+
class _CommentFinder:
|
| 734 |
+
"""Helper class to find comments in a token stream. Can only
|
| 735 |
+
find comments for gettext calls forwards. Once the comment
|
| 736 |
+
from line 4 is found, a comment for line 1 will not return a
|
| 737 |
+
usable value.
|
| 738 |
+
"""
|
| 739 |
+
|
| 740 |
+
def __init__(
|
| 741 |
+
self, tokens: t.Sequence[t.Tuple[int, str, str]], comment_tags: t.Sequence[str]
|
| 742 |
+
) -> None:
|
| 743 |
+
self.tokens = tokens
|
| 744 |
+
self.comment_tags = comment_tags
|
| 745 |
+
self.offset = 0
|
| 746 |
+
self.last_lineno = 0
|
| 747 |
+
|
| 748 |
+
def find_backwards(self, offset: int) -> t.List[str]:
|
| 749 |
+
try:
|
| 750 |
+
for _, token_type, token_value in reversed(
|
| 751 |
+
self.tokens[self.offset : offset]
|
| 752 |
+
):
|
| 753 |
+
if token_type in ("comment", "linecomment"):
|
| 754 |
+
try:
|
| 755 |
+
prefix, comment = token_value.split(None, 1)
|
| 756 |
+
except ValueError:
|
| 757 |
+
continue
|
| 758 |
+
if prefix in self.comment_tags:
|
| 759 |
+
return [comment.rstrip()]
|
| 760 |
+
return []
|
| 761 |
+
finally:
|
| 762 |
+
self.offset = offset
|
| 763 |
+
|
| 764 |
+
def find_comments(self, lineno: int) -> t.List[str]:
|
| 765 |
+
if not self.comment_tags or self.last_lineno > lineno:
|
| 766 |
+
return []
|
| 767 |
+
for idx, (token_lineno, _, _) in enumerate(self.tokens[self.offset :]):
|
| 768 |
+
if token_lineno > lineno:
|
| 769 |
+
return self.find_backwards(self.offset + idx)
|
| 770 |
+
return self.find_backwards(len(self.tokens))
|
| 771 |
+
|
| 772 |
+
|
| 773 |
+
def babel_extract(
|
| 774 |
+
fileobj: t.BinaryIO,
|
| 775 |
+
keywords: t.Sequence[str],
|
| 776 |
+
comment_tags: t.Sequence[str],
|
| 777 |
+
options: t.Dict[str, t.Any],
|
| 778 |
+
) -> t.Iterator[
|
| 779 |
+
t.Tuple[
|
| 780 |
+
int, str, t.Union[t.Optional[str], t.Tuple[t.Optional[str], ...]], t.List[str]
|
| 781 |
+
]
|
| 782 |
+
]:
|
| 783 |
+
"""Babel extraction method for Jinja templates.
|
| 784 |
+
|
| 785 |
+
.. versionchanged:: 2.3
|
| 786 |
+
Basic support for translation comments was added. If `comment_tags`
|
| 787 |
+
is now set to a list of keywords for extraction, the extractor will
|
| 788 |
+
try to find the best preceding comment that begins with one of the
|
| 789 |
+
keywords. For best results, make sure to not have more than one
|
| 790 |
+
gettext call in one line of code and the matching comment in the
|
| 791 |
+
same line or the line before.
|
| 792 |
+
|
| 793 |
+
.. versionchanged:: 2.5.1
|
| 794 |
+
The `newstyle_gettext` flag can be set to `True` to enable newstyle
|
| 795 |
+
gettext calls.
|
| 796 |
+
|
| 797 |
+
.. versionchanged:: 2.7
|
| 798 |
+
A `silent` option can now be provided. If set to `False` template
|
| 799 |
+
syntax errors are propagated instead of being ignored.
|
| 800 |
+
|
| 801 |
+
:param fileobj: the file-like object the messages should be extracted from
|
| 802 |
+
:param keywords: a list of keywords (i.e. function names) that should be
|
| 803 |
+
recognized as translation functions
|
| 804 |
+
:param comment_tags: a list of translator tags to search for and include
|
| 805 |
+
in the results.
|
| 806 |
+
:param options: a dictionary of additional options (optional)
|
| 807 |
+
:return: an iterator over ``(lineno, funcname, message, comments)`` tuples.
|
| 808 |
+
(comments will be empty currently)
|
| 809 |
+
"""
|
| 810 |
+
extensions: t.Dict[t.Type[Extension], None] = {}
|
| 811 |
+
|
| 812 |
+
for extension_name in options.get("extensions", "").split(","):
|
| 813 |
+
extension_name = extension_name.strip()
|
| 814 |
+
|
| 815 |
+
if not extension_name:
|
| 816 |
+
continue
|
| 817 |
+
|
| 818 |
+
extensions[import_string(extension_name)] = None
|
| 819 |
+
|
| 820 |
+
if InternationalizationExtension not in extensions:
|
| 821 |
+
extensions[InternationalizationExtension] = None
|
| 822 |
+
|
| 823 |
+
def getbool(options: t.Mapping[str, str], key: str, default: bool = False) -> bool:
|
| 824 |
+
return options.get(key, str(default)).lower() in {"1", "on", "yes", "true"}
|
| 825 |
+
|
| 826 |
+
silent = getbool(options, "silent", True)
|
| 827 |
+
environment = Environment(
|
| 828 |
+
options.get("block_start_string", defaults.BLOCK_START_STRING),
|
| 829 |
+
options.get("block_end_string", defaults.BLOCK_END_STRING),
|
| 830 |
+
options.get("variable_start_string", defaults.VARIABLE_START_STRING),
|
| 831 |
+
options.get("variable_end_string", defaults.VARIABLE_END_STRING),
|
| 832 |
+
options.get("comment_start_string", defaults.COMMENT_START_STRING),
|
| 833 |
+
options.get("comment_end_string", defaults.COMMENT_END_STRING),
|
| 834 |
+
options.get("line_statement_prefix") or defaults.LINE_STATEMENT_PREFIX,
|
| 835 |
+
options.get("line_comment_prefix") or defaults.LINE_COMMENT_PREFIX,
|
| 836 |
+
getbool(options, "trim_blocks", defaults.TRIM_BLOCKS),
|
| 837 |
+
getbool(options, "lstrip_blocks", defaults.LSTRIP_BLOCKS),
|
| 838 |
+
defaults.NEWLINE_SEQUENCE,
|
| 839 |
+
getbool(options, "keep_trailing_newline", defaults.KEEP_TRAILING_NEWLINE),
|
| 840 |
+
tuple(extensions),
|
| 841 |
+
cache_size=0,
|
| 842 |
+
auto_reload=False,
|
| 843 |
+
)
|
| 844 |
+
|
| 845 |
+
if getbool(options, "trimmed"):
|
| 846 |
+
environment.policies["ext.i18n.trimmed"] = True
|
| 847 |
+
if getbool(options, "newstyle_gettext"):
|
| 848 |
+
environment.newstyle_gettext = True # type: ignore
|
| 849 |
+
|
| 850 |
+
source = fileobj.read().decode(options.get("encoding", "utf-8"))
|
| 851 |
+
try:
|
| 852 |
+
node = environment.parse(source)
|
| 853 |
+
tokens = list(environment.lex(environment.preprocess(source)))
|
| 854 |
+
except TemplateSyntaxError:
|
| 855 |
+
if not silent:
|
| 856 |
+
raise
|
| 857 |
+
# skip templates with syntax errors
|
| 858 |
+
return
|
| 859 |
+
|
| 860 |
+
finder = _CommentFinder(tokens, comment_tags)
|
| 861 |
+
for lineno, func, message in extract_from_ast(node, keywords):
|
| 862 |
+
yield lineno, func, message, finder.find_comments(lineno)
|
| 863 |
+
|
| 864 |
+
|
| 865 |
+
#: nicer import names
|
| 866 |
+
i18n = InternationalizationExtension
|
| 867 |
+
do = ExprStmtExtension
|
| 868 |
+
loopcontrols = LoopControlExtension
|
| 869 |
+
debug = DebugExtension
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/METADATA
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.1
|
| 2 |
+
Name: nvidia-cuda-nvrtc-cu11
|
| 3 |
+
Version: 11.8.89
|
| 4 |
+
Summary: NVRTC native runtime libraries
|
| 5 |
+
Home-page: https://developer.nvidia.com/cuda-zone
|
| 6 |
+
Author: Nvidia CUDA Installer Team
|
| 7 |
+
Author-email: cuda_installer@nvidia.com
|
| 8 |
+
License: NVIDIA Proprietary Software
|
| 9 |
+
Keywords: cuda,nvidia,runtime,machine learning,deep learning
|
| 10 |
+
Classifier: Development Status :: 4 - Beta
|
| 11 |
+
Classifier: Intended Audience :: Developers
|
| 12 |
+
Classifier: Intended Audience :: Education
|
| 13 |
+
Classifier: Intended Audience :: Science/Research
|
| 14 |
+
Classifier: License :: Other/Proprietary License
|
| 15 |
+
Classifier: Natural Language :: English
|
| 16 |
+
Classifier: Programming Language :: Python :: 3
|
| 17 |
+
Classifier: Programming Language :: Python :: 3.5
|
| 18 |
+
Classifier: Programming Language :: Python :: 3.6
|
| 19 |
+
Classifier: Programming Language :: Python :: 3.7
|
| 20 |
+
Classifier: Programming Language :: Python :: 3.8
|
| 21 |
+
Classifier: Programming Language :: Python :: 3.9
|
| 22 |
+
Classifier: Programming Language :: Python :: 3.10
|
| 23 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 24 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
| 25 |
+
Classifier: Topic :: Scientific/Engineering
|
| 26 |
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
| 27 |
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
| 28 |
+
Classifier: Topic :: Software Development
|
| 29 |
+
Classifier: Topic :: Software Development :: Libraries
|
| 30 |
+
Classifier: Operating System :: Microsoft :: Windows
|
| 31 |
+
Classifier: Operating System :: POSIX :: Linux
|
| 32 |
+
Requires-Python: >=3
|
| 33 |
+
License-File: License.txt
|
| 34 |
+
|
| 35 |
+
NVRTC native runtime libraries
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/RECORD
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
nvidia/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 2 |
+
nvidia/__pycache__/__init__.cpython-311.pyc,,
|
| 3 |
+
nvidia/cuda_nvrtc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 4 |
+
nvidia/cuda_nvrtc/__pycache__/__init__.cpython-311.pyc,,
|
| 5 |
+
nvidia/cuda_nvrtc/include/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 6 |
+
nvidia/cuda_nvrtc/include/__pycache__/__init__.cpython-311.pyc,,
|
| 7 |
+
nvidia/cuda_nvrtc/include/nvrtc.h,sha256=2zGRW1F9jfYLybqdwM5RxJ7EZP5aZzcgBGcsqlbbvKs,30224
|
| 8 |
+
nvidia/cuda_nvrtc/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 9 |
+
nvidia/cuda_nvrtc/lib/__pycache__/__init__.cpython-311.pyc,,
|
| 10 |
+
nvidia/cuda_nvrtc/lib/libnvrtc-builtins.so.11.8,sha256=LcS_aHA06J4RfvgvswApHkgzMZotR3IgBdQO6vuv2q8,7718792
|
| 11 |
+
nvidia/cuda_nvrtc/lib/libnvrtc.so.11.2,sha256=7kQLGF-PYX64mMgB2ZXw3hwj-IxkSUMd9Ldl8K2UUYY,54417560
|
| 12 |
+
nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 13 |
+
nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/License.txt,sha256=rW9YU_ugyg0VnQ9Y1JrkmDDC-Mk_epJki5zpCttMbM0,59262
|
| 14 |
+
nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/METADATA,sha256=92p07kziEfXp2nmuS7oNyZWr7U8iI5jesbRmd4nAfyc,1506
|
| 15 |
+
nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/RECORD,,
|
| 16 |
+
nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/WHEEL,sha256=-kQi_VMfvRQozZJT7HUPMfY-5vLo0LVTmAylNJ3Ft98,106
|
| 17 |
+
nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/top_level.txt,sha256=fTkAtiFuL16nUrB9ytDDtpytz2t0B4NvYTnRzwAhO14,7
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_nvrtc_cu11-11.8.89.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: bdist_wheel (0.37.1)
|
| 3 |
+
Root-Is-Purelib: true
|
| 4 |
+
Tag: py3-none-manylinux1_x86_64
|
| 5 |
+
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/METADATA
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Metadata-Version: 2.1
|
| 2 |
+
Name: nvidia-cuda-runtime-cu11
|
| 3 |
+
Version: 11.8.89
|
| 4 |
+
Summary: CUDA Runtime native Libraries
|
| 5 |
+
Home-page: https://developer.nvidia.com/cuda-zone
|
| 6 |
+
Author: Nvidia CUDA Installer Team
|
| 7 |
+
Author-email: cuda_installer@nvidia.com
|
| 8 |
+
License: NVIDIA Proprietary Software
|
| 9 |
+
Keywords: cuda,nvidia,runtime,machine learning,deep learning
|
| 10 |
+
Classifier: Development Status :: 4 - Beta
|
| 11 |
+
Classifier: Intended Audience :: Developers
|
| 12 |
+
Classifier: Intended Audience :: Education
|
| 13 |
+
Classifier: Intended Audience :: Science/Research
|
| 14 |
+
Classifier: License :: Other/Proprietary License
|
| 15 |
+
Classifier: Natural Language :: English
|
| 16 |
+
Classifier: Programming Language :: Python :: 3
|
| 17 |
+
Classifier: Programming Language :: Python :: 3.5
|
| 18 |
+
Classifier: Programming Language :: Python :: 3.6
|
| 19 |
+
Classifier: Programming Language :: Python :: 3.7
|
| 20 |
+
Classifier: Programming Language :: Python :: 3.8
|
| 21 |
+
Classifier: Programming Language :: Python :: 3.9
|
| 22 |
+
Classifier: Programming Language :: Python :: 3.10
|
| 23 |
+
Classifier: Programming Language :: Python :: 3.11
|
| 24 |
+
Classifier: Programming Language :: Python :: 3 :: Only
|
| 25 |
+
Classifier: Topic :: Scientific/Engineering
|
| 26 |
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
| 27 |
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
| 28 |
+
Classifier: Topic :: Software Development
|
| 29 |
+
Classifier: Topic :: Software Development :: Libraries
|
| 30 |
+
Classifier: Operating System :: Microsoft :: Windows
|
| 31 |
+
Classifier: Operating System :: POSIX :: Linux
|
| 32 |
+
Requires-Python: >=3
|
| 33 |
+
License-File: License.txt
|
| 34 |
+
|
| 35 |
+
CUDA Runtime native Libraries
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/RECORD
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
nvidia/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 2 |
+
nvidia/__pycache__/__init__.cpython-311.pyc,,
|
| 3 |
+
nvidia/cuda_runtime/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 4 |
+
nvidia/cuda_runtime/__pycache__/__init__.cpython-311.pyc,,
|
| 5 |
+
nvidia/cuda_runtime/include/CL/cl.h,sha256=2OqunnI7w8LfRaaOIvwUJOxJ2jEpN_r4DZeQMSvH0I8,77430
|
| 6 |
+
nvidia/cuda_runtime/include/CL/cl.hpp,sha256=q9H85bvcgom7daYH3L1VuQvsvKTnDfnUgyrXyuoBrkM,281251
|
| 7 |
+
nvidia/cuda_runtime/include/CL/cl_egl.h,sha256=HhpFYMrMx3Eaz9NthvSQRexd1BZO7_cmiu-2_-60qMM,4516
|
| 8 |
+
nvidia/cuda_runtime/include/CL/cl_ext.h,sha256=uCwdMHbAcXR3RbLL7THhLpf9Rbp7ZaUpUcKXI1nAsCo,46988
|
| 9 |
+
nvidia/cuda_runtime/include/CL/cl_gl.h,sha256=Z0tbd-ONmjrt-2_RM-qzAWOsMoxmXaiGaaqcN6yfTqI,6436
|
| 10 |
+
nvidia/cuda_runtime/include/CL/cl_gl_ext.h,sha256=aCqqMA6lFPwIrRRcjlVmsLVmJXzALpvBv6i_0D1Zt2s,1326
|
| 11 |
+
nvidia/cuda_runtime/include/CL/cl_platform.h,sha256=xXjdIuQZf2UlLr9p4l6oHul-AYNxoTpz1dDOqNf6uws,44584
|
| 12 |
+
nvidia/cuda_runtime/include/CL/opencl.h,sha256=GwpOnqK_M5StKmfug1_dEgQs1r3XWL8uxLvr6YVORYg,1132
|
| 13 |
+
nvidia/cuda_runtime/include/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 14 |
+
nvidia/cuda_runtime/include/__pycache__/__init__.cpython-311.pyc,,
|
| 15 |
+
nvidia/cuda_runtime/include/builtin_types.h,sha256=JxT9Vf2q2snxTBOL9ACzNmYzTWACO2VOVUu1KdFt7_g,3150
|
| 16 |
+
nvidia/cuda_runtime/include/channel_descriptor.h,sha256=eAVB1Q5coPEy0F-yDdhoDH9l7B9rk5Dcp0eyKVMNEwk,22595
|
| 17 |
+
nvidia/cuda_runtime/include/common_functions.h,sha256=22LTZRVcPZzEH6MJda7nNMCvMgIjSTe0OKR7sEQj6kc,3410
|
| 18 |
+
nvidia/cuda_runtime/include/cooperative_groups.h,sha256=ffMJKQI2MYQYMKidiAEOwYVTA9RaYcOsR441Vj6Gw_w,66376
|
| 19 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/async.h,sha256=xsEHCZP3nuEY3l2p8SU2d1226XiXumUvDP_Gyh8PdVY,19122
|
| 20 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/coalesced_reduce.h,sha256=vWv1tyxMjSMM2Oc0SdxXhCug_PwaBM6u8iMLjKyeqjE,4561
|
| 21 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/coalesced_scan.h,sha256=DfZv5d5W0XJv-tZVhgrIdjLjs6aCx_u0oy1lDIpjo1Q,7314
|
| 22 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/driver_abi.h,sha256=v-ZUb4UgGKJk6NR2WCWHD3x_42y-togI1urFn70Gi-g,3964
|
| 23 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/functional.h,sha256=k5kSXKm8oV5o0zPAb5UUBUNx6K9biylBML2U1DofOL8,8503
|
| 24 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/helpers.h,sha256=6dJzOEpvm_xJB9UM7jaWEZkZ2WU_40zU1qmH0UInz-g,27207
|
| 25 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/info.h,sha256=UzPdCvuGmFbTzUdPHFmr2LZ0dQf8AjccAqscmC4RoIc,11936
|
| 26 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/partitioning.h,sha256=8hCh6F8sfkyfRgMirC37Nqv-b-gIY3A_J0eMYqmD2zU,6001
|
| 27 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/reduce.h,sha256=TdlPyPNXTRyS1UIZSp9E98zImo-CDnmXL7F5uuzXxzk,22399
|
| 28 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/scan.h,sha256=hxWd_yNk2AE5UXBBJ9GJH7wg0sgT_V4sQLToi1C4Q00,17421
|
| 29 |
+
nvidia/cuda_runtime/include/cooperative_groups/details/sync.h,sha256=djyXsKuJTax1vTnG5oKPYkRu8nM6o2OJO9F_WIYJNzk,10218
|
| 30 |
+
nvidia/cuda_runtime/include/cooperative_groups/memcpy_async.h,sha256=erOIHuObdfxRhBWfrXE3wsZF4B2GUuqwzQrsPwKPpbg,2960
|
| 31 |
+
nvidia/cuda_runtime/include/cooperative_groups/reduce.h,sha256=B0hgDkqM-6ueqTTgb3b34A0RH4vGz8mBf5e2jT1dJ1o,2949
|
| 32 |
+
nvidia/cuda_runtime/include/cooperative_groups/scan.h,sha256=2EU6T5cWNwftm2B7FicV31PojoI61yo5fHXGRYkGk40,2940
|
| 33 |
+
nvidia/cuda_runtime/include/cuComplex.h,sha256=WpcgpaiPhU_o9sTPMcNTEZuyXDIc8x3sz4dUWSztL2g,12186
|
| 34 |
+
nvidia/cuda_runtime/include/cuda.h,sha256=swpKhNoL1tA0kz_EMJVaRkMrIZ0aYfmph1sx6LBJTBI,840786
|
| 35 |
+
nvidia/cuda_runtime/include/cudaEGL.h,sha256=_CwaQ4cEP1vfNyBSSd5qFxznPCYOovF6Cpj-QWSIBq4,39544
|
| 36 |
+
nvidia/cuda_runtime/include/cudaEGLTypedefs.h,sha256=xF_FAN1Kar9oyHJ3cCU7jztTpxX8WylpiuYyYpGGHek,5645
|
| 37 |
+
nvidia/cuda_runtime/include/cudaGL.h,sha256=UDArZVtTx1rphzLuTNkpidx27prdTUv_l6dXCFfkBYc,22401
|
| 38 |
+
nvidia/cuda_runtime/include/cudaGLTypedefs.h,sha256=dClpQI-LuXgF9rPSBsj7OkIg8g_fXDjT0hLZS8TGpOg,6576
|
| 39 |
+
nvidia/cuda_runtime/include/cudaProfilerTypedefs.h,sha256=F2aWLIKv_AhNbxNOaZVcRsxIh0kuscnV8UMWWxkBAlY,3297
|
| 40 |
+
nvidia/cuda_runtime/include/cudaTypedefs.h,sha256=RuI5ctirdk7qJ0MKkYD3pVCAPR4Ax7pBqKw8T4C1jt0,93945
|
| 41 |
+
nvidia/cuda_runtime/include/cudaVDPAU.h,sha256=Np7Nc2Wjaz--hkpbhW6f9aapr-NbcPDAgkot0sJerco,12694
|
| 42 |
+
nvidia/cuda_runtime/include/cudaVDPAUTypedefs.h,sha256=wz8nyOUdwM9mH9JO3QZW-A9dyxt-IufSX7nggSXpCNs,4144
|
| 43 |
+
nvidia/cuda_runtime/include/cuda_awbarrier.h,sha256=LO5WG2CO22kiwgaae5timQ_5u3sJn1H9tyLnWPP6vUw,7600
|
| 44 |
+
nvidia/cuda_runtime/include/cuda_awbarrier_helpers.h,sha256=vFyH7n9Mnt78Z8vG7DQCxa1MAelyBVmhCPdqCfkNOiI,12227
|
| 45 |
+
nvidia/cuda_runtime/include/cuda_awbarrier_primitives.h,sha256=XIkzEZynW8_aDlv-VGOy4ufoTMYntu8CmGSQKq6wv0g,3993
|
| 46 |
+
nvidia/cuda_runtime/include/cuda_bf16.h,sha256=CuV1113z4--_QPdDH1eVgGgBbl_TuSv3mvUAQPqgjxU,139379
|
| 47 |
+
nvidia/cuda_runtime/include/cuda_bf16.hpp,sha256=YYVqbWfqs4DiodvN36GnRoqkNEAyW8MIAVF6NeUcCW0,101353
|
| 48 |
+
nvidia/cuda_runtime/include/cuda_device_runtime_api.h,sha256=YGdzDamS_Fa0zAIawbnNMNwyz6XX9SKJ_rdAnmoEOzc,16574
|
| 49 |
+
nvidia/cuda_runtime/include/cuda_egl_interop.h,sha256=PNWYns30MIytJQHSOh7UbZYlaTX5e0bavzK14tde_C8,37109
|
| 50 |
+
nvidia/cuda_runtime/include/cuda_fp16.h,sha256=33O6OVdPNxXlObODyIibl0c5cue1AHRg0gZ8i1boilo,132563
|
| 51 |
+
nvidia/cuda_runtime/include/cuda_fp16.hpp,sha256=-UjvMb2L2gFHperdhxmOoutEL5GA0Uf5wmRvfYMqyKA,93580
|
| 52 |
+
nvidia/cuda_runtime/include/cuda_fp8.h,sha256=W_1NkOLgNvcxnxRfpmrwgLZIE2PmYREhWv2wohJ0JCk,13358
|
| 53 |
+
nvidia/cuda_runtime/include/cuda_fp8.hpp,sha256=Ph12HdUf-Mt7t1f6RZOReWPGeqN6OeQMKJuBuE5Avsk,56491
|
| 54 |
+
nvidia/cuda_runtime/include/cuda_gl_interop.h,sha256=pBQlAyGKIDmhV33GlBd58Wr4Ej96gTJYJtegddE5S00,18961
|
| 55 |
+
nvidia/cuda_runtime/include/cuda_occupancy.h,sha256=Kr9HyOe-hlRjBAzbINwUYkNgbbIgIjuvKs09UZhMYQo,67179
|
| 56 |
+
nvidia/cuda_runtime/include/cuda_pipeline.h,sha256=0enXG49wN4JajlQi3ahbp2ei_ufTY_Mznic7zfWmKHM,8130
|
| 57 |
+
nvidia/cuda_runtime/include/cuda_pipeline_helpers.h,sha256=FplUvNDL0sk0S0C-cTNmEo-NnueU3jvV1TUdKYjN24c,13828
|
| 58 |
+
nvidia/cuda_runtime/include/cuda_pipeline_primitives.h,sha256=FnJJtuV6rHr6LgL56XDwilcSbFr6W1Hj6mf1AJaMI20,8675
|
| 59 |
+
nvidia/cuda_runtime/include/cuda_runtime.h,sha256=_HEZG1eaHioSl9sxNnOsbRJraBVFdq_5SGOfK1HXtOo,113013
|
| 60 |
+
nvidia/cuda_runtime/include/cuda_runtime_api.h,sha256=hSshhlXKw6Vrp_wy84ydh5EOhfw24DTpgZ7iffT-e-s,569590
|
| 61 |
+
nvidia/cuda_runtime/include/cuda_surface_types.h,sha256=5NdWqB9RlbdWwbIy7lQvrMROt09RrZdmVGP52mcjVkY,4276
|
| 62 |
+
nvidia/cuda_runtime/include/cuda_texture_types.h,sha256=e95H37q_Y02876PJS2HFccs49_5XoAabkWxi3KqI8-0,4781
|
| 63 |
+
nvidia/cuda_runtime/include/cuda_vdpau_interop.h,sha256=O2HI8-3zT9W1lIF4IajpOFbF1ABXtizQyUeVFovPQ-g,7631
|
| 64 |
+
nvidia/cuda_runtime/include/cudart_platform.h,sha256=YN6sKhB0b9w5tGX1IYL7ulJVPrWAiX9A44qLv4EtW5Q,2717
|
| 65 |
+
nvidia/cuda_runtime/include/device_atomic_functions.h,sha256=krPIx_BVDjRoAlLKlAgpjxrpXPcFmIjGx32X0MMEj3s,11359
|
| 66 |
+
nvidia/cuda_runtime/include/device_atomic_functions.hpp,sha256=_UsoVsyP7U-9CUUCbC1QLw6IbFFkKzxk458vLbAXzOY,8149
|
| 67 |
+
nvidia/cuda_runtime/include/device_double_functions.h,sha256=KUxId5Z1fx8SWfLRTxPD7RB-zN7zslzb4n7JaJLfL3I,3452
|
| 68 |
+
nvidia/cuda_runtime/include/device_functions.h,sha256=bWSrhTYE9NQlss7xMSMEVusvto9j2fgUDXWVH2W_cOA,3410
|
| 69 |
+
nvidia/cuda_runtime/include/device_launch_parameters.h,sha256=H1_CC-vvAaS26ys4XsTFkMgTxUTciAjdjswjizkisvQ,3846
|
| 70 |
+
nvidia/cuda_runtime/include/device_types.h,sha256=2LFxoZBJPoA5V0H1EbKTEaXDi3GDJPtzOPdRHDaucIQ,3588
|
| 71 |
+
nvidia/cuda_runtime/include/driver_functions.h,sha256=cN3IjRAz2Mj2Pj35SyxJIkZNDDusnJqaqzBdMzpQKbA,4625
|
| 72 |
+
nvidia/cuda_runtime/include/driver_types.h,sha256=akxjeSPFYbryk_0iBfipSRafuF91-OdGva-t8EvRCyw,141075
|
| 73 |
+
nvidia/cuda_runtime/include/host_config.h,sha256=BscH_GazAZbbotddVzL5RmafbQ-QjRx8f-I1O01IBW8,3380
|
| 74 |
+
nvidia/cuda_runtime/include/host_defines.h,sha256=bBQwQF5C1N1c2qpLV56g1c-weu9Ysgz-gIf2Kn3uz_A,3386
|
| 75 |
+
nvidia/cuda_runtime/include/library_types.h,sha256=yJvoLFw5oBdRqkQgEhIaX-stsMGlxQW9sZoJ4vbQHwI,4766
|
| 76 |
+
nvidia/cuda_runtime/include/math_constants.h,sha256=cV6hAyQe8X7f7MBtaKjjIJq3BycOUDp6I5cizJX5HLw,7608
|
| 77 |
+
nvidia/cuda_runtime/include/math_functions.h,sha256=5XcC6j-fJKttvhwc4hZNoLHNw808a2ZYIOtZ7ry7yd0,3398
|
| 78 |
+
nvidia/cuda_runtime/include/mma.h,sha256=IY_VenxuEncwGq92MhrWUb-Xswh0ekAXLy9Rbxhxa2Y,2932
|
| 79 |
+
nvidia/cuda_runtime/include/sm_20_atomic_functions.h,sha256=5MEzDxmh1n6-GW0jUpJTg9TwYGmut90x3XaKSj_btOo,4342
|
| 80 |
+
nvidia/cuda_runtime/include/sm_20_atomic_functions.hpp,sha256=Cx__BPJKUPeG5qMxZs9ztfIyqWqt0wZDZi4V_5EV4LQ,3929
|
| 81 |
+
nvidia/cuda_runtime/include/sm_20_intrinsics.h,sha256=tVfZqjKaVuVVip0Wz26ucrjhSTote3CnhUQBvfQdVEQ,50660
|
| 82 |
+
nvidia/cuda_runtime/include/sm_20_intrinsics.hpp,sha256=BhEBuXSKBsNGJDBJDtYL0cGRI3wX_w_OIgA5D-YxIWk,7694
|
| 83 |
+
nvidia/cuda_runtime/include/sm_30_intrinsics.h,sha256=QPK_qWRrRJhID4T81cK0l5V86rwkDOVVxFfwyXcyhno,15845
|
| 84 |
+
nvidia/cuda_runtime/include/sm_30_intrinsics.hpp,sha256=s50XwwWIHBhOEnln-KbCW4ObuiYFkzwzdCjSUaYchfY,24480
|
| 85 |
+
nvidia/cuda_runtime/include/sm_32_atomic_functions.h,sha256=5R7T1MjFDQG6IRApz06UDhhQWW3GtaK5jPiJs3gB4Eg,6540
|
| 86 |
+
nvidia/cuda_runtime/include/sm_32_atomic_functions.hpp,sha256=YDveVhaTYKo2WcAhHS8Cbvj5cIi-lcM5YlneVeEjPE4,5377
|
| 87 |
+
nvidia/cuda_runtime/include/sm_32_intrinsics.h,sha256=-nLnJz2dczMLqBxxs610KPQgVOlceuehqlDc7TqhbGI,33197
|
| 88 |
+
nvidia/cuda_runtime/include/sm_32_intrinsics.hpp,sha256=ThPZXghlPZexJUHha8XKnVIKVHeNKVf4GRnrT4kXKm8,70577
|
| 89 |
+
nvidia/cuda_runtime/include/sm_35_atomic_functions.h,sha256=a3XoEsKRCEOf0Q_5Y__rMfmC4pScv4VkUggVgVJVn44,2909
|
| 90 |
+
nvidia/cuda_runtime/include/sm_35_intrinsics.h,sha256=BEiPNO03ZSv5XtMMul5jiTH4oLWlOu3CYkIAgrWslnk,2952
|
| 91 |
+
nvidia/cuda_runtime/include/sm_60_atomic_functions.h,sha256=itW16w99dHIX1h8326fJvf1M0O2YDtFeVKehhtaWWHk,20606
|
| 92 |
+
nvidia/cuda_runtime/include/sm_60_atomic_functions.hpp,sha256=KUhC8VemPcWLCh67xTtv1vOFUIY1cj7wFPnlApfgqd8,15057
|
| 93 |
+
nvidia/cuda_runtime/include/sm_61_intrinsics.h,sha256=tKqN3jCsLBo3YiiEJ7BtAAgnLPJfJqyVjQF9VUVD5tg,5991
|
| 94 |
+
nvidia/cuda_runtime/include/sm_61_intrinsics.hpp,sha256=77N6vZcAtjtq8Ewipa8ZZ7Ydth1KJ-K4ka_8VPgXuts,6748
|
| 95 |
+
nvidia/cuda_runtime/include/surface_functions.h,sha256=O_WV4xsP5G0_9rPs3G7UFKNFQnz9vIJNhNpTMoVNnKI,19773
|
| 96 |
+
nvidia/cuda_runtime/include/surface_indirect_functions.h,sha256=2CEpbKJ1IQACGa4_wIFhskqOceKuoNYYFU9Sv9bWvPk,11930
|
| 97 |
+
nvidia/cuda_runtime/include/surface_types.h,sha256=q_PY3EiCxB-KchtfAB2JQ8DeVFO2CEBJcZQdixqA2D0,4653
|
| 98 |
+
nvidia/cuda_runtime/include/texture_fetch_functions.h,sha256=MEVQSiGWB2diMjZVNBS4G-QALS146Wj_e8Tjel7UqNQ,32714
|
| 99 |
+
nvidia/cuda_runtime/include/texture_indirect_functions.h,sha256=rTw_uCKT2p3dPJp9Mff4SjALuXsuC5x2w3g7YgyIlWM,23039
|
| 100 |
+
nvidia/cuda_runtime/include/texture_types.h,sha256=nfNPS9qNp-PPDVwlS1uM42hvj3R7lt5NuTworBstymw,9058
|
| 101 |
+
nvidia/cuda_runtime/include/vector_functions.h,sha256=R5plWOkFciltO_AS5if8NcmsgDp3cFNq6zFFDd3oofk,7847
|
| 102 |
+
nvidia/cuda_runtime/include/vector_functions.hpp,sha256=afXhNSd3LFTZo96EPtesTLfvxd4nTmLVzgkj967rTRg,10060
|
| 103 |
+
nvidia/cuda_runtime/include/vector_types.h,sha256=ruVFRp8RioWR9mrvLXX9S15ZSJ97wqTjA8ORCJKKzOQ,13206
|
| 104 |
+
nvidia/cuda_runtime/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 105 |
+
nvidia/cuda_runtime/lib/__pycache__/__init__.cpython-311.pyc,,
|
| 106 |
+
nvidia/cuda_runtime/lib/libOpenCL.so.1,sha256=FVLsRLRp2nLlhaKax_0qqY1_mbk2K3-489yy1rYD0_s,30856
|
| 107 |
+
nvidia/cuda_runtime/lib/libcudart.so.11.0,sha256=0NpBrhMjz07rYQEj1p13FBJM_l6_zE5F8CuRDlHFfuY,679264
|
| 108 |
+
nvidia_cuda_runtime_cu11-11.8.89.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 109 |
+
nvidia_cuda_runtime_cu11-11.8.89.dist-info/License.txt,sha256=rW9YU_ugyg0VnQ9Y1JrkmDDC-Mk_epJki5zpCttMbM0,59262
|
| 110 |
+
nvidia_cuda_runtime_cu11-11.8.89.dist-info/METADATA,sha256=YQ1ja7ng9blOtTnQfqjlHmSyDqk2KxUlJcxItX9tU6Y,1506
|
| 111 |
+
nvidia_cuda_runtime_cu11-11.8.89.dist-info/RECORD,,
|
| 112 |
+
nvidia_cuda_runtime_cu11-11.8.89.dist-info/WHEEL,sha256=-kQi_VMfvRQozZJT7HUPMfY-5vLo0LVTmAylNJ3Ft98,106
|
| 113 |
+
nvidia_cuda_runtime_cu11-11.8.89.dist-info/top_level.txt,sha256=fTkAtiFuL16nUrB9ytDDtpytz2t0B4NvYTnRzwAhO14,7
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: bdist_wheel (0.37.1)
|
| 3 |
+
Root-Is-Purelib: true
|
| 4 |
+
Tag: py3-none-manylinux1_x86_64
|
| 5 |
+
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia_cuda_runtime_cu11-11.8.89.dist-info/top_level.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
nvidia
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip-24.3.1.dist-info/RECORD
ADDED
|
@@ -0,0 +1,853 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
../../../bin/pip,sha256=4AtP-3E6RwrI_be51XSXwxRGhxhML-HR3h9VZHLjcu4,270
|
| 2 |
+
../../../bin/pip3,sha256=4AtP-3E6RwrI_be51XSXwxRGhxhML-HR3h9VZHLjcu4,270
|
| 3 |
+
../../../bin/pip3.11,sha256=4AtP-3E6RwrI_be51XSXwxRGhxhML-HR3h9VZHLjcu4,270
|
| 4 |
+
pip-24.3.1.dist-info/AUTHORS.txt,sha256=Cbb630k8EL9FkBzX9Vpi6hpYWrLSlh08eXodL5u0eLI,10925
|
| 5 |
+
pip-24.3.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 6 |
+
pip-24.3.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
|
| 7 |
+
pip-24.3.1.dist-info/METADATA,sha256=V8iCNK1GYbC82PWsLMsASDh9AO4veocRlM4Pn9q2KFI,3677
|
| 8 |
+
pip-24.3.1.dist-info/RECORD,,
|
| 9 |
+
pip-24.3.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 10 |
+
pip-24.3.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
| 11 |
+
pip-24.3.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
|
| 12 |
+
pip-24.3.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
| 13 |
+
pip/__init__.py,sha256=faXY_neeYrA_88plEhkyhwAaYeds7wu5U1iGwP24J0s,357
|
| 14 |
+
pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
|
| 15 |
+
pip/__pip-runner__.py,sha256=cPPWuJ6NK_k-GzfvlejLFgwzmYUROmpAR6QC3Q-vkXQ,1450
|
| 16 |
+
pip/__pycache__/__init__.cpython-311.pyc,,
|
| 17 |
+
pip/__pycache__/__main__.cpython-311.pyc,,
|
| 18 |
+
pip/__pycache__/__pip-runner__.cpython-311.pyc,,
|
| 19 |
+
pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
|
| 20 |
+
pip/_internal/__pycache__/__init__.cpython-311.pyc,,
|
| 21 |
+
pip/_internal/__pycache__/build_env.cpython-311.pyc,,
|
| 22 |
+
pip/_internal/__pycache__/cache.cpython-311.pyc,,
|
| 23 |
+
pip/_internal/__pycache__/configuration.cpython-311.pyc,,
|
| 24 |
+
pip/_internal/__pycache__/exceptions.cpython-311.pyc,,
|
| 25 |
+
pip/_internal/__pycache__/main.cpython-311.pyc,,
|
| 26 |
+
pip/_internal/__pycache__/pyproject.cpython-311.pyc,,
|
| 27 |
+
pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,,
|
| 28 |
+
pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,,
|
| 29 |
+
pip/_internal/build_env.py,sha256=wsTPOWyPTKvUREUcO585OU01kbQufpdigY8fVHv3WIw,10584
|
| 30 |
+
pip/_internal/cache.py,sha256=Jb698p5PNigRtpW5o26wQNkkUv4MnQ94mc471wL63A0,10369
|
| 31 |
+
pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
|
| 32 |
+
pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,,
|
| 33 |
+
pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc,,
|
| 34 |
+
pip/_internal/cli/__pycache__/base_command.cpython-311.pyc,,
|
| 35 |
+
pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc,,
|
| 36 |
+
pip/_internal/cli/__pycache__/command_context.cpython-311.pyc,,
|
| 37 |
+
pip/_internal/cli/__pycache__/index_command.cpython-311.pyc,,
|
| 38 |
+
pip/_internal/cli/__pycache__/main.cpython-311.pyc,,
|
| 39 |
+
pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc,,
|
| 40 |
+
pip/_internal/cli/__pycache__/parser.cpython-311.pyc,,
|
| 41 |
+
pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc,,
|
| 42 |
+
pip/_internal/cli/__pycache__/req_command.cpython-311.pyc,,
|
| 43 |
+
pip/_internal/cli/__pycache__/spinners.cpython-311.pyc,,
|
| 44 |
+
pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc,,
|
| 45 |
+
pip/_internal/cli/autocompletion.py,sha256=Lli3Mr6aDNu7ZkJJFFvwD2-hFxNI6Avz8OwMyS5TVrs,6865
|
| 46 |
+
pip/_internal/cli/base_command.py,sha256=F8nUcSM-Y-MQljJUe724-yxmc5viFXHyM_zH70NmIh4,8289
|
| 47 |
+
pip/_internal/cli/cmdoptions.py,sha256=mDqBr0d0hoztbRJs-PWtcKpqNAc7khU6ZpoesZKocT8,30110
|
| 48 |
+
pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
|
| 49 |
+
pip/_internal/cli/index_command.py,sha256=-0oPTruZGkLSMrWDleZ6UtcKP3G-SImRRuhH0RfVE3o,5631
|
| 50 |
+
pip/_internal/cli/main.py,sha256=BDZef-bWe9g9Jpr4OVs4dDf-845HJsKw835T7AqEnAc,2817
|
| 51 |
+
pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
|
| 52 |
+
pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
|
| 53 |
+
pip/_internal/cli/progress_bars.py,sha256=VgydyqjZvfhqpuNcFDn00QNuA9GxRe9CKrRG8jhPuKU,2723
|
| 54 |
+
pip/_internal/cli/req_command.py,sha256=DqeFhmUMs6o6Ev8qawAcOoYNdAZsfyKS0MZI5jsJYwQ,12250
|
| 55 |
+
pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
|
| 56 |
+
pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
|
| 57 |
+
pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
|
| 58 |
+
pip/_internal/commands/__pycache__/__init__.cpython-311.pyc,,
|
| 59 |
+
pip/_internal/commands/__pycache__/cache.cpython-311.pyc,,
|
| 60 |
+
pip/_internal/commands/__pycache__/check.cpython-311.pyc,,
|
| 61 |
+
pip/_internal/commands/__pycache__/completion.cpython-311.pyc,,
|
| 62 |
+
pip/_internal/commands/__pycache__/configuration.cpython-311.pyc,,
|
| 63 |
+
pip/_internal/commands/__pycache__/debug.cpython-311.pyc,,
|
| 64 |
+
pip/_internal/commands/__pycache__/download.cpython-311.pyc,,
|
| 65 |
+
pip/_internal/commands/__pycache__/freeze.cpython-311.pyc,,
|
| 66 |
+
pip/_internal/commands/__pycache__/hash.cpython-311.pyc,,
|
| 67 |
+
pip/_internal/commands/__pycache__/help.cpython-311.pyc,,
|
| 68 |
+
pip/_internal/commands/__pycache__/index.cpython-311.pyc,,
|
| 69 |
+
pip/_internal/commands/__pycache__/inspect.cpython-311.pyc,,
|
| 70 |
+
pip/_internal/commands/__pycache__/install.cpython-311.pyc,,
|
| 71 |
+
pip/_internal/commands/__pycache__/list.cpython-311.pyc,,
|
| 72 |
+
pip/_internal/commands/__pycache__/search.cpython-311.pyc,,
|
| 73 |
+
pip/_internal/commands/__pycache__/show.cpython-311.pyc,,
|
| 74 |
+
pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc,,
|
| 75 |
+
pip/_internal/commands/__pycache__/wheel.cpython-311.pyc,,
|
| 76 |
+
pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944
|
| 77 |
+
pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
|
| 78 |
+
pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287
|
| 79 |
+
pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
|
| 80 |
+
pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
|
| 81 |
+
pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
|
| 82 |
+
pip/_internal/commands/freeze.py,sha256=2Vt72BYTSm9rzue6d8dNzt8idxWK4Db6Hd-anq7GQ80,3203
|
| 83 |
+
pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
|
| 84 |
+
pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
|
| 85 |
+
pip/_internal/commands/index.py,sha256=RAXxmJwFhVb5S1BYzb5ifX3sn9Na8v2CCVYwSMP8pao,4731
|
| 86 |
+
pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
|
| 87 |
+
pip/_internal/commands/install.py,sha256=iqesiLIZc6Op9uihMQFYRhAA2DQRZUxbM4z1BwXoFls,29428
|
| 88 |
+
pip/_internal/commands/list.py,sha256=oiIzSjLP6__d7dIS3q0Xb5ywsaOThBWRqMyjjKzkPdM,12769
|
| 89 |
+
pip/_internal/commands/search.py,sha256=fWkUQVx_gm8ebbFAlCgqtxKXT9rNahpJ-BI__3HNZpg,5626
|
| 90 |
+
pip/_internal/commands/show.py,sha256=IG9L5uo8w6UA4tI_IlmaxLCoNKPa5JNJCljj3NWs0OE,7507
|
| 91 |
+
pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
|
| 92 |
+
pip/_internal/commands/wheel.py,sha256=eJRhr_qoNNxWAkkdJCNiQM7CXd4E1_YyQhsqJnBPGGg,6414
|
| 93 |
+
pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006
|
| 94 |
+
pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
|
| 95 |
+
pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc,,
|
| 96 |
+
pip/_internal/distributions/__pycache__/base.cpython-311.pyc,,
|
| 97 |
+
pip/_internal/distributions/__pycache__/installed.cpython-311.pyc,,
|
| 98 |
+
pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc,,
|
| 99 |
+
pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc,,
|
| 100 |
+
pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
|
| 101 |
+
pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
|
| 102 |
+
pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
|
| 103 |
+
pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
|
| 104 |
+
pip/_internal/exceptions.py,sha256=2_byISIv3kSnI_9T-Esfxrt0LnTRgcUHyxu0twsHjQY,26481
|
| 105 |
+
pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
|
| 106 |
+
pip/_internal/index/__pycache__/__init__.cpython-311.pyc,,
|
| 107 |
+
pip/_internal/index/__pycache__/collector.cpython-311.pyc,,
|
| 108 |
+
pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,,
|
| 109 |
+
pip/_internal/index/__pycache__/sources.cpython-311.pyc,,
|
| 110 |
+
pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
|
| 111 |
+
pip/_internal/index/package_finder.py,sha256=yRC4xsyudwKnNoU6IXvNoyqYo5ScT7lB6Wa-z2eh7cs,37666
|
| 112 |
+
pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
|
| 113 |
+
pip/_internal/locations/__init__.py,sha256=UaAxeZ_f93FyouuFf4p7SXYF-4WstXuEvd3LbmPCAno,14925
|
| 114 |
+
pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,,
|
| 115 |
+
pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,,
|
| 116 |
+
pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,,
|
| 117 |
+
pip/_internal/locations/__pycache__/base.cpython-311.pyc,,
|
| 118 |
+
pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
|
| 119 |
+
pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
|
| 120 |
+
pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
|
| 121 |
+
pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
|
| 122 |
+
pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339
|
| 123 |
+
pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc,,
|
| 124 |
+
pip/_internal/metadata/__pycache__/_json.cpython-311.pyc,,
|
| 125 |
+
pip/_internal/metadata/__pycache__/base.cpython-311.pyc,,
|
| 126 |
+
pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc,,
|
| 127 |
+
pip/_internal/metadata/_json.py,sha256=P0cAJrH_mtmMZvlZ16ZXm_-izA4lpr5wy08laICuiaA,2644
|
| 128 |
+
pip/_internal/metadata/base.py,sha256=ft0K5XNgI4ETqZnRv2-CtvgYiMOMAeGMAzxT-f6VLJA,25298
|
| 129 |
+
pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
|
| 130 |
+
pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc,,
|
| 131 |
+
pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc,,
|
| 132 |
+
pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,,
|
| 133 |
+
pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,,
|
| 134 |
+
pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
|
| 135 |
+
pip/_internal/metadata/importlib/_dists.py,sha256=anh0mLI-FYRPUhAdipd0Va3YJJc6HelCKQ0bFhY10a0,8017
|
| 136 |
+
pip/_internal/metadata/importlib/_envs.py,sha256=UUB980XSrDWrMpQ1_G45i0r8Hqlg_tg3IPQ63mEqbNc,7431
|
| 137 |
+
pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
|
| 138 |
+
pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
|
| 139 |
+
pip/_internal/models/__pycache__/__init__.cpython-311.pyc,,
|
| 140 |
+
pip/_internal/models/__pycache__/candidate.cpython-311.pyc,,
|
| 141 |
+
pip/_internal/models/__pycache__/direct_url.cpython-311.pyc,,
|
| 142 |
+
pip/_internal/models/__pycache__/format_control.cpython-311.pyc,,
|
| 143 |
+
pip/_internal/models/__pycache__/index.cpython-311.pyc,,
|
| 144 |
+
pip/_internal/models/__pycache__/installation_report.cpython-311.pyc,,
|
| 145 |
+
pip/_internal/models/__pycache__/link.cpython-311.pyc,,
|
| 146 |
+
pip/_internal/models/__pycache__/scheme.cpython-311.pyc,,
|
| 147 |
+
pip/_internal/models/__pycache__/search_scope.cpython-311.pyc,,
|
| 148 |
+
pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc,,
|
| 149 |
+
pip/_internal/models/__pycache__/target_python.cpython-311.pyc,,
|
| 150 |
+
pip/_internal/models/__pycache__/wheel.cpython-311.pyc,,
|
| 151 |
+
pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
|
| 152 |
+
pip/_internal/models/direct_url.py,sha256=uBtY2HHd3TO9cKQJWh0ThvE5FRr-MWRYChRU4IG9HZE,6578
|
| 153 |
+
pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
|
| 154 |
+
pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
|
| 155 |
+
pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
|
| 156 |
+
pip/_internal/models/link.py,sha256=jHax9O-9zlSzEwjBCDkx0OXjKXwBDwOuPwn-PsR8dCs,21034
|
| 157 |
+
pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
|
| 158 |
+
pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
|
| 159 |
+
pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
|
| 160 |
+
pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
|
| 161 |
+
pip/_internal/models/wheel.py,sha256=G7dND_s4ebPkEL7RJ1qCY0QhUUWIIK6AnjWgRATF5no,4539
|
| 162 |
+
pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
|
| 163 |
+
pip/_internal/network/__pycache__/__init__.cpython-311.pyc,,
|
| 164 |
+
pip/_internal/network/__pycache__/auth.cpython-311.pyc,,
|
| 165 |
+
pip/_internal/network/__pycache__/cache.cpython-311.pyc,,
|
| 166 |
+
pip/_internal/network/__pycache__/download.cpython-311.pyc,,
|
| 167 |
+
pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc,,
|
| 168 |
+
pip/_internal/network/__pycache__/session.cpython-311.pyc,,
|
| 169 |
+
pip/_internal/network/__pycache__/utils.cpython-311.pyc,,
|
| 170 |
+
pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,,
|
| 171 |
+
pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
|
| 172 |
+
pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935
|
| 173 |
+
pip/_internal/network/download.py,sha256=FLOP29dPYECBiAi7eEjvAbNkyzaKNqbyjOT2m8HPW8U,6048
|
| 174 |
+
pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
|
| 175 |
+
pip/_internal/network/session.py,sha256=XmanBKjVwPFmh1iJ58q6TDh9xabH37gREuQJ_feuZGA,18741
|
| 176 |
+
pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
|
| 177 |
+
pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838
|
| 178 |
+
pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 179 |
+
pip/_internal/operations/__pycache__/__init__.cpython-311.pyc,,
|
| 180 |
+
pip/_internal/operations/__pycache__/check.cpython-311.pyc,,
|
| 181 |
+
pip/_internal/operations/__pycache__/freeze.cpython-311.pyc,,
|
| 182 |
+
pip/_internal/operations/__pycache__/prepare.cpython-311.pyc,,
|
| 183 |
+
pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 184 |
+
pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc,,
|
| 185 |
+
pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc,,
|
| 186 |
+
pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc,,
|
| 187 |
+
pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc,,
|
| 188 |
+
pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc,,
|
| 189 |
+
pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc,,
|
| 190 |
+
pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc,,
|
| 191 |
+
pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc,,
|
| 192 |
+
pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
|
| 193 |
+
pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
|
| 194 |
+
pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474
|
| 195 |
+
pip/_internal/operations/build/metadata_legacy.py,sha256=8i6i1QZX9m_lKPStEFsHKM0MT4a-CD408JOw99daLmo,2190
|
| 196 |
+
pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
|
| 197 |
+
pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
|
| 198 |
+
pip/_internal/operations/build/wheel_legacy.py,sha256=K-6kNhmj-1xDF45ny1yheMerF0ui4EoQCLzEoHh6-tc,3045
|
| 199 |
+
pip/_internal/operations/check.py,sha256=L24vRL8VWbyywdoeAhM89WCd8zLTnjIbULlKelUgIec,5912
|
| 200 |
+
pip/_internal/operations/freeze.py,sha256=V59yEyCSz_YhZuhH09-6aV_zvYBMrS_IxFFNqn2QzlA,9864
|
| 201 |
+
pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
|
| 202 |
+
pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc,,
|
| 203 |
+
pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc,,
|
| 204 |
+
pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc,,
|
| 205 |
+
pip/_internal/operations/install/editable_legacy.py,sha256=PoEsNEPGbIZ2yQphPsmYTKLOCMs4gv5OcCdzW124NcA,1283
|
| 206 |
+
pip/_internal/operations/install/wheel.py,sha256=X5Iz9yUg5LlK5VNQ9g2ikc6dcRu8EPi_SUi5iuEDRgo,27615
|
| 207 |
+
pip/_internal/operations/prepare.py,sha256=joWJwPkuqGscQgVNImLK71e9hRapwKvRCM8HclysmvU,28118
|
| 208 |
+
pip/_internal/pyproject.py,sha256=rw4fwlptDp1hZgYoplwbAGwWA32sWQkp7ysf8Ju6iXc,7287
|
| 209 |
+
pip/_internal/req/__init__.py,sha256=HxBFtZy_BbCclLgr26waMtpzYdO5T3vxePvpGAXSt5s,2653
|
| 210 |
+
pip/_internal/req/__pycache__/__init__.cpython-311.pyc,,
|
| 211 |
+
pip/_internal/req/__pycache__/constructors.cpython-311.pyc,,
|
| 212 |
+
pip/_internal/req/__pycache__/req_file.cpython-311.pyc,,
|
| 213 |
+
pip/_internal/req/__pycache__/req_install.cpython-311.pyc,,
|
| 214 |
+
pip/_internal/req/__pycache__/req_set.cpython-311.pyc,,
|
| 215 |
+
pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,,
|
| 216 |
+
pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
|
| 217 |
+
pip/_internal/req/req_file.py,sha256=gOOJTzL-mDRPcQhjwqjDrjn4V-3rK9TnEFnU3v8RA4Q,18752
|
| 218 |
+
pip/_internal/req/req_install.py,sha256=yhT98NGDoAEk03jznTJnYCznzhiMEEA2ocgsUG_dcNU,35788
|
| 219 |
+
pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
|
| 220 |
+
pip/_internal/req/req_uninstall.py,sha256=qzDIxJo-OETWqGais7tSMCDcWbATYABT-Tid3ityF0s,23853
|
| 221 |
+
pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 222 |
+
pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc,,
|
| 223 |
+
pip/_internal/resolution/__pycache__/base.cpython-311.pyc,,
|
| 224 |
+
pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
|
| 225 |
+
pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 226 |
+
pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc,,
|
| 227 |
+
pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc,,
|
| 228 |
+
pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
|
| 229 |
+
pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 230 |
+
pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc,,
|
| 231 |
+
pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc,,
|
| 232 |
+
pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc,,
|
| 233 |
+
pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc,,
|
| 234 |
+
pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc,,
|
| 235 |
+
pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc,,
|
| 236 |
+
pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,,
|
| 237 |
+
pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,,
|
| 238 |
+
pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,,
|
| 239 |
+
pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
|
| 240 |
+
pip/_internal/resolution/resolvelib/candidates.py,sha256=5UZ1upNnmqsP-nmEZaDYxaBgCoejw_e2WVGmmAvBxXc,20001
|
| 241 |
+
pip/_internal/resolution/resolvelib/factory.py,sha256=511CaUR41LqjALuFafLVfx15WRvMhxYTdjQCoSvp4gw,32661
|
| 242 |
+
pip/_internal/resolution/resolvelib/found_candidates.py,sha256=9hrTyQqFvl9I7Tji79F1AxHv39Qh1rkJ_7deSHSMfQc,6383
|
| 243 |
+
pip/_internal/resolution/resolvelib/provider.py,sha256=bcsFnYvlmtB80cwVdW1fIwgol8ZNr1f1VHyRTkz47SM,9935
|
| 244 |
+
pip/_internal/resolution/resolvelib/reporter.py,sha256=00JtoXEkTlw0-rl_sl54d71avwOsJHt9GGHcrj5Sza0,3168
|
| 245 |
+
pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
|
| 246 |
+
pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592
|
| 247 |
+
pip/_internal/self_outdated_check.py,sha256=pkjQixuWyQ1vrVxZAaYD6SSHgXuFUnHZybXEWTkh0S0,8145
|
| 248 |
+
pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 249 |
+
pip/_internal/utils/__pycache__/__init__.cpython-311.pyc,,
|
| 250 |
+
pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc,,
|
| 251 |
+
pip/_internal/utils/__pycache__/_log.cpython-311.pyc,,
|
| 252 |
+
pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc,,
|
| 253 |
+
pip/_internal/utils/__pycache__/compat.cpython-311.pyc,,
|
| 254 |
+
pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc,,
|
| 255 |
+
pip/_internal/utils/__pycache__/datetime.cpython-311.pyc,,
|
| 256 |
+
pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc,,
|
| 257 |
+
pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc,,
|
| 258 |
+
pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc,,
|
| 259 |
+
pip/_internal/utils/__pycache__/encoding.cpython-311.pyc,,
|
| 260 |
+
pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc,,
|
| 261 |
+
pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc,,
|
| 262 |
+
pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc,,
|
| 263 |
+
pip/_internal/utils/__pycache__/glibc.cpython-311.pyc,,
|
| 264 |
+
pip/_internal/utils/__pycache__/hashes.cpython-311.pyc,,
|
| 265 |
+
pip/_internal/utils/__pycache__/logging.cpython-311.pyc,,
|
| 266 |
+
pip/_internal/utils/__pycache__/misc.cpython-311.pyc,,
|
| 267 |
+
pip/_internal/utils/__pycache__/packaging.cpython-311.pyc,,
|
| 268 |
+
pip/_internal/utils/__pycache__/retry.cpython-311.pyc,,
|
| 269 |
+
pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc,,
|
| 270 |
+
pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc,,
|
| 271 |
+
pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc,,
|
| 272 |
+
pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc,,
|
| 273 |
+
pip/_internal/utils/__pycache__/urls.cpython-311.pyc,,
|
| 274 |
+
pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc,,
|
| 275 |
+
pip/_internal/utils/__pycache__/wheel.cpython-311.pyc,,
|
| 276 |
+
pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
|
| 277 |
+
pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
|
| 278 |
+
pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
|
| 279 |
+
pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
|
| 280 |
+
pip/_internal/utils/compatibility_tags.py,sha256=OWq5axHpW-MEEPztGdvgADrgJPAcV9a88Rxm4Z8VBs8,6272
|
| 281 |
+
pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
|
| 282 |
+
pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
|
| 283 |
+
pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
|
| 284 |
+
pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
|
| 285 |
+
pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
|
| 286 |
+
pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
|
| 287 |
+
pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
|
| 288 |
+
pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
|
| 289 |
+
pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
|
| 290 |
+
pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
|
| 291 |
+
pip/_internal/utils/logging.py,sha256=7BFKB1uFjdxD5crM-GtwA5T2qjbQ2LPD-gJDuJeDNTg,11606
|
| 292 |
+
pip/_internal/utils/misc.py,sha256=NRV0_2fFhzy1jhvInSBv4dqCmTwct8PV7Kp0m-BPRGM,23530
|
| 293 |
+
pip/_internal/utils/packaging.py,sha256=iI3LH43lVNR4hWBOqF6lFsZq4aycb2j0UcHlmDmcqUg,2109
|
| 294 |
+
pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
|
| 295 |
+
pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
|
| 296 |
+
pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
|
| 297 |
+
pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
|
| 298 |
+
pip/_internal/utils/unpacking.py,sha256=eyDkSsk4nW8ZfiSjNzJduCznpHyaGHVv3ak_LMGsiEM,11951
|
| 299 |
+
pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
|
| 300 |
+
pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
|
| 301 |
+
pip/_internal/utils/wheel.py,sha256=b442jkydFHjXzDy6cMR7MpzWBJ1Q82hR5F33cmcHV3g,4494
|
| 302 |
+
pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
|
| 303 |
+
pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc,,
|
| 304 |
+
pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc,,
|
| 305 |
+
pip/_internal/vcs/__pycache__/git.cpython-311.pyc,,
|
| 306 |
+
pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc,,
|
| 307 |
+
pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc,,
|
| 308 |
+
pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc,,
|
| 309 |
+
pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
|
| 310 |
+
pip/_internal/vcs/git.py,sha256=3tpc9LQA_J4IVW5r5NvWaaSeDzcmJOrSFZN0J8vIKfU,18177
|
| 311 |
+
pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
|
| 312 |
+
pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
|
| 313 |
+
pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
|
| 314 |
+
pip/_internal/wheel_builder.py,sha256=DL3A8LKeRj_ACp11WS5wSgASgPFqeyAeXJKdXfmaWXU,11799
|
| 315 |
+
pip/_vendor/__init__.py,sha256=JYuAXvClhInxIrA2FTp5p-uuWVL7WV6-vEpTs46-Qh4,4873
|
| 316 |
+
pip/_vendor/__pycache__/__init__.cpython-311.pyc,,
|
| 317 |
+
pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc,,
|
| 318 |
+
pip/_vendor/cachecontrol/__init__.py,sha256=GiYoagwPEiJ_xR_lbwWGaoCiPtF_rz4isjfjdDAgHU4,676
|
| 319 |
+
pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc,,
|
| 320 |
+
pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc,,
|
| 321 |
+
pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc,,
|
| 322 |
+
pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc,,
|
| 323 |
+
pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc,,
|
| 324 |
+
pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc,,
|
| 325 |
+
pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc,,
|
| 326 |
+
pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc,,
|
| 327 |
+
pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc,,
|
| 328 |
+
pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
|
| 329 |
+
pip/_vendor/cachecontrol/adapter.py,sha256=fByO_Pd_EOemjWbuocvBWdN85xT0q_TBm2lxS6vD4fk,6355
|
| 330 |
+
pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952
|
| 331 |
+
pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
|
| 332 |
+
pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc,,
|
| 333 |
+
pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc,,
|
| 334 |
+
pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc,,
|
| 335 |
+
pip/_vendor/cachecontrol/caches/file_cache.py,sha256=9AlmmTJc6cslb6k5z_6q0sGPHVrMj8zv-uWy-simmfE,5406
|
| 336 |
+
pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
|
| 337 |
+
pip/_vendor/cachecontrol/controller.py,sha256=o-ejGJlBmpKK8QQLyTPJj0t7siU8XVHXuV8MCybCxQ8,18575
|
| 338 |
+
pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292
|
| 339 |
+
pip/_vendor/cachecontrol/heuristics.py,sha256=IYe4QmHERWsMvtxNrp920WeaIsaTTyqLB14DSheSbtY,4834
|
| 340 |
+
pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 341 |
+
pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
|
| 342 |
+
pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
|
| 343 |
+
pip/_vendor/certifi/__init__.py,sha256=p_GYZrjUwPBUhpLlCZoGb0miKBKSqDAyZC5DvIuqbHQ,94
|
| 344 |
+
pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
|
| 345 |
+
pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,,
|
| 346 |
+
pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,,
|
| 347 |
+
pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,,
|
| 348 |
+
pip/_vendor/certifi/cacert.pem,sha256=lO3rZukXdPyuk6BWUJFOKQliWaXH6HGh9l1GGrUgG0c,299427
|
| 349 |
+
pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
|
| 350 |
+
pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 351 |
+
pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
|
| 352 |
+
pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,,
|
| 353 |
+
pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,,
|
| 354 |
+
pip/_vendor/distlib/__pycache__/database.cpython-311.pyc,,
|
| 355 |
+
pip/_vendor/distlib/__pycache__/index.cpython-311.pyc,,
|
| 356 |
+
pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc,,
|
| 357 |
+
pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc,,
|
| 358 |
+
pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc,,
|
| 359 |
+
pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc,,
|
| 360 |
+
pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc,,
|
| 361 |
+
pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,,
|
| 362 |
+
pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,,
|
| 363 |
+
pip/_vendor/distlib/__pycache__/version.cpython-311.pyc,,
|
| 364 |
+
pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc,,
|
| 365 |
+
pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
|
| 366 |
+
pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
|
| 367 |
+
pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
|
| 368 |
+
pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
|
| 369 |
+
pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
|
| 370 |
+
pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
|
| 371 |
+
pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
|
| 372 |
+
pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
|
| 373 |
+
pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
|
| 374 |
+
pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
|
| 375 |
+
pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
|
| 376 |
+
pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
|
| 377 |
+
pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
|
| 378 |
+
pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
|
| 379 |
+
pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
|
| 380 |
+
pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
|
| 381 |
+
pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
|
| 382 |
+
pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
|
| 383 |
+
pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
|
| 384 |
+
pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
|
| 385 |
+
pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,,
|
| 386 |
+
pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc,,
|
| 387 |
+
pip/_vendor/distro/__pycache__/distro.cpython-311.pyc,,
|
| 388 |
+
pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
|
| 389 |
+
pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 390 |
+
pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
|
| 391 |
+
pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc,,
|
| 392 |
+
pip/_vendor/idna/__pycache__/codec.cpython-311.pyc,,
|
| 393 |
+
pip/_vendor/idna/__pycache__/compat.cpython-311.pyc,,
|
| 394 |
+
pip/_vendor/idna/__pycache__/core.cpython-311.pyc,,
|
| 395 |
+
pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc,,
|
| 396 |
+
pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc,,
|
| 397 |
+
pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc,,
|
| 398 |
+
pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc,,
|
| 399 |
+
pip/_vendor/idna/codec.py,sha256=PS6m-XmdST7Wj7J7ulRMakPDt5EBJyYrT3CPtjh-7t4,3426
|
| 400 |
+
pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
|
| 401 |
+
pip/_vendor/idna/core.py,sha256=lyhpoe2vulEaB_65xhXmoKgO-xUqFDvcwxu5hpNNO4E,12663
|
| 402 |
+
pip/_vendor/idna/idnadata.py,sha256=dqRwytzkjIHMBa2R1lYvHDwACenZPt8eGVu1Y8UBE-E,78320
|
| 403 |
+
pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
|
| 404 |
+
pip/_vendor/idna/package_data.py,sha256=Tkt0KnIeyIlnHddOaz9WSkkislNgokJAuE-p5GorMqo,21
|
| 405 |
+
pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 406 |
+
pip/_vendor/idna/uts46data.py,sha256=1KuksWqLuccPXm2uyRVkhfiFLNIhM_H2m4azCcnOqEU,206503
|
| 407 |
+
pip/_vendor/msgpack/__init__.py,sha256=gsMP7JTECZNUSjvOyIbdhNOkpB9Z8BcGwabVGY2UcdQ,1077
|
| 408 |
+
pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc,,
|
| 409 |
+
pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc,,
|
| 410 |
+
pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc,,
|
| 411 |
+
pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc,,
|
| 412 |
+
pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
|
| 413 |
+
pip/_vendor/msgpack/ext.py,sha256=fKp00BqDLjUtZnPd70Llr138zk8JsCuSpJkkZ5S4dt8,5629
|
| 414 |
+
pip/_vendor/msgpack/fallback.py,sha256=wdUWJkWX2gzfRW9BBCTOuIE1Wvrf5PtBtR8ZtY7G_EE,33175
|
| 415 |
+
pip/_vendor/packaging/__init__.py,sha256=dtw2bNmWCQ9WnMoK3bk_elL1svSlikXtLpZhCFIB9SE,496
|
| 416 |
+
pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc,,
|
| 417 |
+
pip/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc,,
|
| 418 |
+
pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc,,
|
| 419 |
+
pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc,,
|
| 420 |
+
pip/_vendor/packaging/__pycache__/_parser.cpython-311.pyc,,
|
| 421 |
+
pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc,,
|
| 422 |
+
pip/_vendor/packaging/__pycache__/_tokenizer.cpython-311.pyc,,
|
| 423 |
+
pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc,,
|
| 424 |
+
pip/_vendor/packaging/__pycache__/metadata.cpython-311.pyc,,
|
| 425 |
+
pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc,,
|
| 426 |
+
pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc,,
|
| 427 |
+
pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc,,
|
| 428 |
+
pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc,,
|
| 429 |
+
pip/_vendor/packaging/__pycache__/version.cpython-311.pyc,,
|
| 430 |
+
pip/_vendor/packaging/_elffile.py,sha256=_LcJW4YNKywYsl4169B2ukKRqwxjxst_8H0FRVQKlz8,3282
|
| 431 |
+
pip/_vendor/packaging/_manylinux.py,sha256=Xo4V0PZz8sbuVCbTni0t1CR0AHeir_7ib4lTmV8scD4,9586
|
| 432 |
+
pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
|
| 433 |
+
pip/_vendor/packaging/_parser.py,sha256=s_TvTvDNK0NrM2QB3VKThdWFM4Nc0P6JnkObkl3MjpM,10236
|
| 434 |
+
pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
|
| 435 |
+
pip/_vendor/packaging/_tokenizer.py,sha256=J6v5H7Jzvb-g81xp_2QACKwO7LxHQA6ikryMU7zXwN8,5273
|
| 436 |
+
pip/_vendor/packaging/markers.py,sha256=dWKSqn5Sp-jDmOG-W3GfLHKjwhf1IsznbT71VlBoB5M,10671
|
| 437 |
+
pip/_vendor/packaging/metadata.py,sha256=KINuSkJ12u-SyoKNTy_pHNGAfMUtxNvZ53qA1zAKcKI,32349
|
| 438 |
+
pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 439 |
+
pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
|
| 440 |
+
pip/_vendor/packaging/specifiers.py,sha256=HfGgfNJRvrzC759gnnoojHyiWs_DYmcw5PEh5jHH-YE,39738
|
| 441 |
+
pip/_vendor/packaging/tags.py,sha256=Fo6_cit95-7QfcMb16XtI7AUiSMgdwA_hCO_9lV2pz4,21388
|
| 442 |
+
pip/_vendor/packaging/utils.py,sha256=NAdYUwnlAOpkat_RthavX8a07YuVxgGL_vwrx73GSDM,5287
|
| 443 |
+
pip/_vendor/packaging/version.py,sha256=wE4sSVlF-d1H6HFC1vszEe35CwTig_fh4HHIFg95hFE,16210
|
| 444 |
+
pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
|
| 445 |
+
pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc,,
|
| 446 |
+
pip/_vendor/platformdirs/__init__.py,sha256=FTA6LGNm40GwNZt3gG3uLAacWvf2E_2HTmH0rAALGR8,22285
|
| 447 |
+
pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
|
| 448 |
+
pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc,,
|
| 449 |
+
pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc,,
|
| 450 |
+
pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc,,
|
| 451 |
+
pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc,,
|
| 452 |
+
pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc,,
|
| 453 |
+
pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc,,
|
| 454 |
+
pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc,,
|
| 455 |
+
pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc,,
|
| 456 |
+
pip/_vendor/platformdirs/android.py,sha256=xZXY9Jd46WOsxT2U6-5HsNtDZ-IQqxcEUrBLl3hYk4o,9016
|
| 457 |
+
pip/_vendor/platformdirs/api.py,sha256=QBYdUac2eC521ek_y53uD1Dcq-lJX8IgSRVd4InC6uc,8996
|
| 458 |
+
pip/_vendor/platformdirs/macos.py,sha256=wftsbsvq6nZ0WORXSiCrZNkRHz_WKuktl0a6mC7MFkI,5580
|
| 459 |
+
pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 460 |
+
pip/_vendor/platformdirs/unix.py,sha256=Cci9Wqt35dAMsg6HT9nRGHSBW5obb0pR3AE1JJnsCXg,10643
|
| 461 |
+
pip/_vendor/platformdirs/version.py,sha256=r7F76tZRjgQKzrpx_I0_ZMQOMU-PS7eGnHD7zEK3KB0,411
|
| 462 |
+
pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
|
| 463 |
+
pip/_vendor/pygments/__init__.py,sha256=7N1oiaWulw_nCsTY4EEixYLz15pWY5u4uPAFFi-ielU,2983
|
| 464 |
+
pip/_vendor/pygments/__main__.py,sha256=isIhBxLg65nLlXukG4VkMuPfNdd7gFzTZ_R_z3Q8diY,353
|
| 465 |
+
pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc,,
|
| 466 |
+
pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc,,
|
| 467 |
+
pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc,,
|
| 468 |
+
pip/_vendor/pygments/__pycache__/console.cpython-311.pyc,,
|
| 469 |
+
pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc,,
|
| 470 |
+
pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc,,
|
| 471 |
+
pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc,,
|
| 472 |
+
pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc,,
|
| 473 |
+
pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc,,
|
| 474 |
+
pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc,,
|
| 475 |
+
pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc,,
|
| 476 |
+
pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc,,
|
| 477 |
+
pip/_vendor/pygments/__pycache__/style.cpython-311.pyc,,
|
| 478 |
+
pip/_vendor/pygments/__pycache__/token.cpython-311.pyc,,
|
| 479 |
+
pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc,,
|
| 480 |
+
pip/_vendor/pygments/__pycache__/util.cpython-311.pyc,,
|
| 481 |
+
pip/_vendor/pygments/cmdline.py,sha256=LIVzmAunlk9sRJJp54O4KRy9GDIN4Wu13v9p9QzfGPM,23656
|
| 482 |
+
pip/_vendor/pygments/console.py,sha256=yhP9UsLAVmWKVQf2446JJewkA7AiXeeTf4Ieg3Oi2fU,1718
|
| 483 |
+
pip/_vendor/pygments/filter.py,sha256=_ADNPCskD8_GmodHi6_LoVgPU3Zh336aBCT5cOeTMs0,1910
|
| 484 |
+
pip/_vendor/pygments/filters/__init__.py,sha256=RdedK2KWKXlKwR7cvkfr3NUj9YiZQgMgilRMFUg2jPA,40392
|
| 485 |
+
pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc,,
|
| 486 |
+
pip/_vendor/pygments/formatter.py,sha256=jDWBTndlBH2Z5IYZFVDnP0qn1CaTQjTWt7iAGtCnJEg,4390
|
| 487 |
+
pip/_vendor/pygments/formatters/__init__.py,sha256=8No-NUs8rBTSSBJIv4hSEQt2M0cFB4hwAT0snVc2QGE,5385
|
| 488 |
+
pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc,,
|
| 489 |
+
pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc,,
|
| 490 |
+
pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc,,
|
| 491 |
+
pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc,,
|
| 492 |
+
pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc,,
|
| 493 |
+
pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc,,
|
| 494 |
+
pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc,,
|
| 495 |
+
pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc,,
|
| 496 |
+
pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc,,
|
| 497 |
+
pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc,,
|
| 498 |
+
pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc,,
|
| 499 |
+
pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc,,
|
| 500 |
+
pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc,,
|
| 501 |
+
pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc,,
|
| 502 |
+
pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
|
| 503 |
+
pip/_vendor/pygments/formatters/bbcode.py,sha256=3JQLI45tcrQ_kRUMjuab6C7Hb0XUsbVWqqbSn9cMjkI,3320
|
| 504 |
+
pip/_vendor/pygments/formatters/groff.py,sha256=M39k0PaSSZRnxWjqBSVPkF0mu1-Vr7bm6RsFvs-CNN4,5106
|
| 505 |
+
pip/_vendor/pygments/formatters/html.py,sha256=SE2jc3YCqbMS3rZW9EAmDlAUhdVxJ52gA4dileEvCGU,35669
|
| 506 |
+
pip/_vendor/pygments/formatters/img.py,sha256=MwA4xWPLOwh6j7Yc6oHzjuqSPt0M1fh5r-5BTIIUfsU,23287
|
| 507 |
+
pip/_vendor/pygments/formatters/irc.py,sha256=dp1Z0l_ObJ5NFh9MhqLGg5ptG5hgJqedT2Vkutt9v0M,4981
|
| 508 |
+
pip/_vendor/pygments/formatters/latex.py,sha256=XMmhOCqUKDBQtG5mGJNAFYxApqaC5puo5cMmPfK3944,19306
|
| 509 |
+
pip/_vendor/pygments/formatters/other.py,sha256=56PMJOliin-rAUdnRM0i1wsV1GdUPd_dvQq0_UPfF9c,5034
|
| 510 |
+
pip/_vendor/pygments/formatters/pangomarkup.py,sha256=y16U00aVYYEFpeCfGXlYBSMacG425CbfoG8oKbKegIg,2218
|
| 511 |
+
pip/_vendor/pygments/formatters/rtf.py,sha256=ZT90dmcKyJboIB0mArhL7IhE467GXRN0G7QAUgG03To,11957
|
| 512 |
+
pip/_vendor/pygments/formatters/svg.py,sha256=KKsiophPupHuxm0So-MsbQEWOT54IAiSF7hZPmxtKXE,7174
|
| 513 |
+
pip/_vendor/pygments/formatters/terminal.py,sha256=AojNG4MlKq2L6IsC_VnXHu4AbHCBn9Otog6u45XvxeI,4674
|
| 514 |
+
pip/_vendor/pygments/formatters/terminal256.py,sha256=kGkNUVo3FpwjytIDS0if79EuUoroAprcWt3igrcIqT0,11753
|
| 515 |
+
pip/_vendor/pygments/lexer.py,sha256=TYHDt___gNW4axTl2zvPZff-VQi8fPaIh5OKRcVSjUM,35349
|
| 516 |
+
pip/_vendor/pygments/lexers/__init__.py,sha256=pIlxyQJuu_syh9lE080cq8ceVbEVcKp0osAFU5fawJU,12115
|
| 517 |
+
pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc,,
|
| 518 |
+
pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc,,
|
| 519 |
+
pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc,,
|
| 520 |
+
pip/_vendor/pygments/lexers/_mapping.py,sha256=61-h3zr103m01OS5BUq_AfUiL9YI06Ves9ipQ7k4vr4,76097
|
| 521 |
+
pip/_vendor/pygments/lexers/python.py,sha256=2J_YJrPTr_A6fJY_qKiKv0GpgPwHMrlMSeo59qN3fe4,53687
|
| 522 |
+
pip/_vendor/pygments/modeline.py,sha256=gtRYZBS-CKOCDXHhGZqApboHBaZwGH8gznN3O6nuxj4,1005
|
| 523 |
+
pip/_vendor/pygments/plugin.py,sha256=ioeJ3QeoJ-UQhZpY9JL7vbxsTVuwwM7BCu-Jb8nN0AU,1891
|
| 524 |
+
pip/_vendor/pygments/regexopt.py,sha256=Hky4EB13rIXEHQUNkwmCrYqtIlnXDehNR3MztafZ43w,3072
|
| 525 |
+
pip/_vendor/pygments/scanner.py,sha256=NDy3ofK_fHRFK4hIDvxpamG871aewqcsIb6sgTi7Fhk,3092
|
| 526 |
+
pip/_vendor/pygments/sphinxext.py,sha256=iOptJBcqOGPwMEJ2p70PvwpZPIGdvdZ8dxvq6kzxDgA,7981
|
| 527 |
+
pip/_vendor/pygments/style.py,sha256=rSCZWFpg1_DwFMXDU0nEVmAcBHpuQGf9RxvOPPQvKLQ,6420
|
| 528 |
+
pip/_vendor/pygments/styles/__init__.py,sha256=qUk6_1z5KmT8EdJFZYgESmG6P_HJF_2vVrDD7HSCGYY,2042
|
| 529 |
+
pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc,,
|
| 530 |
+
pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-311.pyc,,
|
| 531 |
+
pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
|
| 532 |
+
pip/_vendor/pygments/token.py,sha256=qZwT7LSPy5YBY3JgDjut642CCy7JdQzAfmqD9NmT5j0,6226
|
| 533 |
+
pip/_vendor/pygments/unistring.py,sha256=p5c1i-HhoIhWemy9CUsaN9o39oomYHNxXll0Xfw6tEA,63208
|
| 534 |
+
pip/_vendor/pygments/util.py,sha256=2tj2nS1X9_OpcuSjf8dOET2bDVZhs8cEKd_uT6-Fgg8,10031
|
| 535 |
+
pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491
|
| 536 |
+
pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc,,
|
| 537 |
+
pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc,,
|
| 538 |
+
pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc,,
|
| 539 |
+
pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
|
| 540 |
+
pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920
|
| 541 |
+
pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546
|
| 542 |
+
pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc,,
|
| 543 |
+
pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc,,
|
| 544 |
+
pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927
|
| 545 |
+
pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
|
| 546 |
+
pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc,,
|
| 547 |
+
pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc,,
|
| 548 |
+
pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc,,
|
| 549 |
+
pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc,,
|
| 550 |
+
pip/_vendor/requests/__pycache__/api.cpython-311.pyc,,
|
| 551 |
+
pip/_vendor/requests/__pycache__/auth.cpython-311.pyc,,
|
| 552 |
+
pip/_vendor/requests/__pycache__/certs.cpython-311.pyc,,
|
| 553 |
+
pip/_vendor/requests/__pycache__/compat.cpython-311.pyc,,
|
| 554 |
+
pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc,,
|
| 555 |
+
pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc,,
|
| 556 |
+
pip/_vendor/requests/__pycache__/help.cpython-311.pyc,,
|
| 557 |
+
pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc,,
|
| 558 |
+
pip/_vendor/requests/__pycache__/models.cpython-311.pyc,,
|
| 559 |
+
pip/_vendor/requests/__pycache__/packages.cpython-311.pyc,,
|
| 560 |
+
pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc,,
|
| 561 |
+
pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc,,
|
| 562 |
+
pip/_vendor/requests/__pycache__/structures.cpython-311.pyc,,
|
| 563 |
+
pip/_vendor/requests/__pycache__/utils.cpython-311.pyc,,
|
| 564 |
+
pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
|
| 565 |
+
pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
|
| 566 |
+
pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
|
| 567 |
+
pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
|
| 568 |
+
pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
|
| 569 |
+
pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
|
| 570 |
+
pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
|
| 571 |
+
pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
|
| 572 |
+
pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
|
| 573 |
+
pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
|
| 574 |
+
pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
|
| 575 |
+
pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
|
| 576 |
+
pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
|
| 577 |
+
pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
|
| 578 |
+
pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
|
| 579 |
+
pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
|
| 580 |
+
pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
|
| 581 |
+
pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
|
| 582 |
+
pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc,,
|
| 583 |
+
pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc,,
|
| 584 |
+
pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc,,
|
| 585 |
+
pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc,,
|
| 586 |
+
pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc,,
|
| 587 |
+
pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 588 |
+
pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc,,
|
| 589 |
+
pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc,,
|
| 590 |
+
pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
|
| 591 |
+
pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
|
| 592 |
+
pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 593 |
+
pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
|
| 594 |
+
pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
|
| 595 |
+
pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
|
| 596 |
+
pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
|
| 597 |
+
pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
|
| 598 |
+
pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc,,
|
| 599 |
+
pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc,,
|
| 600 |
+
pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc,,
|
| 601 |
+
pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc,,
|
| 602 |
+
pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc,,
|
| 603 |
+
pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc,,
|
| 604 |
+
pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc,,
|
| 605 |
+
pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc,,
|
| 606 |
+
pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc,,
|
| 607 |
+
pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc,,
|
| 608 |
+
pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc,,
|
| 609 |
+
pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc,,
|
| 610 |
+
pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc,,
|
| 611 |
+
pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc,,
|
| 612 |
+
pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc,,
|
| 613 |
+
pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc,,
|
| 614 |
+
pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc,,
|
| 615 |
+
pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc,,
|
| 616 |
+
pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc,,
|
| 617 |
+
pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc,,
|
| 618 |
+
pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc,,
|
| 619 |
+
pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc,,
|
| 620 |
+
pip/_vendor/rich/__pycache__/abc.cpython-311.pyc,,
|
| 621 |
+
pip/_vendor/rich/__pycache__/align.cpython-311.pyc,,
|
| 622 |
+
pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc,,
|
| 623 |
+
pip/_vendor/rich/__pycache__/bar.cpython-311.pyc,,
|
| 624 |
+
pip/_vendor/rich/__pycache__/box.cpython-311.pyc,,
|
| 625 |
+
pip/_vendor/rich/__pycache__/cells.cpython-311.pyc,,
|
| 626 |
+
pip/_vendor/rich/__pycache__/color.cpython-311.pyc,,
|
| 627 |
+
pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc,,
|
| 628 |
+
pip/_vendor/rich/__pycache__/columns.cpython-311.pyc,,
|
| 629 |
+
pip/_vendor/rich/__pycache__/console.cpython-311.pyc,,
|
| 630 |
+
pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc,,
|
| 631 |
+
pip/_vendor/rich/__pycache__/containers.cpython-311.pyc,,
|
| 632 |
+
pip/_vendor/rich/__pycache__/control.cpython-311.pyc,,
|
| 633 |
+
pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc,,
|
| 634 |
+
pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc,,
|
| 635 |
+
pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc,,
|
| 636 |
+
pip/_vendor/rich/__pycache__/errors.cpython-311.pyc,,
|
| 637 |
+
pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc,,
|
| 638 |
+
pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc,,
|
| 639 |
+
pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc,,
|
| 640 |
+
pip/_vendor/rich/__pycache__/json.cpython-311.pyc,,
|
| 641 |
+
pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc,,
|
| 642 |
+
pip/_vendor/rich/__pycache__/layout.cpython-311.pyc,,
|
| 643 |
+
pip/_vendor/rich/__pycache__/live.cpython-311.pyc,,
|
| 644 |
+
pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc,,
|
| 645 |
+
pip/_vendor/rich/__pycache__/logging.cpython-311.pyc,,
|
| 646 |
+
pip/_vendor/rich/__pycache__/markup.cpython-311.pyc,,
|
| 647 |
+
pip/_vendor/rich/__pycache__/measure.cpython-311.pyc,,
|
| 648 |
+
pip/_vendor/rich/__pycache__/padding.cpython-311.pyc,,
|
| 649 |
+
pip/_vendor/rich/__pycache__/pager.cpython-311.pyc,,
|
| 650 |
+
pip/_vendor/rich/__pycache__/palette.cpython-311.pyc,,
|
| 651 |
+
pip/_vendor/rich/__pycache__/panel.cpython-311.pyc,,
|
| 652 |
+
pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc,,
|
| 653 |
+
pip/_vendor/rich/__pycache__/progress.cpython-311.pyc,,
|
| 654 |
+
pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc,,
|
| 655 |
+
pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc,,
|
| 656 |
+
pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc,,
|
| 657 |
+
pip/_vendor/rich/__pycache__/region.cpython-311.pyc,,
|
| 658 |
+
pip/_vendor/rich/__pycache__/repr.cpython-311.pyc,,
|
| 659 |
+
pip/_vendor/rich/__pycache__/rule.cpython-311.pyc,,
|
| 660 |
+
pip/_vendor/rich/__pycache__/scope.cpython-311.pyc,,
|
| 661 |
+
pip/_vendor/rich/__pycache__/screen.cpython-311.pyc,,
|
| 662 |
+
pip/_vendor/rich/__pycache__/segment.cpython-311.pyc,,
|
| 663 |
+
pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc,,
|
| 664 |
+
pip/_vendor/rich/__pycache__/status.cpython-311.pyc,,
|
| 665 |
+
pip/_vendor/rich/__pycache__/style.cpython-311.pyc,,
|
| 666 |
+
pip/_vendor/rich/__pycache__/styled.cpython-311.pyc,,
|
| 667 |
+
pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc,,
|
| 668 |
+
pip/_vendor/rich/__pycache__/table.cpython-311.pyc,,
|
| 669 |
+
pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc,,
|
| 670 |
+
pip/_vendor/rich/__pycache__/text.cpython-311.pyc,,
|
| 671 |
+
pip/_vendor/rich/__pycache__/theme.cpython-311.pyc,,
|
| 672 |
+
pip/_vendor/rich/__pycache__/themes.cpython-311.pyc,,
|
| 673 |
+
pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc,,
|
| 674 |
+
pip/_vendor/rich/__pycache__/tree.cpython-311.pyc,,
|
| 675 |
+
pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
|
| 676 |
+
pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
|
| 677 |
+
pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
|
| 678 |
+
pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
|
| 679 |
+
pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
|
| 680 |
+
pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
|
| 681 |
+
pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
|
| 682 |
+
pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
|
| 683 |
+
pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
|
| 684 |
+
pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387
|
| 685 |
+
pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
|
| 686 |
+
pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
|
| 687 |
+
pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
|
| 688 |
+
pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
|
| 689 |
+
pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
|
| 690 |
+
pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
|
| 691 |
+
pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
|
| 692 |
+
pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
|
| 693 |
+
pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
|
| 694 |
+
pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
|
| 695 |
+
pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
|
| 696 |
+
pip/_vendor/rich/align.py,sha256=sCUkisXkQfoq-IQPyBELfJ8l7LihZJX3HbH8K7Cie-M,10368
|
| 697 |
+
pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906
|
| 698 |
+
pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
|
| 699 |
+
pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
|
| 700 |
+
pip/_vendor/rich/cells.py,sha256=aMmGK4BjXhgE6_JF1ZEGmW3O7mKkE8g84vUnj4Et4To,4780
|
| 701 |
+
pip/_vendor/rich/color.py,sha256=bCRATVdRe5IClJ6Hl62de2PKQ_U4i2MZ4ugjUEg7Tao,18223
|
| 702 |
+
pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
|
| 703 |
+
pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
|
| 704 |
+
pip/_vendor/rich/console.py,sha256=deFZIubq2M9A2MCsKFAsFQlWDvcOMsGuUA07QkOaHIw,99173
|
| 705 |
+
pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
|
| 706 |
+
pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
|
| 707 |
+
pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
|
| 708 |
+
pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082
|
| 709 |
+
pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
|
| 710 |
+
pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
|
| 711 |
+
pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
|
| 712 |
+
pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
|
| 713 |
+
pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508
|
| 714 |
+
pip/_vendor/rich/highlighter.py,sha256=6ZAjUcNhBRajBCo9umFUclyi2xL0-55JL7S0vYGUJu4,9585
|
| 715 |
+
pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
|
| 716 |
+
pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
|
| 717 |
+
pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
|
| 718 |
+
pip/_vendor/rich/live.py,sha256=vUcnJV2LMSK3sQNaILbm0-_B8BpAeiHfcQMAMLfpRe0,14271
|
| 719 |
+
pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
|
| 720 |
+
pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903
|
| 721 |
+
pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
|
| 722 |
+
pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
|
| 723 |
+
pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
|
| 724 |
+
pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
|
| 725 |
+
pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
|
| 726 |
+
pip/_vendor/rich/panel.py,sha256=2Fd1V7e1kHxlPFIusoHY5T7-Cs0RpkrihgVG9ZVqJ4g,10705
|
| 727 |
+
pip/_vendor/rich/pretty.py,sha256=5oIHP_CGWnHEnD0zMdW5qfGC5kHqIKn7zH_eC4crULE,35848
|
| 728 |
+
pip/_vendor/rich/progress.py,sha256=P02xi7T2Ua3qq17o83bkshe4c0v_45cg8VyTj6US6Vg,59715
|
| 729 |
+
pip/_vendor/rich/progress_bar.py,sha256=L4jw8E6Qb_x-jhOrLVhkuMaPmiAhFIl8jHQbWFrKuR8,8164
|
| 730 |
+
pip/_vendor/rich/prompt.py,sha256=wdOn2X8XTJKnLnlw6PoMY7xG4iUPp3ezt4O5gqvpV-E,11304
|
| 731 |
+
pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
|
| 732 |
+
pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 733 |
+
pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
|
| 734 |
+
pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
|
| 735 |
+
pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
|
| 736 |
+
pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
|
| 737 |
+
pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
|
| 738 |
+
pip/_vendor/rich/segment.py,sha256=hU1ueeXqI6YeFa08K9DAjlF2QLxcJY9pwZx7RsXavlk,24246
|
| 739 |
+
pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339
|
| 740 |
+
pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
|
| 741 |
+
pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073
|
| 742 |
+
pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
|
| 743 |
+
pip/_vendor/rich/syntax.py,sha256=TnZDuOD4DeHFbkaVEAji1gf8qgAlMU9Boe_GksMGCkk,35475
|
| 744 |
+
pip/_vendor/rich/table.py,sha256=nGEvAZHF4dy1vT9h9Gj9O5qhSQO3ODAxJv0RY1vnIB8,39680
|
| 745 |
+
pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
|
| 746 |
+
pip/_vendor/rich/text.py,sha256=5rQ3zvNrg5UZKNLecbh7fiw9v3HeFulNVtRY_CBDjjE,47312
|
| 747 |
+
pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777
|
| 748 |
+
pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
|
| 749 |
+
pip/_vendor/rich/traceback.py,sha256=CUpxYLjQWIb6vQQ6O72X0hvDV6caryGqU6UweHgOyCY,29601
|
| 750 |
+
pip/_vendor/rich/tree.py,sha256=meAOUU6sYnoBEOX2ILrPLY9k5bWrWNQKkaiEFvHinXM,9167
|
| 751 |
+
pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
|
| 752 |
+
pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc,,
|
| 753 |
+
pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc,,
|
| 754 |
+
pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc,,
|
| 755 |
+
pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc,,
|
| 756 |
+
pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
|
| 757 |
+
pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
|
| 758 |
+
pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
|
| 759 |
+
pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
|
| 760 |
+
pip/_vendor/truststore/__init__.py,sha256=WIDeyzWm7EVX44g354M25vpRXbeY1lsPH6EmUJUcq4o,1264
|
| 761 |
+
pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc,,
|
| 762 |
+
pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc,,
|
| 763 |
+
pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc,,
|
| 764 |
+
pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc,,
|
| 765 |
+
pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc,,
|
| 766 |
+
pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc,,
|
| 767 |
+
pip/_vendor/truststore/_api.py,sha256=GeXRNTlxPZ3kif4kNoh6JY0oE4QRzTGcgXr6l_X_Gk0,10555
|
| 768 |
+
pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
|
| 769 |
+
pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
|
| 770 |
+
pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
|
| 771 |
+
pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
|
| 772 |
+
pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 773 |
+
pip/_vendor/typing_extensions.py,sha256=78hFl0HpDY-ylHUVCnWdU5nTHxUP2-S-3wEZk6CQmLk,134499
|
| 774 |
+
pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
|
| 775 |
+
pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc,,
|
| 776 |
+
pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc,,
|
| 777 |
+
pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc,,
|
| 778 |
+
pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc,,
|
| 779 |
+
pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc,,
|
| 780 |
+
pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc,,
|
| 781 |
+
pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc,,
|
| 782 |
+
pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc,,
|
| 783 |
+
pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,,
|
| 784 |
+
pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc,,
|
| 785 |
+
pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,,
|
| 786 |
+
pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
|
| 787 |
+
pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
|
| 788 |
+
pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
|
| 789 |
+
pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
|
| 790 |
+
pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 791 |
+
pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,,
|
| 792 |
+
pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc,,
|
| 793 |
+
pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc,,
|
| 794 |
+
pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc,,
|
| 795 |
+
pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc,,
|
| 796 |
+
pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc,,
|
| 797 |
+
pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc,,
|
| 798 |
+
pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
|
| 799 |
+
pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 800 |
+
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc,,
|
| 801 |
+
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc,,
|
| 802 |
+
pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc,,
|
| 803 |
+
pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
|
| 804 |
+
pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
|
| 805 |
+
pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
|
| 806 |
+
pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
|
| 807 |
+
pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
|
| 808 |
+
pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
|
| 809 |
+
pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
|
| 810 |
+
pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
|
| 811 |
+
pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
|
| 812 |
+
pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
|
| 813 |
+
pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 814 |
+
pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc,,
|
| 815 |
+
pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc,,
|
| 816 |
+
pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
| 817 |
+
pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc,,
|
| 818 |
+
pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc,,
|
| 819 |
+
pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc,,
|
| 820 |
+
pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
|
| 821 |
+
pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
|
| 822 |
+
pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
|
| 823 |
+
pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
|
| 824 |
+
pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
|
| 825 |
+
pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
|
| 826 |
+
pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
|
| 827 |
+
pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc,,
|
| 828 |
+
pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc,,
|
| 829 |
+
pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc,,
|
| 830 |
+
pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc,,
|
| 831 |
+
pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc,,
|
| 832 |
+
pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc,,
|
| 833 |
+
pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc,,
|
| 834 |
+
pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc,,
|
| 835 |
+
pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc,,
|
| 836 |
+
pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc,,
|
| 837 |
+
pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc,,
|
| 838 |
+
pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc,,
|
| 839 |
+
pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc,,
|
| 840 |
+
pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
|
| 841 |
+
pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
|
| 842 |
+
pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
|
| 843 |
+
pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
|
| 844 |
+
pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
|
| 845 |
+
pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
|
| 846 |
+
pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
|
| 847 |
+
pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
|
| 848 |
+
pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
|
| 849 |
+
pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
|
| 850 |
+
pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
|
| 851 |
+
pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
|
| 852 |
+
pip/_vendor/vendor.txt,sha256=43152uDtpsunEE29vmLqqKZUosdrbvzIFkzscLB55Cg,332
|
| 853 |
+
pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip-24.3.1.dist-info/WHEEL
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Wheel-Version: 1.0
|
| 2 |
+
Generator: setuptools (75.2.0)
|
| 3 |
+
Root-Is-Purelib: true
|
| 4 |
+
Tag: py3-none-any
|
| 5 |
+
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/__init__.py
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import List, Optional
|
| 2 |
+
|
| 3 |
+
from pip._internal.utils import _log
|
| 4 |
+
|
| 5 |
+
# init_logging() must be called before any call to logging.getLogger()
|
| 6 |
+
# which happens at import of most modules.
|
| 7 |
+
_log.init_logging()
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
def main(args: Optional[List[str]] = None) -> int:
|
| 11 |
+
"""This is preserved for old console scripts that may still be referencing
|
| 12 |
+
it.
|
| 13 |
+
|
| 14 |
+
For additional details, see https://github.com/pypa/pip/issues/7498.
|
| 15 |
+
"""
|
| 16 |
+
from pip._internal.utils.entrypoints import _wrapper
|
| 17 |
+
|
| 18 |
+
return _wrapper(args)
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc
ADDED
|
Binary file (776 Bytes). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc
ADDED
|
Binary file (15.2 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/build_env.py
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Build Environment used for isolation during sdist building
|
| 2 |
+
"""
|
| 3 |
+
|
| 4 |
+
import logging
|
| 5 |
+
import os
|
| 6 |
+
import pathlib
|
| 7 |
+
import site
|
| 8 |
+
import sys
|
| 9 |
+
import textwrap
|
| 10 |
+
from collections import OrderedDict
|
| 11 |
+
from types import TracebackType
|
| 12 |
+
from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
|
| 13 |
+
|
| 14 |
+
from pip._vendor.certifi import where
|
| 15 |
+
from pip._vendor.packaging.version import Version
|
| 16 |
+
|
| 17 |
+
from pip import __file__ as pip_location
|
| 18 |
+
from pip._internal.cli.spinners import open_spinner
|
| 19 |
+
from pip._internal.locations import get_platlib, get_purelib, get_scheme
|
| 20 |
+
from pip._internal.metadata import get_default_environment, get_environment
|
| 21 |
+
from pip._internal.utils.logging import VERBOSE
|
| 22 |
+
from pip._internal.utils.packaging import get_requirement
|
| 23 |
+
from pip._internal.utils.subprocess import call_subprocess
|
| 24 |
+
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
|
| 25 |
+
|
| 26 |
+
if TYPE_CHECKING:
|
| 27 |
+
from pip._internal.index.package_finder import PackageFinder
|
| 28 |
+
|
| 29 |
+
logger = logging.getLogger(__name__)
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
|
| 33 |
+
return (a, b) if a != b else (a,)
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
class _Prefix:
|
| 37 |
+
def __init__(self, path: str) -> None:
|
| 38 |
+
self.path = path
|
| 39 |
+
self.setup = False
|
| 40 |
+
scheme = get_scheme("", prefix=path)
|
| 41 |
+
self.bin_dir = scheme.scripts
|
| 42 |
+
self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def get_runnable_pip() -> str:
|
| 46 |
+
"""Get a file to pass to a Python executable, to run the currently-running pip.
|
| 47 |
+
|
| 48 |
+
This is used to run a pip subprocess, for installing requirements into the build
|
| 49 |
+
environment.
|
| 50 |
+
"""
|
| 51 |
+
source = pathlib.Path(pip_location).resolve().parent
|
| 52 |
+
|
| 53 |
+
if not source.is_dir():
|
| 54 |
+
# This would happen if someone is using pip from inside a zip file. In that
|
| 55 |
+
# case, we can use that directly.
|
| 56 |
+
return str(source)
|
| 57 |
+
|
| 58 |
+
return os.fsdecode(source / "__pip-runner__.py")
|
| 59 |
+
|
| 60 |
+
|
| 61 |
+
def _get_system_sitepackages() -> Set[str]:
|
| 62 |
+
"""Get system site packages
|
| 63 |
+
|
| 64 |
+
Usually from site.getsitepackages,
|
| 65 |
+
but fallback on `get_purelib()/get_platlib()` if unavailable
|
| 66 |
+
(e.g. in a virtualenv created by virtualenv<20)
|
| 67 |
+
|
| 68 |
+
Returns normalized set of strings.
|
| 69 |
+
"""
|
| 70 |
+
if hasattr(site, "getsitepackages"):
|
| 71 |
+
system_sites = site.getsitepackages()
|
| 72 |
+
else:
|
| 73 |
+
# virtualenv < 20 overwrites site.py without getsitepackages
|
| 74 |
+
# fallback on get_purelib/get_platlib.
|
| 75 |
+
# this is known to miss things, but shouldn't in the cases
|
| 76 |
+
# where getsitepackages() has been removed (inside a virtualenv)
|
| 77 |
+
system_sites = [get_purelib(), get_platlib()]
|
| 78 |
+
return {os.path.normcase(path) for path in system_sites}
|
| 79 |
+
|
| 80 |
+
|
| 81 |
+
class BuildEnvironment:
|
| 82 |
+
"""Creates and manages an isolated environment to install build deps"""
|
| 83 |
+
|
| 84 |
+
def __init__(self) -> None:
|
| 85 |
+
temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
|
| 86 |
+
|
| 87 |
+
self._prefixes = OrderedDict(
|
| 88 |
+
(name, _Prefix(os.path.join(temp_dir.path, name)))
|
| 89 |
+
for name in ("normal", "overlay")
|
| 90 |
+
)
|
| 91 |
+
|
| 92 |
+
self._bin_dirs: List[str] = []
|
| 93 |
+
self._lib_dirs: List[str] = []
|
| 94 |
+
for prefix in reversed(list(self._prefixes.values())):
|
| 95 |
+
self._bin_dirs.append(prefix.bin_dir)
|
| 96 |
+
self._lib_dirs.extend(prefix.lib_dirs)
|
| 97 |
+
|
| 98 |
+
# Customize site to:
|
| 99 |
+
# - ensure .pth files are honored
|
| 100 |
+
# - prevent access to system site packages
|
| 101 |
+
system_sites = _get_system_sitepackages()
|
| 102 |
+
|
| 103 |
+
self._site_dir = os.path.join(temp_dir.path, "site")
|
| 104 |
+
if not os.path.exists(self._site_dir):
|
| 105 |
+
os.mkdir(self._site_dir)
|
| 106 |
+
with open(
|
| 107 |
+
os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
|
| 108 |
+
) as fp:
|
| 109 |
+
fp.write(
|
| 110 |
+
textwrap.dedent(
|
| 111 |
+
"""
|
| 112 |
+
import os, site, sys
|
| 113 |
+
|
| 114 |
+
# First, drop system-sites related paths.
|
| 115 |
+
original_sys_path = sys.path[:]
|
| 116 |
+
known_paths = set()
|
| 117 |
+
for path in {system_sites!r}:
|
| 118 |
+
site.addsitedir(path, known_paths=known_paths)
|
| 119 |
+
system_paths = set(
|
| 120 |
+
os.path.normcase(path)
|
| 121 |
+
for path in sys.path[len(original_sys_path):]
|
| 122 |
+
)
|
| 123 |
+
original_sys_path = [
|
| 124 |
+
path for path in original_sys_path
|
| 125 |
+
if os.path.normcase(path) not in system_paths
|
| 126 |
+
]
|
| 127 |
+
sys.path = original_sys_path
|
| 128 |
+
|
| 129 |
+
# Second, add lib directories.
|
| 130 |
+
# ensuring .pth file are processed.
|
| 131 |
+
for path in {lib_dirs!r}:
|
| 132 |
+
assert not path in sys.path
|
| 133 |
+
site.addsitedir(path)
|
| 134 |
+
"""
|
| 135 |
+
).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
|
| 136 |
+
)
|
| 137 |
+
|
| 138 |
+
def __enter__(self) -> None:
|
| 139 |
+
self._save_env = {
|
| 140 |
+
name: os.environ.get(name, None)
|
| 141 |
+
for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
path = self._bin_dirs[:]
|
| 145 |
+
old_path = self._save_env["PATH"]
|
| 146 |
+
if old_path:
|
| 147 |
+
path.extend(old_path.split(os.pathsep))
|
| 148 |
+
|
| 149 |
+
pythonpath = [self._site_dir]
|
| 150 |
+
|
| 151 |
+
os.environ.update(
|
| 152 |
+
{
|
| 153 |
+
"PATH": os.pathsep.join(path),
|
| 154 |
+
"PYTHONNOUSERSITE": "1",
|
| 155 |
+
"PYTHONPATH": os.pathsep.join(pythonpath),
|
| 156 |
+
}
|
| 157 |
+
)
|
| 158 |
+
|
| 159 |
+
def __exit__(
|
| 160 |
+
self,
|
| 161 |
+
exc_type: Optional[Type[BaseException]],
|
| 162 |
+
exc_val: Optional[BaseException],
|
| 163 |
+
exc_tb: Optional[TracebackType],
|
| 164 |
+
) -> None:
|
| 165 |
+
for varname, old_value in self._save_env.items():
|
| 166 |
+
if old_value is None:
|
| 167 |
+
os.environ.pop(varname, None)
|
| 168 |
+
else:
|
| 169 |
+
os.environ[varname] = old_value
|
| 170 |
+
|
| 171 |
+
def check_requirements(
|
| 172 |
+
self, reqs: Iterable[str]
|
| 173 |
+
) -> Tuple[Set[Tuple[str, str]], Set[str]]:
|
| 174 |
+
"""Return 2 sets:
|
| 175 |
+
- conflicting requirements: set of (installed, wanted) reqs tuples
|
| 176 |
+
- missing requirements: set of reqs
|
| 177 |
+
"""
|
| 178 |
+
missing = set()
|
| 179 |
+
conflicting = set()
|
| 180 |
+
if reqs:
|
| 181 |
+
env = (
|
| 182 |
+
get_environment(self._lib_dirs)
|
| 183 |
+
if hasattr(self, "_lib_dirs")
|
| 184 |
+
else get_default_environment()
|
| 185 |
+
)
|
| 186 |
+
for req_str in reqs:
|
| 187 |
+
req = get_requirement(req_str)
|
| 188 |
+
# We're explicitly evaluating with an empty extra value, since build
|
| 189 |
+
# environments are not provided any mechanism to select specific extras.
|
| 190 |
+
if req.marker is not None and not req.marker.evaluate({"extra": ""}):
|
| 191 |
+
continue
|
| 192 |
+
dist = env.get_distribution(req.name)
|
| 193 |
+
if not dist:
|
| 194 |
+
missing.add(req_str)
|
| 195 |
+
continue
|
| 196 |
+
if isinstance(dist.version, Version):
|
| 197 |
+
installed_req_str = f"{req.name}=={dist.version}"
|
| 198 |
+
else:
|
| 199 |
+
installed_req_str = f"{req.name}==={dist.version}"
|
| 200 |
+
if not req.specifier.contains(dist.version, prereleases=True):
|
| 201 |
+
conflicting.add((installed_req_str, req_str))
|
| 202 |
+
# FIXME: Consider direct URL?
|
| 203 |
+
return conflicting, missing
|
| 204 |
+
|
| 205 |
+
def install_requirements(
|
| 206 |
+
self,
|
| 207 |
+
finder: "PackageFinder",
|
| 208 |
+
requirements: Iterable[str],
|
| 209 |
+
prefix_as_string: str,
|
| 210 |
+
*,
|
| 211 |
+
kind: str,
|
| 212 |
+
) -> None:
|
| 213 |
+
prefix = self._prefixes[prefix_as_string]
|
| 214 |
+
assert not prefix.setup
|
| 215 |
+
prefix.setup = True
|
| 216 |
+
if not requirements:
|
| 217 |
+
return
|
| 218 |
+
self._install_requirements(
|
| 219 |
+
get_runnable_pip(),
|
| 220 |
+
finder,
|
| 221 |
+
requirements,
|
| 222 |
+
prefix,
|
| 223 |
+
kind=kind,
|
| 224 |
+
)
|
| 225 |
+
|
| 226 |
+
@staticmethod
|
| 227 |
+
def _install_requirements(
|
| 228 |
+
pip_runnable: str,
|
| 229 |
+
finder: "PackageFinder",
|
| 230 |
+
requirements: Iterable[str],
|
| 231 |
+
prefix: _Prefix,
|
| 232 |
+
*,
|
| 233 |
+
kind: str,
|
| 234 |
+
) -> None:
|
| 235 |
+
args: List[str] = [
|
| 236 |
+
sys.executable,
|
| 237 |
+
pip_runnable,
|
| 238 |
+
"install",
|
| 239 |
+
"--ignore-installed",
|
| 240 |
+
"--no-user",
|
| 241 |
+
"--prefix",
|
| 242 |
+
prefix.path,
|
| 243 |
+
"--no-warn-script-location",
|
| 244 |
+
"--disable-pip-version-check",
|
| 245 |
+
# The prefix specified two lines above, thus
|
| 246 |
+
# target from config file or env var should be ignored
|
| 247 |
+
"--target",
|
| 248 |
+
"",
|
| 249 |
+
]
|
| 250 |
+
if logger.getEffectiveLevel() <= logging.DEBUG:
|
| 251 |
+
args.append("-vv")
|
| 252 |
+
elif logger.getEffectiveLevel() <= VERBOSE:
|
| 253 |
+
args.append("-v")
|
| 254 |
+
for format_control in ("no_binary", "only_binary"):
|
| 255 |
+
formats = getattr(finder.format_control, format_control)
|
| 256 |
+
args.extend(
|
| 257 |
+
(
|
| 258 |
+
"--" + format_control.replace("_", "-"),
|
| 259 |
+
",".join(sorted(formats or {":none:"})),
|
| 260 |
+
)
|
| 261 |
+
)
|
| 262 |
+
|
| 263 |
+
index_urls = finder.index_urls
|
| 264 |
+
if index_urls:
|
| 265 |
+
args.extend(["-i", index_urls[0]])
|
| 266 |
+
for extra_index in index_urls[1:]:
|
| 267 |
+
args.extend(["--extra-index-url", extra_index])
|
| 268 |
+
else:
|
| 269 |
+
args.append("--no-index")
|
| 270 |
+
for link in finder.find_links:
|
| 271 |
+
args.extend(["--find-links", link])
|
| 272 |
+
|
| 273 |
+
for host in finder.trusted_hosts:
|
| 274 |
+
args.extend(["--trusted-host", host])
|
| 275 |
+
if finder.allow_all_prereleases:
|
| 276 |
+
args.append("--pre")
|
| 277 |
+
if finder.prefer_binary:
|
| 278 |
+
args.append("--prefer-binary")
|
| 279 |
+
args.append("--")
|
| 280 |
+
args.extend(requirements)
|
| 281 |
+
extra_environ = {"_PIP_STANDALONE_CERT": where()}
|
| 282 |
+
with open_spinner(f"Installing {kind}") as spinner:
|
| 283 |
+
call_subprocess(
|
| 284 |
+
args,
|
| 285 |
+
command_desc=f"pip subprocess to install {kind}",
|
| 286 |
+
spinner=spinner,
|
| 287 |
+
extra_environ=extra_environ,
|
| 288 |
+
)
|
| 289 |
+
|
| 290 |
+
|
| 291 |
+
class NoOpBuildEnvironment(BuildEnvironment):
|
| 292 |
+
"""A no-op drop-in replacement for BuildEnvironment"""
|
| 293 |
+
|
| 294 |
+
def __init__(self) -> None:
|
| 295 |
+
pass
|
| 296 |
+
|
| 297 |
+
def __enter__(self) -> None:
|
| 298 |
+
pass
|
| 299 |
+
|
| 300 |
+
def __exit__(
|
| 301 |
+
self,
|
| 302 |
+
exc_type: Optional[Type[BaseException]],
|
| 303 |
+
exc_val: Optional[BaseException],
|
| 304 |
+
exc_tb: Optional[TracebackType],
|
| 305 |
+
) -> None:
|
| 306 |
+
pass
|
| 307 |
+
|
| 308 |
+
def cleanup(self) -> None:
|
| 309 |
+
pass
|
| 310 |
+
|
| 311 |
+
def install_requirements(
|
| 312 |
+
self,
|
| 313 |
+
finder: "PackageFinder",
|
| 314 |
+
requirements: Iterable[str],
|
| 315 |
+
prefix_as_string: str,
|
| 316 |
+
*,
|
| 317 |
+
kind: str,
|
| 318 |
+
) -> None:
|
| 319 |
+
raise NotImplementedError()
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__init__.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pip._internal.distributions.base import AbstractDistribution
|
| 2 |
+
from pip._internal.distributions.sdist import SourceDistribution
|
| 3 |
+
from pip._internal.distributions.wheel import WheelDistribution
|
| 4 |
+
from pip._internal.req.req_install import InstallRequirement
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
def make_distribution_for_install_requirement(
|
| 8 |
+
install_req: InstallRequirement,
|
| 9 |
+
) -> AbstractDistribution:
|
| 10 |
+
"""Returns a Distribution for the given InstallRequirement"""
|
| 11 |
+
# Editable requirements will always be source distributions. They use the
|
| 12 |
+
# legacy logic until we create a modern standard for them.
|
| 13 |
+
if install_req.editable:
|
| 14 |
+
return SourceDistribution(install_req)
|
| 15 |
+
|
| 16 |
+
# If it's a wheel, it's a WheelDistribution
|
| 17 |
+
if install_req.is_wheel:
|
| 18 |
+
return WheelDistribution(install_req)
|
| 19 |
+
|
| 20 |
+
# Otherwise, a SourceDistribution
|
| 21 |
+
return SourceDistribution(install_req)
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc
ADDED
|
Binary file (1.87 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc
ADDED
|
Binary file (9.38 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc
ADDED
|
Binary file (2.51 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/base.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import abc
|
| 2 |
+
from typing import TYPE_CHECKING, Optional
|
| 3 |
+
|
| 4 |
+
from pip._internal.metadata.base import BaseDistribution
|
| 5 |
+
from pip._internal.req import InstallRequirement
|
| 6 |
+
|
| 7 |
+
if TYPE_CHECKING:
|
| 8 |
+
from pip._internal.index.package_finder import PackageFinder
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
class AbstractDistribution(metaclass=abc.ABCMeta):
|
| 12 |
+
"""A base class for handling installable artifacts.
|
| 13 |
+
|
| 14 |
+
The requirements for anything installable are as follows:
|
| 15 |
+
|
| 16 |
+
- we must be able to determine the requirement name
|
| 17 |
+
(or we can't correctly handle the non-upgrade case).
|
| 18 |
+
|
| 19 |
+
- for packages with setup requirements, we must also be able
|
| 20 |
+
to determine their requirements without installing additional
|
| 21 |
+
packages (for the same reason as run-time dependencies)
|
| 22 |
+
|
| 23 |
+
- we must be able to create a Distribution object exposing the
|
| 24 |
+
above metadata.
|
| 25 |
+
|
| 26 |
+
- if we need to do work in the build tracker, we must be able to generate a unique
|
| 27 |
+
string to identify the requirement in the build tracker.
|
| 28 |
+
"""
|
| 29 |
+
|
| 30 |
+
def __init__(self, req: InstallRequirement) -> None:
|
| 31 |
+
super().__init__()
|
| 32 |
+
self.req = req
|
| 33 |
+
|
| 34 |
+
@abc.abstractproperty
|
| 35 |
+
def build_tracker_id(self) -> Optional[str]:
|
| 36 |
+
"""A string that uniquely identifies this requirement to the build tracker.
|
| 37 |
+
|
| 38 |
+
If None, then this dist has no work to do in the build tracker, and
|
| 39 |
+
``.prepare_distribution_metadata()`` will not be called."""
|
| 40 |
+
raise NotImplementedError()
|
| 41 |
+
|
| 42 |
+
@abc.abstractmethod
|
| 43 |
+
def get_metadata_distribution(self) -> BaseDistribution:
|
| 44 |
+
raise NotImplementedError()
|
| 45 |
+
|
| 46 |
+
@abc.abstractmethod
|
| 47 |
+
def prepare_distribution_metadata(
|
| 48 |
+
self,
|
| 49 |
+
finder: "PackageFinder",
|
| 50 |
+
build_isolation: bool,
|
| 51 |
+
check_build_deps: bool,
|
| 52 |
+
) -> None:
|
| 53 |
+
raise NotImplementedError()
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/installed.py
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import Optional
|
| 2 |
+
|
| 3 |
+
from pip._internal.distributions.base import AbstractDistribution
|
| 4 |
+
from pip._internal.index.package_finder import PackageFinder
|
| 5 |
+
from pip._internal.metadata import BaseDistribution
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
class InstalledDistribution(AbstractDistribution):
|
| 9 |
+
"""Represents an installed package.
|
| 10 |
+
|
| 11 |
+
This does not need any preparation as the required information has already
|
| 12 |
+
been computed.
|
| 13 |
+
"""
|
| 14 |
+
|
| 15 |
+
@property
|
| 16 |
+
def build_tracker_id(self) -> Optional[str]:
|
| 17 |
+
return None
|
| 18 |
+
|
| 19 |
+
def get_metadata_distribution(self) -> BaseDistribution:
|
| 20 |
+
assert self.req.satisfied_by is not None, "not actually installed"
|
| 21 |
+
return self.req.satisfied_by
|
| 22 |
+
|
| 23 |
+
def prepare_distribution_metadata(
|
| 24 |
+
self,
|
| 25 |
+
finder: PackageFinder,
|
| 26 |
+
build_isolation: bool,
|
| 27 |
+
check_build_deps: bool,
|
| 28 |
+
) -> None:
|
| 29 |
+
pass
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/sdist.py
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import logging
|
| 2 |
+
from typing import TYPE_CHECKING, Iterable, Optional, Set, Tuple
|
| 3 |
+
|
| 4 |
+
from pip._internal.build_env import BuildEnvironment
|
| 5 |
+
from pip._internal.distributions.base import AbstractDistribution
|
| 6 |
+
from pip._internal.exceptions import InstallationError
|
| 7 |
+
from pip._internal.metadata import BaseDistribution
|
| 8 |
+
from pip._internal.utils.subprocess import runner_with_spinner_message
|
| 9 |
+
|
| 10 |
+
if TYPE_CHECKING:
|
| 11 |
+
from pip._internal.index.package_finder import PackageFinder
|
| 12 |
+
|
| 13 |
+
logger = logging.getLogger(__name__)
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class SourceDistribution(AbstractDistribution):
|
| 17 |
+
"""Represents a source distribution.
|
| 18 |
+
|
| 19 |
+
The preparation step for these needs metadata for the packages to be
|
| 20 |
+
generated, either using PEP 517 or using the legacy `setup.py egg_info`.
|
| 21 |
+
"""
|
| 22 |
+
|
| 23 |
+
@property
|
| 24 |
+
def build_tracker_id(self) -> Optional[str]:
|
| 25 |
+
"""Identify this requirement uniquely by its link."""
|
| 26 |
+
assert self.req.link
|
| 27 |
+
return self.req.link.url_without_fragment
|
| 28 |
+
|
| 29 |
+
def get_metadata_distribution(self) -> BaseDistribution:
|
| 30 |
+
return self.req.get_dist()
|
| 31 |
+
|
| 32 |
+
def prepare_distribution_metadata(
|
| 33 |
+
self,
|
| 34 |
+
finder: "PackageFinder",
|
| 35 |
+
build_isolation: bool,
|
| 36 |
+
check_build_deps: bool,
|
| 37 |
+
) -> None:
|
| 38 |
+
# Load pyproject.toml, to determine whether PEP 517 is to be used
|
| 39 |
+
self.req.load_pyproject_toml()
|
| 40 |
+
|
| 41 |
+
# Set up the build isolation, if this requirement should be isolated
|
| 42 |
+
should_isolate = self.req.use_pep517 and build_isolation
|
| 43 |
+
if should_isolate:
|
| 44 |
+
# Setup an isolated environment and install the build backend static
|
| 45 |
+
# requirements in it.
|
| 46 |
+
self._prepare_build_backend(finder)
|
| 47 |
+
# Check that if the requirement is editable, it either supports PEP 660 or
|
| 48 |
+
# has a setup.py or a setup.cfg. This cannot be done earlier because we need
|
| 49 |
+
# to setup the build backend to verify it supports build_editable, nor can
|
| 50 |
+
# it be done later, because we want to avoid installing build requirements
|
| 51 |
+
# needlessly. Doing it here also works around setuptools generating
|
| 52 |
+
# UNKNOWN.egg-info when running get_requires_for_build_wheel on a directory
|
| 53 |
+
# without setup.py nor setup.cfg.
|
| 54 |
+
self.req.isolated_editable_sanity_check()
|
| 55 |
+
# Install the dynamic build requirements.
|
| 56 |
+
self._install_build_reqs(finder)
|
| 57 |
+
# Check if the current environment provides build dependencies
|
| 58 |
+
should_check_deps = self.req.use_pep517 and check_build_deps
|
| 59 |
+
if should_check_deps:
|
| 60 |
+
pyproject_requires = self.req.pyproject_requires
|
| 61 |
+
assert pyproject_requires is not None
|
| 62 |
+
conflicting, missing = self.req.build_env.check_requirements(
|
| 63 |
+
pyproject_requires
|
| 64 |
+
)
|
| 65 |
+
if conflicting:
|
| 66 |
+
self._raise_conflicts("the backend dependencies", conflicting)
|
| 67 |
+
if missing:
|
| 68 |
+
self._raise_missing_reqs(missing)
|
| 69 |
+
self.req.prepare_metadata()
|
| 70 |
+
|
| 71 |
+
def _prepare_build_backend(self, finder: "PackageFinder") -> None:
|
| 72 |
+
# Isolate in a BuildEnvironment and install the build-time
|
| 73 |
+
# requirements.
|
| 74 |
+
pyproject_requires = self.req.pyproject_requires
|
| 75 |
+
assert pyproject_requires is not None
|
| 76 |
+
|
| 77 |
+
self.req.build_env = BuildEnvironment()
|
| 78 |
+
self.req.build_env.install_requirements(
|
| 79 |
+
finder, pyproject_requires, "overlay", kind="build dependencies"
|
| 80 |
+
)
|
| 81 |
+
conflicting, missing = self.req.build_env.check_requirements(
|
| 82 |
+
self.req.requirements_to_check
|
| 83 |
+
)
|
| 84 |
+
if conflicting:
|
| 85 |
+
self._raise_conflicts("PEP 517/518 supported requirements", conflicting)
|
| 86 |
+
if missing:
|
| 87 |
+
logger.warning(
|
| 88 |
+
"Missing build requirements in pyproject.toml for %s.",
|
| 89 |
+
self.req,
|
| 90 |
+
)
|
| 91 |
+
logger.warning(
|
| 92 |
+
"The project does not specify a build backend, and "
|
| 93 |
+
"pip cannot fall back to setuptools without %s.",
|
| 94 |
+
" and ".join(map(repr, sorted(missing))),
|
| 95 |
+
)
|
| 96 |
+
|
| 97 |
+
def _get_build_requires_wheel(self) -> Iterable[str]:
|
| 98 |
+
with self.req.build_env:
|
| 99 |
+
runner = runner_with_spinner_message("Getting requirements to build wheel")
|
| 100 |
+
backend = self.req.pep517_backend
|
| 101 |
+
assert backend is not None
|
| 102 |
+
with backend.subprocess_runner(runner):
|
| 103 |
+
return backend.get_requires_for_build_wheel()
|
| 104 |
+
|
| 105 |
+
def _get_build_requires_editable(self) -> Iterable[str]:
|
| 106 |
+
with self.req.build_env:
|
| 107 |
+
runner = runner_with_spinner_message(
|
| 108 |
+
"Getting requirements to build editable"
|
| 109 |
+
)
|
| 110 |
+
backend = self.req.pep517_backend
|
| 111 |
+
assert backend is not None
|
| 112 |
+
with backend.subprocess_runner(runner):
|
| 113 |
+
return backend.get_requires_for_build_editable()
|
| 114 |
+
|
| 115 |
+
def _install_build_reqs(self, finder: "PackageFinder") -> None:
|
| 116 |
+
# Install any extra build dependencies that the backend requests.
|
| 117 |
+
# This must be done in a second pass, as the pyproject.toml
|
| 118 |
+
# dependencies must be installed before we can call the backend.
|
| 119 |
+
if (
|
| 120 |
+
self.req.editable
|
| 121 |
+
and self.req.permit_editable_wheels
|
| 122 |
+
and self.req.supports_pyproject_editable
|
| 123 |
+
):
|
| 124 |
+
build_reqs = self._get_build_requires_editable()
|
| 125 |
+
else:
|
| 126 |
+
build_reqs = self._get_build_requires_wheel()
|
| 127 |
+
conflicting, missing = self.req.build_env.check_requirements(build_reqs)
|
| 128 |
+
if conflicting:
|
| 129 |
+
self._raise_conflicts("the backend dependencies", conflicting)
|
| 130 |
+
self.req.build_env.install_requirements(
|
| 131 |
+
finder, missing, "normal", kind="backend dependencies"
|
| 132 |
+
)
|
| 133 |
+
|
| 134 |
+
def _raise_conflicts(
|
| 135 |
+
self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]]
|
| 136 |
+
) -> None:
|
| 137 |
+
format_string = (
|
| 138 |
+
"Some build dependencies for {requirement} "
|
| 139 |
+
"conflict with {conflicting_with}: {description}."
|
| 140 |
+
)
|
| 141 |
+
error_message = format_string.format(
|
| 142 |
+
requirement=self.req,
|
| 143 |
+
conflicting_with=conflicting_with,
|
| 144 |
+
description=", ".join(
|
| 145 |
+
f"{installed} is incompatible with {wanted}"
|
| 146 |
+
for installed, wanted in sorted(conflicting_reqs)
|
| 147 |
+
),
|
| 148 |
+
)
|
| 149 |
+
raise InstallationError(error_message)
|
| 150 |
+
|
| 151 |
+
def _raise_missing_reqs(self, missing: Set[str]) -> None:
|
| 152 |
+
format_string = (
|
| 153 |
+
"Some build dependencies for {requirement} are missing: {missing}."
|
| 154 |
+
)
|
| 155 |
+
error_message = format_string.format(
|
| 156 |
+
requirement=self.req, missing=", ".join(map(repr, sorted(missing)))
|
| 157 |
+
)
|
| 158 |
+
raise InstallationError(error_message)
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/distributions/wheel.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import TYPE_CHECKING, Optional
|
| 2 |
+
|
| 3 |
+
from pip._vendor.packaging.utils import canonicalize_name
|
| 4 |
+
|
| 5 |
+
from pip._internal.distributions.base import AbstractDistribution
|
| 6 |
+
from pip._internal.metadata import (
|
| 7 |
+
BaseDistribution,
|
| 8 |
+
FilesystemWheel,
|
| 9 |
+
get_wheel_distribution,
|
| 10 |
+
)
|
| 11 |
+
|
| 12 |
+
if TYPE_CHECKING:
|
| 13 |
+
from pip._internal.index.package_finder import PackageFinder
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
class WheelDistribution(AbstractDistribution):
|
| 17 |
+
"""Represents a wheel distribution.
|
| 18 |
+
|
| 19 |
+
This does not need any preparation as wheels can be directly unpacked.
|
| 20 |
+
"""
|
| 21 |
+
|
| 22 |
+
@property
|
| 23 |
+
def build_tracker_id(self) -> Optional[str]:
|
| 24 |
+
return None
|
| 25 |
+
|
| 26 |
+
def get_metadata_distribution(self) -> BaseDistribution:
|
| 27 |
+
"""Loads the metadata from the wheel file into memory and returns a
|
| 28 |
+
Distribution that uses it, not relying on the wheel file or
|
| 29 |
+
requirement.
|
| 30 |
+
"""
|
| 31 |
+
assert self.req.local_file_path, "Set as part of preparation during download"
|
| 32 |
+
assert self.req.name, "Wheels are never unnamed"
|
| 33 |
+
wheel = FilesystemWheel(self.req.local_file_path)
|
| 34 |
+
return get_wheel_distribution(wheel, canonicalize_name(self.req.name))
|
| 35 |
+
|
| 36 |
+
def prepare_distribution_metadata(
|
| 37 |
+
self,
|
| 38 |
+
finder: "PackageFinder",
|
| 39 |
+
build_isolation: bool,
|
| 40 |
+
check_build_deps: bool,
|
| 41 |
+
) -> None:
|
| 42 |
+
pass
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/index/collector.py
ADDED
|
@@ -0,0 +1,494 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
The main purpose of this module is to expose LinkCollector.collect_sources().
|
| 3 |
+
"""
|
| 4 |
+
|
| 5 |
+
import collections
|
| 6 |
+
import email.message
|
| 7 |
+
import functools
|
| 8 |
+
import itertools
|
| 9 |
+
import json
|
| 10 |
+
import logging
|
| 11 |
+
import os
|
| 12 |
+
import urllib.parse
|
| 13 |
+
import urllib.request
|
| 14 |
+
from dataclasses import dataclass
|
| 15 |
+
from html.parser import HTMLParser
|
| 16 |
+
from optparse import Values
|
| 17 |
+
from typing import (
|
| 18 |
+
Callable,
|
| 19 |
+
Dict,
|
| 20 |
+
Iterable,
|
| 21 |
+
List,
|
| 22 |
+
MutableMapping,
|
| 23 |
+
NamedTuple,
|
| 24 |
+
Optional,
|
| 25 |
+
Protocol,
|
| 26 |
+
Sequence,
|
| 27 |
+
Tuple,
|
| 28 |
+
Union,
|
| 29 |
+
)
|
| 30 |
+
|
| 31 |
+
from pip._vendor import requests
|
| 32 |
+
from pip._vendor.requests import Response
|
| 33 |
+
from pip._vendor.requests.exceptions import RetryError, SSLError
|
| 34 |
+
|
| 35 |
+
from pip._internal.exceptions import NetworkConnectionError
|
| 36 |
+
from pip._internal.models.link import Link
|
| 37 |
+
from pip._internal.models.search_scope import SearchScope
|
| 38 |
+
from pip._internal.network.session import PipSession
|
| 39 |
+
from pip._internal.network.utils import raise_for_status
|
| 40 |
+
from pip._internal.utils.filetypes import is_archive_file
|
| 41 |
+
from pip._internal.utils.misc import redact_auth_from_url
|
| 42 |
+
from pip._internal.vcs import vcs
|
| 43 |
+
|
| 44 |
+
from .sources import CandidatesFromPage, LinkSource, build_source
|
| 45 |
+
|
| 46 |
+
logger = logging.getLogger(__name__)
|
| 47 |
+
|
| 48 |
+
ResponseHeaders = MutableMapping[str, str]
|
| 49 |
+
|
| 50 |
+
|
| 51 |
+
def _match_vcs_scheme(url: str) -> Optional[str]:
|
| 52 |
+
"""Look for VCS schemes in the URL.
|
| 53 |
+
|
| 54 |
+
Returns the matched VCS scheme, or None if there's no match.
|
| 55 |
+
"""
|
| 56 |
+
for scheme in vcs.schemes:
|
| 57 |
+
if url.lower().startswith(scheme) and url[len(scheme)] in "+:":
|
| 58 |
+
return scheme
|
| 59 |
+
return None
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
class _NotAPIContent(Exception):
|
| 63 |
+
def __init__(self, content_type: str, request_desc: str) -> None:
|
| 64 |
+
super().__init__(content_type, request_desc)
|
| 65 |
+
self.content_type = content_type
|
| 66 |
+
self.request_desc = request_desc
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def _ensure_api_header(response: Response) -> None:
|
| 70 |
+
"""
|
| 71 |
+
Check the Content-Type header to ensure the response contains a Simple
|
| 72 |
+
API Response.
|
| 73 |
+
|
| 74 |
+
Raises `_NotAPIContent` if the content type is not a valid content-type.
|
| 75 |
+
"""
|
| 76 |
+
content_type = response.headers.get("Content-Type", "Unknown")
|
| 77 |
+
|
| 78 |
+
content_type_l = content_type.lower()
|
| 79 |
+
if content_type_l.startswith(
|
| 80 |
+
(
|
| 81 |
+
"text/html",
|
| 82 |
+
"application/vnd.pypi.simple.v1+html",
|
| 83 |
+
"application/vnd.pypi.simple.v1+json",
|
| 84 |
+
)
|
| 85 |
+
):
|
| 86 |
+
return
|
| 87 |
+
|
| 88 |
+
raise _NotAPIContent(content_type, response.request.method)
|
| 89 |
+
|
| 90 |
+
|
| 91 |
+
class _NotHTTP(Exception):
|
| 92 |
+
pass
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
def _ensure_api_response(url: str, session: PipSession) -> None:
|
| 96 |
+
"""
|
| 97 |
+
Send a HEAD request to the URL, and ensure the response contains a simple
|
| 98 |
+
API Response.
|
| 99 |
+
|
| 100 |
+
Raises `_NotHTTP` if the URL is not available for a HEAD request, or
|
| 101 |
+
`_NotAPIContent` if the content type is not a valid content type.
|
| 102 |
+
"""
|
| 103 |
+
scheme, netloc, path, query, fragment = urllib.parse.urlsplit(url)
|
| 104 |
+
if scheme not in {"http", "https"}:
|
| 105 |
+
raise _NotHTTP()
|
| 106 |
+
|
| 107 |
+
resp = session.head(url, allow_redirects=True)
|
| 108 |
+
raise_for_status(resp)
|
| 109 |
+
|
| 110 |
+
_ensure_api_header(resp)
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
def _get_simple_response(url: str, session: PipSession) -> Response:
|
| 114 |
+
"""Access an Simple API response with GET, and return the response.
|
| 115 |
+
|
| 116 |
+
This consists of three parts:
|
| 117 |
+
|
| 118 |
+
1. If the URL looks suspiciously like an archive, send a HEAD first to
|
| 119 |
+
check the Content-Type is HTML or Simple API, to avoid downloading a
|
| 120 |
+
large file. Raise `_NotHTTP` if the content type cannot be determined, or
|
| 121 |
+
`_NotAPIContent` if it is not HTML or a Simple API.
|
| 122 |
+
2. Actually perform the request. Raise HTTP exceptions on network failures.
|
| 123 |
+
3. Check the Content-Type header to make sure we got a Simple API response,
|
| 124 |
+
and raise `_NotAPIContent` otherwise.
|
| 125 |
+
"""
|
| 126 |
+
if is_archive_file(Link(url).filename):
|
| 127 |
+
_ensure_api_response(url, session=session)
|
| 128 |
+
|
| 129 |
+
logger.debug("Getting page %s", redact_auth_from_url(url))
|
| 130 |
+
|
| 131 |
+
resp = session.get(
|
| 132 |
+
url,
|
| 133 |
+
headers={
|
| 134 |
+
"Accept": ", ".join(
|
| 135 |
+
[
|
| 136 |
+
"application/vnd.pypi.simple.v1+json",
|
| 137 |
+
"application/vnd.pypi.simple.v1+html; q=0.1",
|
| 138 |
+
"text/html; q=0.01",
|
| 139 |
+
]
|
| 140 |
+
),
|
| 141 |
+
# We don't want to blindly returned cached data for
|
| 142 |
+
# /simple/, because authors generally expecting that
|
| 143 |
+
# twine upload && pip install will function, but if
|
| 144 |
+
# they've done a pip install in the last ~10 minutes
|
| 145 |
+
# it won't. Thus by setting this to zero we will not
|
| 146 |
+
# blindly use any cached data, however the benefit of
|
| 147 |
+
# using max-age=0 instead of no-cache, is that we will
|
| 148 |
+
# still support conditional requests, so we will still
|
| 149 |
+
# minimize traffic sent in cases where the page hasn't
|
| 150 |
+
# changed at all, we will just always incur the round
|
| 151 |
+
# trip for the conditional GET now instead of only
|
| 152 |
+
# once per 10 minutes.
|
| 153 |
+
# For more information, please see pypa/pip#5670.
|
| 154 |
+
"Cache-Control": "max-age=0",
|
| 155 |
+
},
|
| 156 |
+
)
|
| 157 |
+
raise_for_status(resp)
|
| 158 |
+
|
| 159 |
+
# The check for archives above only works if the url ends with
|
| 160 |
+
# something that looks like an archive. However that is not a
|
| 161 |
+
# requirement of an url. Unless we issue a HEAD request on every
|
| 162 |
+
# url we cannot know ahead of time for sure if something is a
|
| 163 |
+
# Simple API response or not. However we can check after we've
|
| 164 |
+
# downloaded it.
|
| 165 |
+
_ensure_api_header(resp)
|
| 166 |
+
|
| 167 |
+
logger.debug(
|
| 168 |
+
"Fetched page %s as %s",
|
| 169 |
+
redact_auth_from_url(url),
|
| 170 |
+
resp.headers.get("Content-Type", "Unknown"),
|
| 171 |
+
)
|
| 172 |
+
|
| 173 |
+
return resp
|
| 174 |
+
|
| 175 |
+
|
| 176 |
+
def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
|
| 177 |
+
"""Determine if we have any encoding information in our headers."""
|
| 178 |
+
if headers and "Content-Type" in headers:
|
| 179 |
+
m = email.message.Message()
|
| 180 |
+
m["content-type"] = headers["Content-Type"]
|
| 181 |
+
charset = m.get_param("charset")
|
| 182 |
+
if charset:
|
| 183 |
+
return str(charset)
|
| 184 |
+
return None
|
| 185 |
+
|
| 186 |
+
|
| 187 |
+
class CacheablePageContent:
|
| 188 |
+
def __init__(self, page: "IndexContent") -> None:
|
| 189 |
+
assert page.cache_link_parsing
|
| 190 |
+
self.page = page
|
| 191 |
+
|
| 192 |
+
def __eq__(self, other: object) -> bool:
|
| 193 |
+
return isinstance(other, type(self)) and self.page.url == other.page.url
|
| 194 |
+
|
| 195 |
+
def __hash__(self) -> int:
|
| 196 |
+
return hash(self.page.url)
|
| 197 |
+
|
| 198 |
+
|
| 199 |
+
class ParseLinks(Protocol):
|
| 200 |
+
def __call__(self, page: "IndexContent") -> Iterable[Link]: ...
|
| 201 |
+
|
| 202 |
+
|
| 203 |
+
def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
|
| 204 |
+
"""
|
| 205 |
+
Given a function that parses an Iterable[Link] from an IndexContent, cache the
|
| 206 |
+
function's result (keyed by CacheablePageContent), unless the IndexContent
|
| 207 |
+
`page` has `page.cache_link_parsing == False`.
|
| 208 |
+
"""
|
| 209 |
+
|
| 210 |
+
@functools.lru_cache(maxsize=None)
|
| 211 |
+
def wrapper(cacheable_page: CacheablePageContent) -> List[Link]:
|
| 212 |
+
return list(fn(cacheable_page.page))
|
| 213 |
+
|
| 214 |
+
@functools.wraps(fn)
|
| 215 |
+
def wrapper_wrapper(page: "IndexContent") -> List[Link]:
|
| 216 |
+
if page.cache_link_parsing:
|
| 217 |
+
return wrapper(CacheablePageContent(page))
|
| 218 |
+
return list(fn(page))
|
| 219 |
+
|
| 220 |
+
return wrapper_wrapper
|
| 221 |
+
|
| 222 |
+
|
| 223 |
+
@with_cached_index_content
|
| 224 |
+
def parse_links(page: "IndexContent") -> Iterable[Link]:
|
| 225 |
+
"""
|
| 226 |
+
Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
|
| 227 |
+
"""
|
| 228 |
+
|
| 229 |
+
content_type_l = page.content_type.lower()
|
| 230 |
+
if content_type_l.startswith("application/vnd.pypi.simple.v1+json"):
|
| 231 |
+
data = json.loads(page.content)
|
| 232 |
+
for file in data.get("files", []):
|
| 233 |
+
link = Link.from_json(file, page.url)
|
| 234 |
+
if link is None:
|
| 235 |
+
continue
|
| 236 |
+
yield link
|
| 237 |
+
return
|
| 238 |
+
|
| 239 |
+
parser = HTMLLinkParser(page.url)
|
| 240 |
+
encoding = page.encoding or "utf-8"
|
| 241 |
+
parser.feed(page.content.decode(encoding))
|
| 242 |
+
|
| 243 |
+
url = page.url
|
| 244 |
+
base_url = parser.base_url or url
|
| 245 |
+
for anchor in parser.anchors:
|
| 246 |
+
link = Link.from_element(anchor, page_url=url, base_url=base_url)
|
| 247 |
+
if link is None:
|
| 248 |
+
continue
|
| 249 |
+
yield link
|
| 250 |
+
|
| 251 |
+
|
| 252 |
+
@dataclass(frozen=True)
|
| 253 |
+
class IndexContent:
|
| 254 |
+
"""Represents one response (or page), along with its URL.
|
| 255 |
+
|
| 256 |
+
:param encoding: the encoding to decode the given content.
|
| 257 |
+
:param url: the URL from which the HTML was downloaded.
|
| 258 |
+
:param cache_link_parsing: whether links parsed from this page's url
|
| 259 |
+
should be cached. PyPI index urls should
|
| 260 |
+
have this set to False, for example.
|
| 261 |
+
"""
|
| 262 |
+
|
| 263 |
+
content: bytes
|
| 264 |
+
content_type: str
|
| 265 |
+
encoding: Optional[str]
|
| 266 |
+
url: str
|
| 267 |
+
cache_link_parsing: bool = True
|
| 268 |
+
|
| 269 |
+
def __str__(self) -> str:
|
| 270 |
+
return redact_auth_from_url(self.url)
|
| 271 |
+
|
| 272 |
+
|
| 273 |
+
class HTMLLinkParser(HTMLParser):
|
| 274 |
+
"""
|
| 275 |
+
HTMLParser that keeps the first base HREF and a list of all anchor
|
| 276 |
+
elements' attributes.
|
| 277 |
+
"""
|
| 278 |
+
|
| 279 |
+
def __init__(self, url: str) -> None:
|
| 280 |
+
super().__init__(convert_charrefs=True)
|
| 281 |
+
|
| 282 |
+
self.url: str = url
|
| 283 |
+
self.base_url: Optional[str] = None
|
| 284 |
+
self.anchors: List[Dict[str, Optional[str]]] = []
|
| 285 |
+
|
| 286 |
+
def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None:
|
| 287 |
+
if tag == "base" and self.base_url is None:
|
| 288 |
+
href = self.get_href(attrs)
|
| 289 |
+
if href is not None:
|
| 290 |
+
self.base_url = href
|
| 291 |
+
elif tag == "a":
|
| 292 |
+
self.anchors.append(dict(attrs))
|
| 293 |
+
|
| 294 |
+
def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]:
|
| 295 |
+
for name, value in attrs:
|
| 296 |
+
if name == "href":
|
| 297 |
+
return value
|
| 298 |
+
return None
|
| 299 |
+
|
| 300 |
+
|
| 301 |
+
def _handle_get_simple_fail(
|
| 302 |
+
link: Link,
|
| 303 |
+
reason: Union[str, Exception],
|
| 304 |
+
meth: Optional[Callable[..., None]] = None,
|
| 305 |
+
) -> None:
|
| 306 |
+
if meth is None:
|
| 307 |
+
meth = logger.debug
|
| 308 |
+
meth("Could not fetch URL %s: %s - skipping", link, reason)
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
def _make_index_content(
|
| 312 |
+
response: Response, cache_link_parsing: bool = True
|
| 313 |
+
) -> IndexContent:
|
| 314 |
+
encoding = _get_encoding_from_headers(response.headers)
|
| 315 |
+
return IndexContent(
|
| 316 |
+
response.content,
|
| 317 |
+
response.headers["Content-Type"],
|
| 318 |
+
encoding=encoding,
|
| 319 |
+
url=response.url,
|
| 320 |
+
cache_link_parsing=cache_link_parsing,
|
| 321 |
+
)
|
| 322 |
+
|
| 323 |
+
|
| 324 |
+
def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]:
|
| 325 |
+
url = link.url.split("#", 1)[0]
|
| 326 |
+
|
| 327 |
+
# Check for VCS schemes that do not support lookup as web pages.
|
| 328 |
+
vcs_scheme = _match_vcs_scheme(url)
|
| 329 |
+
if vcs_scheme:
|
| 330 |
+
logger.warning(
|
| 331 |
+
"Cannot look at %s URL %s because it does not support lookup as web pages.",
|
| 332 |
+
vcs_scheme,
|
| 333 |
+
link,
|
| 334 |
+
)
|
| 335 |
+
return None
|
| 336 |
+
|
| 337 |
+
# Tack index.html onto file:// URLs that point to directories
|
| 338 |
+
scheme, _, path, _, _, _ = urllib.parse.urlparse(url)
|
| 339 |
+
if scheme == "file" and os.path.isdir(urllib.request.url2pathname(path)):
|
| 340 |
+
# add trailing slash if not present so urljoin doesn't trim
|
| 341 |
+
# final segment
|
| 342 |
+
if not url.endswith("/"):
|
| 343 |
+
url += "/"
|
| 344 |
+
# TODO: In the future, it would be nice if pip supported PEP 691
|
| 345 |
+
# style responses in the file:// URLs, however there's no
|
| 346 |
+
# standard file extension for application/vnd.pypi.simple.v1+json
|
| 347 |
+
# so we'll need to come up with something on our own.
|
| 348 |
+
url = urllib.parse.urljoin(url, "index.html")
|
| 349 |
+
logger.debug(" file: URL is directory, getting %s", url)
|
| 350 |
+
|
| 351 |
+
try:
|
| 352 |
+
resp = _get_simple_response(url, session=session)
|
| 353 |
+
except _NotHTTP:
|
| 354 |
+
logger.warning(
|
| 355 |
+
"Skipping page %s because it looks like an archive, and cannot "
|
| 356 |
+
"be checked by a HTTP HEAD request.",
|
| 357 |
+
link,
|
| 358 |
+
)
|
| 359 |
+
except _NotAPIContent as exc:
|
| 360 |
+
logger.warning(
|
| 361 |
+
"Skipping page %s because the %s request got Content-Type: %s. "
|
| 362 |
+
"The only supported Content-Types are application/vnd.pypi.simple.v1+json, "
|
| 363 |
+
"application/vnd.pypi.simple.v1+html, and text/html",
|
| 364 |
+
link,
|
| 365 |
+
exc.request_desc,
|
| 366 |
+
exc.content_type,
|
| 367 |
+
)
|
| 368 |
+
except NetworkConnectionError as exc:
|
| 369 |
+
_handle_get_simple_fail(link, exc)
|
| 370 |
+
except RetryError as exc:
|
| 371 |
+
_handle_get_simple_fail(link, exc)
|
| 372 |
+
except SSLError as exc:
|
| 373 |
+
reason = "There was a problem confirming the ssl certificate: "
|
| 374 |
+
reason += str(exc)
|
| 375 |
+
_handle_get_simple_fail(link, reason, meth=logger.info)
|
| 376 |
+
except requests.ConnectionError as exc:
|
| 377 |
+
_handle_get_simple_fail(link, f"connection error: {exc}")
|
| 378 |
+
except requests.Timeout:
|
| 379 |
+
_handle_get_simple_fail(link, "timed out")
|
| 380 |
+
else:
|
| 381 |
+
return _make_index_content(resp, cache_link_parsing=link.cache_link_parsing)
|
| 382 |
+
return None
|
| 383 |
+
|
| 384 |
+
|
| 385 |
+
class CollectedSources(NamedTuple):
|
| 386 |
+
find_links: Sequence[Optional[LinkSource]]
|
| 387 |
+
index_urls: Sequence[Optional[LinkSource]]
|
| 388 |
+
|
| 389 |
+
|
| 390 |
+
class LinkCollector:
|
| 391 |
+
"""
|
| 392 |
+
Responsible for collecting Link objects from all configured locations,
|
| 393 |
+
making network requests as needed.
|
| 394 |
+
|
| 395 |
+
The class's main method is its collect_sources() method.
|
| 396 |
+
"""
|
| 397 |
+
|
| 398 |
+
def __init__(
|
| 399 |
+
self,
|
| 400 |
+
session: PipSession,
|
| 401 |
+
search_scope: SearchScope,
|
| 402 |
+
) -> None:
|
| 403 |
+
self.search_scope = search_scope
|
| 404 |
+
self.session = session
|
| 405 |
+
|
| 406 |
+
@classmethod
|
| 407 |
+
def create(
|
| 408 |
+
cls,
|
| 409 |
+
session: PipSession,
|
| 410 |
+
options: Values,
|
| 411 |
+
suppress_no_index: bool = False,
|
| 412 |
+
) -> "LinkCollector":
|
| 413 |
+
"""
|
| 414 |
+
:param session: The Session to use to make requests.
|
| 415 |
+
:param suppress_no_index: Whether to ignore the --no-index option
|
| 416 |
+
when constructing the SearchScope object.
|
| 417 |
+
"""
|
| 418 |
+
index_urls = [options.index_url] + options.extra_index_urls
|
| 419 |
+
if options.no_index and not suppress_no_index:
|
| 420 |
+
logger.debug(
|
| 421 |
+
"Ignoring indexes: %s",
|
| 422 |
+
",".join(redact_auth_from_url(url) for url in index_urls),
|
| 423 |
+
)
|
| 424 |
+
index_urls = []
|
| 425 |
+
|
| 426 |
+
# Make sure find_links is a list before passing to create().
|
| 427 |
+
find_links = options.find_links or []
|
| 428 |
+
|
| 429 |
+
search_scope = SearchScope.create(
|
| 430 |
+
find_links=find_links,
|
| 431 |
+
index_urls=index_urls,
|
| 432 |
+
no_index=options.no_index,
|
| 433 |
+
)
|
| 434 |
+
link_collector = LinkCollector(
|
| 435 |
+
session=session,
|
| 436 |
+
search_scope=search_scope,
|
| 437 |
+
)
|
| 438 |
+
return link_collector
|
| 439 |
+
|
| 440 |
+
@property
|
| 441 |
+
def find_links(self) -> List[str]:
|
| 442 |
+
return self.search_scope.find_links
|
| 443 |
+
|
| 444 |
+
def fetch_response(self, location: Link) -> Optional[IndexContent]:
|
| 445 |
+
"""
|
| 446 |
+
Fetch an HTML page containing package links.
|
| 447 |
+
"""
|
| 448 |
+
return _get_index_content(location, session=self.session)
|
| 449 |
+
|
| 450 |
+
def collect_sources(
|
| 451 |
+
self,
|
| 452 |
+
project_name: str,
|
| 453 |
+
candidates_from_page: CandidatesFromPage,
|
| 454 |
+
) -> CollectedSources:
|
| 455 |
+
# The OrderedDict calls deduplicate sources by URL.
|
| 456 |
+
index_url_sources = collections.OrderedDict(
|
| 457 |
+
build_source(
|
| 458 |
+
loc,
|
| 459 |
+
candidates_from_page=candidates_from_page,
|
| 460 |
+
page_validator=self.session.is_secure_origin,
|
| 461 |
+
expand_dir=False,
|
| 462 |
+
cache_link_parsing=False,
|
| 463 |
+
project_name=project_name,
|
| 464 |
+
)
|
| 465 |
+
for loc in self.search_scope.get_index_urls_locations(project_name)
|
| 466 |
+
).values()
|
| 467 |
+
find_links_sources = collections.OrderedDict(
|
| 468 |
+
build_source(
|
| 469 |
+
loc,
|
| 470 |
+
candidates_from_page=candidates_from_page,
|
| 471 |
+
page_validator=self.session.is_secure_origin,
|
| 472 |
+
expand_dir=True,
|
| 473 |
+
cache_link_parsing=True,
|
| 474 |
+
project_name=project_name,
|
| 475 |
+
)
|
| 476 |
+
for loc in self.find_links
|
| 477 |
+
).values()
|
| 478 |
+
|
| 479 |
+
if logger.isEnabledFor(logging.DEBUG):
|
| 480 |
+
lines = [
|
| 481 |
+
f"* {s.link}"
|
| 482 |
+
for s in itertools.chain(find_links_sources, index_url_sources)
|
| 483 |
+
if s is not None and s.link is not None
|
| 484 |
+
]
|
| 485 |
+
lines = [
|
| 486 |
+
f"{len(lines)} location(s) to search "
|
| 487 |
+
f"for versions of {project_name}:"
|
| 488 |
+
] + lines
|
| 489 |
+
logger.debug("\n".join(lines))
|
| 490 |
+
|
| 491 |
+
return CollectedSources(
|
| 492 |
+
find_links=list(find_links_sources),
|
| 493 |
+
index_urls=list(index_url_sources),
|
| 494 |
+
)
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc
ADDED
|
Binary file (225 Bytes). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc
ADDED
|
Binary file (28 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc
ADDED
|
Binary file (231 Bytes). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc
ADDED
|
Binary file (2.3 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc
ADDED
|
Binary file (2.34 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc
ADDED
|
Binary file (1.97 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/build_tracker.py
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import contextlib
|
| 2 |
+
import hashlib
|
| 3 |
+
import logging
|
| 4 |
+
import os
|
| 5 |
+
from types import TracebackType
|
| 6 |
+
from typing import Dict, Generator, Optional, Type, Union
|
| 7 |
+
|
| 8 |
+
from pip._internal.req.req_install import InstallRequirement
|
| 9 |
+
from pip._internal.utils.temp_dir import TempDirectory
|
| 10 |
+
|
| 11 |
+
logger = logging.getLogger(__name__)
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
@contextlib.contextmanager
|
| 15 |
+
def update_env_context_manager(**changes: str) -> Generator[None, None, None]:
|
| 16 |
+
target = os.environ
|
| 17 |
+
|
| 18 |
+
# Save values from the target and change them.
|
| 19 |
+
non_existent_marker = object()
|
| 20 |
+
saved_values: Dict[str, Union[object, str]] = {}
|
| 21 |
+
for name, new_value in changes.items():
|
| 22 |
+
try:
|
| 23 |
+
saved_values[name] = target[name]
|
| 24 |
+
except KeyError:
|
| 25 |
+
saved_values[name] = non_existent_marker
|
| 26 |
+
target[name] = new_value
|
| 27 |
+
|
| 28 |
+
try:
|
| 29 |
+
yield
|
| 30 |
+
finally:
|
| 31 |
+
# Restore original values in the target.
|
| 32 |
+
for name, original_value in saved_values.items():
|
| 33 |
+
if original_value is non_existent_marker:
|
| 34 |
+
del target[name]
|
| 35 |
+
else:
|
| 36 |
+
assert isinstance(original_value, str) # for mypy
|
| 37 |
+
target[name] = original_value
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
@contextlib.contextmanager
|
| 41 |
+
def get_build_tracker() -> Generator["BuildTracker", None, None]:
|
| 42 |
+
root = os.environ.get("PIP_BUILD_TRACKER")
|
| 43 |
+
with contextlib.ExitStack() as ctx:
|
| 44 |
+
if root is None:
|
| 45 |
+
root = ctx.enter_context(TempDirectory(kind="build-tracker")).path
|
| 46 |
+
ctx.enter_context(update_env_context_manager(PIP_BUILD_TRACKER=root))
|
| 47 |
+
logger.debug("Initialized build tracking at %s", root)
|
| 48 |
+
|
| 49 |
+
with BuildTracker(root) as tracker:
|
| 50 |
+
yield tracker
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
class TrackerId(str):
|
| 54 |
+
"""Uniquely identifying string provided to the build tracker."""
|
| 55 |
+
|
| 56 |
+
|
| 57 |
+
class BuildTracker:
|
| 58 |
+
"""Ensure that an sdist cannot request itself as a setup requirement.
|
| 59 |
+
|
| 60 |
+
When an sdist is prepared, it identifies its setup requirements in the
|
| 61 |
+
context of ``BuildTracker.track()``. If a requirement shows up recursively, this
|
| 62 |
+
raises an exception.
|
| 63 |
+
|
| 64 |
+
This stops fork bombs embedded in malicious packages."""
|
| 65 |
+
|
| 66 |
+
def __init__(self, root: str) -> None:
|
| 67 |
+
self._root = root
|
| 68 |
+
self._entries: Dict[TrackerId, InstallRequirement] = {}
|
| 69 |
+
logger.debug("Created build tracker: %s", self._root)
|
| 70 |
+
|
| 71 |
+
def __enter__(self) -> "BuildTracker":
|
| 72 |
+
logger.debug("Entered build tracker: %s", self._root)
|
| 73 |
+
return self
|
| 74 |
+
|
| 75 |
+
def __exit__(
|
| 76 |
+
self,
|
| 77 |
+
exc_type: Optional[Type[BaseException]],
|
| 78 |
+
exc_val: Optional[BaseException],
|
| 79 |
+
exc_tb: Optional[TracebackType],
|
| 80 |
+
) -> None:
|
| 81 |
+
self.cleanup()
|
| 82 |
+
|
| 83 |
+
def _entry_path(self, key: TrackerId) -> str:
|
| 84 |
+
hashed = hashlib.sha224(key.encode()).hexdigest()
|
| 85 |
+
return os.path.join(self._root, hashed)
|
| 86 |
+
|
| 87 |
+
def add(self, req: InstallRequirement, key: TrackerId) -> None:
|
| 88 |
+
"""Add an InstallRequirement to build tracking."""
|
| 89 |
+
|
| 90 |
+
# Get the file to write information about this requirement.
|
| 91 |
+
entry_path = self._entry_path(key)
|
| 92 |
+
|
| 93 |
+
# Try reading from the file. If it exists and can be read from, a build
|
| 94 |
+
# is already in progress, so a LookupError is raised.
|
| 95 |
+
try:
|
| 96 |
+
with open(entry_path) as fp:
|
| 97 |
+
contents = fp.read()
|
| 98 |
+
except FileNotFoundError:
|
| 99 |
+
pass
|
| 100 |
+
else:
|
| 101 |
+
message = f"{req.link} is already being built: {contents}"
|
| 102 |
+
raise LookupError(message)
|
| 103 |
+
|
| 104 |
+
# If we're here, req should really not be building already.
|
| 105 |
+
assert key not in self._entries
|
| 106 |
+
|
| 107 |
+
# Start tracking this requirement.
|
| 108 |
+
with open(entry_path, "w", encoding="utf-8") as fp:
|
| 109 |
+
fp.write(str(req))
|
| 110 |
+
self._entries[key] = req
|
| 111 |
+
|
| 112 |
+
logger.debug("Added %s to build tracker %r", req, self._root)
|
| 113 |
+
|
| 114 |
+
def remove(self, req: InstallRequirement, key: TrackerId) -> None:
|
| 115 |
+
"""Remove an InstallRequirement from build tracking."""
|
| 116 |
+
|
| 117 |
+
# Delete the created file and the corresponding entry.
|
| 118 |
+
os.unlink(self._entry_path(key))
|
| 119 |
+
del self._entries[key]
|
| 120 |
+
|
| 121 |
+
logger.debug("Removed %s from build tracker %r", req, self._root)
|
| 122 |
+
|
| 123 |
+
def cleanup(self) -> None:
|
| 124 |
+
for key, req in list(self._entries.items()):
|
| 125 |
+
self.remove(req, key)
|
| 126 |
+
|
| 127 |
+
logger.debug("Removed build tracker: %r", self._root)
|
| 128 |
+
|
| 129 |
+
@contextlib.contextmanager
|
| 130 |
+
def track(self, req: InstallRequirement, key: str) -> Generator[None, None, None]:
|
| 131 |
+
"""Ensure that `key` cannot install itself as a setup requirement.
|
| 132 |
+
|
| 133 |
+
:raises LookupError: If `key` was already provided in a parent invocation of
|
| 134 |
+
the context introduced by this method."""
|
| 135 |
+
tracker_id = TrackerId(key)
|
| 136 |
+
self.add(req, tracker_id)
|
| 137 |
+
yield
|
| 138 |
+
self.remove(req, tracker_id)
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/operations/build/wheel.py
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import logging
|
| 2 |
+
import os
|
| 3 |
+
from typing import Optional
|
| 4 |
+
|
| 5 |
+
from pip._vendor.pyproject_hooks import BuildBackendHookCaller
|
| 6 |
+
|
| 7 |
+
from pip._internal.utils.subprocess import runner_with_spinner_message
|
| 8 |
+
|
| 9 |
+
logger = logging.getLogger(__name__)
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def build_wheel_pep517(
|
| 13 |
+
name: str,
|
| 14 |
+
backend: BuildBackendHookCaller,
|
| 15 |
+
metadata_directory: str,
|
| 16 |
+
tempd: str,
|
| 17 |
+
) -> Optional[str]:
|
| 18 |
+
"""Build one InstallRequirement using the PEP 517 build process.
|
| 19 |
+
|
| 20 |
+
Returns path to wheel if successfully built. Otherwise, returns None.
|
| 21 |
+
"""
|
| 22 |
+
assert metadata_directory is not None
|
| 23 |
+
try:
|
| 24 |
+
logger.debug("Destination directory: %s", tempd)
|
| 25 |
+
|
| 26 |
+
runner = runner_with_spinner_message(
|
| 27 |
+
f"Building wheel for {name} (pyproject.toml)"
|
| 28 |
+
)
|
| 29 |
+
with backend.subprocess_runner(runner):
|
| 30 |
+
wheel_name = backend.build_wheel(
|
| 31 |
+
tempd,
|
| 32 |
+
metadata_directory=metadata_directory,
|
| 33 |
+
)
|
| 34 |
+
except Exception:
|
| 35 |
+
logger.error("Failed building wheel for %s", name)
|
| 36 |
+
return None
|
| 37 |
+
return os.path.join(tempd, wheel_name)
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc
ADDED
|
Binary file (23.1 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc
ADDED
|
Binary file (23.9 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc
ADDED
|
Binary file (40.4 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc
ADDED
|
Binary file (6.03 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc
ADDED
|
Binary file (36.7 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/constructors.py
ADDED
|
@@ -0,0 +1,560 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Backing implementation for InstallRequirement's various constructors
|
| 2 |
+
|
| 3 |
+
The idea here is that these formed a major chunk of InstallRequirement's size
|
| 4 |
+
so, moving them and support code dedicated to them outside of that class
|
| 5 |
+
helps creates for better understandability for the rest of the code.
|
| 6 |
+
|
| 7 |
+
These are meant to be used elsewhere within pip to create instances of
|
| 8 |
+
InstallRequirement.
|
| 9 |
+
"""
|
| 10 |
+
|
| 11 |
+
import copy
|
| 12 |
+
import logging
|
| 13 |
+
import os
|
| 14 |
+
import re
|
| 15 |
+
from dataclasses import dataclass
|
| 16 |
+
from typing import Collection, Dict, List, Optional, Set, Tuple, Union
|
| 17 |
+
|
| 18 |
+
from pip._vendor.packaging.markers import Marker
|
| 19 |
+
from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
|
| 20 |
+
from pip._vendor.packaging.specifiers import Specifier
|
| 21 |
+
|
| 22 |
+
from pip._internal.exceptions import InstallationError
|
| 23 |
+
from pip._internal.models.index import PyPI, TestPyPI
|
| 24 |
+
from pip._internal.models.link import Link
|
| 25 |
+
from pip._internal.models.wheel import Wheel
|
| 26 |
+
from pip._internal.req.req_file import ParsedRequirement
|
| 27 |
+
from pip._internal.req.req_install import InstallRequirement
|
| 28 |
+
from pip._internal.utils.filetypes import is_archive_file
|
| 29 |
+
from pip._internal.utils.misc import is_installable_dir
|
| 30 |
+
from pip._internal.utils.packaging import get_requirement
|
| 31 |
+
from pip._internal.utils.urls import path_to_url
|
| 32 |
+
from pip._internal.vcs import is_url, vcs
|
| 33 |
+
|
| 34 |
+
__all__ = [
|
| 35 |
+
"install_req_from_editable",
|
| 36 |
+
"install_req_from_line",
|
| 37 |
+
"parse_editable",
|
| 38 |
+
]
|
| 39 |
+
|
| 40 |
+
logger = logging.getLogger(__name__)
|
| 41 |
+
operators = Specifier._operators.keys()
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
def _strip_extras(path: str) -> Tuple[str, Optional[str]]:
|
| 45 |
+
m = re.match(r"^(.+)(\[[^\]]+\])$", path)
|
| 46 |
+
extras = None
|
| 47 |
+
if m:
|
| 48 |
+
path_no_extras = m.group(1)
|
| 49 |
+
extras = m.group(2)
|
| 50 |
+
else:
|
| 51 |
+
path_no_extras = path
|
| 52 |
+
|
| 53 |
+
return path_no_extras, extras
|
| 54 |
+
|
| 55 |
+
|
| 56 |
+
def convert_extras(extras: Optional[str]) -> Set[str]:
|
| 57 |
+
if not extras:
|
| 58 |
+
return set()
|
| 59 |
+
return get_requirement("placeholder" + extras.lower()).extras
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requirement:
|
| 63 |
+
"""
|
| 64 |
+
Returns a new requirement based on the given one, with the supplied extras. If the
|
| 65 |
+
given requirement already has extras those are replaced (or dropped if no new extras
|
| 66 |
+
are given).
|
| 67 |
+
"""
|
| 68 |
+
match: Optional[re.Match[str]] = re.fullmatch(
|
| 69 |
+
# see https://peps.python.org/pep-0508/#complete-grammar
|
| 70 |
+
r"([\w\t .-]+)(\[[^\]]*\])?(.*)",
|
| 71 |
+
str(req),
|
| 72 |
+
flags=re.ASCII,
|
| 73 |
+
)
|
| 74 |
+
# ireq.req is a valid requirement so the regex should always match
|
| 75 |
+
assert (
|
| 76 |
+
match is not None
|
| 77 |
+
), f"regex match on requirement {req} failed, this should never happen"
|
| 78 |
+
pre: Optional[str] = match.group(1)
|
| 79 |
+
post: Optional[str] = match.group(3)
|
| 80 |
+
assert (
|
| 81 |
+
pre is not None and post is not None
|
| 82 |
+
), f"regex group selection for requirement {req} failed, this should never happen"
|
| 83 |
+
extras: str = "[{}]".format(",".join(sorted(new_extras)) if new_extras else "")
|
| 84 |
+
return get_requirement(f"{pre}{extras}{post}")
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]:
|
| 88 |
+
"""Parses an editable requirement into:
|
| 89 |
+
- a requirement name
|
| 90 |
+
- an URL
|
| 91 |
+
- extras
|
| 92 |
+
- editable options
|
| 93 |
+
Accepted requirements:
|
| 94 |
+
svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir
|
| 95 |
+
.[some_extra]
|
| 96 |
+
"""
|
| 97 |
+
|
| 98 |
+
url = editable_req
|
| 99 |
+
|
| 100 |
+
# If a file path is specified with extras, strip off the extras.
|
| 101 |
+
url_no_extras, extras = _strip_extras(url)
|
| 102 |
+
|
| 103 |
+
if os.path.isdir(url_no_extras):
|
| 104 |
+
# Treating it as code that has already been checked out
|
| 105 |
+
url_no_extras = path_to_url(url_no_extras)
|
| 106 |
+
|
| 107 |
+
if url_no_extras.lower().startswith("file:"):
|
| 108 |
+
package_name = Link(url_no_extras).egg_fragment
|
| 109 |
+
if extras:
|
| 110 |
+
return (
|
| 111 |
+
package_name,
|
| 112 |
+
url_no_extras,
|
| 113 |
+
get_requirement("placeholder" + extras.lower()).extras,
|
| 114 |
+
)
|
| 115 |
+
else:
|
| 116 |
+
return package_name, url_no_extras, set()
|
| 117 |
+
|
| 118 |
+
for version_control in vcs:
|
| 119 |
+
if url.lower().startswith(f"{version_control}:"):
|
| 120 |
+
url = f"{version_control}+{url}"
|
| 121 |
+
break
|
| 122 |
+
|
| 123 |
+
link = Link(url)
|
| 124 |
+
|
| 125 |
+
if not link.is_vcs:
|
| 126 |
+
backends = ", ".join(vcs.all_schemes)
|
| 127 |
+
raise InstallationError(
|
| 128 |
+
f"{editable_req} is not a valid editable requirement. "
|
| 129 |
+
f"It should either be a path to a local project or a VCS URL "
|
| 130 |
+
f"(beginning with {backends})."
|
| 131 |
+
)
|
| 132 |
+
|
| 133 |
+
package_name = link.egg_fragment
|
| 134 |
+
if not package_name:
|
| 135 |
+
raise InstallationError(
|
| 136 |
+
f"Could not detect requirement name for '{editable_req}', "
|
| 137 |
+
"please specify one with #egg=your_package_name"
|
| 138 |
+
)
|
| 139 |
+
return package_name, url, set()
|
| 140 |
+
|
| 141 |
+
|
| 142 |
+
def check_first_requirement_in_file(filename: str) -> None:
|
| 143 |
+
"""Check if file is parsable as a requirements file.
|
| 144 |
+
|
| 145 |
+
This is heavily based on ``pkg_resources.parse_requirements``, but
|
| 146 |
+
simplified to just check the first meaningful line.
|
| 147 |
+
|
| 148 |
+
:raises InvalidRequirement: If the first meaningful line cannot be parsed
|
| 149 |
+
as an requirement.
|
| 150 |
+
"""
|
| 151 |
+
with open(filename, encoding="utf-8", errors="ignore") as f:
|
| 152 |
+
# Create a steppable iterator, so we can handle \-continuations.
|
| 153 |
+
lines = (
|
| 154 |
+
line
|
| 155 |
+
for line in (line.strip() for line in f)
|
| 156 |
+
if line and not line.startswith("#") # Skip blank lines/comments.
|
| 157 |
+
)
|
| 158 |
+
|
| 159 |
+
for line in lines:
|
| 160 |
+
# Drop comments -- a hash without a space may be in a URL.
|
| 161 |
+
if " #" in line:
|
| 162 |
+
line = line[: line.find(" #")]
|
| 163 |
+
# If there is a line continuation, drop it, and append the next line.
|
| 164 |
+
if line.endswith("\\"):
|
| 165 |
+
line = line[:-2].strip() + next(lines, "")
|
| 166 |
+
get_requirement(line)
|
| 167 |
+
return
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
def deduce_helpful_msg(req: str) -> str:
|
| 171 |
+
"""Returns helpful msg in case requirements file does not exist,
|
| 172 |
+
or cannot be parsed.
|
| 173 |
+
|
| 174 |
+
:params req: Requirements file path
|
| 175 |
+
"""
|
| 176 |
+
if not os.path.exists(req):
|
| 177 |
+
return f" File '{req}' does not exist."
|
| 178 |
+
msg = " The path does exist. "
|
| 179 |
+
# Try to parse and check if it is a requirements file.
|
| 180 |
+
try:
|
| 181 |
+
check_first_requirement_in_file(req)
|
| 182 |
+
except InvalidRequirement:
|
| 183 |
+
logger.debug("Cannot parse '%s' as requirements file", req)
|
| 184 |
+
else:
|
| 185 |
+
msg += (
|
| 186 |
+
f"The argument you provided "
|
| 187 |
+
f"({req}) appears to be a"
|
| 188 |
+
f" requirements file. If that is the"
|
| 189 |
+
f" case, use the '-r' flag to install"
|
| 190 |
+
f" the packages specified within it."
|
| 191 |
+
)
|
| 192 |
+
return msg
|
| 193 |
+
|
| 194 |
+
|
| 195 |
+
@dataclass(frozen=True)
|
| 196 |
+
class RequirementParts:
|
| 197 |
+
requirement: Optional[Requirement]
|
| 198 |
+
link: Optional[Link]
|
| 199 |
+
markers: Optional[Marker]
|
| 200 |
+
extras: Set[str]
|
| 201 |
+
|
| 202 |
+
|
| 203 |
+
def parse_req_from_editable(editable_req: str) -> RequirementParts:
|
| 204 |
+
name, url, extras_override = parse_editable(editable_req)
|
| 205 |
+
|
| 206 |
+
if name is not None:
|
| 207 |
+
try:
|
| 208 |
+
req: Optional[Requirement] = get_requirement(name)
|
| 209 |
+
except InvalidRequirement as exc:
|
| 210 |
+
raise InstallationError(f"Invalid requirement: {name!r}: {exc}")
|
| 211 |
+
else:
|
| 212 |
+
req = None
|
| 213 |
+
|
| 214 |
+
link = Link(url)
|
| 215 |
+
|
| 216 |
+
return RequirementParts(req, link, None, extras_override)
|
| 217 |
+
|
| 218 |
+
|
| 219 |
+
# ---- The actual constructors follow ----
|
| 220 |
+
|
| 221 |
+
|
| 222 |
+
def install_req_from_editable(
|
| 223 |
+
editable_req: str,
|
| 224 |
+
comes_from: Optional[Union[InstallRequirement, str]] = None,
|
| 225 |
+
*,
|
| 226 |
+
use_pep517: Optional[bool] = None,
|
| 227 |
+
isolated: bool = False,
|
| 228 |
+
global_options: Optional[List[str]] = None,
|
| 229 |
+
hash_options: Optional[Dict[str, List[str]]] = None,
|
| 230 |
+
constraint: bool = False,
|
| 231 |
+
user_supplied: bool = False,
|
| 232 |
+
permit_editable_wheels: bool = False,
|
| 233 |
+
config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
|
| 234 |
+
) -> InstallRequirement:
|
| 235 |
+
parts = parse_req_from_editable(editable_req)
|
| 236 |
+
|
| 237 |
+
return InstallRequirement(
|
| 238 |
+
parts.requirement,
|
| 239 |
+
comes_from=comes_from,
|
| 240 |
+
user_supplied=user_supplied,
|
| 241 |
+
editable=True,
|
| 242 |
+
permit_editable_wheels=permit_editable_wheels,
|
| 243 |
+
link=parts.link,
|
| 244 |
+
constraint=constraint,
|
| 245 |
+
use_pep517=use_pep517,
|
| 246 |
+
isolated=isolated,
|
| 247 |
+
global_options=global_options,
|
| 248 |
+
hash_options=hash_options,
|
| 249 |
+
config_settings=config_settings,
|
| 250 |
+
extras=parts.extras,
|
| 251 |
+
)
|
| 252 |
+
|
| 253 |
+
|
| 254 |
+
def _looks_like_path(name: str) -> bool:
|
| 255 |
+
"""Checks whether the string "looks like" a path on the filesystem.
|
| 256 |
+
|
| 257 |
+
This does not check whether the target actually exists, only judge from the
|
| 258 |
+
appearance.
|
| 259 |
+
|
| 260 |
+
Returns true if any of the following conditions is true:
|
| 261 |
+
* a path separator is found (either os.path.sep or os.path.altsep);
|
| 262 |
+
* a dot is found (which represents the current directory).
|
| 263 |
+
"""
|
| 264 |
+
if os.path.sep in name:
|
| 265 |
+
return True
|
| 266 |
+
if os.path.altsep is not None and os.path.altsep in name:
|
| 267 |
+
return True
|
| 268 |
+
if name.startswith("."):
|
| 269 |
+
return True
|
| 270 |
+
return False
|
| 271 |
+
|
| 272 |
+
|
| 273 |
+
def _get_url_from_path(path: str, name: str) -> Optional[str]:
|
| 274 |
+
"""
|
| 275 |
+
First, it checks whether a provided path is an installable directory. If it
|
| 276 |
+
is, returns the path.
|
| 277 |
+
|
| 278 |
+
If false, check if the path is an archive file (such as a .whl).
|
| 279 |
+
The function checks if the path is a file. If false, if the path has
|
| 280 |
+
an @, it will treat it as a PEP 440 URL requirement and return the path.
|
| 281 |
+
"""
|
| 282 |
+
if _looks_like_path(name) and os.path.isdir(path):
|
| 283 |
+
if is_installable_dir(path):
|
| 284 |
+
return path_to_url(path)
|
| 285 |
+
# TODO: The is_installable_dir test here might not be necessary
|
| 286 |
+
# now that it is done in load_pyproject_toml too.
|
| 287 |
+
raise InstallationError(
|
| 288 |
+
f"Directory {name!r} is not installable. Neither 'setup.py' "
|
| 289 |
+
"nor 'pyproject.toml' found."
|
| 290 |
+
)
|
| 291 |
+
if not is_archive_file(path):
|
| 292 |
+
return None
|
| 293 |
+
if os.path.isfile(path):
|
| 294 |
+
return path_to_url(path)
|
| 295 |
+
urlreq_parts = name.split("@", 1)
|
| 296 |
+
if len(urlreq_parts) >= 2 and not _looks_like_path(urlreq_parts[0]):
|
| 297 |
+
# If the path contains '@' and the part before it does not look
|
| 298 |
+
# like a path, try to treat it as a PEP 440 URL req instead.
|
| 299 |
+
return None
|
| 300 |
+
logger.warning(
|
| 301 |
+
"Requirement %r looks like a filename, but the file does not exist",
|
| 302 |
+
name,
|
| 303 |
+
)
|
| 304 |
+
return path_to_url(path)
|
| 305 |
+
|
| 306 |
+
|
| 307 |
+
def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementParts:
|
| 308 |
+
if is_url(name):
|
| 309 |
+
marker_sep = "; "
|
| 310 |
+
else:
|
| 311 |
+
marker_sep = ";"
|
| 312 |
+
if marker_sep in name:
|
| 313 |
+
name, markers_as_string = name.split(marker_sep, 1)
|
| 314 |
+
markers_as_string = markers_as_string.strip()
|
| 315 |
+
if not markers_as_string:
|
| 316 |
+
markers = None
|
| 317 |
+
else:
|
| 318 |
+
markers = Marker(markers_as_string)
|
| 319 |
+
else:
|
| 320 |
+
markers = None
|
| 321 |
+
name = name.strip()
|
| 322 |
+
req_as_string = None
|
| 323 |
+
path = os.path.normpath(os.path.abspath(name))
|
| 324 |
+
link = None
|
| 325 |
+
extras_as_string = None
|
| 326 |
+
|
| 327 |
+
if is_url(name):
|
| 328 |
+
link = Link(name)
|
| 329 |
+
else:
|
| 330 |
+
p, extras_as_string = _strip_extras(path)
|
| 331 |
+
url = _get_url_from_path(p, name)
|
| 332 |
+
if url is not None:
|
| 333 |
+
link = Link(url)
|
| 334 |
+
|
| 335 |
+
# it's a local file, dir, or url
|
| 336 |
+
if link:
|
| 337 |
+
# Handle relative file URLs
|
| 338 |
+
if link.scheme == "file" and re.search(r"\.\./", link.url):
|
| 339 |
+
link = Link(path_to_url(os.path.normpath(os.path.abspath(link.path))))
|
| 340 |
+
# wheel file
|
| 341 |
+
if link.is_wheel:
|
| 342 |
+
wheel = Wheel(link.filename) # can raise InvalidWheelFilename
|
| 343 |
+
req_as_string = f"{wheel.name}=={wheel.version}"
|
| 344 |
+
else:
|
| 345 |
+
# set the req to the egg fragment. when it's not there, this
|
| 346 |
+
# will become an 'unnamed' requirement
|
| 347 |
+
req_as_string = link.egg_fragment
|
| 348 |
+
|
| 349 |
+
# a requirement specifier
|
| 350 |
+
else:
|
| 351 |
+
req_as_string = name
|
| 352 |
+
|
| 353 |
+
extras = convert_extras(extras_as_string)
|
| 354 |
+
|
| 355 |
+
def with_source(text: str) -> str:
|
| 356 |
+
if not line_source:
|
| 357 |
+
return text
|
| 358 |
+
return f"{text} (from {line_source})"
|
| 359 |
+
|
| 360 |
+
def _parse_req_string(req_as_string: str) -> Requirement:
|
| 361 |
+
try:
|
| 362 |
+
return get_requirement(req_as_string)
|
| 363 |
+
except InvalidRequirement as exc:
|
| 364 |
+
if os.path.sep in req_as_string:
|
| 365 |
+
add_msg = "It looks like a path."
|
| 366 |
+
add_msg += deduce_helpful_msg(req_as_string)
|
| 367 |
+
elif "=" in req_as_string and not any(
|
| 368 |
+
op in req_as_string for op in operators
|
| 369 |
+
):
|
| 370 |
+
add_msg = "= is not a valid operator. Did you mean == ?"
|
| 371 |
+
else:
|
| 372 |
+
add_msg = ""
|
| 373 |
+
msg = with_source(f"Invalid requirement: {req_as_string!r}: {exc}")
|
| 374 |
+
if add_msg:
|
| 375 |
+
msg += f"\nHint: {add_msg}"
|
| 376 |
+
raise InstallationError(msg)
|
| 377 |
+
|
| 378 |
+
if req_as_string is not None:
|
| 379 |
+
req: Optional[Requirement] = _parse_req_string(req_as_string)
|
| 380 |
+
else:
|
| 381 |
+
req = None
|
| 382 |
+
|
| 383 |
+
return RequirementParts(req, link, markers, extras)
|
| 384 |
+
|
| 385 |
+
|
| 386 |
+
def install_req_from_line(
|
| 387 |
+
name: str,
|
| 388 |
+
comes_from: Optional[Union[str, InstallRequirement]] = None,
|
| 389 |
+
*,
|
| 390 |
+
use_pep517: Optional[bool] = None,
|
| 391 |
+
isolated: bool = False,
|
| 392 |
+
global_options: Optional[List[str]] = None,
|
| 393 |
+
hash_options: Optional[Dict[str, List[str]]] = None,
|
| 394 |
+
constraint: bool = False,
|
| 395 |
+
line_source: Optional[str] = None,
|
| 396 |
+
user_supplied: bool = False,
|
| 397 |
+
config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
|
| 398 |
+
) -> InstallRequirement:
|
| 399 |
+
"""Creates an InstallRequirement from a name, which might be a
|
| 400 |
+
requirement, directory containing 'setup.py', filename, or URL.
|
| 401 |
+
|
| 402 |
+
:param line_source: An optional string describing where the line is from,
|
| 403 |
+
for logging purposes in case of an error.
|
| 404 |
+
"""
|
| 405 |
+
parts = parse_req_from_line(name, line_source)
|
| 406 |
+
|
| 407 |
+
return InstallRequirement(
|
| 408 |
+
parts.requirement,
|
| 409 |
+
comes_from,
|
| 410 |
+
link=parts.link,
|
| 411 |
+
markers=parts.markers,
|
| 412 |
+
use_pep517=use_pep517,
|
| 413 |
+
isolated=isolated,
|
| 414 |
+
global_options=global_options,
|
| 415 |
+
hash_options=hash_options,
|
| 416 |
+
config_settings=config_settings,
|
| 417 |
+
constraint=constraint,
|
| 418 |
+
extras=parts.extras,
|
| 419 |
+
user_supplied=user_supplied,
|
| 420 |
+
)
|
| 421 |
+
|
| 422 |
+
|
| 423 |
+
def install_req_from_req_string(
|
| 424 |
+
req_string: str,
|
| 425 |
+
comes_from: Optional[InstallRequirement] = None,
|
| 426 |
+
isolated: bool = False,
|
| 427 |
+
use_pep517: Optional[bool] = None,
|
| 428 |
+
user_supplied: bool = False,
|
| 429 |
+
) -> InstallRequirement:
|
| 430 |
+
try:
|
| 431 |
+
req = get_requirement(req_string)
|
| 432 |
+
except InvalidRequirement as exc:
|
| 433 |
+
raise InstallationError(f"Invalid requirement: {req_string!r}: {exc}")
|
| 434 |
+
|
| 435 |
+
domains_not_allowed = [
|
| 436 |
+
PyPI.file_storage_domain,
|
| 437 |
+
TestPyPI.file_storage_domain,
|
| 438 |
+
]
|
| 439 |
+
if (
|
| 440 |
+
req.url
|
| 441 |
+
and comes_from
|
| 442 |
+
and comes_from.link
|
| 443 |
+
and comes_from.link.netloc in domains_not_allowed
|
| 444 |
+
):
|
| 445 |
+
# Explicitly disallow pypi packages that depend on external urls
|
| 446 |
+
raise InstallationError(
|
| 447 |
+
"Packages installed from PyPI cannot depend on packages "
|
| 448 |
+
"which are not also hosted on PyPI.\n"
|
| 449 |
+
f"{comes_from.name} depends on {req} "
|
| 450 |
+
)
|
| 451 |
+
|
| 452 |
+
return InstallRequirement(
|
| 453 |
+
req,
|
| 454 |
+
comes_from,
|
| 455 |
+
isolated=isolated,
|
| 456 |
+
use_pep517=use_pep517,
|
| 457 |
+
user_supplied=user_supplied,
|
| 458 |
+
)
|
| 459 |
+
|
| 460 |
+
|
| 461 |
+
def install_req_from_parsed_requirement(
|
| 462 |
+
parsed_req: ParsedRequirement,
|
| 463 |
+
isolated: bool = False,
|
| 464 |
+
use_pep517: Optional[bool] = None,
|
| 465 |
+
user_supplied: bool = False,
|
| 466 |
+
config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
|
| 467 |
+
) -> InstallRequirement:
|
| 468 |
+
if parsed_req.is_editable:
|
| 469 |
+
req = install_req_from_editable(
|
| 470 |
+
parsed_req.requirement,
|
| 471 |
+
comes_from=parsed_req.comes_from,
|
| 472 |
+
use_pep517=use_pep517,
|
| 473 |
+
constraint=parsed_req.constraint,
|
| 474 |
+
isolated=isolated,
|
| 475 |
+
user_supplied=user_supplied,
|
| 476 |
+
config_settings=config_settings,
|
| 477 |
+
)
|
| 478 |
+
|
| 479 |
+
else:
|
| 480 |
+
req = install_req_from_line(
|
| 481 |
+
parsed_req.requirement,
|
| 482 |
+
comes_from=parsed_req.comes_from,
|
| 483 |
+
use_pep517=use_pep517,
|
| 484 |
+
isolated=isolated,
|
| 485 |
+
global_options=(
|
| 486 |
+
parsed_req.options.get("global_options", [])
|
| 487 |
+
if parsed_req.options
|
| 488 |
+
else []
|
| 489 |
+
),
|
| 490 |
+
hash_options=(
|
| 491 |
+
parsed_req.options.get("hashes", {}) if parsed_req.options else {}
|
| 492 |
+
),
|
| 493 |
+
constraint=parsed_req.constraint,
|
| 494 |
+
line_source=parsed_req.line_source,
|
| 495 |
+
user_supplied=user_supplied,
|
| 496 |
+
config_settings=config_settings,
|
| 497 |
+
)
|
| 498 |
+
return req
|
| 499 |
+
|
| 500 |
+
|
| 501 |
+
def install_req_from_link_and_ireq(
|
| 502 |
+
link: Link, ireq: InstallRequirement
|
| 503 |
+
) -> InstallRequirement:
|
| 504 |
+
return InstallRequirement(
|
| 505 |
+
req=ireq.req,
|
| 506 |
+
comes_from=ireq.comes_from,
|
| 507 |
+
editable=ireq.editable,
|
| 508 |
+
link=link,
|
| 509 |
+
markers=ireq.markers,
|
| 510 |
+
use_pep517=ireq.use_pep517,
|
| 511 |
+
isolated=ireq.isolated,
|
| 512 |
+
global_options=ireq.global_options,
|
| 513 |
+
hash_options=ireq.hash_options,
|
| 514 |
+
config_settings=ireq.config_settings,
|
| 515 |
+
user_supplied=ireq.user_supplied,
|
| 516 |
+
)
|
| 517 |
+
|
| 518 |
+
|
| 519 |
+
def install_req_drop_extras(ireq: InstallRequirement) -> InstallRequirement:
|
| 520 |
+
"""
|
| 521 |
+
Creates a new InstallationRequirement using the given template but without
|
| 522 |
+
any extras. Sets the original requirement as the new one's parent
|
| 523 |
+
(comes_from).
|
| 524 |
+
"""
|
| 525 |
+
return InstallRequirement(
|
| 526 |
+
req=(
|
| 527 |
+
_set_requirement_extras(ireq.req, set()) if ireq.req is not None else None
|
| 528 |
+
),
|
| 529 |
+
comes_from=ireq,
|
| 530 |
+
editable=ireq.editable,
|
| 531 |
+
link=ireq.link,
|
| 532 |
+
markers=ireq.markers,
|
| 533 |
+
use_pep517=ireq.use_pep517,
|
| 534 |
+
isolated=ireq.isolated,
|
| 535 |
+
global_options=ireq.global_options,
|
| 536 |
+
hash_options=ireq.hash_options,
|
| 537 |
+
constraint=ireq.constraint,
|
| 538 |
+
extras=[],
|
| 539 |
+
config_settings=ireq.config_settings,
|
| 540 |
+
user_supplied=ireq.user_supplied,
|
| 541 |
+
permit_editable_wheels=ireq.permit_editable_wheels,
|
| 542 |
+
)
|
| 543 |
+
|
| 544 |
+
|
| 545 |
+
def install_req_extend_extras(
|
| 546 |
+
ireq: InstallRequirement,
|
| 547 |
+
extras: Collection[str],
|
| 548 |
+
) -> InstallRequirement:
|
| 549 |
+
"""
|
| 550 |
+
Returns a copy of an installation requirement with some additional extras.
|
| 551 |
+
Makes a shallow copy of the ireq object.
|
| 552 |
+
"""
|
| 553 |
+
result = copy.copy(ireq)
|
| 554 |
+
result.extras = {*ireq.extras, *extras}
|
| 555 |
+
result.req = (
|
| 556 |
+
_set_requirement_extras(ireq.req, result.extras)
|
| 557 |
+
if ireq.req is not None
|
| 558 |
+
else None
|
| 559 |
+
)
|
| 560 |
+
return result
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/req_set.py
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import logging
|
| 2 |
+
from collections import OrderedDict
|
| 3 |
+
from typing import Dict, List
|
| 4 |
+
|
| 5 |
+
from pip._vendor.packaging.utils import canonicalize_name
|
| 6 |
+
|
| 7 |
+
from pip._internal.req.req_install import InstallRequirement
|
| 8 |
+
|
| 9 |
+
logger = logging.getLogger(__name__)
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
class RequirementSet:
|
| 13 |
+
def __init__(self, check_supported_wheels: bool = True) -> None:
|
| 14 |
+
"""Create a RequirementSet."""
|
| 15 |
+
|
| 16 |
+
self.requirements: Dict[str, InstallRequirement] = OrderedDict()
|
| 17 |
+
self.check_supported_wheels = check_supported_wheels
|
| 18 |
+
|
| 19 |
+
self.unnamed_requirements: List[InstallRequirement] = []
|
| 20 |
+
|
| 21 |
+
def __str__(self) -> str:
|
| 22 |
+
requirements = sorted(
|
| 23 |
+
(req for req in self.requirements.values() if not req.comes_from),
|
| 24 |
+
key=lambda req: canonicalize_name(req.name or ""),
|
| 25 |
+
)
|
| 26 |
+
return " ".join(str(req.req) for req in requirements)
|
| 27 |
+
|
| 28 |
+
def __repr__(self) -> str:
|
| 29 |
+
requirements = sorted(
|
| 30 |
+
self.requirements.values(),
|
| 31 |
+
key=lambda req: canonicalize_name(req.name or ""),
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
format_string = "<{classname} object; {count} requirement(s): {reqs}>"
|
| 35 |
+
return format_string.format(
|
| 36 |
+
classname=self.__class__.__name__,
|
| 37 |
+
count=len(requirements),
|
| 38 |
+
reqs=", ".join(str(req.req) for req in requirements),
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
def add_unnamed_requirement(self, install_req: InstallRequirement) -> None:
|
| 42 |
+
assert not install_req.name
|
| 43 |
+
self.unnamed_requirements.append(install_req)
|
| 44 |
+
|
| 45 |
+
def add_named_requirement(self, install_req: InstallRequirement) -> None:
|
| 46 |
+
assert install_req.name
|
| 47 |
+
|
| 48 |
+
project_name = canonicalize_name(install_req.name)
|
| 49 |
+
self.requirements[project_name] = install_req
|
| 50 |
+
|
| 51 |
+
def has_requirement(self, name: str) -> bool:
|
| 52 |
+
project_name = canonicalize_name(name)
|
| 53 |
+
|
| 54 |
+
return (
|
| 55 |
+
project_name in self.requirements
|
| 56 |
+
and not self.requirements[project_name].constraint
|
| 57 |
+
)
|
| 58 |
+
|
| 59 |
+
def get_requirement(self, name: str) -> InstallRequirement:
|
| 60 |
+
project_name = canonicalize_name(name)
|
| 61 |
+
|
| 62 |
+
if project_name in self.requirements:
|
| 63 |
+
return self.requirements[project_name]
|
| 64 |
+
|
| 65 |
+
raise KeyError(f"No project with the name {name!r}")
|
| 66 |
+
|
| 67 |
+
@property
|
| 68 |
+
def all_requirements(self) -> List[InstallRequirement]:
|
| 69 |
+
return self.unnamed_requirements + list(self.requirements.values())
|
| 70 |
+
|
| 71 |
+
@property
|
| 72 |
+
def requirements_to_install(self) -> List[InstallRequirement]:
|
| 73 |
+
"""Return the list of requirements that need to be installed.
|
| 74 |
+
|
| 75 |
+
TODO remove this property together with the legacy resolver, since the new
|
| 76 |
+
resolver only returns requirements that need to be installed.
|
| 77 |
+
"""
|
| 78 |
+
return [
|
| 79 |
+
install_req
|
| 80 |
+
for install_req in self.all_requirements
|
| 81 |
+
if not install_req.constraint and not install_req.satisfied_by
|
| 82 |
+
]
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/req/req_uninstall.py
ADDED
|
@@ -0,0 +1,633 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import functools
|
| 2 |
+
import os
|
| 3 |
+
import sys
|
| 4 |
+
import sysconfig
|
| 5 |
+
from importlib.util import cache_from_source
|
| 6 |
+
from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple
|
| 7 |
+
|
| 8 |
+
from pip._internal.exceptions import LegacyDistutilsInstall, UninstallMissingRecord
|
| 9 |
+
from pip._internal.locations import get_bin_prefix, get_bin_user
|
| 10 |
+
from pip._internal.metadata import BaseDistribution
|
| 11 |
+
from pip._internal.utils.compat import WINDOWS
|
| 12 |
+
from pip._internal.utils.egg_link import egg_link_path_from_location
|
| 13 |
+
from pip._internal.utils.logging import getLogger, indent_log
|
| 14 |
+
from pip._internal.utils.misc import ask, normalize_path, renames, rmtree
|
| 15 |
+
from pip._internal.utils.temp_dir import AdjacentTempDirectory, TempDirectory
|
| 16 |
+
from pip._internal.utils.virtualenv import running_under_virtualenv
|
| 17 |
+
|
| 18 |
+
logger = getLogger(__name__)
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
def _script_names(
|
| 22 |
+
bin_dir: str, script_name: str, is_gui: bool
|
| 23 |
+
) -> Generator[str, None, None]:
|
| 24 |
+
"""Create the fully qualified name of the files created by
|
| 25 |
+
{console,gui}_scripts for the given ``dist``.
|
| 26 |
+
Returns the list of file names
|
| 27 |
+
"""
|
| 28 |
+
exe_name = os.path.join(bin_dir, script_name)
|
| 29 |
+
yield exe_name
|
| 30 |
+
if not WINDOWS:
|
| 31 |
+
return
|
| 32 |
+
yield f"{exe_name}.exe"
|
| 33 |
+
yield f"{exe_name}.exe.manifest"
|
| 34 |
+
if is_gui:
|
| 35 |
+
yield f"{exe_name}-script.pyw"
|
| 36 |
+
else:
|
| 37 |
+
yield f"{exe_name}-script.py"
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
def _unique(
|
| 41 |
+
fn: Callable[..., Generator[Any, None, None]]
|
| 42 |
+
) -> Callable[..., Generator[Any, None, None]]:
|
| 43 |
+
@functools.wraps(fn)
|
| 44 |
+
def unique(*args: Any, **kw: Any) -> Generator[Any, None, None]:
|
| 45 |
+
seen: Set[Any] = set()
|
| 46 |
+
for item in fn(*args, **kw):
|
| 47 |
+
if item not in seen:
|
| 48 |
+
seen.add(item)
|
| 49 |
+
yield item
|
| 50 |
+
|
| 51 |
+
return unique
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
@_unique
|
| 55 |
+
def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]:
|
| 56 |
+
"""
|
| 57 |
+
Yield all the uninstallation paths for dist based on RECORD-without-.py[co]
|
| 58 |
+
|
| 59 |
+
Yield paths to all the files in RECORD. For each .py file in RECORD, add
|
| 60 |
+
the .pyc and .pyo in the same directory.
|
| 61 |
+
|
| 62 |
+
UninstallPathSet.add() takes care of the __pycache__ .py[co].
|
| 63 |
+
|
| 64 |
+
If RECORD is not found, raises an error,
|
| 65 |
+
with possible information from the INSTALLER file.
|
| 66 |
+
|
| 67 |
+
https://packaging.python.org/specifications/recording-installed-packages/
|
| 68 |
+
"""
|
| 69 |
+
location = dist.location
|
| 70 |
+
assert location is not None, "not installed"
|
| 71 |
+
|
| 72 |
+
entries = dist.iter_declared_entries()
|
| 73 |
+
if entries is None:
|
| 74 |
+
raise UninstallMissingRecord(distribution=dist)
|
| 75 |
+
|
| 76 |
+
for entry in entries:
|
| 77 |
+
path = os.path.join(location, entry)
|
| 78 |
+
yield path
|
| 79 |
+
if path.endswith(".py"):
|
| 80 |
+
dn, fn = os.path.split(path)
|
| 81 |
+
base = fn[:-3]
|
| 82 |
+
path = os.path.join(dn, base + ".pyc")
|
| 83 |
+
yield path
|
| 84 |
+
path = os.path.join(dn, base + ".pyo")
|
| 85 |
+
yield path
|
| 86 |
+
|
| 87 |
+
|
| 88 |
+
def compact(paths: Iterable[str]) -> Set[str]:
|
| 89 |
+
"""Compact a path set to contain the minimal number of paths
|
| 90 |
+
necessary to contain all paths in the set. If /a/path/ and
|
| 91 |
+
/a/path/to/a/file.txt are both in the set, leave only the
|
| 92 |
+
shorter path."""
|
| 93 |
+
|
| 94 |
+
sep = os.path.sep
|
| 95 |
+
short_paths: Set[str] = set()
|
| 96 |
+
for path in sorted(paths, key=len):
|
| 97 |
+
should_skip = any(
|
| 98 |
+
path.startswith(shortpath.rstrip("*"))
|
| 99 |
+
and path[len(shortpath.rstrip("*").rstrip(sep))] == sep
|
| 100 |
+
for shortpath in short_paths
|
| 101 |
+
)
|
| 102 |
+
if not should_skip:
|
| 103 |
+
short_paths.add(path)
|
| 104 |
+
return short_paths
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
def compress_for_rename(paths: Iterable[str]) -> Set[str]:
|
| 108 |
+
"""Returns a set containing the paths that need to be renamed.
|
| 109 |
+
|
| 110 |
+
This set may include directories when the original sequence of paths
|
| 111 |
+
included every file on disk.
|
| 112 |
+
"""
|
| 113 |
+
case_map = {os.path.normcase(p): p for p in paths}
|
| 114 |
+
remaining = set(case_map)
|
| 115 |
+
unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len)
|
| 116 |
+
wildcards: Set[str] = set()
|
| 117 |
+
|
| 118 |
+
def norm_join(*a: str) -> str:
|
| 119 |
+
return os.path.normcase(os.path.join(*a))
|
| 120 |
+
|
| 121 |
+
for root in unchecked:
|
| 122 |
+
if any(os.path.normcase(root).startswith(w) for w in wildcards):
|
| 123 |
+
# This directory has already been handled.
|
| 124 |
+
continue
|
| 125 |
+
|
| 126 |
+
all_files: Set[str] = set()
|
| 127 |
+
all_subdirs: Set[str] = set()
|
| 128 |
+
for dirname, subdirs, files in os.walk(root):
|
| 129 |
+
all_subdirs.update(norm_join(root, dirname, d) for d in subdirs)
|
| 130 |
+
all_files.update(norm_join(root, dirname, f) for f in files)
|
| 131 |
+
# If all the files we found are in our remaining set of files to
|
| 132 |
+
# remove, then remove them from the latter set and add a wildcard
|
| 133 |
+
# for the directory.
|
| 134 |
+
if not (all_files - remaining):
|
| 135 |
+
remaining.difference_update(all_files)
|
| 136 |
+
wildcards.add(root + os.sep)
|
| 137 |
+
|
| 138 |
+
return set(map(case_map.__getitem__, remaining)) | wildcards
|
| 139 |
+
|
| 140 |
+
|
| 141 |
+
def compress_for_output_listing(paths: Iterable[str]) -> Tuple[Set[str], Set[str]]:
|
| 142 |
+
"""Returns a tuple of 2 sets of which paths to display to user
|
| 143 |
+
|
| 144 |
+
The first set contains paths that would be deleted. Files of a package
|
| 145 |
+
are not added and the top-level directory of the package has a '*' added
|
| 146 |
+
at the end - to signify that all it's contents are removed.
|
| 147 |
+
|
| 148 |
+
The second set contains files that would have been skipped in the above
|
| 149 |
+
folders.
|
| 150 |
+
"""
|
| 151 |
+
|
| 152 |
+
will_remove = set(paths)
|
| 153 |
+
will_skip = set()
|
| 154 |
+
|
| 155 |
+
# Determine folders and files
|
| 156 |
+
folders = set()
|
| 157 |
+
files = set()
|
| 158 |
+
for path in will_remove:
|
| 159 |
+
if path.endswith(".pyc"):
|
| 160 |
+
continue
|
| 161 |
+
if path.endswith("__init__.py") or ".dist-info" in path:
|
| 162 |
+
folders.add(os.path.dirname(path))
|
| 163 |
+
files.add(path)
|
| 164 |
+
|
| 165 |
+
_normcased_files = set(map(os.path.normcase, files))
|
| 166 |
+
|
| 167 |
+
folders = compact(folders)
|
| 168 |
+
|
| 169 |
+
# This walks the tree using os.walk to not miss extra folders
|
| 170 |
+
# that might get added.
|
| 171 |
+
for folder in folders:
|
| 172 |
+
for dirpath, _, dirfiles in os.walk(folder):
|
| 173 |
+
for fname in dirfiles:
|
| 174 |
+
if fname.endswith(".pyc"):
|
| 175 |
+
continue
|
| 176 |
+
|
| 177 |
+
file_ = os.path.join(dirpath, fname)
|
| 178 |
+
if (
|
| 179 |
+
os.path.isfile(file_)
|
| 180 |
+
and os.path.normcase(file_) not in _normcased_files
|
| 181 |
+
):
|
| 182 |
+
# We are skipping this file. Add it to the set.
|
| 183 |
+
will_skip.add(file_)
|
| 184 |
+
|
| 185 |
+
will_remove = files | {os.path.join(folder, "*") for folder in folders}
|
| 186 |
+
|
| 187 |
+
return will_remove, will_skip
|
| 188 |
+
|
| 189 |
+
|
| 190 |
+
class StashedUninstallPathSet:
|
| 191 |
+
"""A set of file rename operations to stash files while
|
| 192 |
+
tentatively uninstalling them."""
|
| 193 |
+
|
| 194 |
+
def __init__(self) -> None:
|
| 195 |
+
# Mapping from source file root to [Adjacent]TempDirectory
|
| 196 |
+
# for files under that directory.
|
| 197 |
+
self._save_dirs: Dict[str, TempDirectory] = {}
|
| 198 |
+
# (old path, new path) tuples for each move that may need
|
| 199 |
+
# to be undone.
|
| 200 |
+
self._moves: List[Tuple[str, str]] = []
|
| 201 |
+
|
| 202 |
+
def _get_directory_stash(self, path: str) -> str:
|
| 203 |
+
"""Stashes a directory.
|
| 204 |
+
|
| 205 |
+
Directories are stashed adjacent to their original location if
|
| 206 |
+
possible, or else moved/copied into the user's temp dir."""
|
| 207 |
+
|
| 208 |
+
try:
|
| 209 |
+
save_dir: TempDirectory = AdjacentTempDirectory(path)
|
| 210 |
+
except OSError:
|
| 211 |
+
save_dir = TempDirectory(kind="uninstall")
|
| 212 |
+
self._save_dirs[os.path.normcase(path)] = save_dir
|
| 213 |
+
|
| 214 |
+
return save_dir.path
|
| 215 |
+
|
| 216 |
+
def _get_file_stash(self, path: str) -> str:
|
| 217 |
+
"""Stashes a file.
|
| 218 |
+
|
| 219 |
+
If no root has been provided, one will be created for the directory
|
| 220 |
+
in the user's temp directory."""
|
| 221 |
+
path = os.path.normcase(path)
|
| 222 |
+
head, old_head = os.path.dirname(path), None
|
| 223 |
+
save_dir = None
|
| 224 |
+
|
| 225 |
+
while head != old_head:
|
| 226 |
+
try:
|
| 227 |
+
save_dir = self._save_dirs[head]
|
| 228 |
+
break
|
| 229 |
+
except KeyError:
|
| 230 |
+
pass
|
| 231 |
+
head, old_head = os.path.dirname(head), head
|
| 232 |
+
else:
|
| 233 |
+
# Did not find any suitable root
|
| 234 |
+
head = os.path.dirname(path)
|
| 235 |
+
save_dir = TempDirectory(kind="uninstall")
|
| 236 |
+
self._save_dirs[head] = save_dir
|
| 237 |
+
|
| 238 |
+
relpath = os.path.relpath(path, head)
|
| 239 |
+
if relpath and relpath != os.path.curdir:
|
| 240 |
+
return os.path.join(save_dir.path, relpath)
|
| 241 |
+
return save_dir.path
|
| 242 |
+
|
| 243 |
+
def stash(self, path: str) -> str:
|
| 244 |
+
"""Stashes the directory or file and returns its new location.
|
| 245 |
+
Handle symlinks as files to avoid modifying the symlink targets.
|
| 246 |
+
"""
|
| 247 |
+
path_is_dir = os.path.isdir(path) and not os.path.islink(path)
|
| 248 |
+
if path_is_dir:
|
| 249 |
+
new_path = self._get_directory_stash(path)
|
| 250 |
+
else:
|
| 251 |
+
new_path = self._get_file_stash(path)
|
| 252 |
+
|
| 253 |
+
self._moves.append((path, new_path))
|
| 254 |
+
if path_is_dir and os.path.isdir(new_path):
|
| 255 |
+
# If we're moving a directory, we need to
|
| 256 |
+
# remove the destination first or else it will be
|
| 257 |
+
# moved to inside the existing directory.
|
| 258 |
+
# We just created new_path ourselves, so it will
|
| 259 |
+
# be removable.
|
| 260 |
+
os.rmdir(new_path)
|
| 261 |
+
renames(path, new_path)
|
| 262 |
+
return new_path
|
| 263 |
+
|
| 264 |
+
def commit(self) -> None:
|
| 265 |
+
"""Commits the uninstall by removing stashed files."""
|
| 266 |
+
for save_dir in self._save_dirs.values():
|
| 267 |
+
save_dir.cleanup()
|
| 268 |
+
self._moves = []
|
| 269 |
+
self._save_dirs = {}
|
| 270 |
+
|
| 271 |
+
def rollback(self) -> None:
|
| 272 |
+
"""Undoes the uninstall by moving stashed files back."""
|
| 273 |
+
for p in self._moves:
|
| 274 |
+
logger.info("Moving to %s\n from %s", *p)
|
| 275 |
+
|
| 276 |
+
for new_path, path in self._moves:
|
| 277 |
+
try:
|
| 278 |
+
logger.debug("Replacing %s from %s", new_path, path)
|
| 279 |
+
if os.path.isfile(new_path) or os.path.islink(new_path):
|
| 280 |
+
os.unlink(new_path)
|
| 281 |
+
elif os.path.isdir(new_path):
|
| 282 |
+
rmtree(new_path)
|
| 283 |
+
renames(path, new_path)
|
| 284 |
+
except OSError as ex:
|
| 285 |
+
logger.error("Failed to restore %s", new_path)
|
| 286 |
+
logger.debug("Exception: %s", ex)
|
| 287 |
+
|
| 288 |
+
self.commit()
|
| 289 |
+
|
| 290 |
+
@property
|
| 291 |
+
def can_rollback(self) -> bool:
|
| 292 |
+
return bool(self._moves)
|
| 293 |
+
|
| 294 |
+
|
| 295 |
+
class UninstallPathSet:
|
| 296 |
+
"""A set of file paths to be removed in the uninstallation of a
|
| 297 |
+
requirement."""
|
| 298 |
+
|
| 299 |
+
def __init__(self, dist: BaseDistribution) -> None:
|
| 300 |
+
self._paths: Set[str] = set()
|
| 301 |
+
self._refuse: Set[str] = set()
|
| 302 |
+
self._pth: Dict[str, UninstallPthEntries] = {}
|
| 303 |
+
self._dist = dist
|
| 304 |
+
self._moved_paths = StashedUninstallPathSet()
|
| 305 |
+
# Create local cache of normalize_path results. Creating an UninstallPathSet
|
| 306 |
+
# can result in hundreds/thousands of redundant calls to normalize_path with
|
| 307 |
+
# the same args, which hurts performance.
|
| 308 |
+
self._normalize_path_cached = functools.lru_cache(normalize_path)
|
| 309 |
+
|
| 310 |
+
def _permitted(self, path: str) -> bool:
|
| 311 |
+
"""
|
| 312 |
+
Return True if the given path is one we are permitted to
|
| 313 |
+
remove/modify, False otherwise.
|
| 314 |
+
|
| 315 |
+
"""
|
| 316 |
+
# aka is_local, but caching normalized sys.prefix
|
| 317 |
+
if not running_under_virtualenv():
|
| 318 |
+
return True
|
| 319 |
+
return path.startswith(self._normalize_path_cached(sys.prefix))
|
| 320 |
+
|
| 321 |
+
def add(self, path: str) -> None:
|
| 322 |
+
head, tail = os.path.split(path)
|
| 323 |
+
|
| 324 |
+
# we normalize the head to resolve parent directory symlinks, but not
|
| 325 |
+
# the tail, since we only want to uninstall symlinks, not their targets
|
| 326 |
+
path = os.path.join(self._normalize_path_cached(head), os.path.normcase(tail))
|
| 327 |
+
|
| 328 |
+
if not os.path.exists(path):
|
| 329 |
+
return
|
| 330 |
+
if self._permitted(path):
|
| 331 |
+
self._paths.add(path)
|
| 332 |
+
else:
|
| 333 |
+
self._refuse.add(path)
|
| 334 |
+
|
| 335 |
+
# __pycache__ files can show up after 'installed-files.txt' is created,
|
| 336 |
+
# due to imports
|
| 337 |
+
if os.path.splitext(path)[1] == ".py":
|
| 338 |
+
self.add(cache_from_source(path))
|
| 339 |
+
|
| 340 |
+
def add_pth(self, pth_file: str, entry: str) -> None:
|
| 341 |
+
pth_file = self._normalize_path_cached(pth_file)
|
| 342 |
+
if self._permitted(pth_file):
|
| 343 |
+
if pth_file not in self._pth:
|
| 344 |
+
self._pth[pth_file] = UninstallPthEntries(pth_file)
|
| 345 |
+
self._pth[pth_file].add(entry)
|
| 346 |
+
else:
|
| 347 |
+
self._refuse.add(pth_file)
|
| 348 |
+
|
| 349 |
+
def remove(self, auto_confirm: bool = False, verbose: bool = False) -> None:
|
| 350 |
+
"""Remove paths in ``self._paths`` with confirmation (unless
|
| 351 |
+
``auto_confirm`` is True)."""
|
| 352 |
+
|
| 353 |
+
if not self._paths:
|
| 354 |
+
logger.info(
|
| 355 |
+
"Can't uninstall '%s'. No files were found to uninstall.",
|
| 356 |
+
self._dist.raw_name,
|
| 357 |
+
)
|
| 358 |
+
return
|
| 359 |
+
|
| 360 |
+
dist_name_version = f"{self._dist.raw_name}-{self._dist.raw_version}"
|
| 361 |
+
logger.info("Uninstalling %s:", dist_name_version)
|
| 362 |
+
|
| 363 |
+
with indent_log():
|
| 364 |
+
if auto_confirm or self._allowed_to_proceed(verbose):
|
| 365 |
+
moved = self._moved_paths
|
| 366 |
+
|
| 367 |
+
for_rename = compress_for_rename(self._paths)
|
| 368 |
+
|
| 369 |
+
for path in sorted(compact(for_rename)):
|
| 370 |
+
moved.stash(path)
|
| 371 |
+
logger.verbose("Removing file or directory %s", path)
|
| 372 |
+
|
| 373 |
+
for pth in self._pth.values():
|
| 374 |
+
pth.remove()
|
| 375 |
+
|
| 376 |
+
logger.info("Successfully uninstalled %s", dist_name_version)
|
| 377 |
+
|
| 378 |
+
def _allowed_to_proceed(self, verbose: bool) -> bool:
|
| 379 |
+
"""Display which files would be deleted and prompt for confirmation"""
|
| 380 |
+
|
| 381 |
+
def _display(msg: str, paths: Iterable[str]) -> None:
|
| 382 |
+
if not paths:
|
| 383 |
+
return
|
| 384 |
+
|
| 385 |
+
logger.info(msg)
|
| 386 |
+
with indent_log():
|
| 387 |
+
for path in sorted(compact(paths)):
|
| 388 |
+
logger.info(path)
|
| 389 |
+
|
| 390 |
+
if not verbose:
|
| 391 |
+
will_remove, will_skip = compress_for_output_listing(self._paths)
|
| 392 |
+
else:
|
| 393 |
+
# In verbose mode, display all the files that are going to be
|
| 394 |
+
# deleted.
|
| 395 |
+
will_remove = set(self._paths)
|
| 396 |
+
will_skip = set()
|
| 397 |
+
|
| 398 |
+
_display("Would remove:", will_remove)
|
| 399 |
+
_display("Would not remove (might be manually added):", will_skip)
|
| 400 |
+
_display("Would not remove (outside of prefix):", self._refuse)
|
| 401 |
+
if verbose:
|
| 402 |
+
_display("Will actually move:", compress_for_rename(self._paths))
|
| 403 |
+
|
| 404 |
+
return ask("Proceed (Y/n)? ", ("y", "n", "")) != "n"
|
| 405 |
+
|
| 406 |
+
def rollback(self) -> None:
|
| 407 |
+
"""Rollback the changes previously made by remove()."""
|
| 408 |
+
if not self._moved_paths.can_rollback:
|
| 409 |
+
logger.error(
|
| 410 |
+
"Can't roll back %s; was not uninstalled",
|
| 411 |
+
self._dist.raw_name,
|
| 412 |
+
)
|
| 413 |
+
return
|
| 414 |
+
logger.info("Rolling back uninstall of %s", self._dist.raw_name)
|
| 415 |
+
self._moved_paths.rollback()
|
| 416 |
+
for pth in self._pth.values():
|
| 417 |
+
pth.rollback()
|
| 418 |
+
|
| 419 |
+
def commit(self) -> None:
|
| 420 |
+
"""Remove temporary save dir: rollback will no longer be possible."""
|
| 421 |
+
self._moved_paths.commit()
|
| 422 |
+
|
| 423 |
+
@classmethod
|
| 424 |
+
def from_dist(cls, dist: BaseDistribution) -> "UninstallPathSet":
|
| 425 |
+
dist_location = dist.location
|
| 426 |
+
info_location = dist.info_location
|
| 427 |
+
if dist_location is None:
|
| 428 |
+
logger.info(
|
| 429 |
+
"Not uninstalling %s since it is not installed",
|
| 430 |
+
dist.canonical_name,
|
| 431 |
+
)
|
| 432 |
+
return cls(dist)
|
| 433 |
+
|
| 434 |
+
normalized_dist_location = normalize_path(dist_location)
|
| 435 |
+
if not dist.local:
|
| 436 |
+
logger.info(
|
| 437 |
+
"Not uninstalling %s at %s, outside environment %s",
|
| 438 |
+
dist.canonical_name,
|
| 439 |
+
normalized_dist_location,
|
| 440 |
+
sys.prefix,
|
| 441 |
+
)
|
| 442 |
+
return cls(dist)
|
| 443 |
+
|
| 444 |
+
if normalized_dist_location in {
|
| 445 |
+
p
|
| 446 |
+
for p in {sysconfig.get_path("stdlib"), sysconfig.get_path("platstdlib")}
|
| 447 |
+
if p
|
| 448 |
+
}:
|
| 449 |
+
logger.info(
|
| 450 |
+
"Not uninstalling %s at %s, as it is in the standard library.",
|
| 451 |
+
dist.canonical_name,
|
| 452 |
+
normalized_dist_location,
|
| 453 |
+
)
|
| 454 |
+
return cls(dist)
|
| 455 |
+
|
| 456 |
+
paths_to_remove = cls(dist)
|
| 457 |
+
develop_egg_link = egg_link_path_from_location(dist.raw_name)
|
| 458 |
+
|
| 459 |
+
# Distribution is installed with metadata in a "flat" .egg-info
|
| 460 |
+
# directory. This means it is not a modern .dist-info installation, an
|
| 461 |
+
# egg, or legacy editable.
|
| 462 |
+
setuptools_flat_installation = (
|
| 463 |
+
dist.installed_with_setuptools_egg_info
|
| 464 |
+
and info_location is not None
|
| 465 |
+
and os.path.exists(info_location)
|
| 466 |
+
# If dist is editable and the location points to a ``.egg-info``,
|
| 467 |
+
# we are in fact in the legacy editable case.
|
| 468 |
+
and not info_location.endswith(f"{dist.setuptools_filename}.egg-info")
|
| 469 |
+
)
|
| 470 |
+
|
| 471 |
+
# Uninstall cases order do matter as in the case of 2 installs of the
|
| 472 |
+
# same package, pip needs to uninstall the currently detected version
|
| 473 |
+
if setuptools_flat_installation:
|
| 474 |
+
if info_location is not None:
|
| 475 |
+
paths_to_remove.add(info_location)
|
| 476 |
+
installed_files = dist.iter_declared_entries()
|
| 477 |
+
if installed_files is not None:
|
| 478 |
+
for installed_file in installed_files:
|
| 479 |
+
paths_to_remove.add(os.path.join(dist_location, installed_file))
|
| 480 |
+
# FIXME: need a test for this elif block
|
| 481 |
+
# occurs with --single-version-externally-managed/--record outside
|
| 482 |
+
# of pip
|
| 483 |
+
elif dist.is_file("top_level.txt"):
|
| 484 |
+
try:
|
| 485 |
+
namespace_packages = dist.read_text("namespace_packages.txt")
|
| 486 |
+
except FileNotFoundError:
|
| 487 |
+
namespaces = []
|
| 488 |
+
else:
|
| 489 |
+
namespaces = namespace_packages.splitlines(keepends=False)
|
| 490 |
+
for top_level_pkg in [
|
| 491 |
+
p
|
| 492 |
+
for p in dist.read_text("top_level.txt").splitlines()
|
| 493 |
+
if p and p not in namespaces
|
| 494 |
+
]:
|
| 495 |
+
path = os.path.join(dist_location, top_level_pkg)
|
| 496 |
+
paths_to_remove.add(path)
|
| 497 |
+
paths_to_remove.add(f"{path}.py")
|
| 498 |
+
paths_to_remove.add(f"{path}.pyc")
|
| 499 |
+
paths_to_remove.add(f"{path}.pyo")
|
| 500 |
+
|
| 501 |
+
elif dist.installed_by_distutils:
|
| 502 |
+
raise LegacyDistutilsInstall(distribution=dist)
|
| 503 |
+
|
| 504 |
+
elif dist.installed_as_egg:
|
| 505 |
+
# package installed by easy_install
|
| 506 |
+
# We cannot match on dist.egg_name because it can slightly vary
|
| 507 |
+
# i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg
|
| 508 |
+
paths_to_remove.add(dist_location)
|
| 509 |
+
easy_install_egg = os.path.split(dist_location)[1]
|
| 510 |
+
easy_install_pth = os.path.join(
|
| 511 |
+
os.path.dirname(dist_location),
|
| 512 |
+
"easy-install.pth",
|
| 513 |
+
)
|
| 514 |
+
paths_to_remove.add_pth(easy_install_pth, "./" + easy_install_egg)
|
| 515 |
+
|
| 516 |
+
elif dist.installed_with_dist_info:
|
| 517 |
+
for path in uninstallation_paths(dist):
|
| 518 |
+
paths_to_remove.add(path)
|
| 519 |
+
|
| 520 |
+
elif develop_egg_link:
|
| 521 |
+
# PEP 660 modern editable is handled in the ``.dist-info`` case
|
| 522 |
+
# above, so this only covers the setuptools-style editable.
|
| 523 |
+
with open(develop_egg_link) as fh:
|
| 524 |
+
link_pointer = os.path.normcase(fh.readline().strip())
|
| 525 |
+
normalized_link_pointer = paths_to_remove._normalize_path_cached(
|
| 526 |
+
link_pointer
|
| 527 |
+
)
|
| 528 |
+
assert os.path.samefile(
|
| 529 |
+
normalized_link_pointer, normalized_dist_location
|
| 530 |
+
), (
|
| 531 |
+
f"Egg-link {develop_egg_link} (to {link_pointer}) does not match "
|
| 532 |
+
f"installed location of {dist.raw_name} (at {dist_location})"
|
| 533 |
+
)
|
| 534 |
+
paths_to_remove.add(develop_egg_link)
|
| 535 |
+
easy_install_pth = os.path.join(
|
| 536 |
+
os.path.dirname(develop_egg_link), "easy-install.pth"
|
| 537 |
+
)
|
| 538 |
+
paths_to_remove.add_pth(easy_install_pth, dist_location)
|
| 539 |
+
|
| 540 |
+
else:
|
| 541 |
+
logger.debug(
|
| 542 |
+
"Not sure how to uninstall: %s - Check: %s",
|
| 543 |
+
dist,
|
| 544 |
+
dist_location,
|
| 545 |
+
)
|
| 546 |
+
|
| 547 |
+
if dist.in_usersite:
|
| 548 |
+
bin_dir = get_bin_user()
|
| 549 |
+
else:
|
| 550 |
+
bin_dir = get_bin_prefix()
|
| 551 |
+
|
| 552 |
+
# find distutils scripts= scripts
|
| 553 |
+
try:
|
| 554 |
+
for script in dist.iter_distutils_script_names():
|
| 555 |
+
paths_to_remove.add(os.path.join(bin_dir, script))
|
| 556 |
+
if WINDOWS:
|
| 557 |
+
paths_to_remove.add(os.path.join(bin_dir, f"{script}.bat"))
|
| 558 |
+
except (FileNotFoundError, NotADirectoryError):
|
| 559 |
+
pass
|
| 560 |
+
|
| 561 |
+
# find console_scripts and gui_scripts
|
| 562 |
+
def iter_scripts_to_remove(
|
| 563 |
+
dist: BaseDistribution,
|
| 564 |
+
bin_dir: str,
|
| 565 |
+
) -> Generator[str, None, None]:
|
| 566 |
+
for entry_point in dist.iter_entry_points():
|
| 567 |
+
if entry_point.group == "console_scripts":
|
| 568 |
+
yield from _script_names(bin_dir, entry_point.name, False)
|
| 569 |
+
elif entry_point.group == "gui_scripts":
|
| 570 |
+
yield from _script_names(bin_dir, entry_point.name, True)
|
| 571 |
+
|
| 572 |
+
for s in iter_scripts_to_remove(dist, bin_dir):
|
| 573 |
+
paths_to_remove.add(s)
|
| 574 |
+
|
| 575 |
+
return paths_to_remove
|
| 576 |
+
|
| 577 |
+
|
| 578 |
+
class UninstallPthEntries:
|
| 579 |
+
def __init__(self, pth_file: str) -> None:
|
| 580 |
+
self.file = pth_file
|
| 581 |
+
self.entries: Set[str] = set()
|
| 582 |
+
self._saved_lines: Optional[List[bytes]] = None
|
| 583 |
+
|
| 584 |
+
def add(self, entry: str) -> None:
|
| 585 |
+
entry = os.path.normcase(entry)
|
| 586 |
+
# On Windows, os.path.normcase converts the entry to use
|
| 587 |
+
# backslashes. This is correct for entries that describe absolute
|
| 588 |
+
# paths outside of site-packages, but all the others use forward
|
| 589 |
+
# slashes.
|
| 590 |
+
# os.path.splitdrive is used instead of os.path.isabs because isabs
|
| 591 |
+
# treats non-absolute paths with drive letter markings like c:foo\bar
|
| 592 |
+
# as absolute paths. It also does not recognize UNC paths if they don't
|
| 593 |
+
# have more than "\\sever\share". Valid examples: "\\server\share\" or
|
| 594 |
+
# "\\server\share\folder".
|
| 595 |
+
if WINDOWS and not os.path.splitdrive(entry)[0]:
|
| 596 |
+
entry = entry.replace("\\", "/")
|
| 597 |
+
self.entries.add(entry)
|
| 598 |
+
|
| 599 |
+
def remove(self) -> None:
|
| 600 |
+
logger.verbose("Removing pth entries from %s:", self.file)
|
| 601 |
+
|
| 602 |
+
# If the file doesn't exist, log a warning and return
|
| 603 |
+
if not os.path.isfile(self.file):
|
| 604 |
+
logger.warning("Cannot remove entries from nonexistent file %s", self.file)
|
| 605 |
+
return
|
| 606 |
+
with open(self.file, "rb") as fh:
|
| 607 |
+
# windows uses '\r\n' with py3k, but uses '\n' with py2.x
|
| 608 |
+
lines = fh.readlines()
|
| 609 |
+
self._saved_lines = lines
|
| 610 |
+
if any(b"\r\n" in line for line in lines):
|
| 611 |
+
endline = "\r\n"
|
| 612 |
+
else:
|
| 613 |
+
endline = "\n"
|
| 614 |
+
# handle missing trailing newline
|
| 615 |
+
if lines and not lines[-1].endswith(endline.encode("utf-8")):
|
| 616 |
+
lines[-1] = lines[-1] + endline.encode("utf-8")
|
| 617 |
+
for entry in self.entries:
|
| 618 |
+
try:
|
| 619 |
+
logger.verbose("Removing entry: %s", entry)
|
| 620 |
+
lines.remove((entry + endline).encode("utf-8"))
|
| 621 |
+
except ValueError:
|
| 622 |
+
pass
|
| 623 |
+
with open(self.file, "wb") as fh:
|
| 624 |
+
fh.writelines(lines)
|
| 625 |
+
|
| 626 |
+
def rollback(self) -> bool:
|
| 627 |
+
if self._saved_lines is None:
|
| 628 |
+
logger.error("Cannot roll back changes to %s, none were made", self.file)
|
| 629 |
+
return False
|
| 630 |
+
logger.debug("Rolling %s back to previous state", self.file)
|
| 631 |
+
with open(self.file, "wb") as fh:
|
| 632 |
+
fh.writelines(self._saved_lines)
|
| 633 |
+
return True
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/resolution/__init__.py
ADDED
|
File without changes
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/pip/_internal/resolution/legacy/__init__.py
ADDED
|
File without changes
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/autograd.cpython-311.pyc
ADDED
|
Binary file (31.8 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/lazy.cpython-311.pyc
ADDED
|
Binary file (20 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/structured.cpython-311.pyc
ADDED
|
Binary file (7.85 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/__pycache__/translate.cpython-311.pyc
ADDED
|
Binary file (18.4 kB). View file
|
|
|
tuning-competition-baseline/.venv/lib/python3.11/site-packages/torchgen/api/functionalization.py
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import List, Optional
|
| 2 |
+
|
| 3 |
+
from torchgen.api import dispatcher
|
| 4 |
+
from torchgen.api.types import (
|
| 5 |
+
BaseCppType,
|
| 6 |
+
BaseCType,
|
| 7 |
+
Binding,
|
| 8 |
+
boolT,
|
| 9 |
+
ConstRefCType,
|
| 10 |
+
CType,
|
| 11 |
+
longT,
|
| 12 |
+
NamedCType,
|
| 13 |
+
tensorT,
|
| 14 |
+
)
|
| 15 |
+
from torchgen.model import (
|
| 16 |
+
Argument,
|
| 17 |
+
BaseTy,
|
| 18 |
+
BaseType,
|
| 19 |
+
FunctionSchema,
|
| 20 |
+
NativeFunction,
|
| 21 |
+
NativeFunctionsViewGroup,
|
| 22 |
+
)
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
# This file describes the translation of JIT schema to API's used
|
| 26 |
+
# when creating view lambdas that are used by the functionalization pass.
|
| 27 |
+
# There are two types of lambdas: forward lambdas and reverse lambdas.
|
| 28 |
+
# These API's mostly follow the dispatcher API, with a few quirks:
|
| 29 |
+
# - The lambda capture has to convert reference types to value types
|
| 30 |
+
# - While the forward lambda just directly calls into the at::_ops API
|
| 31 |
+
# (following the dispatcher convention), the logic here for the reverse lambda
|
| 32 |
+
# is responsible for generating both the call-site, and the declarations
|
| 33 |
+
# (which are implemented manually in the at::functionalization::impl namespace).
|
| 34 |
+
|
| 35 |
+
# The lambdas generated for each view op in the functionalization pass are of the form
|
| 36 |
+
# [capture_arguments](outer_arguments) -> returns_type {
|
| 37 |
+
# return name(inner_arguments);
|
| 38 |
+
# }
|
| 39 |
+
|
| 40 |
+
# Define some specific lambda input arguments.
|
| 41 |
+
base_binding = Binding(
|
| 42 |
+
name="base",
|
| 43 |
+
nctype=NamedCType(name="base", type=ConstRefCType(BaseCType(tensorT))),
|
| 44 |
+
argument=Argument(
|
| 45 |
+
name="base", type=BaseType(BaseTy.Tensor), default=None, annotation=None
|
| 46 |
+
),
|
| 47 |
+
default=None,
|
| 48 |
+
)
|
| 49 |
+
mutated_view_binding = Binding(
|
| 50 |
+
name="mutated_view",
|
| 51 |
+
nctype=NamedCType(name="mutated_view", type=ConstRefCType(BaseCType(tensorT))),
|
| 52 |
+
argument=Argument(
|
| 53 |
+
name="base", type=BaseType(BaseTy.Tensor), default=None, annotation=None
|
| 54 |
+
),
|
| 55 |
+
default=None,
|
| 56 |
+
)
|
| 57 |
+
mutated_view_idx_binding = Binding(
|
| 58 |
+
name="mutated_view_idx",
|
| 59 |
+
nctype=NamedCType(name="mutated_view_idx", type=BaseCType(longT)),
|
| 60 |
+
argument=Argument(
|
| 61 |
+
name="base", type=BaseType(BaseTy.Tensor), default=None, annotation=None
|
| 62 |
+
),
|
| 63 |
+
default=None,
|
| 64 |
+
)
|
| 65 |
+
reapply_views_binding = Binding(
|
| 66 |
+
name="reapply_views",
|
| 67 |
+
nctype=NamedCType(name="reapply_views", type=BaseCType(boolT)),
|
| 68 |
+
argument=Argument(
|
| 69 |
+
name="reapply_views", type=BaseType(BaseTy.bool), default=None, annotation=None
|
| 70 |
+
),
|
| 71 |
+
default=None,
|
| 72 |
+
)
|
| 73 |
+
|
| 74 |
+
InverseReturnModeT = BaseCppType("at::functionalization", "InverseReturnMode")
|
| 75 |
+
inverse_return_mode_binding = Binding(
|
| 76 |
+
name="inverse_return_mode",
|
| 77 |
+
nctype=NamedCType(name="inverse_return_mode", type=BaseCType(InverseReturnModeT)),
|
| 78 |
+
argument=Argument(
|
| 79 |
+
name="inverse_return_mode",
|
| 80 |
+
# NB: not actually a bool but it doesn't matter because this isn't used
|
| 81 |
+
type=BaseType(BaseTy.bool),
|
| 82 |
+
default=None,
|
| 83 |
+
annotation=None,
|
| 84 |
+
),
|
| 85 |
+
default=None,
|
| 86 |
+
)
|
| 87 |
+
|
| 88 |
+
|
| 89 |
+
# The lambda capture itself doesn't have a name.
|
| 90 |
+
# The name returned here corresponds to the name of the inner function called by the lambda.
|
| 91 |
+
def name(
|
| 92 |
+
g: NativeFunctionsViewGroup,
|
| 93 |
+
*,
|
| 94 |
+
is_reverse: bool,
|
| 95 |
+
include_namespace: bool,
|
| 96 |
+
reapply_views: Optional[bool] = None,
|
| 97 |
+
) -> str:
|
| 98 |
+
if reapply_views is None:
|
| 99 |
+
# reapply_views is only important for the fwd lambda,
|
| 100 |
+
# since we always plumb the runtime "reapply_views" argument into the reverse function.
|
| 101 |
+
assert is_reverse
|
| 102 |
+
if is_reverse:
|
| 103 |
+
return reverse_name(g.view, include_namespace)
|
| 104 |
+
# in the forward case, we just directly call into the at::_ops API (so we always need the namespace)
|
| 105 |
+
assert include_namespace
|
| 106 |
+
assert g.view_copy is not None
|
| 107 |
+
api_name = (
|
| 108 |
+
g.view.func.name.unambiguous_name()
|
| 109 |
+
if reapply_views
|
| 110 |
+
else g.view_copy.func.name.unambiguous_name()
|
| 111 |
+
)
|
| 112 |
+
return f"at::_ops::{api_name}::call"
|
| 113 |
+
|
| 114 |
+
|
| 115 |
+
def reverse_name(f: NativeFunction, include_namespace: bool) -> str:
|
| 116 |
+
# for the reverse: we plumb the "reapply_views" flag into that function and support
|
| 117 |
+
# both copy and non-copy variants. (We could avoid doing that, but that would require
|
| 118 |
+
# writing out twice as many view inverse functions).
|
| 119 |
+
api_name = f.func.name.unambiguous_name()
|
| 120 |
+
# in the reverse case, we codegen both the call-sites (which need the full namespace) and the declarations (which don't)
|
| 121 |
+
if include_namespace:
|
| 122 |
+
return f"at::functionalization::FunctionalInverses::{api_name}_inverse"
|
| 123 |
+
else:
|
| 124 |
+
return f"{api_name}_inverse"
|
| 125 |
+
|
| 126 |
+
|
| 127 |
+
def capture_arguments(func: FunctionSchema, *, is_reverse: bool) -> List[Binding]:
|
| 128 |
+
# capture arguments include all arguments except `self`.
|
| 129 |
+
# Importantly, they don't include any C++ reference types (or else we'll get a dangling reference in the capture),
|
| 130 |
+
# So any reference types (IntArrayRef) need to be converted to value types (vector<int64_t>)
|
| 131 |
+
args = func.arguments.flat_all
|
| 132 |
+
assert args[0].type == BaseType(BaseTy.Tensor)
|
| 133 |
+
non_self_args = args[1:]
|
| 134 |
+
non_self_value_bindings = [
|
| 135 |
+
dispatcher.argument(a, remove_non_owning_ref_types=True) for a in non_self_args
|
| 136 |
+
]
|
| 137 |
+
|
| 138 |
+
all_bindings = [
|
| 139 |
+
inverse_return_mode_binding if is_reverse else reapply_views_binding
|
| 140 |
+
]
|
| 141 |
+
all_bindings.extend(non_self_value_bindings)
|
| 142 |
+
return all_bindings
|
| 143 |
+
|
| 144 |
+
|
| 145 |
+
def returns_type(func: FunctionSchema) -> CType:
|
| 146 |
+
# Assertion: all view ops return tensor-like outputs
|
| 147 |
+
assert len(func.returns) >= 1
|
| 148 |
+
for ret in func.returns:
|
| 149 |
+
assert ret.type.is_tensor_like()
|
| 150 |
+
# However, the return type of the lambda is always an individual tensor.
|
| 151 |
+
# For multi-tensor outputs, each tensor needs to be tracked individually.
|
| 152 |
+
return BaseCType(tensorT)
|
| 153 |
+
|
| 154 |
+
|
| 155 |
+
def outer_arguments(*, is_reverse: bool) -> List[Binding]:
|
| 156 |
+
if is_reverse:
|
| 157 |
+
return [base_binding, mutated_view_binding, mutated_view_idx_binding]
|
| 158 |
+
else:
|
| 159 |
+
return [base_binding, mutated_view_idx_binding]
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
def inner_call_index(func: FunctionSchema) -> Optional[Binding]:
|
| 163 |
+
# For view ops that return multiple tensors (like `split`), we generate a separate lambda for each output.
|
| 164 |
+
# When we replay a view op that returns multiple tensors, we need to index into the output appropriately
|
| 165 |
+
if len(func.returns) > 1 or (
|
| 166 |
+
len(func.returns) == 1 and func.returns[0].type.is_list_like()
|
| 167 |
+
):
|
| 168 |
+
return mutated_view_idx_binding
|
| 169 |
+
return None
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
def inner_arguments(func: FunctionSchema, is_reverse: bool) -> List[Binding]:
|
| 173 |
+
args = func.arguments.flat_all
|
| 174 |
+
assert args[0].type == BaseType(BaseTy.Tensor)
|
| 175 |
+
non_self_args = args[1:]
|
| 176 |
+
# The forward lambda calls the at::_ops API, while the reverse lambda calls the view inverse API.
|
| 177 |
+
# Both of these follow the dispatcher API.
|
| 178 |
+
non_self_bindings = [dispatcher.argument(a) for a in non_self_args]
|
| 179 |
+
if not is_reverse:
|
| 180 |
+
# the forward lambda swaps out the original tensor argument with the lambd arg "base"
|
| 181 |
+
return [base_binding] + non_self_bindings
|
| 182 |
+
else:
|
| 183 |
+
# the reverse lambda does the same, but with an additional "mutated_view" arg
|
| 184 |
+
# additionally, we have a calling convention: for view ops that return multiple tensor outputs
|
| 185 |
+
# their corresponding view_inverse function takes in an additional index argument.
|
| 186 |
+
index_binding = inner_call_index(func)
|
| 187 |
+
if index_binding is not None:
|
| 188 |
+
return [
|
| 189 |
+
base_binding,
|
| 190 |
+
mutated_view_binding,
|
| 191 |
+
inverse_return_mode_binding,
|
| 192 |
+
index_binding,
|
| 193 |
+
] + non_self_bindings
|
| 194 |
+
else:
|
| 195 |
+
return [
|
| 196 |
+
base_binding,
|
| 197 |
+
mutated_view_binding,
|
| 198 |
+
inverse_return_mode_binding,
|
| 199 |
+
] + non_self_bindings
|