pip 25.2__py3-none-any.whl → 26.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pip/__init__.py +1 -1
- pip/_internal/__init__.py +0 -0
- pip/_internal/build_env.py +265 -8
- pip/_internal/cache.py +1 -1
- pip/_internal/cli/base_command.py +11 -0
- pip/_internal/cli/cmdoptions.py +200 -71
- pip/_internal/cli/index_command.py +20 -0
- pip/_internal/cli/main.py +11 -6
- pip/_internal/cli/main_parser.py +3 -1
- pip/_internal/cli/parser.py +96 -36
- pip/_internal/cli/progress_bars.py +4 -2
- pip/_internal/cli/req_command.py +126 -30
- pip/_internal/commands/cache.py +24 -0
- pip/_internal/commands/completion.py +2 -1
- pip/_internal/commands/download.py +12 -11
- pip/_internal/commands/index.py +13 -6
- pip/_internal/commands/install.py +55 -43
- pip/_internal/commands/list.py +14 -16
- pip/_internal/commands/lock.py +19 -14
- pip/_internal/commands/wheel.py +13 -23
- pip/_internal/configuration.py +1 -2
- pip/_internal/distributions/sdist.py +13 -14
- pip/_internal/exceptions.py +96 -6
- pip/_internal/index/collector.py +2 -3
- pip/_internal/index/package_finder.py +87 -21
- pip/_internal/locations/__init__.py +1 -2
- pip/_internal/locations/_sysconfig.py +4 -1
- pip/_internal/metadata/__init__.py +7 -2
- pip/_internal/metadata/importlib/_dists.py +8 -2
- pip/_internal/models/link.py +18 -14
- pip/_internal/models/release_control.py +92 -0
- pip/_internal/models/selection_prefs.py +6 -3
- pip/_internal/models/wheel.py +5 -66
- pip/_internal/network/auth.py +6 -2
- pip/_internal/network/cache.py +6 -11
- pip/_internal/network/download.py +4 -5
- pip/_internal/network/lazy_wheel.py +5 -3
- pip/_internal/network/session.py +14 -10
- pip/_internal/operations/build/wheel.py +4 -4
- pip/_internal/operations/build/wheel_editable.py +4 -4
- pip/_internal/operations/install/wheel.py +1 -2
- pip/_internal/operations/prepare.py +9 -4
- pip/_internal/pyproject.py +2 -61
- pip/_internal/req/__init__.py +1 -3
- pip/_internal/req/constructors.py +45 -39
- pip/_internal/req/pep723.py +41 -0
- pip/_internal/req/req_file.py +10 -2
- pip/_internal/req/req_install.py +32 -141
- pip/_internal/resolution/resolvelib/candidates.py +20 -11
- pip/_internal/resolution/resolvelib/factory.py +43 -1
- pip/_internal/resolution/resolvelib/provider.py +9 -0
- pip/_internal/resolution/resolvelib/reporter.py +21 -8
- pip/_internal/resolution/resolvelib/requirements.py +7 -3
- pip/_internal/resolution/resolvelib/resolver.py +2 -6
- pip/_internal/self_outdated_check.py +17 -16
- pip/_internal/utils/datetime.py +18 -0
- pip/_internal/utils/filesystem.py +52 -1
- pip/_internal/utils/logging.py +34 -2
- pip/_internal/utils/misc.py +18 -12
- pip/_internal/utils/pylock.py +116 -0
- pip/_internal/utils/unpacking.py +26 -1
- pip/_internal/vcs/versioncontrol.py +3 -1
- pip/_internal/wheel_builder.py +23 -96
- pip/_vendor/README.rst +180 -0
- pip/_vendor/cachecontrol/LICENSE.txt +13 -0
- pip/_vendor/cachecontrol/__init__.py +6 -3
- pip/_vendor/cachecontrol/adapter.py +0 -1
- pip/_vendor/cachecontrol/controller.py +1 -1
- pip/_vendor/cachecontrol/filewrapper.py +3 -1
- pip/_vendor/certifi/LICENSE +20 -0
- pip/_vendor/certifi/__init__.py +1 -1
- pip/_vendor/certifi/cacert.pem +62 -372
- pip/_vendor/dependency_groups/LICENSE.txt +9 -0
- pip/_vendor/distlib/LICENSE.txt +284 -0
- pip/_vendor/distro/LICENSE +202 -0
- pip/_vendor/idna/LICENSE.md +31 -0
- pip/_vendor/idna/codec.py +1 -1
- pip/_vendor/idna/core.py +1 -1
- pip/_vendor/idna/idnadata.py +72 -6
- pip/_vendor/idna/package_data.py +1 -1
- pip/_vendor/idna/uts46data.py +891 -731
- pip/_vendor/msgpack/COPYING +14 -0
- pip/_vendor/msgpack/__init__.py +2 -2
- pip/_vendor/packaging/LICENSE +3 -0
- pip/_vendor/packaging/LICENSE.APACHE +177 -0
- pip/_vendor/packaging/LICENSE.BSD +23 -0
- pip/_vendor/packaging/__init__.py +1 -1
- pip/_vendor/packaging/_elffile.py +0 -1
- pip/_vendor/packaging/_manylinux.py +36 -36
- pip/_vendor/packaging/_musllinux.py +1 -1
- pip/_vendor/packaging/_parser.py +22 -10
- pip/_vendor/packaging/_structures.py +8 -0
- pip/_vendor/packaging/_tokenizer.py +23 -25
- pip/_vendor/packaging/licenses/__init__.py +13 -11
- pip/_vendor/packaging/licenses/_spdx.py +41 -1
- pip/_vendor/packaging/markers.py +64 -38
- pip/_vendor/packaging/metadata.py +143 -27
- pip/_vendor/packaging/pylock.py +635 -0
- pip/_vendor/packaging/requirements.py +5 -10
- pip/_vendor/packaging/specifiers.py +219 -170
- pip/_vendor/packaging/tags.py +15 -20
- pip/_vendor/packaging/utils.py +19 -24
- pip/_vendor/packaging/version.py +315 -105
- pip/_vendor/pkg_resources/LICENSE +17 -0
- pip/_vendor/platformdirs/LICENSE +21 -0
- pip/_vendor/platformdirs/api.py +1 -1
- pip/_vendor/platformdirs/macos.py +10 -8
- pip/_vendor/platformdirs/version.py +16 -3
- pip/_vendor/platformdirs/windows.py +7 -1
- pip/_vendor/pygments/LICENSE +25 -0
- pip/_vendor/pyproject_hooks/LICENSE +21 -0
- pip/_vendor/requests/LICENSE +175 -0
- pip/_vendor/requests/__version__.py +2 -2
- pip/_vendor/requests/adapters.py +17 -40
- pip/_vendor/requests/sessions.py +1 -1
- pip/_vendor/resolvelib/LICENSE +13 -0
- pip/_vendor/resolvelib/__init__.py +1 -1
- pip/_vendor/resolvelib/resolvers/abstract.py +3 -3
- pip/_vendor/resolvelib/resolvers/resolution.py +5 -0
- pip/_vendor/rich/LICENSE +19 -0
- pip/_vendor/rich/style.py +7 -11
- pip/_vendor/tomli/LICENSE +21 -0
- pip/_vendor/tomli/__init__.py +1 -1
- pip/_vendor/tomli/_parser.py +28 -21
- pip/_vendor/tomli/_re.py +8 -5
- pip/_vendor/tomli_w/LICENSE +21 -0
- pip/_vendor/truststore/LICENSE +21 -0
- pip/_vendor/truststore/__init__.py +1 -1
- pip/_vendor/truststore/_api.py +14 -6
- pip/_vendor/truststore/_openssl.py +3 -1
- pip/_vendor/urllib3/LICENSE.txt +21 -0
- pip/_vendor/vendor.txt +11 -11
- {pip-25.2.dist-info → pip-26.0.dist-info}/METADATA +10 -11
- {pip-25.2.dist-info → pip-26.0.dist-info}/RECORD +158 -139
- {pip-25.2.dist-info → pip-26.0.dist-info}/WHEEL +1 -2
- pip-26.0.dist-info/entry_points.txt +4 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/AUTHORS.txt +27 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/idna/LICENSE.md +1 -1
- pip/_internal/models/pylock.py +0 -188
- pip/_internal/operations/build/metadata_legacy.py +0 -73
- pip/_internal/operations/build/wheel_legacy.py +0 -119
- pip/_internal/operations/install/editable_legacy.py +0 -48
- pip/_internal/utils/setuptools_build.py +0 -149
- pip-25.2.dist-info/entry_points.txt +0 -3
- pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE-HEADER +0 -3
- pip-25.2.dist-info/top_level.txt +0 -1
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/LICENSE.txt +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/certifi/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/distlib/LICENSE.txt +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/distro/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/msgpack/COPYING +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE.APACHE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/packaging/LICENSE.BSD +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/pkg_resources/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/platformdirs/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/pygments/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/requests/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/resolvelib/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/rich/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/tomli/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/tomli_w/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/truststore/LICENSE +0 -0
- {pip-25.2.dist-info → pip-26.0.dist-info}/licenses/src/pip/_vendor/urllib3/LICENSE.txt +0 -0
pip/_vendor/tomli/_parser.py
CHANGED
|
@@ -4,12 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
from __future__ import annotations
|
|
6
6
|
|
|
7
|
-
from collections.abc import Iterable
|
|
8
|
-
import string
|
|
9
7
|
import sys
|
|
10
8
|
from types import MappingProxyType
|
|
11
|
-
from typing import IO, Any, Final, NamedTuple
|
|
12
|
-
import warnings
|
|
13
9
|
|
|
14
10
|
from ._re import (
|
|
15
11
|
RE_DATETIME,
|
|
@@ -19,7 +15,13 @@ from ._re import (
|
|
|
19
15
|
match_to_localtime,
|
|
20
16
|
match_to_number,
|
|
21
17
|
)
|
|
22
|
-
|
|
18
|
+
|
|
19
|
+
TYPE_CHECKING = False
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from collections.abc import Iterable
|
|
22
|
+
from typing import IO, Any, Final
|
|
23
|
+
|
|
24
|
+
from ._types import Key, ParseFloat, Pos
|
|
23
25
|
|
|
24
26
|
# Inline tables/arrays are implemented using recursion. Pathologically
|
|
25
27
|
# nested documents cause pure Python to raise RecursionError (which is OK),
|
|
@@ -46,19 +48,21 @@ ILLEGAL_COMMENT_CHARS: Final = ILLEGAL_BASIC_STR_CHARS
|
|
|
46
48
|
|
|
47
49
|
TOML_WS: Final = frozenset(" \t")
|
|
48
50
|
TOML_WS_AND_NEWLINE: Final = TOML_WS | frozenset("\n")
|
|
49
|
-
BARE_KEY_CHARS: Final = frozenset(
|
|
51
|
+
BARE_KEY_CHARS: Final = frozenset(
|
|
52
|
+
"abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789" "-_"
|
|
53
|
+
)
|
|
50
54
|
KEY_INITIAL_CHARS: Final = BARE_KEY_CHARS | frozenset("\"'")
|
|
51
|
-
HEXDIGIT_CHARS: Final = frozenset(
|
|
55
|
+
HEXDIGIT_CHARS: Final = frozenset("abcdef" "ABCDEF" "0123456789")
|
|
52
56
|
|
|
53
57
|
BASIC_STR_ESCAPE_REPLACEMENTS: Final = MappingProxyType(
|
|
54
58
|
{
|
|
55
59
|
"\\b": "\u0008", # backspace
|
|
56
60
|
"\\t": "\u0009", # tab
|
|
57
|
-
"\\n": "\
|
|
58
|
-
"\\f": "\
|
|
59
|
-
"\\r": "\
|
|
61
|
+
"\\n": "\u000a", # linefeed
|
|
62
|
+
"\\f": "\u000c", # form feed
|
|
63
|
+
"\\r": "\u000d", # carriage return
|
|
60
64
|
'\\"': "\u0022", # quote
|
|
61
|
-
"\\\\": "\
|
|
65
|
+
"\\\\": "\u005c", # backslash
|
|
62
66
|
}
|
|
63
67
|
)
|
|
64
68
|
|
|
@@ -92,6 +96,8 @@ class TOMLDecodeError(ValueError):
|
|
|
92
96
|
or not isinstance(doc, str)
|
|
93
97
|
or not isinstance(pos, int)
|
|
94
98
|
):
|
|
99
|
+
import warnings
|
|
100
|
+
|
|
95
101
|
warnings.warn(
|
|
96
102
|
"Free-form arguments for TOMLDecodeError are deprecated. "
|
|
97
103
|
"Please set 'msg' (str), 'doc' (str) and 'pos' (int) arguments only.",
|
|
@@ -151,7 +157,7 @@ def loads(__s: str, *, parse_float: ParseFloat = float) -> dict[str, Any]: # no
|
|
|
151
157
|
f"Expected str object, not '{type(__s).__qualname__}'"
|
|
152
158
|
) from None
|
|
153
159
|
pos = 0
|
|
154
|
-
out = Output(
|
|
160
|
+
out = Output()
|
|
155
161
|
header: Key = ()
|
|
156
162
|
parse_float = make_safe_parse_float(parse_float)
|
|
157
163
|
|
|
@@ -220,7 +226,7 @@ class Flags:
|
|
|
220
226
|
EXPLICIT_NEST: Final = 1
|
|
221
227
|
|
|
222
228
|
def __init__(self) -> None:
|
|
223
|
-
self._flags: dict[str, dict] = {}
|
|
229
|
+
self._flags: dict[str, dict[Any, Any]] = {}
|
|
224
230
|
self._pending_flags: set[tuple[Key, int]] = set()
|
|
225
231
|
|
|
226
232
|
def add_pending(self, key: Key, flag: int) -> None:
|
|
@@ -278,7 +284,7 @@ class NestedDict:
|
|
|
278
284
|
key: Key,
|
|
279
285
|
*,
|
|
280
286
|
access_lists: bool = True,
|
|
281
|
-
) -> dict:
|
|
287
|
+
) -> dict[str, Any]:
|
|
282
288
|
cont: Any = self.dict
|
|
283
289
|
for k in key:
|
|
284
290
|
if k not in cont:
|
|
@@ -288,7 +294,7 @@ class NestedDict:
|
|
|
288
294
|
cont = cont[-1]
|
|
289
295
|
if not isinstance(cont, dict):
|
|
290
296
|
raise KeyError("There is no nest behind this key")
|
|
291
|
-
return cont
|
|
297
|
+
return cont # type: ignore[no-any-return]
|
|
292
298
|
|
|
293
299
|
def append_nest_to_list(self, key: Key) -> None:
|
|
294
300
|
cont = self.get_or_create_nest(key[:-1])
|
|
@@ -302,9 +308,10 @@ class NestedDict:
|
|
|
302
308
|
cont[last_key] = [{}]
|
|
303
309
|
|
|
304
310
|
|
|
305
|
-
class Output
|
|
306
|
-
|
|
307
|
-
|
|
311
|
+
class Output:
|
|
312
|
+
def __init__(self) -> None:
|
|
313
|
+
self.data = NestedDict()
|
|
314
|
+
self.flags = Flags()
|
|
308
315
|
|
|
309
316
|
|
|
310
317
|
def skip_chars(src: str, pos: Pos, chars: Iterable[str]) -> Pos:
|
|
@@ -493,9 +500,9 @@ def parse_one_line_basic_str(src: str, pos: Pos) -> tuple[Pos, str]:
|
|
|
493
500
|
|
|
494
501
|
def parse_array(
|
|
495
502
|
src: str, pos: Pos, parse_float: ParseFloat, nest_lvl: int
|
|
496
|
-
) -> tuple[Pos, list]:
|
|
503
|
+
) -> tuple[Pos, list[Any]]:
|
|
497
504
|
pos += 1
|
|
498
|
-
array: list = []
|
|
505
|
+
array: list[Any] = []
|
|
499
506
|
|
|
500
507
|
pos = skip_comments_and_array_ws(src, pos)
|
|
501
508
|
if src.startswith("]", pos):
|
|
@@ -519,7 +526,7 @@ def parse_array(
|
|
|
519
526
|
|
|
520
527
|
def parse_inline_table(
|
|
521
528
|
src: str, pos: Pos, parse_float: ParseFloat, nest_lvl: int
|
|
522
|
-
) -> tuple[Pos, dict]:
|
|
529
|
+
) -> tuple[Pos, dict[str, Any]]:
|
|
523
530
|
pos += 1
|
|
524
531
|
nested_dict = NestedDict()
|
|
525
532
|
flags = Flags()
|
pip/_vendor/tomli/_re.py
CHANGED
|
@@ -7,9 +7,12 @@ from __future__ import annotations
|
|
|
7
7
|
from datetime import date, datetime, time, timedelta, timezone, tzinfo
|
|
8
8
|
from functools import lru_cache
|
|
9
9
|
import re
|
|
10
|
-
from typing import Any, Final
|
|
11
10
|
|
|
12
|
-
|
|
11
|
+
TYPE_CHECKING = False
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from typing import Any, Final
|
|
14
|
+
|
|
15
|
+
from ._types import ParseFloat
|
|
13
16
|
|
|
14
17
|
# E.g.
|
|
15
18
|
# - 00:32:00.999999
|
|
@@ -51,7 +54,7 @@ RE_DATETIME: Final = re.compile(
|
|
|
51
54
|
)
|
|
52
55
|
|
|
53
56
|
|
|
54
|
-
def match_to_datetime(match: re.Match) -> datetime | date:
|
|
57
|
+
def match_to_datetime(match: re.Match[str]) -> datetime | date:
|
|
55
58
|
"""Convert a `RE_DATETIME` match to `datetime.datetime` or `datetime.date`.
|
|
56
59
|
|
|
57
60
|
Raises ValueError if the match does not correspond to a valid date
|
|
@@ -100,13 +103,13 @@ def cached_tz(hour_str: str, minute_str: str, sign_str: str) -> timezone:
|
|
|
100
103
|
)
|
|
101
104
|
|
|
102
105
|
|
|
103
|
-
def match_to_localtime(match: re.Match) -> time:
|
|
106
|
+
def match_to_localtime(match: re.Match[str]) -> time:
|
|
104
107
|
hour_str, minute_str, sec_str, micros_str = match.groups()
|
|
105
108
|
micros = int(micros_str.ljust(6, "0")) if micros_str else 0
|
|
106
109
|
return time(int(hour_str), int(minute_str), int(sec_str), micros)
|
|
107
110
|
|
|
108
111
|
|
|
109
|
-
def match_to_number(match: re.Match, parse_float: ParseFloat) -> Any:
|
|
112
|
+
def match_to_number(match: re.Match[str], parse_float: ParseFloat) -> Any:
|
|
110
113
|
if match.group("floatpart"):
|
|
111
114
|
return parse_float(match.group())
|
|
112
115
|
return int(match.group(), 0)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2021 Taneli Hukkinen
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 Seth Michael Larson
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
pip/_vendor/truststore/_api.py
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import contextlib
|
|
1
2
|
import os
|
|
2
3
|
import platform
|
|
3
4
|
import socket
|
|
4
5
|
import ssl
|
|
5
6
|
import sys
|
|
7
|
+
import threading
|
|
6
8
|
import typing
|
|
7
9
|
|
|
8
10
|
import _ssl
|
|
@@ -67,7 +69,7 @@ def extract_from_ssl() -> None:
|
|
|
67
69
|
try:
|
|
68
70
|
import pip._vendor.urllib3.util.ssl_ as urllib3_ssl
|
|
69
71
|
|
|
70
|
-
urllib3_ssl.SSLContext = _original_SSLContext
|
|
72
|
+
urllib3_ssl.SSLContext = _original_SSLContext
|
|
71
73
|
except ImportError:
|
|
72
74
|
pass
|
|
73
75
|
|
|
@@ -84,6 +86,7 @@ class SSLContext(_truststore_SSLContext_super_class): # type: ignore[misc]
|
|
|
84
86
|
|
|
85
87
|
def __init__(self, protocol: int = None) -> None: # type: ignore[assignment]
|
|
86
88
|
self._ctx = _original_SSLContext(protocol)
|
|
89
|
+
self._ctx_lock = threading.Lock()
|
|
87
90
|
|
|
88
91
|
class TruststoreSSLObject(ssl.SSLObject):
|
|
89
92
|
# This object exists because wrap_bio() doesn't
|
|
@@ -106,10 +109,15 @@ class SSLContext(_truststore_SSLContext_super_class): # type: ignore[misc]
|
|
|
106
109
|
server_hostname: str | None = None,
|
|
107
110
|
session: ssl.SSLSession | None = None,
|
|
108
111
|
) -> ssl.SSLSocket:
|
|
109
|
-
|
|
110
|
-
#
|
|
111
|
-
# but
|
|
112
|
-
|
|
112
|
+
|
|
113
|
+
# We need to lock around the .__enter__()
|
|
114
|
+
# but we don't need to lock within the
|
|
115
|
+
# context manager, so we need to expand the
|
|
116
|
+
# syntactic sugar of the `with` statement.
|
|
117
|
+
with contextlib.ExitStack() as stack:
|
|
118
|
+
with self._ctx_lock:
|
|
119
|
+
stack.enter_context(_configure_context(self._ctx))
|
|
120
|
+
|
|
113
121
|
ssl_sock = self._ctx.wrap_socket(
|
|
114
122
|
sock,
|
|
115
123
|
server_side=server_side,
|
|
@@ -300,7 +308,7 @@ class SSLContext(_truststore_SSLContext_super_class): # type: ignore[misc]
|
|
|
300
308
|
if sys.version_info >= (3, 13):
|
|
301
309
|
|
|
302
310
|
def _get_unverified_chain_bytes(sslobj: ssl.SSLObject) -> list[bytes]:
|
|
303
|
-
unverified_chain = sslobj.get_unverified_chain() or ()
|
|
311
|
+
unverified_chain = sslobj.get_unverified_chain() or ()
|
|
304
312
|
return [
|
|
305
313
|
cert if isinstance(cert, bytes) else cert.public_bytes(_ssl.ENCODING_DER)
|
|
306
314
|
for cert in unverified_chain
|
|
@@ -6,8 +6,10 @@ import typing
|
|
|
6
6
|
|
|
7
7
|
# candidates based on https://github.com/tiran/certifi-system-store by Christian Heimes
|
|
8
8
|
_CA_FILE_CANDIDATES = [
|
|
9
|
-
# Alpine, Arch, Fedora 34
|
|
9
|
+
# Alpine, Arch, Fedora 34-42, OpenWRT, RHEL 9-10, BSD
|
|
10
10
|
"/etc/ssl/cert.pem",
|
|
11
|
+
# Fedora 43+, RHEL 11+
|
|
12
|
+
"/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem",
|
|
11
13
|
# Fedora <= 34, RHEL <= 9, CentOS <= 9
|
|
12
14
|
"/etc/pki/tls/cert.pem",
|
|
13
15
|
# Debian, Ubuntu (requires ca-certificates)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
pip/_vendor/vendor.txt
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
CacheControl==0.14.
|
|
1
|
+
CacheControl==0.14.4
|
|
2
2
|
distlib==0.4.0
|
|
3
3
|
distro==1.9.0
|
|
4
|
-
msgpack==1.1.
|
|
5
|
-
packaging==
|
|
6
|
-
platformdirs==4.
|
|
4
|
+
msgpack==1.1.2
|
|
5
|
+
packaging==26.0
|
|
6
|
+
platformdirs==4.5.1
|
|
7
7
|
pyproject-hooks==1.2.0
|
|
8
|
-
requests==2.32.
|
|
9
|
-
certifi==
|
|
10
|
-
idna==3.
|
|
8
|
+
requests==2.32.5
|
|
9
|
+
certifi==2026.1.4
|
|
10
|
+
idna==3.11
|
|
11
11
|
urllib3==1.26.20
|
|
12
|
-
rich==14.
|
|
12
|
+
rich==14.2.0
|
|
13
13
|
pygments==2.19.2
|
|
14
|
-
resolvelib==1.2.
|
|
14
|
+
resolvelib==1.2.1
|
|
15
15
|
setuptools==70.3.0
|
|
16
|
-
tomli==2.
|
|
16
|
+
tomli==2.3.0
|
|
17
17
|
tomli-w==1.2.0
|
|
18
|
-
truststore==0.10.
|
|
18
|
+
truststore==0.10.4
|
|
19
19
|
dependency-groups==1.3.1
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pip
|
|
3
|
-
Version:
|
|
3
|
+
Version: 26.0
|
|
4
4
|
Summary: The PyPA recommended tool for installing Python packages.
|
|
5
5
|
Author-email: The pip developers <distutils-sig@python.org>
|
|
6
|
+
Requires-Python: >=3.9
|
|
7
|
+
Description-Content-Type: text/x-rst
|
|
6
8
|
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://pip.pypa.io/
|
|
8
|
-
Project-URL: Documentation, https://pip.pypa.io
|
|
9
|
-
Project-URL: Source, https://github.com/pypa/pip
|
|
10
|
-
Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
|
|
11
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
10
|
Classifier: Intended Audience :: Developers
|
|
13
11
|
Classifier: Topic :: Software Development :: Build Tools
|
|
@@ -22,17 +20,15 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
22
20
|
Classifier: Programming Language :: Python :: 3.14
|
|
23
21
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
24
22
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
25
|
-
Requires-Python: >=3.9
|
|
26
|
-
Description-Content-Type: text/x-rst
|
|
27
23
|
License-File: AUTHORS.txt
|
|
28
24
|
License-File: LICENSE.txt
|
|
29
|
-
License-File: src/pip/_vendor/msgpack/COPYING
|
|
30
25
|
License-File: src/pip/_vendor/cachecontrol/LICENSE.txt
|
|
31
26
|
License-File: src/pip/_vendor/certifi/LICENSE
|
|
32
27
|
License-File: src/pip/_vendor/dependency_groups/LICENSE.txt
|
|
33
28
|
License-File: src/pip/_vendor/distlib/LICENSE.txt
|
|
34
29
|
License-File: src/pip/_vendor/distro/LICENSE
|
|
35
30
|
License-File: src/pip/_vendor/idna/LICENSE.md
|
|
31
|
+
License-File: src/pip/_vendor/msgpack/COPYING
|
|
36
32
|
License-File: src/pip/_vendor/packaging/LICENSE
|
|
37
33
|
License-File: src/pip/_vendor/packaging/LICENSE.APACHE
|
|
38
34
|
License-File: src/pip/_vendor/packaging/LICENSE.BSD
|
|
@@ -44,11 +40,13 @@ License-File: src/pip/_vendor/requests/LICENSE
|
|
|
44
40
|
License-File: src/pip/_vendor/resolvelib/LICENSE
|
|
45
41
|
License-File: src/pip/_vendor/rich/LICENSE
|
|
46
42
|
License-File: src/pip/_vendor/tomli/LICENSE
|
|
47
|
-
License-File: src/pip/_vendor/tomli/LICENSE-HEADER
|
|
48
43
|
License-File: src/pip/_vendor/tomli_w/LICENSE
|
|
49
44
|
License-File: src/pip/_vendor/truststore/LICENSE
|
|
50
45
|
License-File: src/pip/_vendor/urllib3/LICENSE.txt
|
|
51
|
-
|
|
46
|
+
Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
|
|
47
|
+
Project-URL: Documentation, https://pip.pypa.io
|
|
48
|
+
Project-URL: Homepage, https://pip.pypa.io/
|
|
49
|
+
Project-URL: Source, https://github.com/pypa/pip
|
|
52
50
|
|
|
53
51
|
pip - The Python Package Installer
|
|
54
52
|
==================================
|
|
@@ -85,7 +83,7 @@ If you find bugs, need help, or want to talk to the developers, please use our m
|
|
|
85
83
|
* `Discourse channel`_
|
|
86
84
|
* `User IRC`_
|
|
87
85
|
|
|
88
|
-
If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
|
|
86
|
+
If you want to get involved, head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
|
|
89
87
|
|
|
90
88
|
* `GitHub page`_
|
|
91
89
|
* `Development documentation`_
|
|
@@ -110,3 +108,4 @@ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
|
|
|
110
108
|
.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
|
|
111
109
|
.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
|
|
112
110
|
.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
|
|
111
|
+
|